Merge branch 'develop' into feat/hide-sensitive-from-antenna
This commit is contained in:
		
						commit
						1a151560b4
					
				|  | @ -9,6 +9,10 @@ on: | |||
|     paths: | ||||
|       - packages/misskey-js/** | ||||
|       - .github/workflows/api-misskey-js.yml | ||||
| 
 | ||||
| env: | ||||
|   COREPACK_DEFAULT_TO_LATEST: 0 | ||||
| 
 | ||||
| jobs: | ||||
|   report: | ||||
| 
 | ||||
|  |  | |||
|  | @ -9,6 +9,10 @@ on: | |||
|     paths: | ||||
|       - packages/backend/** | ||||
|       - .github/workflows/get-api-diff.yml | ||||
| 
 | ||||
| env: | ||||
|   COREPACK_DEFAULT_TO_LATEST: 0 | ||||
| 
 | ||||
| jobs: | ||||
|   get-from-misskey: | ||||
|     runs-on: ubuntu-latest | ||||
|  |  | |||
|  | @ -28,6 +28,10 @@ on: | |||
|       - packages/misskey-reversi/** | ||||
|       - packages/shared/eslint.config.js | ||||
|       - .github/workflows/lint.yml | ||||
| 
 | ||||
| env: | ||||
|   COREPACK_DEFAULT_TO_LATEST: 0 | ||||
| 
 | ||||
| jobs: | ||||
|   pnpm_install: | ||||
|     runs-on: ubuntu-latest | ||||
|  |  | |||
|  | @ -9,6 +9,10 @@ on: | |||
|     paths: | ||||
|       - locales/** | ||||
|       - .github/workflows/locale.yml | ||||
| 
 | ||||
| env: | ||||
|   COREPACK_DEFAULT_TO_LATEST: 0 | ||||
| 
 | ||||
| jobs: | ||||
|   locale_verify: | ||||
|     runs-on: ubuntu-latest | ||||
|  |  | |||
|  | @ -6,6 +6,9 @@ on: | |||
| 
 | ||||
|   workflow_dispatch: | ||||
| 
 | ||||
| env: | ||||
|   COREPACK_DEFAULT_TO_LATEST: 0 | ||||
| 
 | ||||
| jobs: | ||||
|   publish-misskey-js: | ||||
|     name: Publish misskey-js | ||||
|  |  | |||
|  | @ -13,6 +13,9 @@ on: | |||
|       # This is a waste of chromatic build quota, so we don't run storybook CI on pull requests targets master. | ||||
|       - master | ||||
| 
 | ||||
| env: | ||||
|   COREPACK_DEFAULT_TO_LATEST: 0 | ||||
| 
 | ||||
| jobs: | ||||
|   build: | ||||
|     # chromatic is not likely to be available for fork repositories, so we disable for fork repositories. | ||||
|  |  | |||
|  | @ -18,6 +18,10 @@ on: | |||
|       - packages/misskey-js/** | ||||
|       - .github/workflows/test-backend.yml | ||||
|       - .github/misskey/test.yml | ||||
| 
 | ||||
| env: | ||||
|   COREPACK_DEFAULT_TO_LATEST: 0 | ||||
| 
 | ||||
| jobs: | ||||
|   unit: | ||||
|     name: Unit tests (backend) | ||||
|  |  | |||
|  | @ -15,6 +15,9 @@ on: | |||
|       - packages/misskey-js/** | ||||
|       - .github/workflows/test-federation.yml | ||||
| 
 | ||||
| env: | ||||
|   COREPACK_DEFAULT_TO_LATEST: 0 | ||||
| 
 | ||||
| jobs: | ||||
|   test: | ||||
|     name: Federation test | ||||
|  |  | |||
|  | @ -22,6 +22,10 @@ on: | |||
|       - packages/backend/** | ||||
|       - .github/workflows/test-frontend.yml | ||||
|       - .github/misskey/test.yml | ||||
| 
 | ||||
| env: | ||||
|   COREPACK_DEFAULT_TO_LATEST: 0 | ||||
| 
 | ||||
| jobs: | ||||
|   vitest: | ||||
|     name: Unit tests (frontend) | ||||
|  |  | |||
|  | @ -14,6 +14,10 @@ on: | |||
|     paths: | ||||
|       - packages/misskey-js/** | ||||
|       - .github/workflows/test-misskey-js.yml | ||||
| 
 | ||||
| env: | ||||
|   COREPACK_DEFAULT_TO_LATEST: 0 | ||||
| 
 | ||||
| jobs: | ||||
|   test: | ||||
|     name: Unit tests (misskey.js) | ||||
|  |  | |||
|  | @ -9,6 +9,7 @@ on: | |||
| 
 | ||||
| env: | ||||
|   NODE_ENV: production | ||||
|   COREPACK_DEFAULT_TO_LATEST: 0 | ||||
| 
 | ||||
| jobs: | ||||
|   production: | ||||
|  |  | |||
|  | @ -12,6 +12,10 @@ on: | |||
|     paths: | ||||
|       - packages/backend/** | ||||
|       - .github/workflows/validate-api-json.yml | ||||
| 
 | ||||
| env: | ||||
|   COREPACK_DEFAULT_TO_LATEST: 0 | ||||
| 
 | ||||
| jobs: | ||||
|   validate-api-json: | ||||
|     runs-on: ubuntu-latest | ||||
|  |  | |||
							
								
								
									
										28
									
								
								CHANGELOG.md
								
								
								
								
							
							
						
						
									
										28
									
								
								CHANGELOG.md
								
								
								
								
							|  | @ -1,16 +1,36 @@ | |||
| ## 2025.2.0 | ||||
| ## Unreleased | ||||
| 
 | ||||
| ### General | ||||
| - Enhance: アンテナでセンシティブなチャンネルのノートを除外できるように ( #14177 ) | ||||
| 
 | ||||
| ### Client | ||||
| - Fix: 一部環境でセンシティブなファイルを含むノートの非表示が効かない問題  | ||||
| - Fix: データセーバー有効時にもユーザーページの「ファイル」タブで画像が読み込まれてしまう問題を修正 | ||||
| - | ||||
| 
 | ||||
| ### Server | ||||
| - Fix: 個別お知らせページのmetaタグ出力の条件が間違っていたのを修正 | ||||
| - | ||||
| 
 | ||||
| 
 | ||||
| ## 2025.2.0 | ||||
| 
 | ||||
| ### General | ||||
| - Fix: Docker のビルドに失敗する問題を修正   | ||||
|   (Cherry-picked from https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/883) | ||||
| 
 | ||||
| ### Client | ||||
| - Fix: パスキーでパスワードレスログインが出来ない問題を修正 | ||||
| - Fix: 一部環境でセンシティブなファイルを含むノートの非表示が効かない問題  | ||||
| - Fix: データセーバー有効時にもユーザーページの「ファイル」タブで画像が読み込まれてしまう問題を修正 | ||||
| - Fix: MFMの `sparkle` エフェクトが正しく表示されない問題を修正 | ||||
| - Fix: ページのURLにスラッシュが含まれている場合にページが正しく表示されない問題を修正 | ||||
| - Fix: デッキのプロファイルが新規作成できない問題を修正 | ||||
| - Fix: セキュリティに関する修正 | ||||
| - ローカライゼーションの更新 | ||||
| - Playが実装されたため、ページ機能の「ソースを見る」は削除されました | ||||
| 
 | ||||
| ### Server | ||||
| - Enhance: ページのURLに使用可能な文字を限定するように | ||||
| - Fix: 個別お知らせページのmetaタグ出力の条件が間違っていたのを修正 | ||||
| 
 | ||||
| ## 2025.1.0 | ||||
| 
 | ||||
| ### Note | ||||
|  |  | |||
|  | @ -6,6 +6,8 @@ ARG NODE_VERSION=22.11.0-bookworm | |||
| 
 | ||||
| FROM --platform=$BUILDPLATFORM node:${NODE_VERSION} AS native-builder | ||||
| 
 | ||||
| ENV COREPACK_DEFAULT_TO_LATEST=0 | ||||
| 
 | ||||
| RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \ | ||||
| 	--mount=type=cache,target=/var/lib/apt,sharing=locked \ | ||||
| 	rm -f /etc/apt/apt.conf.d/docker-clean \ | ||||
|  | @ -44,6 +46,8 @@ RUN rm -rf .git/ | |||
| 
 | ||||
| FROM --platform=$TARGETPLATFORM node:${NODE_VERSION} AS target-builder | ||||
| 
 | ||||
| ENV COREPACK_DEFAULT_TO_LATEST=0 | ||||
| 
 | ||||
| RUN apt-get update \ | ||||
| 	&& apt-get install -yqq --no-install-recommends \ | ||||
| 	build-essential | ||||
|  | @ -68,6 +72,7 @@ FROM --platform=$TARGETPLATFORM node:${NODE_VERSION}-slim AS runner | |||
| 
 | ||||
| ARG UID="991" | ||||
| ARG GID="991" | ||||
| ENV COREPACK_DEFAULT_TO_LATEST=0 | ||||
| 
 | ||||
| RUN apt-get update \ | ||||
| 	&& apt-get install -y --no-install-recommends \ | ||||
|  |  | |||
|  | @ -1460,9 +1460,6 @@ _pages: | |||
|   newPage: "أنشئ صفحة جديدة" | ||||
|   editPage: "عدّل الصفحة" | ||||
|   readPage: "نُشّط عرض المصدر" | ||||
|   created: "نجح إنشاء الصفحة" | ||||
|   updated: "نجح تعديل الصفحة" | ||||
|   deleted: "نجح حذف الصفحة" | ||||
|   pageSetting: "إعدادات الصفحة" | ||||
|   nameAlreadyExists: "رابط الصفحة موجود مسبقًا" | ||||
|   invalidNameTitle: "رابط الصفحة ليس صالحًا" | ||||
|  |  | |||
|  | @ -1237,9 +1237,6 @@ _pages: | |||
|   newPage: "নতুন পৃষ্ঠা বানান" | ||||
|   editPage: "পৃষ্ঠাটি সম্পাদনা করুন" | ||||
|   readPage: "উৎস দেখছেন" | ||||
|   created: "পৃষ্ঠা তৈরি করা হয়েছে" | ||||
|   updated: "পৃষ্ঠা সম্পাদনা করা হয়েছে" | ||||
|   deleted: "পৃষ্ঠা মুছে ফেলা হয়েছে" | ||||
|   pageSetting: "পৃষ্ঠার সেটিংস" | ||||
|   nameAlreadyExists: "পৃষ্ঠার URLটি ইতিমধ্যেই ব্যাবহার করা হয়েছে" | ||||
|   invalidNameTitle: "পৃষ্ঠার URL অবৈধ" | ||||
|  |  | |||
|  | @ -2365,9 +2365,6 @@ _pages: | |||
|   newPage: "pa" | ||||
|   editPage: "Editar la pàgina" | ||||
|   readPage: "Veure el codi font d'aquesta pàgina" | ||||
|   created: "La pàgina ha sigut creada correctament" | ||||
|   updated: "La pàgina s'ha editat correctament" | ||||
|   deleted: "La pàgina s'ha esborrat sense problemes" | ||||
|   pageSetting: "Configuració de la pàgina" | ||||
|   nameAlreadyExists: "L'adreça URL de la pàgina ja existeix" | ||||
|   invalidNameTitle: "L'adreça URL de la pàgina no és vàlida" | ||||
|  |  | |||
|  | @ -1883,9 +1883,6 @@ _pages: | |||
|   newPage: "Vytvořit novou stránku" | ||||
|   editPage: "Upravit stránku" | ||||
|   readPage: "Prohlížení zdroje této stránky" | ||||
|   created: "Stránka byla úspěšně vytvořena" | ||||
|   updated: "Stránka byla úspěšně aktualizována" | ||||
|   deleted: "Stránka byla úspěšně smazána" | ||||
|   pageSetting: "Nastavení stránky" | ||||
|   nameAlreadyExists: "Zadaná adresa URL stránky již existuje" | ||||
|   invalidNameTitle: "Zadaná adresa URL stránky je neplatná" | ||||
|  |  | |||
|  | @ -5,6 +5,7 @@ introMisskey: "Willkommen! Misskey ist eine dezentralisierte Open-Source Microbl | |||
| poweredByMisskeyDescription: "{name} ist einer der durch die Open-Source-Plattform <b>Misskey</b> betriebenen Dienste." | ||||
| monthAndDay: "{day}.{month}." | ||||
| search: "Suchen" | ||||
| reset: "Zurücksetzen" | ||||
| notifications: "Benachrichtigungen" | ||||
| username: "Benutzername" | ||||
| password: "Passwort" | ||||
|  | @ -48,6 +49,7 @@ pin: "An dein Profil anheften" | |||
| unpin: "Von deinem Profil lösen" | ||||
| copyContent: "Inhalt kopieren" | ||||
| copyLink: "Link kopieren" | ||||
| copyRemoteLink: "Renote-Link kopieren" | ||||
| copyLinkRenote: "Renote-Link kopieren" | ||||
| delete: "Löschen" | ||||
| deleteAndEdit: "Löschen und Bearbeiten" | ||||
|  | @ -517,6 +519,7 @@ emojiStyle: "Emoji-Stil" | |||
| native: "Nativ" | ||||
| menuStyle: "Menü Stil" | ||||
| style: "Stil" | ||||
| drawer: "App-Übersicht" | ||||
| popup: "Pop-up" | ||||
| showNoteActionsOnlyHover: "Notizmenü nur bei Mouseover anzeigen" | ||||
| showReactionsCount: "Zeige die Anzahl der Reaktionen auf Notizen an" | ||||
|  | @ -691,6 +694,7 @@ regexpError: "Fehler in einem regulären Ausdruck" | |||
| regexpErrorDescription: "Im regulären Ausdruck deiner in Zeile {line} von {tab}en Wortstummschaltungen ist ein Fehler aufgetreten:" | ||||
| instanceMute: "Instanzstummschaltungen" | ||||
| userSaysSomething: "{name} hat etwas gesagt" | ||||
| userSaysSomethingAbout: "{name} sagt etwas über '{word}'" | ||||
| makeActive: "Aktivieren" | ||||
| display: "Anzeigeart" | ||||
| copy: "Kopieren" | ||||
|  | @ -859,6 +863,7 @@ administration: "Verwaltung" | |||
| accounts: "Benutzerkonten" | ||||
| switch: "Wechseln" | ||||
| noMaintainerInformationWarning: "Betreiberinformationen sind nicht konfiguriert." | ||||
| noInquiryUrlWarning: "Keine gültige URL." | ||||
| noBotProtectionWarning: "Schutz vor Bots ist nicht konfiguriert." | ||||
| configure: "Konfigurieren" | ||||
| postToGallery: "Neuen Galeriebeitrag erstellen" | ||||
|  | @ -1091,6 +1096,7 @@ retryAllQueuesConfirmTitle: "Wirklich erneut versuchen?" | |||
| retryAllQueuesConfirmText: "Dies wird zu einer temporären Erhöhung der Serverlast führen." | ||||
| enableChartsForRemoteUser: "Diagramme für Nutzer fremder Instanzen erstellen" | ||||
| enableChartsForFederatedInstances: "Diagramme für fremde Instanzen erstellen" | ||||
| enableStatsForFederatedInstances: "Abruf von Informationen über förderierte Server" | ||||
| showClipButtonInNoteFooter: "\"Clip\" zum Notizmenu hinzufügen" | ||||
| reactionsDisplaySize: "Reaktionsanzeigegröße" | ||||
| limitWidthOfReaction: "Begrenze die Breite der Reaktion und zeige sie verkleinert an" | ||||
|  | @ -1139,6 +1145,8 @@ preventAiLearningDescription: "Fordert Crawler auf, gepostetes Text- oder Bildma | |||
| options: "Optionen" | ||||
| specifyUser: "Spezifischer Benutzer" | ||||
| lookupConfirm: "Zustimmen?" | ||||
| openTagPageConfirm: "Hashtag Seite wirklich öffnen?" | ||||
| specifyHost: "Host" | ||||
| failedToPreviewUrl: "Vorschau nicht anzeigbar" | ||||
| update: "Aktualisieren" | ||||
| rolesThatCanBeUsedThisEmojiAsReaction: "Rollen, die dieses Emoji als Reaktion verwenden können" | ||||
|  | @ -1197,6 +1205,7 @@ showRenotes: "Renotes anzeigen" | |||
| edited: "Bearbeitet" | ||||
| notificationRecieveConfig: "Benachrichtigungseinstellungen" | ||||
| mutualFollow: "Gegenseitig gefolgt" | ||||
| followingOrFollower: "Follow oder Follower" | ||||
| fileAttachedOnly: "Nur Notizen mit Dateien" | ||||
| showRepliesToOthersInTimeline: "Antworten in Chronik anzeigen" | ||||
| hideRepliesToOthersInTimeline: "Antworten nicht in Chronik anzeigen" | ||||
|  | @ -2268,9 +2277,6 @@ _pages: | |||
|   newPage: "Seite erstellen" | ||||
|   editPage: "Seite bearbeiten" | ||||
|   readPage: "Quelltextansicht" | ||||
|   created: "Seite erfolgreich erstellt" | ||||
|   updated: "Seite erfolgreich aktualisiert" | ||||
|   deleted: "Seite erfolgreich gelöscht" | ||||
|   pageSetting: "Seiteneinstellungen" | ||||
|   nameAlreadyExists: "Die angegebene Seiten-URL existiert bereits" | ||||
|   invalidNameTitle: "Die angegebene Seiten-URL ist ungültig" | ||||
|  |  | |||
|  | @ -2366,9 +2366,6 @@ _pages: | |||
|   newPage: "Create a new Page" | ||||
|   editPage: "Edit this Page" | ||||
|   readPage: "Viewing this Page's source" | ||||
|   created: "Page successfully created" | ||||
|   updated: "Page successfully edited" | ||||
|   deleted: "Page successfully deleted" | ||||
|   pageSetting: "Page settings" | ||||
|   nameAlreadyExists: "The specified Page URL already exists" | ||||
|   invalidNameTitle: "The specified Page URL is invalid" | ||||
|  | @ -2746,6 +2743,7 @@ _customEmojisManager: | |||
|     deleteSelectionRanges: "Delete rows in the selection" | ||||
|     searchSettings: "Search settings" | ||||
|     searchSettingCaption: "Set detailed search criteria." | ||||
|     searchLimit: "" | ||||
|     sortOrder: "Sort order" | ||||
|     registrationLogs: "Registration log" | ||||
|     registrationLogsCaption: "Logs will be displayed when updating or deleting Emojis. They will disappear after updating or deleting them, moving to a new page, or reloading." | ||||
|  | @ -2770,8 +2768,12 @@ _customEmojisManager: | |||
|       markAsDeleteTargetRanges: "Mark rows in the selection as a target to delete" | ||||
|       alertUpdateEmojisNothingDescription: "There are no updated Emojis." | ||||
|       alertDeleteEmojisNothingDescription: "There are no Emojis to be deleted." | ||||
|       confirmMovePage: "" | ||||
|       confirmChangeView: "" | ||||
|       confirmUpdateEmojisDescription: "Update {count} Emoji(s). Are you sure to continue?" | ||||
|       confirmDeleteEmojisDescription: "Delete checked {count} Emoji(s). Are you sure to continue?" | ||||
|       confirmResetDescription: "" | ||||
|       confirmMovePageDesciption: "Changes have been made to the Emojis on this page.\nIf you leave the page without saving, all changes made on this page will be discarded." | ||||
|       dialogSelectRoleTitle: "Search by roll set in Emojis" | ||||
|     _register: | ||||
|       uploadSettingTitle: "Upload settings" | ||||
|  |  | |||
|  | @ -5,6 +5,7 @@ introMisskey: "¡Bienvenido/a! Misskey es un servicio de microblogging descentra | |||
| poweredByMisskeyDescription: "{name} es uno de los servicios (también llamado instancia) que usa la plataforma de código abierto <b>Misskey</b>" | ||||
| monthAndDay: "{day}/{month}" | ||||
| search: "Buscar" | ||||
| reset: "Reiniciar" | ||||
| notifications: "Notificaciones" | ||||
| username: "Nombre de usuario" | ||||
| password: "Contraseña" | ||||
|  | @ -518,6 +519,7 @@ emojiStyle: "Estilo de emoji" | |||
| native: "Nativo" | ||||
| menuStyle: "Diseño del menú" | ||||
| style: "Diseño" | ||||
| drawer: "Cajón de Aplicaciones" | ||||
| popup: "Ventana emergente" | ||||
| showNoteActionsOnlyHover: "Mostrar acciones de la nota sólo al pasar el cursor" | ||||
| showReactionsCount: "Mostrar el número de reacciones en las notas" | ||||
|  | @ -683,7 +685,10 @@ smtpSecure: "Usar SSL/TLS implícito en la conexión SMTP" | |||
| smtpSecureInfo: "Apagar cuando se use STARTTLS" | ||||
| testEmail: "Prueba de envío" | ||||
| wordMute: "Silenciar palabras" | ||||
| wordMuteDescription: "Minimiza las notas que contienen la palabra o frase especificada. Las notas minimizadas pueden visualizarse haciendo clic sobre ellas." | ||||
| hardWordMute: "Filtro de palabra fuerte" | ||||
| showMutedWord: "Mostrar palabras silenciadas." | ||||
| hardWordMuteDescription: "Oculta las notas que contienen la palabra o frase especificada. A diferencia de Silenciar palabra, la nota quedará completamente oculta a la vista." | ||||
| regexpError: "Error de la expresión regular" | ||||
| regexpErrorDescription: "Ocurrió un error en la expresión regular en la linea {line} de las palabras muteadas {tab}" | ||||
| instanceMute: "Instancias silenciadas" | ||||
|  | @ -1134,6 +1139,7 @@ preventAiLearningDescription: "Pedirle a las arañas (crawlers) no usar los text | |||
| options: "Opción" | ||||
| specifyUser: "Especificar usuario" | ||||
| lookupConfirm: "¿Quiere informarse?" | ||||
| specifyHost: "Especificar Host" | ||||
| failedToPreviewUrl: "No se pudo generar la vista previa" | ||||
| update: "Actualizar" | ||||
| rolesThatCanBeUsedThisEmojiAsReaction: "Roles que pueden usar este emoji como reacción" | ||||
|  | @ -2288,9 +2294,6 @@ _pages: | |||
|   newPage: "Crear página" | ||||
|   editPage: "Editar página" | ||||
|   readPage: "Viendo la fuente" | ||||
|   created: "La página fue creada" | ||||
|   updated: "La página fue actualizada" | ||||
|   deleted: "La página borrada" | ||||
|   pageSetting: "Configurar página" | ||||
|   nameAlreadyExists: "La URL de la página especificada ya existe" | ||||
|   invalidNameTitle: "URL inválida" | ||||
|  |  | |||
|  | @ -2118,9 +2118,6 @@ _pages: | |||
|   newPage: "Créer une page" | ||||
|   editPage: "Modifier une page" | ||||
|   readPage: "Affichage de la source en cours" | ||||
|   created: "La page a été créée !" | ||||
|   updated: "La page a été mise à jour !" | ||||
|   deleted: "La page a été supprimée" | ||||
|   pageSetting: "Paramètres de la Page" | ||||
|   nameAlreadyExists: "L'URL de page spécifiée existe déjà" | ||||
|   invalidNameTitle: "L'URL de page spécifiée n’est pas valide" | ||||
|  |  | |||
|  | @ -2285,9 +2285,6 @@ _pages: | |||
|   newPage: "Buat halaman baru" | ||||
|   editPage: "Sunting halaman" | ||||
|   readPage: "Lihat sumber kode aktif" | ||||
|   created: "Halaman berhasil dibuat" | ||||
|   updated: "Halaman berhasil diperbaharui!" | ||||
|   deleted: "Halaman telah dihapus" | ||||
|   pageSetting: "Pengaturan Halaman" | ||||
|   nameAlreadyExists: "URL Halaman yang ditentukan sudah ada" | ||||
|   invalidNameTitle: "URL Halaman yang ditentukan tidak valid" | ||||
|  |  | |||
|  | @ -4199,7 +4199,7 @@ export interface Locale extends ILocale { | |||
|      */ | ||||
|     "invalidParamError": string; | ||||
|     /** | ||||
|      * リクエストパラメータに問題があります。通常これはバグですが、入力した文字数が多すぎる等の可能性もあります。 | ||||
|      * リクエストパラメータに問題があります。通常これはバグですが、入力した文字数が多すぎる・許可されていない文字を入力している等の可能性もあります。 | ||||
|      */ | ||||
|     "invalidParamErrorDescription": string; | ||||
|     /** | ||||
|  | @ -9184,18 +9184,6 @@ export interface Locale extends ILocale { | |||
|          * ソースを表示中 | ||||
|          */ | ||||
|         "readPage": string; | ||||
|         /** | ||||
|          * ページを作成しました | ||||
|          */ | ||||
|         "created": string; | ||||
|         /** | ||||
|          * ページを更新しました | ||||
|          */ | ||||
|         "updated": string; | ||||
|         /** | ||||
|          * ページを削除しました | ||||
|          */ | ||||
|         "deleted": string; | ||||
|         /** | ||||
|          * ページ設定 | ||||
|          */ | ||||
|  |  | |||
|  | @ -107,7 +107,7 @@ makeFollowManuallyApprove: "Approva i follower manualmente" | |||
| defaultNoteVisibility: "Privacy predefinita delle note" | ||||
| follow: "Segui" | ||||
| followRequest: "Richiesta di follow" | ||||
| followRequests: "Richieste di follow" | ||||
| followRequests: "Relazioni" | ||||
| unfollow: "Togli Following" | ||||
| followRequestPending: "Richiesta in approvazione" | ||||
| enterEmoji: "Inserisci emoji" | ||||
|  | @ -537,7 +537,7 @@ regenerate: "Generare di nuovo" | |||
| fontSize: "Dimensione carattere" | ||||
| mediaListWithOneImageAppearance: "Altezza dell'elenco media con una sola immagine " | ||||
| limitTo: "Limita a {x}" | ||||
| noFollowRequests: "Non hai alcuna richiesta di follow" | ||||
| noFollowRequests: "Non ci sono richieste di relazione" | ||||
| openImageInNewTab: "Apri le immagini in un nuovo tab" | ||||
| dashboard: "Pannello di controllo" | ||||
| local: "Locale" | ||||
|  | @ -1933,7 +1933,7 @@ _serverDisconnectedBehavior: | |||
|   quiet: "Visualizza avviso in modo discreto" | ||||
| _channel: | ||||
|   create: "Nuovo canale" | ||||
|   edit: "Gerisci canale" | ||||
|   edit: "Modifica il canale" | ||||
|   setBanner: "Scegli intestazione" | ||||
|   removeBanner: "Rimuovi intestazione" | ||||
|   featured: "Popolari nel canale" | ||||
|  | @ -1961,7 +1961,7 @@ _instanceMute: | |||
| _theme: | ||||
|   explore: "Esplora temi" | ||||
|   install: "Installa un tema" | ||||
|   manage: "Gestione temi" | ||||
|   manage: "Gestione dei temi" | ||||
|   code: "Codice tema" | ||||
|   description: "Descrizione" | ||||
|   installed: "{name} è installato" | ||||
|  | @ -2108,12 +2108,12 @@ _permissions: | |||
|   "read:messaging": "Visualizzare la chat" | ||||
|   "write:messaging": "Gestire la chat" | ||||
|   "read:mutes": "Vedi i profili silenziati" | ||||
|   "write:mutes": "Gestisci i profili silenziati" | ||||
|   "write:mutes": "Gestione dei profili silenziati" | ||||
|   "write:notes": "Creare / Eliminare note" | ||||
|   "read:notifications": "Visualizzare notifiche" | ||||
|   "write:notifications": "Gestire notifiche" | ||||
|   "write:notifications": "Gestione delle notifiche" | ||||
|   "read:reactions": "Vedi reazioni" | ||||
|   "write:reactions": "Gerisci reazioni" | ||||
|   "write:reactions": "Gestione delle reazioni" | ||||
|   "write:votes": "Votare" | ||||
|   "read:pages": "Visualizzare pagine" | ||||
|   "write:pages": "Gestire pagine" | ||||
|  | @ -2122,7 +2122,7 @@ _permissions: | |||
|   "read:user-groups": "Vedere i gruppi di utenti" | ||||
|   "write:user-groups": "Gestire i gruppi di utenti" | ||||
|   "read:channels": "Visualizza canali" | ||||
|   "write:channels": "Gerisci canali" | ||||
|   "write:channels": "Gestione dei canali" | ||||
|   "read:gallery": "Visualizza la galleria." | ||||
|   "write:gallery": "Gestione della galleria" | ||||
|   "read:gallery-likes": "Visualizza i contenuti della galleria." | ||||
|  | @ -2365,9 +2365,6 @@ _pages: | |||
|   newPage: "Crea pagina" | ||||
|   editPage: "Modifica pagina" | ||||
|   readPage: "Visualizzando fonte " | ||||
|   created: "Pagina creata!" | ||||
|   updated: "Pagina aggiornata con successo!" | ||||
|   deleted: "Pagina eliminata" | ||||
|   pageSetting: "Impostazioni pagina" | ||||
|   nameAlreadyExists: "Esiste già una pagina con lo stesso URL." | ||||
|   invalidNameTitle: "L'URL di pagina definito non è valido" | ||||
|  |  | |||
|  | @ -1045,7 +1045,7 @@ youCannotCreateAnymore: "これ以上作成することはできません。" | |||
| cannotPerformTemporary: "一時的に利用できません" | ||||
| cannotPerformTemporaryDescription: "操作回数が制限を超過するため一時的に利用できません。しばらく時間を置いてから再度お試しください。" | ||||
| invalidParamError: "パラメータエラー" | ||||
| invalidParamErrorDescription: "リクエストパラメータに問題があります。通常これはバグですが、入力した文字数が多すぎる等の可能性もあります。" | ||||
| invalidParamErrorDescription: "リクエストパラメータに問題があります。通常これはバグですが、入力した文字数が多すぎる・許可されていない文字を入力している等の可能性もあります。" | ||||
| permissionDeniedError: "操作が拒否されました" | ||||
| permissionDeniedErrorDescription: "このアカウントにはこの操作を行うための権限がありません。" | ||||
| preset: "プリセット" | ||||
|  | @ -2423,9 +2423,6 @@ _pages: | |||
|   newPage: "ページの作成" | ||||
|   editPage: "ページの編集" | ||||
|   readPage: "ソースを表示中" | ||||
|   created: "ページを作成しました" | ||||
|   updated: "ページを更新しました" | ||||
|   deleted: "ページを削除しました" | ||||
|   pageSetting: "ページ設定" | ||||
|   nameAlreadyExists: "指定されたページURLは既に存在しています" | ||||
|   invalidNameTitle: "不正なページURLです" | ||||
|  |  | |||
|  | @ -2357,9 +2357,6 @@ _pages: | |||
|   newPage: "ページを作る" | ||||
|   editPage: "ページの編集" | ||||
|   readPage: "ソースを表示中" | ||||
|   created: "ページを作成したで" | ||||
|   updated: "ページを更新したで" | ||||
|   deleted: "ページを削除したで" | ||||
|   pageSetting: "ページ設定" | ||||
|   nameAlreadyExists: "指定されたページURLはもうあるみたいや" | ||||
|   invalidNameTitle: "正しくないページURLみたいやで" | ||||
|  |  | |||
|  | @ -1283,7 +1283,7 @@ confirmWhenRevealingSensitiveMedia: "민감한 미디어를 열 때 두 번 확 | |||
| sensitiveMediaRevealConfirm: "민감한 미디어입니다. 표시할까요?" | ||||
| createdLists: "만든 리스트" | ||||
| createdAntennas: "만든 안테나" | ||||
| fromX: "{x}부터" | ||||
| fromX: "{x}에서" | ||||
| genEmbedCode: "임베디드 코드 만들기" | ||||
| noteOfThisUser: "이 유저의 노트 목록" | ||||
| clipNoteLimitExceeded: "더 이상 이 클립에 노트를 추가 할 수 없습니다." | ||||
|  | @ -2365,9 +2365,6 @@ _pages: | |||
|   newPage: "페이지 만들기" | ||||
|   editPage: "페이지 수정" | ||||
|   readPage: "소스 표시 중" | ||||
|   created: "페이지를 만들었습니다" | ||||
|   updated: "페이지를 수정했습니다" | ||||
|   deleted: "페이지가 삭제되었습니다" | ||||
|   pageSetting: "페이지 설정" | ||||
|   nameAlreadyExists: "지정한 페이지 URL이 이미 존재합니다" | ||||
|   invalidNameTitle: "유효하지 않은 페이지 URL입니다" | ||||
|  |  | |||
|  | @ -1459,9 +1459,6 @@ _pages: | |||
|   newPage: "Utwórz stronę" | ||||
|   editPage: "Edytuj tę stronę" | ||||
|   readPage: "Aktywowano widok źródła" | ||||
|   created: "Pomyślnie utworzono stronę!" | ||||
|   updated: "Pomyślnie zaktualizowano stronę!" | ||||
|   deleted: "Strona została usunięta" | ||||
|   pageSetting: "Ustawienia strony" | ||||
|   nameAlreadyExists: "Określony adres URL strony już istnieje" | ||||
|   invalidNameTitle: "Podany adres URL strony jest nieprawidłowy" | ||||
|  |  | |||
|  | @ -2357,9 +2357,6 @@ _pages: | |||
|   newPage: "Criar uma Página" | ||||
|   editPage: "Editar essa Página" | ||||
|   readPage: "Ver a fonte dessa Página" | ||||
|   created: "Página criada com sucesso" | ||||
|   updated: "Página atualizada com sucesso" | ||||
|   deleted: "Página excluída com sucesso" | ||||
|   pageSetting: "Configurações da página" | ||||
|   nameAlreadyExists: "O URL de Página especificado já existe" | ||||
|   invalidNameTitle: "O URL de Página especificado é inválido" | ||||
|  |  | |||
|  | @ -1976,9 +1976,6 @@ _pages: | |||
|   newPage: "Создать страницу" | ||||
|   editPage: "Править страницу" | ||||
|   readPage: "Читать страницу" | ||||
|   created: "Страница успешно создана." | ||||
|   updated: "Страница успешно обновлена." | ||||
|   deleted: "Страница успешно удалена." | ||||
|   pageSetting: "Настройки страницы" | ||||
|   nameAlreadyExists: "Указанный адрес страницы уже существует." | ||||
|   invalidNameTitle: "Указанный адрес страницы недопустим." | ||||
|  |  | |||
|  | @ -1332,9 +1332,6 @@ _pages: | |||
|   newPage: "Vytvoriť novú stránku" | ||||
|   editPage: "Upraviť túto stránku" | ||||
|   readPage: "Zobrazenie zdroja aktívne" | ||||
|   created: "Stránka úspešne vytvorená" | ||||
|   updated: "Stránka úspešne upravená" | ||||
|   deleted: "Stránka úspešne odstránená" | ||||
|   pageSetting: "Nastavenia stránky" | ||||
|   nameAlreadyExists: "Zadaná URL stránku už existuje" | ||||
|   invalidNameTitle: "Zadaná URL stránku je nesprávna" | ||||
|  |  | |||
|  | @ -2331,9 +2331,6 @@ _pages: | |||
|   newPage: "สร้างหน้าเพจใหม่" | ||||
|   editPage: "แก้ไขหน้าเพจ" | ||||
|   readPage: "กำลังดูแหล่งที่มาของเพจนี้" | ||||
|   created: "สร้างหน้าเพจสำเร็จเรียบร้อยแล้ว" | ||||
|   updated: "แก้ไขหน้าเพจสำเร็จเรียบร้อยแล้ว" | ||||
|   deleted: "ลบหน้าเพจสำเร็จเรียบร้อยแล้ว" | ||||
|   pageSetting: "การตั้งค่าหน้าเพจ" | ||||
|   nameAlreadyExists: "URL ของหน้าที่ระบุนั้นมีอยู่แล้ว" | ||||
|   invalidNameTitle: "URL ของหน้าที่ระบุนั้นไม่ถูกต้อง" | ||||
|  |  | |||
|  | @ -1513,9 +1513,6 @@ _pages: | |||
|   newPage: "Створити сторінку" | ||||
|   editPage: "Редагувати сторінку" | ||||
|   readPage: "Перегляд вихідного коду" | ||||
|   created: "Сторінка успішно створена." | ||||
|   updated: "Сторінка успішно оновлена." | ||||
|   deleted: "Сторінку видалено" | ||||
|   pageSetting: "Налаштування сторінки" | ||||
|   nameAlreadyExists: "Вказана адреса сторінки вже існує." | ||||
|   invalidNameTitle: "Вказана адреса сторінки неприпустима." | ||||
|  |  | |||
|  | @ -1004,9 +1004,6 @@ _play: | |||
| _pages: | ||||
|   newPage: "Yangi Sahifa yaratish" | ||||
|   editPage: "Ushbu Sahifani tahrirlash" | ||||
|   created: "Sahifa muvaffaqiyatli yaratildi" | ||||
|   updated: "Sahifa muvaffaqiyatli tahrirlandi" | ||||
|   deleted: "Sahifa muvaffaqiyatli o'chirildi" | ||||
|   pageSetting: "Sahifa sozlamalari" | ||||
|   nameAlreadyExists: "Ko'rsatilgan Sahifa URL'i allaqachon mavjud" | ||||
|   invalidNameTitle: "Ko'rsatilgan Sahifa URL'i yaroqsiz" | ||||
|  |  | |||
|  | @ -1802,9 +1802,6 @@ _pages: | |||
|   newPage: "Tạo Trang mới" | ||||
|   editPage: "Sửa Trang này" | ||||
|   readPage: "Xem mã nguồn Trang này" | ||||
|   created: "Trang đã được tạo thành công" | ||||
|   updated: "Trang đã được cập nhật thành công" | ||||
|   deleted: "Trang đã được xóa thành công" | ||||
|   pageSetting: "Cài đặt trang" | ||||
|   nameAlreadyExists: "URL Trang đã tồn tại" | ||||
|   invalidNameTitle: "URL Trang không hợp lệ" | ||||
|  |  | |||
|  | @ -49,7 +49,7 @@ pin: "置顶" | |||
| unpin: "取消置顶" | ||||
| copyContent: "复制内容" | ||||
| copyLink: "复制链接" | ||||
| copyRemoteLink: "复制远程连接" | ||||
| copyRemoteLink: "复制远程链接" | ||||
| copyLinkRenote: "复制转帖链接" | ||||
| delete: "删除" | ||||
| deleteAndEdit: "删除并编辑" | ||||
|  | @ -2365,9 +2365,6 @@ _pages: | |||
|   newPage: "创建页面" | ||||
|   editPage: "编辑页面" | ||||
|   readPage: "查看页面" | ||||
|   created: "页面已创建" | ||||
|   updated: "页面已更新" | ||||
|   deleted: "该页面已被删除" | ||||
|   pageSetting: "页面设置" | ||||
|   nameAlreadyExists: "该页面 URL 已存在" | ||||
|   invalidNameTitle: "无效的页面 URL" | ||||
|  |  | |||
|  | @ -2365,9 +2365,6 @@ _pages: | |||
|   newPage: "建立頁面" | ||||
|   editPage: "編輯頁面" | ||||
|   readPage: "正在檢視原始碼" | ||||
|   created: "頁面已建立" | ||||
|   updated: "頁面已更新" | ||||
|   deleted: "頁面已被刪除" | ||||
|   pageSetting: "頁面設定" | ||||
|   nameAlreadyExists: "該頁面 URL 已存在" | ||||
|   invalidNameTitle: "無效的頁面 URL" | ||||
|  |  | |||
|  | @ -1,6 +1,6 @@ | |||
| { | ||||
| 	"name": "misskey", | ||||
| 	"version": "2025.2.0-alpha.0", | ||||
| 	"version": "2025.2.0", | ||||
| 	"codename": "nasubi", | ||||
| 	"repository": { | ||||
| 		"type": "git", | ||||
|  |  | |||
|  | @ -118,3 +118,5 @@ export class MiPage { | |||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| export const pageNameSchema = { type: 'string', pattern: /^[^\s:\/?#\[\]@!$&'()*+,;=\\%\x00-\x20]{1,256}$/.source } as const; | ||||
|  |  | |||
|  | @ -7,7 +7,7 @@ import ms from 'ms'; | |||
| import { Inject, Injectable } from '@nestjs/common'; | ||||
| import type { DriveFilesRepository, PagesRepository } from '@/models/_.js'; | ||||
| import { IdService } from '@/core/IdService.js'; | ||||
| import { MiPage } from '@/models/Page.js'; | ||||
| import { MiPage, pageNameSchema } from '@/models/Page.js'; | ||||
| import { Endpoint } from '@/server/api/endpoint-base.js'; | ||||
| import { PageEntityService } from '@/core/entities/PageEntityService.js'; | ||||
| import { DI } from '@/di-symbols.js'; | ||||
|  | @ -51,7 +51,7 @@ export const paramDef = { | |||
| 	type: 'object', | ||||
| 	properties: { | ||||
| 		title: { type: 'string' }, | ||||
| 		name: { type: 'string', minLength: 1 }, | ||||
| 		name: { ...pageNameSchema, minLength: 1 }, | ||||
| 		summary: { type: 'string', nullable: true }, | ||||
| 		content: { type: 'array', items: { | ||||
| 			type: 'object', additionalProperties: true, | ||||
|  |  | |||
|  | @ -10,6 +10,7 @@ import type { PagesRepository, DriveFilesRepository } from '@/models/_.js'; | |||
| import { Endpoint } from '@/server/api/endpoint-base.js'; | ||||
| import { DI } from '@/di-symbols.js'; | ||||
| import { ApiError } from '../../error.js'; | ||||
| import { pageNameSchema } from '@/models/Page.js'; | ||||
| 
 | ||||
| export const meta = { | ||||
| 	tags: ['pages'], | ||||
|  | @ -31,13 +32,11 @@ export const meta = { | |||
| 			code: 'NO_SUCH_PAGE', | ||||
| 			id: '21149b9e-3616-4778-9592-c4ce89f5a864', | ||||
| 		}, | ||||
| 
 | ||||
| 		accessDenied: { | ||||
| 			message: 'Access denied.', | ||||
| 			code: 'ACCESS_DENIED', | ||||
| 			id: '3c15cd52-3b4b-4274-967d-6456fc4f792b', | ||||
| 		}, | ||||
| 
 | ||||
| 		noSuchFile: { | ||||
| 			message: 'No such file.', | ||||
| 			code: 'NO_SUCH_FILE', | ||||
|  | @ -56,7 +55,7 @@ export const paramDef = { | |||
| 	properties: { | ||||
| 		pageId: { type: 'string', format: 'misskey:id' }, | ||||
| 		title: { type: 'string' }, | ||||
| 		name: { type: 'string', minLength: 1 }, | ||||
| 		name: { ...pageNameSchema, minLength: 1 }, | ||||
| 		summary: { type: 'string', nullable: true }, | ||||
| 		content: { type: 'array', items: { | ||||
| 			type: 'object', additionalProperties: true, | ||||
|  |  | |||
|  | @ -17,6 +17,7 @@ services: | |||
|       - ./.config/docker.env | ||||
|     environment: | ||||
|       - NODE_ENV=production | ||||
|       - COREPACK_DEFAULT_TO_LATEST=0 | ||||
|     volumes: | ||||
|       - type: bind | ||||
|         source: ../../../built | ||||
|  |  | |||
|  | @ -25,6 +25,7 @@ services: | |||
|     environment: | ||||
|       - NODE_ENV=development | ||||
|       - NODE_EXTRA_CA_CERTS=/usr/local/share/ca-certificates/rootCA.crt | ||||
|       - COREPACK_DEFAULT_TO_LATEST=0 | ||||
|     volumes: | ||||
|       - type: bind | ||||
|         source: ../package.json | ||||
|  | @ -85,6 +86,8 @@ services: | |||
|     depends_on: | ||||
|       redis.test: | ||||
|         condition: service_healthy | ||||
|     environment: | ||||
|       - COREPACK_DEFAULT_TO_LATEST=0 | ||||
|     volumes: | ||||
|       - type: bind | ||||
|         source: ../package.json | ||||
|  |  | |||
|  | @ -47,6 +47,7 @@ export default [ | |||
| 			'@typescript-eslint/no-empty-interface': ['error', { | ||||
| 				allowSingleExtends: true, | ||||
| 			}], | ||||
| 			'import/consistent-type-specifier-style': ['error', 'prefer-top-level'], | ||||
| 			// window の禁止理由: グローバルスコープと衝突し、予期せぬ結果を招くため
 | ||||
| 			// e の禁止理由: error や event など、複数のキーワードの頭文字であり分かりにくいため
 | ||||
| 			'id-denylist': ['error', 'window', 'e'], | ||||
|  |  | |||
|  | @ -3,7 +3,8 @@ | |||
|  * SPDX-License-Identifier: AGPL-3.0-only | ||||
|  */ | ||||
| 
 | ||||
| import { VNode, h, SetupContext, provide } from 'vue'; | ||||
| import { h, provide } from 'vue'; | ||||
| import type { VNode, SetupContext } from 'vue'; | ||||
| import * as mfm from 'mfm-js'; | ||||
| import * as Misskey from 'misskey-js'; | ||||
| import { host } from '@@/js/config.js'; | ||||
|  |  | |||
|  | @ -22,7 +22,8 @@ SPDX-License-Identifier: AGPL-3.0-only | |||
| <script lang="ts" setup> | ||||
| import { useTemplateRef } from 'vue'; | ||||
| import EmNote from '@/components/EmNote.vue'; | ||||
| import EmPagination, { Paging } from '@/components/EmPagination.vue'; | ||||
| import EmPagination from '@/components/EmPagination.vue'; | ||||
| import type { Paging } from '@/components/EmPagination.vue'; | ||||
| import { i18n } from '@/i18n.js'; | ||||
| import * as Misskey from 'misskey-js'; | ||||
| 
 | ||||
|  |  | |||
|  | @ -21,6 +21,7 @@ | |||
| 		"allowSyntheticDefaultImports": true, | ||||
| 		"isolatedModules": true, | ||||
| 		"useDefineForClassFields": true, | ||||
| 		"verbatimModuleSyntax": true, | ||||
| 		"baseUrl": ".", | ||||
| 		"paths": { | ||||
| 			"@/*": ["./src/*"], | ||||
|  |  | |||
|  | @ -52,6 +52,7 @@ export default [ | |||
| 			'@typescript-eslint/no-empty-interface': ['error', { | ||||
| 				allowSingleExtends: true, | ||||
| 			}], | ||||
| 			'import/consistent-type-specifier-style': ['error', 'prefer-top-level'], | ||||
| 			// window の禁止理由: グローバルスコープと衝突し、予期せぬ結果を招くため
 | ||||
| 			// e の禁止理由: error や event など、複数のキーワードの頭文字であり分かりにくいため
 | ||||
| 			'id-denylist': ['error', 'window', 'e'], | ||||
|  |  | |||
|  | @ -16,6 +16,7 @@ | |||
| 		"experimentalDecorators": true, | ||||
| 		"noImplicitReturns": true, | ||||
| 		"esModuleInterop": true, | ||||
| 		"verbatimModuleSyntax": true, | ||||
| 		"baseUrl": ".", | ||||
| 		"paths": { | ||||
| 			"@/*": ["./*"], | ||||
|  |  | |||
|  | @ -3,7 +3,8 @@ | |||
|  * SPDX-License-Identifier: AGPL-3.0-only | ||||
|  */ | ||||
| 
 | ||||
| import { DefaultBodyType, HttpResponse, HttpResponseResolver, JsonBodyType, PathParams, http } from 'msw'; | ||||
| import { HttpResponse, http } from 'msw'; | ||||
| import type { DefaultBodyType, HttpResponseResolver, JsonBodyType, PathParams } from 'msw'; | ||||
| import seedrandom from 'seedrandom'; | ||||
| import { action } from '@storybook/addon-actions'; | ||||
| 
 | ||||
|  |  | |||
|  | @ -47,6 +47,7 @@ export default [ | |||
| 			'@typescript-eslint/no-empty-interface': ['error', { | ||||
| 				allowSingleExtends: true, | ||||
| 			}], | ||||
| 			'import/consistent-type-specifier-style': ['error', 'prefer-top-level'], | ||||
| 			// window の禁止理由: グローバルスコープと衝突し、予期せぬ結果を招くため
 | ||||
| 			// e の禁止理由: error や event など、複数のキーワードの頭文字であり分かりにくいため
 | ||||
| 			'id-denylist': ['error', 'window', 'e'], | ||||
|  |  | |||
|  | @ -4,8 +4,8 @@ | |||
|  */ | ||||
| 
 | ||||
| import { generate } from 'astring'; | ||||
| import * as estree from 'estree'; | ||||
| import { walk } from '../node_modules/estree-walker/src/index.js'; | ||||
| import type * as estree from 'estree'; | ||||
| import type * as estreeWalker from 'estree-walker'; | ||||
| import type { Plugin } from 'vite'; | ||||
| 
 | ||||
|  |  | |||
|  | @ -3,7 +3,8 @@ | |||
|  * SPDX-License-Identifier: AGPL-3.0-only | ||||
|  */ | ||||
| 
 | ||||
| import { computed, watch, version as vueVersion, App } from 'vue'; | ||||
| import { computed, watch, version as vueVersion } from 'vue'; | ||||
| import type { App } from 'vue'; | ||||
| import { compareVersions } from 'compare-versions'; | ||||
| import { version, lang, updateLocale, locale } from '@@/js/config.js'; | ||||
| import widgets from '@/widgets/index.js'; | ||||
|  |  | |||
|  | @ -6,7 +6,7 @@ | |||
| import { createApp, defineAsyncComponent, markRaw } from 'vue'; | ||||
| import { ui } from '@@/js/config.js'; | ||||
| import { common } from './common.js'; | ||||
| import type * as Misskey from 'misskey-js'; | ||||
| import * as Misskey from 'misskey-js'; | ||||
| import type { Component } from 'vue'; | ||||
| import { i18n } from '@/i18n.js'; | ||||
| import { alert, confirm, popup, post, toast } from '@/os.js'; | ||||
|  | @ -22,7 +22,8 @@ import { initializeSw } from '@/scripts/initialize-sw.js'; | |||
| import { deckStore } from '@/ui/deck/deck-store.js'; | ||||
| import { emojiPicker } from '@/scripts/emoji-picker.js'; | ||||
| import { mainRouter } from '@/router/main.js'; | ||||
| import { type Keymap, makeHotkey } from '@/scripts/hotkey.js'; | ||||
| import { makeHotkey } from '@/scripts/hotkey.js'; | ||||
| import type { Keymap } from '@/scripts/hotkey.js'; | ||||
| import { addCustomEmoji, removeCustomEmojis, updateCustomEmojis } from '@/custom-emojis.js'; | ||||
| 
 | ||||
| export async function mainBoot() { | ||||
|  |  | |||
|  | @ -5,7 +5,7 @@ | |||
| 
 | ||||
| /* eslint-disable @typescript-eslint/explicit-function-return-type */ | ||||
| import { action } from '@storybook/addon-actions'; | ||||
| import { StoryObj } from '@storybook/vue3'; | ||||
| import type { StoryObj } from '@storybook/vue3'; | ||||
| import { HttpResponse, http } from 'msw'; | ||||
| import { userDetailed } from '../../.storybook/fakes.js'; | ||||
| import { commonHandlers } from '../../.storybook/mocks.js'; | ||||
|  |  | |||
|  | @ -5,7 +5,7 @@ | |||
| 
 | ||||
| /* eslint-disable @typescript-eslint/explicit-function-return-type */ | ||||
| import { action } from '@storybook/addon-actions'; | ||||
| import { StoryObj } from '@storybook/vue3'; | ||||
| import type { StoryObj } from '@storybook/vue3'; | ||||
| import { HttpResponse, http } from 'msw'; | ||||
| import { commonHandlers } from '../../.storybook/mocks.js'; | ||||
| import { userDetailed } from '../../.storybook/fakes.js'; | ||||
|  |  | |||
|  | @ -4,7 +4,7 @@ | |||
|  */ | ||||
| 
 | ||||
| /* eslint-disable @typescript-eslint/explicit-function-return-type */ | ||||
| import { StoryObj } from '@storybook/vue3'; | ||||
| import type { StoryObj } from '@storybook/vue3'; | ||||
| import { HttpResponse, http } from 'msw'; | ||||
| import { userDetailed } from '../../.storybook/fakes.js'; | ||||
| import { commonHandlers } from '../../.storybook/mocks.js'; | ||||
|  |  | |||
|  | @ -4,7 +4,7 @@ | |||
|  */ | ||||
| 
 | ||||
| /* eslint-disable @typescript-eslint/explicit-function-return-type */ | ||||
| import { StoryObj } from '@storybook/vue3'; | ||||
| import type { StoryObj } from '@storybook/vue3'; | ||||
| import isChromatic from 'chromatic/isChromatic'; | ||||
| import MkAnalogClock from './MkAnalogClock.vue'; | ||||
| export const Default = { | ||||
|  |  | |||
|  | @ -5,7 +5,7 @@ | |||
| 
 | ||||
| /* eslint-disable @typescript-eslint/explicit-function-return-type */ | ||||
| import { action } from '@storybook/addon-actions'; | ||||
| import { StoryObj } from '@storybook/vue3'; | ||||
| import type { StoryObj } from '@storybook/vue3'; | ||||
| import { HttpResponse, http } from 'msw'; | ||||
| import { commonHandlers } from '../../.storybook/mocks.js'; | ||||
| import MkAnnouncementDialog from './MkAnnouncementDialog.vue'; | ||||
|  |  | |||
|  | @ -5,7 +5,7 @@ | |||
| 
 | ||||
| /* eslint-disable @typescript-eslint/explicit-function-return-type */ | ||||
| import { action } from '@storybook/addon-actions'; | ||||
| import { StoryObj } from '@storybook/vue3'; | ||||
| import type { StoryObj } from '@storybook/vue3'; | ||||
| import { HttpResponse, http } from 'msw'; | ||||
| import { commonHandlers } from '../../.storybook/mocks.js'; | ||||
| import MkAntennaEditor from './MkAntennaEditor.vue'; | ||||
|  |  | |||
|  | @ -5,7 +5,7 @@ | |||
| 
 | ||||
| /* eslint-disable @typescript-eslint/explicit-function-return-type */ | ||||
| import { action } from '@storybook/addon-actions'; | ||||
| import { StoryObj } from '@storybook/vue3'; | ||||
| import type { StoryObj } from '@storybook/vue3'; | ||||
| import { HttpResponse, http } from 'msw'; | ||||
| import { commonHandlers } from '../../.storybook/mocks.js'; | ||||
| import MkAntennaEditorDialog from './MkAntennaEditorDialog.vue'; | ||||
|  |  | |||
|  | @ -63,14 +63,15 @@ SPDX-License-Identifier: AGPL-3.0-only | |||
| </template> | ||||
| 
 | ||||
| <script lang="ts" setup> | ||||
| import { Ref, ref, computed } from 'vue'; | ||||
| import { ref, computed } from 'vue'; | ||||
| import type { Ref } from 'vue'; | ||||
| import * as os from '@/os.js'; | ||||
| import MkButton from '@/components/MkButton.vue'; | ||||
| import MkInput from '@/components/MkInput.vue'; | ||||
| import MkSwitch from '@/components/MkSwitch.vue'; | ||||
| import MkTextarea from '@/components/MkTextarea.vue'; | ||||
| import MkSelect from '@/components/MkSelect.vue'; | ||||
| import { AsUiComponent, AsUiRoot, AsUiPostFormButton } from '@/scripts/aiscript/ui.js'; | ||||
| import type { AsUiComponent, AsUiRoot, AsUiPostFormButton } from '@/scripts/aiscript/ui.js'; | ||||
| import MkFolder from '@/components/MkFolder.vue'; | ||||
| import MkPostForm from '@/components/MkPostForm.vue'; | ||||
| 
 | ||||
|  |  | |||
|  | @ -6,7 +6,7 @@ | |||
| /* eslint-disable @typescript-eslint/explicit-function-return-type */ | ||||
| import { action } from '@storybook/addon-actions'; | ||||
| import { expect, userEvent, waitFor, within } from '@storybook/test'; | ||||
| import { StoryObj } from '@storybook/vue3'; | ||||
| import type { StoryObj } from '@storybook/vue3'; | ||||
| import { HttpResponse, http } from 'msw'; | ||||
| import { userDetailed } from '../../.storybook/fakes.js'; | ||||
| import { commonHandlers } from '../../.storybook/mocks.js'; | ||||
|  |  | |||
|  | @ -57,7 +57,8 @@ import { i18n } from '@/i18n.js'; | |||
| import { miLocalStorage } from '@/local-storage.js'; | ||||
| import { customEmojis } from '@/custom-emojis.js'; | ||||
| import { MFM_TAGS, MFM_PARAMS } from '@@/js/const.js'; | ||||
| import { searchEmoji, EmojiDef } from '@/scripts/search-emoji.js'; | ||||
| import { searchEmoji } from '@/scripts/search-emoji.js'; | ||||
| import type { EmojiDef } from '@/scripts/search-emoji.js'; | ||||
| 
 | ||||
| const lib = emojilist.filter(x => x.category !== 'flags'); | ||||
| 
 | ||||
|  |  | |||
|  | @ -4,7 +4,7 @@ | |||
|  */ | ||||
| 
 | ||||
| /* eslint-disable @typescript-eslint/explicit-function-return-type */ | ||||
| import { StoryObj } from '@storybook/vue3'; | ||||
| import type { StoryObj } from '@storybook/vue3'; | ||||
| import { HttpResponse, http } from 'msw'; | ||||
| import { userDetailed } from '../../.storybook/fakes.js'; | ||||
| import { commonHandlers } from '../../.storybook/mocks.js'; | ||||
|  |  | |||
|  | @ -6,7 +6,7 @@ | |||
| /* eslint-disable @typescript-eslint/explicit-function-return-type */ | ||||
| /* eslint-disable import/no-default-export */ | ||||
| import { action } from '@storybook/addon-actions'; | ||||
| import { StoryObj } from '@storybook/vue3'; | ||||
| import type { StoryObj } from '@storybook/vue3'; | ||||
| import MkButton from './MkButton.vue'; | ||||
| export const Default = { | ||||
| 	render(args) { | ||||
|  |  | |||
|  | @ -5,7 +5,7 @@ | |||
| 
 | ||||
| /* eslint-disable @typescript-eslint/explicit-function-return-type */ | ||||
| /* eslint-disable import/no-default-export */ | ||||
| import { StoryObj } from '@storybook/vue3'; | ||||
| import type { StoryObj } from '@storybook/vue3'; | ||||
| import { HttpResponse, http } from 'msw'; | ||||
| import { action } from '@storybook/addon-actions'; | ||||
| import { expect, userEvent, within } from '@storybook/test'; | ||||
|  |  | |||
|  | @ -5,7 +5,7 @@ | |||
| 
 | ||||
| /* eslint-disable @typescript-eslint/explicit-function-return-type */ | ||||
| /* eslint-disable import/no-default-export */ | ||||
| import { StoryObj } from '@storybook/vue3'; | ||||
| import type { StoryObj } from '@storybook/vue3'; | ||||
| import { HttpResponse, http } from 'msw'; | ||||
| import { action } from '@storybook/addon-actions'; | ||||
| import { channel } from '../../.storybook/fakes.js'; | ||||
|  |  | |||
|  | @ -20,7 +20,8 @@ SPDX-License-Identifier: AGPL-3.0-only | |||
| 
 | ||||
| <script lang="ts" setup> | ||||
| import MkChannelPreview from '@/components/MkChannelPreview.vue'; | ||||
| import MkPagination, { Paging } from '@/components/MkPagination.vue'; | ||||
| import MkPagination from '@/components/MkPagination.vue'; | ||||
| import type { Paging } from '@/components/MkPagination.vue'; | ||||
| import { i18n } from '@/i18n.js'; | ||||
| import { infoImageUrl } from '@/instance.js'; | ||||
| 
 | ||||
|  |  | |||
|  | @ -5,7 +5,7 @@ | |||
| 
 | ||||
| /* eslint-disable @typescript-eslint/explicit-function-return-type */ | ||||
| /* eslint-disable import/no-default-export */ | ||||
| import { StoryObj } from '@storybook/vue3'; | ||||
| import type { StoryObj } from '@storybook/vue3'; | ||||
| import { channel } from '../../.storybook/fakes.js'; | ||||
| import MkChannelPreview from './MkChannelPreview.vue'; | ||||
| export const Default = { | ||||
|  |  | |||
|  | @ -5,7 +5,7 @@ | |||
| 
 | ||||
| /* eslint-disable @typescript-eslint/explicit-function-return-type */ | ||||
| /* eslint-disable import/no-default-export */ | ||||
| import { StoryObj } from '@storybook/vue3'; | ||||
| import type { StoryObj } from '@storybook/vue3'; | ||||
| import { http } from 'msw'; | ||||
| import { commonHandlers } from '../../.storybook/mocks.js'; | ||||
| import { getChartResolver } from '../../.storybook/charts.js'; | ||||
|  |  | |||
|  | @ -14,7 +14,8 @@ SPDX-License-Identifier: AGPL-3.0-only | |||
| 
 | ||||
| <script lang="ts" setup> | ||||
| import { shallowRef } from 'vue'; | ||||
| import { Chart, LegendItem } from 'chart.js'; | ||||
| import { Chart } from 'chart.js'; | ||||
| import type { LegendItem } from 'chart.js'; | ||||
| 
 | ||||
| const chart = shallowRef<Chart>(); | ||||
| const type = shallowRef<string>(); | ||||
|  |  | |||
|  | @ -5,7 +5,7 @@ | |||
| 
 | ||||
| /* eslint-disable @typescript-eslint/explicit-function-return-type */ | ||||
| /* eslint-disable import/no-default-export */ | ||||
| import { StoryObj } from '@storybook/vue3'; | ||||
| import type { StoryObj } from '@storybook/vue3'; | ||||
| import { HttpResponse, http } from 'msw'; | ||||
| import { action } from '@storybook/addon-actions'; | ||||
| import { expect, userEvent, within } from '@storybook/test'; | ||||
|  |  | |||
|  | @ -5,7 +5,7 @@ | |||
| 
 | ||||
| /* eslint-disable @typescript-eslint/explicit-function-return-type */ | ||||
| /* eslint-disable import/no-default-export */ | ||||
| import { StoryObj } from '@storybook/vue3'; | ||||
| import type { StoryObj } from '@storybook/vue3'; | ||||
| import { clip } from '../../.storybook/fakes.js'; | ||||
| import MkClipPreview from './MkClipPreview.vue'; | ||||
| export const Default = { | ||||
|  |  | |||
|  | @ -5,7 +5,7 @@ | |||
| 
 | ||||
| /* eslint-disable @typescript-eslint/explicit-function-return-type */ | ||||
| /* eslint-disable import/no-default-export */ | ||||
| import { StoryObj } from '@storybook/vue3'; | ||||
| import type { StoryObj } from '@storybook/vue3'; | ||||
| import MkCode from './MkCode.vue'; | ||||
| const code = `for (let i, 100) {
 | ||||
| 	<: if (i % 15 == 0) "FizzBuzz" | ||||
|  |  | |||
|  | @ -5,7 +5,7 @@ | |||
| 
 | ||||
| /* eslint-disable @typescript-eslint/explicit-function-return-type */ | ||||
| /* eslint-disable import/no-default-export */ | ||||
| import { StoryObj } from '@storybook/vue3'; | ||||
| import type { StoryObj } from '@storybook/vue3'; | ||||
| import { action } from '@storybook/addon-actions'; | ||||
| import MkCodeEditor from './MkCodeEditor.vue'; | ||||
| const code = `for (let i, 100) {
 | ||||
|  |  | |||
|  | @ -5,7 +5,7 @@ | |||
| 
 | ||||
| /* eslint-disable @typescript-eslint/explicit-function-return-type */ | ||||
| /* eslint-disable import/no-default-export */ | ||||
| import { StoryObj } from '@storybook/vue3'; | ||||
| import type { StoryObj } from '@storybook/vue3'; | ||||
| import MkCodeInline from './MkCodeInline.vue'; | ||||
| export const Default = { | ||||
| 	render(args) { | ||||
|  |  | |||
|  | @ -5,7 +5,7 @@ | |||
| 
 | ||||
| /* eslint-disable @typescript-eslint/explicit-function-return-type */ | ||||
| /* eslint-disable import/no-default-export */ | ||||
| import { StoryObj } from '@storybook/vue3'; | ||||
| import type { StoryObj } from '@storybook/vue3'; | ||||
| import { action } from '@storybook/addon-actions'; | ||||
| import MkColorInput from './MkColorInput.vue'; | ||||
| export const Default = { | ||||
|  |  | |||
|  | @ -5,7 +5,7 @@ | |||
| 
 | ||||
| /* eslint-disable @typescript-eslint/explicit-function-return-type */ | ||||
| /* eslint-disable import/no-default-export */ | ||||
| import { StoryObj } from '@storybook/vue3'; | ||||
| import type { StoryObj } from '@storybook/vue3'; | ||||
| import { userEvent, within } from '@storybook/test'; | ||||
| import MkContextMenu from './MkContextMenu.vue'; | ||||
| import * as os from '@/os.js'; | ||||
|  |  | |||
|  | @ -5,7 +5,7 @@ | |||
| 
 | ||||
| /* eslint-disable @typescript-eslint/explicit-function-return-type */ | ||||
| /* eslint-disable import/no-default-export */ | ||||
| import { StoryObj } from '@storybook/vue3'; | ||||
| import type { StoryObj } from '@storybook/vue3'; | ||||
| import { HttpResponse, http } from 'msw'; | ||||
| import { action } from '@storybook/addon-actions'; | ||||
| import { file } from '../../.storybook/fakes.js'; | ||||
|  |  | |||
|  | @ -5,7 +5,7 @@ | |||
| 
 | ||||
| /* eslint-disable @typescript-eslint/explicit-function-return-type */ | ||||
| /* eslint-disable import/no-default-export */ | ||||
| import { StoryObj } from '@storybook/vue3'; | ||||
| import type { StoryObj } from '@storybook/vue3'; | ||||
| import { emojiDetailed } from '../../.storybook/fakes.js'; | ||||
| import MkCustomEmojiDetailedDialog from './MkCustomEmojiDetailedDialog.vue'; | ||||
| export const Default = { | ||||
|  |  | |||
|  | @ -5,7 +5,7 @@ | |||
| 
 | ||||
| /* eslint-disable @typescript-eslint/explicit-function-return-type */ | ||||
| /* eslint-disable import/no-default-export */ | ||||
| import { StoryObj } from '@storybook/vue3'; | ||||
| import type { StoryObj } from '@storybook/vue3'; | ||||
| import { action } from '@storybook/addon-actions'; | ||||
| import { expect, userEvent, within } from '@storybook/test'; | ||||
| import { file } from '../../.storybook/fakes.js'; | ||||
|  |  | |||
|  | @ -4,14 +4,15 @@ SPDX-License-Identifier: AGPL-3.0-only | |||
| --> | ||||
| 
 | ||||
| <script lang="ts"> | ||||
| import { defineComponent, h, PropType, TransitionGroup, useCssModule } from 'vue'; | ||||
| import { defineComponent, h, TransitionGroup, useCssModule } from 'vue'; | ||||
| import type { PropType } from 'vue'; | ||||
| import MkAd from '@/components/global/MkAd.vue'; | ||||
| import { isDebuggerEnabled, stackTraceInstances } from '@/debug.js'; | ||||
| import { i18n } from '@/i18n.js'; | ||||
| import * as os from '@/os.js'; | ||||
| import { instance } from '@/instance.js'; | ||||
| import { defaultStore } from '@/store.js'; | ||||
| import { MisskeyEntity } from '@/types/date-separated-list.js'; | ||||
| import type { MisskeyEntity } from '@/types/date-separated-list.js'; | ||||
| 
 | ||||
| export default defineComponent({ | ||||
| 	props: { | ||||
|  |  | |||
|  | @ -5,7 +5,7 @@ | |||
| 
 | ||||
| import { action } from '@storybook/addon-actions'; | ||||
| import { expect, userEvent, waitFor, within } from '@storybook/test'; | ||||
| import { StoryObj } from '@storybook/vue3'; | ||||
| import type { StoryObj } from '@storybook/vue3'; | ||||
| import { i18n } from '@/i18n.js'; | ||||
| import MkDialog from './MkDialog.vue'; | ||||
| const Base = { | ||||
|  |  | |||
|  | @ -4,7 +4,7 @@ | |||
|  */ | ||||
| 
 | ||||
| /* eslint-disable @typescript-eslint/explicit-function-return-type */ | ||||
| import { StoryObj } from '@storybook/vue3'; | ||||
| import type { StoryObj } from '@storybook/vue3'; | ||||
| import isChromatic from 'chromatic/isChromatic'; | ||||
| import MkDigitalClock from './MkDigitalClock.vue'; | ||||
| export const Default = { | ||||
|  |  | |||
|  | @ -4,7 +4,7 @@ | |||
|  */ | ||||
| 
 | ||||
| import { action } from '@storybook/addon-actions'; | ||||
| import { StoryObj } from '@storybook/vue3'; | ||||
| import type { StoryObj } from '@storybook/vue3'; | ||||
| import { onBeforeUnmount } from 'vue'; | ||||
| import MkDonation from './MkDonation.vue'; | ||||
| import { instance } from '@/instance.js'; | ||||
|  |  | |||
|  | @ -4,7 +4,7 @@ | |||
|  */ | ||||
| 
 | ||||
| import { action } from '@storybook/addon-actions'; | ||||
| import { StoryObj } from '@storybook/vue3'; | ||||
| import type { StoryObj } from '@storybook/vue3'; | ||||
| import MkDrive_file from './MkDrive.file.vue'; | ||||
| import { file } from '../../.storybook/fakes.js'; | ||||
| export const Default = { | ||||
|  |  | |||
|  | @ -4,7 +4,7 @@ | |||
|  */ | ||||
| 
 | ||||
| import { action } from '@storybook/addon-actions'; | ||||
| import { StoryObj } from '@storybook/vue3'; | ||||
| import type { StoryObj } from '@storybook/vue3'; | ||||
| import { http, HttpResponse } from 'msw'; | ||||
| import * as Misskey from 'misskey-js'; | ||||
| import MkDrive_folder from './MkDrive.folder.vue'; | ||||
|  |  | |||
|  | @ -4,7 +4,7 @@ | |||
|  */ | ||||
| 
 | ||||
| import { action } from '@storybook/addon-actions'; | ||||
| import { StoryObj } from '@storybook/vue3'; | ||||
| import type { StoryObj } from '@storybook/vue3'; | ||||
| import { http, HttpResponse } from 'msw'; | ||||
| import * as Misskey from 'misskey-js'; | ||||
| import MkDrive from './MkDrive.vue'; | ||||
|  |  | |||
|  | @ -3,7 +3,7 @@ | |||
|  * SPDX-License-Identifier: AGPL-3.0-only | ||||
|  */ | ||||
| 
 | ||||
| import { StoryObj } from '@storybook/vue3'; | ||||
| import type { StoryObj } from '@storybook/vue3'; | ||||
| import MkDriveFileThumbnail from './MkDriveFileThumbnail.vue'; | ||||
| import { file } from '../../.storybook/fakes.js'; | ||||
| export const Default = { | ||||
|  |  | |||
|  | @ -61,8 +61,10 @@ SPDX-License-Identifier: AGPL-3.0-only | |||
| </template> | ||||
| 
 | ||||
| <script lang="ts" setup> | ||||
| import { ref, computed, Ref } from 'vue'; | ||||
| import { CustomEmojiFolderTree, getEmojiName } from '@@/js/emojilist.js'; | ||||
| import { ref, computed } from 'vue'; | ||||
| import type { Ref } from 'vue'; | ||||
| import { getEmojiName } from '@@/js/emojilist.js'; | ||||
| import type { CustomEmojiFolderTree } from '@@/js/emojilist.js'; | ||||
| import { i18n } from '@/i18n.js'; | ||||
| import { customEmojis } from '@/custom-emojis.js'; | ||||
| import MkEmojiPickerSection from '@/components/MkEmojiPicker.section.vue'; | ||||
|  |  | |||
|  | @ -5,7 +5,7 @@ | |||
| 
 | ||||
| import { action } from '@storybook/addon-actions'; | ||||
| import { expect, userEvent, waitFor, within } from '@storybook/test'; | ||||
| import { StoryObj } from '@storybook/vue3'; | ||||
| import type { StoryObj } from '@storybook/vue3'; | ||||
| import { i18n } from '@/i18n.js'; | ||||
| import MkEmojiPicker from './MkEmojiPicker.vue'; | ||||
| export const Default = { | ||||
|  |  | |||
|  | @ -120,12 +120,14 @@ import * as Misskey from 'misskey-js'; | |||
| import { | ||||
| 	emojilist, | ||||
| 	emojiCharByCategory, | ||||
| 	UnicodeEmojiDef, | ||||
| 	unicodeEmojiCategories as categories, | ||||
| 	getEmojiName, | ||||
| 	CustomEmojiFolderTree, | ||||
| 	getUnicodeEmoji, | ||||
| } from '@@/js/emojilist.js'; | ||||
| import type { | ||||
| 	UnicodeEmojiDef, | ||||
| 	CustomEmojiFolderTree, | ||||
| } from '@@/js/emojilist.js'; | ||||
| import XSection from '@/components/MkEmojiPicker.section.vue'; | ||||
| import MkRippleEffect from '@/components/MkRippleEffect.vue'; | ||||
| import * as os from '@/os.js'; | ||||
|  |  | |||
|  | @ -3,7 +3,7 @@ | |||
|  * SPDX-License-Identifier: AGPL-3.0-only | ||||
|  */ | ||||
| 
 | ||||
| import { StoryObj } from '@storybook/vue3'; | ||||
| import type { StoryObj } from '@storybook/vue3'; | ||||
| import MkExtensionInstaller from './MkExtensionInstaller.vue'; | ||||
| import lightTheme from '@@/themes/_light.json5'; | ||||
| 
 | ||||
|  |  | |||
|  | @ -3,7 +3,7 @@ | |||
|  * SPDX-License-Identifier: AGPL-3.0-only | ||||
|  */ | ||||
| 
 | ||||
| import { StoryObj } from '@storybook/vue3'; | ||||
| import type { StoryObj } from '@storybook/vue3'; | ||||
| import MkFlashPreview from './MkFlashPreview.vue'; | ||||
| import { flash } from './../../.storybook/fakes.js'; | ||||
| export const Public = { | ||||
|  |  | |||
|  | @ -5,7 +5,7 @@ | |||
| 
 | ||||
| /* eslint-disable @typescript-eslint/explicit-function-return-type */ | ||||
| import { expect, userEvent, waitFor, within } from '@storybook/test'; | ||||
| import { StoryObj } from '@storybook/vue3'; | ||||
| import type { StoryObj } from '@storybook/vue3'; | ||||
| import { galleryPost } from '../../.storybook/fakes.js'; | ||||
| import MkGalleryPostPreview from './MkGalleryPostPreview.vue'; | ||||
| export const Default = { | ||||
|  |  | |||
|  | @ -44,12 +44,14 @@ SPDX-License-Identifier: AGPL-3.0-only | |||
| </template> | ||||
| 
 | ||||
| <script lang="ts" setup> | ||||
| import { onMounted, onUnmounted, nextTick, ref, shallowRef, watch, computed, toRefs, InputHTMLAttributes } from 'vue'; | ||||
| import { onMounted, onUnmounted, nextTick, ref, shallowRef, watch, computed, toRefs } from 'vue'; | ||||
| import type { InputHTMLAttributes } from 'vue'; | ||||
| import { debounce } from 'throttle-debounce'; | ||||
| import MkButton from '@/components/MkButton.vue'; | ||||
| import { useInterval } from '@@/js/use-interval.js'; | ||||
| import { i18n } from '@/i18n.js'; | ||||
| import { Autocomplete, SuggestionType } from '@/scripts/autocomplete.js'; | ||||
| import { Autocomplete } from '@/scripts/autocomplete.js'; | ||||
| import type { SuggestionType } from '@/scripts/autocomplete.js'; | ||||
| 
 | ||||
| const props = defineProps<{ | ||||
| 	modelValue: string | number | null; | ||||
|  |  | |||
|  | @ -4,7 +4,7 @@ | |||
|  */ | ||||
| 
 | ||||
| /* eslint-disable @typescript-eslint/explicit-function-return-type */ | ||||
| import { StoryObj } from '@storybook/vue3'; | ||||
| import type { StoryObj } from '@storybook/vue3'; | ||||
| import { HttpResponse, http } from 'msw'; | ||||
| import { federationInstance } from '../../.storybook/fakes.js'; | ||||
| import { commonHandlers } from '../../.storybook/mocks.js'; | ||||
|  |  | |||
|  | @ -94,7 +94,8 @@ import * as os from '@/os.js'; | |||
| import { misskeyApiGet } from '@/scripts/misskey-api.js'; | ||||
| import { instance } from '@/instance.js'; | ||||
| import { i18n } from '@/i18n.js'; | ||||
| import MkHeatmap, { type HeatmapSource } from '@/components/MkHeatmap.vue'; | ||||
| import MkHeatmap from '@/components/MkHeatmap.vue'; | ||||
| import type { HeatmapSource } from '@/components/MkHeatmap.vue'; | ||||
| import MkFoldableSection from '@/components/MkFoldableSection.vue'; | ||||
| import MkRetentionHeatmap from '@/components/MkRetentionHeatmap.vue'; | ||||
| import MkRetentionLineChart from '@/components/MkRetentionLineChart.vue'; | ||||
|  |  | |||
Some files were not shown because too many files have changed in this diff Show More
		Loading…
	
		Reference in New Issue