Merge remote-tracking branch 'refs/remotes/misskey-original/develop' into develop
# Conflicts: # CHANGELOG.md # packages/backend/src/core/activitypub/models/ApNoteService.ts # packages/backend/src/core/entities/AbuseUserReportEntityService.ts # packages/frontend/src/components/MkNotification.vue # packages/frontend/src/pages/user/home.vue # pnpm-lock.yaml
This commit is contained in:
commit
fd4fd5aa7b
|
@ -37,7 +37,7 @@ jobs:
|
||||||
password: ${{ secrets.DOCKER_PASSWORD }}
|
password: ${{ secrets.DOCKER_PASSWORD }}
|
||||||
- name: Build and push by digest
|
- name: Build and push by digest
|
||||||
id: build
|
id: build
|
||||||
uses: docker/build-push-action@v5
|
uses: docker/build-push-action@v6
|
||||||
with:
|
with:
|
||||||
context: .
|
context: .
|
||||||
push: true
|
push: true
|
||||||
|
|
|
@ -48,7 +48,7 @@ jobs:
|
||||||
password: ${{ secrets.DOCKER_PASSWORD }}
|
password: ${{ secrets.DOCKER_PASSWORD }}
|
||||||
- name: Build and Push to Docker Hub
|
- name: Build and Push to Docker Hub
|
||||||
id: build
|
id: build
|
||||||
uses: docker/build-push-action@v5
|
uses: docker/build-push-action@v6
|
||||||
with:
|
with:
|
||||||
context: .
|
context: .
|
||||||
push: true
|
push: true
|
||||||
|
|
|
@ -88,7 +88,7 @@ jobs:
|
||||||
if [ "$BRANCH" = "misskey-dev:$HEAD_REF" ]; then
|
if [ "$BRANCH" = "misskey-dev:$HEAD_REF" ]; then
|
||||||
BRANCH="$HEAD_REF"
|
BRANCH="$HEAD_REF"
|
||||||
fi
|
fi
|
||||||
pnpm --filter frontend chromatic --exit-once-uploaded -d storybook-static --branch-name $BRANCH $(echo "$CHROMATIC_PARAMETER")
|
pnpm --filter frontend chromatic --exit-once-uploaded -d storybook-static --branch-name "$BRANCH" $(echo "$CHROMATIC_PARAMETER")
|
||||||
env:
|
env:
|
||||||
HEAD_REF: ${{ github.event.pull_request.head.ref }}
|
HEAD_REF: ${{ github.event.pull_request.head.ref }}
|
||||||
CHROMATIC_PROJECT_TOKEN: ${{ secrets.CHROMATIC_PROJECT_TOKEN }}
|
CHROMATIC_PROJECT_TOKEN: ${{ secrets.CHROMATIC_PROJECT_TOKEN }}
|
||||||
|
|
|
@ -3,13 +3,16 @@
|
||||||
### General
|
### General
|
||||||
- Feat: 通報を受けた際、または解決した際に、予め登録した宛先に通知を飛ばせるように(mail or webhook) #13705
|
- Feat: 通報を受けた際、または解決した際に、予め登録した宛先に通知を飛ばせるように(mail or webhook) #13705
|
||||||
- Fix: 配信停止したインスタンス一覧が見れなくなる問題を修正
|
- Fix: 配信停止したインスタンス一覧が見れなくなる問題を修正
|
||||||
|
- Fix: Dockerコンテナの立ち上げ時に`pnpm`のインストールで固まることがある問題
|
||||||
|
|
||||||
### Client
|
### Client
|
||||||
- メインタイムラインのタブをカスタマイズできるように
|
- Fix: `/about#federation` ページなどで各インスタンスのチャートが表示されなくなっていた問題を修正
|
||||||
|
- Fix: ユーザーページの追加情報のラベルを投稿者のサーバーの絵文字で表示する (#13968)
|
||||||
|
|
||||||
### Server
|
### Server
|
||||||
- チャート生成時にinstance.suspentionStateに置き換えられたinstance.isSuspendedが参照されてしまう問題を修正
|
- チャート生成時にinstance.suspentionStateに置き換えられたinstance.isSuspendedが参照されてしまう問題を修正
|
||||||
|
- Feat: レートリミット制限に引っかかったときに`Retry-After`ヘッダーを返すように (#13949)
|
||||||
|
- Fix: アンテナ・クリップ・リスト・ウェブフックがロールポリシーの上限より一つ多く作れてしまうのを修正 (#14036)
|
||||||
|
|
||||||
## 2024.5.0
|
## 2024.5.0
|
||||||
|
|
||||||
|
|
|
@ -82,6 +82,10 @@ RUN apt-get update \
|
||||||
USER misskey
|
USER misskey
|
||||||
WORKDIR /misskey
|
WORKDIR /misskey
|
||||||
|
|
||||||
|
# add package.json to add pnpm
|
||||||
|
COPY --chown=misskey:misskey ./package.json ./package.json
|
||||||
|
RUN corepack install
|
||||||
|
|
||||||
COPY --chown=misskey:misskey --from=target-builder /misskey/node_modules ./node_modules
|
COPY --chown=misskey:misskey --from=target-builder /misskey/node_modules ./node_modules
|
||||||
COPY --chown=misskey:misskey --from=target-builder /misskey/packages/backend/node_modules ./packages/backend/node_modules
|
COPY --chown=misskey:misskey --from=target-builder /misskey/packages/backend/node_modules ./packages/backend/node_modules
|
||||||
COPY --chown=misskey:misskey --from=target-builder /misskey/packages/misskey-js/node_modules ./packages/misskey-js/node_modules
|
COPY --chown=misskey:misskey --from=target-builder /misskey/packages/misskey-js/node_modules ./packages/misskey-js/node_modules
|
||||||
|
|
|
@ -10209,7 +10209,7 @@ export interface Locale extends ILocale {
|
||||||
"_dataSaver": {
|
"_dataSaver": {
|
||||||
"_media": {
|
"_media": {
|
||||||
/**
|
/**
|
||||||
* メディアの読み込み
|
* メディアの読み込みを無効化
|
||||||
*/
|
*/
|
||||||
"title": string;
|
"title": string;
|
||||||
/**
|
/**
|
||||||
|
@ -10219,7 +10219,7 @@ export interface Locale extends ILocale {
|
||||||
};
|
};
|
||||||
"_avatar": {
|
"_avatar": {
|
||||||
/**
|
/**
|
||||||
* アイコン画像
|
* アイコン画像のアニメーションを無効化
|
||||||
*/
|
*/
|
||||||
"title": string;
|
"title": string;
|
||||||
/**
|
/**
|
||||||
|
@ -10229,7 +10229,7 @@ export interface Locale extends ILocale {
|
||||||
};
|
};
|
||||||
"_urlPreview": {
|
"_urlPreview": {
|
||||||
/**
|
/**
|
||||||
* URLプレビューのサムネイル
|
* URLプレビューのサムネイルを非表示
|
||||||
*/
|
*/
|
||||||
"title": string;
|
"title": string;
|
||||||
/**
|
/**
|
||||||
|
@ -10239,7 +10239,7 @@ export interface Locale extends ILocale {
|
||||||
};
|
};
|
||||||
"_code": {
|
"_code": {
|
||||||
/**
|
/**
|
||||||
* コードハイライト
|
* コードハイライトを非表示
|
||||||
*/
|
*/
|
||||||
"title": string;
|
"title": string;
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -2715,16 +2715,16 @@ _schedulePost:
|
||||||
|
|
||||||
_dataSaver:
|
_dataSaver:
|
||||||
_media:
|
_media:
|
||||||
title: "メディアの読み込み"
|
title: "メディアの読み込みを無効化"
|
||||||
description: "画像・動画が自動で読み込まれるのを防止します。隠れている画像・動画はタップすると読み込まれます。"
|
description: "画像・動画が自動で読み込まれるのを防止します。隠れている画像・動画はタップすると読み込まれます。"
|
||||||
_avatar:
|
_avatar:
|
||||||
title: "アイコン画像"
|
title: "アイコン画像のアニメーションを無効化"
|
||||||
description: "アイコン画像のアニメーションが停止します。アニメーション画像は通常の画像よりファイルサイズが大きいことがあるので、データ通信量をさらに削減できます。"
|
description: "アイコン画像のアニメーションが停止します。アニメーション画像は通常の画像よりファイルサイズが大きいことがあるので、データ通信量をさらに削減できます。"
|
||||||
_urlPreview:
|
_urlPreview:
|
||||||
title: "URLプレビューのサムネイル"
|
title: "URLプレビューのサムネイルを非表示"
|
||||||
description: "URLプレビューのサムネイル画像が読み込まれなくなります。"
|
description: "URLプレビューのサムネイル画像が読み込まれなくなります。"
|
||||||
_code:
|
_code:
|
||||||
title: "コードハイライト"
|
title: "コードハイライトを非表示"
|
||||||
description: "MFMなどでコードハイライト記法が使われている場合、タップするまで読み込まれなくなります。コードハイライトではハイライトする言語ごとにその定義ファイルを読み込む必要がありますが、それらが自動で読み込まれなくなるため、通信量の削減が見込めます。"
|
description: "MFMなどでコードハイライト記法が使われている場合、タップするまで読み込まれなくなります。コードハイライトではハイライトする言語ごとにその定義ファイルを読み込む必要がありますが、それらが自動で読み込まれなくなるため、通信量の削減が見込めます。"
|
||||||
|
|
||||||
_hemisphere:
|
_hemisphere:
|
||||||
|
|
|
@ -56,7 +56,7 @@
|
||||||
"postcss": "8.4.38",
|
"postcss": "8.4.38",
|
||||||
"tar": "6.2.1",
|
"tar": "6.2.1",
|
||||||
"terser": "5.30.3",
|
"terser": "5.30.3",
|
||||||
"typescript": "5.4.5",
|
"typescript": "5.5.2",
|
||||||
"esbuild": "0.20.2",
|
"esbuild": "0.20.2",
|
||||||
"glob": "10.3.12"
|
"glob": "10.3.12"
|
||||||
},
|
},
|
||||||
|
|
|
@ -178,7 +178,7 @@
|
||||||
"tsc-alias": "1.8.8",
|
"tsc-alias": "1.8.8",
|
||||||
"tsconfig-paths": "4.2.0",
|
"tsconfig-paths": "4.2.0",
|
||||||
"typeorm": "0.3.20",
|
"typeorm": "0.3.20",
|
||||||
"typescript": "5.4.5",
|
"typescript": "5.5.2",
|
||||||
"ulid": "2.3.0",
|
"ulid": "2.3.0",
|
||||||
"vary": "1.1.2",
|
"vary": "1.1.2",
|
||||||
"w3c-xmlserializer": "^5.0.0",
|
"w3c-xmlserializer": "^5.0.0",
|
||||||
|
@ -209,7 +209,6 @@
|
||||||
"@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.12.7",
|
"@types/node": "20.12.7",
|
||||||
"@types/node-fetch": "3.0.3",
|
|
||||||
"@types/nodemailer": "6.4.15",
|
"@types/nodemailer": "6.4.15",
|
||||||
"@types/oauth": "0.9.4",
|
"@types/oauth": "0.9.4",
|
||||||
"@types/oauth2orize": "1.11.5",
|
"@types/oauth2orize": "1.11.5",
|
||||||
|
|
|
@ -10,7 +10,6 @@ import sanitizeHtml from 'sanitize-html';
|
||||||
import { DI } from '@/di-symbols.js';
|
import { DI } from '@/di-symbols.js';
|
||||||
import { bindThis } from '@/decorators.js';
|
import { bindThis } from '@/decorators.js';
|
||||||
import { GlobalEvents, GlobalEventService } from '@/core/GlobalEventService.js';
|
import { GlobalEvents, GlobalEventService } from '@/core/GlobalEventService.js';
|
||||||
import { isNotNull } from '@/misc/is-not-null.js';
|
|
||||||
import type {
|
import type {
|
||||||
AbuseReportNotificationRecipientRepository,
|
AbuseReportNotificationRecipientRepository,
|
||||||
MiAbuseReportNotificationRecipient,
|
MiAbuseReportNotificationRecipient,
|
||||||
|
@ -91,7 +90,7 @@ export class AbuseReportNotificationService implements OnApplicationShutdown {
|
||||||
const recipientEMailAddresses = await this.fetchEMailRecipients().then(it => it
|
const recipientEMailAddresses = await this.fetchEMailRecipients().then(it => it
|
||||||
.filter(it => it.isActive && it.userProfile?.emailVerified)
|
.filter(it => it.isActive && it.userProfile?.emailVerified)
|
||||||
.map(it => it.userProfile?.email)
|
.map(it => it.userProfile?.email)
|
||||||
.filter(isNotNull),
|
.filter(x => x != null),
|
||||||
);
|
);
|
||||||
|
|
||||||
// 送信先の鮮度を保つため、毎回取得する
|
// 送信先の鮮度を保つため、毎回取得する
|
||||||
|
@ -138,7 +137,7 @@ export class AbuseReportNotificationService implements OnApplicationShutdown {
|
||||||
.then(it => it
|
.then(it => it
|
||||||
.filter(it => it.isActive && it.systemWebhookId && it.method === 'webhook')
|
.filter(it => it.isActive && it.systemWebhookId && it.method === 'webhook')
|
||||||
.map(it => it.systemWebhookId)
|
.map(it => it.systemWebhookId)
|
||||||
.filter(isNotNull));
|
.filter(x => x != null));
|
||||||
for (const webhookId of recipientWebhookIds) {
|
for (const webhookId of recipientWebhookIds) {
|
||||||
await Promise.all(
|
await Promise.all(
|
||||||
abuseReports.map(it => {
|
abuseReports.map(it => {
|
||||||
|
@ -340,7 +339,7 @@ export class AbuseReportNotificationService implements OnApplicationShutdown {
|
||||||
@bindThis
|
@bindThis
|
||||||
private async removeUnauthorizedRecipientUsers(recipients: MiAbuseReportNotificationRecipient[]): Promise<MiAbuseReportNotificationRecipient[]> {
|
private async removeUnauthorizedRecipientUsers(recipients: MiAbuseReportNotificationRecipient[]): Promise<MiAbuseReportNotificationRecipient[]> {
|
||||||
const userRecipients = recipients.filter(it => it.userId !== null);
|
const userRecipients = recipients.filter(it => it.userId !== null);
|
||||||
const recipientUserIds = new Set(userRecipients.map(it => it.userId).filter(isNotNull));
|
const recipientUserIds = new Set(userRecipients.map(it => it.userId).filter(x => x != null));
|
||||||
if (recipientUserIds.size <= 0) {
|
if (recipientUserIds.size <= 0) {
|
||||||
// ユーザが通知先として設定されていない場合、この関数での処理を行うべきレコードが無い
|
// ユーザが通知先として設定されていない場合、この関数での処理を行うべきレコードが無い
|
||||||
return recipients;
|
return recipients;
|
||||||
|
|
|
@ -55,9 +55,6 @@ export class FanoutTimelineEndpointService {
|
||||||
|
|
||||||
@bindThis
|
@bindThis
|
||||||
private async getMiNotes(ps: TimelineOptions): Promise<MiNote[]> {
|
private async getMiNotes(ps: TimelineOptions): Promise<MiNote[]> {
|
||||||
let noteIds: string[];
|
|
||||||
let shouldFallbackToDb = false;
|
|
||||||
|
|
||||||
// 呼び出し元と以下の処理をシンプルにするためにdbFallbackを置き換える
|
// 呼び出し元と以下の処理をシンプルにするためにdbFallbackを置き換える
|
||||||
if (!ps.useDbFallback) ps.dbFallback = () => Promise.resolve([]);
|
if (!ps.useDbFallback) ps.dbFallback = () => Promise.resolve([]);
|
||||||
|
|
||||||
|
@ -67,12 +64,11 @@ export class FanoutTimelineEndpointService {
|
||||||
const redisResult = await this.fanoutTimelineService.getMulti(ps.redisTimelines, ps.untilId, ps.sinceId);
|
const redisResult = await this.fanoutTimelineService.getMulti(ps.redisTimelines, ps.untilId, ps.sinceId);
|
||||||
|
|
||||||
// TODO: いい感じにgetMulti内でソート済だからuniqするときにredisResultが全てソート済なのを利用して再ソートを避けたい
|
// TODO: いい感じにgetMulti内でソート済だからuniqするときにredisResultが全てソート済なのを利用して再ソートを避けたい
|
||||||
const redisResultIds = Array.from(new Set(redisResult.flat(1)));
|
const redisResultIds = Array.from(new Set(redisResult.flat(1))).sort(idCompare);
|
||||||
|
|
||||||
redisResultIds.sort(idCompare);
|
let noteIds = redisResultIds.slice(0, ps.limit);
|
||||||
noteIds = redisResultIds.slice(0, ps.limit);
|
const oldestNoteId = ascending ? redisResultIds[0] : redisResultIds[redisResultIds.length - 1];
|
||||||
|
const shouldFallbackToDb = noteIds.length === 0 || ps.sinceId != null && ps.sinceId < oldestNoteId;
|
||||||
shouldFallbackToDb = shouldFallbackToDb || (noteIds.length === 0);
|
|
||||||
|
|
||||||
if (!shouldFallbackToDb) {
|
if (!shouldFallbackToDb) {
|
||||||
let filter = ps.noteFilter ?? (_note => true);
|
let filter = ps.noteFilter ?? (_note => true);
|
||||||
|
|
|
@ -56,7 +56,6 @@ import { UtilityService } from '@/core/UtilityService.js';
|
||||||
import { UserBlockingService } from '@/core/UserBlockingService.js';
|
import { UserBlockingService } from '@/core/UserBlockingService.js';
|
||||||
import { isReply } from '@/misc/is-reply.js';
|
import { isReply } from '@/misc/is-reply.js';
|
||||||
import { trackPromise } from '@/misc/promise-tracker.js';
|
import { trackPromise } from '@/misc/promise-tracker.js';
|
||||||
import { isNotNull } from '@/misc/is-not-null.js';
|
|
||||||
import { IdentifiableError } from '@/misc/identifiable-error.js';
|
import { IdentifiableError } from '@/misc/identifiable-error.js';
|
||||||
|
|
||||||
type NotificationType = 'reply' | 'renote' | 'quote' | 'mention';
|
type NotificationType = 'reply' | 'renote' | 'quote' | 'mention';
|
||||||
|
@ -886,7 +885,7 @@ export class NoteCreateService implements OnApplicationShutdown {
|
||||||
const mentions = extractMentions(tokens);
|
const mentions = extractMentions(tokens);
|
||||||
let mentionedUsers = (await Promise.all(mentions.map(m =>
|
let mentionedUsers = (await Promise.all(mentions.map(m =>
|
||||||
this.remoteUserResolveService.resolveUser(m.username, m.host ?? user.host).catch(() => null),
|
this.remoteUserResolveService.resolveUser(m.username, m.host ?? user.host).catch(() => null),
|
||||||
))).filter(isNotNull);
|
))).filter(x => x != null);
|
||||||
|
|
||||||
// Drop duplicate users
|
// Drop duplicate users
|
||||||
mentionedUsers = mentionedUsers.filter((u, i, self) =>
|
mentionedUsers = mentionedUsers.filter((u, i, self) =>
|
||||||
|
|
|
@ -29,6 +29,7 @@ import { CustomEmojiService } from '@/core/CustomEmojiService.js';
|
||||||
import { RoleService } from '@/core/RoleService.js';
|
import { RoleService } from '@/core/RoleService.js';
|
||||||
import { FeaturedService } from '@/core/FeaturedService.js';
|
import { FeaturedService } from '@/core/FeaturedService.js';
|
||||||
import { trackPromise } from '@/misc/promise-tracker.js';
|
import { trackPromise } from '@/misc/promise-tracker.js';
|
||||||
|
import { isQuote, isRenote } from '@/misc/is-renote.js';
|
||||||
|
|
||||||
const FALLBACK = '\u2764';
|
const FALLBACK = '\u2764';
|
||||||
const PER_NOTE_REACTION_USER_PAIR_CACHE_MAX = 16;
|
const PER_NOTE_REACTION_USER_PAIR_CACHE_MAX = 16;
|
||||||
|
@ -117,11 +118,16 @@ export class ReactionService {
|
||||||
throw new IdentifiableError('68e9d2d1-48bf-42c2-b90a-b20e09fd3d48', 'Note not accessible for you.');
|
throw new IdentifiableError('68e9d2d1-48bf-42c2-b90a-b20e09fd3d48', 'Note not accessible for you.');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Check if note is Renote
|
||||||
|
if (isRenote(note) && !isQuote(note)) {
|
||||||
|
throw new IdentifiableError('12c35529-3c79-4327-b1cc-e2cf63a71925', 'You cannot react to Renote.');
|
||||||
|
}
|
||||||
|
|
||||||
let reaction = _reaction ?? FALLBACK;
|
let reaction = _reaction ?? FALLBACK;
|
||||||
|
|
||||||
if (note.reactionAcceptance === 'likeOnly' || ((note.reactionAcceptance === 'likeOnlyForRemote' || note.reactionAcceptance === 'nonSensitiveOnlyForLocalLikeOnlyForRemote') && (user.host != null))) {
|
if (note.reactionAcceptance === 'likeOnly' || ((note.reactionAcceptance === 'likeOnlyForRemote' || note.reactionAcceptance === 'nonSensitiveOnlyForLocalLikeOnlyForRemote') && (user.host != null))) {
|
||||||
reaction = '\u2764';
|
reaction = '\u2764';
|
||||||
} else if (_reaction) {
|
} else if (_reaction != null) {
|
||||||
const custom = reaction.match(isCustomEmojiRegexp);
|
const custom = reaction.match(isCustomEmojiRegexp);
|
||||||
if (custom) {
|
if (custom) {
|
||||||
const reacterHost = this.utilityService.toPunyNullable(user.host);
|
const reacterHost = this.utilityService.toPunyNullable(user.host);
|
||||||
|
|
|
@ -8,7 +8,6 @@ import promiseLimit from 'promise-limit';
|
||||||
import type { MiRemoteUser, MiUser } from '@/models/User.js';
|
import type { MiRemoteUser, MiUser } from '@/models/User.js';
|
||||||
import { concat, unique } from '@/misc/prelude/array.js';
|
import { concat, unique } from '@/misc/prelude/array.js';
|
||||||
import { bindThis } from '@/decorators.js';
|
import { bindThis } from '@/decorators.js';
|
||||||
import { isNotNull } from '@/misc/is-not-null.js';
|
|
||||||
import { getApIds } from './type.js';
|
import { getApIds } from './type.js';
|
||||||
import { ApPersonService } from './models/ApPersonService.js';
|
import { ApPersonService } from './models/ApPersonService.js';
|
||||||
import type { ApObject } from './type.js';
|
import type { ApObject } from './type.js';
|
||||||
|
@ -41,7 +40,7 @@ export class ApAudienceService {
|
||||||
const limit = promiseLimit<MiUser | null>(2);
|
const limit = promiseLimit<MiUser | null>(2);
|
||||||
const mentionedUsers = (await Promise.all(
|
const mentionedUsers = (await Promise.all(
|
||||||
others.map(id => limit(() => this.apPersonService.resolvePerson(id, resolver).catch(() => null))),
|
others.map(id => limit(() => this.apPersonService.resolvePerson(id, resolver).catch(() => null))),
|
||||||
)).filter(isNotNull);
|
)).filter(x => x != null);
|
||||||
|
|
||||||
if (toGroups.public.length > 0) {
|
if (toGroups.public.length > 0) {
|
||||||
return {
|
return {
|
||||||
|
|
|
@ -28,7 +28,6 @@ import { QueueService } from '@/core/QueueService.js';
|
||||||
import type { UsersRepository, NotesRepository, FollowingsRepository, AbuseUserReportsRepository, FollowRequestsRepository } from '@/models/_.js';
|
import type { UsersRepository, NotesRepository, FollowingsRepository, AbuseUserReportsRepository, FollowRequestsRepository } from '@/models/_.js';
|
||||||
import { bindThis } from '@/decorators.js';
|
import { bindThis } from '@/decorators.js';
|
||||||
import type { MiRemoteUser } from '@/models/User.js';
|
import type { MiRemoteUser } from '@/models/User.js';
|
||||||
import { isNotNull } from '@/misc/is-not-null.js';
|
|
||||||
import { GlobalEventService } from '@/core/GlobalEventService.js';
|
import { GlobalEventService } from '@/core/GlobalEventService.js';
|
||||||
import { AbuseReportService } from '@/core/AbuseReportService.js';
|
import { AbuseReportService } from '@/core/AbuseReportService.js';
|
||||||
import { getApHrefNullable, getApId, getApIds, getApType, isAccept, isActor, isAdd, isAnnounce, isBlock, isCollection, isCollectionOrOrderedCollection, isCreate, isDelete, isFlag, isFollow, isLike, isMove, isPost, isReject, isRemove, isTombstone, isUndo, isUpdate, validActor, validPost } from './type.js';
|
import { getApHrefNullable, getApId, getApIds, getApType, isAccept, isActor, isAdd, isAnnounce, isBlock, isCollection, isCollectionOrOrderedCollection, isCreate, isDelete, isFlag, isFollow, isLike, isMove, isPost, isReject, isRemove, isTombstone, isUndo, isUpdate, validActor, validPost } from './type.js';
|
||||||
|
@ -540,7 +539,7 @@ export class ApInboxService {
|
||||||
const userIds = uris
|
const userIds = uris
|
||||||
.filter(uri => uri.startsWith(this.config.url + '/users/'))
|
.filter(uri => uri.startsWith(this.config.url + '/users/'))
|
||||||
.map(uri => uri.split('/').at(-1))
|
.map(uri => uri.split('/').at(-1))
|
||||||
.filter(isNotNull);
|
.filter(x => x != null);
|
||||||
const users = await this.usersRepository.findBy({
|
const users = await this.usersRepository.findBy({
|
||||||
id: In(userIds),
|
id: In(userIds),
|
||||||
});
|
});
|
||||||
|
|
|
@ -26,7 +26,6 @@ import type { MiUserKeypair } from '@/models/UserKeypair.js';
|
||||||
import type { UsersRepository, UserProfilesRepository, NotesRepository, DriveFilesRepository, PollsRepository } from '@/models/_.js';
|
import type { UsersRepository, UserProfilesRepository, NotesRepository, DriveFilesRepository, PollsRepository } from '@/models/_.js';
|
||||||
import { bindThis } from '@/decorators.js';
|
import { bindThis } from '@/decorators.js';
|
||||||
import { CustomEmojiService } from '@/core/CustomEmojiService.js';
|
import { CustomEmojiService } from '@/core/CustomEmojiService.js';
|
||||||
import { isNotNull } from '@/misc/is-not-null.js';
|
|
||||||
import { IdService } from '@/core/IdService.js';
|
import { IdService } from '@/core/IdService.js';
|
||||||
import { JsonLdService } from './JsonLdService.js';
|
import { JsonLdService } from './JsonLdService.js';
|
||||||
import { ApMfmService } from './ApMfmService.js';
|
import { ApMfmService } from './ApMfmService.js';
|
||||||
|
@ -318,7 +317,7 @@ export class ApRendererService {
|
||||||
const getPromisedFiles = async (ids: string[]): Promise<MiDriveFile[]> => {
|
const getPromisedFiles = async (ids: string[]): Promise<MiDriveFile[]> => {
|
||||||
if (ids.length === 0) return [];
|
if (ids.length === 0) return [];
|
||||||
const items = await this.driveFilesRepository.findBy({ id: In(ids) });
|
const items = await this.driveFilesRepository.findBy({ id: In(ids) });
|
||||||
return ids.map(id => items.find(item => item.id === id)).filter(isNotNull);
|
return ids.map(id => items.find(item => item.id === id)).filter(x => x != null);
|
||||||
};
|
};
|
||||||
|
|
||||||
let inReplyTo;
|
let inReplyTo;
|
||||||
|
@ -688,7 +687,7 @@ export class ApRendererService {
|
||||||
if (names.length === 0) return [];
|
if (names.length === 0) return [];
|
||||||
|
|
||||||
const allEmojis = await this.customEmojiService.localEmojisCache.fetch();
|
const allEmojis = await this.customEmojiService.localEmojisCache.fetch();
|
||||||
const emojis = names.map(name => allEmojis.get(name)).filter(isNotNull);
|
const emojis = names.map(name => allEmojis.get(name)).filter(x => x != null);
|
||||||
|
|
||||||
return emojis;
|
return emojis;
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,7 +8,6 @@ import promiseLimit from 'promise-limit';
|
||||||
import type { MiUser } from '@/models/_.js';
|
import type { MiUser } from '@/models/_.js';
|
||||||
import { toArray, unique } from '@/misc/prelude/array.js';
|
import { toArray, unique } from '@/misc/prelude/array.js';
|
||||||
import { bindThis } from '@/decorators.js';
|
import { bindThis } from '@/decorators.js';
|
||||||
import { isNotNull } from '@/misc/is-not-null.js';
|
|
||||||
import { isMention } from '../type.js';
|
import { isMention } from '../type.js';
|
||||||
import { Resolver } from '../ApResolverService.js';
|
import { Resolver } from '../ApResolverService.js';
|
||||||
import { ApPersonService } from './ApPersonService.js';
|
import { ApPersonService } from './ApPersonService.js';
|
||||||
|
@ -28,7 +27,7 @@ export class ApMentionService {
|
||||||
const limit = promiseLimit<MiUser | null>(2);
|
const limit = promiseLimit<MiUser | null>(2);
|
||||||
const mentionedUsers = (await Promise.all(
|
const mentionedUsers = (await Promise.all(
|
||||||
hrefs.map(x => limit(() => this.apPersonService.resolvePerson(x, resolver).catch(() => null))),
|
hrefs.map(x => limit(() => this.apPersonService.resolvePerson(x, resolver).catch(() => null))),
|
||||||
)).filter(isNotNull);
|
)).filter(x => x != null);
|
||||||
|
|
||||||
return mentionedUsers;
|
return mentionedUsers;
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,7 +25,6 @@ import { UtilityService } from '@/core/UtilityService.js';
|
||||||
import { bindThis } from '@/decorators.js';
|
import { bindThis } from '@/decorators.js';
|
||||||
import { checkHttps } from '@/misc/check-https.js';
|
import { checkHttps } from '@/misc/check-https.js';
|
||||||
import { IdentifiableError } from '@/misc/identifiable-error.js';
|
import { IdentifiableError } from '@/misc/identifiable-error.js';
|
||||||
import { isNotNull } from '@/misc/is-not-null.js';
|
|
||||||
import { NoteUpdateService } from '@/core/NoteUpdateService.js';
|
import { NoteUpdateService } from '@/core/NoteUpdateService.js';
|
||||||
import { getApId, getApType, getOneApHrefNullable, getOneApId, isEmoji, validPost } from '../type.js';
|
import { getApId, getApType, getOneApHrefNullable, getOneApId, isEmoji, validPost } from '../type.js';
|
||||||
import { ApLoggerService } from '../ApLoggerService.js';
|
import { ApLoggerService } from '../ApLoggerService.js';
|
||||||
|
@ -259,7 +258,7 @@ export class ApNoteService {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const uris = unique([note._misskey_quote, note.quoteUrl].filter(isNotNull));
|
const uris = unique([note._misskey_quote, note.quoteUrl].filter(x => x != null));
|
||||||
const results = await Promise.all(uris.map(tryResolveNote));
|
const results = await Promise.all(uris.map(tryResolveNote));
|
||||||
|
|
||||||
quote = results.filter((x): x is { status: 'ok', res: MiNote } => x.status === 'ok').map(x => x.res).at(0);
|
quote = results.filter((x): x is { status: 'ok', res: MiNote } => x.status === 'ok').map(x => x.res).at(0);
|
||||||
|
|
|
@ -38,7 +38,6 @@ import { MetaService } from '@/core/MetaService.js';
|
||||||
import { DriveFileEntityService } from '@/core/entities/DriveFileEntityService.js';
|
import { DriveFileEntityService } from '@/core/entities/DriveFileEntityService.js';
|
||||||
import type { AccountMoveService } from '@/core/AccountMoveService.js';
|
import type { AccountMoveService } from '@/core/AccountMoveService.js';
|
||||||
import { checkHttps } from '@/misc/check-https.js';
|
import { checkHttps } from '@/misc/check-https.js';
|
||||||
import { isNotNull } from '@/misc/is-not-null.js';
|
|
||||||
import { getApId, getApType, getOneApHrefNullable, isActor, isCollection, isCollectionOrOrderedCollection, isPropertyValue } from '../type.js';
|
import { getApId, getApType, getOneApHrefNullable, isActor, isCollection, isCollectionOrOrderedCollection, isPropertyValue } from '../type.js';
|
||||||
import { extractApHashtags } from './tag.js';
|
import { extractApHashtags } from './tag.js';
|
||||||
import type { OnModuleInit } from '@nestjs/common';
|
import type { OnModuleInit } from '@nestjs/common';
|
||||||
|
@ -637,7 +636,7 @@ export class ApPersonService implements OnModuleInit {
|
||||||
|
|
||||||
// とりあえずidを別の時間で生成して順番を維持
|
// とりあえずidを別の時間で生成して順番を維持
|
||||||
let td = 0;
|
let td = 0;
|
||||||
for (const note of featuredNotes.filter(isNotNull)) {
|
for (const note of featuredNotes.filter(x => x != null)) {
|
||||||
td -= 1000;
|
td -= 1000;
|
||||||
transactionalEntityManager.insert(MiUserNotePining, {
|
transactionalEntityManager.insert(MiUserNotePining, {
|
||||||
id: this.idService.gen(Date.now() + td),
|
id: this.idService.gen(Date.now() + td),
|
||||||
|
|
|
@ -10,7 +10,6 @@ import type { Config } from '@/config.js';
|
||||||
import type { IPoll } from '@/models/Poll.js';
|
import type { IPoll } from '@/models/Poll.js';
|
||||||
import type Logger from '@/logger.js';
|
import type Logger from '@/logger.js';
|
||||||
import { bindThis } from '@/decorators.js';
|
import { bindThis } from '@/decorators.js';
|
||||||
import { isNotNull } from '@/misc/is-not-null.js';
|
|
||||||
import { isQuestion } from '../type.js';
|
import { isQuestion } from '../type.js';
|
||||||
import { ApLoggerService } from '../ApLoggerService.js';
|
import { ApLoggerService } from '../ApLoggerService.js';
|
||||||
import { ApResolverService } from '../ApResolverService.js';
|
import { ApResolverService } from '../ApResolverService.js';
|
||||||
|
@ -52,7 +51,7 @@ export class ApQuestionService {
|
||||||
|
|
||||||
const choices = question[multiple ? 'anyOf' : 'oneOf']
|
const choices = question[multiple ? 'anyOf' : 'oneOf']
|
||||||
?.map((x) => x.name)
|
?.map((x) => x.name)
|
||||||
.filter(isNotNull)
|
.filter(x => x != null)
|
||||||
?? [];
|
?? [];
|
||||||
|
|
||||||
const votes = question[multiple ? 'anyOf' : 'oneOf']?.map((x) => x.replies?.totalItems ?? x._misskey_votes ?? 0);
|
const votes = question[multiple ? 'anyOf' : 'oneOf']?.map((x) => x.replies?.totalItems ?? x._misskey_votes ?? 0);
|
||||||
|
|
|
@ -4,7 +4,6 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import { toArray } from '@/misc/prelude/array.js';
|
import { toArray } from '@/misc/prelude/array.js';
|
||||||
import { isNotNull } from '@/misc/is-not-null.js';
|
|
||||||
import { isHashtag } from '../type.js';
|
import { isHashtag } from '../type.js';
|
||||||
import type { IObject, IApHashtag } from '../type.js';
|
import type { IObject, IApHashtag } from '../type.js';
|
||||||
|
|
||||||
|
@ -16,7 +15,7 @@ export function extractApHashtags(tags: IObject | IObject[] | null | undefined):
|
||||||
return hashtags.map(tag => {
|
return hashtags.map(tag => {
|
||||||
const m = tag.name.match(/^#(.+)/);
|
const m = tag.name.match(/^#(.+)/);
|
||||||
return m ? m[1] : null;
|
return m ? m[1] : null;
|
||||||
}).filter(isNotNull);
|
}).filter(x => x != null);
|
||||||
}
|
}
|
||||||
|
|
||||||
export function extractApHashtagObjects(tags: IObject | IObject[] | null | undefined): IApHashtag[] {
|
export function extractApHashtagObjects(tags: IObject | IObject[] | null | undefined): IApHashtag[] {
|
||||||
|
|
|
@ -11,7 +11,6 @@ import { bindThis } from '@/decorators.js';
|
||||||
import { UserEntityService } from '@/core/entities/UserEntityService.js';
|
import { UserEntityService } from '@/core/entities/UserEntityService.js';
|
||||||
import { Packed } from '@/misc/json-schema.js';
|
import { Packed } from '@/misc/json-schema.js';
|
||||||
import { SystemWebhookEntityService } from '@/core/entities/SystemWebhookEntityService.js';
|
import { SystemWebhookEntityService } from '@/core/entities/SystemWebhookEntityService.js';
|
||||||
import { isNotNull } from '@/misc/is-not-null.js';
|
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class AbuseReportNotificationRecipientEntityService {
|
export class AbuseReportNotificationRecipientEntityService {
|
||||||
|
@ -66,13 +65,13 @@ export class AbuseReportNotificationRecipientEntityService {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
const userIds = objs.map(it => it.userId).filter(isNotNull);
|
const userIds = objs.map(it => it.userId).filter(x => x != null);
|
||||||
const users: Map<string, Packed<'UserLite'>> = (userIds.length > 0)
|
const users: Map<string, Packed<'UserLite'>> = (userIds.length > 0)
|
||||||
? await this.userEntityService.packMany(userIds)
|
? await this.userEntityService.packMany(userIds)
|
||||||
.then(it => new Map(it.map(it => [it.id, it])))
|
.then(it => new Map(it.map(it => [it.id, it])))
|
||||||
: new Map();
|
: new Map();
|
||||||
|
|
||||||
const systemWebhookIds = objs.map(it => it.systemWebhookId).filter(isNotNull);
|
const systemWebhookIds = objs.map(it => it.systemWebhookId).filter(x => x != null);
|
||||||
const systemWebhooks: Map<string, Packed<'SystemWebhook'>> = (systemWebhookIds.length > 0)
|
const systemWebhooks: Map<string, Packed<'SystemWebhook'>> = (systemWebhookIds.length > 0)
|
||||||
? await this.systemWebhookEntityService.packMany(systemWebhookIds)
|
? await this.systemWebhookEntityService.packMany(systemWebhookIds)
|
||||||
.then(it => new Map(it.map(it => [it.id, it])))
|
.then(it => new Map(it.map(it => [it.id, it])))
|
||||||
|
|
|
@ -85,7 +85,7 @@ export class AbuseUserReportEntityService {
|
||||||
) {
|
) {
|
||||||
const _reporters = reports.map(({ reporter, reporterId }) => reporter ?? reporterId);
|
const _reporters = reports.map(({ reporter, reporterId }) => reporter ?? reporterId);
|
||||||
const _targetUsers = reports.map(({ targetUser, targetUserId }) => targetUser ?? targetUserId);
|
const _targetUsers = reports.map(({ targetUser, targetUserId }) => targetUser ?? targetUserId);
|
||||||
const _assignees = reports.map(({ assignee, assigneeId }) => assignee ?? assigneeId).filter(isNotNull);
|
const _assignees = reports.map(({ assignee, assigneeId }) => assignee ?? assigneeId).filter(x => x != null);
|
||||||
const _userMap = await this.userEntityService.packMany(
|
const _userMap = await this.userEntityService.packMany(
|
||||||
[..._reporters, ..._targetUsers, ..._assignees],
|
[..._reporters, ..._targetUsers, ..._assignees],
|
||||||
null,
|
null,
|
||||||
|
|
|
@ -53,7 +53,7 @@ export class ClipEntityService {
|
||||||
isPublic: clip.isPublic,
|
isPublic: clip.isPublic,
|
||||||
favoritedCount: await this.clipFavoritesRepository.countBy({ clipId: clip.id }),
|
favoritedCount: await this.clipFavoritesRepository.countBy({ clipId: clip.id }),
|
||||||
isFavorited: meId ? await this.clipFavoritesRepository.exists({ where: { clipId: clip.id, userId: meId } }) : undefined,
|
isFavorited: meId ? await this.clipFavoritesRepository.exists({ where: { clipId: clip.id, userId: meId } }) : undefined,
|
||||||
notesCount: meId ? await this.clipNotesRepository.countBy({ clipId: clip.id }) : undefined,
|
notesCount: (meId === clip.userId) ? await this.clipNotesRepository.countBy({ clipId: clip.id }) : undefined,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -16,7 +16,6 @@ import { appendQuery, query } from '@/misc/prelude/url.js';
|
||||||
import { deepClone } from '@/misc/clone.js';
|
import { deepClone } from '@/misc/clone.js';
|
||||||
import { bindThis } from '@/decorators.js';
|
import { bindThis } from '@/decorators.js';
|
||||||
import { isMimeImage } from '@/misc/is-mime-image.js';
|
import { isMimeImage } from '@/misc/is-mime-image.js';
|
||||||
import { isNotNull } from '@/misc/is-not-null.js';
|
|
||||||
import { IdService } from '@/core/IdService.js';
|
import { IdService } from '@/core/IdService.js';
|
||||||
import { UtilityService } from '../UtilityService.js';
|
import { UtilityService } from '../UtilityService.js';
|
||||||
import { VideoProcessingService } from '../VideoProcessingService.js';
|
import { VideoProcessingService } from '../VideoProcessingService.js';
|
||||||
|
@ -264,11 +263,11 @@ export class DriveFileEntityService {
|
||||||
files: MiDriveFile[],
|
files: MiDriveFile[],
|
||||||
options?: PackOptions,
|
options?: PackOptions,
|
||||||
): Promise<Packed<'DriveFile'>[]> {
|
): Promise<Packed<'DriveFile'>[]> {
|
||||||
const _user = files.map(({ user, userId }) => user ?? userId).filter(isNotNull);
|
const _user = files.map(({ user, userId }) => user ?? userId).filter(x => x != null);
|
||||||
const _userMap = await this.userEntityService.packMany(_user)
|
const _userMap = await this.userEntityService.packMany(_user)
|
||||||
.then(users => new Map(users.map(user => [user.id, user])));
|
.then(users => new Map(users.map(user => [user.id, user])));
|
||||||
const items = await Promise.all(files.map(f => this.packNullable(f, options, f.userId ? { packedUser: _userMap.get(f.userId) } : {})));
|
const items = await Promise.all(files.map(f => this.packNullable(f, options, f.userId ? { packedUser: _userMap.get(f.userId) } : {})));
|
||||||
return items.filter(isNotNull);
|
return items.filter(x => x != null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@bindThis
|
@bindThis
|
||||||
|
@ -293,6 +292,6 @@ export class DriveFileEntityService {
|
||||||
): Promise<Packed<'DriveFile'>[]> {
|
): Promise<Packed<'DriveFile'>[]> {
|
||||||
if (fileIds.length === 0) return [];
|
if (fileIds.length === 0) return [];
|
||||||
const filesMap = await this.packManyByIdsMap(fileIds, options);
|
const filesMap = await this.packManyByIdsMap(fileIds, options);
|
||||||
return fileIds.map(id => filesMap.get(id)).filter(isNotNull);
|
return fileIds.map(id => filesMap.get(id)).filter(x => x != null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,7 +12,6 @@ import type { MiUser } from '@/models/User.js';
|
||||||
import type { MiRegistrationTicket } from '@/models/RegistrationTicket.js';
|
import type { MiRegistrationTicket } from '@/models/RegistrationTicket.js';
|
||||||
import { bindThis } from '@/decorators.js';
|
import { bindThis } from '@/decorators.js';
|
||||||
import { IdService } from '@/core/IdService.js';
|
import { IdService } from '@/core/IdService.js';
|
||||||
import { isNotNull } from '@/misc/is-not-null.js';
|
|
||||||
import { UserEntityService } from './UserEntityService.js';
|
import { UserEntityService } from './UserEntityService.js';
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
|
@ -59,8 +58,8 @@ export class InviteCodeEntityService {
|
||||||
tickets: MiRegistrationTicket[],
|
tickets: MiRegistrationTicket[],
|
||||||
me: { id: MiUser['id'] },
|
me: { id: MiUser['id'] },
|
||||||
) {
|
) {
|
||||||
const _createdBys = tickets.map(({ createdBy, createdById }) => createdBy ?? createdById).filter(isNotNull);
|
const _createdBys = tickets.map(({ createdBy, createdById }) => createdBy ?? createdById).filter(x => x != null);
|
||||||
const _usedBys = tickets.map(({ usedBy, usedById }) => usedBy ?? usedById).filter(isNotNull);
|
const _usedBys = tickets.map(({ usedBy, usedById }) => usedBy ?? usedById).filter(x => x != null);
|
||||||
const _userMap = await this.userEntityService.packMany([..._createdBys, ..._usedBys], me)
|
const _userMap = await this.userEntityService.packMany([..._createdBys, ..._usedBys], me)
|
||||||
.then(users => new Map(users.map(u => [u.id, u])));
|
.then(users => new Map(users.map(u => [u.id, u])));
|
||||||
return Promise.all(
|
return Promise.all(
|
||||||
|
|
|
@ -14,7 +14,6 @@ import type { MiNote } from '@/models/Note.js';
|
||||||
import type { MiNoteReaction } from '@/models/NoteReaction.js';
|
import type { MiNoteReaction } from '@/models/NoteReaction.js';
|
||||||
import type { UsersRepository, NotesRepository, FollowingsRepository, PollsRepository, PollVotesRepository, NoteReactionsRepository, ChannelsRepository } from '@/models/_.js';
|
import type { UsersRepository, NotesRepository, FollowingsRepository, PollsRepository, PollVotesRepository, NoteReactionsRepository, ChannelsRepository } from '@/models/_.js';
|
||||||
import { bindThis } from '@/decorators.js';
|
import { bindThis } from '@/decorators.js';
|
||||||
import { isNotNull } from '@/misc/is-not-null.js';
|
|
||||||
import { DebounceLoader } from '@/misc/loader.js';
|
import { DebounceLoader } from '@/misc/loader.js';
|
||||||
import { IdService } from '@/core/IdService.js';
|
import { IdService } from '@/core/IdService.js';
|
||||||
import type { OnModuleInit } from '@nestjs/common';
|
import type { OnModuleInit } from '@nestjs/common';
|
||||||
|
@ -300,7 +299,7 @@ export class NoteEntityService implements OnModuleInit {
|
||||||
packedFiles.set(k, v);
|
packedFiles.set(k, v);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return fileIds.map(id => packedFiles.get(id)).filter(isNotNull);
|
return fileIds.map(id => packedFiles.get(id)).filter(x => x != null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@bindThis
|
@bindThis
|
||||||
|
@ -477,12 +476,12 @@ export class NoteEntityService implements OnModuleInit {
|
||||||
|
|
||||||
await this.customEmojiService.prefetchEmojis(this.aggregateNoteEmojis(notes));
|
await this.customEmojiService.prefetchEmojis(this.aggregateNoteEmojis(notes));
|
||||||
// TODO: 本当は renote とか reply がないのに renoteId とか replyId があったらここで解決しておく
|
// TODO: 本当は renote とか reply がないのに renoteId とか replyId があったらここで解決しておく
|
||||||
const fileIds = notes.map(n => [n.fileIds, n.renote?.fileIds, n.reply?.fileIds]).flat(2).filter(isNotNull);
|
const fileIds = notes.map(n => [n.fileIds, n.renote?.fileIds, n.reply?.fileIds]).flat(2).filter(x => x != null);
|
||||||
const packedFiles = fileIds.length > 0 ? await this.driveFileEntityService.packManyByIdsMap(fileIds) : new Map();
|
const packedFiles = fileIds.length > 0 ? await this.driveFileEntityService.packManyByIdsMap(fileIds) : new Map();
|
||||||
const users = [
|
const users = [
|
||||||
...notes.map(({ user, userId }) => user ?? userId),
|
...notes.map(({ user, userId }) => user ?? userId),
|
||||||
...notes.map(({ replyUserId }) => replyUserId).filter(isNotNull),
|
...notes.map(({ replyUserId }) => replyUserId).filter(x => x != null),
|
||||||
...notes.map(({ renoteUserId }) => renoteUserId).filter(isNotNull),
|
...notes.map(({ renoteUserId }) => renoteUserId).filter(x => x != null),
|
||||||
];
|
];
|
||||||
const packedUsers = await this.userEntityService.packMany(users, me)
|
const packedUsers = await this.userEntityService.packMany(users, me)
|
||||||
.then(users => new Map(users.map(u => [u.id, u])));
|
.then(users => new Map(users.map(u => [u.id, u])));
|
||||||
|
|
|
@ -13,7 +13,6 @@ import type { MiGroupedNotification, MiNotification } from '@/models/Notificatio
|
||||||
import type { MiNote } from '@/models/Note.js';
|
import type { MiNote } from '@/models/Note.js';
|
||||||
import type { Packed } from '@/misc/json-schema.js';
|
import type { Packed } from '@/misc/json-schema.js';
|
||||||
import { bindThis } from '@/decorators.js';
|
import { bindThis } from '@/decorators.js';
|
||||||
import { isNotNull } from '@/misc/is-not-null.js';
|
|
||||||
import { FilterUnionByProperty, groupedNotificationTypes } from '@/types.js';
|
import { FilterUnionByProperty, groupedNotificationTypes } from '@/types.js';
|
||||||
import { CacheService } from '@/core/CacheService.js';
|
import { CacheService } from '@/core/CacheService.js';
|
||||||
import { RoleEntityService } from './RoleEntityService.js';
|
import { RoleEntityService } from './RoleEntityService.js';
|
||||||
|
@ -103,7 +102,7 @@ export class NotificationEntityService implements OnModuleInit {
|
||||||
user,
|
user,
|
||||||
reaction: reaction.reaction,
|
reaction: reaction.reaction,
|
||||||
};
|
};
|
||||||
}))).filter(r => isNotNull(r.user));
|
}))).filter(r => r.user != null);
|
||||||
// if all users have been deleted, don't show this notification
|
// if all users have been deleted, don't show this notification
|
||||||
if (reactions.length === 0) {
|
if (reactions.length === 0) {
|
||||||
return null;
|
return null;
|
||||||
|
@ -124,7 +123,7 @@ export class NotificationEntityService implements OnModuleInit {
|
||||||
}
|
}
|
||||||
|
|
||||||
return this.userEntityService.pack(userId, { id: meId });
|
return this.userEntityService.pack(userId, { id: meId });
|
||||||
}))).filter(isNotNull);
|
}))).filter(x => x != null);
|
||||||
// if all users have been deleted, don't show this notification
|
// if all users have been deleted, don't show this notification
|
||||||
if (users.length === 0) {
|
if (users.length === 0) {
|
||||||
return null;
|
return null;
|
||||||
|
@ -184,7 +183,7 @@ export class NotificationEntityService implements OnModuleInit {
|
||||||
|
|
||||||
validNotifications = await this.#filterValidNotifier(validNotifications, meId);
|
validNotifications = await this.#filterValidNotifier(validNotifications, meId);
|
||||||
|
|
||||||
const noteIds = validNotifications.map(x => 'noteId' in x ? x.noteId : null).filter(isNotNull);
|
const noteIds = validNotifications.map(x => 'noteId' in x ? x.noteId : null).filter(x => x != null);
|
||||||
const notes = noteIds.length > 0 ? await this.notesRepository.find({
|
const notes = noteIds.length > 0 ? await this.notesRepository.find({
|
||||||
where: { id: In(noteIds) },
|
where: { id: In(noteIds) },
|
||||||
relations: ['user', 'reply', 'reply.user', 'renote', 'renote.user'],
|
relations: ['user', 'reply', 'reply.user', 'renote', 'renote.user'],
|
||||||
|
@ -226,7 +225,7 @@ export class NotificationEntityService implements OnModuleInit {
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
return (await Promise.all(packPromises)).filter(isNotNull);
|
return (await Promise.all(packPromises)).filter(x => x != null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@bindThis
|
@bindThis
|
||||||
|
@ -308,7 +307,7 @@ export class NotificationEntityService implements OnModuleInit {
|
||||||
this.cacheService.userProfileCache.fetch(meId).then(p => new Set(p.mutedInstances)),
|
this.cacheService.userProfileCache.fetch(meId).then(p => new Set(p.mutedInstances)),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
const notifierIds = notifications.map(notification => 'notifierId' in notification ? notification.notifierId : null).filter(isNotNull);
|
const notifierIds = notifications.map(notification => 'notifierId' in notification ? notification.notifierId : null).filter(x => x != null);
|
||||||
const notifiers = notifierIds.length > 0 ? await this.usersRepository.find({
|
const notifiers = notifierIds.length > 0 ? await this.usersRepository.find({
|
||||||
where: { id: In(notifierIds) },
|
where: { id: In(notifierIds) },
|
||||||
}) : [];
|
}) : [];
|
||||||
|
@ -316,7 +315,7 @@ export class NotificationEntityService implements OnModuleInit {
|
||||||
const filteredNotifications = ((await Promise.all(notifications.map(async (notification) => {
|
const filteredNotifications = ((await Promise.all(notifications.map(async (notification) => {
|
||||||
const isValid = this.#validateNotifier(notification, userIdsWhoMeMuting, userMutedInstances, notifiers);
|
const isValid = this.#validateNotifier(notification, userIdsWhoMeMuting, userMutedInstances, notifiers);
|
||||||
return isValid ? notification : null;
|
return isValid ? notification : null;
|
||||||
}))) as [T | null] ).filter(isNotNull);
|
}))) as [T | null] ).filter(x => x != null);
|
||||||
|
|
||||||
return filteredNotifications;
|
return filteredNotifications;
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,7 +14,6 @@ import type { MiPage } from '@/models/Page.js';
|
||||||
import type { MiDriveFile } from '@/models/DriveFile.js';
|
import type { MiDriveFile } from '@/models/DriveFile.js';
|
||||||
import { bindThis } from '@/decorators.js';
|
import { bindThis } from '@/decorators.js';
|
||||||
import { IdService } from '@/core/IdService.js';
|
import { IdService } from '@/core/IdService.js';
|
||||||
import { isNotNull } from '@/misc/is-not-null.js';
|
|
||||||
import { UserEntityService } from './UserEntityService.js';
|
import { UserEntityService } from './UserEntityService.js';
|
||||||
import { DriveFileEntityService } from './DriveFileEntityService.js';
|
import { DriveFileEntityService } from './DriveFileEntityService.js';
|
||||||
|
|
||||||
|
@ -106,7 +105,7 @@ export class PageEntityService {
|
||||||
script: page.script,
|
script: page.script,
|
||||||
eyeCatchingImageId: page.eyeCatchingImageId,
|
eyeCatchingImageId: page.eyeCatchingImageId,
|
||||||
eyeCatchingImage: page.eyeCatchingImageId ? await this.driveFileEntityService.pack(page.eyeCatchingImageId) : null,
|
eyeCatchingImage: page.eyeCatchingImageId ? await this.driveFileEntityService.pack(page.eyeCatchingImageId) : null,
|
||||||
attachedFiles: this.driveFileEntityService.packMany((await Promise.all(attachedFiles)).filter(isNotNull)),
|
attachedFiles: this.driveFileEntityService.packMany((await Promise.all(attachedFiles)).filter(x => x != null)),
|
||||||
likedCount: page.likedCount,
|
likedCount: page.likedCount,
|
||||||
isLiked: meId ? await this.pageLikesRepository.exists({ where: { pageId: page.id, userId: meId } }) : undefined,
|
isLiked: meId ? await this.pageLikesRepository.exists({ where: { pageId: page.id, userId: meId } }) : undefined,
|
||||||
});
|
});
|
||||||
|
|
|
@ -47,7 +47,6 @@ import { IdService } from '@/core/IdService.js';
|
||||||
import type { AnnouncementService } from '@/core/AnnouncementService.js';
|
import type { AnnouncementService } from '@/core/AnnouncementService.js';
|
||||||
import type { CustomEmojiService } from '@/core/CustomEmojiService.js';
|
import type { CustomEmojiService } from '@/core/CustomEmojiService.js';
|
||||||
import { AvatarDecorationService } from '@/core/AvatarDecorationService.js';
|
import { AvatarDecorationService } from '@/core/AvatarDecorationService.js';
|
||||||
import { isNotNull } from '@/misc/is-not-null.js';
|
|
||||||
import type { OnModuleInit } from '@nestjs/common';
|
import type { OnModuleInit } from '@nestjs/common';
|
||||||
import type { NoteEntityService } from './NoteEntityService.js';
|
import type { NoteEntityService } from './NoteEntityService.js';
|
||||||
import type { DriveFileEntityService } from './DriveFileEntityService.js';
|
import type { DriveFileEntityService } from './DriveFileEntityService.js';
|
||||||
|
@ -513,7 +512,7 @@ export class UserEntityService implements OnModuleInit {
|
||||||
movedTo: user.movedToUri ? this.apPersonService.resolvePerson(user.movedToUri).then(user => user.id).catch(() => null) : null,
|
movedTo: user.movedToUri ? this.apPersonService.resolvePerson(user.movedToUri).then(user => user.id).catch(() => null) : null,
|
||||||
alsoKnownAs: user.alsoKnownAs
|
alsoKnownAs: user.alsoKnownAs
|
||||||
? Promise.all(user.alsoKnownAs.map(uri => this.apPersonService.fetchPerson(uri).then(user => user?.id).catch(() => null)))
|
? Promise.all(user.alsoKnownAs.map(uri => this.apPersonService.fetchPerson(uri).then(user => user?.id).catch(() => null)))
|
||||||
.then(xs => xs.length === 0 ? null : xs.filter(isNotNull))
|
.then(xs => xs.length === 0 ? null : xs.filter(x => x != null))
|
||||||
: null,
|
: null,
|
||||||
createdAt: this.idService.parse(user.id).date.toISOString(),
|
createdAt: this.idService.parse(user.id).date.toISOString(),
|
||||||
updatedAt: user.updatedAt ? user.updatedAt.toISOString() : null,
|
updatedAt: user.updatedAt ? user.updatedAt.toISOString() : null,
|
||||||
|
|
|
@ -1,8 +0,0 @@
|
||||||
/*
|
|
||||||
* SPDX-FileCopyrightText: syuilo and misskey-project
|
|
||||||
* SPDX-License-Identifier: AGPL-3.0-only
|
|
||||||
*/
|
|
||||||
|
|
||||||
export function isNotNull<T extends NonNullable<unknown>>(input: T | undefined | null): input is T {
|
|
||||||
return input != null;
|
|
||||||
}
|
|
|
@ -65,44 +65,6 @@ export function maximum(xs: number[]): number {
|
||||||
return Math.max(...xs);
|
return Math.max(...xs);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Splits an array based on the equivalence relation.
|
|
||||||
* The concatenation of the result is equal to the argument.
|
|
||||||
*/
|
|
||||||
export function groupBy<T>(f: EndoRelation<T>, xs: T[]): T[][] {
|
|
||||||
const groups = [] as T[][];
|
|
||||||
for (const x of xs) {
|
|
||||||
const lastGroup = groups.at(-1);
|
|
||||||
if (lastGroup !== undefined && f(lastGroup[0], x)) {
|
|
||||||
lastGroup.push(x);
|
|
||||||
} else {
|
|
||||||
groups.push([x]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return groups;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Splits an array based on the equivalence relation induced by the function.
|
|
||||||
* The concatenation of the result is equal to the argument.
|
|
||||||
*/
|
|
||||||
export function groupOn<T, S>(f: (x: T) => S, xs: T[]): T[][] {
|
|
||||||
return groupBy((a, b) => f(a) === f(b), xs);
|
|
||||||
}
|
|
||||||
|
|
||||||
export function groupByX<T>(collections: T[], keySelector: (x: T) => string) {
|
|
||||||
return collections.reduce((obj: Record<string, T[]>, item: T) => {
|
|
||||||
const key = keySelector(item);
|
|
||||||
if (!Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
||||||
obj[key] = [];
|
|
||||||
}
|
|
||||||
|
|
||||||
obj[key].push(item);
|
|
||||||
|
|
||||||
return obj;
|
|
||||||
}, {});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Compare two arrays by lexicographical order
|
* Compare two arrays by lexicographical order
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -1,8 +0,0 @@
|
||||||
/*
|
|
||||||
* SPDX-FileCopyrightText: syuilo and misskey-project
|
|
||||||
* SPDX-License-Identifier: AGPL-3.0-only
|
|
||||||
*/
|
|
||||||
|
|
||||||
export function gcd(a: number, b: number): number {
|
|
||||||
return b === 0 ? a : gcd(b, a % b);
|
|
||||||
}
|
|
|
@ -1,25 +0,0 @@
|
||||||
/*
|
|
||||||
* SPDX-FileCopyrightText: syuilo and misskey-project
|
|
||||||
* SPDX-License-Identifier: AGPL-3.0-only
|
|
||||||
*/
|
|
||||||
|
|
||||||
export interface IMaybe<T> {
|
|
||||||
isJust(): this is IJust<T>;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface IJust<T> extends IMaybe<T> {
|
|
||||||
get(): T;
|
|
||||||
}
|
|
||||||
|
|
||||||
export function just<T>(value: T): IJust<T> {
|
|
||||||
return {
|
|
||||||
isJust: () => true,
|
|
||||||
get: () => value,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
export function nothing<T>(): IMaybe<T> {
|
|
||||||
return {
|
|
||||||
isJust: () => false,
|
|
||||||
};
|
|
||||||
}
|
|
|
@ -1,20 +0,0 @@
|
||||||
/*
|
|
||||||
* SPDX-FileCopyrightText: syuilo and misskey-project
|
|
||||||
* SPDX-License-Identifier: AGPL-3.0-only
|
|
||||||
*/
|
|
||||||
|
|
||||||
export function concat(xs: string[]): string {
|
|
||||||
return xs.join('');
|
|
||||||
}
|
|
||||||
|
|
||||||
export function capitalize(s: string): string {
|
|
||||||
return toUpperCase(s.charAt(0)) + toLowerCase(s.slice(1));
|
|
||||||
}
|
|
||||||
|
|
||||||
export function toUpperCase(s: string): string {
|
|
||||||
return s.toUpperCase();
|
|
||||||
}
|
|
||||||
|
|
||||||
export function toLowerCase(s: string): string {
|
|
||||||
return s.toLowerCase();
|
|
||||||
}
|
|
|
@ -1,6 +0,0 @@
|
||||||
/*
|
|
||||||
* SPDX-FileCopyrightText: syuilo and misskey-project
|
|
||||||
* SPDX-License-Identifier: AGPL-3.0-only
|
|
||||||
*/
|
|
||||||
|
|
||||||
export const fallback = Symbol('fallback');
|
|
|
@ -109,6 +109,12 @@ export class DeliverProcessorService {
|
||||||
suspensionState: 'autoSuspendedForNotResponding',
|
suspensionState: 'autoSuspendedForNotResponding',
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
// isNotRespondingがtrueでnotRespondingSinceがnullの場合はnotRespondingSinceをセット
|
||||||
|
// notRespondingSinceは新たな機能なので、それ以前のデータにはnotRespondingSinceがない場合がある
|
||||||
|
this.federatedInstanceService.update(i.id, {
|
||||||
|
notRespondingSince: new Date(),
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
this.apRequestChart.deliverFail();
|
this.apRequestChart.deliverFail();
|
||||||
|
|
|
@ -40,7 +40,7 @@ export const paramDef = {
|
||||||
startsAt: { type: 'integer' },
|
startsAt: { type: 'integer' },
|
||||||
dayOfWeek: { type: 'integer' },
|
dayOfWeek: { type: 'integer' },
|
||||||
},
|
},
|
||||||
required: ['id', 'memo', 'url', 'imageUrl', 'place', 'priority', 'ratio', 'expiresAt', 'startsAt', 'dayOfWeek'],
|
required: ['id'],
|
||||||
} as const;
|
} as const;
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
|
@ -63,8 +63,8 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
|
||||||
ratio: ps.ratio,
|
ratio: ps.ratio,
|
||||||
memo: ps.memo,
|
memo: ps.memo,
|
||||||
imageUrl: ps.imageUrl,
|
imageUrl: ps.imageUrl,
|
||||||
expiresAt: new Date(ps.expiresAt),
|
expiresAt: ps.expiresAt ? new Date(ps.expiresAt) : undefined,
|
||||||
startsAt: new Date(ps.startsAt),
|
startsAt: ps.startsAt ? new Date(ps.startsAt) : undefined,
|
||||||
dayOfWeek: ps.dayOfWeek,
|
dayOfWeek: ps.dayOfWeek,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,6 @@
|
||||||
import { Inject, Injectable } from '@nestjs/common';
|
import { Inject, Injectable } from '@nestjs/common';
|
||||||
import { Endpoint } from '@/server/api/endpoint-base.js';
|
import { Endpoint } from '@/server/api/endpoint-base.js';
|
||||||
import type { RolesRepository } from '@/models/_.js';
|
import type { RolesRepository } from '@/models/_.js';
|
||||||
import { GlobalEventService } from '@/core/GlobalEventService.js';
|
|
||||||
import { DI } from '@/di-symbols.js';
|
import { DI } from '@/di-symbols.js';
|
||||||
import { ApiError } from '@/server/api/error.js';
|
import { ApiError } from '@/server/api/error.js';
|
||||||
import { RoleService } from '@/core/RoleService.js';
|
import { RoleService } from '@/core/RoleService.js';
|
||||||
|
@ -50,19 +49,6 @@ export const paramDef = {
|
||||||
},
|
},
|
||||||
required: [
|
required: [
|
||||||
'roleId',
|
'roleId',
|
||||||
'name',
|
|
||||||
'description',
|
|
||||||
'color',
|
|
||||||
'iconUrl',
|
|
||||||
'target',
|
|
||||||
'condFormula',
|
|
||||||
'isPublic',
|
|
||||||
'isModerator',
|
|
||||||
'isAdministrator',
|
|
||||||
'asBadge',
|
|
||||||
'canEditMembersByModerator',
|
|
||||||
'displayOrder',
|
|
||||||
'policies',
|
|
||||||
],
|
],
|
||||||
} as const;
|
} as const;
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
* SPDX-License-Identifier: AGPL-3.0-only
|
* SPDX-License-Identifier: AGPL-3.0-only
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import { Inject, Injectable } from '@nestjs/common';
|
import { Injectable } from '@nestjs/common';
|
||||||
import { Endpoint } from '@/server/api/endpoint-base.js';
|
import { Endpoint } from '@/server/api/endpoint-base.js';
|
||||||
import { ClipEntityService } from '@/core/entities/ClipEntityService.js';
|
import { ClipEntityService } from '@/core/entities/ClipEntityService.js';
|
||||||
import { ClipService } from '@/core/ClipService.js';
|
import { ClipService } from '@/core/ClipService.js';
|
||||||
|
@ -41,7 +41,7 @@ export const paramDef = {
|
||||||
isPublic: { type: 'boolean' },
|
isPublic: { type: 'boolean' },
|
||||||
description: { type: 'string', nullable: true, minLength: 1, maxLength: 2048 },
|
description: { type: 'string', nullable: true, minLength: 1, maxLength: 2048 },
|
||||||
},
|
},
|
||||||
required: ['clipId', 'name'],
|
required: ['clipId'],
|
||||||
} as const;
|
} as const;
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
|
|
|
@ -95,15 +95,14 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
|
||||||
|
|
||||||
// Check if the circular reference will occur
|
// Check if the circular reference will occur
|
||||||
const checkCircle = async (folderId: string): Promise<boolean> => {
|
const checkCircle = async (folderId: string): Promise<boolean> => {
|
||||||
// Fetch folder
|
const folder2 = await this.driveFoldersRepository.findOneByOrFail({
|
||||||
const folder2 = await this.driveFoldersRepository.findOneBy({
|
|
||||||
id: folderId,
|
id: folderId,
|
||||||
});
|
});
|
||||||
|
|
||||||
if (folder2!.id === folder!.id) {
|
if (folder2.id === folder.id) {
|
||||||
return true;
|
return true;
|
||||||
} else if (folder2!.parentId) {
|
} else if (folder2.parentId) {
|
||||||
return await checkCircle(folder2!.parentId);
|
return await checkCircle(folder2.parentId);
|
||||||
} else {
|
} else {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,7 +12,6 @@ import type { MiDriveFile } from '@/models/DriveFile.js';
|
||||||
import { IdService } from '@/core/IdService.js';
|
import { IdService } from '@/core/IdService.js';
|
||||||
import { GalleryPostEntityService } from '@/core/entities/GalleryPostEntityService.js';
|
import { GalleryPostEntityService } from '@/core/entities/GalleryPostEntityService.js';
|
||||||
import { DI } from '@/di-symbols.js';
|
import { DI } from '@/di-symbols.js';
|
||||||
import { isNotNull } from '@/misc/is-not-null.js';
|
|
||||||
|
|
||||||
export const meta = {
|
export const meta = {
|
||||||
tags: ['gallery'],
|
tags: ['gallery'],
|
||||||
|
@ -70,7 +69,7 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
|
||||||
id: fileId,
|
id: fileId,
|
||||||
userId: me.id,
|
userId: me.id,
|
||||||
}),
|
}),
|
||||||
))).filter(isNotNull);
|
))).filter(x => x != null);
|
||||||
|
|
||||||
if (files.length === 0) {
|
if (files.length === 0) {
|
||||||
throw new Error();
|
throw new Error();
|
||||||
|
|
|
@ -10,7 +10,6 @@ import type { DriveFilesRepository, GalleryPostsRepository } from '@/models/_.js
|
||||||
import type { MiDriveFile } from '@/models/DriveFile.js';
|
import type { MiDriveFile } from '@/models/DriveFile.js';
|
||||||
import { GalleryPostEntityService } from '@/core/entities/GalleryPostEntityService.js';
|
import { GalleryPostEntityService } from '@/core/entities/GalleryPostEntityService.js';
|
||||||
import { DI } from '@/di-symbols.js';
|
import { DI } from '@/di-symbols.js';
|
||||||
import { isNotNull } from '@/misc/is-not-null.js';
|
|
||||||
|
|
||||||
export const meta = {
|
export const meta = {
|
||||||
tags: ['gallery'],
|
tags: ['gallery'],
|
||||||
|
@ -48,7 +47,7 @@ export const paramDef = {
|
||||||
} },
|
} },
|
||||||
isSensitive: { type: 'boolean', default: false },
|
isSensitive: { type: 'boolean', default: false },
|
||||||
},
|
},
|
||||||
required: ['postId', 'title', 'fileIds'],
|
required: ['postId'],
|
||||||
} as const;
|
} as const;
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
|
@ -63,15 +62,19 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
|
||||||
private galleryPostEntityService: GalleryPostEntityService,
|
private galleryPostEntityService: GalleryPostEntityService,
|
||||||
) {
|
) {
|
||||||
super(meta, paramDef, async (ps, me) => {
|
super(meta, paramDef, async (ps, me) => {
|
||||||
const files = (await Promise.all(ps.fileIds.map(fileId =>
|
let files: Array<MiDriveFile> | undefined;
|
||||||
this.driveFilesRepository.findOneBy({
|
|
||||||
id: fileId,
|
|
||||||
userId: me.id,
|
|
||||||
}),
|
|
||||||
))).filter(isNotNull);
|
|
||||||
|
|
||||||
if (files.length === 0) {
|
if (ps.fileIds) {
|
||||||
throw new Error();
|
files = (await Promise.all(ps.fileIds.map(fileId =>
|
||||||
|
this.driveFilesRepository.findOneBy({
|
||||||
|
id: fileId,
|
||||||
|
userId: me.id,
|
||||||
|
}),
|
||||||
|
))).filter(x => x != null);
|
||||||
|
|
||||||
|
if (files.length === 0) {
|
||||||
|
throw new Error();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
await this.galleryPostsRepository.update({
|
await this.galleryPostsRepository.update({
|
||||||
|
@ -82,7 +85,7 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
|
||||||
title: ps.title,
|
title: ps.title,
|
||||||
description: ps.description,
|
description: ps.description,
|
||||||
isSensitive: ps.isSensitive,
|
isSensitive: ps.isSensitive,
|
||||||
fileIds: files.map(file => file.id),
|
fileIds: files ? files.map(file => file.id) : undefined,
|
||||||
});
|
});
|
||||||
|
|
||||||
const post = await this.galleryPostsRepository.findOneByOrFail({ id: ps.postId });
|
const post = await this.galleryPostsRepository.findOneByOrFail({ id: ps.postId });
|
||||||
|
|
|
@ -34,13 +34,13 @@ export const paramDef = {
|
||||||
webhookId: { type: 'string', format: 'misskey:id' },
|
webhookId: { type: 'string', format: 'misskey:id' },
|
||||||
name: { type: 'string', minLength: 1, maxLength: 100 },
|
name: { type: 'string', minLength: 1, maxLength: 100 },
|
||||||
url: { type: 'string', minLength: 1, maxLength: 1024 },
|
url: { type: 'string', minLength: 1, maxLength: 1024 },
|
||||||
secret: { type: 'string', maxLength: 1024, default: '' },
|
secret: { type: 'string', nullable: true, maxLength: 1024 },
|
||||||
on: { type: 'array', items: {
|
on: { type: 'array', items: {
|
||||||
type: 'string', enum: webhookEventTypes,
|
type: 'string', enum: webhookEventTypes,
|
||||||
} },
|
} },
|
||||||
active: { type: 'boolean' },
|
active: { type: 'boolean' },
|
||||||
},
|
},
|
||||||
required: ['webhookId', 'name', 'url', 'on', 'active'],
|
required: ['webhookId'],
|
||||||
} as const;
|
} as const;
|
||||||
|
|
||||||
// TODO: ロジックをサービスに切り出す
|
// TODO: ロジックをサービスに切り出す
|
||||||
|
@ -66,7 +66,7 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
|
||||||
await this.webhooksRepository.update(webhook.id, {
|
await this.webhooksRepository.update(webhook.id, {
|
||||||
name: ps.name,
|
name: ps.name,
|
||||||
url: ps.url,
|
url: ps.url,
|
||||||
secret: ps.secret,
|
secret: ps.secret === null ? '' : ps.secret,
|
||||||
on: ps.on,
|
on: ps.on,
|
||||||
active: ps.active,
|
active: ps.active,
|
||||||
});
|
});
|
||||||
|
|
|
@ -36,6 +36,12 @@ export const meta = {
|
||||||
code: 'YOU_HAVE_BEEN_BLOCKED',
|
code: 'YOU_HAVE_BEEN_BLOCKED',
|
||||||
id: '20ef5475-9f38-4e4c-bd33-de6d979498ec',
|
id: '20ef5475-9f38-4e4c-bd33-de6d979498ec',
|
||||||
},
|
},
|
||||||
|
|
||||||
|
cannotReactToRenote: {
|
||||||
|
message: 'You cannot react to Renote.',
|
||||||
|
code: 'CANNOT_REACT_TO_RENOTE',
|
||||||
|
id: 'eaccdc08-ddef-43fe-908f-d108faad57f5',
|
||||||
|
},
|
||||||
},
|
},
|
||||||
} as const;
|
} as const;
|
||||||
|
|
||||||
|
@ -62,6 +68,7 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
|
||||||
await this.reactionService.create(me, note, ps.reaction).catch(err => {
|
await this.reactionService.create(me, note, ps.reaction).catch(err => {
|
||||||
if (err.id === '51c42bb4-931a-456b-bff7-e5a8a70dd298') throw new ApiError(meta.errors.alreadyReacted);
|
if (err.id === '51c42bb4-931a-456b-bff7-e5a8a70dd298') throw new ApiError(meta.errors.alreadyReacted);
|
||||||
if (err.id === 'e70412a4-7197-4726-8e74-f3e0deb92aa7') throw new ApiError(meta.errors.youHaveBeenBlocked);
|
if (err.id === 'e70412a4-7197-4726-8e74-f3e0deb92aa7') throw new ApiError(meta.errors.youHaveBeenBlocked);
|
||||||
|
if (err.id === '12c35529-3c79-4327-b1cc-e2cf63a71925') throw new ApiError(meta.errors.cannotReactToRenote);
|
||||||
throw err;
|
throw err;
|
||||||
});
|
});
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -70,7 +70,7 @@ export const paramDef = {
|
||||||
alignCenter: { type: 'boolean' },
|
alignCenter: { type: 'boolean' },
|
||||||
hideTitleWhenPinned: { type: 'boolean' },
|
hideTitleWhenPinned: { type: 'boolean' },
|
||||||
},
|
},
|
||||||
required: ['pageId', 'title', 'name', 'content', 'variables', 'script'],
|
required: ['pageId'],
|
||||||
} as const;
|
} as const;
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
|
@ -91,9 +91,8 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
|
||||||
throw new ApiError(meta.errors.accessDenied);
|
throw new ApiError(meta.errors.accessDenied);
|
||||||
}
|
}
|
||||||
|
|
||||||
let eyeCatchingImage = null;
|
|
||||||
if (ps.eyeCatchingImageId != null) {
|
if (ps.eyeCatchingImageId != null) {
|
||||||
eyeCatchingImage = await this.driveFilesRepository.findOneBy({
|
const eyeCatchingImage = await this.driveFilesRepository.findOneBy({
|
||||||
id: ps.eyeCatchingImageId,
|
id: ps.eyeCatchingImageId,
|
||||||
userId: me.id,
|
userId: me.id,
|
||||||
});
|
});
|
||||||
|
@ -116,23 +115,15 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
|
||||||
await this.pagesRepository.update(page.id, {
|
await this.pagesRepository.update(page.id, {
|
||||||
updatedAt: new Date(),
|
updatedAt: new Date(),
|
||||||
title: ps.title,
|
title: ps.title,
|
||||||
// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
|
name: ps.name,
|
||||||
name: ps.name === undefined ? page.name : ps.name,
|
|
||||||
summary: ps.summary === undefined ? page.summary : ps.summary,
|
summary: ps.summary === undefined ? page.summary : ps.summary,
|
||||||
content: ps.content,
|
content: ps.content,
|
||||||
variables: ps.variables,
|
variables: ps.variables,
|
||||||
script: ps.script,
|
script: ps.script,
|
||||||
// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
|
alignCenter: ps.alignCenter,
|
||||||
alignCenter: ps.alignCenter === undefined ? page.alignCenter : ps.alignCenter,
|
hideTitleWhenPinned: ps.hideTitleWhenPinned,
|
||||||
// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
|
font: ps.font,
|
||||||
hideTitleWhenPinned: ps.hideTitleWhenPinned === undefined ? page.hideTitleWhenPinned : ps.hideTitleWhenPinned,
|
eyeCatchingImageId: ps.eyeCatchingImageId,
|
||||||
// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
|
|
||||||
font: ps.font === undefined ? page.font : ps.font,
|
|
||||||
eyeCatchingImageId: ps.eyeCatchingImageId === null
|
|
||||||
? null
|
|
||||||
: ps.eyeCatchingImageId === undefined
|
|
||||||
? page.eyeCatchingImageId
|
|
||||||
: eyeCatchingImage!.id,
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,7 +12,6 @@ import { Endpoint } from '@/server/api/endpoint-base.js';
|
||||||
import { MetaService } from '@/core/MetaService.js';
|
import { MetaService } from '@/core/MetaService.js';
|
||||||
import { UserEntityService } from '@/core/entities/UserEntityService.js';
|
import { UserEntityService } from '@/core/entities/UserEntityService.js';
|
||||||
import { DI } from '@/di-symbols.js';
|
import { DI } from '@/di-symbols.js';
|
||||||
import { isNotNull } from '@/misc/is-not-null.js';
|
|
||||||
|
|
||||||
export const meta = {
|
export const meta = {
|
||||||
tags: ['users'],
|
tags: ['users'],
|
||||||
|
@ -53,7 +52,7 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
|
||||||
host: acct.host ?? IsNull(),
|
host: acct.host ?? IsNull(),
|
||||||
})));
|
})));
|
||||||
|
|
||||||
return await this.userEntityService.packMany(users.filter(isNotNull), me, { schema: 'UserDetailed' });
|
return await this.userEntityService.packMany(users.filter(x => x != null), me, { schema: 'UserDetailed' });
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,6 +14,8 @@ import { UserEntityService } from '@/core/entities/UserEntityService.js';
|
||||||
import { DriveFileEntityService } from '@/core/entities/DriveFileEntityService.js';
|
import { DriveFileEntityService } from '@/core/entities/DriveFileEntityService.js';
|
||||||
import { bindThis } from '@/decorators.js';
|
import { bindThis } from '@/decorators.js';
|
||||||
import { IdService } from '@/core/IdService.js';
|
import { IdService } from '@/core/IdService.js';
|
||||||
|
import { MfmService } from "@/core/MfmService.js";
|
||||||
|
import { parse as mfmParse } from 'mfm-js';
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class FeedService {
|
export class FeedService {
|
||||||
|
@ -33,6 +35,7 @@ export class FeedService {
|
||||||
private userEntityService: UserEntityService,
|
private userEntityService: UserEntityService,
|
||||||
private driveFileEntityService: DriveFileEntityService,
|
private driveFileEntityService: DriveFileEntityService,
|
||||||
private idService: IdService,
|
private idService: IdService,
|
||||||
|
private mfmService: MfmService,
|
||||||
) {
|
) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -76,13 +79,14 @@ export class FeedService {
|
||||||
id: In(note.fileIds),
|
id: In(note.fileIds),
|
||||||
}) : [];
|
}) : [];
|
||||||
const file = files.find(file => file.type.startsWith('image/'));
|
const file = files.find(file => file.type.startsWith('image/'));
|
||||||
|
const text = note.text;
|
||||||
|
|
||||||
feed.addItem({
|
feed.addItem({
|
||||||
title: `New note by ${author.name}`,
|
title: `New note by ${author.name}`,
|
||||||
link: `${this.config.url}/notes/${note.id}`,
|
link: `${this.config.url}/notes/${note.id}`,
|
||||||
date: this.idService.parse(note.id).date,
|
date: this.idService.parse(note.id).date,
|
||||||
description: note.cw ?? undefined,
|
description: note.cw ?? undefined,
|
||||||
content: note.text ?? undefined,
|
content: text ? this.mfmService.toHtml(mfmParse(text), JSON.parse(note.mentionedRemoteUsers)) ?? undefined : undefined,
|
||||||
image: file ? this.driveFileEntityService.getPublicUrl(file) : undefined,
|
image: file ? this.driveFileEntityService.getPublicUrl(file) : undefined,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -266,6 +266,67 @@ describe('Endpoints', () => {
|
||||||
assert.strictEqual(res.status, 400);
|
assert.strictEqual(res.status, 400);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('リノートにリアクションできない', async () => {
|
||||||
|
const bobNote = await post(bob, { text: 'hi' });
|
||||||
|
const bobRenote = await post(bob, { renoteId: bobNote.id });
|
||||||
|
|
||||||
|
const res = await api('notes/reactions/create', {
|
||||||
|
noteId: bobRenote.id,
|
||||||
|
reaction: '🚀',
|
||||||
|
}, alice);
|
||||||
|
|
||||||
|
assert.strictEqual(res.status, 400);
|
||||||
|
assert.strictEqual(res.body.error.code, 'CANNOT_REACT_TO_RENOTE');
|
||||||
|
});
|
||||||
|
|
||||||
|
test('引用にリアクションできる', async () => {
|
||||||
|
const bobNote = await post(bob, { text: 'hi' });
|
||||||
|
const bobRenote = await post(bob, { text: 'hi again', renoteId: bobNote.id });
|
||||||
|
|
||||||
|
const res = await api('notes/reactions/create', {
|
||||||
|
noteId: bobRenote.id,
|
||||||
|
reaction: '🚀',
|
||||||
|
}, alice);
|
||||||
|
|
||||||
|
assert.strictEqual(res.status, 204);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('空文字列のリアクションは\u2764にフォールバックされる', async () => {
|
||||||
|
const bobNote = await post(bob, { text: 'hi' });
|
||||||
|
|
||||||
|
const res = await api('notes/reactions/create', {
|
||||||
|
noteId: bobNote.id,
|
||||||
|
reaction: '',
|
||||||
|
}, alice);
|
||||||
|
|
||||||
|
assert.strictEqual(res.status, 204);
|
||||||
|
|
||||||
|
const reaction = await api('notes/reactions', {
|
||||||
|
noteId: bobNote.id,
|
||||||
|
});
|
||||||
|
|
||||||
|
assert.strictEqual(reaction.body.length, 1);
|
||||||
|
assert.strictEqual(reaction.body[0].type, '\u2764');
|
||||||
|
});
|
||||||
|
|
||||||
|
test('絵文字ではない文字列のリアクションは\u2764にフォールバックされる', async () => {
|
||||||
|
const bobNote = await post(bob, { text: 'hi' });
|
||||||
|
|
||||||
|
const res = await api('notes/reactions/create', {
|
||||||
|
noteId: bobNote.id,
|
||||||
|
reaction: 'Hello!',
|
||||||
|
}, alice);
|
||||||
|
|
||||||
|
assert.strictEqual(res.status, 204);
|
||||||
|
|
||||||
|
const reaction = await api('notes/reactions', {
|
||||||
|
noteId: bobNote.id,
|
||||||
|
});
|
||||||
|
|
||||||
|
assert.strictEqual(reaction.body.length, 1);
|
||||||
|
assert.strictEqual(reaction.body[0].type, '\u2764');
|
||||||
|
});
|
||||||
|
|
||||||
test('空のパラメータで怒られる', async () => {
|
test('空のパラメータで怒られる', async () => {
|
||||||
// @ts-expect-error param must not be empty
|
// @ts-expect-error param must not be empty
|
||||||
const res = await api('notes/reactions/create', {}, alice);
|
const res = await api('notes/reactions/create', {}, alice);
|
||||||
|
|
|
@ -153,6 +153,23 @@ describe('Webリソース', () => {
|
||||||
path: path('nonexisting'),
|
path: path('nonexisting'),
|
||||||
status: 404,
|
status: 404,
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
describe(' has entry such ', () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
post(alice, { text: "**a**" })
|
||||||
|
});
|
||||||
|
|
||||||
|
test('MFMを含まない。', async () => {
|
||||||
|
const content = await simpleGet(path(alice.username), "*/*", undefined, res => res.text());
|
||||||
|
const _body: unknown = content.body;
|
||||||
|
// JSONフィードのときは改めて文字列化する
|
||||||
|
const body: string = typeof (_body) === "object" ? JSON.stringify(_body) : _body as string;
|
||||||
|
|
||||||
|
if (body.includes("**a**")) {
|
||||||
|
throw new Error("MFM shouldn't be included");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
})
|
||||||
});
|
});
|
||||||
|
|
||||||
describe.each([{ path: '/api/foo' }])('$path', ({ path }) => {
|
describe.each([{ path: '/api/foo' }])('$path', ({ path }) => {
|
||||||
|
|
|
@ -7,6 +7,8 @@
|
||||||
// pnpm jest -- e2e/timelines.ts
|
// pnpm jest -- e2e/timelines.ts
|
||||||
|
|
||||||
import * as assert from 'assert';
|
import * as assert from 'assert';
|
||||||
|
import { Redis } from 'ioredis';
|
||||||
|
import { loadConfig } from '@/config.js';
|
||||||
import { api, post, randomString, sendEnvUpdateRequest, signup, sleep, uploadUrl } from '../utils.js';
|
import { api, post, randomString, sendEnvUpdateRequest, signup, sleep, uploadUrl } from '../utils.js';
|
||||||
|
|
||||||
function genHost() {
|
function genHost() {
|
||||||
|
@ -17,7 +19,13 @@ function waitForPushToTl() {
|
||||||
return sleep(500);
|
return sleep(500);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let redisForTimelines: Redis;
|
||||||
|
|
||||||
describe('Timelines', () => {
|
describe('Timelines', () => {
|
||||||
|
beforeAll(() => {
|
||||||
|
redisForTimelines = new Redis(loadConfig().redisForTimelines);
|
||||||
|
});
|
||||||
|
|
||||||
describe('Home TL', () => {
|
describe('Home TL', () => {
|
||||||
test.concurrent('自分の visibility: followers なノートが含まれる', async () => {
|
test.concurrent('自分の visibility: followers なノートが含まれる', async () => {
|
||||||
const [alice] = await Promise.all([signup()]);
|
const [alice] = await Promise.all([signup()]);
|
||||||
|
@ -1272,6 +1280,33 @@ describe('Timelines', () => {
|
||||||
|
|
||||||
assert.strictEqual(res.body.some((note: any) => note.id === bobNote.id), false);
|
assert.strictEqual(res.body.some((note: any) => note.id === bobNote.id), false);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
/** @see https://github.com/misskey-dev/misskey/issues/14000 */
|
||||||
|
test.concurrent('FTT: sinceId にキャッシュより古いノートを指定しても、sinceId による絞り込みが正しく動作する', async () => {
|
||||||
|
const alice = await signup();
|
||||||
|
const noteSince = await post(alice, { text: 'Note where id will be `sinceId`.' });
|
||||||
|
const note1 = await post(alice, { text: '1' });
|
||||||
|
const note2 = await post(alice, { text: '2' });
|
||||||
|
await redisForTimelines.del('list:userTimeline:' + alice.id);
|
||||||
|
const note3 = await post(alice, { text: '3' });
|
||||||
|
|
||||||
|
const res = await api('users/notes', { userId: alice.id, sinceId: noteSince.id });
|
||||||
|
assert.deepStrictEqual(res.body, [note1, note2, note3]);
|
||||||
|
});
|
||||||
|
|
||||||
|
test.concurrent('FTT: sinceId にキャッシュより古いノートを指定しても、sinceId と untilId による絞り込みが正しく動作する', async () => {
|
||||||
|
const alice = await signup();
|
||||||
|
const noteSince = await post(alice, { text: 'Note where id will be `sinceId`.' });
|
||||||
|
const note1 = await post(alice, { text: '1' });
|
||||||
|
const note2 = await post(alice, { text: '2' });
|
||||||
|
await redisForTimelines.del('list:userTimeline:' + alice.id);
|
||||||
|
const note3 = await post(alice, { text: '3' });
|
||||||
|
const noteUntil = await post(alice, { text: 'Note where id will be `untilId`.' });
|
||||||
|
await post(alice, { text: '4' });
|
||||||
|
|
||||||
|
const res = await api('users/notes', { userId: alice.id, sinceId: noteSince.id, untilId: noteUntil.id });
|
||||||
|
assert.deepStrictEqual(res.body, [note3, note2, note1]);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
// TODO: リノートミュート済みユーザーのテスト
|
// TODO: リノートミュート済みユーザーのテスト
|
||||||
|
|
|
@ -1,23 +0,0 @@
|
||||||
/*
|
|
||||||
* SPDX-FileCopyrightText: syuilo and misskey-project
|
|
||||||
* SPDX-License-Identifier: AGPL-3.0-only
|
|
||||||
*/
|
|
||||||
|
|
||||||
import * as assert from 'assert';
|
|
||||||
import { just, nothing } from '../../src/misc/prelude/maybe.js';
|
|
||||||
|
|
||||||
describe('just', () => {
|
|
||||||
test('has a value', () => {
|
|
||||||
assert.deepStrictEqual(just(3).isJust(), true);
|
|
||||||
});
|
|
||||||
|
|
||||||
test('has the inverse called get', () => {
|
|
||||||
assert.deepStrictEqual(just(3).get(), 3);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('nothing', () => {
|
|
||||||
test('has no value', () => {
|
|
||||||
assert.deepStrictEqual(nothing().isJust(), false);
|
|
||||||
});
|
|
||||||
});
|
|
|
@ -17,6 +17,7 @@ import { validateContentTypeSetAsActivityPub } from '@/core/activitypub/misc/val
|
||||||
import { entities } from '../src/postgres.js';
|
import { entities } from '../src/postgres.js';
|
||||||
import { loadConfig } from '../src/config.js';
|
import { loadConfig } from '../src/config.js';
|
||||||
import type * as misskey from 'misskey-js';
|
import type * as misskey from 'misskey-js';
|
||||||
|
import { type Response } from 'node-fetch';
|
||||||
|
|
||||||
export { server as startServer, jobQueue as startJobQueue } from '@/boot/common.js';
|
export { server as startServer, jobQueue as startJobQueue } from '@/boot/common.js';
|
||||||
|
|
||||||
|
@ -454,7 +455,7 @@ export type SimpleGetResponse = {
|
||||||
type: string | null,
|
type: string | null,
|
||||||
location: string | null
|
location: string | null
|
||||||
};
|
};
|
||||||
export const simpleGet = async (path: string, accept = '*/*', cookie: any = undefined): Promise<SimpleGetResponse> => {
|
export const simpleGet = async (path: string, accept = '*/*', cookie: any = undefined, bodyExtractor: (res: Response) => Promise<string | null> = _ => Promise.resolve(null)): Promise<SimpleGetResponse> => {
|
||||||
const res = await relativeFetch(path, {
|
const res = await relativeFetch(path, {
|
||||||
headers: {
|
headers: {
|
||||||
Accept: accept,
|
Accept: accept,
|
||||||
|
@ -482,7 +483,7 @@ export const simpleGet = async (path: string, accept = '*/*', cookie: any = unde
|
||||||
const body =
|
const body =
|
||||||
jsonTypes.includes(res.headers.get('content-type') ?? '') ? await res.json() :
|
jsonTypes.includes(res.headers.get('content-type') ?? '') ? await res.json() :
|
||||||
htmlTypes.includes(res.headers.get('content-type') ?? '') ? new JSDOM(await res.text()) :
|
htmlTypes.includes(res.headers.get('content-type') ?? '') ? new JSDOM(await res.text()) :
|
||||||
null;
|
await bodyExtractor(res);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
status: res.status,
|
status: res.status,
|
||||||
|
|
|
@ -56,7 +56,7 @@ module.exports = {
|
||||||
'vue/no-dupe-keys': 'warn',
|
'vue/no-dupe-keys': 'warn',
|
||||||
'vue/valid-v-for': 'warn',
|
'vue/valid-v-for': 'warn',
|
||||||
'vue/return-in-computed-property': 'warn',
|
'vue/return-in-computed-property': 'warn',
|
||||||
'vue/no-setup-props-destructure': 'warn',
|
'vue/no-setup-props-reactivity-loss': 'warn',
|
||||||
'vue/max-attributes-per-line': 'off',
|
'vue/max-attributes-per-line': 'off',
|
||||||
'vue/html-self-closing': 'off',
|
'vue/html-self-closing': 'off',
|
||||||
'vue/singleline-html-element-content-newline': 'off',
|
'vue/singleline-html-element-content-newline': 'off',
|
||||||
|
|
|
@ -0,0 +1,48 @@
|
||||||
|
/*
|
||||||
|
* SPDX-FileCopyrightText: syuilo and misskey-project
|
||||||
|
* SPDX-License-Identifier: AGPL-3.0-only
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { DefaultBodyType, HttpResponse, HttpResponseResolver, JsonBodyType, PathParams, http } from 'msw';
|
||||||
|
import seedrandom from 'seedrandom';
|
||||||
|
import { action } from '@storybook/addon-actions';
|
||||||
|
|
||||||
|
function getChartArray(seed: string, limit: number, option?: { accumulate?: boolean, mul?: number }): number[] {
|
||||||
|
const rng = seedrandom(seed);
|
||||||
|
const max = Math.floor(option?.mul ?? 250 * rng());
|
||||||
|
let accumulation = 0;
|
||||||
|
const array: number[] = [];
|
||||||
|
for (let i = 0; i < limit; i++) {
|
||||||
|
const num = Math.floor((max + 1) * rng());
|
||||||
|
if (option?.accumulate) {
|
||||||
|
accumulation += num;
|
||||||
|
array.unshift(accumulation);
|
||||||
|
} else {
|
||||||
|
array.push(num);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return array;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getChartResolver(fields: string[], option?: { accumulate?: boolean, mulMap?: Record<string, number> }): HttpResponseResolver<PathParams, DefaultBodyType, JsonBodyType> {
|
||||||
|
return ({ request }) => {
|
||||||
|
action(`GET ${request.url}`)();
|
||||||
|
const limitParam = new URL(request.url).searchParams.get('limit');
|
||||||
|
const limit = limitParam ? parseInt(limitParam) : 30;
|
||||||
|
const res = {};
|
||||||
|
for (const field of fields) {
|
||||||
|
const layers = field.split('.');
|
||||||
|
let current = res;
|
||||||
|
while (layers.length > 1) {
|
||||||
|
const currentKey = layers.shift()!;
|
||||||
|
if (current[currentKey] == null) current[currentKey] = {};
|
||||||
|
current = current[currentKey];
|
||||||
|
}
|
||||||
|
current[layers[0]] = getChartArray(field, limit, {
|
||||||
|
accumulate: option?.accumulate,
|
||||||
|
mul: option?.mulMap != null && field in option.mulMap ? option.mulMap[field] : undefined,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return HttpResponse.json(res);
|
||||||
|
};
|
||||||
|
}
|
|
@ -69,7 +69,7 @@
|
||||||
"tinycolor2": "1.6.0",
|
"tinycolor2": "1.6.0",
|
||||||
"tsc-alias": "1.8.8",
|
"tsc-alias": "1.8.8",
|
||||||
"tsconfig-paths": "4.2.0",
|
"tsconfig-paths": "4.2.0",
|
||||||
"typescript": "5.4.5",
|
"typescript": "5.5.2",
|
||||||
"uuid": "9.0.1",
|
"uuid": "9.0.1",
|
||||||
"v-code-diff": "1.11.0",
|
"v-code-diff": "1.11.0",
|
||||||
"vite": "5.2.11",
|
"vite": "5.2.11",
|
||||||
|
|
|
@ -120,7 +120,7 @@ function fetchAccount(token: string, id?: string, forceShowDialog?: boolean): Pr
|
||||||
res.json().then(done2, fail2);
|
res.json().then(done2, fail2);
|
||||||
}))
|
}))
|
||||||
.then(async res => {
|
.then(async res => {
|
||||||
if (res.error) {
|
if ('error' in res) {
|
||||||
if (res.error.id === 'a8c724b3-6e9c-4b46-b1a8-bc3ed6258370') {
|
if (res.error.id === 'a8c724b3-6e9c-4b46-b1a8-bc3ed6258370') {
|
||||||
// SUSPENDED
|
// SUSPENDED
|
||||||
if (forceShowDialog || $i && (token === $i.token || id === $i.id)) {
|
if (forceShowDialog || $i && (token === $i.token || id === $i.id)) {
|
||||||
|
|
|
@ -104,7 +104,6 @@ async function requestRender() {
|
||||||
});
|
});
|
||||||
} else if (props.provider === 'mcaptcha' && props.instanceUrl && props.sitekey) {
|
} else if (props.provider === 'mcaptcha' && props.instanceUrl && props.sitekey) {
|
||||||
const { default: Widget } = await import('@mcaptcha/vanilla-glue');
|
const { default: Widget } = await import('@mcaptcha/vanilla-glue');
|
||||||
// @ts-expect-error avoid typecheck error
|
|
||||||
new Widget({
|
new Widget({
|
||||||
siteKey: {
|
siteKey: {
|
||||||
instanceUrl: new URL(props.instanceUrl),
|
instanceUrl: new URL(props.instanceUrl),
|
||||||
|
|
|
@ -6,52 +6,11 @@
|
||||||
/* eslint-disable @typescript-eslint/explicit-function-return-type */
|
/* eslint-disable @typescript-eslint/explicit-function-return-type */
|
||||||
/* eslint-disable import/no-default-export */
|
/* eslint-disable import/no-default-export */
|
||||||
import { StoryObj } from '@storybook/vue3';
|
import { StoryObj } from '@storybook/vue3';
|
||||||
import { DefaultBodyType, HttpResponse, HttpResponseResolver, JsonBodyType, PathParams, http } from 'msw';
|
import { http } from 'msw';
|
||||||
import seedrandom from 'seedrandom';
|
|
||||||
import { action } from '@storybook/addon-actions';
|
|
||||||
import { commonHandlers } from '../../.storybook/mocks.js';
|
import { commonHandlers } from '../../.storybook/mocks.js';
|
||||||
|
import { getChartResolver } from '../../.storybook/charts.js';
|
||||||
import MkChart from './MkChart.vue';
|
import MkChart from './MkChart.vue';
|
||||||
|
|
||||||
function getChartArray(seed: string, limit: number, option?: { accumulate?: boolean, mul?: number }): number[] {
|
|
||||||
const rng = seedrandom(seed);
|
|
||||||
const max = Math.floor(option?.mul ?? 250 * rng());
|
|
||||||
let accumulation = 0;
|
|
||||||
const array: number[] = [];
|
|
||||||
for (let i = 0; i < limit; i++) {
|
|
||||||
const num = Math.floor((max + 1) * rng());
|
|
||||||
if (option?.accumulate) {
|
|
||||||
accumulation += num;
|
|
||||||
array.unshift(accumulation);
|
|
||||||
} else {
|
|
||||||
array.push(num);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return array;
|
|
||||||
}
|
|
||||||
|
|
||||||
export function getChartResolver(fields: string[], option?: { accumulate?: boolean, mulMap?: Record<string, number> }): HttpResponseResolver<PathParams, DefaultBodyType, JsonBodyType> {
|
|
||||||
return ({ request }) => {
|
|
||||||
action(`GET ${request.url}`)();
|
|
||||||
const limitParam = new URL(request.url).searchParams.get('limit');
|
|
||||||
const limit = limitParam ? parseInt(limitParam) : 30;
|
|
||||||
const res = {};
|
|
||||||
for (const field of fields) {
|
|
||||||
const layers = field.split('.');
|
|
||||||
let current = res;
|
|
||||||
while (layers.length > 1) {
|
|
||||||
const currentKey = layers.shift()!;
|
|
||||||
if (current[currentKey] == null) current[currentKey] = {};
|
|
||||||
current = current[currentKey];
|
|
||||||
}
|
|
||||||
current[layers[0]] = getChartArray(field, limit, {
|
|
||||||
accumulate: option?.accumulate,
|
|
||||||
mul: option?.mulMap != null && field in option.mulMap ? option.mulMap[field] : undefined,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
return HttpResponse.json(res);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
const Base = {
|
const Base = {
|
||||||
render(args) {
|
render(args) {
|
||||||
return {
|
return {
|
||||||
|
|
|
@ -114,7 +114,7 @@ const getColor = (i) => {
|
||||||
return colorSets[i % colorSets.length];
|
return colorSets[i % colorSets.length];
|
||||||
};
|
};
|
||||||
|
|
||||||
// eslint-disable-next-line vue/no-setup-props-destructure
|
// eslint-disable-next-line vue/no-setup-props-reactivity-loss
|
||||||
const now = props.nowForChromatic != null ? new Date(props.nowForChromatic) : new Date();
|
const now = props.nowForChromatic != null ? new Date(props.nowForChromatic) : new Date();
|
||||||
let chartInstance: Chart | null = null;
|
let chartInstance: Chart | null = null;
|
||||||
let chartData: {
|
let chartData: {
|
||||||
|
|
|
@ -136,7 +136,7 @@ export default defineComponent({
|
||||||
el.classList.remove('before-leave');
|
el.classList.remove('before-leave');
|
||||||
}
|
}
|
||||||
|
|
||||||
// eslint-disable-next-line vue/no-setup-props-destructure
|
// eslint-disable-next-line vue/no-setup-props-reactivity-loss
|
||||||
const classes = {
|
const classes = {
|
||||||
[$style['date-separated-list']]: true,
|
[$style['date-separated-list']]: true,
|
||||||
[$style['date-separated-list-nogap']]: props.noGap,
|
[$style['date-separated-list-nogap']]: props.noGap,
|
||||||
|
|
|
@ -8,8 +8,9 @@ import { StoryObj } from '@storybook/vue3';
|
||||||
import { HttpResponse, http } from 'msw';
|
import { HttpResponse, http } from 'msw';
|
||||||
import { federationInstance } from '../../.storybook/fakes.js';
|
import { federationInstance } from '../../.storybook/fakes.js';
|
||||||
import { commonHandlers } from '../../.storybook/mocks.js';
|
import { commonHandlers } from '../../.storybook/mocks.js';
|
||||||
|
import { getChartResolver } from '../../.storybook/charts.js';
|
||||||
import MkInstanceCardMini from './MkInstanceCardMini.vue';
|
import MkInstanceCardMini from './MkInstanceCardMini.vue';
|
||||||
import { getChartResolver } from './MkChart.stories.impl.js';
|
|
||||||
export const Default = {
|
export const Default = {
|
||||||
render(args) {
|
render(args) {
|
||||||
return {
|
return {
|
||||||
|
|
|
@ -143,7 +143,7 @@ function hasFocus() {
|
||||||
const playerEl = shallowRef<HTMLDivElement>();
|
const playerEl = shallowRef<HTMLDivElement>();
|
||||||
const audioEl = shallowRef<HTMLAudioElement>();
|
const audioEl = shallowRef<HTMLAudioElement>();
|
||||||
|
|
||||||
// eslint-disable-next-line vue/no-setup-props-destructure
|
// eslint-disable-next-line vue/no-setup-props-reactivity-loss
|
||||||
const hide = ref((defaultStore.state.nsfw === 'force' || defaultStore.state.dataSaver.media) ? true : (props.audio.isSensitive && defaultStore.state.nsfw !== 'ignore'));
|
const hide = ref((defaultStore.state.nsfw === 'force' || defaultStore.state.dataSaver.media) ? true : (props.audio.isSensitive && defaultStore.state.nsfw !== 'ignore'));
|
||||||
|
|
||||||
// Menu
|
// Menu
|
||||||
|
|
|
@ -160,7 +160,7 @@ function hasFocus() {
|
||||||
return playerEl.value === document.activeElement || playerEl.value.contains(document.activeElement);
|
return playerEl.value === document.activeElement || playerEl.value.contains(document.activeElement);
|
||||||
}
|
}
|
||||||
|
|
||||||
// eslint-disable-next-line vue/no-setup-props-destructure
|
// eslint-disable-next-line vue/no-setup-props-reactivity-loss
|
||||||
const hide = ref((defaultStore.state.nsfw === 'force' || defaultStore.state.dataSaver.media) ? true : (props.video.isSensitive && defaultStore.state.nsfw !== 'ignore'));
|
const hide = ref((defaultStore.state.nsfw === 'force' || defaultStore.state.dataSaver.media) ? true : (props.video.isSensitive && defaultStore.state.nsfw !== 'ignore'));
|
||||||
|
|
||||||
// Menu
|
// Menu
|
||||||
|
|
|
@ -6,14 +6,14 @@ SPDX-License-Identifier: AGPL-3.0-only
|
||||||
<template>
|
<template>
|
||||||
<div :class="$style.root">
|
<div :class="$style.root">
|
||||||
<div :class="$style.head">
|
<div :class="$style.head">
|
||||||
<MkAvatar v-if="['pollEnded', 'note'].includes(notification.type) && notification.note" :class="$style.icon" :user="notification.note.user" link preview/>
|
<MkAvatar v-if="['pollEnded', 'note'].includes(notification.type) && 'note' in notification" :class="$style.icon" :user="notification.note.user" link preview/>
|
||||||
<MkAvatar v-else-if="['roleAssigned', 'achievementEarned', 'loginbonus'].includes(notification.type)" :class="$style.icon" :user="$i" link preview/>
|
<MkAvatar v-else-if="['roleAssigned', 'achievementEarned', 'loginbonus'].includes(notification.type)" :class="$style.icon" :user="$i" link preview/>
|
||||||
<div v-else-if="notification.type === 'reaction:grouped' && notification.note.reactionAcceptance === 'likeOnly'" :class="[$style.icon, $style.icon_reactionGroupHeart]"><i class="ti ti-heart" style="line-height: 1;"></i></div>
|
<div v-else-if="notification.type === 'reaction:grouped' && notification.note.reactionAcceptance === 'likeOnly'" :class="[$style.icon, $style.icon_reactionGroupHeart]"><i class="ti ti-heart" style="line-height: 1;"></i></div>
|
||||||
<div v-else-if="notification.type === 'reaction:grouped'" :class="[$style.icon, $style.icon_reactionGroup]"><i class="ti ti-plus" style="line-height: 1;"></i></div>
|
<div v-else-if="notification.type === 'reaction:grouped'" :class="[$style.icon, $style.icon_reactionGroup]"><i class="ti ti-plus" style="line-height: 1;"></i></div>
|
||||||
<div v-else-if="notification.type === 'renote:grouped'" :class="[$style.icon, $style.icon_renoteGroup]"><i class="ti ti-repeat" style="line-height: 1;"></i></div>
|
<div v-else-if="notification.type === 'renote:grouped'" :class="[$style.icon, $style.icon_renoteGroup]"><i class="ti ti-repeat" style="line-height: 1;"></i></div>
|
||||||
<img v-else-if="notification.type === 'test'" :class="$style.icon" :src="infoImageUrl"/>
|
<img v-else-if="notification.type === 'test'" :class="$style.icon" :src="infoImageUrl"/>
|
||||||
<MkAvatar v-else-if="notification.user" :class="$style.icon" :user="notification.user" link preview/>
|
<MkAvatar v-else-if="'user' in notification" :class="$style.icon" :user="notification.user" link preview/>
|
||||||
<img v-else-if="notification.icon" :class="[$style.icon, $style.icon_app]" :src="notification.icon" alt=""/>
|
<img v-else-if="'icon' in notification" :class="[$style.icon, $style.icon_app]" :src="notification.icon" alt=""/>
|
||||||
<div
|
<div
|
||||||
:class="[$style.subIcon, {
|
:class="[$style.subIcon, {
|
||||||
[$style.t_follow]: notification.type === 'follow',
|
[$style.t_follow]: notification.type === 'follow',
|
||||||
|
@ -171,13 +171,13 @@ const props = withDefaults(defineProps<{
|
||||||
const followRequestDone = ref(false);
|
const followRequestDone = ref(false);
|
||||||
|
|
||||||
const acceptFollowRequest = () => {
|
const acceptFollowRequest = () => {
|
||||||
if (props.notification.user == null) return;
|
if (!('user' in props.notification)) return;
|
||||||
followRequestDone.value = true;
|
followRequestDone.value = true;
|
||||||
misskeyApi('following/requests/accept', { userId: props.notification.user.id });
|
misskeyApi('following/requests/accept', { userId: props.notification.user.id });
|
||||||
};
|
};
|
||||||
|
|
||||||
const rejectFollowRequest = () => {
|
const rejectFollowRequest = () => {
|
||||||
if (props.notification.user == null) return;
|
if (!('user' in props.notification)) return;
|
||||||
followRequestDone.value = true;
|
followRequestDone.value = true;
|
||||||
misskeyApi('following/requests/reject', { userId: props.notification.user.id });
|
misskeyApi('following/requests/reject', { userId: props.notification.user.id });
|
||||||
};
|
};
|
||||||
|
|
|
@ -172,7 +172,7 @@ const emit = defineEmits<{
|
||||||
|
|
||||||
const dialog = shallowRef<InstanceType<typeof MkModalWindow>>();
|
const dialog = shallowRef<InstanceType<typeof MkModalWindow>>();
|
||||||
|
|
||||||
// eslint-disable-next-line vue/no-setup-props-destructure
|
// eslint-disable-next-line vue/no-setup-props-reactivity-loss
|
||||||
const page = ref(props.initialPage ?? 0);
|
const page = ref(props.initialPage ?? 0);
|
||||||
|
|
||||||
watch(page, (to) => {
|
watch(page, (to) => {
|
||||||
|
|
|
@ -149,7 +149,7 @@ const emit = defineEmits<{
|
||||||
|
|
||||||
const dialog = shallowRef<InstanceType<typeof MkModalWindow>>();
|
const dialog = shallowRef<InstanceType<typeof MkModalWindow>>();
|
||||||
|
|
||||||
// eslint-disable-next-line vue/no-setup-props-destructure
|
// eslint-disable-next-line vue/no-setup-props-reactivity-loss
|
||||||
const page = ref(defaultStore.state.accountSetupWizard);
|
const page = ref(defaultStore.state.accountSetupWizard);
|
||||||
|
|
||||||
watch(page, () => {
|
watch(page, () => {
|
||||||
|
|
|
@ -41,12 +41,12 @@ function getDateSafe(n: Date | string | number) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// eslint-disable-next-line vue/no-setup-props-destructure
|
// eslint-disable-next-line vue/no-setup-props-reactivity-loss
|
||||||
const _time = props.time == null ? NaN : getDateSafe(props.time).getTime();
|
const _time = props.time == null ? NaN : getDateSafe(props.time).getTime();
|
||||||
const invalid = Number.isNaN(_time);
|
const invalid = Number.isNaN(_time);
|
||||||
const absolute = !invalid ? dateTimeFormat.format(_time) : i18n.ts._ago.invalid;
|
const absolute = !invalid ? dateTimeFormat.format(_time) : i18n.ts._ago.invalid;
|
||||||
|
|
||||||
// eslint-disable-next-line vue/no-setup-props-destructure
|
// eslint-disable-next-line vue/no-setup-props-reactivity-loss
|
||||||
const now = ref(props.origin?.getTime() ?? Date.now());
|
const now = ref(props.origin?.getTime() ?? Date.now());
|
||||||
const ago = computed(() => (now.value - _time) / 1000/*ms*/);
|
const ago = computed(() => (now.value - _time) / 1000/*ms*/);
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
import * as Misskey from 'misskey-js';
|
import * as Misskey from 'misskey-js';
|
||||||
import { url } from '@/config.js';
|
import { url } from '@/config.js';
|
||||||
|
|
||||||
export const acct = (user: misskey.Acct) => {
|
export const acct = (user: Misskey.Acct) => {
|
||||||
return Misskey.acct.toString(user);
|
return Misskey.acct.toString(user);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -14,6 +14,6 @@ export const userName = (user: Misskey.entities.User) => {
|
||||||
return user.name || user.username;
|
return user.name || user.username;
|
||||||
};
|
};
|
||||||
|
|
||||||
export const userPage = (user: misskey.Acct, path?, absolute = false) => {
|
export const userPage = (user: Misskey.Acct, path?: string, absolute = false) => {
|
||||||
return `${absolute ? url : ''}/@${acct(user)}${(path ? `/${path}` : '')}`;
|
return `${absolute ? url : ''}/@${acct(user)}${(path ? `/${path}` : '')}`;
|
||||||
};
|
};
|
||||||
|
|
|
@ -11,6 +11,5 @@ import { I18n } from '@/scripts/i18n.js';
|
||||||
export const i18n = markRaw(new I18n<Locale>(locale));
|
export const i18n = markRaw(new I18n<Locale>(locale));
|
||||||
|
|
||||||
export function updateI18n(newLocale: Locale) {
|
export function updateI18n(newLocale: Locale) {
|
||||||
// @ts-expect-error -- private field
|
|
||||||
i18n.locale = newLocale;
|
i18n.locale = newLocale;
|
||||||
}
|
}
|
||||||
|
|
|
@ -316,7 +316,7 @@ import * as os from '@/os.js';
|
||||||
import { misskeyApi } from '@/scripts/misskey-api.js';
|
import { misskeyApi } from '@/scripts/misskey-api.js';
|
||||||
import { i18n } from '@/i18n.js';
|
import { i18n } from '@/i18n.js';
|
||||||
import { definePageMetadata } from '@/scripts/page-metadata.js';
|
import { definePageMetadata } from '@/scripts/page-metadata.js';
|
||||||
import { instance } from '@/instance.js';
|
import { instance, fetchInstance } from '@/instance.js';
|
||||||
import MkFoldableSection from '@/components/MkFoldableSection.vue';
|
import MkFoldableSection from '@/components/MkFoldableSection.vue';
|
||||||
import { ROLE_POLICIES } from '@/const.js';
|
import { ROLE_POLICIES } from '@/const.js';
|
||||||
import { useRouter } from '@/router/supplier.js';
|
import { useRouter } from '@/router/supplier.js';
|
||||||
|
@ -340,6 +340,7 @@ async function updateBaseRole() {
|
||||||
await os.apiWithDialog('admin/roles/update-default-policies', {
|
await os.apiWithDialog('admin/roles/update-default-policies', {
|
||||||
policies,
|
policies,
|
||||||
});
|
});
|
||||||
|
fetchInstance(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
function create() {
|
function create() {
|
||||||
|
|
|
@ -169,7 +169,7 @@ const props = defineProps<{
|
||||||
const showBoardLabels = ref<boolean>(false);
|
const showBoardLabels = ref<boolean>(false);
|
||||||
const useAvatarAsStone = ref<boolean>(true);
|
const useAvatarAsStone = ref<boolean>(true);
|
||||||
const autoplaying = ref<boolean>(false);
|
const autoplaying = ref<boolean>(false);
|
||||||
// eslint-disable-next-line vue/no-setup-props-destructure
|
// eslint-disable-next-line vue/no-setup-props-reactivity-loss
|
||||||
const game = ref<Misskey.entities.ReversiGameDetailed & { logs: Reversi.Serializer.SerializedLog[] }>(deepClone(props.game));
|
const game = ref<Misskey.entities.ReversiGameDetailed & { logs: Reversi.Serializer.SerializedLog[] }>(deepClone(props.game));
|
||||||
const logPos = ref<number>(game.value.logs.length);
|
const logPos = ref<number>(game.value.logs.length);
|
||||||
const engine = shallowRef<Reversi.Game>(Reversi.Serializer.restoreGame({
|
const engine = shallowRef<Reversi.Game>(Reversi.Serializer.restoreGame({
|
||||||
|
|
|
@ -20,6 +20,7 @@ import { useStream } from '@/stream.js';
|
||||||
import { signinRequired } from '@/account.js';
|
import { signinRequired } from '@/account.js';
|
||||||
import { useRouter } from '@/router/supplier.js';
|
import { useRouter } from '@/router/supplier.js';
|
||||||
import * as os from '@/os.js';
|
import * as os from '@/os.js';
|
||||||
|
import { url } from '@/config.js';
|
||||||
import { i18n } from '@/i18n.js';
|
import { i18n } from '@/i18n.js';
|
||||||
import { useInterval } from '@/scripts/use-interval.js';
|
import { useInterval } from '@/scripts/use-interval.js';
|
||||||
|
|
||||||
|
@ -44,7 +45,7 @@ function start(_game: Misskey.entities.ReversiGameDetailed) {
|
||||||
|
|
||||||
if (shareWhenStart.value) {
|
if (shareWhenStart.value) {
|
||||||
misskeyApi('notes/create', {
|
misskeyApi('notes/create', {
|
||||||
text: i18n.ts._reversi.iStartedAGame + '\n' + location.href,
|
text: `${i18n.ts._reversi.iStartedAGame}\n${url}/reversi/g/${props.gameId}`,
|
||||||
visibility: 'home',
|
visibility: 'home',
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -439,11 +439,12 @@ onUnmounted(() => {
|
||||||
|
|
||||||
> .name {
|
> .name {
|
||||||
display: block;
|
display: block;
|
||||||
margin: 0;
|
margin: -10px;
|
||||||
|
padding: 10px;
|
||||||
line-height: 32px;
|
line-height: 32px;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
font-size: 1.8em;
|
font-size: 1.8em;
|
||||||
text-shadow: 0 0 8px #000;
|
filter: drop-shadow(0 0 4px #000);
|
||||||
}
|
}
|
||||||
|
|
||||||
> .bottom {
|
> .bottom {
|
||||||
|
|
|
@ -77,44 +77,6 @@ export function maximum(xs: number[]): number {
|
||||||
return Math.max(...xs);
|
return Math.max(...xs);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Splits an array based on the equivalence relation.
|
|
||||||
* The concatenation of the result is equal to the argument.
|
|
||||||
*/
|
|
||||||
export function groupBy<T>(f: EndoRelation<T>, xs: T[]): T[][] {
|
|
||||||
const groups = [] as T[][];
|
|
||||||
for (const x of xs) {
|
|
||||||
const lastGroup = groups.at(-1);
|
|
||||||
if (lastGroup !== undefined && f(lastGroup[0], x)) {
|
|
||||||
lastGroup.push(x);
|
|
||||||
} else {
|
|
||||||
groups.push([x]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return groups;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Splits an array based on the equivalence relation induced by the function.
|
|
||||||
* The concatenation of the result is equal to the argument.
|
|
||||||
*/
|
|
||||||
export function groupOn<T, S>(f: (x: T) => S, xs: T[]): T[][] {
|
|
||||||
return groupBy((a, b) => f(a) === f(b), xs);
|
|
||||||
}
|
|
||||||
|
|
||||||
export function groupByX<T>(collections: T[], keySelector: (x: T) => string) {
|
|
||||||
return collections.reduce((obj: Record<string, T[]>, item: T) => {
|
|
||||||
const key = keySelector(item);
|
|
||||||
if (typeof obj[key] === 'undefined') {
|
|
||||||
obj[key] = [];
|
|
||||||
}
|
|
||||||
|
|
||||||
obj[key].push(item);
|
|
||||||
|
|
||||||
return obj;
|
|
||||||
}, {});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Compare two arrays by lexicographical order
|
* Compare two arrays by lexicographical order
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -102,16 +102,19 @@ defineExpose<WidgetComponentExpose>({
|
||||||
.body {
|
.body {
|
||||||
text-overflow: ellipsis;
|
text-overflow: ellipsis;
|
||||||
overflow: clip;
|
overflow: clip;
|
||||||
|
margin-left: -10px;
|
||||||
|
padding: 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.name {
|
.name {
|
||||||
color: #fff;
|
color: #fff;
|
||||||
filter: drop-shadow(0 0 4px #000);
|
filter: drop-shadow(0 0 4px #000) drop-shadow(0 0 0.1px rgba(0, 0, 0, 0.5));
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
}
|
}
|
||||||
|
|
||||||
.host {
|
.host {
|
||||||
color: #fff;
|
color: #fff;
|
||||||
filter: drop-shadow(0 0 4px #000);
|
filter: drop-shadow(0 0 4px #000) drop-shadow(0 0 0.1px rgba(0, 0, 0, 0.5));
|
||||||
|
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
|
@ -82,16 +82,19 @@ defineExpose<WidgetComponentExpose>({
|
||||||
.body {
|
.body {
|
||||||
text-overflow: ellipsis;
|
text-overflow: ellipsis;
|
||||||
overflow: clip;
|
overflow: clip;
|
||||||
|
margin-left: -10px;
|
||||||
|
padding: 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.name {
|
.name {
|
||||||
color: #fff;
|
color: #fff;
|
||||||
filter: drop-shadow(0 0 4px #000);
|
filter: drop-shadow(0 0 4px #000) drop-shadow(0 0 0.1px rgba(0, 0, 0, 0.5));
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
}
|
}
|
||||||
|
|
||||||
.username {
|
.username {
|
||||||
color: #fff;
|
color: #fff;
|
||||||
filter: drop-shadow(0 0 4px #000);
|
filter: drop-shadow(0 0 4px #000) drop-shadow(0 0 0.1px rgba(0, 0, 0, 0.5));
|
||||||
|
font-weight: normal;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
|
@ -51,7 +51,7 @@
|
||||||
"nodemon": "3.1.0",
|
"nodemon": "3.1.0",
|
||||||
"execa": "8.0.1",
|
"execa": "8.0.1",
|
||||||
"tsd": "0.30.7",
|
"tsd": "0.30.7",
|
||||||
"typescript": "5.4.5",
|
"typescript": "5.5.2",
|
||||||
"esbuild": "0.19.11",
|
"esbuild": "0.19.11",
|
||||||
"glob": "10.3.12"
|
"glob": "10.3.12"
|
||||||
},
|
},
|
||||||
|
|
|
@ -5881,15 +5881,15 @@ export type operations = {
|
||||||
'application/json': {
|
'application/json': {
|
||||||
/** Format: misskey:id */
|
/** Format: misskey:id */
|
||||||
id: string;
|
id: string;
|
||||||
memo: string;
|
memo?: string;
|
||||||
url: string;
|
url?: string;
|
||||||
imageUrl: string;
|
imageUrl?: string;
|
||||||
place: string;
|
place?: string;
|
||||||
priority: string;
|
priority?: string;
|
||||||
ratio: number;
|
ratio?: number;
|
||||||
expiresAt: number;
|
expiresAt?: number;
|
||||||
startsAt: number;
|
startsAt?: number;
|
||||||
dayOfWeek: number;
|
dayOfWeek?: number;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
@ -9745,21 +9745,21 @@ export type operations = {
|
||||||
'application/json': {
|
'application/json': {
|
||||||
/** Format: misskey:id */
|
/** Format: misskey:id */
|
||||||
roleId: string;
|
roleId: string;
|
||||||
name: string;
|
name?: string;
|
||||||
description: string;
|
description?: string;
|
||||||
color: string | null;
|
color?: string | null;
|
||||||
iconUrl: string | null;
|
iconUrl?: string | null;
|
||||||
/** @enum {string} */
|
/** @enum {string} */
|
||||||
target: 'manual' | 'conditional';
|
target?: 'manual' | 'conditional';
|
||||||
condFormula: Record<string, never>;
|
condFormula?: Record<string, never>;
|
||||||
isPublic: boolean;
|
isPublic?: boolean;
|
||||||
isModerator: boolean;
|
isModerator?: boolean;
|
||||||
isAdministrator: boolean;
|
isAdministrator?: boolean;
|
||||||
isExplorable?: boolean;
|
isExplorable?: boolean;
|
||||||
asBadge: boolean;
|
asBadge?: boolean;
|
||||||
canEditMembersByModerator: boolean;
|
canEditMembersByModerator?: boolean;
|
||||||
displayOrder: number;
|
displayOrder?: number;
|
||||||
policies: Record<string, never>;
|
policies?: Record<string, never>;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
@ -13401,7 +13401,7 @@ export type operations = {
|
||||||
'application/json': {
|
'application/json': {
|
||||||
/** Format: misskey:id */
|
/** Format: misskey:id */
|
||||||
clipId: string;
|
clipId: string;
|
||||||
name: string;
|
name?: string;
|
||||||
isPublic?: boolean;
|
isPublic?: boolean;
|
||||||
description?: string | null;
|
description?: string | null;
|
||||||
};
|
};
|
||||||
|
@ -16248,9 +16248,9 @@ export type operations = {
|
||||||
'application/json': {
|
'application/json': {
|
||||||
/** Format: misskey:id */
|
/** Format: misskey:id */
|
||||||
postId: string;
|
postId: string;
|
||||||
title: string;
|
title?: string;
|
||||||
description?: string | null;
|
description?: string | null;
|
||||||
fileIds: string[];
|
fileIds?: string[];
|
||||||
/** @default false */
|
/** @default false */
|
||||||
isSensitive?: boolean;
|
isSensitive?: boolean;
|
||||||
};
|
};
|
||||||
|
@ -20032,12 +20032,11 @@ export type operations = {
|
||||||
'application/json': {
|
'application/json': {
|
||||||
/** Format: misskey:id */
|
/** Format: misskey:id */
|
||||||
webhookId: string;
|
webhookId: string;
|
||||||
name: string;
|
name?: string;
|
||||||
url: string;
|
url?: string;
|
||||||
/** @default */
|
secret?: string | null;
|
||||||
secret?: string;
|
on?: ('mention' | 'unfollow' | 'follow' | 'followed' | 'note' | 'reply' | 'renote' | 'reaction')[];
|
||||||
on: ('mention' | 'unfollow' | 'follow' | 'followed' | 'note' | 'reply' | 'renote' | 'reaction')[];
|
active?: boolean;
|
||||||
active: boolean;
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
@ -23406,16 +23405,16 @@ export type operations = {
|
||||||
'application/json': {
|
'application/json': {
|
||||||
/** Format: misskey:id */
|
/** Format: misskey:id */
|
||||||
pageId: string;
|
pageId: string;
|
||||||
title: string;
|
title?: string;
|
||||||
name: string;
|
name?: string;
|
||||||
summary?: string | null;
|
summary?: string | null;
|
||||||
content: {
|
content?: {
|
||||||
[key: string]: unknown;
|
[key: string]: unknown;
|
||||||
}[];
|
}[];
|
||||||
variables: {
|
variables?: {
|
||||||
[key: string]: unknown;
|
[key: string]: unknown;
|
||||||
}[];
|
}[];
|
||||||
script: string;
|
script?: string;
|
||||||
/** Format: misskey:id */
|
/** Format: misskey:id */
|
||||||
eyeCatchingImageId?: string | null;
|
eyeCatchingImageId?: string | null;
|
||||||
/** @enum {string} */
|
/** @enum {string} */
|
||||||
|
|
|
@ -20,7 +20,7 @@
|
||||||
"eslint": "8.57.0",
|
"eslint": "8.57.0",
|
||||||
"eslint-plugin-import": "2.29.1",
|
"eslint-plugin-import": "2.29.1",
|
||||||
"nodemon": "3.1.0",
|
"nodemon": "3.1.0",
|
||||||
"typescript": "5.4.5"
|
"typescript": "5.5.2"
|
||||||
},
|
},
|
||||||
"type": "module"
|
"type": "module"
|
||||||
}
|
}
|
||||||
|
|
275
pnpm-lock.yaml
275
pnpm-lock.yaml
|
@ -43,8 +43,8 @@ importers:
|
||||||
specifier: 5.30.3
|
specifier: 5.30.3
|
||||||
version: 5.30.3
|
version: 5.30.3
|
||||||
typescript:
|
typescript:
|
||||||
specifier: 5.4.5
|
specifier: 5.5.2
|
||||||
version: 5.4.5
|
version: 5.5.2
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
'@tensorflow/tfjs-core':
|
'@tensorflow/tfjs-core':
|
||||||
specifier: 4.4.0
|
specifier: 4.4.0
|
||||||
|
@ -55,10 +55,10 @@ importers:
|
||||||
version: 20.12.7
|
version: 20.12.7
|
||||||
'@typescript-eslint/eslint-plugin':
|
'@typescript-eslint/eslint-plugin':
|
||||||
specifier: 7.7.1
|
specifier: 7.7.1
|
||||||
version: 7.7.1(@typescript-eslint/parser@7.7.1(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5)
|
version: 7.7.1(@typescript-eslint/parser@7.7.1(eslint@8.57.0)(typescript@5.5.2))(eslint@8.57.0)(typescript@5.5.2)
|
||||||
'@typescript-eslint/parser':
|
'@typescript-eslint/parser':
|
||||||
specifier: 7.7.1
|
specifier: 7.7.1
|
||||||
version: 7.7.1(eslint@8.57.0)(typescript@5.4.5)
|
version: 7.7.1(eslint@8.57.0)(typescript@5.5.2)
|
||||||
cross-env:
|
cross-env:
|
||||||
specifier: 7.0.3
|
specifier: 7.0.3
|
||||||
version: 7.0.3
|
version: 7.0.3
|
||||||
|
@ -417,8 +417,8 @@ importers:
|
||||||
specifier: 0.3.20
|
specifier: 0.3.20
|
||||||
version: 0.3.20(ioredis@5.4.1)(pg@8.11.5)
|
version: 0.3.20(ioredis@5.4.1)(pg@8.11.5)
|
||||||
typescript:
|
typescript:
|
||||||
specifier: 5.4.5
|
specifier: 5.5.2
|
||||||
version: 5.4.5
|
version: 5.5.2
|
||||||
ulid:
|
ulid:
|
||||||
specifier: 2.3.0
|
specifier: 2.3.0
|
||||||
version: 2.3.0
|
version: 2.3.0
|
||||||
|
@ -531,7 +531,7 @@ importers:
|
||||||
version: 29.7.0
|
version: 29.7.0
|
||||||
'@misskey-dev/eslint-plugin':
|
'@misskey-dev/eslint-plugin':
|
||||||
specifier: 1.0.0
|
specifier: 1.0.0
|
||||||
version: 1.0.0(@typescript-eslint/eslint-plugin@7.7.1(@typescript-eslint/parser@7.7.1(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5))(@typescript-eslint/parser@7.7.1(eslint@8.57.0)(typescript@5.4.5))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.7.1(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0))(eslint@8.57.0)
|
version: 1.0.0(@typescript-eslint/eslint-plugin@7.7.1(@typescript-eslint/parser@7.7.1(eslint@8.57.0)(typescript@5.5.2))(eslint@8.57.0)(typescript@5.5.2))(@typescript-eslint/parser@7.7.1(eslint@8.57.0)(typescript@5.5.2))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.7.1(eslint@8.57.0)(typescript@5.5.2))(eslint@8.57.0))(eslint@8.57.0)
|
||||||
'@nestjs/platform-express':
|
'@nestjs/platform-express':
|
||||||
specifier: 10.3.8
|
specifier: 10.3.8
|
||||||
version: 10.3.8(@nestjs/common@10.3.8(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.3.8)
|
version: 10.3.8(@nestjs/common@10.3.8(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.3.8)
|
||||||
|
@ -592,9 +592,6 @@ importers:
|
||||||
'@types/node':
|
'@types/node':
|
||||||
specifier: 20.12.7
|
specifier: 20.12.7
|
||||||
version: 20.12.7
|
version: 20.12.7
|
||||||
'@types/node-fetch':
|
|
||||||
specifier: 3.0.3
|
|
||||||
version: 3.0.3
|
|
||||||
'@types/nodemailer':
|
'@types/nodemailer':
|
||||||
specifier: 6.4.15
|
specifier: 6.4.15
|
||||||
version: 6.4.15
|
version: 6.4.15
|
||||||
|
@ -660,10 +657,10 @@ importers:
|
||||||
version: 8.5.10
|
version: 8.5.10
|
||||||
'@typescript-eslint/eslint-plugin':
|
'@typescript-eslint/eslint-plugin':
|
||||||
specifier: 7.7.1
|
specifier: 7.7.1
|
||||||
version: 7.7.1(@typescript-eslint/parser@7.7.1(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5)
|
version: 7.7.1(@typescript-eslint/parser@7.7.1(eslint@8.57.0)(typescript@5.5.2))(eslint@8.57.0)(typescript@5.5.2)
|
||||||
'@typescript-eslint/parser':
|
'@typescript-eslint/parser':
|
||||||
specifier: 7.7.1
|
specifier: 7.7.1
|
||||||
version: 7.7.1(eslint@8.57.0)(typescript@5.4.5)
|
version: 7.7.1(eslint@8.57.0)(typescript@5.5.2)
|
||||||
aws-sdk-client-mock:
|
aws-sdk-client-mock:
|
||||||
specifier: 3.0.1
|
specifier: 3.0.1
|
||||||
version: 3.0.1
|
version: 3.0.1
|
||||||
|
@ -675,7 +672,7 @@ importers:
|
||||||
version: 8.57.0
|
version: 8.57.0
|
||||||
eslint-plugin-import:
|
eslint-plugin-import:
|
||||||
specifier: 2.29.1
|
specifier: 2.29.1
|
||||||
version: 2.29.1(@typescript-eslint/parser@7.7.1(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)
|
version: 2.29.1(@typescript-eslint/parser@7.7.1(eslint@8.57.0)(typescript@5.5.2))(eslint@8.57.0)
|
||||||
execa:
|
execa:
|
||||||
specifier: 8.0.1
|
specifier: 8.0.1
|
||||||
version: 8.0.1
|
version: 8.0.1
|
||||||
|
@ -735,7 +732,7 @@ importers:
|
||||||
version: 15.1.1
|
version: 15.1.1
|
||||||
'@vitejs/plugin-vue':
|
'@vitejs/plugin-vue':
|
||||||
specifier: 5.0.4
|
specifier: 5.0.4
|
||||||
version: 5.0.4(vite@5.2.11(@types/node@20.12.7)(sass@1.76.0)(terser@5.30.3))(vue@3.4.26(typescript@5.4.5))
|
version: 5.0.4(vite@5.2.11(@types/node@20.12.7)(sass@1.76.0)(terser@5.30.3))(vue@3.4.26(typescript@5.5.2))
|
||||||
'@vue/compiler-sfc':
|
'@vue/compiler-sfc':
|
||||||
specifier: 3.4.26
|
specifier: 3.4.26
|
||||||
version: 3.4.26
|
version: 3.4.26
|
||||||
|
@ -857,30 +854,30 @@ importers:
|
||||||
specifier: 4.2.0
|
specifier: 4.2.0
|
||||||
version: 4.2.0
|
version: 4.2.0
|
||||||
typescript:
|
typescript:
|
||||||
specifier: 5.4.5
|
specifier: 5.5.2
|
||||||
version: 5.4.5
|
version: 5.5.2
|
||||||
uuid:
|
uuid:
|
||||||
specifier: 9.0.1
|
specifier: 9.0.1
|
||||||
version: 9.0.1
|
version: 9.0.1
|
||||||
v-code-diff:
|
v-code-diff:
|
||||||
specifier: 1.11.0
|
specifier: 1.11.0
|
||||||
version: 1.11.0(vue@3.4.26(typescript@5.4.5))
|
version: 1.11.0(vue@3.4.26(typescript@5.5.2))
|
||||||
vite:
|
vite:
|
||||||
specifier: 5.2.11
|
specifier: 5.2.11
|
||||||
version: 5.2.11(@types/node@20.12.7)(sass@1.76.0)(terser@5.30.3)
|
version: 5.2.11(@types/node@20.12.7)(sass@1.76.0)(terser@5.30.3)
|
||||||
vue:
|
vue:
|
||||||
specifier: 3.4.26
|
specifier: 3.4.26
|
||||||
version: 3.4.26(typescript@5.4.5)
|
version: 3.4.26(typescript@5.5.2)
|
||||||
vuedraggable:
|
vuedraggable:
|
||||||
specifier: next
|
specifier: next
|
||||||
version: 4.1.0(vue@3.4.26(typescript@5.4.5))
|
version: 4.1.0(vue@3.4.26(typescript@5.5.2))
|
||||||
wavesurfer.js:
|
wavesurfer.js:
|
||||||
specifier: ^7.7.14
|
specifier: ^7.7.14
|
||||||
version: 7.7.14
|
version: 7.7.14
|
||||||
devDependencies:
|
devDependencies:
|
||||||
'@misskey-dev/eslint-plugin':
|
'@misskey-dev/eslint-plugin':
|
||||||
specifier: 1.0.0
|
specifier: 1.0.0
|
||||||
version: 1.0.0(@typescript-eslint/eslint-plugin@7.7.1(@typescript-eslint/parser@7.7.1(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5))(@typescript-eslint/parser@7.7.1(eslint@8.57.0)(typescript@5.4.5))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.7.1(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0))(eslint@8.57.0)
|
version: 1.0.0(@typescript-eslint/eslint-plugin@7.7.1(@typescript-eslint/parser@7.7.1(eslint@8.57.0)(typescript@5.5.2))(eslint@8.57.0)(typescript@5.5.2))(@typescript-eslint/parser@7.7.1(eslint@8.57.0)(typescript@5.5.2))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.7.1(eslint@8.57.0)(typescript@5.5.2))(eslint@8.57.0))(eslint@8.57.0)
|
||||||
'@misskey-dev/summaly':
|
'@misskey-dev/summaly':
|
||||||
specifier: 5.1.0
|
specifier: 5.1.0
|
||||||
version: 5.1.0
|
version: 5.1.0
|
||||||
|
@ -919,10 +916,10 @@ importers:
|
||||||
version: 8.0.9
|
version: 8.0.9
|
||||||
'@storybook/react':
|
'@storybook/react':
|
||||||
specifier: 8.0.9
|
specifier: 8.0.9
|
||||||
version: 8.0.9(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.4.5)
|
version: 8.0.9(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.2)
|
||||||
'@storybook/react-vite':
|
'@storybook/react-vite':
|
||||||
specifier: 8.0.9
|
specifier: 8.0.9
|
||||||
version: 8.0.9(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.17.2)(typescript@5.4.5)(vite@5.2.11(@types/node@20.12.7)(sass@1.76.0)(terser@5.30.3))
|
version: 8.0.9(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.17.2)(typescript@5.5.2)(vite@5.2.11(@types/node@20.12.7)(sass@1.76.0)(terser@5.30.3))
|
||||||
'@storybook/test':
|
'@storybook/test':
|
||||||
specifier: 8.0.9
|
specifier: 8.0.9
|
||||||
version: 8.0.9(@jest/globals@29.7.0)(@types/jest@29.5.12)(jest@29.7.0(@types/node@20.12.7))(vitest@0.34.6(happy-dom@10.0.3)(jsdom@24.0.0(bufferutil@4.0.7)(canvas@2.11.2(encoding@0.1.13))(utf-8-validate@6.0.3))(sass@1.76.0)(terser@5.30.3))
|
version: 8.0.9(@jest/globals@29.7.0)(@types/jest@29.5.12)(jest@29.7.0(@types/node@20.12.7))(vitest@0.34.6(happy-dom@10.0.3)(jsdom@24.0.0(bufferutil@4.0.7)(canvas@2.11.2(encoding@0.1.13))(utf-8-validate@6.0.3))(sass@1.76.0)(terser@5.30.3))
|
||||||
|
@ -934,13 +931,13 @@ importers:
|
||||||
version: 8.0.9
|
version: 8.0.9
|
||||||
'@storybook/vue3':
|
'@storybook/vue3':
|
||||||
specifier: 8.0.9
|
specifier: 8.0.9
|
||||||
version: 8.0.9(encoding@0.1.13)(vue@3.4.26(typescript@5.4.5))
|
version: 8.0.9(encoding@0.1.13)(vue@3.4.26(typescript@5.5.2))
|
||||||
'@storybook/vue3-vite':
|
'@storybook/vue3-vite':
|
||||||
specifier: 8.0.9
|
specifier: 8.0.9
|
||||||
version: 8.0.9(bufferutil@4.0.7)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(utf-8-validate@6.0.3)(vite@5.2.11(@types/node@20.12.7)(sass@1.76.0)(terser@5.30.3))(vue@3.4.26(typescript@5.4.5))
|
version: 8.0.9(bufferutil@4.0.7)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(utf-8-validate@6.0.3)(vite@5.2.11(@types/node@20.12.7)(sass@1.76.0)(terser@5.30.3))(vue@3.4.26(typescript@5.5.2))
|
||||||
'@testing-library/vue':
|
'@testing-library/vue':
|
||||||
specifier: 8.0.3
|
specifier: 8.0.3
|
||||||
version: 8.0.3(@vue/compiler-sfc@3.4.26)(@vue/server-renderer@3.4.26(vue@3.4.26(typescript@5.4.5)))(vue@3.4.26(typescript@5.4.5))
|
version: 8.0.3(@vue/compiler-sfc@3.4.26)(@vue/server-renderer@3.4.26(vue@3.4.26(typescript@5.5.2)))(vue@3.4.26(typescript@5.5.2))
|
||||||
'@types/escape-regexp':
|
'@types/escape-regexp':
|
||||||
specifier: 0.0.3
|
specifier: 0.0.3
|
||||||
version: 0.0.3
|
version: 0.0.3
|
||||||
|
@ -979,10 +976,10 @@ importers:
|
||||||
version: 8.5.10
|
version: 8.5.10
|
||||||
'@typescript-eslint/eslint-plugin':
|
'@typescript-eslint/eslint-plugin':
|
||||||
specifier: 7.7.1
|
specifier: 7.7.1
|
||||||
version: 7.7.1(@typescript-eslint/parser@7.7.1(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5)
|
version: 7.7.1(@typescript-eslint/parser@7.7.1(eslint@8.57.0)(typescript@5.5.2))(eslint@8.57.0)(typescript@5.5.2)
|
||||||
'@typescript-eslint/parser':
|
'@typescript-eslint/parser':
|
||||||
specifier: 7.7.1
|
specifier: 7.7.1
|
||||||
version: 7.7.1(eslint@8.57.0)(typescript@5.4.5)
|
version: 7.7.1(eslint@8.57.0)(typescript@5.5.2)
|
||||||
'@vitest/coverage-v8':
|
'@vitest/coverage-v8':
|
||||||
specifier: 0.34.6
|
specifier: 0.34.6
|
||||||
version: 0.34.6(vitest@0.34.6(happy-dom@10.0.3)(jsdom@24.0.0(bufferutil@4.0.7)(canvas@2.11.2(encoding@0.1.13))(utf-8-validate@6.0.3))(sass@1.76.0)(terser@5.30.3))
|
version: 0.34.6(vitest@0.34.6(happy-dom@10.0.3)(jsdom@24.0.0(bufferutil@4.0.7)(canvas@2.11.2(encoding@0.1.13))(utf-8-validate@6.0.3))(sass@1.76.0)(terser@5.30.3))
|
||||||
|
@ -1003,7 +1000,7 @@ importers:
|
||||||
version: 8.57.0
|
version: 8.57.0
|
||||||
eslint-plugin-import:
|
eslint-plugin-import:
|
||||||
specifier: 2.29.1
|
specifier: 2.29.1
|
||||||
version: 2.29.1(@typescript-eslint/parser@7.7.1(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)
|
version: 2.29.1(@typescript-eslint/parser@7.7.1(eslint@8.57.0)(typescript@5.5.2))(eslint@8.57.0)
|
||||||
eslint-plugin-vue:
|
eslint-plugin-vue:
|
||||||
specifier: 9.25.0
|
specifier: 9.25.0
|
||||||
version: 9.25.0(eslint@8.57.0)
|
version: 9.25.0(eslint@8.57.0)
|
||||||
|
@ -1021,10 +1018,10 @@ importers:
|
||||||
version: 4.0.5
|
version: 4.0.5
|
||||||
msw:
|
msw:
|
||||||
specifier: 2.2.14
|
specifier: 2.2.14
|
||||||
version: 2.2.14(typescript@5.4.5)
|
version: 2.2.14(typescript@5.5.2)
|
||||||
msw-storybook-addon:
|
msw-storybook-addon:
|
||||||
specifier: 2.0.1
|
specifier: 2.0.1
|
||||||
version: 2.0.1(msw@2.2.14(typescript@5.4.5))
|
version: 2.0.1(msw@2.2.14(typescript@5.5.2))
|
||||||
nodemon:
|
nodemon:
|
||||||
specifier: 3.1.0
|
specifier: 3.1.0
|
||||||
version: 3.1.0
|
version: 3.1.0
|
||||||
|
@ -1066,7 +1063,7 @@ importers:
|
||||||
version: 9.4.2(eslint@8.57.0)
|
version: 9.4.2(eslint@8.57.0)
|
||||||
vue-tsc:
|
vue-tsc:
|
||||||
specifier: 2.0.16
|
specifier: 2.0.16
|
||||||
version: 2.0.16(typescript@5.4.5)
|
version: 2.0.16(typescript@5.5.2)
|
||||||
|
|
||||||
packages/misskey-bubble-game:
|
packages/misskey-bubble-game:
|
||||||
dependencies:
|
dependencies:
|
||||||
|
@ -1131,7 +1128,7 @@ importers:
|
||||||
version: 7.43.1(@types/node@20.12.7)
|
version: 7.43.1(@types/node@20.12.7)
|
||||||
'@misskey-dev/eslint-plugin':
|
'@misskey-dev/eslint-plugin':
|
||||||
specifier: 1.0.0
|
specifier: 1.0.0
|
||||||
version: 1.0.0(@typescript-eslint/eslint-plugin@7.7.1(@typescript-eslint/parser@7.7.1(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5))(@typescript-eslint/parser@7.7.1(eslint@8.57.0)(typescript@5.4.5))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.7.1(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0))(eslint@8.57.0)
|
version: 1.0.0(@typescript-eslint/eslint-plugin@7.7.1(@typescript-eslint/parser@7.7.1(eslint@8.57.0)(typescript@5.5.2))(eslint@8.57.0)(typescript@5.5.2))(@typescript-eslint/parser@7.7.1(eslint@8.57.0)(typescript@5.5.2))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.7.1(eslint@8.57.0)(typescript@5.5.2))(eslint@8.57.0))(eslint@8.57.0)
|
||||||
'@swc/jest':
|
'@swc/jest':
|
||||||
specifier: 0.2.36
|
specifier: 0.2.36
|
||||||
version: 0.2.36(@swc/core@1.4.17)
|
version: 0.2.36(@swc/core@1.4.17)
|
||||||
|
@ -1143,10 +1140,10 @@ importers:
|
||||||
version: 20.12.7
|
version: 20.12.7
|
||||||
'@typescript-eslint/eslint-plugin':
|
'@typescript-eslint/eslint-plugin':
|
||||||
specifier: 7.7.1
|
specifier: 7.7.1
|
||||||
version: 7.7.1(@typescript-eslint/parser@7.7.1(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5)
|
version: 7.7.1(@typescript-eslint/parser@7.7.1(eslint@8.57.0)(typescript@5.5.2))(eslint@8.57.0)(typescript@5.5.2)
|
||||||
'@typescript-eslint/parser':
|
'@typescript-eslint/parser':
|
||||||
specifier: 7.7.1
|
specifier: 7.7.1
|
||||||
version: 7.7.1(eslint@8.57.0)(typescript@5.4.5)
|
version: 7.7.1(eslint@8.57.0)(typescript@5.5.2)
|
||||||
esbuild:
|
esbuild:
|
||||||
specifier: 0.19.11
|
specifier: 0.19.11
|
||||||
version: 0.19.11
|
version: 0.19.11
|
||||||
|
@ -1181,8 +1178,8 @@ importers:
|
||||||
specifier: 0.30.7
|
specifier: 0.30.7
|
||||||
version: 0.30.7
|
version: 0.30.7
|
||||||
typescript:
|
typescript:
|
||||||
specifier: 5.4.5
|
specifier: 5.5.2
|
||||||
version: 5.4.5
|
version: 5.5.2
|
||||||
|
|
||||||
packages/misskey-js/generator:
|
packages/misskey-js/generator:
|
||||||
devDependencies:
|
devDependencies:
|
||||||
|
@ -1271,10 +1268,10 @@ importers:
|
||||||
devDependencies:
|
devDependencies:
|
||||||
'@misskey-dev/eslint-plugin':
|
'@misskey-dev/eslint-plugin':
|
||||||
specifier: 1.0.0
|
specifier: 1.0.0
|
||||||
version: 1.0.0(@typescript-eslint/eslint-plugin@7.7.1(@typescript-eslint/parser@7.7.1(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5))(@typescript-eslint/parser@7.7.1(eslint@8.57.0)(typescript@5.4.5))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.7.1(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0))(eslint@8.57.0)
|
version: 1.0.0(@typescript-eslint/eslint-plugin@7.7.1(@typescript-eslint/parser@7.7.1(eslint@8.57.0)(typescript@5.5.2))(eslint@8.57.0)(typescript@5.5.2))(@typescript-eslint/parser@7.7.1(eslint@8.57.0)(typescript@5.5.2))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.7.1(eslint@8.57.0)(typescript@5.5.2))(eslint@8.57.0))(eslint@8.57.0)
|
||||||
'@typescript-eslint/parser':
|
'@typescript-eslint/parser':
|
||||||
specifier: 7.7.1
|
specifier: 7.7.1
|
||||||
version: 7.7.1(eslint@8.57.0)(typescript@5.4.5)
|
version: 7.7.1(eslint@8.57.0)(typescript@5.5.2)
|
||||||
'@typescript/lib-webworker':
|
'@typescript/lib-webworker':
|
||||||
specifier: npm:@types/serviceworker@0.0.67
|
specifier: npm:@types/serviceworker@0.0.67
|
||||||
version: '@types/serviceworker@0.0.67'
|
version: '@types/serviceworker@0.0.67'
|
||||||
|
@ -1283,13 +1280,13 @@ importers:
|
||||||
version: 8.57.0
|
version: 8.57.0
|
||||||
eslint-plugin-import:
|
eslint-plugin-import:
|
||||||
specifier: 2.29.1
|
specifier: 2.29.1
|
||||||
version: 2.29.1(@typescript-eslint/parser@7.7.1(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)
|
version: 2.29.1(@typescript-eslint/parser@7.7.1(eslint@8.57.0)(typescript@5.5.2))(eslint@8.57.0)
|
||||||
nodemon:
|
nodemon:
|
||||||
specifier: 3.1.0
|
specifier: 3.1.0
|
||||||
version: 3.1.0
|
version: 3.1.0
|
||||||
typescript:
|
typescript:
|
||||||
specifier: 5.4.5
|
specifier: 5.5.2
|
||||||
version: 5.4.5
|
version: 5.5.2
|
||||||
|
|
||||||
packages:
|
packages:
|
||||||
|
|
||||||
|
@ -4643,10 +4640,6 @@ packages:
|
||||||
'@types/node-fetch@2.6.4':
|
'@types/node-fetch@2.6.4':
|
||||||
resolution: {integrity: sha512-1ZX9fcN4Rvkvgv4E6PAY5WXUFWFcRWxZa3EW83UjycOB9ljJCedb2CupIP4RZMEwF/M3eTcCihbBRgwtGbg5Rg==}
|
resolution: {integrity: sha512-1ZX9fcN4Rvkvgv4E6PAY5WXUFWFcRWxZa3EW83UjycOB9ljJCedb2CupIP4RZMEwF/M3eTcCihbBRgwtGbg5Rg==}
|
||||||
|
|
||||||
'@types/node-fetch@3.0.3':
|
|
||||||
resolution: {integrity: sha512-HhggYPH5N+AQe/OmN6fmhKmRRt2XuNJow+R3pQwJxOOF9GuwM7O2mheyGeIrs5MOIeNjDEdgdoyHBOrFeJBR3g==}
|
|
||||||
deprecated: This is a stub types definition. node-fetch provides its own type definitions, so you do not need this installed.
|
|
||||||
|
|
||||||
'@types/node@18.17.15':
|
'@types/node@18.17.15':
|
||||||
resolution: {integrity: sha512-2yrWpBk32tvV/JAd3HNHWuZn/VDN1P+72hWirHnvsvTGSqbANi+kSeuQR9yAHnbvaBvHDsoTdXV0Fe+iRtHLKA==}
|
resolution: {integrity: sha512-2yrWpBk32tvV/JAd3HNHWuZn/VDN1P+72hWirHnvsvTGSqbANi+kSeuQR9yAHnbvaBvHDsoTdXV0Fe+iRtHLKA==}
|
||||||
|
|
||||||
|
@ -10878,8 +10871,8 @@ packages:
|
||||||
engines: {node: '>=14.17'}
|
engines: {node: '>=14.17'}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
|
|
||||||
typescript@5.4.5:
|
typescript@5.5.2:
|
||||||
resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==}
|
resolution: {integrity: sha512-NcRtPEOsPFFWjobJEtfihkLCZCXZt/os3zf8nTxjVH3RvTSxjrCamJpbExGvYOF+tFHc3pA65qpdwPbzjohhew==}
|
||||||
engines: {node: '>=14.17'}
|
engines: {node: '>=14.17'}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
|
|
||||||
|
@ -13707,15 +13700,15 @@ snapshots:
|
||||||
'@types/yargs': 17.0.19
|
'@types/yargs': 17.0.19
|
||||||
chalk: 4.1.2
|
chalk: 4.1.2
|
||||||
|
|
||||||
'@joshwooding/vite-plugin-react-docgen-typescript@0.3.0(typescript@5.4.5)(vite@5.2.11(@types/node@20.12.7)(sass@1.76.0)(terser@5.30.3))':
|
'@joshwooding/vite-plugin-react-docgen-typescript@0.3.0(typescript@5.5.2)(vite@5.2.11(@types/node@20.12.7)(sass@1.76.0)(terser@5.30.3))':
|
||||||
dependencies:
|
dependencies:
|
||||||
glob: 7.2.3
|
glob: 7.2.3
|
||||||
glob-promise: 4.2.2(glob@7.2.3)
|
glob-promise: 4.2.2(glob@7.2.3)
|
||||||
magic-string: 0.27.0
|
magic-string: 0.27.0
|
||||||
react-docgen-typescript: 2.2.2(typescript@5.4.5)
|
react-docgen-typescript: 2.2.2(typescript@5.5.2)
|
||||||
vite: 5.2.11(@types/node@20.12.7)(sass@1.76.0)(terser@5.30.3)
|
vite: 5.2.11(@types/node@20.12.7)(sass@1.76.0)(terser@5.30.3)
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
typescript: 5.4.5
|
typescript: 5.5.2
|
||||||
|
|
||||||
'@jridgewell/gen-mapping@0.3.2':
|
'@jridgewell/gen-mapping@0.3.2':
|
||||||
dependencies:
|
dependencies:
|
||||||
|
@ -13837,12 +13830,12 @@ snapshots:
|
||||||
eslint: 8.57.0
|
eslint: 8.57.0
|
||||||
eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.1.0(eslint@8.57.0)(typescript@5.3.3))(eslint@8.57.0)
|
eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.1.0(eslint@8.57.0)(typescript@5.3.3))(eslint@8.57.0)
|
||||||
|
|
||||||
'@misskey-dev/eslint-plugin@1.0.0(@typescript-eslint/eslint-plugin@7.7.1(@typescript-eslint/parser@7.7.1(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5))(@typescript-eslint/parser@7.7.1(eslint@8.57.0)(typescript@5.4.5))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.7.1(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0))(eslint@8.57.0)':
|
'@misskey-dev/eslint-plugin@1.0.0(@typescript-eslint/eslint-plugin@7.7.1(@typescript-eslint/parser@7.7.1(eslint@8.57.0)(typescript@5.5.2))(eslint@8.57.0)(typescript@5.5.2))(@typescript-eslint/parser@7.7.1(eslint@8.57.0)(typescript@5.5.2))(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.7.1(eslint@8.57.0)(typescript@5.5.2))(eslint@8.57.0))(eslint@8.57.0)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@typescript-eslint/eslint-plugin': 7.7.1(@typescript-eslint/parser@7.7.1(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5)
|
'@typescript-eslint/eslint-plugin': 7.7.1(@typescript-eslint/parser@7.7.1(eslint@8.57.0)(typescript@5.5.2))(eslint@8.57.0)(typescript@5.5.2)
|
||||||
'@typescript-eslint/parser': 7.7.1(eslint@8.57.0)(typescript@5.4.5)
|
'@typescript-eslint/parser': 7.7.1(eslint@8.57.0)(typescript@5.5.2)
|
||||||
eslint: 8.57.0
|
eslint: 8.57.0
|
||||||
eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.7.1(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)
|
eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.7.1(eslint@8.57.0)(typescript@5.5.2))(eslint@8.57.0)
|
||||||
|
|
||||||
'@misskey-dev/sharp-read-bmp@1.2.0':
|
'@misskey-dev/sharp-read-bmp@1.2.0':
|
||||||
dependencies:
|
dependencies:
|
||||||
|
@ -15072,7 +15065,7 @@ snapshots:
|
||||||
- encoding
|
- encoding
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
'@storybook/builder-vite@8.0.9(encoding@0.1.13)(typescript@5.4.5)(vite@5.2.11(@types/node@20.12.7)(sass@1.76.0)(terser@5.30.3))':
|
'@storybook/builder-vite@8.0.9(encoding@0.1.13)(typescript@5.5.2)(vite@5.2.11(@types/node@20.12.7)(sass@1.76.0)(terser@5.30.3))':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@storybook/channels': 8.0.9
|
'@storybook/channels': 8.0.9
|
||||||
'@storybook/client-logger': 8.0.9
|
'@storybook/client-logger': 8.0.9
|
||||||
|
@ -15093,7 +15086,7 @@ snapshots:
|
||||||
ts-dedent: 2.2.0
|
ts-dedent: 2.2.0
|
||||||
vite: 5.2.11(@types/node@20.12.7)(sass@1.76.0)(terser@5.30.3)
|
vite: 5.2.11(@types/node@20.12.7)(sass@1.76.0)(terser@5.30.3)
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
typescript: 5.4.5
|
typescript: 5.5.2
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- encoding
|
- encoding
|
||||||
- supports-color
|
- supports-color
|
||||||
|
@ -15391,13 +15384,13 @@ snapshots:
|
||||||
react: 18.3.1
|
react: 18.3.1
|
||||||
react-dom: 18.3.1(react@18.3.1)
|
react-dom: 18.3.1(react@18.3.1)
|
||||||
|
|
||||||
'@storybook/react-vite@8.0.9(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.17.2)(typescript@5.4.5)(vite@5.2.11(@types/node@20.12.7)(sass@1.76.0)(terser@5.30.3))':
|
'@storybook/react-vite@8.0.9(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.17.2)(typescript@5.5.2)(vite@5.2.11(@types/node@20.12.7)(sass@1.76.0)(terser@5.30.3))':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@joshwooding/vite-plugin-react-docgen-typescript': 0.3.0(typescript@5.4.5)(vite@5.2.11(@types/node@20.12.7)(sass@1.76.0)(terser@5.30.3))
|
'@joshwooding/vite-plugin-react-docgen-typescript': 0.3.0(typescript@5.5.2)(vite@5.2.11(@types/node@20.12.7)(sass@1.76.0)(terser@5.30.3))
|
||||||
'@rollup/pluginutils': 5.1.0(rollup@4.17.2)
|
'@rollup/pluginutils': 5.1.0(rollup@4.17.2)
|
||||||
'@storybook/builder-vite': 8.0.9(encoding@0.1.13)(typescript@5.4.5)(vite@5.2.11(@types/node@20.12.7)(sass@1.76.0)(terser@5.30.3))
|
'@storybook/builder-vite': 8.0.9(encoding@0.1.13)(typescript@5.5.2)(vite@5.2.11(@types/node@20.12.7)(sass@1.76.0)(terser@5.30.3))
|
||||||
'@storybook/node-logger': 8.0.9
|
'@storybook/node-logger': 8.0.9
|
||||||
'@storybook/react': 8.0.9(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.4.5)
|
'@storybook/react': 8.0.9(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.2)
|
||||||
find-up: 5.0.0
|
find-up: 5.0.0
|
||||||
magic-string: 0.30.7
|
magic-string: 0.30.7
|
||||||
react: 18.3.1
|
react: 18.3.1
|
||||||
|
@ -15414,7 +15407,7 @@ snapshots:
|
||||||
- typescript
|
- typescript
|
||||||
- vite-plugin-glimmerx
|
- vite-plugin-glimmerx
|
||||||
|
|
||||||
'@storybook/react@8.0.9(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.4.5)':
|
'@storybook/react@8.0.9(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.5.2)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@storybook/client-logger': 8.0.9
|
'@storybook/client-logger': 8.0.9
|
||||||
'@storybook/docs-tools': 8.0.9(encoding@0.1.13)
|
'@storybook/docs-tools': 8.0.9(encoding@0.1.13)
|
||||||
|
@ -15440,7 +15433,7 @@ snapshots:
|
||||||
type-fest: 2.19.0
|
type-fest: 2.19.0
|
||||||
util-deprecate: 1.0.2
|
util-deprecate: 1.0.2
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
typescript: 5.4.5
|
typescript: 5.5.2
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- encoding
|
- encoding
|
||||||
- supports-color
|
- supports-color
|
||||||
|
@ -15508,17 +15501,17 @@ snapshots:
|
||||||
'@types/express': 4.17.17
|
'@types/express': 4.17.17
|
||||||
file-system-cache: 2.3.0
|
file-system-cache: 2.3.0
|
||||||
|
|
||||||
'@storybook/vue3-vite@8.0.9(bufferutil@4.0.7)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(utf-8-validate@6.0.3)(vite@5.2.11(@types/node@20.12.7)(sass@1.76.0)(terser@5.30.3))(vue@3.4.26(typescript@5.4.5))':
|
'@storybook/vue3-vite@8.0.9(bufferutil@4.0.7)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(utf-8-validate@6.0.3)(vite@5.2.11(@types/node@20.12.7)(sass@1.76.0)(terser@5.30.3))(vue@3.4.26(typescript@5.5.2))':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@storybook/builder-vite': 8.0.9(encoding@0.1.13)(typescript@5.4.5)(vite@5.2.11(@types/node@20.12.7)(sass@1.76.0)(terser@5.30.3))
|
'@storybook/builder-vite': 8.0.9(encoding@0.1.13)(typescript@5.5.2)(vite@5.2.11(@types/node@20.12.7)(sass@1.76.0)(terser@5.30.3))
|
||||||
'@storybook/core-server': 8.0.9(bufferutil@4.0.7)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(utf-8-validate@6.0.3)
|
'@storybook/core-server': 8.0.9(bufferutil@4.0.7)(encoding@0.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(utf-8-validate@6.0.3)
|
||||||
'@storybook/vue3': 8.0.9(encoding@0.1.13)(vue@3.4.26(typescript@5.4.5))
|
'@storybook/vue3': 8.0.9(encoding@0.1.13)(vue@3.4.26(typescript@5.5.2))
|
||||||
find-package-json: 1.2.0
|
find-package-json: 1.2.0
|
||||||
magic-string: 0.30.7
|
magic-string: 0.30.7
|
||||||
typescript: 5.4.5
|
typescript: 5.5.2
|
||||||
vite: 5.2.11(@types/node@20.12.7)(sass@1.76.0)(terser@5.30.3)
|
vite: 5.2.11(@types/node@20.12.7)(sass@1.76.0)(terser@5.30.3)
|
||||||
vue-component-meta: 2.0.16(typescript@5.4.5)
|
vue-component-meta: 2.0.16(typescript@5.5.2)
|
||||||
vue-docgen-api: 4.75.1(vue@3.4.26(typescript@5.4.5))
|
vue-docgen-api: 4.75.1(vue@3.4.26(typescript@5.5.2))
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- '@preact/preset-vite'
|
- '@preact/preset-vite'
|
||||||
- bufferutil
|
- bufferutil
|
||||||
|
@ -15530,7 +15523,7 @@ snapshots:
|
||||||
- vite-plugin-glimmerx
|
- vite-plugin-glimmerx
|
||||||
- vue
|
- vue
|
||||||
|
|
||||||
'@storybook/vue3@8.0.9(encoding@0.1.13)(vue@3.4.26(typescript@5.4.5))':
|
'@storybook/vue3@8.0.9(encoding@0.1.13)(vue@3.4.26(typescript@5.5.2))':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@storybook/docs-tools': 8.0.9(encoding@0.1.13)
|
'@storybook/docs-tools': 8.0.9(encoding@0.1.13)
|
||||||
'@storybook/global': 5.0.0
|
'@storybook/global': 5.0.0
|
||||||
|
@ -15540,7 +15533,7 @@ snapshots:
|
||||||
lodash: 4.17.21
|
lodash: 4.17.21
|
||||||
ts-dedent: 2.2.0
|
ts-dedent: 2.2.0
|
||||||
type-fest: 2.19.0
|
type-fest: 2.19.0
|
||||||
vue: 3.4.26(typescript@5.4.5)
|
vue: 3.4.26(typescript@5.5.2)
|
||||||
vue-component-type-helpers: 2.0.21
|
vue-component-type-helpers: 2.0.21
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- encoding
|
- encoding
|
||||||
|
@ -15802,12 +15795,12 @@ snapshots:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@testing-library/dom': 9.3.4
|
'@testing-library/dom': 9.3.4
|
||||||
|
|
||||||
'@testing-library/vue@8.0.3(@vue/compiler-sfc@3.4.26)(@vue/server-renderer@3.4.26(vue@3.4.26(typescript@5.4.5)))(vue@3.4.26(typescript@5.4.5))':
|
'@testing-library/vue@8.0.3(@vue/compiler-sfc@3.4.26)(@vue/server-renderer@3.4.26(vue@3.4.26(typescript@5.5.2)))(vue@3.4.26(typescript@5.5.2))':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@babel/runtime': 7.23.4
|
'@babel/runtime': 7.23.4
|
||||||
'@testing-library/dom': 9.3.3
|
'@testing-library/dom': 9.3.3
|
||||||
'@vue/test-utils': 2.4.1(@vue/server-renderer@3.4.26(vue@3.4.26(typescript@5.4.5)))(vue@3.4.26(typescript@5.4.5))
|
'@vue/test-utils': 2.4.1(@vue/server-renderer@3.4.26(vue@3.4.26(typescript@5.5.2)))(vue@3.4.26(typescript@5.5.2))
|
||||||
vue: 3.4.26(typescript@5.4.5)
|
vue: 3.4.26(typescript@5.5.2)
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
'@vue/compiler-sfc': 3.4.26
|
'@vue/compiler-sfc': 3.4.26
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
|
@ -16077,10 +16070,6 @@ snapshots:
|
||||||
'@types/node': 20.12.7
|
'@types/node': 20.12.7
|
||||||
form-data: 3.0.1
|
form-data: 3.0.1
|
||||||
|
|
||||||
'@types/node-fetch@3.0.3':
|
|
||||||
dependencies:
|
|
||||||
node-fetch: 3.3.2
|
|
||||||
|
|
||||||
'@types/node@18.17.15': {}
|
'@types/node@18.17.15': {}
|
||||||
|
|
||||||
'@types/node@20.11.5':
|
'@types/node@20.11.5':
|
||||||
|
@ -16290,13 +16279,13 @@ snapshots:
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
'@typescript-eslint/eslint-plugin@7.7.1(@typescript-eslint/parser@7.7.1(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5)':
|
'@typescript-eslint/eslint-plugin@7.7.1(@typescript-eslint/parser@7.7.1(eslint@8.57.0)(typescript@5.5.2))(eslint@8.57.0)(typescript@5.5.2)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@eslint-community/regexpp': 4.10.0
|
'@eslint-community/regexpp': 4.10.0
|
||||||
'@typescript-eslint/parser': 7.7.1(eslint@8.57.0)(typescript@5.4.5)
|
'@typescript-eslint/parser': 7.7.1(eslint@8.57.0)(typescript@5.5.2)
|
||||||
'@typescript-eslint/scope-manager': 7.7.1
|
'@typescript-eslint/scope-manager': 7.7.1
|
||||||
'@typescript-eslint/type-utils': 7.7.1(eslint@8.57.0)(typescript@5.4.5)
|
'@typescript-eslint/type-utils': 7.7.1(eslint@8.57.0)(typescript@5.5.2)
|
||||||
'@typescript-eslint/utils': 7.7.1(eslint@8.57.0)(typescript@5.4.5)
|
'@typescript-eslint/utils': 7.7.1(eslint@8.57.0)(typescript@5.5.2)
|
||||||
'@typescript-eslint/visitor-keys': 7.7.1
|
'@typescript-eslint/visitor-keys': 7.7.1
|
||||||
debug: 4.3.4(supports-color@8.1.1)
|
debug: 4.3.4(supports-color@8.1.1)
|
||||||
eslint: 8.57.0
|
eslint: 8.57.0
|
||||||
|
@ -16304,9 +16293,9 @@ snapshots:
|
||||||
ignore: 5.3.1
|
ignore: 5.3.1
|
||||||
natural-compare: 1.4.0
|
natural-compare: 1.4.0
|
||||||
semver: 7.6.0
|
semver: 7.6.0
|
||||||
ts-api-utils: 1.3.0(typescript@5.4.5)
|
ts-api-utils: 1.3.0(typescript@5.5.2)
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
typescript: 5.4.5
|
typescript: 5.5.2
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
|
@ -16336,16 +16325,16 @@ snapshots:
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
'@typescript-eslint/parser@7.7.1(eslint@8.57.0)(typescript@5.4.5)':
|
'@typescript-eslint/parser@7.7.1(eslint@8.57.0)(typescript@5.5.2)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@typescript-eslint/scope-manager': 7.7.1
|
'@typescript-eslint/scope-manager': 7.7.1
|
||||||
'@typescript-eslint/types': 7.7.1
|
'@typescript-eslint/types': 7.7.1
|
||||||
'@typescript-eslint/typescript-estree': 7.7.1(typescript@5.4.5)
|
'@typescript-eslint/typescript-estree': 7.7.1(typescript@5.5.2)
|
||||||
'@typescript-eslint/visitor-keys': 7.7.1
|
'@typescript-eslint/visitor-keys': 7.7.1
|
||||||
debug: 4.3.4(supports-color@8.1.1)
|
debug: 4.3.4(supports-color@8.1.1)
|
||||||
eslint: 8.57.0
|
eslint: 8.57.0
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
typescript: 5.4.5
|
typescript: 5.5.2
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
|
@ -16388,15 +16377,15 @@ snapshots:
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
'@typescript-eslint/type-utils@7.7.1(eslint@8.57.0)(typescript@5.4.5)':
|
'@typescript-eslint/type-utils@7.7.1(eslint@8.57.0)(typescript@5.5.2)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@typescript-eslint/typescript-estree': 7.7.1(typescript@5.4.5)
|
'@typescript-eslint/typescript-estree': 7.7.1(typescript@5.5.2)
|
||||||
'@typescript-eslint/utils': 7.7.1(eslint@8.57.0)(typescript@5.4.5)
|
'@typescript-eslint/utils': 7.7.1(eslint@8.57.0)(typescript@5.5.2)
|
||||||
debug: 4.3.4(supports-color@8.1.1)
|
debug: 4.3.4(supports-color@8.1.1)
|
||||||
eslint: 8.57.0
|
eslint: 8.57.0
|
||||||
ts-api-utils: 1.3.0(typescript@5.4.5)
|
ts-api-utils: 1.3.0(typescript@5.5.2)
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
typescript: 5.4.5
|
typescript: 5.5.2
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
|
@ -16435,7 +16424,7 @@ snapshots:
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
'@typescript-eslint/typescript-estree@7.7.1(typescript@5.4.5)':
|
'@typescript-eslint/typescript-estree@7.7.1(typescript@5.5.2)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@typescript-eslint/types': 7.7.1
|
'@typescript-eslint/types': 7.7.1
|
||||||
'@typescript-eslint/visitor-keys': 7.7.1
|
'@typescript-eslint/visitor-keys': 7.7.1
|
||||||
|
@ -16444,9 +16433,9 @@ snapshots:
|
||||||
is-glob: 4.0.3
|
is-glob: 4.0.3
|
||||||
minimatch: 9.0.4
|
minimatch: 9.0.4
|
||||||
semver: 7.6.0
|
semver: 7.6.0
|
||||||
ts-api-utils: 1.3.0(typescript@5.4.5)
|
ts-api-utils: 1.3.0(typescript@5.5.2)
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
typescript: 5.4.5
|
typescript: 5.5.2
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
|
@ -16478,14 +16467,14 @@ snapshots:
|
||||||
- supports-color
|
- supports-color
|
||||||
- typescript
|
- typescript
|
||||||
|
|
||||||
'@typescript-eslint/utils@7.7.1(eslint@8.57.0)(typescript@5.4.5)':
|
'@typescript-eslint/utils@7.7.1(eslint@8.57.0)(typescript@5.5.2)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0)
|
'@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0)
|
||||||
'@types/json-schema': 7.0.15
|
'@types/json-schema': 7.0.15
|
||||||
'@types/semver': 7.5.8
|
'@types/semver': 7.5.8
|
||||||
'@typescript-eslint/scope-manager': 7.7.1
|
'@typescript-eslint/scope-manager': 7.7.1
|
||||||
'@typescript-eslint/types': 7.7.1
|
'@typescript-eslint/types': 7.7.1
|
||||||
'@typescript-eslint/typescript-estree': 7.7.1(typescript@5.4.5)
|
'@typescript-eslint/typescript-estree': 7.7.1(typescript@5.5.2)
|
||||||
eslint: 8.57.0
|
eslint: 8.57.0
|
||||||
semver: 7.6.0
|
semver: 7.6.0
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
|
@ -16509,10 +16498,10 @@ snapshots:
|
||||||
|
|
||||||
'@ungap/structured-clone@1.2.0': {}
|
'@ungap/structured-clone@1.2.0': {}
|
||||||
|
|
||||||
'@vitejs/plugin-vue@5.0.4(vite@5.2.11(@types/node@20.12.7)(sass@1.76.0)(terser@5.30.3))(vue@3.4.26(typescript@5.4.5))':
|
'@vitejs/plugin-vue@5.0.4(vite@5.2.11(@types/node@20.12.7)(sass@1.76.0)(terser@5.30.3))(vue@3.4.26(typescript@5.5.2))':
|
||||||
dependencies:
|
dependencies:
|
||||||
vite: 5.2.11(@types/node@20.12.7)(sass@1.76.0)(terser@5.30.3)
|
vite: 5.2.11(@types/node@20.12.7)(sass@1.76.0)(terser@5.30.3)
|
||||||
vue: 3.4.26(typescript@5.4.5)
|
vue: 3.4.26(typescript@5.5.2)
|
||||||
|
|
||||||
'@vitest/coverage-v8@0.34.6(vitest@0.34.6(happy-dom@10.0.3)(jsdom@24.0.0(bufferutil@4.0.7)(canvas@2.11.2(encoding@0.1.13))(utf-8-validate@6.0.3))(sass@1.76.0)(terser@5.30.3))':
|
'@vitest/coverage-v8@0.34.6(vitest@0.34.6(happy-dom@10.0.3)(jsdom@24.0.0(bufferutil@4.0.7)(canvas@2.11.2(encoding@0.1.13))(utf-8-validate@6.0.3))(sass@1.76.0)(terser@5.30.3))':
|
||||||
dependencies:
|
dependencies:
|
||||||
|
@ -16658,7 +16647,7 @@ snapshots:
|
||||||
|
|
||||||
'@vue/devtools-api@6.6.1': {}
|
'@vue/devtools-api@6.6.1': {}
|
||||||
|
|
||||||
'@vue/language-core@2.0.16(typescript@5.4.5)':
|
'@vue/language-core@2.0.16(typescript@5.5.2)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@volar/language-core': 2.2.0
|
'@volar/language-core': 2.2.0
|
||||||
'@vue/compiler-dom': 3.4.25
|
'@vue/compiler-dom': 3.4.25
|
||||||
|
@ -16668,7 +16657,7 @@ snapshots:
|
||||||
path-browserify: 1.0.1
|
path-browserify: 1.0.1
|
||||||
vue-template-compiler: 2.7.14
|
vue-template-compiler: 2.7.14
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
typescript: 5.4.5
|
typescript: 5.5.2
|
||||||
|
|
||||||
'@vue/reactivity@3.4.26':
|
'@vue/reactivity@3.4.26':
|
||||||
dependencies:
|
dependencies:
|
||||||
|
@ -16685,11 +16674,11 @@ snapshots:
|
||||||
'@vue/shared': 3.4.26
|
'@vue/shared': 3.4.26
|
||||||
csstype: 3.1.3
|
csstype: 3.1.3
|
||||||
|
|
||||||
'@vue/server-renderer@3.4.26(vue@3.4.26(typescript@5.4.5))':
|
'@vue/server-renderer@3.4.26(vue@3.4.26(typescript@5.5.2))':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@vue/compiler-ssr': 3.4.26
|
'@vue/compiler-ssr': 3.4.26
|
||||||
'@vue/shared': 3.4.26
|
'@vue/shared': 3.4.26
|
||||||
vue: 3.4.26(typescript@5.4.5)
|
vue: 3.4.26(typescript@5.5.2)
|
||||||
|
|
||||||
'@vue/shared@3.4.21': {}
|
'@vue/shared@3.4.21': {}
|
||||||
|
|
||||||
|
@ -16697,13 +16686,13 @@ snapshots:
|
||||||
|
|
||||||
'@vue/shared@3.4.26': {}
|
'@vue/shared@3.4.26': {}
|
||||||
|
|
||||||
'@vue/test-utils@2.4.1(@vue/server-renderer@3.4.26(vue@3.4.26(typescript@5.4.5)))(vue@3.4.26(typescript@5.4.5))':
|
'@vue/test-utils@2.4.1(@vue/server-renderer@3.4.26(vue@3.4.26(typescript@5.5.2)))(vue@3.4.26(typescript@5.5.2))':
|
||||||
dependencies:
|
dependencies:
|
||||||
js-beautify: 1.14.9
|
js-beautify: 1.14.9
|
||||||
vue: 3.4.26(typescript@5.4.5)
|
vue: 3.4.26(typescript@5.5.2)
|
||||||
vue-component-type-helpers: 1.8.4
|
vue-component-type-helpers: 1.8.4
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
'@vue/server-renderer': 3.4.26(vue@3.4.26(typescript@5.4.5))
|
'@vue/server-renderer': 3.4.26(vue@3.4.26(typescript@5.5.2))
|
||||||
|
|
||||||
'@webgpu/types@0.1.30': {}
|
'@webgpu/types@0.1.30': {}
|
||||||
|
|
||||||
|
@ -18492,11 +18481,11 @@ snapshots:
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
eslint-module-utils@2.8.0(@typescript-eslint/parser@7.7.1(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint@8.57.0):
|
eslint-module-utils@2.8.0(@typescript-eslint/parser@7.7.1(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint@8.57.0):
|
||||||
dependencies:
|
dependencies:
|
||||||
debug: 3.2.7(supports-color@8.1.1)
|
debug: 3.2.7(supports-color@8.1.1)
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
'@typescript-eslint/parser': 7.7.1(eslint@8.57.0)(typescript@5.4.5)
|
'@typescript-eslint/parser': 7.7.1(eslint@8.57.0)(typescript@5.5.2)
|
||||||
eslint: 8.57.0
|
eslint: 8.57.0
|
||||||
eslint-import-resolver-node: 0.3.9
|
eslint-import-resolver-node: 0.3.9
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
|
@ -18556,7 +18545,7 @@ snapshots:
|
||||||
- eslint-import-resolver-webpack
|
- eslint-import-resolver-webpack
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.7.1(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0):
|
eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.7.1(eslint@8.57.0)(typescript@5.5.2))(eslint@8.57.0):
|
||||||
dependencies:
|
dependencies:
|
||||||
array-includes: 3.1.7
|
array-includes: 3.1.7
|
||||||
array.prototype.findlastindex: 1.2.3
|
array.prototype.findlastindex: 1.2.3
|
||||||
|
@ -18566,7 +18555,7 @@ snapshots:
|
||||||
doctrine: 2.1.0
|
doctrine: 2.1.0
|
||||||
eslint: 8.57.0
|
eslint: 8.57.0
|
||||||
eslint-import-resolver-node: 0.3.9
|
eslint-import-resolver-node: 0.3.9
|
||||||
eslint-module-utils: 2.8.0(@typescript-eslint/parser@7.7.1(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint@8.57.0)
|
eslint-module-utils: 2.8.0(@typescript-eslint/parser@7.7.1(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint@8.57.0)
|
||||||
hasown: 2.0.0
|
hasown: 2.0.0
|
||||||
is-core-module: 2.13.1
|
is-core-module: 2.13.1
|
||||||
is-glob: 4.0.3
|
is-glob: 4.0.3
|
||||||
|
@ -18577,7 +18566,7 @@ snapshots:
|
||||||
semver: 6.3.1
|
semver: 6.3.1
|
||||||
tsconfig-paths: 3.15.0
|
tsconfig-paths: 3.15.0
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
'@typescript-eslint/parser': 7.7.1(eslint@8.57.0)(typescript@5.4.5)
|
'@typescript-eslint/parser': 7.7.1(eslint@8.57.0)(typescript@5.5.2)
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- eslint-import-resolver-typescript
|
- eslint-import-resolver-typescript
|
||||||
- eslint-import-resolver-webpack
|
- eslint-import-resolver-webpack
|
||||||
|
@ -21222,12 +21211,12 @@ snapshots:
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
msgpackr-extract: 3.0.2
|
msgpackr-extract: 3.0.2
|
||||||
|
|
||||||
msw-storybook-addon@2.0.1(msw@2.2.14(typescript@5.4.5)):
|
msw-storybook-addon@2.0.1(msw@2.2.14(typescript@5.5.2)):
|
||||||
dependencies:
|
dependencies:
|
||||||
is-node-process: 1.2.0
|
is-node-process: 1.2.0
|
||||||
msw: 2.2.14(typescript@5.4.5)
|
msw: 2.2.14(typescript@5.5.2)
|
||||||
|
|
||||||
msw@2.2.14(typescript@5.4.5):
|
msw@2.2.14(typescript@5.5.2):
|
||||||
dependencies:
|
dependencies:
|
||||||
'@bundled-es-modules/cookie': 2.0.0
|
'@bundled-es-modules/cookie': 2.0.0
|
||||||
'@bundled-es-modules/statuses': 1.0.1
|
'@bundled-es-modules/statuses': 1.0.1
|
||||||
|
@ -21247,7 +21236,7 @@ snapshots:
|
||||||
type-fest: 4.9.0
|
type-fest: 4.9.0
|
||||||
yargs: 17.7.2
|
yargs: 17.7.2
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
typescript: 5.4.5
|
typescript: 5.5.2
|
||||||
|
|
||||||
muggle-string@0.4.1: {}
|
muggle-string@0.4.1: {}
|
||||||
|
|
||||||
|
@ -22364,9 +22353,9 @@ snapshots:
|
||||||
react: 18.3.1
|
react: 18.3.1
|
||||||
react-dom: 18.3.1(react@18.3.1)
|
react-dom: 18.3.1(react@18.3.1)
|
||||||
|
|
||||||
react-docgen-typescript@2.2.2(typescript@5.4.5):
|
react-docgen-typescript@2.2.2(typescript@5.5.2):
|
||||||
dependencies:
|
dependencies:
|
||||||
typescript: 5.4.5
|
typescript: 5.5.2
|
||||||
|
|
||||||
react-docgen@7.0.1:
|
react-docgen@7.0.1:
|
||||||
dependencies:
|
dependencies:
|
||||||
|
@ -23495,9 +23484,9 @@ snapshots:
|
||||||
dependencies:
|
dependencies:
|
||||||
typescript: 5.3.3
|
typescript: 5.3.3
|
||||||
|
|
||||||
ts-api-utils@1.3.0(typescript@5.4.5):
|
ts-api-utils@1.3.0(typescript@5.5.2):
|
||||||
dependencies:
|
dependencies:
|
||||||
typescript: 5.4.5
|
typescript: 5.5.2
|
||||||
|
|
||||||
ts-case-convert@2.0.2: {}
|
ts-case-convert@2.0.2: {}
|
||||||
|
|
||||||
|
@ -23637,7 +23626,7 @@ snapshots:
|
||||||
|
|
||||||
typescript@5.4.2: {}
|
typescript@5.4.2: {}
|
||||||
|
|
||||||
typescript@5.4.5: {}
|
typescript@5.5.2: {}
|
||||||
|
|
||||||
ufo@1.3.2: {}
|
ufo@1.3.2: {}
|
||||||
|
|
||||||
|
@ -23784,14 +23773,14 @@ snapshots:
|
||||||
|
|
||||||
uuid@9.0.1: {}
|
uuid@9.0.1: {}
|
||||||
|
|
||||||
v-code-diff@1.11.0(vue@3.4.26(typescript@5.4.5)):
|
v-code-diff@1.11.0(vue@3.4.26(typescript@5.5.2)):
|
||||||
dependencies:
|
dependencies:
|
||||||
diff: 5.1.0
|
diff: 5.1.0
|
||||||
diff-match-patch: 1.0.5
|
diff-match-patch: 1.0.5
|
||||||
highlight.js: 11.9.0
|
highlight.js: 11.9.0
|
||||||
vue: 3.4.26(typescript@5.4.5)
|
vue: 3.4.26(typescript@5.5.2)
|
||||||
vue-demi: 0.14.7(vue@3.4.26(typescript@5.4.5))
|
vue-demi: 0.14.7(vue@3.4.26(typescript@5.5.2))
|
||||||
vue-i18n: 9.13.1(vue@3.4.26(typescript@5.4.5))
|
vue-i18n: 9.13.1(vue@3.4.26(typescript@5.5.2))
|
||||||
|
|
||||||
v8-to-istanbul@9.2.0:
|
v8-to-istanbul@9.2.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
|
@ -23924,14 +23913,14 @@ snapshots:
|
||||||
dependencies:
|
dependencies:
|
||||||
vscode-languageserver-protocol: 3.17.5
|
vscode-languageserver-protocol: 3.17.5
|
||||||
|
|
||||||
vue-component-meta@2.0.16(typescript@5.4.5):
|
vue-component-meta@2.0.16(typescript@5.5.2):
|
||||||
dependencies:
|
dependencies:
|
||||||
'@volar/typescript': 2.2.0
|
'@volar/typescript': 2.2.0
|
||||||
'@vue/language-core': 2.0.16(typescript@5.4.5)
|
'@vue/language-core': 2.0.16(typescript@5.5.2)
|
||||||
path-browserify: 1.0.1
|
path-browserify: 1.0.1
|
||||||
vue-component-type-helpers: 2.0.16
|
vue-component-type-helpers: 2.0.16
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
typescript: 5.4.5
|
typescript: 5.5.2
|
||||||
|
|
||||||
vue-component-type-helpers@1.8.4: {}
|
vue-component-type-helpers@1.8.4: {}
|
||||||
|
|
||||||
|
@ -23939,11 +23928,11 @@ snapshots:
|
||||||
|
|
||||||
vue-component-type-helpers@2.0.21: {}
|
vue-component-type-helpers@2.0.21: {}
|
||||||
|
|
||||||
vue-demi@0.14.7(vue@3.4.26(typescript@5.4.5)):
|
vue-demi@0.14.7(vue@3.4.26(typescript@5.5.2)):
|
||||||
dependencies:
|
dependencies:
|
||||||
vue: 3.4.26(typescript@5.4.5)
|
vue: 3.4.26(typescript@5.5.2)
|
||||||
|
|
||||||
vue-docgen-api@4.75.1(vue@3.4.26(typescript@5.4.5)):
|
vue-docgen-api@4.75.1(vue@3.4.26(typescript@5.5.2)):
|
||||||
dependencies:
|
dependencies:
|
||||||
'@babel/parser': 7.24.0
|
'@babel/parser': 7.24.0
|
||||||
'@babel/types': 7.24.0
|
'@babel/types': 7.24.0
|
||||||
|
@ -23955,8 +23944,8 @@ snapshots:
|
||||||
pug: 3.0.2
|
pug: 3.0.2
|
||||||
recast: 0.23.4
|
recast: 0.23.4
|
||||||
ts-map: 1.0.3
|
ts-map: 1.0.3
|
||||||
vue: 3.4.26(typescript@5.4.5)
|
vue: 3.4.26(typescript@5.5.2)
|
||||||
vue-inbrowser-compiler-independent-utils: 4.71.1(vue@3.4.26(typescript@5.4.5))
|
vue-inbrowser-compiler-independent-utils: 4.71.1(vue@3.4.26(typescript@5.5.2))
|
||||||
|
|
||||||
vue-eslint-parser@9.4.2(eslint@8.57.0):
|
vue-eslint-parser@9.4.2(eslint@8.57.0):
|
||||||
dependencies:
|
dependencies:
|
||||||
|
@ -23971,43 +23960,43 @@ snapshots:
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
vue-i18n@9.13.1(vue@3.4.26(typescript@5.4.5)):
|
vue-i18n@9.13.1(vue@3.4.26(typescript@5.5.2)):
|
||||||
dependencies:
|
dependencies:
|
||||||
'@intlify/core-base': 9.13.1
|
'@intlify/core-base': 9.13.1
|
||||||
'@intlify/shared': 9.13.1
|
'@intlify/shared': 9.13.1
|
||||||
'@vue/devtools-api': 6.6.1
|
'@vue/devtools-api': 6.6.1
|
||||||
vue: 3.4.26(typescript@5.4.5)
|
vue: 3.4.26(typescript@5.5.2)
|
||||||
|
|
||||||
vue-inbrowser-compiler-independent-utils@4.71.1(vue@3.4.26(typescript@5.4.5)):
|
vue-inbrowser-compiler-independent-utils@4.71.1(vue@3.4.26(typescript@5.5.2)):
|
||||||
dependencies:
|
dependencies:
|
||||||
vue: 3.4.26(typescript@5.4.5)
|
vue: 3.4.26(typescript@5.5.2)
|
||||||
|
|
||||||
vue-template-compiler@2.7.14:
|
vue-template-compiler@2.7.14:
|
||||||
dependencies:
|
dependencies:
|
||||||
de-indent: 1.0.2
|
de-indent: 1.0.2
|
||||||
he: 1.2.0
|
he: 1.2.0
|
||||||
|
|
||||||
vue-tsc@2.0.16(typescript@5.4.5):
|
vue-tsc@2.0.16(typescript@5.5.2):
|
||||||
dependencies:
|
dependencies:
|
||||||
'@volar/typescript': 2.2.0
|
'@volar/typescript': 2.2.0
|
||||||
'@vue/language-core': 2.0.16(typescript@5.4.5)
|
'@vue/language-core': 2.0.16(typescript@5.5.2)
|
||||||
semver: 7.6.0
|
semver: 7.6.0
|
||||||
typescript: 5.4.5
|
typescript: 5.5.2
|
||||||
|
|
||||||
vue@3.4.26(typescript@5.4.5):
|
vue@3.4.26(typescript@5.5.2):
|
||||||
dependencies:
|
dependencies:
|
||||||
'@vue/compiler-dom': 3.4.26
|
'@vue/compiler-dom': 3.4.26
|
||||||
'@vue/compiler-sfc': 3.4.26
|
'@vue/compiler-sfc': 3.4.26
|
||||||
'@vue/runtime-dom': 3.4.26
|
'@vue/runtime-dom': 3.4.26
|
||||||
'@vue/server-renderer': 3.4.26(vue@3.4.26(typescript@5.4.5))
|
'@vue/server-renderer': 3.4.26(vue@3.4.26(typescript@5.5.2))
|
||||||
'@vue/shared': 3.4.26
|
'@vue/shared': 3.4.26
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
typescript: 5.4.5
|
typescript: 5.5.2
|
||||||
|
|
||||||
vuedraggable@4.1.0(vue@3.4.26(typescript@5.4.5)):
|
vuedraggable@4.1.0(vue@3.4.26(typescript@5.5.2)):
|
||||||
dependencies:
|
dependencies:
|
||||||
sortablejs: 1.14.0
|
sortablejs: 1.14.0
|
||||||
vue: 3.4.26(typescript@5.4.5)
|
vue: 3.4.26(typescript@5.5.2)
|
||||||
|
|
||||||
w3c-xmlserializer@5.0.0:
|
w3c-xmlserializer@5.0.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
|
|
Loading…
Reference in New Issue