From 6855079811401be883167476726644e5730ea792 Mon Sep 17 00:00:00 2001
From: GrapeApple0 <84321396+GrapeApple0@users.noreply.github.com>
Date: Tue, 26 Dec 2023 21:40:27 +0900
Subject: [PATCH] =?UTF-8?q?refactor:=20pagination=E3=81=AE=E5=9E=8B?=
 =?UTF-8?q?=E3=82=92=E6=98=8E=E7=A4=BA=E3=81=99=E3=82=8B=20(#12809)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

* refactor: paginationの型を明示する

* asではなくsatisfiesを使うように
---
 .../frontend/src/components/MkFileListForAdmin.vue   |  4 ++--
 packages/frontend/src/components/MkNoteDetailed.vue  |  6 +++---
 .../src/components/MkUserSetupDialog.Follow.vue      |  6 +++---
 packages/frontend/src/pages/about.federation.vue     |  2 +-
 packages/frontend/src/pages/admin-user.vue           |  4 ++--
 packages/frontend/src/pages/admin/abuses.vue         |  4 ++--
 packages/frontend/src/pages/admin/federation.vue     |  4 ++--
 packages/frontend/src/pages/admin/invites.vue        |  8 ++++----
 packages/frontend/src/pages/admin/modlog.vue         |  4 ++--
 packages/frontend/src/pages/admin/roles.role.vue     |  4 ++--
 packages/frontend/src/pages/admin/users.vue          |  4 ++--
 packages/frontend/src/pages/announcements.vue        |  6 +++---
 packages/frontend/src/pages/channels.vue             | 10 +++++-----
 .../frontend/src/pages/custom-emojis-manager.vue     |  6 +++---
 packages/frontend/src/pages/favorites.vue            |  4 ++--
 packages/frontend/src/pages/flash/flash-index.vue    |  8 ++++----
 packages/frontend/src/pages/follow-requests.vue      |  4 ++--
 packages/frontend/src/pages/gallery/index.vue        | 12 ++++++------
 packages/frontend/src/pages/gallery/post.vue         |  4 ++--
 packages/frontend/src/pages/instance-info.vue        |  4 ++--
 packages/frontend/src/pages/invite.vue               |  4 ++--
 packages/frontend/src/pages/my-clips/index.vue       |  4 ++--
 packages/frontend/src/pages/my-lists/list.vue        |  4 ++--
 packages/frontend/src/pages/page.vue                 |  4 ++--
 packages/frontend/src/pages/pages.vue                |  8 ++++----
 packages/frontend/src/pages/settings/apps.vue        |  4 ++--
 .../frontend/src/pages/settings/drive-cleaner.vue    |  4 ++--
 packages/frontend/src/pages/settings/mute-block.vue  |  8 ++++----
 packages/frontend/src/pages/settings/security.vue    |  4 ++--
 packages/frontend/src/pages/settings/webhook.vue     |  4 ++--
 packages/frontend/src/pages/user/clips.vue           |  4 ++--
 packages/frontend/src/pages/user/flashs.vue          |  4 ++--
 packages/frontend/src/pages/user/follow-list.vue     |  6 +++---
 packages/frontend/src/pages/user/gallery.vue         |  4 ++--
 packages/frontend/src/pages/user/lists.vue           |  4 ++--
 packages/frontend/src/pages/user/pages.vue           |  4 ++--
 packages/frontend/src/pages/user/reactions.vue       |  4 ++--
 37 files changed, 93 insertions(+), 93 deletions(-)

diff --git a/packages/frontend/src/components/MkFileListForAdmin.vue b/packages/frontend/src/components/MkFileListForAdmin.vue
index 3edd30bc37..b0ff06bd33 100644
--- a/packages/frontend/src/components/MkFileListForAdmin.vue
+++ b/packages/frontend/src/components/MkFileListForAdmin.vue
@@ -38,14 +38,14 @@ SPDX-License-Identifier: AGPL-3.0-only
 
 <script lang="ts" setup>
 import * as Misskey from 'misskey-js';
-import MkPagination from '@/components/MkPagination.vue';
+import MkPagination, { Paging } from '@/components/MkPagination.vue';
 import MkDriveFileThumbnail from '@/components/MkDriveFileThumbnail.vue';
 import bytes from '@/filters/bytes.js';
 import { i18n } from '@/i18n.js';
 import { dateString } from '@/filters/date.js';
 
 const props = defineProps<{
-	pagination: any;
+	pagination: Paging;
 	viewMode: 'grid' | 'list';
 }>();
 </script>
diff --git a/packages/frontend/src/components/MkNoteDetailed.vue b/packages/frontend/src/components/MkNoteDetailed.vue
index 33a6786d03..f1bcdec7fb 100644
--- a/packages/frontend/src/components/MkNoteDetailed.vue
+++ b/packages/frontend/src/components/MkNoteDetailed.vue
@@ -224,7 +224,7 @@ import { claimAchievement } from '@/scripts/achievements.js';
 import MkRippleEffect from '@/components/MkRippleEffect.vue';
 import { showMovedDialog } from '@/scripts/show-moved-dialog.js';
 import MkUserCardMini from '@/components/MkUserCardMini.vue';
-import MkPagination from '@/components/MkPagination.vue';
+import MkPagination, { Paging } from '@/components/MkPagination.vue';
 import MkReactionIcon from '@/components/MkReactionIcon.vue';
 import MkButton from '@/components/MkButton.vue';
 
@@ -307,7 +307,7 @@ const renotesPagination = computed(() => ({
 	params: {
 		noteId: appearNote.value.id,
 	},
-}));
+} satisfies Paging));
 
 const reactionsPagination = computed(() => ({
 	endpoint: 'notes/reactions',
@@ -316,7 +316,7 @@ const reactionsPagination = computed(() => ({
 		noteId: appearNote.value.id,
 		type: reactionTabType.value,
 	},
-}));
+} satisfies Paging));
 
 useNoteCapture({
 	rootEl: el,
diff --git a/packages/frontend/src/components/MkUserSetupDialog.Follow.vue b/packages/frontend/src/components/MkUserSetupDialog.Follow.vue
index 5f3f5b81dd..d924a54ffb 100644
--- a/packages/frontend/src/components/MkUserSetupDialog.Follow.vue
+++ b/packages/frontend/src/components/MkUserSetupDialog.Follow.vue
@@ -37,15 +37,15 @@ SPDX-License-Identifier: AGPL-3.0-only
 import { i18n } from '@/i18n.js';
 import MkFolder from '@/components/MkFolder.vue';
 import XUser from '@/components/MkUserSetupDialog.User.vue';
-import MkPagination from '@/components/MkPagination.vue';
+import MkPagination, { Paging } from '@/components/MkPagination.vue';
 
-const pinnedUsers = { endpoint: 'pinned-users', noPaging: true };
+const pinnedUsers = { endpoint: 'pinned-users', noPaging: true } satisfies Paging;
 
 const popularUsers = { endpoint: 'users', limit: 10, noPaging: true, params: {
 	state: 'alive',
 	origin: 'local',
 	sort: '+follower',
-} };
+} } satisfies Paging;
 </script>
 
 <style lang="scss" module>
diff --git a/packages/frontend/src/pages/about.federation.vue b/packages/frontend/src/pages/about.federation.vue
index e01c5f7542..b678db2f29 100644
--- a/packages/frontend/src/pages/about.federation.vue
+++ b/packages/frontend/src/pages/about.federation.vue
@@ -80,7 +80,7 @@ const pagination = {
 			state.value === 'notResponding' ? { notResponding: true } :
 			{}),
 	})),
-} as Paging;
+} satisfies Paging;
 
 function getStatus(instance) {
 	if (instance.isSuspended) return 'Suspended';
diff --git a/packages/frontend/src/pages/admin-user.vue b/packages/frontend/src/pages/admin-user.vue
index d69d627ce8..13c6dd8f59 100644
--- a/packages/frontend/src/pages/admin-user.vue
+++ b/packages/frontend/src/pages/admin-user.vue
@@ -225,7 +225,7 @@ import { definePageMetadata } from '@/scripts/page-metadata.js';
 import { i18n } from '@/i18n.js';
 import { iAmAdmin, $i } from '@/account.js';
 import MkRolePreview from '@/components/MkRolePreview.vue';
-import MkPagination from '@/components/MkPagination.vue';
+import MkPagination, { Paging } from '@/components/MkPagination.vue';
 
 const props = withDefaults(defineProps<{
 	userId: string;
@@ -258,7 +258,7 @@ const announcementsPagination = {
 	params: computed(() => ({
 		userId: props.userId,
 	})),
-};
+} satisfies Paging;
 const expandedRoles = ref([]);
 
 function createFetcher() {
diff --git a/packages/frontend/src/pages/admin/abuses.vue b/packages/frontend/src/pages/admin/abuses.vue
index 3613189548..24bdc0c12b 100644
--- a/packages/frontend/src/pages/admin/abuses.vue
+++ b/packages/frontend/src/pages/admin/abuses.vue
@@ -56,7 +56,7 @@ import { computed, shallowRef, ref } from 'vue';
 
 import XHeader from './_header_.vue';
 import MkSelect from '@/components/MkSelect.vue';
-import MkPagination from '@/components/MkPagination.vue';
+import MkPagination, { Paging } from '@/components/MkPagination.vue';
 import XAbuseReport from '@/components/MkAbuseReport.vue';
 import { i18n } from '@/i18n.js';
 import { definePageMetadata } from '@/scripts/page-metadata.js';
@@ -77,7 +77,7 @@ const pagination = {
 		reporterOrigin: reporterOrigin.value,
 		targetUserOrigin: targetUserOrigin.value,
 	})),
-};
+} satisfies Paging;
 
 function resolved(reportId) {
 	reports.value.removeItem(reportId);
diff --git a/packages/frontend/src/pages/admin/federation.vue b/packages/frontend/src/pages/admin/federation.vue
index bfe9a8c570..1b7823b09b 100644
--- a/packages/frontend/src/pages/admin/federation.vue
+++ b/packages/frontend/src/pages/admin/federation.vue
@@ -62,7 +62,7 @@ import { computed, ref } from 'vue';
 import XHeader from './_header_.vue';
 import MkInput from '@/components/MkInput.vue';
 import MkSelect from '@/components/MkSelect.vue';
-import MkPagination from '@/components/MkPagination.vue';
+import MkPagination, { Paging } from '@/components/MkPagination.vue';
 import MkInstanceCardMini from '@/components/MkInstanceCardMini.vue';
 import FormSplit from '@/components/form/split.vue';
 import { i18n } from '@/i18n.js';
@@ -88,7 +88,7 @@ const pagination = {
 			state.value === 'notResponding' ? { notResponding: true } :
 			{}),
 	})),
-};
+} satisfies Paging;
 
 function getStatus(instance) {
 	if (instance.isSuspended) return 'Suspended';
diff --git a/packages/frontend/src/pages/admin/invites.vue b/packages/frontend/src/pages/admin/invites.vue
index 838ef52b14..bfe33aeae4 100644
--- a/packages/frontend/src/pages/admin/invites.vue
+++ b/packages/frontend/src/pages/admin/invites.vue
@@ -73,7 +73,7 @@ const pagingComponent = shallowRef<InstanceType<typeof MkPagination>>();
 const type = ref('all');
 const sort = ref('+createdAt');
 
-const pagination: Paging = {
+const pagination = {
 	endpoint: 'admin/invite/list' as const,
 	limit: 10,
 	params: computed(() => ({
@@ -81,7 +81,7 @@ const pagination: Paging = {
 		sort: sort.value,
 	})),
 	offsetMode: true,
-};
+} satisfies Paging;
 
 const expiresAt = ref('');
 const noExpirationDate = ref(true);
@@ -97,10 +97,10 @@ async function createWithOptions() {
 	os.alert({
 		type: 'success',
 		title: i18n.ts.inviteCodeCreated,
-		text: tickets?.map(x => x.code).join('\n'),
+		text: tickets.map(x => x.code).join('\n'),
 	});
 
-	tickets?.forEach(ticket => pagingComponent.value?.prepend(ticket));
+	tickets.forEach(ticket => pagingComponent.value?.prepend(ticket));
 }
 
 function deleted(id: string) {
diff --git a/packages/frontend/src/pages/admin/modlog.vue b/packages/frontend/src/pages/admin/modlog.vue
index 8540156d43..8539412c3d 100644
--- a/packages/frontend/src/pages/admin/modlog.vue
+++ b/packages/frontend/src/pages/admin/modlog.vue
@@ -36,7 +36,7 @@ import XHeader from './_header_.vue';
 import XModLog from './modlog.ModLog.vue';
 import MkSelect from '@/components/MkSelect.vue';
 import MkInput from '@/components/MkInput.vue';
-import MkPagination from '@/components/MkPagination.vue';
+import MkPagination, { Paging } from '@/components/MkPagination.vue';
 import { i18n } from '@/i18n.js';
 import { definePageMetadata } from '@/scripts/page-metadata.js';
 
@@ -52,7 +52,7 @@ const pagination = {
 		type: type.value,
 		userId: moderatorId.value === '' ? null : moderatorId.value,
 	})),
-};
+} satisfies Paging;
 
 console.log(Misskey);
 
diff --git a/packages/frontend/src/pages/admin/roles.role.vue b/packages/frontend/src/pages/admin/roles.role.vue
index 9aa7d8dd3c..a90bdbe878 100644
--- a/packages/frontend/src/pages/admin/roles.role.vue
+++ b/packages/frontend/src/pages/admin/roles.role.vue
@@ -73,7 +73,7 @@ import { useRouter } from '@/router.js';
 import MkButton from '@/components/MkButton.vue';
 import MkUserCardMini from '@/components/MkUserCardMini.vue';
 import MkInfo from '@/components/MkInfo.vue';
-import MkPagination from '@/components/MkPagination.vue';
+import MkPagination, { Paging } from '@/components/MkPagination.vue';
 import { infoImageUrl } from '@/instance.js';
 
 const router = useRouter();
@@ -88,7 +88,7 @@ const usersPagination = {
 	params: computed(() => ({
 		roleId: props.id,
 	})),
-};
+} satisfies Paging;
 
 const expandedItems = ref([]);
 
diff --git a/packages/frontend/src/pages/admin/users.vue b/packages/frontend/src/pages/admin/users.vue
index ea4c231af2..8c9cb06e17 100644
--- a/packages/frontend/src/pages/admin/users.vue
+++ b/packages/frontend/src/pages/admin/users.vue
@@ -61,7 +61,7 @@ import { computed, shallowRef, ref } from 'vue';
 import XHeader from './_header_.vue';
 import MkInput from '@/components/MkInput.vue';
 import MkSelect from '@/components/MkSelect.vue';
-import MkPagination from '@/components/MkPagination.vue';
+import MkPagination, { Paging } from '@/components/MkPagination.vue';
 import * as os from '@/os.js';
 import { lookupUser } from '@/scripts/lookup-user.js';
 import { i18n } from '@/i18n.js';
@@ -87,7 +87,7 @@ const pagination = {
 		hostname: searchHost.value,
 	})),
 	offsetMode: true,
-};
+} satisfies Paging;
 
 function searchUser() {
 	os.selectUser().then(user => {
diff --git a/packages/frontend/src/pages/announcements.vue b/packages/frontend/src/pages/announcements.vue
index 8eca403707..d7c95fb19c 100644
--- a/packages/frontend/src/pages/announcements.vue
+++ b/packages/frontend/src/pages/announcements.vue
@@ -41,7 +41,7 @@ SPDX-License-Identifier: AGPL-3.0-only
 
 <script lang="ts" setup>
 import { ref, computed } from 'vue';
-import MkPagination from '@/components/MkPagination.vue';
+import MkPagination, { Paging } from '@/components/MkPagination.vue';
 import MkButton from '@/components/MkButton.vue';
 import MkInfo from '@/components/MkInfo.vue';
 import * as os from '@/os.js';
@@ -55,7 +55,7 @@ const paginationCurrent = {
 	params: {
 		isActive: true,
 	},
-};
+} satisfies Paging;
 
 const paginationPast = {
 	endpoint: 'announcements' as const,
@@ -63,7 +63,7 @@ const paginationPast = {
 	params: {
 		isActive: false,
 	},
-};
+} satisfies Paging;
 
 const paginationEl = ref<InstanceType<typeof MkPagination>>();
 
diff --git a/packages/frontend/src/pages/channels.vue b/packages/frontend/src/pages/channels.vue
index e58c89bb77..8bfae1a6e8 100644
--- a/packages/frontend/src/pages/channels.vue
+++ b/packages/frontend/src/pages/channels.vue
@@ -53,7 +53,7 @@ SPDX-License-Identifier: AGPL-3.0-only
 import { computed, onMounted, ref } from 'vue';
 import MkChannelPreview from '@/components/MkChannelPreview.vue';
 import MkChannelList from '@/components/MkChannelList.vue';
-import MkPagination from '@/components/MkPagination.vue';
+import MkPagination, { Paging } from '@/components/MkPagination.vue';
 import MkInput from '@/components/MkInput.vue';
 import MkRadios from '@/components/MkRadios.vue';
 import MkButton from '@/components/MkButton.vue';
@@ -83,20 +83,20 @@ onMounted(() => {
 const featuredPagination = {
 	endpoint: 'channels/featured' as const,
 	noPaging: true,
-};
+} satisfies Paging;
 const favoritesPagination = {
 	endpoint: 'channels/my-favorites' as const,
 	limit: 100,
 	noPaging: true,
-};
+} satisfies Paging;
 const followingPagination = {
 	endpoint: 'channels/followed' as const,
 	limit: 10,
-};
+} satisfies Paging;
 const ownedPagination = {
 	endpoint: 'channels/owned' as const,
 	limit: 10,
-};
+} satisfies Paging;
 
 async function search() {
 	const query = searchQuery.value.toString().trim();
diff --git a/packages/frontend/src/pages/custom-emojis-manager.vue b/packages/frontend/src/pages/custom-emojis-manager.vue
index 011857688d..d60573c70e 100644
--- a/packages/frontend/src/pages/custom-emojis-manager.vue
+++ b/packages/frontend/src/pages/custom-emojis-manager.vue
@@ -77,7 +77,7 @@ SPDX-License-Identifier: AGPL-3.0-only
 import { computed, defineAsyncComponent, ref, shallowRef } from 'vue';
 import MkButton from '@/components/MkButton.vue';
 import MkInput from '@/components/MkInput.vue';
-import MkPagination from '@/components/MkPagination.vue';
+import MkPagination, { Paging } from '@/components/MkPagination.vue';
 import MkSwitch from '@/components/MkSwitch.vue';
 import FormSplit from '@/components/form/split.vue';
 import { selectFile } from '@/scripts/select-file.js';
@@ -100,7 +100,7 @@ const pagination = {
 	params: computed(() => ({
 		query: (query.value && query.value !== '') ? query.value : null,
 	})),
-};
+} satisfies Paging;
 
 const remotePagination = {
 	endpoint: 'admin/emoji/list-remote' as const,
@@ -109,7 +109,7 @@ const remotePagination = {
 		query: (queryRemote.value && queryRemote.value !== '') ? queryRemote.value : null,
 		host: (host.value && host.value !== '') ? host.value : null,
 	})),
-};
+} satisfies Paging;
 
 const selectAll = () => {
 	if (selectedEmojis.value.length > 0) {
diff --git a/packages/frontend/src/pages/favorites.vue b/packages/frontend/src/pages/favorites.vue
index 63a0057b74..4de845131f 100644
--- a/packages/frontend/src/pages/favorites.vue
+++ b/packages/frontend/src/pages/favorites.vue
@@ -26,7 +26,7 @@ SPDX-License-Identifier: AGPL-3.0-only
 </template>
 
 <script lang="ts" setup>
-import MkPagination from '@/components/MkPagination.vue';
+import MkPagination, { Paging } from '@/components/MkPagination.vue';
 import MkNote from '@/components/MkNote.vue';
 import MkDateSeparatedList from '@/components/MkDateSeparatedList.vue';
 import { i18n } from '@/i18n.js';
@@ -36,7 +36,7 @@ import { infoImageUrl } from '@/instance.js';
 const pagination = {
 	endpoint: 'i/favorites' as const,
 	limit: 10,
-};
+} satisfies Paging;
 
 definePageMetadata({
 	title: i18n.ts.favorites,
diff --git a/packages/frontend/src/pages/flash/flash-index.vue b/packages/frontend/src/pages/flash/flash-index.vue
index e0b9f87d46..3ba0d56887 100644
--- a/packages/frontend/src/pages/flash/flash-index.vue
+++ b/packages/frontend/src/pages/flash/flash-index.vue
@@ -40,7 +40,7 @@ SPDX-License-Identifier: AGPL-3.0-only
 <script lang="ts" setup>
 import { computed, ref } from 'vue';
 import MkFlashPreview from '@/components/MkFlashPreview.vue';
-import MkPagination from '@/components/MkPagination.vue';
+import MkPagination, { Paging } from '@/components/MkPagination.vue';
 import MkButton from '@/components/MkButton.vue';
 import { useRouter } from '@/router.js';
 import { i18n } from '@/i18n.js';
@@ -53,15 +53,15 @@ const tab = ref('featured');
 const featuredFlashsPagination = {
 	endpoint: 'flash/featured' as const,
 	noPaging: true,
-};
+} satisfies Paging;
 const myFlashsPagination = {
 	endpoint: 'flash/my' as const,
 	limit: 5,
-};
+} satisfies Paging;
 const likedFlashsPagination = {
 	endpoint: 'flash/my-likes' as const,
 	limit: 5,
-};
+} satisfies Paging;
 
 function create() {
 	router.push('/play/new');
diff --git a/packages/frontend/src/pages/follow-requests.vue b/packages/frontend/src/pages/follow-requests.vue
index 51f31b1ca5..87d3c42c63 100644
--- a/packages/frontend/src/pages/follow-requests.vue
+++ b/packages/frontend/src/pages/follow-requests.vue
@@ -38,7 +38,7 @@ SPDX-License-Identifier: AGPL-3.0-only
 
 <script lang="ts" setup>
 import { shallowRef, computed } from 'vue';
-import MkPagination from '@/components/MkPagination.vue';
+import MkPagination, { Paging } from '@/components/MkPagination.vue';
 import MkButton from '@/components/MkButton.vue';
 import { userPage, acct } from '@/filters/user.js';
 import * as os from '@/os.js';
@@ -51,7 +51,7 @@ const paginationComponent = shallowRef<InstanceType<typeof MkPagination>>();
 const pagination = {
 	endpoint: 'following/requests/list' as const,
 	limit: 10,
-};
+} satisfies Paging;
 
 function accept(user) {
 	os.api('following/requests/accept', { userId: user.id }).then(() => {
diff --git a/packages/frontend/src/pages/gallery/index.vue b/packages/frontend/src/pages/gallery/index.vue
index 8d9ac07805..fdcf117ffe 100644
--- a/packages/frontend/src/pages/gallery/index.vue
+++ b/packages/frontend/src/pages/gallery/index.vue
@@ -49,7 +49,7 @@ SPDX-License-Identifier: AGPL-3.0-only
 <script lang="ts" setup>
 import { watch, ref, computed } from 'vue';
 import MkFoldableSection from '@/components/MkFoldableSection.vue';
-import MkPagination from '@/components/MkPagination.vue';
+import MkPagination, { Paging } from '@/components/MkPagination.vue';
 import MkGalleryPostPreview from '@/components/MkGalleryPostPreview.vue';
 import { definePageMetadata } from '@/scripts/page-metadata.js';
 import { i18n } from '@/i18n.js';
@@ -68,19 +68,19 @@ const tagsRef = ref();
 const recentPostsPagination = {
 	endpoint: 'gallery/posts' as const,
 	limit: 6,
-};
+} satisfies Paging;
 const popularPostsPagination = {
 	endpoint: 'gallery/featured' as const,
 	noPaging: true,
-};
+} satisfies Paging;
 const myPostsPagination = {
 	endpoint: 'i/gallery/posts' as const,
 	limit: 5,
-};
+} satisfies Paging;
 const likedPostsPagination = {
 	endpoint: 'i/gallery/likes' as const,
 	limit: 5,
-};
+} satisfies Paging;
 
 const tagUsersPagination = computed(() => ({
 	endpoint: 'hashtags/users' as const,
@@ -90,7 +90,7 @@ const tagUsersPagination = computed(() => ({
 		origin: 'combined',
 		sort: '+follower',
 	},
-}));
+} satisfies Paging));
 
 watch(() => props.tag, () => {
 	if (tagsRef.value) tagsRef.value.tags.toggleContent(props.tag == null);
diff --git a/packages/frontend/src/pages/gallery/post.vue b/packages/frontend/src/pages/gallery/post.vue
index 77af81cec1..96a56c003b 100644
--- a/packages/frontend/src/pages/gallery/post.vue
+++ b/packages/frontend/src/pages/gallery/post.vue
@@ -67,7 +67,7 @@ import * as Misskey from 'misskey-js';
 import MkButton from '@/components/MkButton.vue';
 import * as os from '@/os.js';
 import MkContainer from '@/components/MkContainer.vue';
-import MkPagination from '@/components/MkPagination.vue';
+import MkPagination, { Paging } from '@/components/MkPagination.vue';
 import MkGalleryPostPreview from '@/components/MkGalleryPostPreview.vue';
 import MkFollowButton from '@/components/MkFollowButton.vue';
 import { url } from '@/config.js';
@@ -93,7 +93,7 @@ const otherPostsPagination = {
 	params: computed(() => ({
 		userId: post.value.user.id,
 	})),
-};
+} satisfies Paging;
 
 function fetchPost() {
 	post.value = null;
diff --git a/packages/frontend/src/pages/instance-info.vue b/packages/frontend/src/pages/instance-info.vue
index 97dc0a8633..0eee4ce190 100644
--- a/packages/frontend/src/pages/instance-info.vue
+++ b/packages/frontend/src/pages/instance-info.vue
@@ -134,7 +134,7 @@ import { iAmModerator, iAmAdmin } from '@/account.js';
 import { definePageMetadata } from '@/scripts/page-metadata.js';
 import { i18n } from '@/i18n.js';
 import MkUserCardMini from '@/components/MkUserCardMini.vue';
-import MkPagination from '@/components/MkPagination.vue';
+import MkPagination, { Paging } from '@/components/MkPagination.vue';
 import { getProxiedImageUrlNullable } from '@/scripts/media-proxy.js';
 import { dateString } from '@/filters/date.js';
 
@@ -160,7 +160,7 @@ const usersPagination = {
 		hostname: props.host,
 	},
 	offsetMode: true,
-};
+} satisfies Paging;
 
 async function fetch(): Promise<void> {
 	if (iAmAdmin) {
diff --git a/packages/frontend/src/pages/invite.vue b/packages/frontend/src/pages/invite.vue
index 25ce38e0ef..eef07b8079 100644
--- a/packages/frontend/src/pages/invite.vue
+++ b/packages/frontend/src/pages/invite.vue
@@ -52,10 +52,10 @@ const currentInviteLimit = ref<null | number>(null);
 const inviteLimit = (($i != null && $i.policies.inviteLimit) || (($i == null && instance.policies.inviteLimit))) as number;
 const inviteLimitCycle = (($i != null && $i.policies.inviteLimitCycle) || ($i == null && instance.policies.inviteLimitCycle)) as number;
 
-const pagination: Paging = {
+const pagination = {
 	endpoint: 'invite/list' as const,
 	limit: 10,
-};
+} satisfies Paging;
 
 const resetCycle = computed<null | string>(() => {
 	if (!inviteLimitCycle) return null;
diff --git a/packages/frontend/src/pages/my-clips/index.vue b/packages/frontend/src/pages/my-clips/index.vue
index bc09e916e3..ce9ab67152 100644
--- a/packages/frontend/src/pages/my-clips/index.vue
+++ b/packages/frontend/src/pages/my-clips/index.vue
@@ -28,7 +28,7 @@ SPDX-License-Identifier: AGPL-3.0-only
 <script lang="ts" setup>
 import { watch, ref, shallowRef, computed } from 'vue';
 import * as Misskey from 'misskey-js';
-import MkPagination from '@/components/MkPagination.vue';
+import MkPagination, { Paging } from '@/components/MkPagination.vue';
 import MkButton from '@/components/MkButton.vue';
 import MkClipPreview from '@/components/MkClipPreview.vue';
 import * as os from '@/os.js';
@@ -40,7 +40,7 @@ const pagination = {
 	endpoint: 'clips/list' as const,
 	noPaging: true,
 	limit: 10,
-};
+} satisfies Paging;
 
 const tab = ref('my');
 const favorites = ref<Misskey.entities.Clip[] | null>(null);
diff --git a/packages/frontend/src/pages/my-lists/list.vue b/packages/frontend/src/pages/my-lists/list.vue
index cf9da02868..98d3c80ac2 100644
--- a/packages/frontend/src/pages/my-lists/list.vue
+++ b/packages/frontend/src/pages/my-lists/list.vue
@@ -68,7 +68,7 @@ import MkInput from '@/components/MkInput.vue';
 import { userListsCache } from '@/cache.js';
 import { $i } from '@/account.js';
 import { defaultStore } from '@/store.js';
-import MkPagination from '@/components/MkPagination.vue';
+import MkPagination, { Paging } from '@/components/MkPagination.vue';
 
 const {
 	enableInfiniteScroll,
@@ -88,7 +88,7 @@ const membershipsPagination = {
 	params: computed(() => ({
 		listId: props.listId,
 	})),
-};
+} satisfies Paging;
 
 function fetchList() {
 	os.api('users/lists/show', {
diff --git a/packages/frontend/src/pages/page.vue b/packages/frontend/src/pages/page.vue
index 11c8e15e14..138249f12c 100644
--- a/packages/frontend/src/pages/page.vue
+++ b/packages/frontend/src/pages/page.vue
@@ -85,7 +85,7 @@ import { url } from '@/config.js';
 import MkMediaImage from '@/components/MkMediaImage.vue';
 import MkFollowButton from '@/components/MkFollowButton.vue';
 import MkContainer from '@/components/MkContainer.vue';
-import MkPagination from '@/components/MkPagination.vue';
+import MkPagination, { Paging } from '@/components/MkPagination.vue';
 import MkPagePreview from '@/components/MkPagePreview.vue';
 import { i18n } from '@/i18n.js';
 import { definePageMetadata } from '@/scripts/page-metadata.js';
@@ -108,7 +108,7 @@ const otherPostsPagination = {
 	params: computed(() => ({
 		userId: page.value.user.id,
 	})),
-};
+} satisfies Paging;
 const path = computed(() => props.username + '/' + props.pageName);
 
 function fetchPage() {
diff --git a/packages/frontend/src/pages/pages.vue b/packages/frontend/src/pages/pages.vue
index bc51b55c7f..dc6b02b0b2 100644
--- a/packages/frontend/src/pages/pages.vue
+++ b/packages/frontend/src/pages/pages.vue
@@ -38,7 +38,7 @@ SPDX-License-Identifier: AGPL-3.0-only
 <script lang="ts" setup>
 import { computed, ref } from 'vue';
 import MkPagePreview from '@/components/MkPagePreview.vue';
-import MkPagination from '@/components/MkPagination.vue';
+import MkPagination, { Paging } from '@/components/MkPagination.vue';
 import MkButton from '@/components/MkButton.vue';
 import { useRouter } from '@/router.js';
 import { i18n } from '@/i18n.js';
@@ -51,15 +51,15 @@ const tab = ref('featured');
 const featuredPagesPagination = {
 	endpoint: 'pages/featured' as const,
 	noPaging: true,
-};
+} satisfies Paging;
 const myPagesPagination = {
 	endpoint: 'i/pages' as const,
 	limit: 5,
-};
+} satisfies Paging;
 const likedPagesPagination = {
 	endpoint: 'i/page-likes' as const,
 	limit: 5,
-};
+} satisfies Paging;
 
 function create() {
 	router.push('/pages/new');
diff --git a/packages/frontend/src/pages/settings/apps.vue b/packages/frontend/src/pages/settings/apps.vue
index 419bcd6fee..64bef63a34 100644
--- a/packages/frontend/src/pages/settings/apps.vue
+++ b/packages/frontend/src/pages/settings/apps.vue
@@ -46,7 +46,7 @@ SPDX-License-Identifier: AGPL-3.0-only
 
 <script lang="ts" setup>
 import { ref, computed } from 'vue';
-import FormPagination from '@/components/MkPagination.vue';
+import FormPagination, { Paging } from '@/components/MkPagination.vue';
 import * as os from '@/os.js';
 import { i18n } from '@/i18n.js';
 import { definePageMetadata } from '@/scripts/page-metadata.js';
@@ -63,7 +63,7 @@ const pagination = {
 	params: {
 		sort: '+lastUsedAt',
 	},
-};
+} satisfies Paging;
 
 function revoke(token) {
 	os.api('i/revoke-token', { tokenId: token.id }).then(() => {
diff --git a/packages/frontend/src/pages/settings/drive-cleaner.vue b/packages/frontend/src/pages/settings/drive-cleaner.vue
index 4efcdb31da..41fee08fd2 100644
--- a/packages/frontend/src/pages/settings/drive-cleaner.vue
+++ b/packages/frontend/src/pages/settings/drive-cleaner.vue
@@ -51,7 +51,7 @@ SPDX-License-Identifier: AGPL-3.0-only
 import { computed, ref, watch } from 'vue';
 import tinycolor from 'tinycolor2';
 import * as os from '@/os.js';
-import MkPagination from '@/components/MkPagination.vue';
+import MkPagination, { Paging } from '@/components/MkPagination.vue';
 import MkDriveFileThumbnail from '@/components/MkDriveFileThumbnail.vue';
 import { i18n } from '@/i18n.js';
 import bytes from '@/filters/bytes.js';
@@ -64,7 +64,7 @@ const pagination = {
 	endpoint: 'drive/files' as const,
 	limit: 10,
 	params: computed(() => ({ sort: sortMode.value })),
-};
+} satisfies Paging;
 
 const sortOptions = [
 	{ value: 'sizeDesc', displayName: i18n.ts._drivecleaner.orderBySizeDesc },
diff --git a/packages/frontend/src/pages/settings/mute-block.vue b/packages/frontend/src/pages/settings/mute-block.vue
index 83f7baf428..b9d3d38fbe 100644
--- a/packages/frontend/src/pages/settings/mute-block.vue
+++ b/packages/frontend/src/pages/settings/mute-block.vue
@@ -129,7 +129,7 @@ SPDX-License-Identifier: AGPL-3.0-only
 import { ref, computed } from 'vue';
 import XInstanceMute from './mute-block.instance-mute.vue';
 import XWordMute from './mute-block.word-mute.vue';
-import MkPagination from '@/components/MkPagination.vue';
+import MkPagination, { Paging } from '@/components/MkPagination.vue';
 import { userPage } from '@/filters/user.js';
 import { i18n } from '@/i18n.js';
 import { definePageMetadata } from '@/scripts/page-metadata.js';
@@ -142,17 +142,17 @@ import MkFolder from '@/components/MkFolder.vue';
 const renoteMutingPagination = {
 	endpoint: 'renote-mute/list' as const,
 	limit: 10,
-};
+} satisfies Paging;
 
 const mutingPagination = {
 	endpoint: 'mute/list' as const,
 	limit: 10,
-};
+} satisfies Paging;
 
 const blockingPagination = {
 	endpoint: 'blocking/list' as const,
 	limit: 10,
-};
+} satisfies Paging;
 
 const expandedRenoteMuteItems = ref([]);
 const expandedMuteItems = ref([]);
diff --git a/packages/frontend/src/pages/settings/security.vue b/packages/frontend/src/pages/settings/security.vue
index 3f85f27e47..145f3c5c92 100644
--- a/packages/frontend/src/pages/settings/security.vue
+++ b/packages/frontend/src/pages/settings/security.vue
@@ -45,7 +45,7 @@ import X2fa from './2fa.vue';
 import FormSection from '@/components/form/section.vue';
 import FormSlot from '@/components/form/slot.vue';
 import MkButton from '@/components/MkButton.vue';
-import MkPagination from '@/components/MkPagination.vue';
+import MkPagination, { Paging } from '@/components/MkPagination.vue';
 import * as os from '@/os.js';
 import { i18n } from '@/i18n.js';
 import { definePageMetadata } from '@/scripts/page-metadata.js';
@@ -53,7 +53,7 @@ import { definePageMetadata } from '@/scripts/page-metadata.js';
 const pagination = {
 	endpoint: 'i/signin-history' as const,
 	limit: 5,
-};
+} satisfies Paging;
 
 async function change() {
 	const { canceled: canceled2, result: newPassword } = await os.inputText({
diff --git a/packages/frontend/src/pages/settings/webhook.vue b/packages/frontend/src/pages/settings/webhook.vue
index 334e5e841b..3fb86c6198 100644
--- a/packages/frontend/src/pages/settings/webhook.vue
+++ b/packages/frontend/src/pages/settings/webhook.vue
@@ -34,7 +34,7 @@ SPDX-License-Identifier: AGPL-3.0-only
 
 <script lang="ts" setup>
 import { computed } from 'vue';
-import MkPagination from '@/components/MkPagination.vue';
+import MkPagination, { Paging } from '@/components/MkPagination.vue';
 import FormSection from '@/components/form/section.vue';
 import FormLink from '@/components/form/link.vue';
 import { definePageMetadata } from '@/scripts/page-metadata.js';
@@ -44,7 +44,7 @@ const pagination = {
 	endpoint: 'i/webhooks/list' as const,
 	limit: 100,
 	noPaging: true,
-};
+} satisfies Paging;
 
 const headerActions = computed(() => []);
 
diff --git a/packages/frontend/src/pages/user/clips.vue b/packages/frontend/src/pages/user/clips.vue
index eaae472516..da17975fdf 100644
--- a/packages/frontend/src/pages/user/clips.vue
+++ b/packages/frontend/src/pages/user/clips.vue
@@ -19,7 +19,7 @@ SPDX-License-Identifier: AGPL-3.0-only
 <script lang="ts" setup>
 import { computed } from 'vue';
 import * as Misskey from 'misskey-js';
-import MkPagination from '@/components/MkPagination.vue';
+import MkPagination, { Paging } from '@/components/MkPagination.vue';
 
 const props = defineProps<{
 	user: Misskey.entities.User;
@@ -31,7 +31,7 @@ const pagination = {
 	params: computed(() => ({
 		userId: props.user.id,
 	})),
-};
+} satisfies Paging;
 </script>
 
 <style lang="scss" module>
diff --git a/packages/frontend/src/pages/user/flashs.vue b/packages/frontend/src/pages/user/flashs.vue
index 5e93a0b04c..267b1a2b87 100644
--- a/packages/frontend/src/pages/user/flashs.vue
+++ b/packages/frontend/src/pages/user/flashs.vue
@@ -15,7 +15,7 @@ SPDX-License-Identifier: AGPL-3.0-only
 import { computed } from 'vue';
 import * as Misskey from 'misskey-js';
 import MkFlashPreview from '@/components/MkFlashPreview.vue';
-import MkPagination from '@/components/MkPagination.vue';
+import MkPagination, { Paging } from '@/components/MkPagination.vue';
 
 const props = defineProps<{
 	user: Misskey.entities.User;
@@ -27,5 +27,5 @@ const pagination = {
 	params: computed(() => ({
 		userId: props.user.id,
 	})),
-};
+} satisfies Paging;
 </script>
diff --git a/packages/frontend/src/pages/user/follow-list.vue b/packages/frontend/src/pages/user/follow-list.vue
index 19b7290353..7c0cb72067 100644
--- a/packages/frontend/src/pages/user/follow-list.vue
+++ b/packages/frontend/src/pages/user/follow-list.vue
@@ -17,7 +17,7 @@ SPDX-License-Identifier: AGPL-3.0-only
 import { computed } from 'vue';
 import * as Misskey from 'misskey-js';
 import MkUserInfo from '@/components/MkUserInfo.vue';
-import MkPagination from '@/components/MkPagination.vue';
+import MkPagination, { Paging } from '@/components/MkPagination.vue';
 
 const props = defineProps<{
 	user: Misskey.entities.User;
@@ -30,7 +30,7 @@ const followingPagination = {
 	params: computed(() => ({
 		userId: props.user.id,
 	})),
-};
+} satisfies Paging;
 
 const followersPagination = {
 	endpoint: 'users/followers' as const,
@@ -38,7 +38,7 @@ const followersPagination = {
 	params: computed(() => ({
 		userId: props.user.id,
 	})),
-};
+} satisfies Paging;
 </script>
 
 <style lang="scss" module>
diff --git a/packages/frontend/src/pages/user/gallery.vue b/packages/frontend/src/pages/user/gallery.vue
index 0d806100d9..f7ec850965 100644
--- a/packages/frontend/src/pages/user/gallery.vue
+++ b/packages/frontend/src/pages/user/gallery.vue
@@ -17,7 +17,7 @@ SPDX-License-Identifier: AGPL-3.0-only
 import { computed } from 'vue';
 import * as Misskey from 'misskey-js';
 import MkGalleryPostPreview from '@/components/MkGalleryPostPreview.vue';
-import MkPagination from '@/components/MkPagination.vue';
+import MkPagination, { Paging } from '@/components/MkPagination.vue';
 
 const props = withDefaults(defineProps<{
 	user: Misskey.entities.User;
@@ -30,7 +30,7 @@ const pagination = {
 	params: computed(() => ({
 		userId: props.user.id,
 	})),
-};
+} satisfies Paging;
 </script>
 
 <style lang="scss" module>
diff --git a/packages/frontend/src/pages/user/lists.vue b/packages/frontend/src/pages/user/lists.vue
index 4b9c5cbf8f..2b6f1cb86a 100644
--- a/packages/frontend/src/pages/user/lists.vue
+++ b/packages/frontend/src/pages/user/lists.vue
@@ -21,7 +21,7 @@ SPDX-License-Identifier: AGPL-3.0-only
 <script lang="ts" setup>
 import {} from 'vue';
 import * as Misskey from 'misskey-js';
-import MkPagination from '@/components/MkPagination.vue';
+import MkPagination, { Paging } from '@/components/MkPagination.vue';
 import MkStickyContainer from '@/components/global/MkStickyContainer.vue';
 import MkSpacer from '@/components/global/MkSpacer.vue';
 import MkAvatars from '@/components/MkAvatars.vue';
@@ -37,7 +37,7 @@ const pagination = {
 	params: {
 		userId: props.user.id,
 	},
-};
+} satisfies Paging;
 </script>
 
 <style lang="scss" module>
diff --git a/packages/frontend/src/pages/user/pages.vue b/packages/frontend/src/pages/user/pages.vue
index 94ec80d05e..03373c3dfe 100644
--- a/packages/frontend/src/pages/user/pages.vue
+++ b/packages/frontend/src/pages/user/pages.vue
@@ -15,7 +15,7 @@ SPDX-License-Identifier: AGPL-3.0-only
 import { computed } from 'vue';
 import * as Misskey from 'misskey-js';
 import MkPagePreview from '@/components/MkPagePreview.vue';
-import MkPagination from '@/components/MkPagination.vue';
+import MkPagination, { Paging } from '@/components/MkPagination.vue';
 
 const props = defineProps<{
 	user: Misskey.entities.User;
@@ -27,5 +27,5 @@ const pagination = {
 	params: computed(() => ({
 		userId: props.user.id,
 	})),
-};
+} satisfies Paging;
 </script>
diff --git a/packages/frontend/src/pages/user/reactions.vue b/packages/frontend/src/pages/user/reactions.vue
index 916b6615d5..dea66c6a17 100644
--- a/packages/frontend/src/pages/user/reactions.vue
+++ b/packages/frontend/src/pages/user/reactions.vue
@@ -21,7 +21,7 @@ SPDX-License-Identifier: AGPL-3.0-only
 <script lang="ts" setup>
 import { computed } from 'vue';
 import * as Misskey from 'misskey-js';
-import MkPagination from '@/components/MkPagination.vue';
+import MkPagination, { Paging } from '@/components/MkPagination.vue';
 import MkNote from '@/components/MkNote.vue';
 import MkReactionIcon from '@/components/MkReactionIcon.vue';
 
@@ -35,7 +35,7 @@ const pagination = {
 	params: computed(() => ({
 		userId: props.user.id,
 	})),
-};
+} satisfies Paging;
 </script>
 
 <style lang="scss" module>