mirror of
https://github.com/kokonect-link/cherrypick
synced 2024-11-23 14:46:44 +09:00
Merge remote-branch 'misskey/develop'
This commit is contained in:
commit
85a2643b25
10
CHANGELOG.md
10
CHANGELOG.md
@ -15,12 +15,13 @@
|
||||
## 13.x.x (unreleased)
|
||||
|
||||
### General
|
||||
- identicon生成を無効にしてパフォーマンスを向上させることができるようになりました
|
||||
- サーバーのマシン情報の公開を無効にしてパフォーマンスを向上させることができるようになりました
|
||||
- 招待機能を改善しました
|
||||
* 過去に発行した招待コードを確認できるようになりました
|
||||
* ロールごとに招待コードの発行数制限と制限対象期間、有効期限を設定できるようになりました
|
||||
* 招待コードを作成したユーザーと使用したユーザーを確認できるようになりました
|
||||
- ユーザーにロールが期限付きでアサインされている場合、その期限をユーザーのモデレーションページで確認できるようになりました
|
||||
- identicon生成を無効にしてパフォーマンスを向上させることができるようになりました
|
||||
- サーバーのマシン情報の公開を無効にしてパフォーマンスを向上させることができるようになりました
|
||||
|
||||
### Client
|
||||
- deck UIのカラムのメニューからアンテナとリストの編集画面を開けるように
|
||||
@ -36,9 +37,12 @@
|
||||
- フォローやお気に入り登録をしていないチャンネルを開く時は概要ページを開くように
|
||||
- 画面ビューワをタップした場合、マウスクリックと同様に画像ビューワを閉じるように
|
||||
- オフライン時の画面にリロードボタンを追加
|
||||
- Renote時に公開範囲のデフォルト設定が適用されるように
|
||||
- Deckで非ルートページにアクセスした際に簡易UIで表示しない設定を追加
|
||||
- ロール設定画面でロールIDを確認できるように
|
||||
- コンテキストメニュー表示時のパフォーマンスを改善
|
||||
- フォロー/フォロワー非公開時の表示を改善
|
||||
- AiScriptを0.15.0に更新
|
||||
- Fix: サーバーメトリクスが90度傾いている
|
||||
- Fix: 非ログイン時にクレデンシャルが必要なページに行くとエラーが出る問題を修正
|
||||
- Fix: sparkle内にリンクを入れるとクリック不能になる問題の修正
|
||||
@ -59,9 +63,11 @@
|
||||
- MeilisearchにIndexするノートの範囲を設定できるように
|
||||
- Export notes with file detail
|
||||
- Add unix socket support
|
||||
- Fix: リモートサーバーに無意味なActivityPubの配信を行うことがあるのを修正
|
||||
- Fix: Remove Meilisearch index when notes are deleted
|
||||
- Fix: 非英語環境でのPostgreSQLのエラーハンドリングを修正
|
||||
- Fix: インスタンスのアイコンがbase64の場合の挙動を修正
|
||||
- Fix: ローカルの `Person` を指す `acct` URI を解析するときのバグを修正しました
|
||||
|
||||
## 13.13.2
|
||||
|
||||
|
@ -54,6 +54,7 @@ describe('After setup instance', () => {
|
||||
cy.get('[data-cy-signup]').click();
|
||||
cy.get('[data-cy-signup-rules-continue]').should('be.disabled');
|
||||
cy.get('[data-cy-signup-rules-notes-agree] [data-cy-switch-toggle]').click();
|
||||
cy.get('[data-cy-modal-dialog-ok]').click();
|
||||
cy.get('[data-cy-signup-rules-continue]').should('not.be.disabled');
|
||||
cy.get('[data-cy-signup-rules-continue]').click();
|
||||
|
||||
@ -78,6 +79,7 @@ describe('After setup instance', () => {
|
||||
cy.get('[data-cy-signup]').click();
|
||||
cy.get('[data-cy-signup-rules-continue]').should('be.disabled');
|
||||
cy.get('[data-cy-signup-rules-notes-agree] [data-cy-switch-toggle]').click();
|
||||
cy.get('[data-cy-modal-dialog-ok]').click();
|
||||
cy.get('[data-cy-signup-rules-continue]').should('not.be.disabled');
|
||||
cy.get('[data-cy-signup-rules-continue]').click();
|
||||
|
||||
|
@ -1105,6 +1105,9 @@ usedAt: "Benutzt am"
|
||||
unused: "Unbenutzt"
|
||||
used: "Benutzt"
|
||||
expired: "Abgelaufen"
|
||||
doYouAgree: "Zustimmen?"
|
||||
beSureToReadThisAsItIsImportant: "Lies bitte diese wichtige Informationen."
|
||||
iHaveReadXCarefullyAndAgree: "Ich habe den Text \"{x}\" gelesen und stimme zu."
|
||||
_initialAccountSetting:
|
||||
accountCreated: "Dein Konto wurde erfolgreich erstellt!"
|
||||
letsStartAccountSetup: "Lass uns nun dein Konto einrichten."
|
||||
@ -2082,6 +2085,7 @@ _deck:
|
||||
introduction: "Erstelle eine auf dich zugeschneiderte Benutzeroberfläche durch das Aneinanderreihen von Spalten!"
|
||||
introduction2: "Klicke auf das + rechts um wann immer du möchtest neue Spalten hinzuzufügen."
|
||||
widgetsIntroduction: "Drücke bitte \"Widgets bearbeiten\" im Spaltenmenü und füge ein Widget hinzu."
|
||||
useSimpleUiForNonRootPages: "Simple Benutzeroberfläche für navigierte Seiten verwenden"
|
||||
_columns:
|
||||
main: "Hauptspalte"
|
||||
widgets: "Widgets"
|
||||
|
@ -1146,6 +1146,9 @@ usedAt: "Used at"
|
||||
unused: "Unused"
|
||||
used: "Used"
|
||||
expired: "Expired"
|
||||
doYouAgree: "Agree?"
|
||||
beSureToReadThisAsItIsImportant: "Please read this important information."
|
||||
iHaveReadXCarefullyAndAgree: "I have read the text \"{x}\" and agree."
|
||||
additionalPermissionsForFlash: "Allow to add permission to Play"
|
||||
thisFlashRequiresTheFollowingPermissions: "This Play requires the following permissions"
|
||||
doYouWantToAllowThisPlayToAccessYourAccount: "Do you want to allow this Play to access your account?"
|
||||
@ -2212,6 +2215,7 @@ _deck:
|
||||
introduction: "Create the perfect interface for you by arranging columns freely!"
|
||||
introduction2: "Click on the + on the right of the screen to add new colums whenever you want."
|
||||
widgetsIntroduction: "Please select \"Edit widgets\" in the column menu and add a widget."
|
||||
useSimpleUiForNonRootPages: "Use simple UI for navigated pages"
|
||||
_columns:
|
||||
main: "Main"
|
||||
widgets: "Widgets"
|
||||
|
3
locales/index.d.ts
vendored
3
locales/index.d.ts
vendored
@ -1149,6 +1149,9 @@ export interface Locale {
|
||||
"unused": string;
|
||||
"used": string;
|
||||
"expired": string;
|
||||
"doYouAgree": string;
|
||||
"beSureToReadThisAsItIsImportant": string;
|
||||
"iHaveReadXCarefullyAndAgree": string;
|
||||
"additionalPermissionsForFlash": string;
|
||||
"thisFlashRequiresTheFollowingPermissions": string;
|
||||
"doYouWantToAllowThisPlayToAccessYourAccount": string;
|
||||
|
@ -791,10 +791,10 @@ info: "Informazioni"
|
||||
userInfo: "Informazioni utente"
|
||||
unknown: "Sconosciuto"
|
||||
onlineStatus: "Stato di connessione"
|
||||
hideOnlineStatus: "Stato invisibile"
|
||||
hideOnlineStatusDescription: "Abilitare l'opzione di stato invisibile può guastare la praticità di singole funzioni, come la ricerca."
|
||||
hideOnlineStatus: "Modalità invisibile"
|
||||
hideOnlineStatusDescription: "Attivando questa opzione potresti ridurre l'usabilità di alcune funzioni, come la ricerca."
|
||||
online: "Online"
|
||||
active: "Attiv@"
|
||||
active: "Attività"
|
||||
offline: "Offline"
|
||||
notRecommended: "Sconsigliato"
|
||||
botProtection: "Protezione contro i bot"
|
||||
@ -868,8 +868,8 @@ makeReactionsPublicDescription: "La lista delle reazioni che avete fatto è a di
|
||||
classic: "Classico"
|
||||
muteThread: "Silenzia la conversazione"
|
||||
unmuteThread: "Riattiva la conversazione"
|
||||
ffVisibility: "Ambito pubblico del collegamento"
|
||||
ffVisibilityDescription: "È possibile impostare la portata pubblica delle informazioni sui propri follower/seguaci."
|
||||
ffVisibility: "Visibilità delle connessioni"
|
||||
ffVisibilityDescription: "Puoi scegliere a chi mostrare le tue relazioni con altri profili nel fediverso."
|
||||
continueThread: "Altri thread."
|
||||
deleteAccountConfirm: "Così verrà eliminato il profilo. Vuoi procedere?"
|
||||
incorrectPassword: "La password è errata."
|
||||
@ -2082,6 +2082,7 @@ _deck:
|
||||
introduction: "Combinate le colonne per creare la vostra interfaccia!"
|
||||
introduction2: "È possibile aggiungere colonne in qualsiasi momento premendo + sulla destra dello schermo."
|
||||
widgetsIntroduction: "Dal menu della colonna, selezionare \"Modifica i riquadri\" per aggiungere un un riquadro con funzionalità"
|
||||
useSimpleUiForNonRootPages: "Visualizza sotto pagine con interfaccia web semplice"
|
||||
_columns:
|
||||
main: "Principale"
|
||||
widgets: "Riquadri"
|
||||
|
@ -1097,7 +1097,7 @@ vertical: "縦"
|
||||
horizontal: "横"
|
||||
position: "位置"
|
||||
serverRules: "サーバールール"
|
||||
pleaseConfirmBelowBeforeSignup: "このサーバーに登録する前に、以下を確認してください。"
|
||||
pleaseConfirmBelowBeforeSignup: "このサーバーに登録するには、以下の内容を確認し同意する必要があります。"
|
||||
pleaseAgreeAllToContinue: "続けるには、全ての「同意する」にチェックが入っている必要があります。"
|
||||
continue: "続ける"
|
||||
preservedUsernames: "予約ユーザー名"
|
||||
@ -1146,6 +1146,9 @@ usedAt: "使用日時"
|
||||
unused: "未使用"
|
||||
used: "使用済み"
|
||||
expired: "期限切れ"
|
||||
doYouAgree: "同意しますか?"
|
||||
beSureToReadThisAsItIsImportant: "重要ですので必ずお読みください。"
|
||||
iHaveReadXCarefullyAndAgree: "「{x}」の内容をよく読み、同意します。"
|
||||
additionalPermissionsForFlash: "Playへの追加許可"
|
||||
thisFlashRequiresTheFollowingPermissions: "このPlayは以下の権限を要求しています"
|
||||
doYouWantToAllowThisPlayToAccessYourAccount: "このPlayによるアカウントへのアクセスを許可しますか?"
|
||||
|
@ -1081,6 +1081,9 @@ branding: "あ"
|
||||
enableServerMachineStats: "サーバーのマシン情報見せびらかすで"
|
||||
enableIdenticonGeneration: "ユーザーごとのIdenticon生成を有効にする"
|
||||
turnOffToImprovePerformance: "オフにしたらえらい軽うなるで。"
|
||||
inviteCodeCreated: "招待コード作ったで"
|
||||
inviteLimitExceeded: "招待コード作りすぎやで。"
|
||||
createLimitRemaining: "作成できる招待コード: 残り {limit} 個やで"
|
||||
unused: "つこてへん"
|
||||
used: "もうつこてる"
|
||||
_initialAccountSetting:
|
||||
|
@ -81,11 +81,15 @@ deleteAndEditConfirm: "이 노트를 삭제한 뒤 다시 편집할까요? 이
|
||||
copyAndEdit: "복사 후 편집"
|
||||
copyAndEditConfirm: "이 노트를 복사하고 편집할까요? 노트에 포함된 미디어도 같이 복사돼요!"
|
||||
addToList: "리스트에 추가"
|
||||
addToAntenna: "안테나에 추가"
|
||||
sendMessage: "메시지 보내기"
|
||||
copyRSS: "RSS 복사"
|
||||
copyUsername: "유저명 복사"
|
||||
copyUserId: "유저 ID 복사"
|
||||
copyNoteId: "노트 ID 복사"
|
||||
copyFileId: "파일 ID 복사"
|
||||
copyFolderId: "폴더 ID 복사"
|
||||
copyProfileUrl: "프로필 URL 복사"
|
||||
searchUser: "사용자 검색"
|
||||
reply: "답글"
|
||||
loadMore: "더 보기"
|
||||
@ -135,8 +139,8 @@ enterEmoji: "이모지 입력"
|
||||
renote: "리노트"
|
||||
unrenote: "리노트 취소"
|
||||
renoted: "리노트 했어요!"
|
||||
cantRenote: "이 게시물은 리노트 할 수 없어요."
|
||||
cantReRenote: "리노트된 노트는 리노트 할 수 없어요."
|
||||
cantRenote: "이 게시물은 리노트할 수 없어요."
|
||||
cantReRenote: "리노트된 노트는 리노트할 수 없어요."
|
||||
quote: "인용"
|
||||
inChannelRenote: "채널 내 리노트"
|
||||
inChannelQuote: "채널 내 인용"
|
||||
@ -184,10 +188,12 @@ addEmoji: "이모지 추가"
|
||||
settingGuide: "추천 설정"
|
||||
cacheRemoteFiles: "리모트 파일을 캐시"
|
||||
cacheRemoteFilesDescription: "이 설정을 해지하면 리모트 파일을 캐시하지 않고 해당 파일을 직접 링크해요. 그에 따라 서버의 저장 공간을 절약할 수 있지만, 썸네일이 생성되지 않기 때문에 통신량이 증가하게 돼요."
|
||||
cacheRemoteSensitiveFiles: "리모트의 민감한 파일을 캐시"
|
||||
cacheRemoteSensitiveFilesDescription: "이 설정을 비활성화하면 리모트의 민감한 파일은 캐시하지 않고 리모트에서 직접 가져오도록 설정해요."
|
||||
flagAsBot: "삐릭, 삐리리릭? 저는 봇입니다."
|
||||
flagAsBotDescription: "이 계정을 자동화된 수단으로 운용할 경우에 활성화해 주세요. 이 플래그를 활성화하면, 다른 봇이 이를 참고하여 봇 끼리의 무한 연쇄 반응을 회피하거나, 이 계정의 시스템 상에서의 취급이 봇 운영에 최적화되는 등의 변화가 생겨요"
|
||||
flagAsCat: "나는 고양이다냥"
|
||||
flagAsCatDescription: "이 계정이 고양이라면 활성화 해달라냥"
|
||||
flagAsCatDescription: "이 계정이 고양이라면 활성화해 달라냥"
|
||||
flagShowTimelineReplies: "타임라인에 노트의 답글을 표시하기"
|
||||
flagShowTimelineRepliesDescription: "이 설정을 활성화하면 타임라인에 다른 유저 간의 답글을 표시해요."
|
||||
autoAcceptFollowed: "팔로우 중인 유저로부터의 팔로우 요청을 자동 수락"
|
||||
@ -345,6 +351,7 @@ copyUrl: "URL 복사"
|
||||
rename: "이름 변경"
|
||||
avatar: "아바타"
|
||||
banner: "배너"
|
||||
displayOfSensitiveMedia: "민감한 미디어 표시"
|
||||
whenServerDisconnected: "서버와의 접속이 끊겼을 때"
|
||||
disconnectedFromServer: "접속이 끊어졌어요!"
|
||||
reload: "새로고침"
|
||||
@ -1122,6 +1129,24 @@ installed: "설치됨"
|
||||
branding: "브랜딩"
|
||||
enableServerMachineStats: "서버의 머신 사양을 공개하기"
|
||||
enableIdenticonGeneration: "유저마다 Identicon 생성 유효화"
|
||||
turnOffToImprovePerformance: "이 기능을 끄면 성능이 향상될 수 있어요."
|
||||
createInviteCode: "초대 코드 생성"
|
||||
createWithOptions: "옵션을 지정하여 생성"
|
||||
createCount: "초대 수"
|
||||
inviteCodeCreated: "초대 코드 생성됨"
|
||||
inviteLimitExceeded: "초대 코드의 생성 한도를 초과했어요."
|
||||
createLimitRemaining: "초대 한도: {limit}회 남음"
|
||||
inviteLimitResetCycle: " {time}시간 이내에 최대 {limit}개의 초대 코드를 생성할 수 있어요."
|
||||
expirationDate: "만료 날짜"
|
||||
noExpirationDate: "만료기간 없음"
|
||||
inviteCodeUsedAt: "다음에 사용된 초대 코드"
|
||||
registeredUserUsingInviteCode: "초대 코드 사용 대상"
|
||||
waitingForMailAuth: "이메일 인증 보류 중"
|
||||
inviteCodeCreator: "초대 코드 생성자"
|
||||
usedAt: "사용 시각"
|
||||
unused: "사용되지 않음"
|
||||
used: "사용됨"
|
||||
expired: "만료됨"
|
||||
additionalPermissionsForFlash: "Play에 대한 추가 권한"
|
||||
thisFlashRequiresTheFollowingPermissions: "이 Play는 다음 권한을 요구해요"
|
||||
doYouWantToAllowThisPlayToAccessYourAccount: "이 Play가 계정에 접근하도록 허용할까요?"
|
||||
@ -1496,6 +1521,9 @@ _role:
|
||||
ctlAvailable: "고양이 타임라인 보이기"
|
||||
canPublicNote: "공개 노트 허용"
|
||||
canInvite: "서버 초대 코드 발행"
|
||||
inviteLimit: "초대 한도"
|
||||
inviteLimitCycle: "초대 발급 간격"
|
||||
inviteExpirationTime: "초대 만료 기간"
|
||||
canManageCustomEmojis: "커스텀 이모지 관리"
|
||||
driveCapacity: "드라이브 용량"
|
||||
alwaysMarkNsfw: "파일을 항상 NSFW로 지정"
|
||||
@ -1562,6 +1590,7 @@ _ad:
|
||||
back: "뒤로"
|
||||
reduceFrequencyOfThisAd: "이 광고의 표시 빈도 낮추기"
|
||||
hide: "보이지 않음"
|
||||
timezoneinfo: "요일은 서버의 표준 시간대에 따라 결정됩니다."
|
||||
_forgotPassword:
|
||||
enterEmail: "여기에 계정에 등록한 메일 주소를 입력해 주세요. 입력한 메일 주소로 비밀번호를 재설정할 수 있는 링크를 보내드릴 거예요."
|
||||
ifNoEmail: "만약 메일 주소를 등록하지 않았다면 관리자에게 문의해 주세요."
|
||||
@ -1622,6 +1651,10 @@ _aboutMisskey:
|
||||
donate: "CherryPick에 기부하기"
|
||||
relayServer: "릴레이 서버"
|
||||
community: "커뮤니티"
|
||||
_displayOfSensitiveMedia:
|
||||
respect: "민감한 콘텐츠로 표시된 미디어 숨기기"
|
||||
ignore: "민감한 콘텐츠로 표시된 미디어 보이기"
|
||||
force: "미디어 항상 숨기기"
|
||||
_mfm:
|
||||
cheatSheet: "MFM 도움말"
|
||||
intro: "MFM는 Misskey 기반 클라이언트의 다양한 곳에서 사용할 수 있는 전용 마크업 언어에요. 여기에서 MFM에서 사용할 수 있는 구문을 확인할 수 있어요."
|
||||
@ -2180,6 +2213,7 @@ _deck:
|
||||
introduction: "칼럼을 조합해서 나만의 인터페이스를 구성해 보세요!"
|
||||
introduction2: "언제든지 화면 우측의 + 버튼을 눌러 새 칼럼을 추가할 수 있어요."
|
||||
widgetsIntroduction: "칼럼 메뉴의 \"위젯 편집\"에서 위젯을 추가해 주세요"
|
||||
useSimpleUiForNonRootPages: "루트 이외의 페이지로 접속한 경우 UI 간략화하기"
|
||||
_columns:
|
||||
main: "메인"
|
||||
widgets: "위젯"
|
||||
|
@ -20,6 +20,7 @@ noNotes: "ບໍ່ມີຫມາຍເຫດ"
|
||||
noNotifications: "ບໍ່ມີການແຈ້ງເຕືອນ"
|
||||
instance: "ອີນສະແຕນ"
|
||||
settings: "ກຳນົດຄ່າ"
|
||||
notificationSettings: "ຕັ້ງຄ່າການແຈ້ງເຕືອນ"
|
||||
basicSettings: "ການຕັ້ງຄ່າພື້ນຖານ"
|
||||
otherSettings: "ການຕັ້ງຄ່າອື່ນໆ"
|
||||
openInWindow: "ເປີດຢູ່ໃນປ່ອງຢ້ຽມ"
|
||||
@ -48,9 +49,15 @@ delete: "ລຶບ"
|
||||
deleteAndEdit: "ລົບແລະແກ້ໄຂ"
|
||||
deleteAndEditConfirm: "ເຈົ້າແນ່ໃຈບໍ່? ທີ່ທ່ານຕ້ອງການທີ່ຈະລຶບບັນທຶກນີ້ແລະແກ້ໄຂມັນ ທ່ານອາດຈະສູນເສຍການໂຕ້ຕອບ, ບັນທຶກ, ແລະການຕອບກັບທັງໝົດ"
|
||||
addToList: "ເພີ່ມໃສ່ລາຍຊື່"
|
||||
addToAntenna: "ເພີ່ມໃສ່ເສົາອາກາດ"
|
||||
sendMessage: "ສົ່ງຂໍ້ຄວາມ"
|
||||
copyRSS: "ສຳເນົາ RSS"
|
||||
copyUsername: "ສຳເນົາຊື່ຜູ້ໃຊ້"
|
||||
copyUserId: "ສຳເນົາ ID ຜູ້ໃຊ້"
|
||||
copyNoteId: "ສຳເນົາ ID ບັນທຶກ"
|
||||
copyFileId: "ສຳເນົາ ID ໄຟລ໌"
|
||||
copyFolderId: "ສຳເນົາ ID ໂຟນເດີ"
|
||||
copyProfileUrl: "ສຳເນົາ URL ໂປຣໄຟລ໌"
|
||||
searchUser: "ຄົ້ນຫາຜູ້ໃຊ້"
|
||||
reply: "ຕອບໄປທີ"
|
||||
loadMore: "ໂຫຼດເພີ່ມເຕີມ"
|
||||
@ -109,6 +116,7 @@ sensitive: "NSFW"
|
||||
add: "ເພີ່ມ"
|
||||
reaction: "ປະຕິກິລິຍາ"
|
||||
reactions: "ປະຕິກິລິຍາ"
|
||||
attachCancel: "ເອົາໄຟລ໌ແນບ"
|
||||
mute: "ປີດສຽງ"
|
||||
unmute: "ເປີດສຽງ"
|
||||
block: "ບ໋ອກ"
|
||||
@ -116,6 +124,10 @@ unblock: "ຍົກເລີກກາຮົບລັອກ"
|
||||
suspend: "ລະງັບ"
|
||||
unsuspend: "ເຊົາລະງັບ"
|
||||
selectList: "ເລືອກບັນຊີລາຍການ"
|
||||
editList: "ແກ້ໄຂລາຍຊື່"
|
||||
selectChannel: "ເລືອກຊ່ອງ"
|
||||
selectAntenna: "ເລືອກເສົາອາກາດ"
|
||||
editAntenna: "ແກ້ໄຂເສົາອາກາດ"
|
||||
selectWidget: "ເລືອກວິກເຈັດ"
|
||||
editWidgets: "ແກ້ໄຂ Widget"
|
||||
editWidgetsExit: "ສຳເລັດແລ້ວ"
|
||||
@ -125,6 +137,7 @@ emojis: "ອີໂມຈິ"
|
||||
emojiName: "ຊື່ Emoji"
|
||||
emojiUrl: "URL ອີໂມຈິ"
|
||||
addEmoji: "ຕື່ມອີໂມຈິ"
|
||||
settingGuide: "ການຕັ້ງຄ່າທີ່ແນະນໍາ"
|
||||
flagAsBot: "ໝາຍບັນຊີນີ້ເປັນບັອດ"
|
||||
flagAsCat: "ໝາຍບັນຊີນີ້ເປັນແມວ"
|
||||
flagAsCatDescription: "ເປີດໃຊ້ຕົວເລືອກນີ້ເພື່ອໝາຍບັນຊີນີ້ເປັນແມວ"
|
||||
@ -133,10 +146,13 @@ flagShowTimelineRepliesDescription: "ສະແດງການຕອບກັບ
|
||||
autoAcceptFollowed: "ອະນຸມັດອັດຕະໂນມັດຕາມຄຳຮ້ອງຂໍຈາກຜູ້ໃຊ້ທີ່ທ່ານກຳລັງຕິດຕາມຢູ່"
|
||||
addAccount: "ເພີ່ມບັນຊີ"
|
||||
loginFailed: "ການເຂົ້າສູ່ລະບົບບໍ່ສຳເລັດ"
|
||||
showOnRemote: "ເບິ່ງຢູ່ໃນຕົວຢ່າງໄລຍະໄກ"
|
||||
general: "ທົ່ວໄປ"
|
||||
wallpaper: "ພາບພື້ນຫລັງ"
|
||||
setWallpaper: "ຕັ້ງເປັນພາບພື້ນຫຼັງ"
|
||||
removeWallpaper: "ລຶບຮູບວໍເປເປີອອກ"
|
||||
searchWith: "ຊອກຫາ: {q}"
|
||||
youHaveNoLists: "ທ່ານບໍ່ມີລາຍການໃດໆ"
|
||||
proxyAccount: "ບັນຊີພຣັອກຊີ"
|
||||
host: "ໂຮດສ"
|
||||
selectUser: "ເລືອກຜູ້ໃຊ້"
|
||||
@ -155,7 +171,9 @@ operations: "ການດຳເນີນງານ"
|
||||
software: "ຊອບແວ"
|
||||
version: "ສະບັບ"
|
||||
metadata: "Metadata"
|
||||
withNFiles: "{n} ໄຟລ໌(s)"
|
||||
monitor: "ຈໍພາບ"
|
||||
jobQueue: "ຄິວວຽກ"
|
||||
cpuAndMemory: "CPU ແລະ ຫນ່ວຍຄວາມຈໍາ"
|
||||
network: "ເຄືອຂ່າຍ"
|
||||
disk: "ດິສກ໌"
|
||||
@ -343,6 +361,7 @@ _widgets:
|
||||
timeline: "ເສັ້ນກຳນົດເວລາ"
|
||||
activity: "ກິດຈະກຳ"
|
||||
federation: "ສະຫະພັນ"
|
||||
jobQueue: "ຄິວວຽກ"
|
||||
_userList:
|
||||
chooseList: "ເລືອກບັນຊີລາຍການ"
|
||||
_cw:
|
||||
|
@ -481,6 +481,7 @@ windowMinimize: "Minimera"
|
||||
windowRestore: "Återställ"
|
||||
pleaseDonate: "CherryPick är en gratis programvara som används på {host}. Donera gärna för att göra utvecklingen ständigt, tack!"
|
||||
resetPasswordConfirm: "Återställ verkligen ditt lösenord?"
|
||||
dataSaver: "Databesparing"
|
||||
_achievements:
|
||||
_types:
|
||||
_open3windows:
|
||||
|
@ -1,7 +1,7 @@
|
||||
---
|
||||
_lang_: "ภาษาไทย"
|
||||
headlineMisskey: "เชื่อมต่อเครือข่ายโดยโน้ต"
|
||||
introMisskey: "ยินดีต้อนรับจ้าาา! CherryPick เป็นบริการไมโครบล็อกโอเพ่นซอร์ส แบบการกระจายอำนาจ\nสร้าง \"โน้ต\" เพื่อแบ่งปันความคิดของคุณกับทุกคนรอบตัวคุณกันเถอะ 📡\nด้วยการ \"รีแอคชั่นผู้คน\" คุณยังสามารถแสดงความรู้สึกของคุณเกี่ยวกับบันทึกของทุกคนได้อย่างรวดเร็ว 👍\n\nแล้วมาท่องสำรวจโลกใบใหม่กันเถอะ! 🚀"
|
||||
headlineMisskey: "เชื่อมต่อระบบ Network ด้วย Note"
|
||||
introMisskey: "ยินดีต้อนรับทุกคนจ้า! CherryPick คือ บริการไมโครบล็อกกิ้ง (MicroBlogging) แบบกระจายศูนย์อำนาจ (Decentralized) \n\nเขียน \"โน้ต (Note)\" เพื่อส่งต่อเรื่องราวของคุณให้ทั้งโลกได้รับรู้📡\nและอย่าลืมที่จะ \"React\" กับเรื่องราวของคนอื่น ๆ ด้วย! 👍\n\nมุ่งสู่โลกใบใหม่กันเถอะ🚀"
|
||||
poweredByMisskeyDescription: "{name} เป็นส่วนหนึ่งในบริการที่ถูกขับเคลื่อนโดยแพลตฟอร์มโอเพ่นซอร์ส <b>CherryPick</b> (เรียกว่า \"อินสแตนซ์ CherryPick\")"
|
||||
monthAndDay: "{month}/{day}"
|
||||
search: "ค้นหา"
|
||||
@ -339,7 +339,7 @@ thisYear: "ปีนี้"
|
||||
thisMonth: "เดือนนี้"
|
||||
today: "วันนี้"
|
||||
dayX: "{day}"
|
||||
monthX: "{เดือน}"
|
||||
monthX: "เดือน {month}"
|
||||
yearX: "{year}"
|
||||
pages: "หน้า"
|
||||
integration: "รวบรวม"
|
||||
@ -2082,6 +2082,7 @@ _deck:
|
||||
introduction: "สร้างอินเทอร์เฟซที่สมบูรณ์แบบสำหรับคุณโดยจัดเรียงคอลัมน์ได้อย่างอิสระ!"
|
||||
introduction2: "คลิกที่เครื่องหมาย + ทางขวาของหน้าจอเพื่อเพิ่มคอลัมน์ใหม่ทุกครั้งที่คุณต้องการ"
|
||||
widgetsIntroduction: "กรุณาเลือก \"แก้ไขวิดเจ็ต\" ในเมนูคอลัมน์และเพิ่มวิดเจ็ต"
|
||||
useSimpleUiForNonRootPages: "แสดง UI ของ Root Page อย่างง่าย "
|
||||
_columns:
|
||||
main: "หลัก"
|
||||
widgets: "วิดเจ็ต"
|
||||
|
@ -156,6 +156,8 @@ addEmoji: "添加表情符号"
|
||||
settingGuide: "推荐配置"
|
||||
cacheRemoteFiles: "缓存远程文件"
|
||||
cacheRemoteFilesDescription: "当禁用此设定时远程文件将直接从远程服务器载入。禁用后会减小储存空间需求,但是会增加流量,因为缩略图不会被生成。"
|
||||
cacheRemoteSensitiveFiles: "缓存远程敏感媒体文件"
|
||||
cacheRemoteSensitiveFilesDescription: "如果禁用这项设定,远程服务器的敏感媒体将不会被缓存,而是直接链接。"
|
||||
flagAsBot: "这是一个机器人账号"
|
||||
flagAsBotDescription: "如果此账户由程序控制,请启用此项。启用后,此标志可以帮助其他开发人员防止机器人之间产生无限互动的行为,并让 CherryPick 的内部系统将此账户识别为机器人。"
|
||||
flagAsCat: "将这个账户设定为一只猫"
|
||||
@ -1086,7 +1088,20 @@ branding: "品牌"
|
||||
enableServerMachineStats: "公开服务器硬件统计信息"
|
||||
enableIdenticonGeneration: "启用生成用户 Identicon"
|
||||
turnOffToImprovePerformance: "关闭该选项可以提高性能。"
|
||||
createInviteCode: "发行邀请码"
|
||||
createWithOptions: "使用选项来创建"
|
||||
createCount: "发行数"
|
||||
inviteCodeCreated: "已创建邀请码"
|
||||
inviteLimitExceeded: "可供发行的邀请码已达上限。"
|
||||
createLimitRemaining: "可供发行的邀请码:剩余{limit}个"
|
||||
inviteLimitResetCycle: "可以在{time}内发行最多{limit}个邀请码。"
|
||||
expirationDate: "有效日期"
|
||||
noExpirationDate: "不设置有效日期"
|
||||
inviteCodeUsedAt: "邀请码被使用的日期和时间"
|
||||
registeredUserUsingInviteCode: "使用了邀请码的用户"
|
||||
waitingForMailAuth: "等待验证电子邮件"
|
||||
inviteCodeCreator: "发行邀请码的用户"
|
||||
usedAt: "使用时间"
|
||||
unused: "未使用"
|
||||
used: "已使用"
|
||||
expired: "已过期"
|
||||
@ -1400,6 +1415,9 @@ _role:
|
||||
ltlAvailable: "查看本地时间线"
|
||||
canPublicNote: "允许公开发帖"
|
||||
canInvite: "发放服务器邀请码"
|
||||
inviteLimit: "可发行邀请码的数量"
|
||||
inviteLimitCycle: "邀请码的发行间隔"
|
||||
inviteExpirationTime: "邀请码的有效日期"
|
||||
canManageCustomEmojis: "管理自定义表情符号"
|
||||
driveCapacity: "网盘容量"
|
||||
alwaysMarkNsfw: "总是将文件标记为 NSFW"
|
||||
@ -2064,6 +2082,7 @@ _deck:
|
||||
introduction: "将各列进行组合以创建您自己的界面!"
|
||||
introduction2: "您可以随时通过屏幕右侧的 + 来添加列"
|
||||
widgetsIntroduction: "从列菜单中,选择“小工具编辑”来添加小工具"
|
||||
useSimpleUiForNonRootPages: "用简易UI表示非根页面"
|
||||
_columns:
|
||||
main: "主列"
|
||||
widgets: "小工具"
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "cherrypick",
|
||||
"version": "13.14.0-beta.5",
|
||||
"version": "13.14.0-beta.7",
|
||||
"codename": "nasubi",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
|
@ -57,35 +57,34 @@
|
||||
"@aws-sdk/client-s3": "3.367.0",
|
||||
"@aws-sdk/lib-storage": "3.367.0",
|
||||
"@aws-sdk/node-http-handler": "3.360.0",
|
||||
"@bull-board/api": "5.6.0",
|
||||
"@bull-board/fastify": "5.6.0",
|
||||
"@bull-board/ui": "5.6.0",
|
||||
"@bull-board/api": "5.6.1",
|
||||
"@bull-board/fastify": "5.6.1",
|
||||
"@bull-board/ui": "5.6.1",
|
||||
"@discordapp/twemoji": "14.1.2",
|
||||
"@fastify/accepts": "4.2.0",
|
||||
"@fastify/cookie": "8.3.0",
|
||||
"@fastify/cors": "8.3.0",
|
||||
"@fastify/http-proxy": "9.2.1",
|
||||
"@fastify/multipart": "7.7.0",
|
||||
"@fastify/multipart": "7.7.1",
|
||||
"@fastify/static": "6.10.2",
|
||||
"@fastify/view": "8.0.0",
|
||||
"@google-cloud/logging": "^10.5.0",
|
||||
"@google-cloud/translate": "^7.2.1",
|
||||
"@nestjs/common": "10.0.5",
|
||||
"@nestjs/core": "10.0.5",
|
||||
"@nestjs/testing": "10.0.5",
|
||||
"@nestjs/common": "10.1.0",
|
||||
"@nestjs/core": "10.1.0",
|
||||
"@nestjs/testing": "10.1.0",
|
||||
"@peertube/http-signature": "1.7.0",
|
||||
"@sinonjs/fake-timers": "10.3.0",
|
||||
"@swc/cli": "0.1.62",
|
||||
"@swc/core": "1.3.69",
|
||||
"@swc/core": "1.3.70",
|
||||
"@vitalets/google-translate-api": "9.2.0",
|
||||
"accepts": "1.3.8",
|
||||
"ajv": "8.12.0",
|
||||
"archiver": "5.3.1",
|
||||
"async-mutex": "^0.4.0",
|
||||
"autwh": "0.1.0",
|
||||
"bcryptjs": "2.4.3",
|
||||
"blurhash": "2.0.5",
|
||||
"bullmq": "4.3.0",
|
||||
"bullmq": "4.4.0",
|
||||
"cacheable-lookup": "7.0.0",
|
||||
"cbor": "9.0.0",
|
||||
"chalk": "5.3.0",
|
||||
@ -98,8 +97,7 @@
|
||||
"content-disposition": "0.5.4",
|
||||
"date-fns": "2.30.0",
|
||||
"deep-email-validator": "0.1.21",
|
||||
"escape-regexp": "0.0.1",
|
||||
"fastify": "4.19.2",
|
||||
"fastify": "4.20.0",
|
||||
"feed": "4.2.2",
|
||||
"file-type": "18.5.0",
|
||||
"fluent-ffmpeg": "2.1.2",
|
||||
@ -142,7 +140,6 @@
|
||||
"rename": "1.0.4",
|
||||
"rss-parser": "3.13.0",
|
||||
"rxjs": "7.8.1",
|
||||
"s-age": "1.1.2",
|
||||
"sanitize-html": "2.11.0",
|
||||
"semver": "7.5.4",
|
||||
"sharp": "0.32.3",
|
||||
@ -176,7 +173,6 @@
|
||||
"@types/cbor": "6.0.0",
|
||||
"@types/color-convert": "2.0.0",
|
||||
"@types/content-disposition": "0.5.5",
|
||||
"@types/escape-regexp": "0.0.1",
|
||||
"@types/fluent-ffmpeg": "2.1.21",
|
||||
"@types/jest": "29.5.3",
|
||||
"@types/js-yaml": "4.0.5",
|
||||
@ -195,7 +191,6 @@
|
||||
"@types/qrcode": "1.5.1",
|
||||
"@types/random-seed": "0.3.3",
|
||||
"@types/ratelimiter": "3.4.4",
|
||||
"@types/redis": "4.0.11",
|
||||
"@types/rename": "1.0.4",
|
||||
"@types/sanitize-html": "2.9.0",
|
||||
"@types/semver": "7.5.0",
|
||||
@ -206,7 +201,6 @@
|
||||
"@types/unzipper": "0.10.6",
|
||||
"@types/vary": "1.1.0",
|
||||
"@types/web-push": "3.3.2",
|
||||
"@types/websocket": "1.0.5",
|
||||
"@types/ws": "8.5.5",
|
||||
"@typescript-eslint/eslint-plugin": "5.61.0",
|
||||
"@typescript-eslint/parser": "5.61.0",
|
||||
|
@ -4,10 +4,9 @@ import { IsNull, In, MoreThan, Not } from 'typeorm';
|
||||
import { bindThis } from '@/decorators.js';
|
||||
import { DI } from '@/di-symbols.js';
|
||||
import type { Config } from '@/config.js';
|
||||
import type { LocalUser, RemoteUser } from '@/models/entities/User.js';
|
||||
import type { LocalUser, RemoteUser, User } from '@/models/entities/User.js';
|
||||
import type { BlockingsRepository, FollowingsRepository, InstancesRepository, Muting, MutingsRepository, UserListJoiningsRepository, UsersRepository } from '@/models/index.js';
|
||||
import type { RelationshipJobData, ThinUser } from '@/queue/types.js';
|
||||
import type { User } from '@/models/entities/User.js';
|
||||
|
||||
import { IdService } from '@/core/IdService.js';
|
||||
import { GlobalEventService } from '@/core/GlobalEventService.js';
|
||||
|
@ -2,6 +2,7 @@ import { URL } from 'node:url';
|
||||
import { Inject, Injectable } from '@nestjs/common';
|
||||
import { JSDOM } from 'jsdom';
|
||||
import tinycolor from 'tinycolor2';
|
||||
import * as Redis from 'ioredis';
|
||||
import type { Instance } from '@/models/entities/Instance.js';
|
||||
import type Logger from '@/logger.js';
|
||||
import { DI } from '@/di-symbols.js';
|
||||
@ -10,7 +11,6 @@ import { HttpRequestService } from '@/core/HttpRequestService.js';
|
||||
import { bindThis } from '@/decorators.js';
|
||||
import { FederatedInstanceService } from '@/core/FederatedInstanceService.js';
|
||||
import type { DOMWindow } from 'jsdom';
|
||||
import * as Redis from 'ioredis';
|
||||
|
||||
type NodeInfo = {
|
||||
openRegistrations?: unknown;
|
||||
|
@ -597,7 +597,7 @@ export class NoteCreateService implements OnApplicationShutdown {
|
||||
where: {
|
||||
userId: data.reply.userId,
|
||||
threadId: data.reply.threadId ?? data.reply.id,
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
if (!isThreadMuted) {
|
||||
|
@ -8,8 +8,9 @@ import type { LocalUser, RemoteUser } from '@/models/entities/User.js';
|
||||
import type { Config } from '@/config.js';
|
||||
import type Logger from '@/logger.js';
|
||||
import { UtilityService } from '@/core/UtilityService.js';
|
||||
import { WebfingerService } from '@/core/WebfingerService.js';
|
||||
import { ILink, WebfingerService } from '@/core/WebfingerService.js';
|
||||
import { RemoteLoggerService } from '@/core/RemoteLoggerService.js';
|
||||
import { ApDbResolverService } from '@/core/activitypub/ApDbResolverService.js';
|
||||
import { ApPersonService } from '@/core/activitypub/models/ApPersonService.js';
|
||||
import { bindThis } from '@/decorators.js';
|
||||
|
||||
@ -27,6 +28,7 @@ export class RemoteUserResolveService {
|
||||
private utilityService: UtilityService,
|
||||
private webfingerService: WebfingerService,
|
||||
private remoteLoggerService: RemoteLoggerService,
|
||||
private apDbResolverService: ApDbResolverService,
|
||||
private apPersonService: ApPersonService,
|
||||
) {
|
||||
this.logger = this.remoteLoggerService.logger.createSubLogger('resolve-user');
|
||||
@ -67,6 +69,22 @@ export class RemoteUserResolveService {
|
||||
if (user == null) {
|
||||
const self = await this.resolveSelf(acctLower);
|
||||
|
||||
if (self.href.startsWith(this.config.url)) {
|
||||
const local = this.apDbResolverService.parseUri(self.href);
|
||||
if (local.local && local.type === 'users') {
|
||||
// the LR points to local
|
||||
return (await this.apDbResolverService
|
||||
.getUserFromApId(self.href)
|
||||
.then((u) => {
|
||||
if (u == null) {
|
||||
throw new Error('local user not found');
|
||||
} else {
|
||||
return u;
|
||||
}
|
||||
})) as LocalUser;
|
||||
}
|
||||
}
|
||||
|
||||
this.logger.succ(`return new remote user: ${chalk.magenta(acctLower)}`);
|
||||
return await this.apPersonService.createPerson(self.href);
|
||||
}
|
||||
@ -119,7 +137,7 @@ export class RemoteUserResolveService {
|
||||
}
|
||||
|
||||
@bindThis
|
||||
private async resolveSelf(acctLower: string) {
|
||||
private async resolveSelf(acctLower: string): Promise<ILink> {
|
||||
this.logger.info(`WebFinger for ${chalk.yellow(acctLower)}`);
|
||||
const finger = await this.webfingerService.webfinger(acctLower).catch(err => {
|
||||
this.logger.error(`Failed to WebFinger for ${chalk.yellow(acctLower)}: ${ err.statusCode ?? err.message }`);
|
||||
|
@ -224,14 +224,19 @@ export class RoleService implements OnApplicationShutdown {
|
||||
}
|
||||
|
||||
@bindThis
|
||||
public async getUserRoles(userId: User['id']) {
|
||||
public async getUserAssigns(userId: User['id']) {
|
||||
const now = Date.now();
|
||||
let assigns = await this.roleAssignmentByUserIdCache.fetch(userId, () => this.roleAssignmentsRepository.findBy({ userId }));
|
||||
// 期限切れのロールを除外
|
||||
assigns = assigns.filter(a => a.expiresAt == null || (a.expiresAt.getTime() > now));
|
||||
const assignedRoleIds = assigns.map(x => x.roleId);
|
||||
return assigns;
|
||||
}
|
||||
|
||||
@bindThis
|
||||
public async getUserRoles(userId: User['id']) {
|
||||
const roles = await this.rolesCache.fetch(() => this.rolesRepository.findBy({}));
|
||||
const assignedRoles = roles.filter(r => assignedRoleIds.includes(r.id));
|
||||
const assigns = await this.getUserAssigns(userId);
|
||||
const assignedRoles = roles.filter(r => assigns.map(x => x.roleId).includes(r.id));
|
||||
const user = roles.some(r => r.target === 'conditional') ? await this.cacheService.findUserById(userId) : null;
|
||||
const matchedCondRoles = roles.filter(r => r.target === 'conditional' && this.evalCond(user!, r.condFormula));
|
||||
return [...assignedRoles, ...matchedCondRoles];
|
||||
|
@ -1,5 +1,6 @@
|
||||
import { Inject, Injectable, OnModuleInit, forwardRef } from '@nestjs/common';
|
||||
import { ModuleRef } from '@nestjs/core';
|
||||
import { IsNull } from 'typeorm';
|
||||
import type { LocalUser, PartialLocalUser, PartialRemoteUser, RemoteUser, User } from '@/models/entities/User.js';
|
||||
import { IdentifiableError } from '@/misc/identifiable-error.js';
|
||||
import { QueueService } from '@/core/QueueService.js';
|
||||
@ -21,9 +22,8 @@ import { UserBlockingService } from '@/core/UserBlockingService.js';
|
||||
import { MetaService } from '@/core/MetaService.js';
|
||||
import { CacheService } from '@/core/CacheService.js';
|
||||
import type { Config } from '@/config.js';
|
||||
import Logger from '../logger.js';
|
||||
import { IsNull } from 'typeorm';
|
||||
import { AccountMoveService } from '@/core/AccountMoveService.js';
|
||||
import Logger from '../logger.js';
|
||||
|
||||
const logger = new Logger('following/create');
|
||||
|
||||
@ -322,7 +322,7 @@ export class UserFollowingService implements OnModuleInit {
|
||||
where: {
|
||||
followerId: follower.id,
|
||||
followeeId: followee.id,
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
if (following === null || !following.follower || !following.followee) {
|
||||
@ -412,8 +412,8 @@ export class UserFollowingService implements OnModuleInit {
|
||||
followerId: user.id,
|
||||
followee: {
|
||||
movedToUri: IsNull(),
|
||||
}
|
||||
}
|
||||
},
|
||||
},
|
||||
});
|
||||
const nonMovedFollowers = await this.followingsRepository.count({
|
||||
relations: {
|
||||
@ -423,8 +423,8 @@ export class UserFollowingService implements OnModuleInit {
|
||||
followeeId: user.id,
|
||||
follower: {
|
||||
movedToUri: IsNull(),
|
||||
}
|
||||
}
|
||||
},
|
||||
},
|
||||
});
|
||||
await this.usersRepository.update(
|
||||
{ id: user.id },
|
||||
@ -646,7 +646,7 @@ export class UserFollowingService implements OnModuleInit {
|
||||
where: {
|
||||
followeeId: followee.id,
|
||||
followerId: follower.id,
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
if (!following || !following.followee || !following.follower) return;
|
||||
|
@ -52,7 +52,7 @@ export class VideoProcessingService {
|
||||
query({
|
||||
thumbnail: '1',
|
||||
url,
|
||||
})
|
||||
}),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@ -6,12 +6,12 @@ import { query as urlQuery } from '@/misc/prelude/url.js';
|
||||
import { HttpRequestService } from '@/core/HttpRequestService.js';
|
||||
import { bindThis } from '@/decorators.js';
|
||||
|
||||
type ILink = {
|
||||
export type ILink = {
|
||||
href: string;
|
||||
rel?: string;
|
||||
};
|
||||
|
||||
type IWebFinger = {
|
||||
export type IWebFinger = {
|
||||
links: ILink[];
|
||||
subject: string;
|
||||
};
|
||||
|
@ -220,6 +220,23 @@ export class ApPersonService implements OnModuleInit {
|
||||
return null;
|
||||
}
|
||||
|
||||
private async resolveAvatarAndBanner(user: RemoteUser, icon: any, image: any): Promise<Pick<RemoteUser, 'avatarId' | 'bannerId' | 'avatarUrl' | 'bannerUrl' | 'avatarBlurhash' | 'bannerBlurhash'>> {
|
||||
const [avatar, banner] = await Promise.all([icon, image].map(img => {
|
||||
if (img == null) return null;
|
||||
if (user == null) throw new Error('failed to create user: user is null');
|
||||
return this.apImageService.resolveImage(user, img).catch(() => null);
|
||||
}));
|
||||
|
||||
return {
|
||||
avatarId: avatar?.id ?? null,
|
||||
bannerId: banner?.id ?? null,
|
||||
avatarUrl: avatar ? this.driveFileEntityService.getPublicUrl(avatar, 'avatar') : null,
|
||||
bannerUrl: banner ? this.driveFileEntityService.getPublicUrl(banner) : null,
|
||||
avatarBlurhash: avatar?.blurhash ?? null,
|
||||
bannerBlurhash: banner?.blurhash ?? null,
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Personを作成します。
|
||||
*/
|
||||
@ -259,6 +276,16 @@ export class ApPersonService implements OnModuleInit {
|
||||
|
||||
// Create user
|
||||
let user: RemoteUser | null = null;
|
||||
|
||||
//#region カスタム絵文字取得
|
||||
const emojis = await this.apNoteService.extractEmojis(person.tag ?? [], host)
|
||||
.then(_emojis => _emojis.map(emoji => emoji.name))
|
||||
.catch(err => {
|
||||
this.logger.error(`error occured while fetching user emojis`, { stack: err });
|
||||
return [];
|
||||
});
|
||||
//#endregion
|
||||
|
||||
try {
|
||||
// Start transaction
|
||||
await this.db.transaction(async transactionalEntityManager => {
|
||||
@ -285,6 +312,7 @@ export class ApPersonService implements OnModuleInit {
|
||||
tags,
|
||||
isBot,
|
||||
isCat: (person as any).isCat === true,
|
||||
emojis,
|
||||
})) as RemoteUser;
|
||||
|
||||
await transactionalEntityManager.save(new UserProfile({
|
||||
@ -321,6 +349,9 @@ export class ApPersonService implements OnModuleInit {
|
||||
|
||||
if (user == null) throw new Error('failed to create user: user is null');
|
||||
|
||||
// Register to the cache
|
||||
this.cacheService.uriPersonCache.set(user.uri, user);
|
||||
|
||||
// Register host
|
||||
this.federatedInstanceService.fetch(host).then(async i => {
|
||||
this.instancesRepository.increment({ id: i.id }, 'usersCount', 1);
|
||||
@ -336,45 +367,16 @@ export class ApPersonService implements OnModuleInit {
|
||||
this.hashtagService.updateUsertags(user, tags);
|
||||
|
||||
//#region アバターとヘッダー画像をフェッチ
|
||||
const [avatar, banner] = await Promise.all([person.icon, person.image].map(img => {
|
||||
if (img == null) return null;
|
||||
if (user == null) throw new Error('failed to create user: user is null');
|
||||
return this.apImageService.resolveImage(user, img).catch(() => null);
|
||||
}));
|
||||
try {
|
||||
const updates = await this.resolveAvatarAndBanner(user, person.icon, person.image);
|
||||
await this.usersRepository.update(user.id, updates);
|
||||
user = { ...user, ...updates };
|
||||
|
||||
const avatarId = avatar?.id ?? null;
|
||||
const bannerId = banner?.id ?? null;
|
||||
const avatarUrl = avatar ? this.driveFileEntityService.getPublicUrl(avatar, 'avatar') : null;
|
||||
const bannerUrl = banner ? this.driveFileEntityService.getPublicUrl(banner) : null;
|
||||
const avatarBlurhash = avatar?.blurhash ?? null;
|
||||
const bannerBlurhash = banner?.blurhash ?? null;
|
||||
|
||||
await this.usersRepository.update(user.id, {
|
||||
avatarId,
|
||||
bannerId,
|
||||
avatarUrl,
|
||||
bannerUrl,
|
||||
avatarBlurhash,
|
||||
bannerBlurhash,
|
||||
});
|
||||
|
||||
user.avatarId = avatarId;
|
||||
user.bannerId = bannerId;
|
||||
user.avatarUrl = avatarUrl;
|
||||
user.bannerUrl = bannerUrl;
|
||||
user.avatarBlurhash = avatarBlurhash;
|
||||
user.bannerBlurhash = bannerBlurhash;
|
||||
//#endregion
|
||||
|
||||
//#region カスタム絵文字取得
|
||||
const emojis = await this.apNoteService.extractEmojis(person.tag ?? [], host).catch(err => {
|
||||
this.logger.info(`extractEmojis: ${err}`);
|
||||
return [];
|
||||
});
|
||||
|
||||
const emojiNames = emojis.map(emoji => emoji.name);
|
||||
|
||||
await this.usersRepository.update(user.id, { emojis: emojiNames });
|
||||
// Register to the cache
|
||||
this.cacheService.uriPersonCache.set(user.uri, user);
|
||||
} catch (err) {
|
||||
this.logger.error('error occured while fetching user avatar/banner', { stack: err });
|
||||
}
|
||||
//#endregion
|
||||
|
||||
await this.updateFeatured(user.id, resolver).catch(err => this.logger.error(err));
|
||||
@ -400,7 +402,7 @@ export class ApPersonService implements OnModuleInit {
|
||||
if (uri.startsWith(`${this.config.url}/`)) return;
|
||||
|
||||
//#region このサーバーに既に登録されているか
|
||||
const exist = await this.usersRepository.findOneBy({ uri }) as RemoteUser | null;
|
||||
const exist = await this.fetchPerson(uri) as RemoteUser | null;
|
||||
if (exist === null) return;
|
||||
//#endregion
|
||||
|
||||
@ -413,12 +415,6 @@ export class ApPersonService implements OnModuleInit {
|
||||
|
||||
this.logger.info(`Updating the Person: ${person.id}`);
|
||||
|
||||
// アバターとヘッダー画像をフェッチ
|
||||
const [avatar, banner] = await Promise.all([person.icon, person.image].map(img => {
|
||||
if (img == null) return null;
|
||||
return this.apImageService.resolveImage(exist, img).catch(() => null);
|
||||
}));
|
||||
|
||||
// カスタム絵文字取得
|
||||
const emojis = await this.apNoteService.extractEmojis(person.tag ?? [], exist.host).catch(e => {
|
||||
this.logger.info(`extractEmojis: ${e}`);
|
||||
@ -454,6 +450,7 @@ export class ApPersonService implements OnModuleInit {
|
||||
movedToUri: person.movedTo ?? null,
|
||||
alsoKnownAs: person.alsoKnownAs ?? null,
|
||||
isExplorable: person.discoverable,
|
||||
...(await this.resolveAvatarAndBanner(exist, person.icon, person.image).catch(() => ({}))),
|
||||
} as Partial<RemoteUser> & Pick<RemoteUser, 'isBot' | 'isCat' | 'isLocked' | 'movedToUri' | 'alsoKnownAs' | 'isExplorable'>;
|
||||
|
||||
const moving = ((): boolean => {
|
||||
@ -476,18 +473,6 @@ export class ApPersonService implements OnModuleInit {
|
||||
|
||||
if (moving) updates.movedAt = new Date();
|
||||
|
||||
if (avatar) {
|
||||
updates.avatarId = avatar.id;
|
||||
updates.avatarUrl = this.driveFileEntityService.getPublicUrl(avatar, 'avatar');
|
||||
updates.avatarBlurhash = avatar.blurhash;
|
||||
}
|
||||
|
||||
if (banner) {
|
||||
updates.bannerId = banner.id;
|
||||
updates.bannerUrl = this.driveFileEntityService.getPublicUrl(banner);
|
||||
updates.bannerBlurhash = banner.blurhash;
|
||||
}
|
||||
|
||||
// Update user
|
||||
await this.usersRepository.update(exist.id, updates);
|
||||
|
||||
|
@ -3,8 +3,8 @@ import { DI } from '@/di-symbols.js';
|
||||
import type { AbuseUserReportsRepository } from '@/models/index.js';
|
||||
import { awaitAll } from '@/misc/prelude/await-all.js';
|
||||
import type { AbuseUserReport } from '@/models/entities/AbuseUserReport.js';
|
||||
import { UserEntityService } from './UserEntityService.js';
|
||||
import { bindThis } from '@/decorators.js';
|
||||
import { UserEntityService } from './UserEntityService.js';
|
||||
|
||||
@Injectable()
|
||||
export class AbuseUserReportEntityService {
|
||||
|
@ -4,8 +4,8 @@ import type { AuthSessionsRepository } from '@/models/index.js';
|
||||
import { awaitAll } from '@/misc/prelude/await-all.js';
|
||||
import type { AuthSession } from '@/models/entities/AuthSession.js';
|
||||
import type { User } from '@/models/entities/User.js';
|
||||
import { AppEntityService } from './AppEntityService.js';
|
||||
import { bindThis } from '@/decorators.js';
|
||||
import { AppEntityService } from './AppEntityService.js';
|
||||
|
||||
@Injectable()
|
||||
export class AuthSessionEntityService {
|
||||
|
@ -50,7 +50,7 @@ export class ChannelEntityService {
|
||||
const hasUnreadNote = meId ? await this.noteUnreadsRepository.exist({
|
||||
where: {
|
||||
noteChannelId: channel.id,
|
||||
userId: meId
|
||||
userId: meId,
|
||||
},
|
||||
}) : undefined;
|
||||
|
||||
|
@ -4,8 +4,8 @@ import type { FollowRequestsRepository } from '@/models/index.js';
|
||||
import type { } from '@/models/entities/Blocking.js';
|
||||
import type { User } from '@/models/entities/User.js';
|
||||
import type { FollowRequest } from '@/models/entities/FollowRequest.js';
|
||||
import { UserEntityService } from './UserEntityService.js';
|
||||
import { bindThis } from '@/decorators.js';
|
||||
import { UserEntityService } from './UserEntityService.js';
|
||||
|
||||
@Injectable()
|
||||
export class FollowRequestEntityService {
|
||||
|
@ -3,8 +3,8 @@ import { DI } from '@/di-symbols.js';
|
||||
import type { GalleryLikesRepository } from '@/models/index.js';
|
||||
import type { } from '@/models/entities/Blocking.js';
|
||||
import type { GalleryLike } from '@/models/entities/GalleryLike.js';
|
||||
import { GalleryPostEntityService } from './GalleryPostEntityService.js';
|
||||
import { bindThis } from '@/decorators.js';
|
||||
import { GalleryPostEntityService } from './GalleryPostEntityService.js';
|
||||
|
||||
@Injectable()
|
||||
export class GalleryLikeEntityService {
|
||||
|
@ -4,8 +4,8 @@ import type { ModerationLogsRepository } from '@/models/index.js';
|
||||
import { awaitAll } from '@/misc/prelude/await-all.js';
|
||||
import type { } from '@/models/entities/Blocking.js';
|
||||
import type { ModerationLog } from '@/models/entities/ModerationLog.js';
|
||||
import { UserEntityService } from './UserEntityService.js';
|
||||
import { bindThis } from '@/decorators.js';
|
||||
import { UserEntityService } from './UserEntityService.js';
|
||||
|
||||
@Injectable()
|
||||
export class ModerationLogEntityService {
|
||||
|
@ -4,8 +4,8 @@ import type { NoteFavoritesRepository } from '@/models/index.js';
|
||||
import type { } from '@/models/entities/Blocking.js';
|
||||
import type { User } from '@/models/entities/User.js';
|
||||
import type { NoteFavorite } from '@/models/entities/NoteFavorite.js';
|
||||
import { NoteEntityService } from './NoteEntityService.js';
|
||||
import { bindThis } from '@/decorators.js';
|
||||
import { NoteEntityService } from './NoteEntityService.js';
|
||||
|
||||
@Injectable()
|
||||
export class NoteFavoriteEntityService {
|
||||
|
@ -4,8 +4,8 @@ import type { PageLikesRepository } from '@/models/index.js';
|
||||
import type { } from '@/models/entities/Blocking.js';
|
||||
import type { User } from '@/models/entities/User.js';
|
||||
import type { PageLike } from '@/models/entities/PageLike.js';
|
||||
import { PageEntityService } from './PageEntityService.js';
|
||||
import { bindThis } from '@/decorators.js';
|
||||
import { PageEntityService } from './PageEntityService.js';
|
||||
|
||||
@Injectable()
|
||||
export class PageLikeEntityService {
|
||||
|
@ -3,8 +3,8 @@ import { DI } from '@/di-symbols.js';
|
||||
import type { SigninsRepository } from '@/models/index.js';
|
||||
import type { } from '@/models/entities/Blocking.js';
|
||||
import type { Signin } from '@/models/entities/Signin.js';
|
||||
import { UserEntityService } from './UserEntityService.js';
|
||||
import { bindThis } from '@/decorators.js';
|
||||
import { UserEntityService } from './UserEntityService.js';
|
||||
|
||||
@Injectable()
|
||||
export class SigninEntityService {
|
||||
|
@ -1,11 +1,11 @@
|
||||
import { Writable, WritableOptions } from "node:stream";
|
||||
import { Writable, WritableOptions } from 'node:stream';
|
||||
|
||||
export class DevNull extends Writable implements NodeJS.WritableStream {
|
||||
constructor(opts?: WritableOptions) {
|
||||
super(opts);
|
||||
}
|
||||
constructor(opts?: WritableOptions) {
|
||||
super(opts);
|
||||
}
|
||||
|
||||
_write (chunk: any, encoding: BufferEncoding, cb: (err?: Error | null) => void) {
|
||||
setImmediate(cb);
|
||||
}
|
||||
_write (chunk: any, encoding: BufferEncoding, cb: (err?: Error | null) => void) {
|
||||
setImmediate(cb);
|
||||
}
|
||||
}
|
||||
|
@ -5,10 +5,10 @@ const CHARS = '0123456789ABCDEFGHJKMNPQRSTVWXYZ';
|
||||
export const ulidRegExp = /^[0123456789ABCDEFGHJKMNPQRSTVWXYZ]{26}$/;
|
||||
|
||||
export function parseUlid(id: string): { date: Date; } {
|
||||
const timestamp = id.slice(0, 10);
|
||||
let time = 0;
|
||||
for (let i = 0; i < 10; i++) {
|
||||
time = time * 32 + CHARS.indexOf(timestamp[i]);
|
||||
}
|
||||
return { date: new Date(time) };
|
||||
const timestamp = id.slice(0, 10);
|
||||
let time = 0;
|
||||
for (let i = 0; i < 10; i++) {
|
||||
time = time * 32 + CHARS.indexOf(timestamp[i]);
|
||||
}
|
||||
return { date: new Date(time) };
|
||||
}
|
||||
|
@ -10,7 +10,7 @@ export async function awaitAll<T>(obj: Promiseable<T>): Promise<T> {
|
||||
const resolvedValues = await Promise.all(values.map(value =>
|
||||
(!value || !value.constructor || value.constructor.name !== 'Object')
|
||||
? value
|
||||
: awaitAll(value)
|
||||
: awaitAll(value),
|
||||
));
|
||||
|
||||
for (let i = 0; i < keys.length; i++) {
|
||||
|
@ -54,7 +54,6 @@ import { UserGroupJoining } from '@/models/entities/UserGroupJoining.js';
|
||||
import { UserIp } from '@/models/entities/UserIp.js';
|
||||
import { UserKeypair } from '@/models/entities/UserKeypair.js';
|
||||
import { UserList } from '@/models/entities/UserList.js';
|
||||
import { UserListFavorite } from './entities/UserListFavorite.js';
|
||||
import { UserListJoining } from '@/models/entities/UserListJoining.js';
|
||||
import { UserNotePining } from '@/models/entities/UserNotePining.js';
|
||||
import { UserPending } from '@/models/entities/UserPending.js';
|
||||
@ -69,6 +68,7 @@ import { Role } from '@/models/entities/Role.js';
|
||||
import { RoleAssignment } from '@/models/entities/RoleAssignment.js';
|
||||
import { Flash } from '@/models/entities/Flash.js';
|
||||
import { FlashLike } from '@/models/entities/FlashLike.js';
|
||||
import { UserListFavorite } from './entities/UserListFavorite.js';
|
||||
import type { Repository } from 'typeorm';
|
||||
|
||||
export {
|
||||
|
@ -9,10 +9,10 @@ import type { DriveFile } from '@/models/entities/DriveFile.js';
|
||||
import type { Note } from '@/models/entities/Note.js';
|
||||
import { EmailService } from '@/core/EmailService.js';
|
||||
import { bindThis } from '@/decorators.js';
|
||||
import { SearchService } from '@/core/SearchService.js';
|
||||
import { QueueLoggerService } from '../QueueLoggerService.js';
|
||||
import type * as Bull from 'bullmq';
|
||||
import type { DbUserDeleteJobData } from '../types.js';
|
||||
import { SearchService } from "@/core/SearchService.js";
|
||||
|
||||
@Injectable()
|
||||
export class DeleteAccountProcessorService {
|
||||
|
@ -1,16 +1,16 @@
|
||||
import { Inject, Injectable } from '@nestjs/common';
|
||||
import type * as Bull from 'bullmq';
|
||||
|
||||
import { UserFollowingService } from '@/core/UserFollowingService.js';
|
||||
import { UserBlockingService } from '@/core/UserBlockingService.js';
|
||||
import { bindThis } from '@/decorators.js';
|
||||
import type Logger from '@/logger.js';
|
||||
|
||||
import { QueueLoggerService } from '../QueueLoggerService.js';
|
||||
import { RelationshipJobData } from '../types.js';
|
||||
import type { UsersRepository } from '@/models/index.js';
|
||||
import { DI } from '@/di-symbols.js';
|
||||
import { LocalUser, RemoteUser } from '@/models/entities/User.js';
|
||||
import { RelationshipJobData } from '../types.js';
|
||||
import { QueueLoggerService } from '../QueueLoggerService.js';
|
||||
import type * as Bull from 'bullmq';
|
||||
|
||||
@Injectable()
|
||||
export class RelationshipProcessorService {
|
||||
|
@ -3,6 +3,8 @@ import { fileURLToPath } from 'node:url';
|
||||
import { dirname } from 'node:path';
|
||||
import { Inject, Injectable } from '@nestjs/common';
|
||||
import rename from 'rename';
|
||||
import sharp from 'sharp';
|
||||
import { sharpBmp } from 'sharp-read-bmp';
|
||||
import type { Config } from '@/config.js';
|
||||
import type { DriveFile, DriveFilesRepository } from '@/models/index.js';
|
||||
import { DI } from '@/di-symbols.js';
|
||||
@ -18,11 +20,9 @@ import { contentDisposition } from '@/misc/content-disposition.js';
|
||||
import { FileInfoService } from '@/core/FileInfoService.js';
|
||||
import { LoggerService } from '@/core/LoggerService.js';
|
||||
import { bindThis } from '@/decorators.js';
|
||||
import type { FastifyInstance, FastifyRequest, FastifyReply, FastifyPluginOptions } from 'fastify';
|
||||
import { isMimeImage } from '@/misc/is-mime-image.js';
|
||||
import sharp from 'sharp';
|
||||
import { sharpBmp } from 'sharp-read-bmp';
|
||||
import { correctFilename } from '@/misc/correct-filename.js';
|
||||
import type { FastifyInstance, FastifyRequest, FastifyReply, FastifyPluginOptions } from 'fastify';
|
||||
|
||||
const _filename = fileURLToPath(import.meta.url);
|
||||
const _dirname = dirname(_filename);
|
||||
@ -180,8 +180,8 @@ export class FileServerService {
|
||||
reply.header('Content-Disposition',
|
||||
contentDisposition(
|
||||
'inline',
|
||||
correctFilename(file.filename, image.ext)
|
||||
)
|
||||
correctFilename(file.filename, image.ext),
|
||||
),
|
||||
);
|
||||
return image.data;
|
||||
}
|
||||
@ -278,11 +278,11 @@ export class FileServerService {
|
||||
};
|
||||
} else {
|
||||
const data = (await sharpBmp(file.path, file.mime, { animated: !('static' in request.query) }))
|
||||
.resize({
|
||||
height: 'emoji' in request.query ? 128 : 320,
|
||||
withoutEnlargement: true,
|
||||
})
|
||||
.webp(webpDefault);
|
||||
.resize({
|
||||
height: 'emoji' in request.query ? 128 : 320,
|
||||
withoutEnlargement: true,
|
||||
})
|
||||
.webp(webpDefault);
|
||||
|
||||
image = {
|
||||
data,
|
||||
@ -355,8 +355,8 @@ export class FileServerService {
|
||||
reply.header('Content-Disposition',
|
||||
contentDisposition(
|
||||
'inline',
|
||||
correctFilename(file.filename, image.ext)
|
||||
)
|
||||
correctFilename(file.filename, image.ext),
|
||||
),
|
||||
);
|
||||
return image.data;
|
||||
} catch (e) {
|
||||
|
@ -1,18 +1,18 @@
|
||||
import { Inject, Injectable } from '@nestjs/common';
|
||||
import { IsNull } from 'typeorm';
|
||||
import vary from 'vary';
|
||||
import fastifyAccepts from '@fastify/accepts';
|
||||
import { DI } from '@/di-symbols.js';
|
||||
import type { UsersRepository } from '@/models/index.js';
|
||||
import type { Config } from '@/config.js';
|
||||
import { escapeAttribute, escapeValue } from '@/misc/prelude/xml.js';
|
||||
import type { User } from '@/models/entities/User.js';
|
||||
import * as Acct from '@/misc/acct.js';
|
||||
import { NodeinfoServerService } from './NodeinfoServerService.js';
|
||||
import { UserEntityService } from '@/core/entities/UserEntityService.js';
|
||||
import type { FindOptionsWhere } from 'typeorm';
|
||||
import { bindThis } from '@/decorators.js';
|
||||
import { NodeinfoServerService } from './NodeinfoServerService.js';
|
||||
import type { FindOptionsWhere } from 'typeorm';
|
||||
import type { FastifyInstance, FastifyPluginOptions } from 'fastify';
|
||||
import fastifyAccepts from '@fastify/accepts';
|
||||
|
||||
@Injectable()
|
||||
export class WellKnownServerService {
|
||||
|
@ -13,9 +13,9 @@ import { EmailService } from '@/core/EmailService.js';
|
||||
import { LocalUser } from '@/models/entities/User.js';
|
||||
import { FastifyReplyError } from '@/misc/fastify-reply-error.js';
|
||||
import { bindThis } from '@/decorators.js';
|
||||
import { L_CHARS, secureRndstr } from '@/misc/secure-rndstr.js';
|
||||
import { SigninService } from './SigninService.js';
|
||||
import type { FastifyRequest, FastifyReply } from 'fastify';
|
||||
import { L_CHARS, secureRndstr } from '@/misc/secure-rndstr.js';
|
||||
|
||||
@Injectable()
|
||||
export class SignupApiService {
|
||||
|
@ -91,7 +91,7 @@ export default class extends Endpoint<typeof meta, typeof paramDef> {
|
||||
|
||||
if (queryarry) {
|
||||
emojis = emojis.filter(emoji =>
|
||||
queryarry.includes(`:${emoji.name}:`)
|
||||
queryarry.includes(`:${emoji.name}:`),
|
||||
);
|
||||
} else {
|
||||
emojis = emojis.filter(emoji =>
|
||||
|
@ -61,6 +61,7 @@ export default class extends Endpoint<typeof meta, typeof paramDef> {
|
||||
|
||||
const signins = await this.signinsRepository.findBy({ userId: user.id });
|
||||
|
||||
const roleAssigns = await this.roleService.getUserAssigns(user.id);
|
||||
const roles = await this.roleService.getUserRoles(user.id);
|
||||
|
||||
return {
|
||||
@ -85,6 +86,11 @@ export default class extends Endpoint<typeof meta, typeof paramDef> {
|
||||
signins,
|
||||
policies: await this.roleService.getUserPolicies(user.id),
|
||||
roles: await this.roleEntityService.packMany(roles, me),
|
||||
roleAssigns: roleAssigns.map(a => ({
|
||||
createdAt: a.createdAt.toISOString(),
|
||||
expiresAt: a.expiresAt ? a.expiresAt.toISOString() : null,
|
||||
roleId: a.roleId,
|
||||
})),
|
||||
};
|
||||
});
|
||||
}
|
||||
|
@ -5,8 +5,8 @@ import type { UsersRepository, BlockingsRepository } from '@/models/index.js';
|
||||
import { UserEntityService } from '@/core/entities/UserEntityService.js';
|
||||
import { UserBlockingService } from '@/core/UserBlockingService.js';
|
||||
import { DI } from '@/di-symbols.js';
|
||||
import { ApiError } from '../../error.js';
|
||||
import { GetterService } from '@/server/api/GetterService.js';
|
||||
import { ApiError } from '../../error.js';
|
||||
|
||||
export const meta = {
|
||||
tags: ['account'],
|
||||
@ -88,7 +88,7 @@ export default class extends Endpoint<typeof meta, typeof paramDef> {
|
||||
where: {
|
||||
blockerId: blocker.id,
|
||||
blockeeId: blockee.id,
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
if (!exist) {
|
||||
|
@ -2,8 +2,8 @@ import { Inject, Injectable } from '@nestjs/common';
|
||||
import { Endpoint } from '@/server/api/endpoint-base.js';
|
||||
import type { ClipNotesRepository, ClipsRepository } from '@/models/index.js';
|
||||
import { DI } from '@/di-symbols.js';
|
||||
import { ApiError } from '../../error.js';
|
||||
import { GetterService } from '@/server/api/GetterService.js';
|
||||
import { ApiError } from '../../error.js';
|
||||
|
||||
export const meta = {
|
||||
tags: ['account', 'notes', 'clips'],
|
||||
|
@ -5,8 +5,8 @@ import type { UsersRepository, FollowingsRepository } from '@/models/index.js';
|
||||
import { UserEntityService } from '@/core/entities/UserEntityService.js';
|
||||
import { UserFollowingService } from '@/core/UserFollowingService.js';
|
||||
import { DI } from '@/di-symbols.js';
|
||||
import { ApiError } from '../../error.js';
|
||||
import { GetterService } from '@/server/api/GetterService.js';
|
||||
import { ApiError } from '../../error.js';
|
||||
|
||||
export const meta = {
|
||||
tags: ['following', 'users'],
|
||||
|
@ -5,8 +5,8 @@ import type { UsersRepository, FollowingsRepository } from '@/models/index.js';
|
||||
import { UserEntityService } from '@/core/entities/UserEntityService.js';
|
||||
import { UserFollowingService } from '@/core/UserFollowingService.js';
|
||||
import { DI } from '@/di-symbols.js';
|
||||
import { ApiError } from '../../error.js';
|
||||
import { GetterService } from '@/server/api/GetterService.js';
|
||||
import { ApiError } from '../../error.js';
|
||||
|
||||
export const meta = {
|
||||
tags: ['following', 'users'],
|
||||
|
@ -23,7 +23,7 @@ export const meta = {
|
||||
id: 'e5b3b9f0-2b8f-4b9f-9c1f-8c5c1b2e1b1a',
|
||||
kind: 'permission',
|
||||
},
|
||||
}
|
||||
},
|
||||
} as const;
|
||||
|
||||
export const paramDef = {
|
||||
|
@ -267,7 +267,7 @@ export default class extends Endpoint<typeof meta, typeof paramDef> {
|
||||
super(meta, paramDef, async (ps, me) => {
|
||||
const instance = await this.metaService.fetch(true);
|
||||
|
||||
const ads = await this.adsRepository.createQueryBuilder("ads")
|
||||
const ads = await this.adsRepository.createQueryBuilder('ads')
|
||||
.where('ads.expiresAt > :now', { now: new Date() })
|
||||
.andWhere('ads.startsAt <= :now', { now: new Date() })
|
||||
.andWhere(new Brackets(qb => {
|
||||
|
@ -4,8 +4,8 @@ import type { NotesRepository } from '@/models/index.js';
|
||||
import { Endpoint } from '@/server/api/endpoint-base.js';
|
||||
import { NoteEntityService } from '@/core/entities/NoteEntityService.js';
|
||||
import { DI } from '@/di-symbols.js';
|
||||
import { ApiError } from '../../error.js';
|
||||
import { GetterService } from '@/server/api/GetterService.js';
|
||||
import { ApiError } from '../../error.js';
|
||||
|
||||
export const meta = {
|
||||
tags: ['notes'],
|
||||
|
@ -3,8 +3,8 @@ import type { NotesRepository } from '@/models/index.js';
|
||||
import { Endpoint } from '@/server/api/endpoint-base.js';
|
||||
import { NoteEntityService } from '@/core/entities/NoteEntityService.js';
|
||||
import { DI } from '@/di-symbols.js';
|
||||
import { ApiError } from '../../error.js';
|
||||
import { GetterService } from '@/server/api/GetterService.js';
|
||||
import { ApiError } from '../../error.js';
|
||||
|
||||
export const meta = {
|
||||
tags: ['notes'],
|
||||
|
@ -3,8 +3,8 @@ import type { PromoReadsRepository } from '@/models/index.js';
|
||||
import { IdService } from '@/core/IdService.js';
|
||||
import { Endpoint } from '@/server/api/endpoint-base.js';
|
||||
import { DI } from '@/di-symbols.js';
|
||||
import { ApiError } from '../../error.js';
|
||||
import { GetterService } from '@/server/api/GetterService.js';
|
||||
import { ApiError } from '../../error.js';
|
||||
|
||||
export const meta = {
|
||||
tags: ['notes'],
|
||||
|
@ -35,7 +35,7 @@ export const meta = {
|
||||
code: 'NO_SUCH_REGISTRATION',
|
||||
id: ' b09d8066-8064-5613-efb6-0e963b21d012',
|
||||
},
|
||||
}
|
||||
},
|
||||
} as const;
|
||||
|
||||
export const paramDef = {
|
||||
|
@ -5,8 +5,8 @@ import type { NotesRepository, UsersRepository } from '@/models/index.js';
|
||||
import { Endpoint } from '@/server/api/endpoint-base.js';
|
||||
import { UserEntityService } from '@/core/entities/UserEntityService.js';
|
||||
import { DI } from '@/di-symbols.js';
|
||||
import { ApiError } from '../../error.js';
|
||||
import { GetterService } from '@/server/api/GetterService.js';
|
||||
import { ApiError } from '../../error.js';
|
||||
|
||||
export const meta = {
|
||||
tags: ['users'],
|
||||
|
@ -3,9 +3,9 @@ import { isUserRelated } from '@/misc/is-user-related.js';
|
||||
import type { Packed } from '@/misc/json-schema.js';
|
||||
import { NoteEntityService } from '@/core/entities/NoteEntityService.js';
|
||||
import { bindThis } from '@/decorators.js';
|
||||
import { RoleService } from '@/core/RoleService.js';
|
||||
import Channel from '../channel.js';
|
||||
import { StreamMessages } from '../types.js';
|
||||
import { RoleService } from '@/core/RoleService.js';
|
||||
|
||||
class RoleTimelineChannel extends Channel {
|
||||
public readonly chName = 'roleTimeline';
|
||||
|
@ -19,10 +19,10 @@
|
||||
"@rollup/plugin-json": "6.0.0",
|
||||
"@rollup/plugin-replace": "5.0.2",
|
||||
"@rollup/pluginutils": "5.0.2",
|
||||
"@syuilo/aiscript": "0.13.3",
|
||||
"@syuilo/aiscript": "0.15.0",
|
||||
"@tabler/icons-webfont": "2.25.0",
|
||||
"@vitejs/plugin-vue": "4.2.3",
|
||||
"@vue-macros/reactivity-transform": "0.3.14",
|
||||
"@vue-macros/reactivity-transform": "0.3.15",
|
||||
"@vue/compiler-sfc": "3.3.4",
|
||||
"astring": "1.8.6",
|
||||
"autosize": "6.0.1",
|
||||
@ -55,7 +55,7 @@
|
||||
"prismjs": "1.29.0",
|
||||
"punycode": "2.3.0",
|
||||
"querystring": "0.2.1",
|
||||
"rollup": "3.26.2",
|
||||
"rollup": "3.26.3",
|
||||
"s-age": "1.1.2",
|
||||
"sanitize-html": "2.11.0",
|
||||
"sass": "1.63.6",
|
||||
|
@ -300,6 +300,17 @@ useTooltip(renoteButton, async (showing) => {
|
||||
}, {}, 'closed');
|
||||
});
|
||||
|
||||
type Visibility = 'public' | 'home' | 'followers' | 'specified';
|
||||
|
||||
// defaultStore.state.visibilityがstringなためstringも受け付けている
|
||||
function smallerVisibility(a: Visibility | string, b: Visibility | string): Visibility {
|
||||
if (a === 'specified' || b === 'specified') return 'specified';
|
||||
if (a === 'followers' || b === 'followers') return 'followers';
|
||||
if (a === 'home' || b === 'home') return 'home';
|
||||
// if (a === 'public' || b === 'public')
|
||||
return 'public';
|
||||
}
|
||||
|
||||
async function renote() {
|
||||
pleaseLogin();
|
||||
showMovedDialog();
|
||||
@ -335,7 +346,12 @@ async function renote() {
|
||||
os.popup(MkRippleEffect, { x, y }, {}, 'end');
|
||||
}
|
||||
|
||||
const configuredVisibility = defaultStore.state.rememberNoteVisibility ? defaultStore.state.visibility : defaultStore.state.defaultNoteVisibility;
|
||||
const localOnly = defaultStore.state.rememberNoteVisibility ? defaultStore.state.localOnly : defaultStore.state.defaultNoteLocalOnly;
|
||||
|
||||
os.api('notes/create', {
|
||||
localOnly,
|
||||
visibility: smallerVisibility(appearNote.visibility, configuredVisibility),
|
||||
renoteId: appearNote.id,
|
||||
}).then(() => {
|
||||
os.noteToast(i18n.ts.renoted);
|
||||
|
@ -972,6 +972,7 @@ defineExpose({
|
||||
flex-wrap: nowrap;
|
||||
gap: 4px;
|
||||
padding: 8px 12px;
|
||||
margin-bottom: -10px;
|
||||
}
|
||||
|
||||
.headerLeft {
|
||||
|
@ -9,7 +9,10 @@
|
||||
<MkInfo warn>{{ i18n.ts.invitationRequiredToRegister }}</MkInfo>
|
||||
</div>
|
||||
|
||||
<div style="text-align: center;">{{ i18n.ts.pleaseConfirmBelowBeforeSignup }}</div>
|
||||
<div style="text-align: center;">
|
||||
<div>{{ i18n.ts.pleaseConfirmBelowBeforeSignup }}</div>
|
||||
<div style="font-weight: bold; margin-top: 0.5em;">{{ i18n.ts.beSureToReadThisAsItIsImportant }}</div>
|
||||
</div>
|
||||
|
||||
<MkFolder v-if="availableServerRules" :defaultOpen="true">
|
||||
<template #label>{{ i18n.ts.serverRules }}</template>
|
||||
@ -19,7 +22,7 @@
|
||||
<li v-for="item in instance.serverRules" :class="$style.rule"><div :class="$style.ruleText" v-html="item"></div></li>
|
||||
</ol>
|
||||
|
||||
<MkSwitch v-model="agreeServerRules" style="margin-top: 16px;">{{ i18n.ts.agree }}</MkSwitch>
|
||||
<MkSwitch :modelValue="agreeServerRules" style="margin-top: 16px;" @update:modelValue="updateAgreeServerRules">{{ i18n.ts.agree }}</MkSwitch>
|
||||
</MkFolder>
|
||||
|
||||
<MkFolder v-if="availableTos" :defaultOpen="true">
|
||||
@ -28,7 +31,7 @@
|
||||
|
||||
<a :href="instance.tosUrl" class="_link" target="_blank">{{ i18n.ts.termsOfService }} <i class="ti ti-external-link"></i></a>
|
||||
|
||||
<MkSwitch v-model="agreeTos" style="margin-top: 16px;">{{ i18n.ts.agree }}</MkSwitch>
|
||||
<MkSwitch :modelValue="agreeTos" style="margin-top: 16px;" @update:modelValue="updateAgreeTos">{{ i18n.ts.agree }}</MkSwitch>
|
||||
</MkFolder>
|
||||
|
||||
<MkFolder :defaultOpen="true">
|
||||
@ -37,7 +40,7 @@
|
||||
|
||||
<a href="https://misskey-hub.net/docs/notes.html" class="_link" target="_blank">{{ i18n.ts.basicNotesBeforeCreateAccount }} <i class="ti ti-external-link"></i></a>
|
||||
|
||||
<MkSwitch v-model="agreeNote" style="margin-top: 16px;" data-cy-signup-rules-notes-agree>{{ i18n.ts.agree }}</MkSwitch>
|
||||
<MkSwitch :modelValue="agreeNote" style="margin-top: 16px;" data-cy-signup-rules-notes-agree @update:modelValue="updateAgreeNote">{{ i18n.ts.agree }}</MkSwitch>
|
||||
</MkFolder>
|
||||
|
||||
<div v-if="!agreed" style="text-align: center;">{{ i18n.ts.pleaseAgreeAllToContinue }}</div>
|
||||
@ -52,13 +55,14 @@
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import { computed, ref } from 'vue';
|
||||
import { computed, onMounted, ref, watch } from 'vue';
|
||||
import { instance } from '@/instance';
|
||||
import { i18n } from '@/i18n';
|
||||
import MkButton from '@/components/MkButton.vue';
|
||||
import MkFolder from '@/components/MkFolder.vue';
|
||||
import MkSwitch from '@/components/MkSwitch.vue';
|
||||
import MkInfo from '@/components/MkInfo.vue';
|
||||
import * as os from '@/os';
|
||||
|
||||
const availableServerRules = instance.serverRules.length > 0;
|
||||
const availableTos = instance.tosUrl != null;
|
||||
@ -75,6 +79,48 @@ const emit = defineEmits<{
|
||||
(ev: 'cancel'): void;
|
||||
(ev: 'done'): void;
|
||||
}>();
|
||||
|
||||
async function updateAgreeServerRules(v: boolean) {
|
||||
if (v) {
|
||||
const confirm = await os.confirm({
|
||||
type: 'question',
|
||||
title: i18n.ts.doYouAgree,
|
||||
text: i18n.t('iHaveReadXCarefullyAndAgree', { x: i18n.ts.serverRules }),
|
||||
});
|
||||
if (confirm.canceled) return;
|
||||
agreeServerRules.value = true;
|
||||
} else {
|
||||
agreeServerRules.value = false;
|
||||
}
|
||||
}
|
||||
|
||||
async function updateAgreeTos(v: boolean) {
|
||||
if (v) {
|
||||
const confirm = await os.confirm({
|
||||
type: 'question',
|
||||
title: i18n.ts.doYouAgree,
|
||||
text: i18n.t('iHaveReadXCarefullyAndAgree', { x: i18n.ts.termsOfService }),
|
||||
});
|
||||
if (confirm.canceled) return;
|
||||
agreeTos.value = true;
|
||||
} else {
|
||||
agreeTos.value = false;
|
||||
}
|
||||
}
|
||||
|
||||
async function updateAgreeNote(v: boolean) {
|
||||
if (v) {
|
||||
const confirm = await os.confirm({
|
||||
type: 'question',
|
||||
title: i18n.ts.doYouAgree,
|
||||
text: i18n.t('iHaveReadXCarefullyAndAgree', { x: i18n.ts.basicNotesBeforeCreateAccount }),
|
||||
});
|
||||
if (confirm.canceled) return;
|
||||
agreeNote.value = true;
|
||||
} else {
|
||||
agreeNote.value = false;
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" module>
|
||||
|
@ -15,24 +15,14 @@
|
||||
</div>
|
||||
<div :class="$style.status">
|
||||
<div :class="$style.statusItem">
|
||||
<p :class="$style.statusItemLabel">{{ i18n.ts.notes }}</p><span :class="$style.statusItemValue">{{ user.notesCount }}</span>
|
||||
<p :class="$style.statusItemLabel">{{ i18n.ts.notes }}</p><span :class="$style.statusItemValue">{{ number(user.notesCount) }}</span>
|
||||
</div>
|
||||
<div v-if="isFfVisibleForMe(user)" :class="$style.statusItem">
|
||||
<p :class="$style.statusItemLabel">{{ i18n.ts.following }}</p><span :class="$style.statusItemValue">{{ number(user.followingCount) }}</span>
|
||||
</div>
|
||||
<div v-if="isFfVisibleForMe(user)" :class="$style.statusItem">
|
||||
<p :class="$style.statusItemLabel">{{ i18n.ts.followers }}</p><span :class="$style.statusItemValue">{{ number(user.followersCount) }}</span>
|
||||
</div>
|
||||
<template v-if="isFfVisibility($i, props.user)">
|
||||
<div :class="$style.statusItem">
|
||||
<p :class="$style.statusItemLabel">{{ i18n.ts.following }}</p><span :class="$style.statusItemValue">{{ user.followingCount }}</span>
|
||||
</div>
|
||||
<div :class="$style.statusItem">
|
||||
<p :class="$style.statusItemLabel">{{ i18n.ts.followers }}</p><span :class="$style.statusItemValue">{{ user.followersCount }}</span>
|
||||
</div>
|
||||
</template>
|
||||
<template v-else>
|
||||
<div :class="$style.statusItem">
|
||||
<p :class="$style.statusItemLabel">{{ i18n.ts.following }}</p><span :class="$style.statusItemValue"><i class="ti ti-lock" :class="[$style.keyWiggleArea, { [$style.animation]: animation }]"></i></span>
|
||||
</div>
|
||||
<div :class="$style.statusItem">
|
||||
<p :class="$style.statusItemLabel">{{ i18n.ts.followers }}</p><span :class="$style.statusItemValue"><i class="ti ti-lock" :class="[$style.keyWiggleArea, { [$style.animation]: animation }]"></i></span>
|
||||
</div>
|
||||
</template>
|
||||
</div>
|
||||
<MkFollowButton v-if="$i && user.id != $i.id" :class="$style.follow" :user="user" mini/>
|
||||
</div>
|
||||
@ -41,17 +31,15 @@
|
||||
<script lang="ts" setup>
|
||||
import * as misskey from 'cherrypick-js';
|
||||
import MkFollowButton from '@/components/MkFollowButton.vue';
|
||||
import number from '@/filters/number';
|
||||
import { userPage } from '@/filters/user';
|
||||
import { i18n } from '@/i18n';
|
||||
import { $i } from '@/account';
|
||||
import { isFfVisibility } from '@/scripts/is-ff-visibility';
|
||||
import { defaultStore } from '@/store';
|
||||
import { isFfVisibleForMe } from '@/scripts/isFfVisibleForMe';
|
||||
|
||||
const props = defineProps<{
|
||||
user: misskey.entities.UserDetailed;
|
||||
}>();
|
||||
|
||||
const animation = $ref(defaultStore.state.animation);
|
||||
</script>
|
||||
|
||||
<style lang="scss" module>
|
||||
@ -150,36 +138,4 @@ const animation = $ref(defaultStore.state.animation);
|
||||
top: 8px;
|
||||
right: 8px;
|
||||
}
|
||||
|
||||
.keyWiggleArea {
|
||||
display: block;
|
||||
}
|
||||
|
||||
@keyframes keywiggle {
|
||||
0% { transform: translate(-3px,-1px) rotate(-8deg); }
|
||||
5% { transform: translateY(-1px) rotate(-10deg); }
|
||||
10% { transform: translate(1px,-3px) rotate(0); }
|
||||
15% { transform: translate(1px,1px) rotate(11deg); }
|
||||
20% { transform: translate(-2px,1px) rotate(1deg); }
|
||||
25% { transform: translate(-1px,-2px) rotate(-2deg); }
|
||||
30% { transform: translate(-1px,2px) rotate(-3deg); }
|
||||
35% { transform: translate(2px,1px) rotate(6deg); }
|
||||
40% { transform: translate(-2px,-3px) rotate(-9deg); }
|
||||
45% { transform: translateY(-1px) rotate(-12deg); }
|
||||
50% { transform: translate(1px,2px) rotate(10deg); }
|
||||
55% { transform: translateY(-3px) rotate(8deg); }
|
||||
60% { transform: translate(1px,-1px) rotate(8deg); }
|
||||
65% { transform: translateY(-1px) rotate(-7deg); }
|
||||
70% { transform: translate(-1px,-3px) rotate(6deg); }
|
||||
75% { transform: translateY(-2px) rotate(4deg); }
|
||||
80% { transform: translate(-2px,-1px) rotate(3deg); }
|
||||
85% { transform: translate(1px,-3px) rotate(-10deg); }
|
||||
90% { transform: translate(1px) rotate(3deg); }
|
||||
95% { transform: translate(-2px) rotate(-3deg); }
|
||||
to { transform: translate(2px,1px) rotate(2deg); }
|
||||
}
|
||||
|
||||
.animation:hover {
|
||||
animation: keywiggle 1s;
|
||||
}
|
||||
</style>
|
||||
|
@ -30,26 +30,14 @@
|
||||
<div :class="$style.statusItemLabel">{{ i18n.ts.notes }}</div>
|
||||
<div>{{ number(user.notesCount) }}</div>
|
||||
</div>
|
||||
<template v-if="isFfVisibility($i, user)">
|
||||
<div :class="$style.statusItem">
|
||||
<div :class="$style.statusItemLabel">{{ i18n.ts.following }}</div>
|
||||
<div>{{ number(user.followingCount) }}</div>
|
||||
</div>
|
||||
<div :class="$style.statusItem">
|
||||
<div :class="$style.statusItemLabel">{{ i18n.ts.followers }}</div>
|
||||
<div>{{ number(user.followersCount) }}</div>
|
||||
</div>
|
||||
</template>
|
||||
<template v-else>
|
||||
<div :class="$style.statusItem">
|
||||
<div :class="$style.statusItemLabel">{{ i18n.ts.following }}</div>
|
||||
<div><i class="ti ti-lock" :class="[$style.keyWiggleArea, { [$style.animation]: animation }]"></i></div>
|
||||
</div>
|
||||
<div :class="$style.statusItem">
|
||||
<div :class="$style.statusItemLabel">{{ i18n.ts.followers }}</div>
|
||||
<div><i class="ti ti-lock" :class="[$style.keyWiggleArea, { [$style.animation]: animation }]"></i></div>
|
||||
</div>
|
||||
</template>
|
||||
<div v-if="isFfVisibleForMe(user)" :class="$style.statusItem">
|
||||
<div :class="$style.statusItemLabel">{{ i18n.ts.following }}</div>
|
||||
<div>{{ number(user.followingCount) }}</div>
|
||||
</div>
|
||||
<div v-if="isFfVisibleForMe(user)" :class="$style.statusItem">
|
||||
<div :class="$style.statusItemLabel">{{ i18n.ts.followers }}</div>
|
||||
<div>{{ number(user.followersCount) }}</div>
|
||||
</div>
|
||||
</div>
|
||||
<button class="_button" :class="$style.menu" @click="showMenu"><i class="ti ti-dots"></i></button>
|
||||
<MkFollowButton v-if="$i && user.id != $i.id" :class="$style.follow" :user="user" mini/>
|
||||
@ -73,7 +61,7 @@ import number from '@/filters/number';
|
||||
import { i18n } from '@/i18n';
|
||||
import { defaultStore } from '@/store';
|
||||
import { $i } from '@/account';
|
||||
import { isFfVisibility } from '@/scripts/is-ff-visibility';
|
||||
import { isFfVisibleForMe } from '@/scripts/isFfVisibleForMe';
|
||||
|
||||
const props = defineProps<{
|
||||
showing: boolean;
|
||||
@ -88,9 +76,6 @@ const emit = defineEmits<{
|
||||
}>();
|
||||
|
||||
const zIndex = os.claimZIndex('middle');
|
||||
|
||||
const animation = $ref(defaultStore.state.animation);
|
||||
|
||||
let user = $ref<misskey.entities.UserDetailed | null>(null);
|
||||
let top = $ref(0);
|
||||
let left = $ref(0);
|
||||
@ -259,37 +244,4 @@ onMounted(() => {
|
||||
top: 8px;
|
||||
right: 8px;
|
||||
}
|
||||
|
||||
.keyWiggleArea {
|
||||
display: block;
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
@keyframes keywiggle {
|
||||
0% { transform: translate(-3px,-1px) rotate(-8deg); }
|
||||
5% { transform: translateY(-1px) rotate(-10deg); }
|
||||
10% { transform: translate(1px,-3px) rotate(0); }
|
||||
15% { transform: translate(1px,1px) rotate(11deg); }
|
||||
20% { transform: translate(-2px,1px) rotate(1deg); }
|
||||
25% { transform: translate(-1px,-2px) rotate(-2deg); }
|
||||
30% { transform: translate(-1px,2px) rotate(-3deg); }
|
||||
35% { transform: translate(2px,1px) rotate(6deg); }
|
||||
40% { transform: translate(-2px,-3px) rotate(-9deg); }
|
||||
45% { transform: translateY(-1px) rotate(-12deg); }
|
||||
50% { transform: translate(1px,2px) rotate(10deg); }
|
||||
55% { transform: translateY(-3px) rotate(8deg); }
|
||||
60% { transform: translate(1px,-1px) rotate(8deg); }
|
||||
65% { transform: translateY(-1px) rotate(-7deg); }
|
||||
70% { transform: translate(-1px,-3px) rotate(6deg); }
|
||||
75% { transform: translateY(-2px) rotate(4deg); }
|
||||
80% { transform: translate(-2px,-1px) rotate(3deg); }
|
||||
85% { transform: translate(1px,-3px) rotate(-10deg); }
|
||||
90% { transform: translate(1px) rotate(3deg); }
|
||||
95% { transform: translate(-2px) rotate(-3deg); }
|
||||
to { transform: translate(2px,1px) rotate(2deg); }
|
||||
}
|
||||
|
||||
.animation:hover {
|
||||
animation: keywiggle 1s;
|
||||
}
|
||||
</style>
|
||||
|
@ -275,6 +275,9 @@ const patronsWithIconWithMisskey = [{
|
||||
}, {
|
||||
name: 'カガミ',
|
||||
icon: 'https://misskey-hub.net/patrons/226ea3a4617749548580ec2d9a263e24.jpg',
|
||||
}, {
|
||||
name: 'フランギ・シュウ',
|
||||
icon: 'https://misskey-hub.net/patrons/3016d37e35f3430b90420176c912d304.jpg',
|
||||
}];
|
||||
|
||||
const patronsWithCherryPick = [
|
||||
@ -376,6 +379,7 @@ const patronsWithMisskey = [
|
||||
'ぷーざ',
|
||||
'越貝鯛丸',
|
||||
'Nick / pprmint.',
|
||||
'kino3277',
|
||||
];
|
||||
|
||||
let isKokonect = false;
|
||||
|
@ -40,7 +40,7 @@
|
||||
</div>
|
||||
<div v-if="expandedItems.includes(item.id)" :class="$style.userItemSub">
|
||||
<div>Assigned: <MkTime :time="item.createdAt" mode="detail"/></div>
|
||||
<div v-if="item.expiresAt">Period: {{ item.expiresAt.toLocaleString() }}</div>
|
||||
<div v-if="item.expiresAt">Period: {{ new Date(item.expiresAt).toLocaleString() }}</div>
|
||||
<div v-else>Period: {{ i18n.ts.indefinitely }}</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -33,7 +33,7 @@ import MkTextarea from '@/components/MkTextarea.vue';
|
||||
import MkInput from '@/components/MkInput.vue';
|
||||
import { useRouter } from '@/router';
|
||||
|
||||
const PRESET_DEFAULT = `/// @ 0.13.3
|
||||
const PRESET_DEFAULT = `/// @ 0.15.0
|
||||
|
||||
var name = ""
|
||||
|
||||
@ -51,7 +51,7 @@ Ui:render([
|
||||
])
|
||||
`;
|
||||
|
||||
const PRESET_OMIKUJI = `/// @ 0.13.3
|
||||
const PRESET_OMIKUJI = `/// @ 0.15.0
|
||||
// ユーザーごとに日替わりのおみくじのプリセット
|
||||
|
||||
// 選択肢
|
||||
@ -94,7 +94,7 @@ Ui:render([
|
||||
])
|
||||
`;
|
||||
|
||||
const PRESET_SHUFFLE = `/// @ 0.13.3
|
||||
const PRESET_SHUFFLE = `/// @ 0.15.0
|
||||
// 巻き戻し可能な文字シャッフルのプリセット
|
||||
|
||||
let string = "ペペロンチーノ"
|
||||
@ -173,7 +173,7 @@ var cursor = 0
|
||||
do()
|
||||
`;
|
||||
|
||||
const PRESET_QUIZ = `/// @ 0.13.3
|
||||
const PRESET_QUIZ = `/// @ 0.15.0
|
||||
let title = '地理クイズ'
|
||||
|
||||
let qas = [{
|
||||
@ -286,7 +286,7 @@ qaEls.push(Ui:C:container({
|
||||
Ui:render(qaEls)
|
||||
`;
|
||||
|
||||
const PRESET_TIMELINE = `/// @ 0.13.3
|
||||
const PRESET_TIMELINE = `/// @ 0.15.0
|
||||
// APIリクエストを行いローカルタイムラインを表示するプリセット
|
||||
|
||||
@fetch() {
|
||||
|
@ -236,6 +236,7 @@ definePageMetadata(computed(() => post ? {
|
||||
border-top: solid 0.5px var(--divider);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
flex-wrap: wrap;
|
||||
|
||||
> .avatar {
|
||||
width: 52px;
|
||||
|
@ -55,7 +55,7 @@
|
||||
</div>
|
||||
<div v-if="expandedMuteItems.includes(item.id)" :class="$style.userItemSub">
|
||||
<div>Muted at: <MkTime :time="item.createdAt" mode="detail"/></div>
|
||||
<div v-if="item.expiresAt">Period: {{ item.expiresAt.toLocaleString() }}</div>
|
||||
<div v-if="item.expiresAt">Period: {{ new Date(item.expiresAt).toLocaleString() }}</div>
|
||||
<div v-else>Period: {{ i18n.ts.indefinitely }}</div>
|
||||
</div>
|
||||
</div>
|
||||
@ -85,7 +85,7 @@
|
||||
</div>
|
||||
<div v-if="expandedBlockItems.includes(item.id)" :class="$style.userItemSub">
|
||||
<div>Blocked at: <MkTime :time="item.createdAt" mode="detail"/></div>
|
||||
<div v-if="item.expiresAt">Period: {{ item.expiresAt.toLocaleString() }}</div>
|
||||
<div v-if="item.expiresAt">Period: {{ new Date(item.expiresAt).toLocaleString() }}</div>
|
||||
<div v-else>Period: {{ i18n.ts.indefinitely }}</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -112,9 +112,17 @@
|
||||
<MkButton v-if="user.host == null && iAmModerator" primary rounded @click="assignRole"><i class="ti ti-plus"></i> {{ i18n.ts.assign }}</MkButton>
|
||||
|
||||
<div v-for="role in info.roles" :key="role.id" :class="$style.roleItem">
|
||||
<MkRolePreview :class="$style.role" :role="role" :forModeration="true"/>
|
||||
<button v-if="role.target === 'manual'" class="_button" :class="$style.roleUnassign" @click="unassignRole(role, $event)"><i class="ti ti-x"></i></button>
|
||||
<button v-else class="_button" :class="$style.roleUnassign" disabled><i class="ti ti-ban"></i></button>
|
||||
<div :class="$style.roleItemMain">
|
||||
<MkRolePreview :class="$style.role" :role="role" :forModeration="true"/>
|
||||
<button class="_button" :class="$style.roleToggle" @click="toggleRoleItem(role)"><i class="ti ti-chevron-down"></i></button>
|
||||
<button v-if="role.target === 'manual'" class="_button" :class="$style.roleUnassign" @click="unassignRole(role, $event)"><i class="ti ti-x"></i></button>
|
||||
<button v-else class="_button" :class="$style.roleUnassign" disabled><i class="ti ti-ban"></i></button>
|
||||
</div>
|
||||
<div v-if="expandedRoles.includes(role.id)" :class="$style.roleItemSub">
|
||||
<div>Assigned: <MkTime :time="info.roleAssigns.find(a => a.roleId === role.id).createdAt" mode="detail"/></div>
|
||||
<div v-if="info.roleAssigns.find(a => a.roleId === role.id).expiresAt">Period: {{ new Date(info.roleAssigns.find(a => a.roleId === role.id).expiresAt).toLocaleString() }}</div>
|
||||
<div v-else>Period: {{ i18n.ts.indefinitely }}</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</MkFolder>
|
||||
@ -220,6 +228,7 @@ const filesPagination = {
|
||||
userId: props.userId,
|
||||
})),
|
||||
};
|
||||
let expandedRoles = $ref([]);
|
||||
|
||||
function createFetcher() {
|
||||
if (iAmModerator) {
|
||||
@ -384,6 +393,14 @@ async function unassignRole(role, ev) {
|
||||
}], ev.currentTarget ?? ev.target);
|
||||
}
|
||||
|
||||
function toggleRoleItem(role) {
|
||||
if (expandedRoles.includes(role.id)) {
|
||||
expandedRoles = expandedRoles.filter(x => x !== role.id);
|
||||
} else {
|
||||
expandedRoles.push(role.id);
|
||||
}
|
||||
}
|
||||
|
||||
watch(() => props.userId, () => {
|
||||
init = createFetcher();
|
||||
}, {
|
||||
@ -523,11 +540,22 @@ definePageMetadata(computed(() => ({
|
||||
}
|
||||
|
||||
.roleItem {
|
||||
}
|
||||
|
||||
.roleItemMain {
|
||||
display: flex;
|
||||
}
|
||||
|
||||
.role {
|
||||
flex: 1;
|
||||
min-width: 0;
|
||||
margin-right: 8px;
|
||||
}
|
||||
|
||||
.roleItemSub {
|
||||
padding: 6px 12px;
|
||||
font-size: 85%;
|
||||
color: var(--fgTransparentWeak);
|
||||
}
|
||||
|
||||
.roleUnassign {
|
||||
|
@ -117,30 +117,18 @@
|
||||
</dl>
|
||||
</div>
|
||||
<div class="status">
|
||||
<MkA v-click-anime :to="userPage(user)">
|
||||
<MkA :to="userPage(user)">
|
||||
<b>{{ number(user.notesCount) }}</b>
|
||||
<span>{{ i18n.ts.notes }}</span>
|
||||
</MkA>
|
||||
<template v-if="isFfVisibility($i, props.user)">
|
||||
<MkA v-click-anime :to="userPage(user, 'following')">
|
||||
<b>{{ number(user.followingCount) }}</b>
|
||||
<span>{{ i18n.ts.following }}</span>
|
||||
</MkA>
|
||||
<MkA v-click-anime :to="userPage(user, 'followers')">
|
||||
<b>{{ number(user.followersCount) }}</b>
|
||||
<span>{{ i18n.ts.followers }}</span>
|
||||
</MkA>
|
||||
</template>
|
||||
<template v-else>
|
||||
<div>
|
||||
<i class="ti ti-lock" :class="{ [$style.animation]: animation }"></i>
|
||||
<span>{{ i18n.ts.following }}</span>
|
||||
</div>
|
||||
<div>
|
||||
<i class="ti ti-lock" :class="{ [$style.animation]: animation }"></i>
|
||||
<span>{{ i18n.ts.followers }}</span>
|
||||
</div>
|
||||
</template>
|
||||
<MkA v-if="isFfVisibleForMe(user)" :to="userPage(user, 'following')">
|
||||
<b>{{ number(user.followingCount) }}</b>
|
||||
<span>{{ i18n.ts.following }}</span>
|
||||
</MkA>
|
||||
<MkA v-if="isFfVisibleForMe(user)" :to="userPage(user, 'followers')">
|
||||
<b>{{ number(user.followersCount) }}</b>
|
||||
<span>{{ i18n.ts.followers }}</span>
|
||||
</MkA>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@ -189,7 +177,7 @@ import { dateString } from '@/filters/date';
|
||||
import { confetti } from '@/scripts/confetti';
|
||||
import MkNotes from '@/components/MkNotes.vue';
|
||||
import { api } from '@/os';
|
||||
import { isFfVisibility } from '@/scripts/is-ff-visibility';
|
||||
import { isFfVisibleForMe } from '@/scripts/isFfVisibleForMe';
|
||||
import { defaultStore } from '@/store';
|
||||
import { miLocalStorage } from '@/local-storage';
|
||||
import { editNickname } from '@/scripts/edit-nickname';
|
||||
@ -243,8 +231,6 @@ const age = $computed(() => {
|
||||
return calcAge(props.user.birthday);
|
||||
});
|
||||
|
||||
const animation = $ref(defaultStore.state.animation);
|
||||
|
||||
function menu(ev) {
|
||||
os.popupMenu(getUserMenu(props.user, router), ev.currentTarget ?? ev.target);
|
||||
}
|
||||
@ -424,18 +410,6 @@ onUnmounted(() => {
|
||||
font-weight: bold;
|
||||
font-size: 1.8em;
|
||||
text-shadow: 0 0 8px #000;
|
||||
|
||||
> .nickname-button {
|
||||
-webkit-backdrop-filter: var(--blur, blur(8px));
|
||||
backdrop-filter: var(--blur, blur(8px));
|
||||
background: rgba(0, 0, 0, 0.2);
|
||||
color: #ccc;
|
||||
font-size: 0.7em;
|
||||
line-height: 1;
|
||||
width: 1.8em;
|
||||
height: 1.8em;
|
||||
border-radius: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
> .bottom {
|
||||
@ -477,10 +451,6 @@ onUnmounted(() => {
|
||||
opacity: 0.8;
|
||||
}
|
||||
}
|
||||
|
||||
> .nickname-button {
|
||||
margin-left: 8px;
|
||||
}
|
||||
}
|
||||
|
||||
> .avatar {
|
||||
@ -759,32 +729,4 @@ onUnmounted(() => {
|
||||
border-radius: var(--radius);
|
||||
overflow: clip;
|
||||
}
|
||||
|
||||
@keyframes keywiggle {
|
||||
0% { transform: translate(-3px,-1px) rotate(-8deg); }
|
||||
5% { transform: translateY(-1px) rotate(-10deg); }
|
||||
10% { transform: translate(1px,-3px) rotate(0); }
|
||||
15% { transform: translate(1px,1px) rotate(11deg); }
|
||||
20% { transform: translate(-2px,1px) rotate(1deg); }
|
||||
25% { transform: translate(-1px,-2px) rotate(-2deg); }
|
||||
30% { transform: translate(-1px,2px) rotate(-3deg); }
|
||||
35% { transform: translate(2px,1px) rotate(6deg); }
|
||||
40% { transform: translate(-2px,-3px) rotate(-9deg); }
|
||||
45% { transform: translateY(-1px) rotate(-12deg); }
|
||||
50% { transform: translate(1px,2px) rotate(10deg); }
|
||||
55% { transform: translateY(-3px) rotate(8deg); }
|
||||
60% { transform: translate(1px,-1px) rotate(8deg); }
|
||||
65% { transform: translateY(-1px) rotate(-7deg); }
|
||||
70% { transform: translate(-1px,-3px) rotate(6deg); }
|
||||
75% { transform: translateY(-2px) rotate(4deg); }
|
||||
80% { transform: translate(-2px,-1px) rotate(3deg); }
|
||||
85% { transform: translate(1px,-3px) rotate(-10deg); }
|
||||
90% { transform: translate(1px) rotate(3deg); }
|
||||
95% { transform: translate(-2px) rotate(-3deg); }
|
||||
to { transform: translate(2px,1px) rotate(2deg); }
|
||||
}
|
||||
|
||||
.animation:hover {
|
||||
animation: keywiggle 1s;
|
||||
}
|
||||
</style>
|
||||
|
@ -1,30 +0,0 @@
|
||||
export function isFfVisibility(i, user):boolean {
|
||||
let checkFlag:boolean;
|
||||
|
||||
switch (user.ffVisibility) {
|
||||
case 'private':
|
||||
checkFlag = false;
|
||||
break;
|
||||
case 'followers':
|
||||
if (!user.isFollowing) {
|
||||
checkFlag = false;
|
||||
break;
|
||||
}
|
||||
// fallthrough
|
||||
default: checkFlag = true;
|
||||
}
|
||||
|
||||
if (!i) {
|
||||
if (checkFlag) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
//自分自身の場合は一律true
|
||||
if (i.id === user.id) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return checkFlag;
|
||||
}
|
11
packages/frontend/src/scripts/isFfVisibleForMe.ts
Normal file
11
packages/frontend/src/scripts/isFfVisibleForMe.ts
Normal file
@ -0,0 +1,11 @@
|
||||
import * as misskey from 'cherrypick-js';
|
||||
import { $i } from '@/account';
|
||||
|
||||
export function isFfVisibleForMe(user: misskey.entities.UserDetailed): boolean {
|
||||
if ($i && $i.id === user.id) return true;
|
||||
|
||||
if (user.ffVisibility === 'private') return false;
|
||||
if (user.ffVisibility === 'followers' && !user.isFollowing) return false;
|
||||
|
||||
return true;
|
||||
}
|
394
pnpm-lock.yaml
394
pnpm-lock.yaml
@ -78,14 +78,14 @@ importers:
|
||||
specifier: 3.360.0
|
||||
version: 3.360.0
|
||||
'@bull-board/api':
|
||||
specifier: 5.6.0
|
||||
version: 5.6.0(@bull-board/ui@5.6.0)
|
||||
specifier: 5.6.1
|
||||
version: 5.6.1(@bull-board/ui@5.6.1)
|
||||
'@bull-board/fastify':
|
||||
specifier: 5.6.0
|
||||
version: 5.6.0
|
||||
specifier: 5.6.1
|
||||
version: 5.6.1
|
||||
'@bull-board/ui':
|
||||
specifier: 5.6.0
|
||||
version: 5.6.0
|
||||
specifier: 5.6.1
|
||||
version: 5.6.1
|
||||
'@discordapp/twemoji':
|
||||
specifier: 14.1.2
|
||||
version: 14.1.2
|
||||
@ -102,8 +102,8 @@ importers:
|
||||
specifier: 9.2.1
|
||||
version: 9.2.1(bufferutil@4.0.7)(utf-8-validate@6.0.3)
|
||||
'@fastify/multipart':
|
||||
specifier: 7.7.0
|
||||
version: 7.7.0
|
||||
specifier: 7.7.1
|
||||
version: 7.7.1
|
||||
'@fastify/static':
|
||||
specifier: 6.10.2
|
||||
version: 6.10.2
|
||||
@ -117,14 +117,14 @@ importers:
|
||||
specifier: ^7.2.1
|
||||
version: 7.2.1
|
||||
'@nestjs/common':
|
||||
specifier: 10.0.5
|
||||
version: 10.0.5(reflect-metadata@0.1.13)(rxjs@7.8.1)
|
||||
specifier: 10.1.0
|
||||
version: 10.1.0(reflect-metadata@0.1.13)(rxjs@7.8.1)
|
||||
'@nestjs/core':
|
||||
specifier: 10.0.5
|
||||
version: 10.0.5(@nestjs/common@10.0.5)(reflect-metadata@0.1.13)(rxjs@7.8.1)
|
||||
specifier: 10.1.0
|
||||
version: 10.1.0(@nestjs/common@10.1.0)(reflect-metadata@0.1.13)(rxjs@7.8.1)
|
||||
'@nestjs/testing':
|
||||
specifier: 10.0.5
|
||||
version: 10.0.5(@nestjs/common@10.0.5)(@nestjs/core@10.0.5)
|
||||
specifier: 10.1.0
|
||||
version: 10.1.0(@nestjs/common@10.1.0)(@nestjs/core@10.1.0)
|
||||
'@peertube/http-signature':
|
||||
specifier: 1.7.0
|
||||
version: 1.7.0
|
||||
@ -133,10 +133,10 @@ importers:
|
||||
version: 10.3.0
|
||||
'@swc/cli':
|
||||
specifier: 0.1.62
|
||||
version: 0.1.62(@swc/core@1.3.69)(chokidar@3.5.3)
|
||||
version: 0.1.62(@swc/core@1.3.70)(chokidar@3.5.3)
|
||||
'@swc/core':
|
||||
specifier: 1.3.69
|
||||
version: 1.3.69
|
||||
specifier: 1.3.70
|
||||
version: 1.3.70
|
||||
'@vitalets/google-translate-api':
|
||||
specifier: 9.2.0
|
||||
version: 9.2.0
|
||||
@ -152,9 +152,6 @@ importers:
|
||||
async-mutex:
|
||||
specifier: ^0.4.0
|
||||
version: 0.4.0
|
||||
autwh:
|
||||
specifier: 0.1.0
|
||||
version: 0.1.0
|
||||
bcryptjs:
|
||||
specifier: 2.4.3
|
||||
version: 2.4.3
|
||||
@ -162,8 +159,8 @@ importers:
|
||||
specifier: 2.0.5
|
||||
version: 2.0.5
|
||||
bullmq:
|
||||
specifier: 4.3.0
|
||||
version: 4.3.0
|
||||
specifier: 4.4.0
|
||||
version: 4.4.0
|
||||
cacheable-lookup:
|
||||
specifier: 7.0.0
|
||||
version: 7.0.0
|
||||
@ -200,12 +197,9 @@ importers:
|
||||
deep-email-validator:
|
||||
specifier: 0.1.21
|
||||
version: 0.1.21
|
||||
escape-regexp:
|
||||
specifier: 0.0.1
|
||||
version: 0.0.1
|
||||
fastify:
|
||||
specifier: 4.19.2
|
||||
version: 4.19.2
|
||||
specifier: 4.20.0
|
||||
version: 4.20.0
|
||||
feed:
|
||||
specifier: 4.2.2
|
||||
version: 4.2.2
|
||||
@ -332,9 +326,6 @@ importers:
|
||||
rxjs:
|
||||
specifier: 7.8.1
|
||||
version: 7.8.1
|
||||
s-age:
|
||||
specifier: 1.1.2
|
||||
version: 1.1.2
|
||||
sanitize-html:
|
||||
specifier: 2.11.0
|
||||
version: 2.11.0
|
||||
@ -361,7 +352,7 @@ importers:
|
||||
version: 7.1.0
|
||||
summaly:
|
||||
specifier: github:misskey-dev/summaly
|
||||
version: github.com/misskey-dev/summaly/77dd5654bb82280b38c1f50e51a771c33f3df503
|
||||
version: github.com/misskey-dev/summaly/089a0ad8e8c780e5c088b1c528aa95c5827cbdcc
|
||||
systeminformation:
|
||||
specifier: 5.18.7
|
||||
version: 5.18.7
|
||||
@ -492,7 +483,7 @@ importers:
|
||||
version: 29.6.1
|
||||
'@swc/jest':
|
||||
specifier: 0.2.26
|
||||
version: 0.2.26(@swc/core@1.3.69)
|
||||
version: 0.2.26(@swc/core@1.3.70)
|
||||
'@types/accepts':
|
||||
specifier: 1.3.5
|
||||
version: 1.3.5
|
||||
@ -511,9 +502,6 @@ importers:
|
||||
'@types/content-disposition':
|
||||
specifier: 0.5.5
|
||||
version: 0.5.5
|
||||
'@types/escape-regexp':
|
||||
specifier: 0.0.1
|
||||
version: 0.0.1
|
||||
'@types/fluent-ffmpeg':
|
||||
specifier: 2.1.21
|
||||
version: 2.1.21
|
||||
@ -568,9 +556,6 @@ importers:
|
||||
'@types/ratelimiter':
|
||||
specifier: 3.4.4
|
||||
version: 3.4.4
|
||||
'@types/redis':
|
||||
specifier: 4.0.11
|
||||
version: 4.0.11
|
||||
'@types/rename':
|
||||
specifier: 1.0.4
|
||||
version: 1.0.4
|
||||
@ -601,9 +586,6 @@ importers:
|
||||
'@types/web-push':
|
||||
specifier: 3.3.2
|
||||
version: 3.3.2
|
||||
'@types/websocket':
|
||||
specifier: 1.0.5
|
||||
version: 1.0.5
|
||||
'@types/ws':
|
||||
specifier: 8.5.5
|
||||
version: 8.5.5
|
||||
@ -639,7 +621,7 @@ importers:
|
||||
dependencies:
|
||||
'@swc/cli':
|
||||
specifier: 0.1.62
|
||||
version: 0.1.62(@swc/core@1.3.69)(chokidar@3.5.3)
|
||||
version: 0.1.62(@swc/core@1.3.70)(chokidar@3.5.3)
|
||||
'@swc/core':
|
||||
specifier: 1.3.69
|
||||
version: 1.3.69
|
||||
@ -697,19 +679,19 @@ importers:
|
||||
version: 14.1.2
|
||||
'@rollup/plugin-alias':
|
||||
specifier: 5.0.0
|
||||
version: 5.0.0(rollup@3.26.2)
|
||||
version: 5.0.0(rollup@3.26.3)
|
||||
'@rollup/plugin-json':
|
||||
specifier: 6.0.0
|
||||
version: 6.0.0(rollup@3.26.2)
|
||||
version: 6.0.0(rollup@3.26.3)
|
||||
'@rollup/plugin-replace':
|
||||
specifier: 5.0.2
|
||||
version: 5.0.2(rollup@3.26.2)
|
||||
version: 5.0.2(rollup@3.26.3)
|
||||
'@rollup/pluginutils':
|
||||
specifier: 5.0.2
|
||||
version: 5.0.2(rollup@3.26.2)
|
||||
version: 5.0.2(rollup@3.26.3)
|
||||
'@syuilo/aiscript':
|
||||
specifier: 0.13.3
|
||||
version: 0.13.3
|
||||
specifier: 0.15.0
|
||||
version: 0.15.0
|
||||
'@tabler/icons-webfont':
|
||||
specifier: 2.25.0
|
||||
version: 2.25.0
|
||||
@ -717,8 +699,8 @@ importers:
|
||||
specifier: 4.2.3
|
||||
version: 4.2.3(vite@4.4.4)(vue@3.3.4)
|
||||
'@vue-macros/reactivity-transform':
|
||||
specifier: 0.3.14
|
||||
version: 0.3.14(rollup@3.26.2)(vue@3.3.4)
|
||||
specifier: 0.3.15
|
||||
version: 0.3.15(rollup@3.26.3)(vue@3.3.4)
|
||||
'@vue/compiler-sfc':
|
||||
specifier: 3.3.4
|
||||
version: 3.3.4
|
||||
@ -816,8 +798,8 @@ importers:
|
||||
specifier: 0.2.1
|
||||
version: 0.2.1
|
||||
rollup:
|
||||
specifier: 3.26.2
|
||||
version: 3.26.2
|
||||
specifier: 3.26.3
|
||||
version: 3.26.3
|
||||
s-age:
|
||||
specifier: 1.1.2
|
||||
version: 1.1.2
|
||||
@ -1052,7 +1034,7 @@ importers:
|
||||
version: github.com/misskey-dev/storybook-addon-misskey-theme/cf583db098365b2ccc81a82f63ca9c93bc32b640(@storybook/blocks@7.0.27)(@storybook/components@7.0.27)(@storybook/core-events@7.0.27)(@storybook/manager-api@7.0.27)(@storybook/preview-api@7.0.27)(@storybook/theming@7.0.27)(@storybook/types@7.0.27)(react-dom@18.2.0)(react@18.2.0)
|
||||
summaly:
|
||||
specifier: github:misskey-dev/summaly
|
||||
version: github.com/misskey-dev/summaly/77dd5654bb82280b38c1f50e51a771c33f3df503
|
||||
version: github.com/misskey-dev/summaly/089a0ad8e8c780e5c088b1c528aa95c5827cbdcc
|
||||
vite-plugin-turbosnap:
|
||||
specifier: 1.0.2
|
||||
version: 1.0.2
|
||||
@ -4099,29 +4081,29 @@ packages:
|
||||
resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==}
|
||||
dev: true
|
||||
|
||||
/@bull-board/api@5.6.0(@bull-board/ui@5.6.0):
|
||||
resolution: {integrity: sha512-a2O15p5oEm+/E/0I2l2nE2NKK0dkgNNTaamu+0gGyfUxWoCS3fCGX6LLEyl3jgOz0IC3GKRnwtVgbZFzk42sGQ==}
|
||||
/@bull-board/api@5.6.1(@bull-board/ui@5.6.1):
|
||||
resolution: {integrity: sha512-iq+VpvCt7v2kYCtapDDmgHFyTyHiCbJkSeYbgIDtMIspXfsKxz0ZWKsqaY/VOCRE26jAX2asK17S2XSrANEU0A==}
|
||||
peerDependencies:
|
||||
'@bull-board/ui': 5.6.0
|
||||
'@bull-board/ui': 5.6.1
|
||||
dependencies:
|
||||
'@bull-board/ui': 5.6.0
|
||||
'@bull-board/ui': 5.6.1
|
||||
redis-info: 3.1.0
|
||||
dev: false
|
||||
|
||||
/@bull-board/fastify@5.6.0:
|
||||
resolution: {integrity: sha512-JIGSrNxRko2cc4KTcU1Pp1iROKuAZGi2aLCx87nlgjmdtK51qbBfpDCsNEEc4ZspdddBKvaTUu67/3/n+3J67w==}
|
||||
/@bull-board/fastify@5.6.1:
|
||||
resolution: {integrity: sha512-Gh7dWtGN13nrQ2AL+Hx+cz9hEy9IPlBYUmhP6aIpA5s1eMjQnwhAHSURt0dSaGIyp7rvU7hj1zFx4rcKHeaSXA==}
|
||||
dependencies:
|
||||
'@bull-board/api': 5.6.0(@bull-board/ui@5.6.0)
|
||||
'@bull-board/ui': 5.6.0
|
||||
'@bull-board/api': 5.6.1(@bull-board/ui@5.6.1)
|
||||
'@bull-board/ui': 5.6.1
|
||||
'@fastify/static': 6.10.2
|
||||
'@fastify/view': 7.4.1
|
||||
ejs: 3.1.8
|
||||
dev: false
|
||||
|
||||
/@bull-board/ui@5.6.0:
|
||||
resolution: {integrity: sha512-mc9T+kijDX5ZJMJCzeKPk9uLfOtcuefdDLPqWi961EiiNKfkDex+Gh41DAfcyrNjYsAkBsphvgBgcvundHPGIw==}
|
||||
/@bull-board/ui@5.6.1:
|
||||
resolution: {integrity: sha512-cy4fEXxOBHR5+3Ez3bfax+Cd2TUTPyuSYRyQWL0WIwd3bivn/3zov9IThcnHu1YmJ8rjmUNoMHz7JIDXwUg8zg==}
|
||||
dependencies:
|
||||
'@bull-board/api': 5.6.0(@bull-board/ui@5.6.0)
|
||||
'@bull-board/api': 5.6.1(@bull-board/ui@5.6.1)
|
||||
dev: false
|
||||
|
||||
/@canvas/image-data@1.0.0:
|
||||
@ -4770,8 +4752,8 @@ packages:
|
||||
- utf-8-validate
|
||||
dev: false
|
||||
|
||||
/@fastify/multipart@7.7.0:
|
||||
resolution: {integrity: sha512-lE5v6+MVbLYmPL8yUHrvyezEOLQbZulEPL8itwGqPbNxL2pWdAN1HWEZ7f3VdwyR6wmQdOcpfZ0zdCU4BbWKzw==}
|
||||
/@fastify/multipart@7.7.1:
|
||||
resolution: {integrity: sha512-D2S6XH8pbQj0GxfSP10G/MaQye3UACVNUH/D4ssw3ne9pcQ4DSKqojVIGcwa5XI7pdR91gXRHSWXFx8koCzBlg==}
|
||||
dependencies:
|
||||
'@fastify/busboy': 1.1.0
|
||||
'@fastify/deepmerge': 1.3.0
|
||||
@ -5508,8 +5490,8 @@ packages:
|
||||
tar-fs: 2.1.1
|
||||
dev: true
|
||||
|
||||
/@nestjs/common@10.0.5(reflect-metadata@0.1.13)(rxjs@7.8.1):
|
||||
resolution: {integrity: sha512-0E+SBI+SKswXbFG+Nwtnctrei5dvdFJ7b9/fQDL6KzDBtZwsglJpD86S3ooxnc7ek4vRG57oN2iLmMTjrcesMg==}
|
||||
/@nestjs/common@10.1.0(reflect-metadata@0.1.13)(rxjs@7.8.1):
|
||||
resolution: {integrity: sha512-3GNOuDjeAqEVt5Zjia3ZSK55Jg80hIIkq52BOzU+LkCjFgbuEhDot80lCKu05WyntAMAq5wREoDRGEGlSVxENw==}
|
||||
peerDependencies:
|
||||
class-transformer: '*'
|
||||
class-validator: '*'
|
||||
@ -5528,8 +5510,8 @@ packages:
|
||||
uid: 2.0.2
|
||||
dev: false
|
||||
|
||||
/@nestjs/core@10.0.5(@nestjs/common@10.0.5)(reflect-metadata@0.1.13)(rxjs@7.8.1):
|
||||
resolution: {integrity: sha512-9A8nixBfE33TWAmmWvNoxdmHrRmHJY0oO3O4Iue0FVkawWJc0YOhSqdNs87McwvKE4InJMI7GVv01NYMEROdPA==}
|
||||
/@nestjs/core@10.1.0(@nestjs/common@10.1.0)(reflect-metadata@0.1.13)(rxjs@7.8.1):
|
||||
resolution: {integrity: sha512-3ogHxrRAktQZNBSV709QxhNJQPsVInZRqxAK2fV7JDnfoBMu1lM3xI7cO498iViqq5xme3o/46+AdfjW9W2E2A==}
|
||||
requiresBuild: true
|
||||
peerDependencies:
|
||||
'@nestjs/common': ^10.0.0
|
||||
@ -5546,7 +5528,7 @@ packages:
|
||||
'@nestjs/websockets':
|
||||
optional: true
|
||||
dependencies:
|
||||
'@nestjs/common': 10.0.5(reflect-metadata@0.1.13)(rxjs@7.8.1)
|
||||
'@nestjs/common': 10.1.0(reflect-metadata@0.1.13)(rxjs@7.8.1)
|
||||
'@nuxtjs/opencollective': 0.3.2
|
||||
fast-safe-stringify: 2.1.1
|
||||
iterare: 1.2.1
|
||||
@ -5559,8 +5541,8 @@ packages:
|
||||
- encoding
|
||||
dev: false
|
||||
|
||||
/@nestjs/testing@10.0.5(@nestjs/common@10.0.5)(@nestjs/core@10.0.5):
|
||||
resolution: {integrity: sha512-TQcFOxR+kIibMbYg71yajic3289/Iw7B5LliYiZ4Pz36BZvU0TRMYqpxaGAlX/Srk0BCpP99ZHoofm8dqZKmxw==}
|
||||
/@nestjs/testing@10.1.0(@nestjs/common@10.1.0)(@nestjs/core@10.1.0):
|
||||
resolution: {integrity: sha512-TqV/21PuU5GJ543oqLTrmQhWUiWwB7DDRcj5cknUdaOst+Kkwp0Sad3/5svcWgOB+QfFbwYlvIDeCkKJshZzPg==}
|
||||
peerDependencies:
|
||||
'@nestjs/common': ^10.0.0
|
||||
'@nestjs/core': ^10.0.0
|
||||
@ -5572,8 +5554,8 @@ packages:
|
||||
'@nestjs/platform-express':
|
||||
optional: true
|
||||
dependencies:
|
||||
'@nestjs/common': 10.0.5(reflect-metadata@0.1.13)(rxjs@7.8.1)
|
||||
'@nestjs/core': 10.0.5(@nestjs/common@10.0.5)(reflect-metadata@0.1.13)(rxjs@7.8.1)
|
||||
'@nestjs/common': 10.1.0(reflect-metadata@0.1.13)(rxjs@7.8.1)
|
||||
'@nestjs/core': 10.1.0(@nestjs/common@10.1.0)(reflect-metadata@0.1.13)(rxjs@7.8.1)
|
||||
tslib: 2.6.0
|
||||
dev: false
|
||||
|
||||
@ -5695,56 +5677,7 @@ packages:
|
||||
resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==}
|
||||
dev: false
|
||||
|
||||
/@redis/bloom@1.1.0(@redis/client@1.4.2):
|
||||
resolution: {integrity: sha512-9QovlxmpRtvxVbN0UBcv8WfdSMudNZZTFqCsnBszcQXqaZb/TVe30ScgGEO7u1EAIacTPAo7/oCYjYAxiHLanQ==}
|
||||
peerDependencies:
|
||||
'@redis/client': ^1.0.0
|
||||
dependencies:
|
||||
'@redis/client': 1.4.2
|
||||
dev: true
|
||||
|
||||
/@redis/client@1.4.2:
|
||||
resolution: {integrity: sha512-oUdEjE0I7JS5AyaAjkD3aOXn9NhO7XKyPyXEyrgFDu++VrVBHUPnV6dgEya9TcMuj5nIJRuCzCm8ZP+c9zCHPw==}
|
||||
engines: {node: '>=14'}
|
||||
dependencies:
|
||||
cluster-key-slot: 1.1.1
|
||||
generic-pool: 3.9.0
|
||||
yallist: 4.0.0
|
||||
dev: true
|
||||
|
||||
/@redis/graph@1.1.0(@redis/client@1.4.2):
|
||||
resolution: {integrity: sha512-16yZWngxyXPd+MJxeSr0dqh2AIOi8j9yXKcKCwVaKDbH3HTuETpDVPcLujhFYVPtYrngSco31BUcSa9TH31Gqg==}
|
||||
peerDependencies:
|
||||
'@redis/client': ^1.0.0
|
||||
dependencies:
|
||||
'@redis/client': 1.4.2
|
||||
dev: true
|
||||
|
||||
/@redis/json@1.0.4(@redis/client@1.4.2):
|
||||
resolution: {integrity: sha512-LUZE2Gdrhg0Rx7AN+cZkb1e6HjoSKaeeW8rYnt89Tly13GBI5eP4CwDVr+MY8BAYfCg4/N15OUrtLoona9uSgw==}
|
||||
peerDependencies:
|
||||
'@redis/client': ^1.0.0
|
||||
dependencies:
|
||||
'@redis/client': 1.4.2
|
||||
dev: true
|
||||
|
||||
/@redis/search@1.1.0(@redis/client@1.4.2):
|
||||
resolution: {integrity: sha512-NyFZEVnxIJEybpy+YskjgOJRNsfTYqaPbK/Buv6W2kmFNaRk85JiqjJZA5QkRmWvGbyQYwoO5QfDi2wHskKrQQ==}
|
||||
peerDependencies:
|
||||
'@redis/client': ^1.0.0
|
||||
dependencies:
|
||||
'@redis/client': 1.4.2
|
||||
dev: true
|
||||
|
||||
/@redis/time-series@1.0.4(@redis/client@1.4.2):
|
||||
resolution: {integrity: sha512-ThUIgo2U/g7cCuZavucQTQzA9g9JbDDY2f64u3AbAoz/8vE2lt2U37LamDUVChhaDA3IRT9R6VvJwqnUfTJzng==}
|
||||
peerDependencies:
|
||||
'@redis/client': ^1.0.0
|
||||
dependencies:
|
||||
'@redis/client': 1.4.2
|
||||
dev: true
|
||||
|
||||
/@rollup/plugin-alias@5.0.0(rollup@3.26.2):
|
||||
/@rollup/plugin-alias@5.0.0(rollup@3.26.3):
|
||||
resolution: {integrity: sha512-l9hY5chSCjuFRPsnRm16twWBiSApl2uYFLsepQYwtBuAxNMQ/1dJqADld40P0Jkqm65GRTLy/AC6hnpVebtLsA==}
|
||||
engines: {node: '>=14.0.0'}
|
||||
peerDependencies:
|
||||
@ -5753,11 +5686,11 @@ packages:
|
||||
rollup:
|
||||
optional: true
|
||||
dependencies:
|
||||
rollup: 3.26.2
|
||||
rollup: 3.26.3
|
||||
slash: 4.0.0
|
||||
dev: false
|
||||
|
||||
/@rollup/plugin-json@6.0.0(rollup@3.26.2):
|
||||
/@rollup/plugin-json@6.0.0(rollup@3.26.3):
|
||||
resolution: {integrity: sha512-i/4C5Jrdr1XUarRhVu27EEwjt4GObltD7c+MkCIpO2QIbojw8MUs+CCTqOphQi3Qtg1FLmYt+l+6YeoIf51J7w==}
|
||||
engines: {node: '>=14.0.0'}
|
||||
peerDependencies:
|
||||
@ -5766,11 +5699,11 @@ packages:
|
||||
rollup:
|
||||
optional: true
|
||||
dependencies:
|
||||
'@rollup/pluginutils': 5.0.2(rollup@3.26.2)
|
||||
rollup: 3.26.2
|
||||
'@rollup/pluginutils': 5.0.2(rollup@3.26.3)
|
||||
rollup: 3.26.3
|
||||
dev: false
|
||||
|
||||
/@rollup/plugin-replace@5.0.2(rollup@3.26.2):
|
||||
/@rollup/plugin-replace@5.0.2(rollup@3.26.3):
|
||||
resolution: {integrity: sha512-M9YXNekv/C/iHHK+cvORzfRYfPbq0RDD8r0G+bMiTXjNGKulPnCT9O3Ss46WfhI6ZOCgApOP7xAdmCQJ+U2LAA==}
|
||||
engines: {node: '>=14.0.0'}
|
||||
peerDependencies:
|
||||
@ -5779,9 +5712,9 @@ packages:
|
||||
rollup:
|
||||
optional: true
|
||||
dependencies:
|
||||
'@rollup/pluginutils': 5.0.2(rollup@3.26.2)
|
||||
'@rollup/pluginutils': 5.0.2(rollup@3.26.3)
|
||||
magic-string: 0.27.0
|
||||
rollup: 3.26.2
|
||||
rollup: 3.26.3
|
||||
dev: false
|
||||
|
||||
/@rollup/pluginutils@4.2.1:
|
||||
@ -5792,7 +5725,7 @@ packages:
|
||||
picomatch: 2.3.1
|
||||
dev: true
|
||||
|
||||
/@rollup/pluginutils@5.0.2(rollup@3.26.2):
|
||||
/@rollup/pluginutils@5.0.2(rollup@3.26.3):
|
||||
resolution: {integrity: sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==}
|
||||
engines: {node: '>=14.0.0'}
|
||||
peerDependencies:
|
||||
@ -5804,7 +5737,7 @@ packages:
|
||||
'@types/estree': 1.0.1
|
||||
estree-walker: 2.0.2
|
||||
picomatch: 2.3.1
|
||||
rollup: 3.26.2
|
||||
rollup: 3.26.3
|
||||
dev: false
|
||||
|
||||
/@rushstack/node-core-library@3.59.5(@types/node@20.4.2):
|
||||
@ -6729,7 +6662,7 @@ packages:
|
||||
magic-string: 0.27.0
|
||||
remark-external-links: 8.0.0
|
||||
remark-slug: 6.1.0
|
||||
rollup: 3.26.2
|
||||
rollup: 3.26.3
|
||||
typescript: 5.1.6
|
||||
vite: 4.4.4(@types/node@20.4.2)(sass@1.63.6)
|
||||
transitivePeerDependencies:
|
||||
@ -7359,7 +7292,7 @@ packages:
|
||||
- supports-color
|
||||
dev: true
|
||||
|
||||
/@swc/cli@0.1.62(@swc/core@1.3.69)(chokidar@3.5.3):
|
||||
/@swc/cli@0.1.62(@swc/core@1.3.70)(chokidar@3.5.3):
|
||||
resolution: {integrity: sha512-kOFLjKY3XH1DWLfXL1/B5MizeNorHR8wHKEi92S/Zi9Md/AK17KSqR8MgyRJ6C1fhKHvbBCl8wboyKAFXStkYw==}
|
||||
engines: {node: '>= 12.13'}
|
||||
hasBin: true
|
||||
@ -7371,7 +7304,7 @@ packages:
|
||||
optional: true
|
||||
dependencies:
|
||||
'@mole-inc/bin-wrapper': 8.0.1
|
||||
'@swc/core': 1.3.69
|
||||
'@swc/core': 1.3.70
|
||||
chokidar: 3.5.3
|
||||
commander: 7.2.0
|
||||
fast-glob: 3.2.12
|
||||
@ -7408,6 +7341,14 @@ packages:
|
||||
requiresBuild: true
|
||||
optional: true
|
||||
|
||||
/@swc/core-darwin-arm64@1.3.70:
|
||||
resolution: {integrity: sha512-31+mcl0dgdRHvZRjhLOK9V6B+qJ7nxDZYINr9pBlqGWxknz37Vld5KK19Kpr79r0dXUZvaaelLjCnJk9dA2PcQ==}
|
||||
engines: {node: '>=10'}
|
||||
cpu: [arm64]
|
||||
os: [darwin]
|
||||
requiresBuild: true
|
||||
optional: true
|
||||
|
||||
/@swc/core-darwin-x64@1.3.56:
|
||||
resolution: {integrity: sha512-VH5saqYFasdRXJy6RAT+MXm0+IjkMZvOkohJwUei+oA65cKJofQwrJ1jZro8yOJFYvUSI3jgNRGsdBkmo/4hMw==}
|
||||
engines: {node: '>=10'}
|
||||
@ -7425,6 +7366,14 @@ packages:
|
||||
requiresBuild: true
|
||||
optional: true
|
||||
|
||||
/@swc/core-darwin-x64@1.3.70:
|
||||
resolution: {integrity: sha512-GMFJ65E18zQC80t0os+TZvI+8lbRuitncWVge/RXmXbVLPRcdykP4EJ87cqzcG5Ah0z18/E0T+ixD6jHRisrYQ==}
|
||||
engines: {node: '>=10'}
|
||||
cpu: [x64]
|
||||
os: [darwin]
|
||||
requiresBuild: true
|
||||
optional: true
|
||||
|
||||
/@swc/core-linux-arm-gnueabihf@1.3.56:
|
||||
resolution: {integrity: sha512-LWwPo6NnJkH01+ukqvkoNIOpMdw+Zundm4vBeicwyVrkP+mC3kwVfi03TUFpQUz3kRKdw/QEnxGTj+MouCPbtw==}
|
||||
engines: {node: '>=10'}
|
||||
@ -7442,6 +7391,14 @@ packages:
|
||||
requiresBuild: true
|
||||
optional: true
|
||||
|
||||
/@swc/core-linux-arm-gnueabihf@1.3.70:
|
||||
resolution: {integrity: sha512-wjhCwS8LCiAq2VedF1b4Bryyw68xZnfMED4pLRazAl8BaUlDFANfRBORNunxlfHQj4V3x39IaiLgCZRHMdzXBg==}
|
||||
engines: {node: '>=10'}
|
||||
cpu: [arm]
|
||||
os: [linux]
|
||||
requiresBuild: true
|
||||
optional: true
|
||||
|
||||
/@swc/core-linux-arm64-gnu@1.3.56:
|
||||
resolution: {integrity: sha512-GzsUy/4egJ4cMlxbM+Ub7AMi5CKAc+pxBxrh8MUPQbyStW8jGgnQsJouTnGy0LHawtdEnsCOl6PcO6OgvktXuQ==}
|
||||
engines: {node: '>=10'}
|
||||
@ -7459,6 +7416,14 @@ packages:
|
||||
requiresBuild: true
|
||||
optional: true
|
||||
|
||||
/@swc/core-linux-arm64-gnu@1.3.70:
|
||||
resolution: {integrity: sha512-9D/Rx67cAOnMiexvCqARxvhj7coRajTp5HlJHuf+rfwMqI2hLhpO9/pBMQxBUAWxODO/ksQ/OF+GJRjmtWw/2A==}
|
||||
engines: {node: '>=10'}
|
||||
cpu: [arm64]
|
||||
os: [linux]
|
||||
requiresBuild: true
|
||||
optional: true
|
||||
|
||||
/@swc/core-linux-arm64-musl@1.3.56:
|
||||
resolution: {integrity: sha512-9gxL09BIiAv8zY0DjfnFf19bo8+P4T9tdhzPwcm+1yPJcY5yr1+YFWLNFzz01agtOj6VlZ2/wUJTaOfdjjtc+A==}
|
||||
engines: {node: '>=10'}
|
||||
@ -7476,6 +7441,14 @@ packages:
|
||||
requiresBuild: true
|
||||
optional: true
|
||||
|
||||
/@swc/core-linux-arm64-musl@1.3.70:
|
||||
resolution: {integrity: sha512-gkjxBio7XD+1GlQVVyPP/qeFkLu83VhRHXaUrkNYpr5UZG9zZurBERT9nkS6Y+ouYh+Q9xmw57aIyd2KvD2zqQ==}
|
||||
engines: {node: '>=10'}
|
||||
cpu: [arm64]
|
||||
os: [linux]
|
||||
requiresBuild: true
|
||||
optional: true
|
||||
|
||||
/@swc/core-linux-x64-gnu@1.3.56:
|
||||
resolution: {integrity: sha512-n0ORNknl50vMRkll3BDO1E4WOqY6iISlPV1ZQCRLWQ6YQ2q8/WAryBxc2OAybcGHBUFkxyACpJukeU1QZ/9tNw==}
|
||||
engines: {node: '>=10'}
|
||||
@ -7493,6 +7466,14 @@ packages:
|
||||
requiresBuild: true
|
||||
optional: true
|
||||
|
||||
/@swc/core-linux-x64-gnu@1.3.70:
|
||||
resolution: {integrity: sha512-/nCly+V4xfMVwfEUoLLAukxUSot/RcSzsf6GdsGTjFcrp5sZIntAjokYRytm3VT1c2TK321AfBorsi9R5w8Y7Q==}
|
||||
engines: {node: '>=10'}
|
||||
cpu: [x64]
|
||||
os: [linux]
|
||||
requiresBuild: true
|
||||
optional: true
|
||||
|
||||
/@swc/core-linux-x64-musl@1.3.56:
|
||||
resolution: {integrity: sha512-r+D34WLAOAlJtfw1gaVWpHRwCncU9nzW9i7w9kSw4HpWYnHJOz54jLGSEmNsrhdTCz1VK2ar+V2ktFUsrlGlDA==}
|
||||
engines: {node: '>=10'}
|
||||
@ -7510,6 +7491,14 @@ packages:
|
||||
requiresBuild: true
|
||||
optional: true
|
||||
|
||||
/@swc/core-linux-x64-musl@1.3.70:
|
||||
resolution: {integrity: sha512-HoOsPJbt361KGKaivAK0qIiYARkhzlxeAfvF5NlnKxkIMOZpQ46Lwj3tR0VWohKbrhS+cYKFlVuDi5XnDkx0XA==}
|
||||
engines: {node: '>=10'}
|
||||
cpu: [x64]
|
||||
os: [linux]
|
||||
requiresBuild: true
|
||||
optional: true
|
||||
|
||||
/@swc/core-win32-arm64-msvc@1.3.56:
|
||||
resolution: {integrity: sha512-29Yt75Is6X24z3x8h/xZC1HnDPkPpyLH9mDQiM6Cuc0I9mVr1XSriPEUB2N/awf5IE4SA8c+3IVq1DtKWbkJIw==}
|
||||
engines: {node: '>=10'}
|
||||
@ -7527,6 +7516,14 @@ packages:
|
||||
requiresBuild: true
|
||||
optional: true
|
||||
|
||||
/@swc/core-win32-arm64-msvc@1.3.70:
|
||||
resolution: {integrity: sha512-hm4IBK/IaRil+aj1cWU6f0GyAdHpw/Jr5nyFYLM2c/tt7w2t5hgb8NjzM2iM84lOClrig1fG6edj2vCF1dFzNQ==}
|
||||
engines: {node: '>=10'}
|
||||
cpu: [arm64]
|
||||
os: [win32]
|
||||
requiresBuild: true
|
||||
optional: true
|
||||
|
||||
/@swc/core-win32-ia32-msvc@1.3.56:
|
||||
resolution: {integrity: sha512-mplp0zbYDrcHtfvkniXlXdB04e2qIjz2Gq/XHKr4Rnc6xVORJjjXF91IemXKpavx2oZYJws+LNJL7UFQ8jyCdQ==}
|
||||
engines: {node: '>=10'}
|
||||
@ -7544,6 +7541,14 @@ packages:
|
||||
requiresBuild: true
|
||||
optional: true
|
||||
|
||||
/@swc/core-win32-ia32-msvc@1.3.70:
|
||||
resolution: {integrity: sha512-5cgKUKIT/9Fp5fCA+zIjYCQ4dSvjFYOeWGZR3QiTXGkC4bGa1Ji9SEPyeIAX0iruUnKjYaZB9RvHK2tNn7RLrQ==}
|
||||
engines: {node: '>=10'}
|
||||
cpu: [ia32]
|
||||
os: [win32]
|
||||
requiresBuild: true
|
||||
optional: true
|
||||
|
||||
/@swc/core-win32-x64-msvc@1.3.56:
|
||||
resolution: {integrity: sha512-zp8MBnrw/bjdLenO/ifYzHrImSjKunqL0C2IF4LXYNRfcbYFh2NwobsVQMZ20IT0474lKRdlP8Oxdt+bHuXrzA==}
|
||||
engines: {node: '>=10'}
|
||||
@ -7561,6 +7566,14 @@ packages:
|
||||
requiresBuild: true
|
||||
optional: true
|
||||
|
||||
/@swc/core-win32-x64-msvc@1.3.70:
|
||||
resolution: {integrity: sha512-LE8lW46+TQBzVkn2mHBlk8DIElPIZ2dO5P8AbJiARNBAnlqQWu67l9gWM89UiZ2l33J2cI37pHzON3tKnT8f9g==}
|
||||
engines: {node: '>=10'}
|
||||
cpu: [x64]
|
||||
os: [win32]
|
||||
requiresBuild: true
|
||||
optional: true
|
||||
|
||||
/@swc/core@1.3.69:
|
||||
resolution: {integrity: sha512-Khc/DE9D5+2tYTHgAIp5DZARbs8kldWg3b0Jp6l8FQLjelcLFmlQWSwKhVZrgv4oIbgZydIp8jInsvTalMHqnQ==}
|
||||
engines: {node: '>=10'}
|
||||
@ -7582,6 +7595,27 @@ packages:
|
||||
'@swc/core-win32-ia32-msvc': 1.3.69
|
||||
'@swc/core-win32-x64-msvc': 1.3.69
|
||||
|
||||
/@swc/core@1.3.70:
|
||||
resolution: {integrity: sha512-LWVWlEDLlOD25PvA2NEz41UzdwXnlDyBiZbe69s3zM0DfCPwZXLUm79uSqH9ItsOjTrXSL5/1+XUL6C/BZwChA==}
|
||||
engines: {node: '>=10'}
|
||||
requiresBuild: true
|
||||
peerDependencies:
|
||||
'@swc/helpers': ^0.5.0
|
||||
peerDependenciesMeta:
|
||||
'@swc/helpers':
|
||||
optional: true
|
||||
optionalDependencies:
|
||||
'@swc/core-darwin-arm64': 1.3.70
|
||||
'@swc/core-darwin-x64': 1.3.70
|
||||
'@swc/core-linux-arm-gnueabihf': 1.3.70
|
||||
'@swc/core-linux-arm64-gnu': 1.3.70
|
||||
'@swc/core-linux-arm64-musl': 1.3.70
|
||||
'@swc/core-linux-x64-gnu': 1.3.70
|
||||
'@swc/core-linux-x64-musl': 1.3.70
|
||||
'@swc/core-win32-arm64-msvc': 1.3.70
|
||||
'@swc/core-win32-ia32-msvc': 1.3.70
|
||||
'@swc/core-win32-x64-msvc': 1.3.70
|
||||
|
||||
/@swc/jest@0.2.26(@swc/core@1.3.69):
|
||||
resolution: {integrity: sha512-7lAi7q7ShTO3E5Gt1Xqf3pIhRbERxR1DUxvtVa9WKzIB+HGQ7wZP5sYx86zqnaEoKKGhmOoZ7gyW0IRu8Br5+A==}
|
||||
engines: {npm: '>= 7.0.0'}
|
||||
@ -7593,14 +7627,25 @@ packages:
|
||||
jsonc-parser: 3.2.0
|
||||
dev: true
|
||||
|
||||
/@swc/jest@0.2.26(@swc/core@1.3.70):
|
||||
resolution: {integrity: sha512-7lAi7q7ShTO3E5Gt1Xqf3pIhRbERxR1DUxvtVa9WKzIB+HGQ7wZP5sYx86zqnaEoKKGhmOoZ7gyW0IRu8Br5+A==}
|
||||
engines: {npm: '>= 7.0.0'}
|
||||
peerDependencies:
|
||||
'@swc/core': '*'
|
||||
dependencies:
|
||||
'@jest/create-cache-key-function': 27.5.1
|
||||
'@swc/core': 1.3.70
|
||||
jsonc-parser: 3.2.0
|
||||
dev: true
|
||||
|
||||
/@swc/wasm@1.2.130:
|
||||
resolution: {integrity: sha512-rNcJsBxS70+pv8YUWwf5fRlWX6JoY/HJc25HD/F8m6Kv7XhJdqPPMhyX6TKkUBPAG7TWlZYoxa+rHAjPy4Cj3Q==}
|
||||
requiresBuild: true
|
||||
dev: false
|
||||
optional: true
|
||||
|
||||
/@syuilo/aiscript@0.13.3:
|
||||
resolution: {integrity: sha512-0YFlWA+7YhyRRsp+9Nl72SoSUg5ghskthjCdLvj4qdGyLedeyanKZWJlH2A9d47Nes03UYY8CRDsMHHv64IWcg==}
|
||||
/@syuilo/aiscript@0.15.0:
|
||||
resolution: {integrity: sha512-vauMbqacuHufE4W7bAm5BDWlci3mWg1ZaerPNHKBMrRXDjEfvBkBGZNXKSWvi+zmhiYAbWyozPIlV6byttYpCw==}
|
||||
dependencies:
|
||||
autobind-decorator: 2.4.0
|
||||
seedrandom: 3.0.5
|
||||
@ -8307,12 +8352,6 @@ packages:
|
||||
'@types/node': 20.4.2
|
||||
dev: true
|
||||
|
||||
/@types/redis@4.0.11:
|
||||
resolution: {integrity: sha512-bI+gth8La8Wg/QCR1+V1fhrL9+LZUSWfcqpOj2Kc80ZQ4ffbdL173vQd5wovmoV9i071FU9oP2g6etLuEwb6Rg==}
|
||||
dependencies:
|
||||
redis: 4.5.1
|
||||
dev: true
|
||||
|
||||
/@types/rename@1.0.4:
|
||||
resolution: {integrity: sha512-eV81+6bVv2mdCBahkMefjEUwAjKDAP3AuyhqWCWRxcRaeVdUeHUBaoq2zSz+5HNHF2jzTajMcfLvJsy4K3cbwA==}
|
||||
dev: true
|
||||
@ -8752,7 +8791,7 @@ packages:
|
||||
'@volar/language-core': 1.9.0
|
||||
dev: true
|
||||
|
||||
/@vue-macros/common@1.5.0(rollup@3.26.2)(vue@3.3.4):
|
||||
/@vue-macros/common@1.5.0(rollup@3.26.3)(vue@3.3.4):
|
||||
resolution: {integrity: sha512-/Xtmxigolh4NwyLQfrBv+8PAIhlB3doBH7JcA0WuSMmi5LzGOK3YzDCp5jMzpXB6OoUGmm1ZaDkJcBsEmijFPw==}
|
||||
engines: {node: '>=16.14.0'}
|
||||
peerDependencies:
|
||||
@ -8762,9 +8801,9 @@ packages:
|
||||
optional: true
|
||||
dependencies:
|
||||
'@babel/types': 7.22.5
|
||||
'@rollup/pluginutils': 5.0.2(rollup@3.26.2)
|
||||
'@rollup/pluginutils': 5.0.2(rollup@3.26.3)
|
||||
'@vue/compiler-sfc': 3.3.4
|
||||
ast-kit: 0.6.9(rollup@3.26.2)
|
||||
ast-kit: 0.6.9(rollup@3.26.3)
|
||||
local-pkg: 0.4.3
|
||||
magic-string-ast: 0.1.3
|
||||
vue: 3.3.4
|
||||
@ -8772,14 +8811,14 @@ packages:
|
||||
- rollup
|
||||
dev: false
|
||||
|
||||
/@vue-macros/reactivity-transform@0.3.14(rollup@3.26.2)(vue@3.3.4):
|
||||
resolution: {integrity: sha512-JiC09q/qlj69hLJ20zNFTlI8y45NwMe1bmC6IIr4FJ1/6uth/U9SE/zcVG0TLnAaykiRaU7OMU4qI0wQx8e3OA==}
|
||||
/@vue-macros/reactivity-transform@0.3.15(rollup@3.26.3)(vue@3.3.4):
|
||||
resolution: {integrity: sha512-gDer+sjmKX2wxHNR/epv6RolmRwVuMszoaQ5bZEivrE9LLVEoQwy9RGYVtGR5sAzvSJ2wokb4beHh7f8+l6Rbw==}
|
||||
engines: {node: '>=16.14.0'}
|
||||
peerDependencies:
|
||||
vue: ^2.7.0 || ^3.2.25
|
||||
dependencies:
|
||||
'@babel/parser': 7.22.7
|
||||
'@vue-macros/common': 1.5.0(rollup@3.26.2)(vue@3.3.4)
|
||||
'@vue-macros/common': 1.5.0(rollup@3.26.3)(vue@3.3.4)
|
||||
'@vue/compiler-core': 3.3.4
|
||||
'@vue/shared': 3.3.4
|
||||
magic-string: 0.30.1
|
||||
@ -9423,12 +9462,12 @@ packages:
|
||||
engines: {node: '>=0.10.0'}
|
||||
dev: false
|
||||
|
||||
/ast-kit@0.6.9(rollup@3.26.2):
|
||||
/ast-kit@0.6.9(rollup@3.26.3):
|
||||
resolution: {integrity: sha512-2XZi+wqlluYQcxJ1G8qE/U0IeO5CbxUyv1lnSdD7ByJtd5Z3+1063Q6IHbRaYkka1Kb6WgGqEkBrSMaBtbHuFQ==}
|
||||
engines: {node: '>=16.14.0'}
|
||||
dependencies:
|
||||
'@babel/parser': 7.22.7
|
||||
'@rollup/pluginutils': 5.0.2(rollup@3.26.2)
|
||||
'@rollup/pluginutils': 5.0.2(rollup@3.26.3)
|
||||
pathe: 1.1.1
|
||||
transitivePeerDependencies:
|
||||
- rollup
|
||||
@ -9533,12 +9572,6 @@ packages:
|
||||
resolution: {integrity: sha512-f86EjiUKE6Xvczc4ioP1JBlWG7FKrE13qe/DxBCpe8GCipCq2nFw73aO8QEBKHfSbYGDN5eB9jXWKen7tspDqQ==}
|
||||
dev: false
|
||||
|
||||
/autwh@0.1.0:
|
||||
resolution: {integrity: sha512-IkGZ4kjVlZMkEmDiVtZpGG3lDGHPqsMBIh4IpQKN7idYOJ5EGedqKPO+ychNqh8zrJEEqYsN0NcBkcmoE2uFAw==}
|
||||
dependencies:
|
||||
oauth: 0.9.15
|
||||
dev: false
|
||||
|
||||
/available-typed-arrays@1.0.5:
|
||||
resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==}
|
||||
engines: {node: '>= 0.4'}
|
||||
@ -10047,8 +10080,8 @@ packages:
|
||||
dependencies:
|
||||
node-gyp-build: 4.6.0
|
||||
|
||||
/bullmq@4.3.0:
|
||||
resolution: {integrity: sha512-0icxNkg1JqS44wnAQW27iNVG6hH0Cfx1XeXBoeZPfWKyqqJgePDbljk0o8iYyTgK/J2I38NGyN7MTGHCnOFVyQ==}
|
||||
/bullmq@4.4.0:
|
||||
resolution: {integrity: sha512-2fpKxT9wQUTaOfAxaVXztYM3krvngi91lG340jz0rHcKADbkl1sSqzELystXFbormW98lhfWo6V72Cqs84biPA==}
|
||||
dependencies:
|
||||
cron-parser: 4.8.1
|
||||
glob: 8.1.0
|
||||
@ -10619,11 +10652,6 @@ packages:
|
||||
readable-stream: 2.3.7
|
||||
dev: false
|
||||
|
||||
/cluster-key-slot@1.1.1:
|
||||
resolution: {integrity: sha512-rwHwUfXL40Chm1r08yrhU3qpUvdVlgkKNeyeGPOxnW8/SyVDvgRaed/Uz54AqWNaTCAThlj6QAs3TZcKI0xDEw==}
|
||||
engines: {node: '>=0.10.0'}
|
||||
dev: true
|
||||
|
||||
/cluster-key-slot@1.1.2:
|
||||
resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==}
|
||||
engines: {node: '>=0.10.0'}
|
||||
@ -12567,8 +12595,8 @@ packages:
|
||||
resolution: {integrity: sha512-79ak0JxddO0utAXAQ5ccKhvs6vX2MGyHHMMsmZkBANrq3hXc1CHzvNPHOcvTsVMEPl5I+NT+RO4YKMGehOfSIg==}
|
||||
dev: false
|
||||
|
||||
/fastify@4.19.2:
|
||||
resolution: {integrity: sha512-2unheeIRWFf9/Jjcz7djOpKuXCTzZjlyFfiBwKqpldkHMN2rfTLu/f9pYTdwlhzC9Cdj0S2H12zlug0Kd5uZ1w==}
|
||||
/fastify@4.20.0:
|
||||
resolution: {integrity: sha512-zWWi5KGAb1YZ6fyrnFnA1CA1EZHkGM6YuELgB3QpS3l4lLRy14W1cc16b4KGPH/zQ98WCSdS+T41JkHY3eq1oA==}
|
||||
dependencies:
|
||||
'@fastify/ajv-compiler': 3.5.0
|
||||
'@fastify/error': 3.2.0
|
||||
@ -13149,11 +13177,6 @@ packages:
|
||||
- supports-color
|
||||
dev: false
|
||||
|
||||
/generic-pool@3.9.0:
|
||||
resolution: {integrity: sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g==}
|
||||
engines: {node: '>= 4'}
|
||||
dev: true
|
||||
|
||||
/gensync@1.0.0-beta.2:
|
||||
resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==}
|
||||
engines: {node: '>=6.9.0'}
|
||||
@ -16926,10 +16949,6 @@ packages:
|
||||
resolution: {integrity: sha512-1orQ9MT1vHFGQxhuy7E/0gECD3fd2fCC+PIX+/jgmU/gI3EpRocXtmtvxCO5x3WZ443FLTLFWNDjl5MPJf9u+Q==}
|
||||
dev: false
|
||||
|
||||
/oauth@0.9.15:
|
||||
resolution: {integrity: sha512-a5ERWK1kh38ExDEfoO6qUHJb32rd7aYmPHuyCu3Fta/cnICvYmgd2uhuKXvPD+PXB+gCEYYEaQdIRAjCOwAKNA==}
|
||||
dev: false
|
||||
|
||||
/object-assign@4.1.1:
|
||||
resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
|
||||
engines: {node: '>=0.10.0'}
|
||||
@ -18805,17 +18824,6 @@ packages:
|
||||
redis-errors: 1.2.0
|
||||
dev: false
|
||||
|
||||
/redis@4.5.1:
|
||||
resolution: {integrity: sha512-oxXSoIqMJCQVBTfxP6BNTCtDMyh9G6Vi5wjdPdV/sRKkufyZslDqCScSGcOr6XGR/reAWZefz7E4leM31RgdBA==}
|
||||
dependencies:
|
||||
'@redis/bloom': 1.1.0(@redis/client@1.4.2)
|
||||
'@redis/client': 1.4.2
|
||||
'@redis/graph': 1.1.0(@redis/client@1.4.2)
|
||||
'@redis/json': 1.0.4(@redis/client@1.4.2)
|
||||
'@redis/search': 1.1.0(@redis/client@1.4.2)
|
||||
'@redis/time-series': 1.0.4(@redis/client@1.4.2)
|
||||
dev: true
|
||||
|
||||
/reduce-css-calc@1.3.0:
|
||||
resolution: {integrity: sha512-0dVfwYVOlf/LBA2ec4OwQ6p3X9mYxn/wOl2xTcLwjnPYrkgEfPx3VI4eGCH3rQLlPISG5v9I9bkZosKsNRTRKA==}
|
||||
dependencies:
|
||||
@ -19166,8 +19174,8 @@ packages:
|
||||
dependencies:
|
||||
glob: 7.2.3
|
||||
|
||||
/rollup@3.26.2:
|
||||
resolution: {integrity: sha512-6umBIGVz93er97pMgQO08LuH3m6PUb3jlDUUGFsNJB6VgTCUaDFpupf5JfU30529m/UKOgmiX+uY6Sx8cOYpLA==}
|
||||
/rollup@3.26.3:
|
||||
resolution: {integrity: sha512-7Tin0C8l86TkpcMtXvQu6saWH93nhG3dGQ1/+l5V2TDMceTxO7kDiK6GzbfLWNNxqJXm591PcEZUozZm51ogwQ==}
|
||||
engines: {node: '>=14.18.0', npm: '>=8.0.0'}
|
||||
hasBin: true
|
||||
optionalDependencies:
|
||||
@ -21397,7 +21405,7 @@ packages:
|
||||
'@types/node': 20.4.2
|
||||
esbuild: 0.18.11
|
||||
postcss: 8.4.25
|
||||
rollup: 3.26.2
|
||||
rollup: 3.26.3
|
||||
sass: 1.63.6
|
||||
optionalDependencies:
|
||||
fsevents: 2.3.2
|
||||
@ -22139,8 +22147,8 @@ packages:
|
||||
react-dom: 18.2.0(react@18.2.0)
|
||||
dev: true
|
||||
|
||||
github.com/misskey-dev/summaly/77dd5654bb82280b38c1f50e51a771c33f3df503:
|
||||
resolution: {tarball: https://codeload.github.com/misskey-dev/summaly/tar.gz/77dd5654bb82280b38c1f50e51a771c33f3df503}
|
||||
github.com/misskey-dev/summaly/089a0ad8e8c780e5c088b1c528aa95c5827cbdcc:
|
||||
resolution: {tarball: https://codeload.github.com/misskey-dev/summaly/tar.gz/089a0ad8e8c780e5c088b1c528aa95c5827cbdcc}
|
||||
name: summaly
|
||||
version: 4.0.2
|
||||
dependencies:
|
||||
|
Loading…
Reference in New Issue
Block a user