starlight-sidebar-topics
Version:
Starlight plugin to split your documentation into different sections, each with its own sidebar.
45 lines (37 loc) • 1.42 kB
text/typescript
import type { ViteUserConfig } from 'astro'
import type {
StarlightSidebarTopicsConfig,
StarlightSidebarTopicsOptions,
StarlightSidebarTopicsSharedConfig,
} from './config'
export function vitePluginStarlightSidebarTopics(
config: StarlightSidebarTopicsConfig,
options: StarlightSidebarTopicsOptions,
): VitePlugin {
const sharedConfig: StarlightSidebarTopicsSharedConfig = config.map((topic) => {
if (!('items' in topic)) return { ...topic, type: 'link' }
const { items, ...topicWithoutItems } = topic
return { ...topicWithoutItems, type: 'group' }
})
const modules = {
'virtual:starlight-sidebar-topics/config': `export default ${JSON.stringify(sharedConfig)}`,
'virtual:starlight-sidebar-topics/options': `export default ${JSON.stringify(options)}`,
}
const moduleResolutionMap = Object.fromEntries(
(Object.keys(modules) as (keyof typeof modules)[]).map((key) => [resolveVirtualModuleId(key), key]),
)
return {
name: 'vite-plugin-starlight-sidebar-topics',
load(id) {
const moduleId = moduleResolutionMap[id]
return moduleId ? modules[moduleId] : undefined
},
resolveId(id) {
return id in modules ? resolveVirtualModuleId(id) : undefined
},
}
}
function resolveVirtualModuleId<TModuleId extends string>(id: TModuleId): `\0${TModuleId}` {
return `\0${id}`
}
type VitePlugin = NonNullable<ViteUserConfig['plugins']>[number]