import type { LocationQuery } from 'vue-router' import { DEFAULT_PAGE_SIZE, PAGE_SIZES, SEARCH_MAX_LENGTH, firstQueryValue, parsePositiveInteger, } from '@/lib/pageQuery' export interface DirectoryQuery { q: string page: number size: number } export function parseDirectoryQuery(query: LocationQuery): DirectoryQuery { const page = firstQueryValue(query.page) const size = Number(firstQueryValue(query.size)) return { q: firstQueryValue(query.q).slice(0, SEARCH_MAX_LENGTH), page: parsePositiveInteger(page) ?? 1, size: PAGE_SIZES.includes(size) ? size : DEFAULT_PAGE_SIZE, } } export function toDirectoryRouteQuery(query: DirectoryQuery, rest: LocationQuery = {}) { const route: Record = {} for (const [key, value] of Object.entries(rest)) { if (key !== 'q' && key !== 'page' && key !== 'size') { route[key] = firstQueryValue(value) } } if (query.q) { route.q = query.q } if (query.page !== 1) { route.page = String(query.page) } if (query.size !== DEFAULT_PAGE_SIZE) { route.size = String(query.size) } return route }