@codemonster-ru/vue-ssg-core 1.0.3 → 1.0.5

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 CHANGED
@@ -143,6 +143,7 @@ interface DocsConfig {
143
143
  }
144
144
  declare function defineDocsConfig(config: DocsConfig): DocsConfig;
145
145
 
146
+ type DocsTableAlign = 'left' | 'center' | 'right' | null;
146
147
  type DocsContentBlock = {
147
148
  type: 'heading';
148
149
  depth: 1 | 2 | 3 | 4 | 5 | 6;
@@ -162,6 +163,11 @@ type DocsContentBlock = {
162
163
  } | {
163
164
  type: 'blockquote';
164
165
  html: string;
166
+ } | {
167
+ type: 'table';
168
+ header: string[];
169
+ rows: string[][];
170
+ align: DocsTableAlign[];
165
171
  } | {
166
172
  type: 'html';
167
173
  html: string;
package/dist/index.js CHANGED
@@ -249,6 +249,14 @@ function renderBlockTokens(tokens) {
249
249
  function renderListItemTokens(tokens) {
250
250
  return Parser.parse(tokens ?? []);
251
251
  }
252
+ function normalizeTableAlign(align) {
253
+ return align.map((value) => {
254
+ if (value === "left" || value === "center" || value === "right") {
255
+ return value;
256
+ }
257
+ return null;
258
+ });
259
+ }
252
260
  function renderMarkdown(markdown, tocLevels) {
253
261
  const tokens = marked.lexer(markdown);
254
262
  normalizeMarkdownLinks(tokens);
@@ -303,6 +311,14 @@ function renderMarkdown(markdown, tocLevels) {
303
311
  html: renderBlockTokens(token.tokens)
304
312
  });
305
313
  break;
314
+ case "table":
315
+ blocks.push({
316
+ type: "table",
317
+ header: token.header.map((cell) => renderInline(cell.tokens)),
318
+ rows: token.rows.map((row) => row.map((cell) => renderInline(cell.tokens))),
319
+ align: normalizeTableAlign(token.align)
320
+ });
321
+ break;
306
322
  default:
307
323
  blocks.push({
308
324
  type: "html",
@@ -352,6 +368,12 @@ function sortNodes(nodes) {
352
368
  return left.label.localeCompare(right.label);
353
369
  });
354
370
  }
371
+ function getPageNavKey(page) {
372
+ if (page.isIndexPage) {
373
+ return "index";
374
+ }
375
+ return page.path.split("/").filter(Boolean).at(-1) ?? page.id;
376
+ }
355
377
  function buildSidebar(pages, docsConfig) {
356
378
  const root = /* @__PURE__ */ new Map();
357
379
  for (const page of pages) {
@@ -366,18 +388,20 @@ function buildSidebar(pages, docsConfig) {
366
388
  order: sectionConfig?.order ?? 1e3,
367
389
  value: toValueFromPath(currentPath),
368
390
  path: currentPath,
391
+ isPage: false,
369
392
  children: /* @__PURE__ */ new Map()
370
393
  });
371
394
  }
372
395
  current = current.get(segment).children;
373
396
  }
374
- const pageKey = page.isIndexPage ? "index" : page.id;
397
+ const pageKey = getPageNavKey(page);
375
398
  const existingPageNode = current.get(pageKey);
376
399
  current.set(pageKey, {
377
400
  label: page.navTitle,
378
401
  order: page.order,
379
402
  value: page.id,
380
403
  path: page.path,
404
+ isPage: true,
381
405
  children: existingPageNode?.children ?? /* @__PURE__ */ new Map()
382
406
  });
383
407
  }
@@ -387,11 +411,26 @@ function buildSidebar(pages, docsConfig) {
387
411
  label: node.label
388
412
  };
389
413
  const children = toItems(node.children);
390
- if (children.length > 0) {
391
- item.children = children;
392
- } else if (node.path) {
414
+ if (node.path && node.isPage) {
393
415
  item.to = node.path;
394
416
  }
417
+ if (children.length > 0) {
418
+ if (item.to) {
419
+ const branchValue = `${item.value}-section`;
420
+ item.children = [
421
+ {
422
+ value: item.value,
423
+ label: "Overview",
424
+ to: item.to
425
+ },
426
+ ...children
427
+ ];
428
+ item.value = branchValue;
429
+ delete item.to;
430
+ } else {
431
+ item.children = children;
432
+ }
433
+ }
395
434
  return item;
396
435
  });
397
436
  return toItems(root);
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 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":[]}
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 DocsTableAlign = 'left' | 'center' | 'right' | null\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: 'table'\n header: string[]\n rows: string[][]\n align: DocsTableAlign[]\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 isPage?: boolean\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 normalizeTableAlign(align: Array<string | null | undefined>): DocsTableAlign[] {\n return align.map((value) => {\n if (value === 'left' || value === 'center' || value === 'right') {\n return value\n }\n\n return null\n })\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 case 'table':\n blocks.push({\n type: 'table',\n header: token.header.map((cell: Tokens.TableCell) => renderInline(cell.tokens)),\n rows: token.rows.map((row: Tokens.TableCell[]) => row.map((cell) => renderInline(cell.tokens))),\n align: normalizeTableAlign(token.align)\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 getPageNavKey(page: DocsPage): string {\n if (page.isIndexPage) {\n return 'index'\n }\n\n return page.path.split('/').filter(Boolean).at(-1) ?? page.id\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 isPage: false,\n children: new Map()\n })\n }\n\n current = current.get(segment)!.children\n }\n\n const pageKey = getPageNavKey(page)\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 isPage: true,\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 (node.path && node.isPage) {\n item.to = node.path\n }\n\n if (children.length > 0) {\n if (item.to) {\n const branchValue = `${item.value}-section`\n\n item.children = [\n {\n value: item.value,\n label: 'Overview',\n to: item.to\n },\n ...children\n ]\n item.value = branchValue\n delete item.to\n } else {\n item.children = children\n }\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":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@codemonster-ru/vue-ssg-core",
3
- "version": "1.0.3",
3
+ "version": "1.0.5",
4
4
  "description": "Core APIs for Codemonster SSG apps.",
5
5
  "keywords": [
6
6
  "vue",