import type { PageMapItem } from 'nextra/dist/types' export type PageMetadata = { route: string title: string frontMatter: Record path: { title: string route?: string }[] } const _fromMap = ( path: PageMetadata['path'], list: PageMapItem[], ): PageMetadata[] => { const meta = list.find((item) => item.kind === 'Meta') as Extract< PageMapItem, { kind: 'Meta' } > const pages = list.filter((item) => item.kind === 'MdxPage') as Extract< PageMapItem, { kind: 'MdxPage' } >[] const folders = list.filter((item) => item.kind === 'Folder') as Extract< PageMapItem, { kind: 'Folder' } >[] const findTitle = (item: PageMapItem) => { if (item.kind === 'Meta') return '' const name = item.name const metadata = meta.data[name] if (!metadata && item.kind === 'Folder') return name if (!metadata && item.kind === 'MdxPage') return '' return typeof metadata === 'string' ? metadata : metadata?.title || '' } return [ ...pages.map( (page) => ({ route: page.route, title: findTitle(page) || '', frontMatter: page.frontMatter || {}, path: [ ...path, { title: findTitle(page), route: page.route, }, ], }) as PageMetadata, ), ...folders.flatMap((folder: any) => { return _fromMap( [...path, { title: findTitle(folder), route: folder.route }], folder.children, ) }), ] } export class PagesMetadata { data: Record = {} constructor() {} get = (route: string) => this.data[route] toJson = () => ({ data: this.data, }) fromJson = (data: any) => { this.data = data?.data || {} return this } static fromPageMap(list: PageMapItem[]) { const data = _fromMap([], list) const instance = new PagesMetadata() instance.data = Object.fromEntries(data.map((item) => [item.route, item])) return instance } }