@codemonster-ru/vue-ssg-core 1.0.1 → 1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +1 -0
- package/dist/index.js +59 -7
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -198,6 +198,45 @@ function normalizeDocPath(sourcePath) {
|
|
|
198
198
|
}
|
|
199
199
|
return `/${relativePath}`;
|
|
200
200
|
}
|
|
201
|
+
function isIndexSourcePath(sourcePath) {
|
|
202
|
+
return sourcePath.replace(/\\/g, "/").replace(/\.md$/, "").endsWith("/index");
|
|
203
|
+
}
|
|
204
|
+
function normalizeMarkdownLinkHref(href) {
|
|
205
|
+
if (href.startsWith("#") || href.startsWith("//") || /^[a-z][a-z\d+.-]*:/i.test(href)) {
|
|
206
|
+
return href;
|
|
207
|
+
}
|
|
208
|
+
const match = href.match(/^([^?#]*)([?#].*)?$/);
|
|
209
|
+
if (!match) {
|
|
210
|
+
return href;
|
|
211
|
+
}
|
|
212
|
+
const [, pathname, suffix = ""] = match;
|
|
213
|
+
if (!/\.(?:md|mdx)$/i.test(pathname)) {
|
|
214
|
+
return href;
|
|
215
|
+
}
|
|
216
|
+
const extensionlessPathname = pathname.replace(/\.(?:md|mdx)$/i, "");
|
|
217
|
+
let normalizedPathname = extensionlessPathname;
|
|
218
|
+
if (extensionlessPathname === "index" || extensionlessPathname === "./index") {
|
|
219
|
+
normalizedPathname = ".";
|
|
220
|
+
} else if (extensionlessPathname.endsWith("/index")) {
|
|
221
|
+
normalizedPathname = extensionlessPathname.replace(/\/index$/, "");
|
|
222
|
+
}
|
|
223
|
+
return `${normalizedPathname}${suffix}`;
|
|
224
|
+
}
|
|
225
|
+
function normalizeMarkdownLinks(tokens) {
|
|
226
|
+
for (const token of tokens) {
|
|
227
|
+
if (token.type === "link" && typeof token.href === "string") {
|
|
228
|
+
token.href = normalizeMarkdownLinkHref(token.href);
|
|
229
|
+
}
|
|
230
|
+
if ("tokens" in token && Array.isArray(token.tokens)) {
|
|
231
|
+
normalizeMarkdownLinks(token.tokens);
|
|
232
|
+
}
|
|
233
|
+
if (token.type === "list" && Array.isArray(token.items)) {
|
|
234
|
+
for (const item of token.items) {
|
|
235
|
+
normalizeMarkdownLinks(item.tokens);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
}
|
|
201
240
|
function toValueFromPath(path) {
|
|
202
241
|
return path === "/" ? "index" : path.replace(/^\//, "").replace(/\//g, "-");
|
|
203
242
|
}
|
|
@@ -212,6 +251,7 @@ function renderListItemTokens(tokens) {
|
|
|
212
251
|
}
|
|
213
252
|
function renderMarkdown(markdown, tocLevels) {
|
|
214
253
|
const tokens = marked.lexer(markdown);
|
|
254
|
+
normalizeMarkdownLinks(tokens);
|
|
215
255
|
const headingSlugger = new GithubSlugger();
|
|
216
256
|
const tableOfContents = [];
|
|
217
257
|
const blocks = [];
|
|
@@ -273,20 +313,28 @@ function renderMarkdown(markdown, tocLevels) {
|
|
|
273
313
|
}
|
|
274
314
|
return { blocks, tableOfContents };
|
|
275
315
|
}
|
|
316
|
+
function getFirstHeadingText(markdown) {
|
|
317
|
+
const tokens = marked.lexer(markdown);
|
|
318
|
+
const heading = tokens.find((token) => token.type === "heading" && token.depth === 1);
|
|
319
|
+
return heading?.text.trim() || void 0;
|
|
320
|
+
}
|
|
276
321
|
function parsePage(sourcePath, source, tocLevels) {
|
|
277
322
|
const { data: frontmatter, content } = parseFrontmatter(source);
|
|
278
323
|
const path = normalizeDocPath(sourcePath);
|
|
279
324
|
const pathSegments = path === "/" ? [] : path.replace(/^\//, "").split("/");
|
|
280
|
-
const
|
|
325
|
+
const isIndexPage = isIndexSourcePath(sourcePath);
|
|
326
|
+
const section = isIndexPage ? pathSegments : pathSegments.slice(0, -1);
|
|
281
327
|
const filename = pathSegments[pathSegments.length - 1] ?? "index";
|
|
282
|
-
const fallbackTitle =
|
|
328
|
+
const fallbackTitle = isIndexPage ? getFirstHeadingText(content) ?? "Overview" : toTitleCase(filename);
|
|
283
329
|
const title = frontmatter.title?.trim() || fallbackTitle;
|
|
284
|
-
const navTitle = frontmatter.navTitle?.trim() || title;
|
|
330
|
+
const navTitle = frontmatter.navTitle?.trim() || (isIndexPage ? "Overview" : title);
|
|
285
331
|
const { blocks, tableOfContents } = renderMarkdown(content, tocLevels);
|
|
332
|
+
const id = isIndexPage && path !== "/" ? `${toValueFromPath(path)}-index` : toValueFromPath(path);
|
|
286
333
|
return {
|
|
287
|
-
id
|
|
334
|
+
id,
|
|
288
335
|
path,
|
|
289
336
|
sourcePath,
|
|
337
|
+
isIndexPage,
|
|
290
338
|
title,
|
|
291
339
|
navTitle,
|
|
292
340
|
description: frontmatter.description?.trim(),
|
|
@@ -316,22 +364,26 @@ function buildSidebar(pages, docsConfig) {
|
|
|
316
364
|
current.set(segment, {
|
|
317
365
|
label: sectionConfig?.label ?? toTitleCase(segment),
|
|
318
366
|
order: sectionConfig?.order ?? 1e3,
|
|
367
|
+
value: toValueFromPath(currentPath),
|
|
319
368
|
path: currentPath,
|
|
320
369
|
children: /* @__PURE__ */ new Map()
|
|
321
370
|
});
|
|
322
371
|
}
|
|
323
372
|
current = current.get(segment).children;
|
|
324
373
|
}
|
|
325
|
-
|
|
374
|
+
const pageKey = page.isIndexPage ? "index" : page.id;
|
|
375
|
+
const existingPageNode = current.get(pageKey);
|
|
376
|
+
current.set(pageKey, {
|
|
326
377
|
label: page.navTitle,
|
|
327
378
|
order: page.order,
|
|
379
|
+
value: page.id,
|
|
328
380
|
path: page.path,
|
|
329
|
-
children: /* @__PURE__ */ new Map()
|
|
381
|
+
children: existingPageNode?.children ?? /* @__PURE__ */ new Map()
|
|
330
382
|
});
|
|
331
383
|
}
|
|
332
384
|
const toItems = (nodes) => sortNodes([...nodes.values()]).map((node) => {
|
|
333
385
|
const item = {
|
|
334
|
-
value: toValueFromPath(node.path ?? node.label),
|
|
386
|
+
value: node.value ?? toValueFromPath(node.path ?? node.label),
|
|
335
387
|
label: node.label
|
|
336
388
|
};
|
|
337
389
|
const children = toItems(node.children);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/createViteSsgApp.ts","../src/docsContent.ts","../src/routes.ts","../src/config.ts"],"sourcesContent":["import { createHead as createClientHead } from '@unhead/vue/client'\nimport { createHead as createServerHead } from '@unhead/vue/server'\nimport { createApp, createSSRApp, type Component } from 'vue'\nimport {\n createMemoryHistory,\n createRouter,\n createWebHistory,\n type RouteRecordRaw,\n type Router\n} from 'vue-router'\n\ntype CreateViteSsgContext = {\n app: ReturnType<typeof createApp>\n head: ReturnType<typeof createClientHead> | ReturnType<typeof createServerHead> | undefined\n initialState: Record<string, unknown>\n isClient: boolean\n onSSRAppRendered: (cb: () => void | Promise<void>) => void\n routePath?: string\n router: Router\n routes: RouteRecordRaw[]\n transformState?: (state: Record<string, unknown>) => Record<string, unknown>\n triggerOnSSRAppRendered: () => Promise<void[]>\n}\n\ntype CreateViteSsgOptions = {\n hydration?: boolean\n rootContainer?: string\n useHead?: boolean\n transformState?: (state: Record<string, unknown>) => Record<string, unknown>\n}\n\nasync function documentReady(): Promise<void> {\n if (typeof document === 'undefined' || document.readyState !== 'loading') {\n return\n }\n\n await new Promise<void>((resolve) => {\n document.addEventListener('DOMContentLoaded', () => resolve(), { once: true })\n })\n}\n\nasync function nextFrame(): Promise<void> {\n await new Promise<void>((resolve) => requestAnimationFrame(() => resolve()))\n}\n\nfunction isVisibleElement(element: HTMLElement | null): element is HTMLElement {\n return Boolean(element && element.offsetParent !== null)\n}\n\nfunction getStickyOffsetTop(): number {\n if (typeof document === 'undefined') {\n return 0\n }\n\n const header = document.querySelector<HTMLElement>('.vf-document-layout__header')\n const layoutSubheader = document.querySelector<HTMLElement>('.vf-document-layout__subheader')\n const contentSubheader = document.querySelector<HTMLElement>('.vf-document-layout__content-subheader')\n const topGap = 16\n let offset = topGap\n\n if (isVisibleElement(header)) {\n offset += header.getBoundingClientRect().height\n }\n\n if (isVisibleElement(layoutSubheader)) {\n offset += layoutSubheader.getBoundingClientRect().height\n }\n\n if (isVisibleElement(contentSubheader)) {\n offset += contentSubheader.getBoundingClientRect().height\n }\n\n return offset\n}\n\nfunction getInitialState(): Record<string, unknown> {\n if (typeof window === 'undefined') {\n return {}\n }\n\n return ((window as Window & { __INITIAL_STATE__?: Record<string, unknown> }).__INITIAL_STATE__ ?? {})\n}\n\nfunction ensureHistoryState(): void {\n if (typeof window === 'undefined') {\n return\n }\n\n if (window.history.state) {\n return\n }\n\n const current = `${window.location.pathname}${window.location.search}${window.location.hash}`\n\n window.history.replaceState(\n {\n back: null,\n current,\n forward: null,\n position: window.history.length - 1,\n replaced: true,\n scroll: null\n },\n '',\n current\n )\n}\n\nexport function createViteSsgApp(\n App: Component,\n routerOptions: { base?: string; routes: RouteRecordRaw[] },\n fn?: (context: CreateViteSsgContext) => Promise<void> | void,\n options?: CreateViteSsgOptions\n) {\n const { rootContainer = '#app', transformState, useHead = true } = options ?? {}\n\n async function createSsgApp(routePath?: string): Promise<CreateViteSsgContext> {\n const app = import.meta.env.SSR || options?.hydration ? createSSRApp(App) : createApp(App)\n let head: CreateViteSsgContext['head']\n\n if (useHead) {\n head = import.meta.env.SSR ? createServerHead() : createClientHead()\n app.use(head)\n }\n\n const router = createRouter({\n history: import.meta.env.SSR\n ? createMemoryHistory(routerOptions.base)\n : createWebHistory(routerOptions.base),\n scrollBehavior: async (to, _from, savedPosition) => {\n if (savedPosition) {\n return savedPosition\n }\n\n if (to.hash) {\n const targetHash = decodeURIComponent(to.hash)\n\n await nextFrame()\n await nextFrame()\n\n const targetElement = document.querySelector<HTMLElement>(targetHash)\n\n if (targetElement) {\n const top = targetElement.getBoundingClientRect().top + window.scrollY - getStickyOffsetTop()\n\n return {\n left: 0,\n top: Math.max(0, top),\n behavior: 'smooth'\n }\n }\n }\n\n return { left: 0, top: 0 }\n },\n ...routerOptions\n })\n\n const appRenderCallbacks: Array<() => void | Promise<void>> = []\n const onSSRAppRendered = import.meta.env.SSR\n ? (cb: () => void | Promise<void>) => appRenderCallbacks.push(cb)\n : () => undefined\n const triggerOnSSRAppRendered = () => Promise.all(appRenderCallbacks.map((cb) => cb()))\n\n const context: CreateViteSsgContext = {\n app,\n head,\n initialState: {},\n isClient: !import.meta.env.SSR,\n onSSRAppRendered,\n routePath,\n router,\n routes: routerOptions.routes,\n transformState,\n triggerOnSSRAppRendered\n }\n\n if (!import.meta.env.SSR) {\n await documentReady()\n ensureHistoryState()\n context.initialState = transformState?.(getInitialState()) ?? getInitialState()\n }\n\n await fn?.(context)\n app.use(router)\n\n let entryRoutePath: string | undefined\n let isFirstRoute = true\n\n router.beforeEach((to) => {\n if (isFirstRoute || (entryRoutePath && entryRoutePath === to.path)) {\n isFirstRoute = false\n entryRoutePath = to.path\n to.meta.state = context.initialState\n }\n\n return true\n })\n\n if (import.meta.env.SSR) {\n const route = context.routePath ?? '/'\n await router.push(route)\n await router.isReady()\n context.initialState = (router.currentRoute.value.meta.state as Record<string, unknown>) || {}\n }\n\n return context\n }\n\n if (!import.meta.env.SSR) {\n ;(async () => {\n const { app, router } = await createSsgApp()\n await router.isReady()\n app.mount(rootContainer, true)\n })()\n }\n\n return createSsgApp\n}\n","import { Parser, type Tokens, marked } from 'marked'\nimport GithubSlugger from 'github-slugger'\nimport type { VfNavMenuItem, VfTableOfContentsItem } from '@codemonster-ru/vueforge-core'\nimport type {\n DocsComponentsConfig,\n DocsConfig,\n DocsFooterConfig,\n DocsHeaderNavConfig,\n DocsHomeConfig,\n DocsLayoutConfig,\n DocsSiteConfig\n} from './config'\n\nexport type DocsContentBlock =\n | {\n type: 'heading'\n depth: 1 | 2 | 3 | 4 | 5 | 6\n id: string\n html: string\n }\n | {\n type: 'paragraph'\n html: string\n }\n | {\n type: 'code'\n code: string\n language: string\n }\n | {\n type: 'list'\n ordered: boolean\n items: string[]\n }\n | {\n type: 'blockquote'\n html: string\n }\n | {\n type: 'html'\n html: string\n }\n\nexport interface DocsPage {\n id: string\n path: string\n sourcePath: string\n title: string\n navTitle: string\n description?: string\n order: number\n section: string[]\n blocks: DocsContentBlock[]\n tableOfContents: VfTableOfContentsItem[]\n}\n\ninterface Frontmatter {\n title?: string\n navTitle?: string\n description?: string\n order?: number\n}\n\ninterface NavNode {\n label: string\n order: number\n path?: string\n children: Map<string, NavNode>\n}\n\ntype TokensList = Tokens.Generic[]\n\nexport interface ResolveDocsContentInput {\n docsConfig: DocsConfig\n markdownFiles: Record<string, string>\n}\n\nexport interface ResolvedDocsContent {\n docsPages: DocsPage[]\n docsSidebar: VfNavMenuItem[]\n docsSite: DocsSiteConfig\n docsLayout: Required<DocsLayoutConfig>\n docsFooter: DocsFooterConfig\n docsHome: Required<DocsHomeConfig>\n docsHeaderNav: Required<DocsHeaderNavConfig>\n docsComponents: DocsComponentsConfig\n docsSiteTitle: string\n docsScrollOffset: number\n getDocsPageByPath: (pathname: string) => DocsPage\n}\n\nfunction parseFrontmatter(source: string): { data: Frontmatter; content: string } {\n if (!source.startsWith('---\\n')) {\n return { data: {}, content: source }\n }\n\n const frontmatterEnd = source.indexOf('\\n---\\n', 4)\n\n if (frontmatterEnd === -1) {\n return { data: {}, content: source }\n }\n\n const rawFrontmatter = source.slice(4, frontmatterEnd)\n const content = source.slice(frontmatterEnd + 5)\n const data: Frontmatter = {}\n\n for (const line of rawFrontmatter.split('\\n')) {\n const separatorIndex = line.indexOf(':')\n\n if (separatorIndex === -1) {\n continue\n }\n\n const key = line.slice(0, separatorIndex).trim()\n const rawValue = line.slice(separatorIndex + 1).trim()\n const normalizedValue = rawValue.replace(/^['\"]|['\"]$/g, '')\n\n if (key === 'order') {\n const numericValue = Number(normalizedValue)\n data.order = Number.isFinite(numericValue) ? numericValue : 0\n continue\n }\n\n if (key === 'title' || key === 'navTitle' || key === 'description') {\n data[key] = normalizedValue\n }\n }\n\n return { data, content }\n}\n\nfunction toTitleCase(value: string): string {\n return value\n .replace(/[-_]/g, ' ')\n .replace(/\\b\\w/g, (letter) => letter.toUpperCase())\n}\n\nfunction normalizeDocPath(sourcePath: string): string {\n const relativePath = sourcePath.replace(/^.*\\/(?:content|docs)\\//, '').replace(/\\.md$/, '')\n\n if (relativePath === 'index') {\n return '/'\n }\n\n if (relativePath.endsWith('/index')) {\n return `/${relativePath.replace(/\\/index$/, '')}`\n }\n\n return `/${relativePath}`\n}\n\nfunction toValueFromPath(path: string): string {\n return path === '/' ? 'index' : path.replace(/^\\//, '').replace(/\\//g, '-')\n}\n\nfunction renderInline(tokens: Tokens.Generic[] | undefined): string {\n return Parser.parseInline(tokens ?? [])\n}\n\nfunction renderBlockTokens(tokens: TokensList | undefined): string {\n return Parser.parse(tokens ?? [])\n}\n\nfunction renderListItemTokens(tokens: TokensList | undefined): string {\n return Parser.parse(tokens ?? [])\n}\n\nfunction renderMarkdown(markdown: string, tocLevels: Set<number>): {\n blocks: DocsContentBlock[]\n tableOfContents: VfTableOfContentsItem[]\n} {\n const tokens = marked.lexer(markdown) as TokensList\n const headingSlugger = new GithubSlugger()\n const tableOfContents: VfTableOfContentsItem[] = []\n const blocks: DocsContentBlock[] = []\n\n for (const token of tokens) {\n switch (token.type) {\n case 'space':\n break\n case 'heading': {\n const id = headingSlugger.slug(token.text)\n const html = renderInline(token.tokens)\n\n blocks.push({\n type: 'heading',\n depth: token.depth as 1 | 2 | 3 | 4 | 5 | 6,\n id,\n html\n })\n\n if (tocLevels.has(token.depth)) {\n tableOfContents.push({\n id,\n label: token.text,\n level: token.depth - 1\n })\n }\n break\n }\n case 'paragraph':\n blocks.push({\n type: 'paragraph',\n html: renderInline(token.tokens)\n })\n break\n case 'code':\n blocks.push({\n type: 'code',\n code: token.text,\n language: token.lang?.trim() || 'text'\n })\n break\n case 'list':\n blocks.push({\n type: 'list',\n ordered: token.ordered,\n items: token.items.map((item: Tokens.ListItem) => renderListItemTokens(item.tokens))\n })\n break\n case 'blockquote':\n blocks.push({\n type: 'blockquote',\n html: renderBlockTokens(token.tokens)\n })\n break\n default:\n blocks.push({\n type: 'html',\n html: renderBlockTokens([token])\n })\n break\n }\n }\n\n return { blocks, tableOfContents }\n}\n\nfunction parsePage(sourcePath: string, source: string, tocLevels: Set<number>): DocsPage {\n const { data: frontmatter, content } = parseFrontmatter(source)\n const path = normalizeDocPath(sourcePath)\n const pathSegments = path === '/' ? [] : path.replace(/^\\//, '').split('/')\n const section = pathSegments.slice(0, -1)\n const filename = pathSegments[pathSegments.length - 1] ?? 'index'\n const fallbackTitle = filename === 'index' ? 'Overview' : toTitleCase(filename)\n const title = frontmatter.title?.trim() || fallbackTitle\n const navTitle = frontmatter.navTitle?.trim() || title\n const { blocks, tableOfContents } = renderMarkdown(content, tocLevels)\n\n return {\n id: toValueFromPath(path),\n path,\n sourcePath,\n title,\n navTitle,\n description: frontmatter.description?.trim(),\n order: frontmatter.order ?? 0,\n section,\n blocks,\n tableOfContents\n }\n}\n\nfunction sortNodes(nodes: NavNode[]): NavNode[] {\n return [...nodes].sort((left, right) => {\n if (left.order !== right.order) {\n return left.order - right.order\n }\n\n return left.label.localeCompare(right.label)\n })\n}\n\nfunction buildSidebar(pages: DocsPage[], docsConfig: DocsConfig): VfNavMenuItem[] {\n const root = new Map<string, NavNode>()\n\n for (const page of pages) {\n let current = root\n let currentPath = ''\n\n for (const segment of page.section) {\n currentPath = `${currentPath}/${segment}`\n const sectionConfig = docsConfig.sectionLabels?.[segment]\n\n if (!current.has(segment)) {\n current.set(segment, {\n label: sectionConfig?.label ?? toTitleCase(segment),\n order: sectionConfig?.order ?? 1_000,\n path: currentPath,\n children: new Map()\n })\n }\n\n current = current.get(segment)!.children\n }\n\n current.set(page.id, {\n label: page.navTitle,\n order: page.order,\n path: page.path,\n children: new Map()\n })\n }\n\n const toItems = (nodes: Map<string, NavNode>): VfNavMenuItem[] =>\n sortNodes([...nodes.values()]).map((node) => {\n const item: VfNavMenuItem = {\n value: toValueFromPath(node.path ?? node.label),\n label: node.label\n }\n\n const children = toItems(node.children)\n\n if (children.length > 0) {\n item.children = children\n } else if (node.path) {\n item.to = node.path\n }\n\n return item\n })\n\n return toItems(root)\n}\n\nexport function resolveDocsContent({ docsConfig, markdownFiles }: ResolveDocsContentInput): ResolvedDocsContent {\n const tocLevels = new Set(docsConfig.toc?.levels ?? [2, 3, 4])\n\n const docsPages = Object.entries(markdownFiles)\n .map(([sourcePath, source]) => parsePage(sourcePath, source, tocLevels))\n .filter((page) => page.path !== '/')\n .sort((left, right) => left.path.localeCompare(right.path))\n\n const docsSidebar = buildSidebar(docsPages, docsConfig)\n const docsSite: DocsSiteConfig = {\n title: docsConfig.site?.title ?? docsConfig.title ?? 'docs',\n description: docsConfig.site?.description,\n githubUrl: docsConfig.site?.githubUrl,\n homeTo: docsConfig.site?.homeTo ?? '/',\n favicon: docsConfig.site?.favicon,\n logo: docsConfig.site?.logo,\n logoLabel: docsConfig.site?.logoLabel\n }\n const docsLayout: Required<DocsLayoutConfig> = {\n variant: docsConfig.layout?.variant ?? 'sidebar-content-aside',\n fillViewport: docsConfig.layout?.fillViewport ?? true,\n stickyHeader: docsConfig.layout?.stickyHeader ?? true,\n stickySidebar: docsConfig.layout?.stickySidebar ?? true,\n stickyAside: docsConfig.layout?.stickyAside ?? true,\n edgeNotches: docsConfig.layout?.edgeNotches ?? false,\n hideSidebarOnMobile: docsConfig.layout?.hideSidebarOnMobile ?? true,\n hideAsideOnMobile: docsConfig.layout?.hideAsideOnMobile ?? true\n }\n const docsFooter: DocsFooterConfig = {\n left: docsConfig.footer?.left ?? 'Codemonster documentation',\n right: docsConfig.footer?.right\n }\n const docsHome: Required<DocsHomeConfig> = {\n enabled: docsConfig.home?.enabled ?? true,\n title: docsConfig.home?.title ?? 'Build docs fast',\n description: docsConfig.home?.description ?? 'Write markdown, keep the same UI stack, and ship clean developer docs.',\n showGrid: docsConfig.home?.showGrid ?? true,\n primaryAction: docsConfig.home?.primaryAction ?? {\n label: 'Get Started',\n to: '/guide/installation'\n },\n secondaryAction: docsConfig.home?.secondaryAction ?? {\n label: 'View on GitHub',\n href: docsConfig.site?.githubUrl\n }\n }\n const docsHeaderNav: Required<DocsHeaderNavConfig> = {\n items: docsConfig.headerNav?.items ?? [],\n ariaLabel: docsConfig.headerNav?.ariaLabel ?? 'Header navigation'\n }\n const docsComponents: DocsComponentsConfig = docsConfig.components ?? {}\n const docsSiteTitle = docsSite.title\n const docsScrollOffset = docsConfig.toc?.scrollOffset ?? 96\n\n function getDocsPageByPath(pathname: string): DocsPage {\n const normalizedPath = pathname === '/' ? '/' : pathname.replace(/\\/$/, '')\n\n return docsPages.find((page) => page.path === normalizedPath) ?? docsPages[0]\n }\n\n return {\n docsPages,\n docsSidebar,\n docsSite,\n docsLayout,\n docsFooter,\n docsHome,\n docsHeaderNav,\n docsComponents,\n docsSiteTitle,\n docsScrollOffset,\n getDocsPageByPath\n }\n}\n","import type { Component } from 'vue'\nimport type { RouteRecordRaw } from 'vue-router'\nimport type { DocsPage } from './docsContent'\n\nexport interface CreateDocsRoutesInput {\n docsPages: DocsPage[]\n homeEnabled: boolean\n homeComponent: Component\n pageComponent: Component\n notFoundComponent?: Component\n}\n\nexport function createDocsRoutes({\n docsPages,\n homeEnabled,\n homeComponent,\n pageComponent,\n notFoundComponent\n}: CreateDocsRoutesInput): RouteRecordRaw[] {\n const docsPageRoutes: RouteRecordRaw[] = docsPages.map((page) => ({\n path: page.path,\n name: page.id,\n component: pageComponent\n }))\n\n const docsLandingRoute = [...docsPages].sort((left, right) => {\n if (left.order !== right.order) {\n return left.order - right.order\n }\n\n return left.path.localeCompare(right.path)\n })[0]\n\n const rootRoute: RouteRecordRaw = homeEnabled\n ? {\n path: '/',\n name: 'home',\n component: homeComponent\n }\n : docsLandingRoute\n ? {\n path: '/',\n name: 'home',\n redirect: docsLandingRoute.path\n }\n : {\n path: '/',\n name: 'home',\n component: homeComponent\n }\n\n const routes: RouteRecordRaw[] = [rootRoute, ...docsPageRoutes]\n\n if (notFoundComponent) {\n routes.push({\n path: '/:pathMatch(.*)*',\n name: 'not-found',\n component: notFoundComponent\n })\n }\n\n return routes\n}\n","import type { Component } from 'vue'\nimport type { VfNavMenuItem, VfTableOfContentsItem } from '@codemonster-ru/vueforge-core'\n\nexport interface DocsSectionConfig {\n label?: string\n order?: number\n}\n\nexport interface DocsTocConfig {\n levels?: number[]\n scrollOffset?: number\n}\n\nexport interface DocsSiteLogoConfig {\n src?: string\n component?: Component\n alt?: string\n width?: number | string\n height?: number | string\n}\n\nexport interface DocsHomeActionConfig {\n label: string\n to?: string\n href?: string\n}\n\nexport interface DocsHomeConfig {\n enabled?: boolean\n title?: string\n description?: string\n showGrid?: boolean\n primaryAction?: DocsHomeActionConfig\n secondaryAction?: DocsHomeActionConfig\n}\n\nexport interface DocsHeaderNavConfig {\n items?: VfNavMenuItem[]\n ariaLabel?: string\n}\n\nexport type DocsLayoutVariant =\n | 'content'\n | 'sidebar-content'\n | 'sidebar-content-aside'\n\nexport interface DocsSiteConfig {\n title: string\n description?: string\n githubUrl?: string\n homeTo?: string\n favicon?: string\n logo?: DocsSiteLogoConfig\n logoLabel?: string\n}\n\nexport interface DocsLayoutConfig {\n variant?: DocsLayoutVariant\n fillViewport?: boolean\n stickyHeader?: boolean\n stickySidebar?: boolean\n stickyAside?: boolean\n edgeNotches?: boolean\n hideSidebarOnMobile?: boolean\n hideAsideOnMobile?: boolean\n}\n\nexport interface DocsFooterConfig {\n left?: string\n right?: string\n}\n\nexport interface DocsPageMeta {\n title: string\n path: string\n}\n\nexport interface DocsHeaderProps {\n site: DocsSiteConfig\n}\n\nexport interface DocsBrandProps {\n site: DocsSiteConfig\n}\n\nexport interface DocsFooterProps {\n site: DocsSiteConfig\n}\n\nexport interface DocsHeaderNavProps {\n site: DocsSiteConfig\n items: VfNavMenuItem[]\n activeValue?: string\n}\n\nexport interface DocsSidebarProps {\n site: DocsSiteConfig\n page: DocsPageMeta\n items: VfNavMenuItem[]\n}\n\nexport interface DocsAsideProps {\n site: DocsSiteConfig\n page: DocsPageMeta\n items: VfTableOfContentsItem[]\n}\n\nexport interface DocsLayoutProps {\n site: DocsSiteConfig\n page: DocsPageMeta\n layout: Required<DocsLayoutConfig>\n sidebarItems: VfNavMenuItem[]\n tocItems: VfTableOfContentsItem[]\n}\n\nexport interface DocsComponentsConfig {\n Brand?: Component\n Home?: Component\n Header?: Component\n HeaderNav?: Component\n Footer?: Component\n SidebarTop?: Component\n SidebarBottom?: Component\n AsideTop?: Component\n AsideBottom?: Component\n Layout?: Component\n}\n\nexport interface DocsConfig {\n title?: string\n site?: Partial<DocsSiteConfig>\n home?: DocsHomeConfig\n headerNav?: DocsHeaderNavConfig\n layout?: DocsLayoutConfig\n footer?: DocsFooterConfig\n components?: DocsComponentsConfig\n sectionLabels?: Record<string, DocsSectionConfig>\n toc?: DocsTocConfig\n}\n\nexport function defineDocsConfig(config: DocsConfig): DocsConfig {\n return config\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/createViteSsgApp.ts","../src/docsContent.ts","../src/routes.ts","../src/config.ts"],"sourcesContent":["import { createHead as createClientHead } from '@unhead/vue/client'\nimport { createHead as createServerHead } from '@unhead/vue/server'\nimport { createApp, createSSRApp, type Component } from 'vue'\nimport {\n createMemoryHistory,\n createRouter,\n createWebHistory,\n type RouteRecordRaw,\n type Router\n} from 'vue-router'\n\ntype CreateViteSsgContext = {\n app: ReturnType<typeof createApp>\n head: ReturnType<typeof createClientHead> | ReturnType<typeof createServerHead> | undefined\n initialState: Record<string, unknown>\n isClient: boolean\n onSSRAppRendered: (cb: () => void | Promise<void>) => void\n routePath?: string\n router: Router\n routes: RouteRecordRaw[]\n transformState?: (state: Record<string, unknown>) => Record<string, unknown>\n triggerOnSSRAppRendered: () => Promise<void[]>\n}\n\ntype CreateViteSsgOptions = {\n hydration?: boolean\n rootContainer?: string\n useHead?: boolean\n transformState?: (state: Record<string, unknown>) => Record<string, unknown>\n}\n\nasync function documentReady(): Promise<void> {\n if (typeof document === 'undefined' || document.readyState !== 'loading') {\n return\n }\n\n await new Promise<void>((resolve) => {\n document.addEventListener('DOMContentLoaded', () => resolve(), { once: true })\n })\n}\n\nasync function nextFrame(): Promise<void> {\n await new Promise<void>((resolve) => requestAnimationFrame(() => resolve()))\n}\n\nfunction isVisibleElement(element: HTMLElement | null): element is HTMLElement {\n return Boolean(element && element.offsetParent !== null)\n}\n\nfunction getStickyOffsetTop(): number {\n if (typeof document === 'undefined') {\n return 0\n }\n\n const header = document.querySelector<HTMLElement>('.vf-document-layout__header')\n const layoutSubheader = document.querySelector<HTMLElement>('.vf-document-layout__subheader')\n const contentSubheader = document.querySelector<HTMLElement>('.vf-document-layout__content-subheader')\n const topGap = 16\n let offset = topGap\n\n if (isVisibleElement(header)) {\n offset += header.getBoundingClientRect().height\n }\n\n if (isVisibleElement(layoutSubheader)) {\n offset += layoutSubheader.getBoundingClientRect().height\n }\n\n if (isVisibleElement(contentSubheader)) {\n offset += contentSubheader.getBoundingClientRect().height\n }\n\n return offset\n}\n\nfunction getInitialState(): Record<string, unknown> {\n if (typeof window === 'undefined') {\n return {}\n }\n\n return ((window as Window & { __INITIAL_STATE__?: Record<string, unknown> }).__INITIAL_STATE__ ?? {})\n}\n\nfunction ensureHistoryState(): void {\n if (typeof window === 'undefined') {\n return\n }\n\n if (window.history.state) {\n return\n }\n\n const current = `${window.location.pathname}${window.location.search}${window.location.hash}`\n\n window.history.replaceState(\n {\n back: null,\n current,\n forward: null,\n position: window.history.length - 1,\n replaced: true,\n scroll: null\n },\n '',\n current\n )\n}\n\nexport function createViteSsgApp(\n App: Component,\n routerOptions: { base?: string; routes: RouteRecordRaw[] },\n fn?: (context: CreateViteSsgContext) => Promise<void> | void,\n options?: CreateViteSsgOptions\n) {\n const { rootContainer = '#app', transformState, useHead = true } = options ?? {}\n\n async function createSsgApp(routePath?: string): Promise<CreateViteSsgContext> {\n const app = import.meta.env.SSR || options?.hydration ? createSSRApp(App) : createApp(App)\n let head: CreateViteSsgContext['head']\n\n if (useHead) {\n head = import.meta.env.SSR ? createServerHead() : createClientHead()\n app.use(head)\n }\n\n const router = createRouter({\n history: import.meta.env.SSR\n ? createMemoryHistory(routerOptions.base)\n : createWebHistory(routerOptions.base),\n scrollBehavior: async (to, _from, savedPosition) => {\n if (savedPosition) {\n return savedPosition\n }\n\n if (to.hash) {\n const targetHash = decodeURIComponent(to.hash)\n\n await nextFrame()\n await nextFrame()\n\n const targetElement = document.querySelector<HTMLElement>(targetHash)\n\n if (targetElement) {\n const top = targetElement.getBoundingClientRect().top + window.scrollY - getStickyOffsetTop()\n\n return {\n left: 0,\n top: Math.max(0, top),\n behavior: 'smooth'\n }\n }\n }\n\n return { left: 0, top: 0 }\n },\n ...routerOptions\n })\n\n const appRenderCallbacks: Array<() => void | Promise<void>> = []\n const onSSRAppRendered = import.meta.env.SSR\n ? (cb: () => void | Promise<void>) => appRenderCallbacks.push(cb)\n : () => undefined\n const triggerOnSSRAppRendered = () => Promise.all(appRenderCallbacks.map((cb) => cb()))\n\n const context: CreateViteSsgContext = {\n app,\n head,\n initialState: {},\n isClient: !import.meta.env.SSR,\n onSSRAppRendered,\n routePath,\n router,\n routes: routerOptions.routes,\n transformState,\n triggerOnSSRAppRendered\n }\n\n if (!import.meta.env.SSR) {\n await documentReady()\n ensureHistoryState()\n context.initialState = transformState?.(getInitialState()) ?? getInitialState()\n }\n\n await fn?.(context)\n app.use(router)\n\n let entryRoutePath: string | undefined\n let isFirstRoute = true\n\n router.beforeEach((to) => {\n if (isFirstRoute || (entryRoutePath && entryRoutePath === to.path)) {\n isFirstRoute = false\n entryRoutePath = to.path\n to.meta.state = context.initialState\n }\n\n return true\n })\n\n if (import.meta.env.SSR) {\n const route = context.routePath ?? '/'\n await router.push(route)\n await router.isReady()\n context.initialState = (router.currentRoute.value.meta.state as Record<string, unknown>) || {}\n }\n\n return context\n }\n\n if (!import.meta.env.SSR) {\n ;(async () => {\n const { app, router } = await createSsgApp()\n await router.isReady()\n app.mount(rootContainer, true)\n })()\n }\n\n return createSsgApp\n}\n","import { Parser, type Tokens, marked } from 'marked'\nimport GithubSlugger from 'github-slugger'\nimport type { VfNavMenuItem, VfTableOfContentsItem } from '@codemonster-ru/vueforge-core'\nimport type {\n DocsComponentsConfig,\n DocsConfig,\n DocsFooterConfig,\n DocsHeaderNavConfig,\n DocsHomeConfig,\n DocsLayoutConfig,\n DocsSiteConfig\n} from './config'\n\nexport type DocsContentBlock =\n | {\n type: 'heading'\n depth: 1 | 2 | 3 | 4 | 5 | 6\n id: string\n html: string\n }\n | {\n type: 'paragraph'\n html: string\n }\n | {\n type: 'code'\n code: string\n language: string\n }\n | {\n type: 'list'\n ordered: boolean\n items: string[]\n }\n | {\n type: 'blockquote'\n html: string\n }\n | {\n type: 'html'\n html: string\n }\n\nexport interface DocsPage {\n id: string\n path: string\n sourcePath: string\n isIndexPage: boolean\n title: string\n navTitle: string\n description?: string\n order: number\n section: string[]\n blocks: DocsContentBlock[]\n tableOfContents: VfTableOfContentsItem[]\n}\n\ninterface Frontmatter {\n title?: string\n navTitle?: string\n description?: string\n order?: number\n}\n\ninterface NavNode {\n label: string\n order: number\n value?: string\n path?: string\n children: Map<string, NavNode>\n}\n\ntype TokensList = Tokens.Generic[]\n\nexport interface ResolveDocsContentInput {\n docsConfig: DocsConfig\n markdownFiles: Record<string, string>\n}\n\nexport interface ResolvedDocsContent {\n docsPages: DocsPage[]\n docsSidebar: VfNavMenuItem[]\n docsSite: DocsSiteConfig\n docsLayout: Required<DocsLayoutConfig>\n docsFooter: DocsFooterConfig\n docsHome: Required<DocsHomeConfig>\n docsHeaderNav: Required<DocsHeaderNavConfig>\n docsComponents: DocsComponentsConfig\n docsSiteTitle: string\n docsScrollOffset: number\n getDocsPageByPath: (pathname: string) => DocsPage\n}\n\nfunction parseFrontmatter(source: string): { data: Frontmatter; content: string } {\n if (!source.startsWith('---\\n')) {\n return { data: {}, content: source }\n }\n\n const frontmatterEnd = source.indexOf('\\n---\\n', 4)\n\n if (frontmatterEnd === -1) {\n return { data: {}, content: source }\n }\n\n const rawFrontmatter = source.slice(4, frontmatterEnd)\n const content = source.slice(frontmatterEnd + 5)\n const data: Frontmatter = {}\n\n for (const line of rawFrontmatter.split('\\n')) {\n const separatorIndex = line.indexOf(':')\n\n if (separatorIndex === -1) {\n continue\n }\n\n const key = line.slice(0, separatorIndex).trim()\n const rawValue = line.slice(separatorIndex + 1).trim()\n const normalizedValue = rawValue.replace(/^['\"]|['\"]$/g, '')\n\n if (key === 'order') {\n const numericValue = Number(normalizedValue)\n data.order = Number.isFinite(numericValue) ? numericValue : 0\n continue\n }\n\n if (key === 'title' || key === 'navTitle' || key === 'description') {\n data[key] = normalizedValue\n }\n }\n\n return { data, content }\n}\n\nfunction toTitleCase(value: string): string {\n return value\n .replace(/[-_]/g, ' ')\n .replace(/\\b\\w/g, (letter) => letter.toUpperCase())\n}\n\nfunction normalizeDocPath(sourcePath: string): string {\n const relativePath = sourcePath.replace(/^.*\\/(?:content|docs)\\//, '').replace(/\\.md$/, '')\n\n if (relativePath === 'index') {\n return '/'\n }\n\n if (relativePath.endsWith('/index')) {\n return `/${relativePath.replace(/\\/index$/, '')}`\n }\n\n return `/${relativePath}`\n}\n\nfunction isIndexSourcePath(sourcePath: string): boolean {\n return sourcePath.replace(/\\\\/g, '/').replace(/\\.md$/, '').endsWith('/index')\n}\n\nfunction normalizeMarkdownLinkHref(href: string): string {\n if (\n href.startsWith('#') ||\n href.startsWith('//') ||\n /^[a-z][a-z\\d+.-]*:/i.test(href)\n ) {\n return href\n }\n\n const match = href.match(/^([^?#]*)([?#].*)?$/)\n\n if (!match) {\n return href\n }\n\n const [, pathname, suffix = ''] = match\n\n if (!/\\.(?:md|mdx)$/i.test(pathname)) {\n return href\n }\n\n const extensionlessPathname = pathname.replace(/\\.(?:md|mdx)$/i, '')\n let normalizedPathname = extensionlessPathname\n\n if (extensionlessPathname === 'index' || extensionlessPathname === './index') {\n normalizedPathname = '.'\n } else if (extensionlessPathname.endsWith('/index')) {\n normalizedPathname = extensionlessPathname.replace(/\\/index$/, '')\n }\n\n return `${normalizedPathname}${suffix}`\n}\n\nfunction normalizeMarkdownLinks(tokens: TokensList): void {\n for (const token of tokens) {\n if (token.type === 'link' && typeof token.href === 'string') {\n token.href = normalizeMarkdownLinkHref(token.href)\n }\n\n if ('tokens' in token && Array.isArray(token.tokens)) {\n normalizeMarkdownLinks(token.tokens as TokensList)\n }\n\n if (token.type === 'list' && Array.isArray(token.items)) {\n for (const item of token.items) {\n normalizeMarkdownLinks(item.tokens as TokensList)\n }\n }\n }\n}\n\nfunction toValueFromPath(path: string): string {\n return path === '/' ? 'index' : path.replace(/^\\//, '').replace(/\\//g, '-')\n}\n\nfunction renderInline(tokens: Tokens.Generic[] | undefined): string {\n return Parser.parseInline(tokens ?? [])\n}\n\nfunction renderBlockTokens(tokens: TokensList | undefined): string {\n return Parser.parse(tokens ?? [])\n}\n\nfunction renderListItemTokens(tokens: TokensList | undefined): string {\n return Parser.parse(tokens ?? [])\n}\n\nfunction renderMarkdown(markdown: string, tocLevels: Set<number>): {\n blocks: DocsContentBlock[]\n tableOfContents: VfTableOfContentsItem[]\n} {\n const tokens = marked.lexer(markdown) as TokensList\n normalizeMarkdownLinks(tokens)\n const headingSlugger = new GithubSlugger()\n const tableOfContents: VfTableOfContentsItem[] = []\n const blocks: DocsContentBlock[] = []\n\n for (const token of tokens) {\n switch (token.type) {\n case 'space':\n break\n case 'heading': {\n const id = headingSlugger.slug(token.text)\n const html = renderInline(token.tokens)\n\n blocks.push({\n type: 'heading',\n depth: token.depth as 1 | 2 | 3 | 4 | 5 | 6,\n id,\n html\n })\n\n if (tocLevels.has(token.depth)) {\n tableOfContents.push({\n id,\n label: token.text,\n level: token.depth - 1\n })\n }\n break\n }\n case 'paragraph':\n blocks.push({\n type: 'paragraph',\n html: renderInline(token.tokens)\n })\n break\n case 'code':\n blocks.push({\n type: 'code',\n code: token.text,\n language: token.lang?.trim() || 'text'\n })\n break\n case 'list':\n blocks.push({\n type: 'list',\n ordered: token.ordered,\n items: token.items.map((item: Tokens.ListItem) => renderListItemTokens(item.tokens))\n })\n break\n case 'blockquote':\n blocks.push({\n type: 'blockquote',\n html: renderBlockTokens(token.tokens)\n })\n break\n default:\n blocks.push({\n type: 'html',\n html: renderBlockTokens([token])\n })\n break\n }\n }\n\n return { blocks, tableOfContents }\n}\n\nfunction getFirstHeadingText(markdown: string): string | undefined {\n const tokens = marked.lexer(markdown) as TokensList\n const heading = tokens.find((token): token is Tokens.Heading => token.type === 'heading' && token.depth === 1)\n\n return heading?.text.trim() || undefined\n}\n\nfunction parsePage(sourcePath: string, source: string, tocLevels: Set<number>): DocsPage {\n const { data: frontmatter, content } = parseFrontmatter(source)\n const path = normalizeDocPath(sourcePath)\n const pathSegments = path === '/' ? [] : path.replace(/^\\//, '').split('/')\n const isIndexPage = isIndexSourcePath(sourcePath)\n const section = isIndexPage ? pathSegments : pathSegments.slice(0, -1)\n const filename = pathSegments[pathSegments.length - 1] ?? 'index'\n const fallbackTitle = isIndexPage ? (getFirstHeadingText(content) ?? 'Overview') : toTitleCase(filename)\n const title = frontmatter.title?.trim() || fallbackTitle\n const navTitle = frontmatter.navTitle?.trim() || (isIndexPage ? 'Overview' : title)\n const { blocks, tableOfContents } = renderMarkdown(content, tocLevels)\n const id = isIndexPage && path !== '/' ? `${toValueFromPath(path)}-index` : toValueFromPath(path)\n\n return {\n id,\n path,\n sourcePath,\n isIndexPage,\n title,\n navTitle,\n description: frontmatter.description?.trim(),\n order: frontmatter.order ?? 0,\n section,\n blocks,\n tableOfContents\n }\n}\n\nfunction sortNodes(nodes: NavNode[]): NavNode[] {\n return [...nodes].sort((left, right) => {\n if (left.order !== right.order) {\n return left.order - right.order\n }\n\n return left.label.localeCompare(right.label)\n })\n}\n\nfunction buildSidebar(pages: DocsPage[], docsConfig: DocsConfig): VfNavMenuItem[] {\n const root = new Map<string, NavNode>()\n\n for (const page of pages) {\n let current = root\n let currentPath = ''\n\n for (const segment of page.section) {\n currentPath = `${currentPath}/${segment}`\n const sectionConfig = docsConfig.sectionLabels?.[segment]\n\n if (!current.has(segment)) {\n current.set(segment, {\n label: sectionConfig?.label ?? toTitleCase(segment),\n order: sectionConfig?.order ?? 1_000,\n value: toValueFromPath(currentPath),\n path: currentPath,\n children: new Map()\n })\n }\n\n current = current.get(segment)!.children\n }\n\n const pageKey = page.isIndexPage ? 'index' : page.id\n const existingPageNode = current.get(pageKey)\n\n current.set(pageKey, {\n label: page.navTitle,\n order: page.order,\n value: page.id,\n path: page.path,\n children: existingPageNode?.children ?? new Map()\n })\n }\n\n const toItems = (nodes: Map<string, NavNode>): VfNavMenuItem[] =>\n sortNodes([...nodes.values()]).map((node) => {\n const item: VfNavMenuItem = {\n value: node.value ?? toValueFromPath(node.path ?? node.label),\n label: node.label\n }\n\n const children = toItems(node.children)\n\n if (children.length > 0) {\n item.children = children\n } else if (node.path) {\n item.to = node.path\n }\n\n return item\n })\n\n return toItems(root)\n}\n\nexport function resolveDocsContent({ docsConfig, markdownFiles }: ResolveDocsContentInput): ResolvedDocsContent {\n const tocLevels = new Set(docsConfig.toc?.levels ?? [2, 3, 4])\n\n const docsPages = Object.entries(markdownFiles)\n .map(([sourcePath, source]) => parsePage(sourcePath, source, tocLevels))\n .filter((page) => page.path !== '/')\n .sort((left, right) => left.path.localeCompare(right.path))\n\n const docsSidebar = buildSidebar(docsPages, docsConfig)\n const docsSite: DocsSiteConfig = {\n title: docsConfig.site?.title ?? docsConfig.title ?? 'docs',\n description: docsConfig.site?.description,\n githubUrl: docsConfig.site?.githubUrl,\n homeTo: docsConfig.site?.homeTo ?? '/',\n favicon: docsConfig.site?.favicon,\n logo: docsConfig.site?.logo,\n logoLabel: docsConfig.site?.logoLabel\n }\n const docsLayout: Required<DocsLayoutConfig> = {\n variant: docsConfig.layout?.variant ?? 'sidebar-content-aside',\n fillViewport: docsConfig.layout?.fillViewport ?? true,\n stickyHeader: docsConfig.layout?.stickyHeader ?? true,\n stickySidebar: docsConfig.layout?.stickySidebar ?? true,\n stickyAside: docsConfig.layout?.stickyAside ?? true,\n edgeNotches: docsConfig.layout?.edgeNotches ?? false,\n hideSidebarOnMobile: docsConfig.layout?.hideSidebarOnMobile ?? true,\n hideAsideOnMobile: docsConfig.layout?.hideAsideOnMobile ?? true\n }\n const docsFooter: DocsFooterConfig = {\n left: docsConfig.footer?.left ?? 'Codemonster documentation',\n right: docsConfig.footer?.right\n }\n const docsHome: Required<DocsHomeConfig> = {\n enabled: docsConfig.home?.enabled ?? true,\n title: docsConfig.home?.title ?? 'Build docs fast',\n description: docsConfig.home?.description ?? 'Write markdown, keep the same UI stack, and ship clean developer docs.',\n showGrid: docsConfig.home?.showGrid ?? true,\n primaryAction: docsConfig.home?.primaryAction ?? {\n label: 'Get Started',\n to: '/guide/installation'\n },\n secondaryAction: docsConfig.home?.secondaryAction ?? {\n label: 'View on GitHub',\n href: docsConfig.site?.githubUrl\n }\n }\n const docsHeaderNav: Required<DocsHeaderNavConfig> = {\n items: docsConfig.headerNav?.items ?? [],\n ariaLabel: docsConfig.headerNav?.ariaLabel ?? 'Header navigation'\n }\n const docsComponents: DocsComponentsConfig = docsConfig.components ?? {}\n const docsSiteTitle = docsSite.title\n const docsScrollOffset = docsConfig.toc?.scrollOffset ?? 96\n\n function getDocsPageByPath(pathname: string): DocsPage {\n const normalizedPath = pathname === '/' ? '/' : pathname.replace(/\\/$/, '')\n\n return docsPages.find((page) => page.path === normalizedPath) ?? docsPages[0]\n }\n\n return {\n docsPages,\n docsSidebar,\n docsSite,\n docsLayout,\n docsFooter,\n docsHome,\n docsHeaderNav,\n docsComponents,\n docsSiteTitle,\n docsScrollOffset,\n getDocsPageByPath\n }\n}\n","import type { Component } from 'vue'\nimport type { RouteRecordRaw } from 'vue-router'\nimport type { DocsPage } from './docsContent'\n\nexport interface CreateDocsRoutesInput {\n docsPages: DocsPage[]\n homeEnabled: boolean\n homeComponent: Component\n pageComponent: Component\n notFoundComponent?: Component\n}\n\nexport function createDocsRoutes({\n docsPages,\n homeEnabled,\n homeComponent,\n pageComponent,\n notFoundComponent\n}: CreateDocsRoutesInput): RouteRecordRaw[] {\n const docsPageRoutes: RouteRecordRaw[] = docsPages.map((page) => ({\n path: page.path,\n name: page.id,\n component: pageComponent\n }))\n\n const docsLandingRoute = [...docsPages].sort((left, right) => {\n if (left.order !== right.order) {\n return left.order - right.order\n }\n\n return left.path.localeCompare(right.path)\n })[0]\n\n const rootRoute: RouteRecordRaw = homeEnabled\n ? {\n path: '/',\n name: 'home',\n component: homeComponent\n }\n : docsLandingRoute\n ? {\n path: '/',\n name: 'home',\n redirect: docsLandingRoute.path\n }\n : {\n path: '/',\n name: 'home',\n component: homeComponent\n }\n\n const routes: RouteRecordRaw[] = [rootRoute, ...docsPageRoutes]\n\n if (notFoundComponent) {\n routes.push({\n path: '/:pathMatch(.*)*',\n name: 'not-found',\n component: notFoundComponent\n })\n }\n\n return routes\n}\n","import type { Component } from 'vue'\nimport type { VfNavMenuItem, VfTableOfContentsItem } from '@codemonster-ru/vueforge-core'\n\nexport interface DocsSectionConfig {\n label?: string\n order?: number\n}\n\nexport interface DocsTocConfig {\n levels?: number[]\n scrollOffset?: number\n}\n\nexport interface DocsSiteLogoConfig {\n src?: string\n component?: Component\n alt?: string\n width?: number | string\n height?: number | string\n}\n\nexport interface DocsHomeActionConfig {\n label: string\n to?: string\n href?: string\n}\n\nexport interface DocsHomeConfig {\n enabled?: boolean\n title?: string\n description?: string\n showGrid?: boolean\n primaryAction?: DocsHomeActionConfig\n secondaryAction?: DocsHomeActionConfig\n}\n\nexport interface DocsHeaderNavConfig {\n items?: VfNavMenuItem[]\n ariaLabel?: string\n}\n\nexport type DocsLayoutVariant =\n | 'content'\n | 'sidebar-content'\n | 'sidebar-content-aside'\n\nexport interface DocsSiteConfig {\n title: string\n description?: string\n githubUrl?: string\n homeTo?: string\n favicon?: string\n logo?: DocsSiteLogoConfig\n logoLabel?: string\n}\n\nexport interface DocsLayoutConfig {\n variant?: DocsLayoutVariant\n fillViewport?: boolean\n stickyHeader?: boolean\n stickySidebar?: boolean\n stickyAside?: boolean\n edgeNotches?: boolean\n hideSidebarOnMobile?: boolean\n hideAsideOnMobile?: boolean\n}\n\nexport interface DocsFooterConfig {\n left?: string\n right?: string\n}\n\nexport interface DocsPageMeta {\n title: string\n path: string\n}\n\nexport interface DocsHeaderProps {\n site: DocsSiteConfig\n}\n\nexport interface DocsBrandProps {\n site: DocsSiteConfig\n}\n\nexport interface DocsFooterProps {\n site: DocsSiteConfig\n}\n\nexport interface DocsHeaderNavProps {\n site: DocsSiteConfig\n items: VfNavMenuItem[]\n activeValue?: string\n}\n\nexport interface DocsSidebarProps {\n site: DocsSiteConfig\n page: DocsPageMeta\n items: VfNavMenuItem[]\n}\n\nexport interface DocsAsideProps {\n site: DocsSiteConfig\n page: DocsPageMeta\n items: VfTableOfContentsItem[]\n}\n\nexport interface DocsLayoutProps {\n site: DocsSiteConfig\n page: DocsPageMeta\n layout: Required<DocsLayoutConfig>\n sidebarItems: VfNavMenuItem[]\n tocItems: VfTableOfContentsItem[]\n}\n\nexport interface DocsComponentsConfig {\n Brand?: Component\n Home?: Component\n Header?: Component\n HeaderNav?: Component\n Footer?: Component\n SidebarTop?: Component\n SidebarBottom?: Component\n AsideTop?: Component\n AsideBottom?: Component\n Layout?: Component\n}\n\nexport interface DocsConfig {\n title?: string\n site?: Partial<DocsSiteConfig>\n home?: DocsHomeConfig\n headerNav?: DocsHeaderNavConfig\n layout?: DocsLayoutConfig\n footer?: DocsFooterConfig\n components?: DocsComponentsConfig\n sectionLabels?: Record<string, DocsSectionConfig>\n toc?: DocsTocConfig\n}\n\nexport function defineDocsConfig(config: DocsConfig): DocsConfig {\n return config\n}\n"],"mappings":"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","names":[]}
|