@geenius/docs 0.8.10 → 0.9.0
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/CHANGELOG.md +6 -0
- package/package.json +33 -21
- package/packages/convex/dist/index.d.ts +4 -4
- package/packages/convex/dist/index.js.map +1 -1
- package/packages/react/dist/index.css +2 -0
- package/packages/react/dist/index.css.map +1 -0
- package/packages/react/dist/index.d.ts +67 -49
- package/packages/react/dist/index.js +83 -41
- package/packages/react/dist/index.js.map +1 -1
- package/packages/react-css/dist/index.d.ts +68 -33
- package/packages/react-css/dist/index.js +61 -38
- package/packages/react-css/dist/index.js.map +1 -1
- package/packages/shared/dist/{chunk-BR2XBF64.js → chunk-QKKVTCRJ.js} +2 -2
- package/packages/shared/dist/{chunk-BR2XBF64.js.map → chunk-QKKVTCRJ.js.map} +1 -1
- package/packages/shared/dist/index.d.ts +6 -6
- package/packages/shared/dist/index.js +1 -1
- package/packages/shared/dist/index.js.map +1 -1
- package/packages/shared/dist/providers.d.ts +4 -4
- package/packages/shared/dist/providers.js +1 -1
- package/packages/shared/dist/providers.js.map +1 -1
- package/packages/shared/dist/{types-n-Ryn258.d.ts → types-D8ITXVwj.d.ts} +1 -1
- package/packages/solidjs/dist/index.css +2 -0
- package/packages/solidjs/dist/index.css.map +1 -0
- package/packages/solidjs/dist/index.d.ts +57 -27
- package/packages/solidjs/dist/index.js +58 -28
- package/packages/solidjs/dist/index.js.map +1 -1
- package/packages/solidjs-css/dist/index.d.ts +55 -20
- package/packages/solidjs-css/dist/index.js +34 -25
- package/packages/solidjs-css/dist/index.js.map +1 -1
|
@@ -153,5 +153,5 @@ var defaultDocsConfig = {
|
|
|
153
153
|
};
|
|
154
154
|
|
|
155
155
|
export { buildBreadcrumbs, buildDocsIndex, calcWordCount, defaultDocsConfig, extractToc, highlightMatch, searchDocs, slugify };
|
|
156
|
-
//# sourceMappingURL=chunk-
|
|
157
|
-
//# sourceMappingURL=chunk-
|
|
156
|
+
//# sourceMappingURL=chunk-QKKVTCRJ.js.map
|
|
157
|
+
//# sourceMappingURL=chunk-QKKVTCRJ.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utilities.ts"],"names":[],"mappings":"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","file":"chunk-BR2XBF64.js","sourcesContent":["/**\n * @module docsUtilities\n * @package @geenius/docs-shared\n * @description Hosts the framework-agnostic docs helpers used by the shared\n * barrel and provider implementations for search, slugging, breadcrumbs, table\n * of contents extraction, and default config resolution.\n */\n\nimport type {\n BreadcrumbItem,\n DocPage,\n DocSection,\n DocsConfig,\n SearchResult,\n TocItem,\n} from './types'\n\nfunction toTocLevel(level: number): TocItem['level'] {\n if (level === 2 || level === 3 || level === 4) {\n return level\n }\n\n return 4\n}\n\n/**\n * Extracts a nested table of contents from Markdown heading lines.\n *\n * @param mdxContent - Markdown or MDX content to parse.\n * @returns A nested heading tree containing only level 2 through 4 headings.\n */\nexport function extractToc(mdxContent: string): TocItem[] {\n const headingRegex = /^(#{2,4})\\s+(.+)$/gm\n const items: TocItem[] = []\n let match = headingRegex.exec(mdxContent)\n\n while (match !== null) {\n const text = match[2].trim()\n items.push({\n id: slugify(text),\n text,\n level: toTocLevel(match[1].length),\n children: [],\n })\n match = headingRegex.exec(mdxContent)\n }\n\n const nested: TocItem[] = []\n let currentH2: TocItem | null = null\n let currentH3: TocItem | null = null\n\n for (const item of items) {\n if (item.level === 2) {\n currentH2 = item\n currentH3 = null\n nested.push(item)\n continue\n }\n\n if (item.level === 3) {\n currentH3 = item\n if (currentH2) {\n currentH2.children.push(item)\n } else {\n nested.push(item)\n }\n continue\n }\n\n if (currentH3) {\n currentH3.children.push(item)\n } else if (currentH2) {\n currentH2.children.push(item)\n } else {\n nested.push(item)\n }\n }\n\n return nested\n}\n\n/**\n * Calculates approximate word count and reading time for page content.\n *\n * @param content - Markdown or MDX content to measure.\n * @returns Word count and reading-time metadata derived from the content.\n */\nexport function calcWordCount(\n content: string,\n): { wordCount: number; readingTime: number } {\n const stripped = content\n .replace(/```[\\s\\S]*?```/g, '')\n .replace(/`[^`]+`/g, '')\n .replace(/!\\[.*?\\]\\(.*?\\)/g, '')\n .replace(/\\[([^\\]]+)\\]\\(.*?\\)/g, '$1')\n .replace(/[#*_~>|-]/g, '')\n .trim()\n\n const words = stripped.split(/\\s+/).filter(Boolean)\n\n return {\n wordCount: words.length,\n readingTime: Math.max(1, Math.ceil(words.length / 225)),\n }\n}\n\n/**\n * Builds a breadcrumb trail for a page from a section tree.\n *\n * @param sections - Full section list used to resolve parent relationships.\n * @param sectionId - Identifier of the page's containing section.\n * @param slug - Page slug appended as the terminal breadcrumb.\n * @returns Breadcrumb items suitable for page-level navigation UI.\n */\nexport function buildBreadcrumbs(\n sections: DocSection[],\n sectionId: string,\n slug: string,\n): BreadcrumbItem[] {\n const crumbs: BreadcrumbItem[] = [{ title: 'Docs', href: '/docs' }]\n const sectionMap = new Map(sections.map((section) => [section.id, section]))\n const trail: DocSection[] = []\n let current = sectionMap.get(sectionId)\n\n while (current) {\n trail.unshift(current)\n current = current.parentId ? sectionMap.get(current.parentId) : undefined\n }\n\n for (const section of trail) {\n crumbs.push({ title: section.title, href: `/docs/${section.slug}` })\n }\n\n if (slug) {\n const parentSlug = trail[trail.length - 1]?.slug ?? ''\n crumbs.push({ title: slug, href: `/docs/${parentSlug}/${slug}` })\n }\n\n return crumbs\n}\n\n/**\n * Builds a full-text search index from published pages and their sections.\n *\n * @param pages - Page records to index.\n * @param sections - Section metadata used to enrich each result.\n * @returns Search index entries derived from the published pages.\n */\nexport function buildDocsIndex(\n pages: DocPage[],\n sections: DocSection[],\n): SearchResult[] {\n const sectionMap = new Map(sections.map((section) => [section.id, section]))\n\n return pages\n .filter((page) => page.status === 'published')\n .map((page) => {\n const section = sectionMap.get(page.sectionId)\n\n return {\n pageId: page.id,\n pageTitle: page.title,\n sectionTitle: section?.title ?? '',\n sectionSlug: section?.slug ?? '',\n slug: page.slug,\n highlight: page.excerpt ?? page.content.slice(0, 160),\n score: 0,\n tags: page.tags,\n }\n })\n}\n\n/**\n * Searches a shared search index and returns ranked matches.\n *\n * @param query - User-entered search query.\n * @param index - Search index entries to rank.\n * @returns Ranked search results limited to the top twenty entries.\n */\nexport function searchDocs(\n query: string,\n index: SearchResult[],\n): SearchResult[] {\n if (!query.trim()) {\n return []\n }\n\n const terms = query.toLowerCase().split(/\\s+/).filter(Boolean)\n\n return index\n .map((entry) => {\n let score = 0\n const titleLower = entry.pageTitle.toLowerCase()\n const highlightLower = entry.highlight.toLowerCase()\n const sectionLower = entry.sectionTitle.toLowerCase()\n const tagsLower = entry.tags.map((tag) => tag.toLowerCase())\n\n for (const term of terms) {\n if (titleLower.includes(term)) {\n score += 10\n }\n if (tagsLower.some((tag) => tag.includes(term))) {\n score += 5\n }\n if (sectionLower.includes(term)) {\n score += 3\n }\n if (highlightLower.includes(term)) {\n score += 2\n }\n }\n\n return { ...entry, score }\n })\n .filter((entry) => entry.score > 0)\n .sort((left, right) => right.score - left.score)\n .slice(0, 20)\n}\n\n/**\n * Creates a URL-safe slug from arbitrary text.\n *\n * @param title - Source text to slugify.\n * @returns A lower-case kebab-case slug.\n */\nexport function slugify(title: string): string {\n return title\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/(^-|-$)/g, '')\n}\n\n/**\n * Produces a search-result snippet centred around a matching query.\n *\n * @param text - Source text used to build the snippet.\n * @param query - User-entered search query.\n * @param maxLen - Maximum snippet length.\n * @returns A trimmed snippet containing the best query match when available.\n */\nexport function highlightMatch(\n text: string,\n query: string,\n maxLen = 160,\n): string {\n if (!query.trim()) {\n return text.slice(0, maxLen)\n }\n\n const lowerText = text.toLowerCase()\n const lowerQuery = query.toLowerCase()\n const index = lowerText.indexOf(lowerQuery)\n\n if (index === -1) {\n return text.slice(0, maxLen)\n }\n\n const start = Math.max(0, index - 40)\n const end = Math.min(text.length, index + query.length + (maxLen - 80))\n let snippet = text.slice(start, end)\n\n if (start > 0) {\n snippet = `…${snippet}`\n }\n if (end < text.length) {\n snippet = `${snippet}…`\n }\n\n return snippet\n}\n\n/**\n * Baseline config used by the framework variants when no explicit config is provided.\n */\nexport const defaultDocsConfig: DocsConfig = {\n siteName: 'Docs',\n cmdKEnabled: true,\n showReadingTime: true,\n showLastEdited: true,\n versionsEnabled: false,\n defaultAccess: 'public',\n printModeEnabled: true,\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/utilities.ts"],"names":[],"mappings":"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","file":"chunk-QKKVTCRJ.js","sourcesContent":["/**\n * @module docsUtilities\n * @package @geenius/docs/shared\n * @description Hosts the framework-agnostic docs helpers used by the shared\n * barrel and provider implementations for search, slugging, breadcrumbs, table\n * of contents extraction, and default config resolution.\n */\n\nimport type {\n BreadcrumbItem,\n DocPage,\n DocSection,\n DocsConfig,\n SearchResult,\n TocItem,\n} from './types'\n\nfunction toTocLevel(level: number): TocItem['level'] {\n if (level === 2 || level === 3 || level === 4) {\n return level\n }\n\n return 4\n}\n\n/**\n * Extracts a nested table of contents from Markdown heading lines.\n *\n * @param mdxContent - Markdown or MDX content to parse.\n * @returns A nested heading tree containing only level 2 through 4 headings.\n */\nexport function extractToc(mdxContent: string): TocItem[] {\n const headingRegex = /^(#{2,4})\\s+(.+)$/gm\n const items: TocItem[] = []\n let match = headingRegex.exec(mdxContent)\n\n while (match !== null) {\n const text = match[2].trim()\n items.push({\n id: slugify(text),\n text,\n level: toTocLevel(match[1].length),\n children: [],\n })\n match = headingRegex.exec(mdxContent)\n }\n\n const nested: TocItem[] = []\n let currentH2: TocItem | null = null\n let currentH3: TocItem | null = null\n\n for (const item of items) {\n if (item.level === 2) {\n currentH2 = item\n currentH3 = null\n nested.push(item)\n continue\n }\n\n if (item.level === 3) {\n currentH3 = item\n if (currentH2) {\n currentH2.children.push(item)\n } else {\n nested.push(item)\n }\n continue\n }\n\n if (currentH3) {\n currentH3.children.push(item)\n } else if (currentH2) {\n currentH2.children.push(item)\n } else {\n nested.push(item)\n }\n }\n\n return nested\n}\n\n/**\n * Calculates approximate word count and reading time for page content.\n *\n * @param content - Markdown or MDX content to measure.\n * @returns Word count and reading-time metadata derived from the content.\n */\nexport function calcWordCount(\n content: string,\n): { wordCount: number; readingTime: number } {\n const stripped = content\n .replace(/```[\\s\\S]*?```/g, '')\n .replace(/`[^`]+`/g, '')\n .replace(/!\\[.*?\\]\\(.*?\\)/g, '')\n .replace(/\\[([^\\]]+)\\]\\(.*?\\)/g, '$1')\n .replace(/[#*_~>|-]/g, '')\n .trim()\n\n const words = stripped.split(/\\s+/).filter(Boolean)\n\n return {\n wordCount: words.length,\n readingTime: Math.max(1, Math.ceil(words.length / 225)),\n }\n}\n\n/**\n * Builds a breadcrumb trail for a page from a section tree.\n *\n * @param sections - Full section list used to resolve parent relationships.\n * @param sectionId - Identifier of the page's containing section.\n * @param slug - Page slug appended as the terminal breadcrumb.\n * @returns Breadcrumb items suitable for page-level navigation UI.\n */\nexport function buildBreadcrumbs(\n sections: DocSection[],\n sectionId: string,\n slug: string,\n): BreadcrumbItem[] {\n const crumbs: BreadcrumbItem[] = [{ title: 'Docs', href: '/docs' }]\n const sectionMap = new Map(sections.map((section) => [section.id, section]))\n const trail: DocSection[] = []\n let current = sectionMap.get(sectionId)\n\n while (current) {\n trail.unshift(current)\n current = current.parentId ? sectionMap.get(current.parentId) : undefined\n }\n\n for (const section of trail) {\n crumbs.push({ title: section.title, href: `/docs/${section.slug}` })\n }\n\n if (slug) {\n const parentSlug = trail[trail.length - 1]?.slug ?? ''\n crumbs.push({ title: slug, href: `/docs/${parentSlug}/${slug}` })\n }\n\n return crumbs\n}\n\n/**\n * Builds a full-text search index from published pages and their sections.\n *\n * @param pages - Page records to index.\n * @param sections - Section metadata used to enrich each result.\n * @returns Search index entries derived from the published pages.\n */\nexport function buildDocsIndex(\n pages: DocPage[],\n sections: DocSection[],\n): SearchResult[] {\n const sectionMap = new Map(sections.map((section) => [section.id, section]))\n\n return pages\n .filter((page) => page.status === 'published')\n .map((page) => {\n const section = sectionMap.get(page.sectionId)\n\n return {\n pageId: page.id,\n pageTitle: page.title,\n sectionTitle: section?.title ?? '',\n sectionSlug: section?.slug ?? '',\n slug: page.slug,\n highlight: page.excerpt ?? page.content.slice(0, 160),\n score: 0,\n tags: page.tags,\n }\n })\n}\n\n/**\n * Searches a shared search index and returns ranked matches.\n *\n * @param query - User-entered search query.\n * @param index - Search index entries to rank.\n * @returns Ranked search results limited to the top twenty entries.\n */\nexport function searchDocs(\n query: string,\n index: SearchResult[],\n): SearchResult[] {\n if (!query.trim()) {\n return []\n }\n\n const terms = query.toLowerCase().split(/\\s+/).filter(Boolean)\n\n return index\n .map((entry) => {\n let score = 0\n const titleLower = entry.pageTitle.toLowerCase()\n const highlightLower = entry.highlight.toLowerCase()\n const sectionLower = entry.sectionTitle.toLowerCase()\n const tagsLower = entry.tags.map((tag) => tag.toLowerCase())\n\n for (const term of terms) {\n if (titleLower.includes(term)) {\n score += 10\n }\n if (tagsLower.some((tag) => tag.includes(term))) {\n score += 5\n }\n if (sectionLower.includes(term)) {\n score += 3\n }\n if (highlightLower.includes(term)) {\n score += 2\n }\n }\n\n return { ...entry, score }\n })\n .filter((entry) => entry.score > 0)\n .sort((left, right) => right.score - left.score)\n .slice(0, 20)\n}\n\n/**\n * Creates a URL-safe slug from arbitrary text.\n *\n * @param title - Source text to slugify.\n * @returns A lower-case kebab-case slug.\n */\nexport function slugify(title: string): string {\n return title\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/(^-|-$)/g, '')\n}\n\n/**\n * Produces a search-result snippet centred around a matching query.\n *\n * @param text - Source text used to build the snippet.\n * @param query - User-entered search query.\n * @param maxLen - Maximum snippet length.\n * @returns A trimmed snippet containing the best query match when available.\n */\nexport function highlightMatch(\n text: string,\n query: string,\n maxLen = 160,\n): string {\n if (!query.trim()) {\n return text.slice(0, maxLen)\n }\n\n const lowerText = text.toLowerCase()\n const lowerQuery = query.toLowerCase()\n const index = lowerText.indexOf(lowerQuery)\n\n if (index === -1) {\n return text.slice(0, maxLen)\n }\n\n const start = Math.max(0, index - 40)\n const end = Math.min(text.length, index + query.length + (maxLen - 80))\n let snippet = text.slice(start, end)\n\n if (start > 0) {\n snippet = `…${snippet}`\n }\n if (end < text.length) {\n snippet = `${snippet}…`\n }\n\n return snippet\n}\n\n/**\n * Baseline config used by the framework variants when no explicit config is provided.\n */\nexport const defaultDocsConfig: DocsConfig = {\n siteName: 'Docs',\n cmdKEnabled: true,\n showReadingTime: true,\n showLastEdited: true,\n versionsEnabled: false,\n defaultAccess: 'public',\n printModeEnabled: true,\n}\n"]}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { D as DocsConfig, a as DocSection, B as BreadcrumbItem, b as DocPage, S as SearchResult, T as TocItem } from './types-
|
|
2
|
-
export { c as DocAccess, d as DocAuthor, e as DocNavigationLink, f as DocRevision, g as DocStatus, h as DocsPage, i as DocsProvider, j as DocsSearchResult, k as DocsSidebar, l as DocsSidebarItem, m as DocsSidebarPage } from './types-
|
|
1
|
+
import { D as DocsConfig, a as DocSection, B as BreadcrumbItem, b as DocPage, S as SearchResult, T as TocItem } from './types-D8ITXVwj.js';
|
|
2
|
+
export { c as DocAccess, d as DocAuthor, e as DocNavigationLink, f as DocRevision, g as DocStatus, h as DocsPage, i as DocsProvider, j as DocsSearchResult, k as DocsSidebar, l as DocsSidebarItem, m as DocsSidebarPage } from './types-D8ITXVwj.js';
|
|
3
3
|
import { GeeniusError, GeeniusErrorOptions, ErrorCode } from '@geenius/tools/errors';
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* @module docsConfig
|
|
7
|
-
* @package @geenius/docs
|
|
7
|
+
* @package @geenius/docs/shared
|
|
8
8
|
* @description Stores and resolves the shared docs configuration used by every
|
|
9
9
|
* framework variant. The config is intentionally process-local so applications
|
|
10
10
|
* can opt into a single docs baseline during bootstrap.
|
|
@@ -19,7 +19,7 @@ import { GeeniusError, GeeniusErrorOptions, ErrorCode } from '@geenius/tools/err
|
|
|
19
19
|
*
|
|
20
20
|
* @example
|
|
21
21
|
* ```ts
|
|
22
|
-
* import { configureDocs } from '@geenius/docs
|
|
22
|
+
* import { configureDocs } from '@geenius/docs/shared'
|
|
23
23
|
*
|
|
24
24
|
* configureDocs({
|
|
25
25
|
* baseUrl: '/docs',
|
|
@@ -67,7 +67,7 @@ declare function mergeDocsConfig(base: DocsConfig, overrides: Partial<DocsConfig
|
|
|
67
67
|
|
|
68
68
|
/**
|
|
69
69
|
* @module docsErrors
|
|
70
|
-
* @package @geenius/docs
|
|
70
|
+
* @package @geenius/docs/shared
|
|
71
71
|
* @description Defines the typed error hierarchy used by the docs package so
|
|
72
72
|
* configuration, provider, and context failures can be caught and handled without
|
|
73
73
|
* relying on raw `Error` instances.
|
|
@@ -114,7 +114,7 @@ declare class DocsProviderError extends DocsError {
|
|
|
114
114
|
|
|
115
115
|
/**
|
|
116
116
|
* @module docsUtilities
|
|
117
|
-
* @package @geenius/docs
|
|
117
|
+
* @package @geenius/docs/shared
|
|
118
118
|
* @description Hosts the framework-agnostic docs helpers used by the shared
|
|
119
119
|
* barrel and provider implementations for search, slugging, breadcrumbs, table
|
|
120
120
|
* of contents extraction, and default config resolution.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { buildBreadcrumbs, buildDocsIndex, calcWordCount, defaultDocsConfig, extractToc, highlightMatch, searchDocs, slugify } from './chunk-
|
|
1
|
+
export { buildBreadcrumbs, buildDocsIndex, calcWordCount, defaultDocsConfig, extractToc, highlightMatch, searchDocs, slugify } from './chunk-QKKVTCRJ.js';
|
|
2
2
|
import { GeeniusError, ErrorCode } from '@geenius/tools/errors';
|
|
3
3
|
|
|
4
4
|
var DocsError = class _DocsError extends GeeniusError {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/errors.ts","../src/config.ts"],"names":["ErrorCode"],"mappings":";;;AAoCO,IAAM,SAAA,GAAN,MAAM,UAAA,SAAkB,YAAA,CAAa;AAAA,EAC1C,YAAY,OAAA,EAA2B;AACrC,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,WAAA;AACZ,IAAA,MAAA,CAAO,cAAA,CAAe,IAAA,EAAM,UAAA,CAAU,SAAS,CAAA;AAAA,EACjD;AACF;AAOO,IAAM,sBAAA,GAAN,MAAM,uBAAA,SAA+B,SAAA,CAAU;AAAA,EACpD,YACE,OAAA,EAGA;AACA,IAAA,KAAA,CAAM;AAAA,MACJ,GAAG,OAAA;AAAA,MACH,IAAA,EAAM,OAAA,CAAQ,IAAA,IAAQ,SAAA,CAAU;AAAA,KACjC,CAAA;AACD,IAAA,IAAA,CAAK,IAAA,GAAO,wBAAA;AACZ,IAAA,MAAA,CAAO,cAAA,CAAe,IAAA,EAAM,uBAAA,CAAuB,SAAS,CAAA;AAAA,EAC9D;AACF;AAOO,IAAM,iBAAA,GAAN,MAAM,kBAAA,SAA0B,SAAA,CAAU;AAAA,EAC/C,YACE,OAAA,EAGA;AACA,IAAA,KAAA,CAAM;AAAA,MACJ,GAAG,OAAA;AAAA,MACH,IAAA,EAAM,OAAA,CAAQ,IAAA,IAAQ,SAAA,CAAU;AAAA,KACjC,CAAA;AACD,IAAA,IAAA,CAAK,IAAA,GAAO,mBAAA;AACZ,IAAA,MAAA,CAAO,cAAA,CAAe,IAAA,EAAM,kBAAA,CAAkB,SAAS,CAAA;AAAA,EACzD;AACF;;;ACtEA,IAAI,OAAA,GAA6B,IAAA;AAoB1B,SAAS,cAAc,MAAA,EAA0B;AACtD,EAAA,OAAA,GAAU,MAAA;AACZ;AASO,SAAS,aAAA,GAA4B;AAC1C,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,sBAAA,CAAuB;AAAA,MAC/B,MAAMA,SAAAA,CAAU,cAAA;AAAA,MAChB,OAAA,EAAS,kDAAA;AAAA,MACT,OAAA,EAAS,EAAE,QAAA,EAAU,eAAA;AAAgB,KACtC,CAAA;AAAA,EACH;AACA,EAAA,OAAO,OAAA;AACT;AAOO,SAAS,gBAAA,GAA4B;AAC1C,EAAA,OAAO,OAAA,KAAY,IAAA;AACrB;AAOO,SAAS,eAAA,GAAwB;AACtC,EAAA,OAAA,GAAU,IAAA;AACZ;AAQO,SAAS,iBACd,SAAA,EACY;AACZ,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,OAAA;AAAA,IACT,aAAA,EAAe,QAAA;AAAA,IACf,eAAA,EAAiB,KAAA;AAAA,IACjB,WAAA,EAAa,IAAA;AAAA,IACb,eAAA,EAAiB,IAAA;AAAA,IACjB,cAAA,EAAgB,IAAA;AAAA,IAChB,gBAAA,EAAkB,IAAA;AAAA,IAClB,GAAG;AAAA,GACL;AACF;AASO,SAAS,eAAA,CACd,MACA,SAAA,EACY;AACZ,EAAA,OAAO;AAAA,IACL,GAAG,IAAA;AAAA,IACH,GAAG;AAAA,GACL;AACF","file":"index.js","sourcesContent":["/**\n * @module docsErrors\n * @package @geenius/docs
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/config.ts"],"names":["ErrorCode"],"mappings":";;;AAoCO,IAAM,SAAA,GAAN,MAAM,UAAA,SAAkB,YAAA,CAAa;AAAA,EAC1C,YAAY,OAAA,EAA2B;AACrC,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,WAAA;AACZ,IAAA,MAAA,CAAO,cAAA,CAAe,IAAA,EAAM,UAAA,CAAU,SAAS,CAAA;AAAA,EACjD;AACF;AAOO,IAAM,sBAAA,GAAN,MAAM,uBAAA,SAA+B,SAAA,CAAU;AAAA,EACpD,YACE,OAAA,EAGA;AACA,IAAA,KAAA,CAAM;AAAA,MACJ,GAAG,OAAA;AAAA,MACH,IAAA,EAAM,OAAA,CAAQ,IAAA,IAAQ,SAAA,CAAU;AAAA,KACjC,CAAA;AACD,IAAA,IAAA,CAAK,IAAA,GAAO,wBAAA;AACZ,IAAA,MAAA,CAAO,cAAA,CAAe,IAAA,EAAM,uBAAA,CAAuB,SAAS,CAAA;AAAA,EAC9D;AACF;AAOO,IAAM,iBAAA,GAAN,MAAM,kBAAA,SAA0B,SAAA,CAAU;AAAA,EAC/C,YACE,OAAA,EAGA;AACA,IAAA,KAAA,CAAM;AAAA,MACJ,GAAG,OAAA;AAAA,MACH,IAAA,EAAM,OAAA,CAAQ,IAAA,IAAQ,SAAA,CAAU;AAAA,KACjC,CAAA;AACD,IAAA,IAAA,CAAK,IAAA,GAAO,mBAAA;AACZ,IAAA,MAAA,CAAO,cAAA,CAAe,IAAA,EAAM,kBAAA,CAAkB,SAAS,CAAA;AAAA,EACzD;AACF;;;ACtEA,IAAI,OAAA,GAA6B,IAAA;AAoB1B,SAAS,cAAc,MAAA,EAA0B;AACtD,EAAA,OAAA,GAAU,MAAA;AACZ;AASO,SAAS,aAAA,GAA4B;AAC1C,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,sBAAA,CAAuB;AAAA,MAC/B,MAAMA,SAAAA,CAAU,cAAA;AAAA,MAChB,OAAA,EAAS,kDAAA;AAAA,MACT,OAAA,EAAS,EAAE,QAAA,EAAU,eAAA;AAAgB,KACtC,CAAA;AAAA,EACH;AACA,EAAA,OAAO,OAAA;AACT;AAOO,SAAS,gBAAA,GAA4B;AAC1C,EAAA,OAAO,OAAA,KAAY,IAAA;AACrB;AAOO,SAAS,eAAA,GAAwB;AACtC,EAAA,OAAA,GAAU,IAAA;AACZ;AAQO,SAAS,iBACd,SAAA,EACY;AACZ,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,OAAA;AAAA,IACT,aAAA,EAAe,QAAA;AAAA,IACf,eAAA,EAAiB,KAAA;AAAA,IACjB,WAAA,EAAa,IAAA;AAAA,IACb,eAAA,EAAiB,IAAA;AAAA,IACjB,cAAA,EAAgB,IAAA;AAAA,IAChB,gBAAA,EAAkB,IAAA;AAAA,IAClB,GAAG;AAAA,GACL;AACF;AASO,SAAS,eAAA,CACd,MACA,SAAA,EACY;AACZ,EAAA,OAAO;AAAA,IACL,GAAG,IAAA;AAAA,IACH,GAAG;AAAA,GACL;AACF","file":"index.js","sourcesContent":["/**\n * @module docsErrors\n * @package @geenius/docs/shared\n * @description Defines the typed error hierarchy used by the docs package so\n * configuration, provider, and context failures can be caught and handled without\n * relying on raw `Error` instances.\n */\n\nimport {\n ErrorCode,\n GeeniusError,\n type GeeniusErrorOptions,\n} from '@geenius/tools/errors'\n\n/**\n * Supported structured error codes for docs-specific failures.\n */\nexport type DocsErrorCode =\n | ErrorCode.INVALID_CONFIG\n | ErrorCode.MISSING_CONFIG\n | ErrorCode.NOT_FOUND\n | ErrorCode.INTERNAL_ERROR\n\n/**\n * Structured error options for docs-specific failures.\n */\nexport interface DocsErrorOptions\n extends Omit<GeeniusErrorOptions, 'code'> {\n code: DocsErrorCode\n}\n\n/**\n * Base structured error for the docs package.\n *\n * @param options - Error metadata describing the docs failure.\n */\nexport class DocsError extends GeeniusError {\n constructor(options: DocsErrorOptions) {\n super(options)\n this.name = 'DocsError'\n Object.setPrototypeOf(this, DocsError.prototype)\n }\n}\n\n/**\n * Error thrown when docs configuration is missing or invalid.\n *\n * @param options - Error metadata describing the configuration problem.\n */\nexport class DocsConfigurationError extends DocsError {\n constructor(\n options: Omit<DocsErrorOptions, 'code'> & {\n code?: ErrorCode.INVALID_CONFIG | ErrorCode.MISSING_CONFIG\n },\n ) {\n super({\n ...options,\n code: options.code ?? ErrorCode.INVALID_CONFIG,\n })\n this.name = 'DocsConfigurationError'\n Object.setPrototypeOf(this, DocsConfigurationError.prototype)\n }\n}\n\n/**\n * Error thrown when a docs provider or provider-backed hook is used incorrectly.\n *\n * @param options - Error metadata describing the provider failure.\n */\nexport class DocsProviderError extends DocsError {\n constructor(\n options: Omit<DocsErrorOptions, 'code'> & {\n code?: ErrorCode.NOT_FOUND | ErrorCode.INTERNAL_ERROR\n },\n ) {\n super({\n ...options,\n code: options.code ?? ErrorCode.INTERNAL_ERROR,\n })\n this.name = 'DocsProviderError'\n Object.setPrototypeOf(this, DocsProviderError.prototype)\n }\n}\n","/**\n * @module docsConfig\n * @package @geenius/docs/shared\n * @description Stores and resolves the shared docs configuration used by every\n * framework variant. The config is intentionally process-local so applications\n * can opt into a single docs baseline during bootstrap.\n */\n\nimport { ErrorCode } from '@geenius/tools/errors'\nimport { DocsConfigurationError } from './errors'\nimport type { DocsConfig } from './types'\n\nlet _config: DocsConfig | null = null\n\n/**\n * Initialize the docs system with a configuration.\n * Call this once at app startup before using any docs features.\n *\n * @param config - Configuration overrides applied for the current app runtime.\n * @returns Nothing. The docs config is stored in module state.\n *\n * @example\n * ```ts\n * import { configureDocs } from '@geenius/docs/shared'\n *\n * configureDocs({\n * baseUrl: '/docs',\n * siteName: 'My Docs',\n * versionsEnabled: true,\n * })\n * ```\n */\nexport function configureDocs(config: DocsConfig): void {\n _config = config\n}\n\n/**\n * Get the current docs configuration.\n * Throws if `configureDocs()` has not been called.\n *\n * @returns The active docs configuration for the current runtime.\n * @throws {DocsConfigurationError} When the docs config has not been initialised.\n */\nexport function getDocsConfig(): DocsConfig {\n if (!_config) {\n throw new DocsConfigurationError({\n code: ErrorCode.MISSING_CONFIG,\n message: 'Docs not configured. Call configureDocs() first.',\n context: { function: 'getDocsConfig' },\n })\n }\n return _config\n}\n\n/**\n * Check if docs have been configured.\n *\n * @returns `true` when a config has been registered for the current runtime.\n */\nexport function isDocsConfigured(): boolean {\n return _config !== null\n}\n\n/**\n * Reset docs configuration (useful for testing).\n *\n * @returns Nothing. The stored docs config is cleared.\n */\nexport function resetDocsConfig(): void {\n _config = null\n}\n\n/**\n * Create a fully resolved docs config with defaults.\n *\n * @param overrides - Partial config overrides supplied by the caller.\n * @returns A complete docs config with package defaults applied.\n */\nexport function defineDocsConfig(\n overrides: Partial<DocsConfig>\n): DocsConfig {\n return {\n baseUrl: '/docs',\n defaultAccess: 'public',\n versionsEnabled: false,\n cmdKEnabled: true,\n showReadingTime: true,\n showLastEdited: true,\n printModeEnabled: true,\n ...overrides,\n }\n}\n\n/**\n * Merge an existing config with partial overrides.\n *\n * @param base - Existing base config to extend.\n * @param overrides - Partial config overrides supplied by the caller.\n * @returns A merged docs config object.\n */\nexport function mergeDocsConfig(\n base: DocsConfig,\n overrides: Partial<DocsConfig>\n): DocsConfig {\n return {\n ...base,\n ...overrides,\n }\n}\n"]}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { i as DocsProvider, k as DocsSidebar, h as DocsPage, j as DocsSearchResult, T as TocItem, g as DocStatus, c as DocAccess, b as DocPage } from './types-
|
|
1
|
+
import { i as DocsProvider, k as DocsSidebar, h as DocsPage, j as DocsSearchResult, T as TocItem, g as DocStatus, c as DocAccess, b as DocPage } from './types-D8ITXVwj.js';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* @module astroDocsProvider
|
|
5
|
-
* @package @geenius/docs
|
|
5
|
+
* @package @geenius/docs/shared
|
|
6
6
|
* @description Implements the Astro-oriented provider used to normalise Markdown
|
|
7
7
|
* and MDX files discovered from Astro content collections into the shared docs
|
|
8
8
|
* contract consumed by the framework variants.
|
|
@@ -72,7 +72,7 @@ declare class AstroDocsProvider implements DocsProvider {
|
|
|
72
72
|
|
|
73
73
|
/**
|
|
74
74
|
* @module fumadocsProvider
|
|
75
|
-
* @package @geenius/docs
|
|
75
|
+
* @package @geenius/docs/shared
|
|
76
76
|
* @description Implements the Fumadocs-backed provider used to normalise
|
|
77
77
|
* source pages and page-tree metadata from Fumadocs into the shared docs
|
|
78
78
|
* contract consumed by the framework variants.
|
|
@@ -171,7 +171,7 @@ declare class FumadocsDocsProvider implements DocsProvider {
|
|
|
171
171
|
|
|
172
172
|
/**
|
|
173
173
|
* @module internalDocsProvider
|
|
174
|
-
* @package @geenius/docs
|
|
174
|
+
* @package @geenius/docs/shared
|
|
175
175
|
* @description Implements the in-memory docs provider used by local fixtures,
|
|
176
176
|
* tests, and apps that already have page records loaded in process memory.
|
|
177
177
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/providers/astro.ts","../src/providers/fumadocs.ts","../src/providers/internal.ts"],"names":["sectionTitle","asString","asAccess","asStatus","asTags","createSidebar"],"mappings":"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","file":"providers.js","sourcesContent":["/**\n * @module astroDocsProvider\n * @package @geenius/docs-shared\n * @description Implements the Astro-oriented provider used to normalise Markdown\n * and MDX files discovered from Astro content collections into the shared docs\n * contract consumed by the framework variants.\n */\n\nimport matter from 'gray-matter'\n\nimport type {\n DocAccess,\n DocNavigationLink,\n DocPage,\n DocStatus,\n DocsPage,\n DocsProvider,\n DocsSearchResult,\n DocsSidebar,\n DocsSidebarItem,\n} from '../types'\nimport { calcWordCount, extractToc, highlightMatch, slugify } from '../utilities'\n\nfunction sectionTitle(sectionId: string): string {\n return sectionId\n .split(/[-_/]/)\n .filter(Boolean)\n .map((part) => `${part[0]?.toUpperCase() ?? ''}${part.slice(1)}`)\n .join(' ') || 'General'\n}\n\nfunction asString(value: unknown): string | undefined {\n return typeof value === 'string' && value.trim().length > 0\n ? value.trim()\n : undefined\n}\n\nfunction asNumber(value: unknown): number {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value\n }\n\n if (typeof value === 'string') {\n const parsed = Number.parseInt(value, 10)\n if (Number.isFinite(parsed)) {\n return parsed\n }\n }\n\n return 0\n}\n\nfunction asAccess(value: unknown): DocAccess {\n if (value === 'team' || value === 'admin') {\n return value\n }\n\n return 'public'\n}\n\nfunction asStatus(value: unknown): DocStatus {\n if (value === 'draft' || value === 'archived') {\n return value\n }\n\n return 'published'\n}\n\nfunction asTags(value: unknown): string[] {\n if (Array.isArray(value)) {\n return value.filter((entry): entry is string => typeof entry === 'string')\n }\n\n if (typeof value === 'string') {\n return value\n .split(',')\n .map((entry) => entry.trim())\n .filter(Boolean)\n }\n\n return []\n}\n\nfunction createSidebar(pages: DocsPage[]): DocsSidebar {\n const sections = new Map<string, DocsSidebarItem>()\n\n for (const page of pages.filter((entry) => entry.status === 'published')) {\n const title = sectionTitle(page.sectionId)\n const existing = sections.get(page.sectionId) ?? {\n id: page.sectionId,\n title,\n slug: slugify(title),\n pages: [],\n }\n\n existing.pages.push({ slug: page.slug, title: page.title })\n sections.set(page.sectionId, existing)\n }\n\n return [...sections.values()]\n}\n\n/**\n * Normalises Astro Markdown and MDX files into the shared docs contract.\n */\nexport class AstroDocsProvider implements DocsProvider {\n private pages: DocsPage[] = []\n\n /**\n * Loads docs from an Astro-style `import.meta.glob()` result.\n *\n * @param globResult - Lazy or eager Astro content loaders keyed by path.\n * @returns Nothing. The provider page set is replaced in memory.\n */\n async loadFromGlob(\n globResult: Record<string, (() => Promise<string>) | string>,\n ): Promise<void> {\n const parsed = await Promise.all(\n Object.entries(globResult).map(async ([path, loader]) => {\n const raw = typeof loader === 'function' ? await loader() : loader\n return this.parseDoc(path, raw)\n }),\n )\n\n this.pages = this.linkPages(parsed)\n }\n\n /**\n * Loads docs from already-read file contents.\n *\n * @param files - File path and content pairs to normalise.\n * @returns Nothing. The provider page set is replaced in memory.\n */\n async loadFromFiles(\n files: Array<{ path: string; content: string }>,\n ): Promise<void> {\n this.pages = this.linkPages(\n files.map((file) => this.parseDoc(file.path, file.content)),\n )\n }\n\n private parseDoc(path: string, raw: string): DocPage {\n const parsed = matter(raw)\n const pathParts = path\n .replace(/.*content\\/docs\\//, '')\n .replace(/\\.(mdx?|md)$/, '')\n .split('/')\n .filter(Boolean)\n const slug = pathParts.join('/')\n const sectionId = pathParts[0] ?? 'general'\n const titleFromPath = pathParts[pathParts.length - 1] ?? slug\n const { wordCount, readingTime } = calcWordCount(parsed.content)\n const authorName = asString(parsed.data.author) ?? 'Geenius'\n const now = new Date().toISOString()\n const status = parsed.data.draft === true\n ? 'draft'\n : asStatus(parsed.data.status)\n\n return {\n id: asString(parsed.data.id) ?? slug,\n title: asString(parsed.data.title) ?? sectionTitle(titleFromPath),\n slug,\n content: parsed.content,\n excerpt: asString(parsed.data.description),\n sectionId,\n order: asNumber(parsed.data.order),\n author: {\n name: authorName,\n avatar: asString(parsed.data.avatar),\n },\n lastEditedBy: asString(parsed.data.lastEditedBy)\n ? {\n name: asString(parsed.data.lastEditedBy) ?? authorName,\n editedAt: asString(parsed.data.lastEditedAt) ?? now,\n }\n : undefined,\n version: asString(parsed.data.version),\n access: asAccess(parsed.data.access),\n tags: asTags(parsed.data.tags),\n status,\n createdAt: asString(parsed.data.createdAt) ?? now,\n updatedAt: asString(parsed.data.updatedAt) ?? now,\n wordCount,\n readingTime,\n viewCount: asNumber(parsed.data.viewCount),\n }\n }\n\n private linkPages(pages: DocPage[]): DocsPage[] {\n const sorted = [...pages].sort((left, right) => left.order - right.order)\n\n return sorted.map((page, index) => {\n const prev = sorted[index - 1]\n const next = sorted[index + 1]\n const prevLink: DocNavigationLink | null = prev\n ? { slug: prev.slug, title: prev.title }\n : null\n const nextLink: DocNavigationLink | null = next\n ? { slug: next.slug, title: next.title }\n : null\n\n return {\n ...page,\n prev: prevLink,\n next: nextLink,\n toc: extractToc(page.content),\n }\n })\n }\n\n /**\n * Loads the sidebar structure derived from the parsed Astro pages.\n *\n * @returns Sidebar navigation entries derived from the published pages.\n */\n async getSidebar(): Promise<DocsSidebar> {\n return createSidebar(this.pages)\n }\n\n /**\n * Resolves a linked docs page by slug.\n *\n * @param slug - Target page slug.\n * @returns The linked page or `null` when no page matches the slug.\n */\n async getPage(slug: string): Promise<DocsPage | null> {\n return this.pages.find((page) => page.slug === slug) ?? null\n }\n\n /**\n * Returns all published pages managed by the provider.\n *\n * @returns Published pages in their linked navigation order.\n */\n async getAllPages(): Promise<DocsPage[]> {\n return this.pages.filter((page) => page.status === 'published')\n }\n\n /**\n * Searches the parsed Astro page set.\n *\n * @param query - User-entered search query.\n * @returns Ranked search results derived from the published pages.\n */\n async search(query: string): Promise<DocsSearchResult[]> {\n const normalizedQuery = query.trim().toLowerCase()\n\n if (!normalizedQuery) {\n return []\n }\n\n return this.pages\n .filter((page) => page.status === 'published')\n .map((page) => {\n let score = 0\n\n if (page.title.toLowerCase().includes(normalizedQuery)) {\n score += 10\n }\n if (page.tags.some((tag) => tag.toLowerCase().includes(normalizedQuery))) {\n score += 4\n }\n if (page.content.toLowerCase().includes(normalizedQuery)) {\n score += 2\n }\n if (score === 0) {\n return null\n }\n\n return {\n pageId: page.id,\n pageTitle: page.title,\n sectionTitle: sectionTitle(page.sectionId),\n slug: page.slug,\n highlight: highlightMatch(page.excerpt ?? page.content, query),\n score,\n }\n })\n .filter((result): result is DocsSearchResult => result !== null)\n .sort((left, right) => right.score - left.score)\n }\n\n /**\n * Resolves previous and next pages for a slug.\n *\n * @param slug - Target page slug.\n * @returns Linked previous and next page records when available.\n */\n async getNavigation(\n slug: string,\n ): Promise<{ prev: DocsPage | null; next: DocsPage | null }> {\n const page = this.pages.find((entry) => entry.slug === slug)\n\n if (!page) {\n return { prev: null, next: null }\n }\n\n return {\n prev: page.prev\n ? this.pages.find((entry) => entry.slug === page.prev?.slug) ?? null\n : null,\n next: page.next\n ? this.pages.find((entry) => entry.slug === page.next?.slug) ?? null\n : null,\n }\n }\n}\n","/**\n * @module fumadocsProvider\n * @package @geenius/docs-shared\n * @description Implements the Fumadocs-backed provider used to normalise\n * source pages and page-tree metadata from Fumadocs into the shared docs\n * contract consumed by the framework variants.\n */\n\nimport type {\n DocAccess,\n DocNavigationLink,\n DocStatus,\n DocsPage,\n DocsProvider,\n DocsSearchResult,\n DocsSidebar,\n DocsSidebarItem,\n TocItem,\n} from '../types'\nimport { calcWordCount, extractToc, highlightMatch, slugify } from '../utilities'\n\nfunction sectionTitle(sectionId: string): string {\n return sectionId\n .split(/[-_/]/)\n .filter(Boolean)\n .map((part) => `${part[0]?.toUpperCase() ?? ''}${part.slice(1)}`)\n .join(' ') || 'General'\n}\n\nfunction asString(value: unknown): string | undefined {\n return typeof value === 'string' && value.trim().length > 0\n ? value.trim()\n : undefined\n}\n\nfunction _asNumber(value: unknown): number {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value\n }\n\n return 0\n}\n\nfunction asAccess(value: unknown): DocAccess {\n if (value === 'team' || value === 'admin') {\n return value\n }\n\n return 'public'\n}\n\nfunction asStatus(value: unknown): DocStatus {\n if (value === 'draft' || value === 'archived') {\n return value\n }\n\n return 'published'\n}\n\nfunction asTags(value: unknown): string[] {\n if (Array.isArray(value)) {\n return value.filter((entry): entry is string => typeof entry === 'string')\n }\n\n if (typeof value === 'string') {\n return value\n .split(',')\n .map((entry) => entry.trim())\n .filter(Boolean)\n }\n\n return []\n}\n\nfunction createSidebar(pages: DocsPage[]): DocsSidebar {\n const sections = new Map<string, DocsSidebarItem>()\n\n for (const page of pages.filter((entry) => entry.status === 'published')) {\n const title = sectionTitle(page.sectionId)\n const existing = sections.get(page.sectionId) ?? {\n id: page.sectionId,\n title,\n slug: slugify(title),\n pages: [],\n }\n\n existing.pages.push({ slug: page.slug, title: page.title })\n sections.set(page.sectionId, existing)\n }\n\n return [...sections.values()]\n}\n\n/**\n * Fumadocs source-page shape accepted by the provider.\n */\nexport interface FumadocsSourcePage {\n slug?: string\n slugs?: string[]\n url?: string\n data: {\n title?: string\n description?: string\n body?: string\n icon?: string\n order?: number\n toc?: TocItem[]\n draft?: boolean\n status?: DocStatus\n access?: DocAccess\n author?: string\n avatar?: string\n tags?: string[] | string\n version?: string\n lastModified?: string\n lastUpdated?: string\n [key: string]: unknown\n }\n}\n\n/**\n * Fumadocs tree-node shape accepted by the provider.\n */\nexport interface FumadocsTreeNode {\n type: 'page' | 'folder' | 'separator'\n name?: string\n slug?: string\n icon?: string\n children?: FumadocsTreeNode[]\n}\n\n/**\n * Fumadocs provider that bridges source pages and trees into the shared docs contract.\n */\nexport class FumadocsDocsProvider implements DocsProvider {\n private pages: DocsPage[] = []\n private tree: FumadocsTreeNode[] = []\n\n /**\n * Loads pages and an optional page tree from Fumadocs.\n *\n * @param pages - Source pages supplied by Fumadocs.\n * @param tree - Optional source page tree for nested sidebar rendering.\n * @returns Nothing. The provider page set is replaced in memory.\n */\n loadFromSource(\n pages: FumadocsSourcePage[],\n tree: FumadocsTreeNode[] = [],\n ): void {\n this.tree = tree\n this.pages = this.linkPages(pages.map((page) => this.normalizePage(page)))\n }\n\n private normalizePage(page: FumadocsSourcePage): DocsPage {\n const slugParts = page.slugs ?? page.slug?.split('/') ?? []\n const slug = slugParts.join('/')\n const sectionId = slugParts[0] ?? 'general'\n const title = page.data.title ?? slugParts[slugParts.length - 1] ?? slug\n const content = page.data.body ?? ''\n const { wordCount, readingTime } = calcWordCount(content)\n const now = new Date().toISOString()\n\n return {\n id: slug,\n title,\n slug,\n content,\n excerpt: page.data.description,\n sectionId,\n order: page.data.order ?? 0,\n author: {\n name: page.data.author ?? 'Geenius',\n avatar: asString(page.data.avatar),\n },\n lastEditedBy: asString(page.data.lastModified ?? page.data.lastUpdated)\n ? {\n name: page.data.author ?? 'Geenius',\n editedAt: asString(page.data.lastModified ?? page.data.lastUpdated) ?? now,\n }\n : undefined,\n version: asString(page.data.version),\n access: asAccess(page.data.access),\n tags: asTags(page.data.tags),\n status: page.data.draft === true\n ? 'draft'\n : asStatus(page.data.status),\n createdAt: now,\n updatedAt: asString(page.data.lastModified ?? page.data.lastUpdated) ?? now,\n wordCount,\n readingTime,\n viewCount: 0,\n toc: page.data.toc ?? extractToc(content),\n }\n }\n\n private linkPages(pages: DocsPage[]): DocsPage[] {\n const sorted = [...pages].sort((left, right) => left.order - right.order)\n\n return sorted.map((page, index) => {\n const prev = sorted[index - 1]\n const next = sorted[index + 1]\n const prevLink: DocNavigationLink | null = prev\n ? { slug: prev.slug, title: prev.title }\n : null\n const nextLink: DocNavigationLink | null = next\n ? { slug: next.slug, title: next.title }\n : null\n\n return {\n ...page,\n prev: prevLink,\n next: nextLink,\n }\n })\n }\n\n private treeToSidebar(nodes: FumadocsTreeNode[]): DocsSidebar {\n return nodes\n .filter((node) => node.type === 'folder')\n .map((folder) => {\n const title = folder.name ?? 'Section'\n const children = folder.children ?? []\n const pages = children\n .filter((child) => child.type === 'page')\n .map((child) => ({\n slug: child.slug ?? '',\n title: child.name ?? child.slug ?? 'Untitled',\n }))\n const nestedChildren = this.treeToSidebar(\n children.filter((child) => child.type === 'folder'),\n )\n\n return {\n id: folder.slug ?? slugify(title),\n title,\n slug: folder.slug ?? slugify(title),\n icon: folder.icon,\n pages,\n children: nestedChildren.length > 0 ? nestedChildren : undefined,\n }\n })\n }\n\n /**\n * Loads the sidebar structure derived from the Fumadocs tree or grouped pages.\n *\n * @returns Sidebar navigation entries derived from the published pages.\n */\n async getSidebar(): Promise<DocsSidebar> {\n if (this.tree.length > 0) {\n return this.treeToSidebar(this.tree)\n }\n\n return createSidebar(this.pages)\n }\n\n /**\n * Resolves a linked docs page by slug.\n *\n * @param slug - Target page slug.\n * @returns The linked page or `null` when no page matches the slug.\n */\n async getPage(slug: string): Promise<DocsPage | null> {\n return this.pages.find((page) => page.slug === slug) ?? null\n }\n\n /**\n * Returns all published pages managed by the provider.\n *\n * @returns Published pages in their linked navigation order.\n */\n async getAllPages(): Promise<DocsPage[]> {\n return this.pages.filter((page) => page.status === 'published')\n }\n\n /**\n * Searches the provider-backed page set.\n *\n * @param query - User-entered search query.\n * @returns Ranked search results derived from the published pages.\n */\n async search(query: string): Promise<DocsSearchResult[]> {\n const normalizedQuery = query.trim().toLowerCase()\n\n if (!normalizedQuery) {\n return []\n }\n\n return this.pages\n .filter((page) => page.status === 'published')\n .map((page) => {\n let score = 0\n\n if (page.title.toLowerCase().includes(normalizedQuery)) {\n score += 10\n }\n if (page.tags.some((tag) => tag.toLowerCase().includes(normalizedQuery))) {\n score += 4\n }\n if (page.content.toLowerCase().includes(normalizedQuery)) {\n score += 2\n }\n if (page.excerpt?.toLowerCase().includes(normalizedQuery)) {\n score += 1\n }\n if (score === 0) {\n return null\n }\n\n return {\n pageId: page.id,\n pageTitle: page.title,\n sectionTitle: sectionTitle(page.sectionId),\n slug: page.slug,\n highlight: highlightMatch(page.excerpt ?? page.content, query),\n score,\n }\n })\n .filter((result): result is DocsSearchResult => result !== null)\n .sort((left, right) => right.score - left.score)\n }\n\n /**\n * Resolves previous and next pages for a slug.\n *\n * @param slug - Target page slug.\n * @returns Linked previous and next page records when available.\n */\n async getNavigation(\n slug: string,\n ): Promise<{ prev: DocsPage | null; next: DocsPage | null }> {\n const page = this.pages.find((entry) => entry.slug === slug)\n\n if (!page) {\n return { prev: null, next: null }\n }\n\n return {\n prev: page.prev\n ? this.pages.find((entry) => entry.slug === page.prev?.slug) ?? null\n : null,\n next: page.next\n ? this.pages.find((entry) => entry.slug === page.next?.slug) ?? null\n : null,\n }\n }\n}\n","/**\n * @module internalDocsProvider\n * @package @geenius/docs-shared\n * @description Implements the in-memory docs provider used by local fixtures,\n * tests, and apps that already have page records loaded in process memory.\n */\n\nimport type {\n DocNavigationLink,\n DocPage,\n DocsPage,\n DocsProvider,\n DocsSearchResult,\n DocsSidebar,\n DocsSidebarItem,\n} from '../types'\nimport { extractToc, highlightMatch, slugify } from '../utilities'\n\nfunction sectionTitle(sectionId: string): string {\n return sectionId\n .split(/[-_/]/)\n .filter(Boolean)\n .map((part) => `${part[0]?.toUpperCase() ?? ''}${part.slice(1)}`)\n .join(' ') || 'General'\n}\n\nfunction createSidebar(pages: DocsPage[]): DocsSidebar {\n const sections = new Map<string, DocsSidebarItem>()\n\n for (const page of pages.filter((entry) => entry.status === 'published')) {\n const title = sectionTitle(page.sectionId)\n const entry = sections.get(page.sectionId) ?? {\n id: page.sectionId,\n title,\n slug: slugify(title),\n pages: [],\n }\n\n entry.pages.push({ slug: page.slug, title: page.title })\n sections.set(page.sectionId, entry)\n }\n\n return [...sections.values()].map((entry) => ({\n ...entry,\n pages: [...entry.pages].sort((left, right) =>\n left.title.localeCompare(right.title),\n ),\n }))\n}\n\n/**\n * In-memory provider for already-hydrated docs pages.\n */\nexport class InternalDocsProvider implements DocsProvider {\n private pages: DocsPage[] = []\n\n /**\n * @param pages - Optional initial page records to seed the provider with.\n */\n constructor(pages: DocPage[] = []) {\n this.pages = this.linkPages(pages)\n }\n\n /**\n * Replaces the provider's page set.\n *\n * @param pages - Fresh page records to seed into the provider.\n * @returns Nothing. The provider page set is replaced in memory.\n */\n setPages(pages: DocPage[]): void {\n this.pages = this.linkPages(pages)\n }\n\n private linkPages(pages: DocPage[]): DocsPage[] {\n const sorted = [...pages].sort((left, right) => left.order - right.order)\n\n return sorted.map((page, index) => {\n const prev = sorted[index - 1]\n const next = sorted[index + 1]\n const prevLink: DocNavigationLink | null = prev\n ? { slug: prev.slug, title: prev.title }\n : null\n const nextLink: DocNavigationLink | null = next\n ? { slug: next.slug, title: next.title }\n : null\n\n return {\n ...page,\n prev: prevLink,\n next: nextLink,\n toc: extractToc(page.content),\n }\n })\n }\n\n /**\n * Loads the sidebar structure derived from the current page set.\n *\n * @returns Sidebar navigation entries derived from the published pages.\n */\n async getSidebar(): Promise<DocsSidebar> {\n return createSidebar(this.pages)\n }\n\n /**\n * Resolves a linked docs page by slug.\n *\n * @param slug - Target page slug.\n * @returns The linked page or `null` when no page matches the slug.\n */\n async getPage(slug: string): Promise<DocsPage | null> {\n return this.pages.find((page) => page.slug === slug) ?? null\n }\n\n /**\n * Returns all published pages managed by the provider.\n *\n * @returns Published pages in their linked navigation order.\n */\n async getAllPages(): Promise<DocsPage[]> {\n return this.pages.filter((page) => page.status === 'published')\n }\n\n /**\n * Searches the provider-backed page set.\n *\n * @param query - User-entered search query.\n * @returns Ranked search results derived from the published pages.\n */\n async search(query: string): Promise<DocsSearchResult[]> {\n const normalizedQuery = query.trim().toLowerCase()\n\n if (!normalizedQuery) {\n return []\n }\n\n return this.pages\n .filter((page) => page.status === 'published')\n .map((page) => {\n let score = 0\n\n if (page.title.toLowerCase().includes(normalizedQuery)) {\n score += 10\n }\n if (page.tags.some((tag) => tag.toLowerCase().includes(normalizedQuery))) {\n score += 4\n }\n if (page.content.toLowerCase().includes(normalizedQuery)) {\n score += 2\n }\n if (score === 0) {\n return null\n }\n\n return {\n pageId: page.id,\n pageTitle: page.title,\n sectionTitle: sectionTitle(page.sectionId),\n slug: page.slug,\n highlight: highlightMatch(page.excerpt ?? page.content, query),\n score,\n }\n })\n .filter((result): result is DocsSearchResult => result !== null)\n .sort((left, right) => right.score - left.score)\n }\n\n /**\n * Resolves previous and next pages for a slug.\n *\n * @param slug - Target page slug.\n * @returns Linked previous and next page records when available.\n */\n async getNavigation(\n slug: string,\n ): Promise<{ prev: DocsPage | null; next: DocsPage | null }> {\n const page = this.pages.find((entry) => entry.slug === slug)\n\n if (!page) {\n return { prev: null, next: null }\n }\n\n return {\n prev: page.prev\n ? this.pages.find((entry) => entry.slug === page.prev?.slug) ?? null\n : null,\n next: page.next\n ? this.pages.find((entry) => entry.slug === page.next?.slug) ?? null\n : null,\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/providers/astro.ts","../src/providers/fumadocs.ts","../src/providers/internal.ts"],"names":["sectionTitle","asString","asAccess","asStatus","asTags","createSidebar"],"mappings":"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","file":"providers.js","sourcesContent":["/**\n * @module astroDocsProvider\n * @package @geenius/docs/shared\n * @description Implements the Astro-oriented provider used to normalise Markdown\n * and MDX files discovered from Astro content collections into the shared docs\n * contract consumed by the framework variants.\n */\n\nimport matter from 'gray-matter'\n\nimport type {\n DocAccess,\n DocNavigationLink,\n DocPage,\n DocStatus,\n DocsPage,\n DocsProvider,\n DocsSearchResult,\n DocsSidebar,\n DocsSidebarItem,\n} from '../types'\nimport { calcWordCount, extractToc, highlightMatch, slugify } from '../utilities'\n\nfunction sectionTitle(sectionId: string): string {\n return sectionId\n .split(/[-_/]/)\n .filter(Boolean)\n .map((part) => `${part[0]?.toUpperCase() ?? ''}${part.slice(1)}`)\n .join(' ') || 'General'\n}\n\nfunction asString(value: unknown): string | undefined {\n return typeof value === 'string' && value.trim().length > 0\n ? value.trim()\n : undefined\n}\n\nfunction asNumber(value: unknown): number {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value\n }\n\n if (typeof value === 'string') {\n const parsed = Number.parseInt(value, 10)\n if (Number.isFinite(parsed)) {\n return parsed\n }\n }\n\n return 0\n}\n\nfunction asAccess(value: unknown): DocAccess {\n if (value === 'team' || value === 'admin') {\n return value\n }\n\n return 'public'\n}\n\nfunction asStatus(value: unknown): DocStatus {\n if (value === 'draft' || value === 'archived') {\n return value\n }\n\n return 'published'\n}\n\nfunction asTags(value: unknown): string[] {\n if (Array.isArray(value)) {\n return value.filter((entry): entry is string => typeof entry === 'string')\n }\n\n if (typeof value === 'string') {\n return value\n .split(',')\n .map((entry) => entry.trim())\n .filter(Boolean)\n }\n\n return []\n}\n\nfunction createSidebar(pages: DocsPage[]): DocsSidebar {\n const sections = new Map<string, DocsSidebarItem>()\n\n for (const page of pages.filter((entry) => entry.status === 'published')) {\n const title = sectionTitle(page.sectionId)\n const existing = sections.get(page.sectionId) ?? {\n id: page.sectionId,\n title,\n slug: slugify(title),\n pages: [],\n }\n\n existing.pages.push({ slug: page.slug, title: page.title })\n sections.set(page.sectionId, existing)\n }\n\n return [...sections.values()]\n}\n\n/**\n * Normalises Astro Markdown and MDX files into the shared docs contract.\n */\nexport class AstroDocsProvider implements DocsProvider {\n private pages: DocsPage[] = []\n\n /**\n * Loads docs from an Astro-style `import.meta.glob()` result.\n *\n * @param globResult - Lazy or eager Astro content loaders keyed by path.\n * @returns Nothing. The provider page set is replaced in memory.\n */\n async loadFromGlob(\n globResult: Record<string, (() => Promise<string>) | string>,\n ): Promise<void> {\n const parsed = await Promise.all(\n Object.entries(globResult).map(async ([path, loader]) => {\n const raw = typeof loader === 'function' ? await loader() : loader\n return this.parseDoc(path, raw)\n }),\n )\n\n this.pages = this.linkPages(parsed)\n }\n\n /**\n * Loads docs from already-read file contents.\n *\n * @param files - File path and content pairs to normalise.\n * @returns Nothing. The provider page set is replaced in memory.\n */\n async loadFromFiles(\n files: Array<{ path: string; content: string }>,\n ): Promise<void> {\n this.pages = this.linkPages(\n files.map((file) => this.parseDoc(file.path, file.content)),\n )\n }\n\n private parseDoc(path: string, raw: string): DocPage {\n const parsed = matter(raw)\n const pathParts = path\n .replace(/.*content\\/docs\\//, '')\n .replace(/\\.(mdx?|md)$/, '')\n .split('/')\n .filter(Boolean)\n const slug = pathParts.join('/')\n const sectionId = pathParts[0] ?? 'general'\n const titleFromPath = pathParts[pathParts.length - 1] ?? slug\n const { wordCount, readingTime } = calcWordCount(parsed.content)\n const authorName = asString(parsed.data.author) ?? 'Geenius'\n const now = new Date().toISOString()\n const status = parsed.data.draft === true\n ? 'draft'\n : asStatus(parsed.data.status)\n\n return {\n id: asString(parsed.data.id) ?? slug,\n title: asString(parsed.data.title) ?? sectionTitle(titleFromPath),\n slug,\n content: parsed.content,\n excerpt: asString(parsed.data.description),\n sectionId,\n order: asNumber(parsed.data.order),\n author: {\n name: authorName,\n avatar: asString(parsed.data.avatar),\n },\n lastEditedBy: asString(parsed.data.lastEditedBy)\n ? {\n name: asString(parsed.data.lastEditedBy) ?? authorName,\n editedAt: asString(parsed.data.lastEditedAt) ?? now,\n }\n : undefined,\n version: asString(parsed.data.version),\n access: asAccess(parsed.data.access),\n tags: asTags(parsed.data.tags),\n status,\n createdAt: asString(parsed.data.createdAt) ?? now,\n updatedAt: asString(parsed.data.updatedAt) ?? now,\n wordCount,\n readingTime,\n viewCount: asNumber(parsed.data.viewCount),\n }\n }\n\n private linkPages(pages: DocPage[]): DocsPage[] {\n const sorted = [...pages].sort((left, right) => left.order - right.order)\n\n return sorted.map((page, index) => {\n const prev = sorted[index - 1]\n const next = sorted[index + 1]\n const prevLink: DocNavigationLink | null = prev\n ? { slug: prev.slug, title: prev.title }\n : null\n const nextLink: DocNavigationLink | null = next\n ? { slug: next.slug, title: next.title }\n : null\n\n return {\n ...page,\n prev: prevLink,\n next: nextLink,\n toc: extractToc(page.content),\n }\n })\n }\n\n /**\n * Loads the sidebar structure derived from the parsed Astro pages.\n *\n * @returns Sidebar navigation entries derived from the published pages.\n */\n async getSidebar(): Promise<DocsSidebar> {\n return createSidebar(this.pages)\n }\n\n /**\n * Resolves a linked docs page by slug.\n *\n * @param slug - Target page slug.\n * @returns The linked page or `null` when no page matches the slug.\n */\n async getPage(slug: string): Promise<DocsPage | null> {\n return this.pages.find((page) => page.slug === slug) ?? null\n }\n\n /**\n * Returns all published pages managed by the provider.\n *\n * @returns Published pages in their linked navigation order.\n */\n async getAllPages(): Promise<DocsPage[]> {\n return this.pages.filter((page) => page.status === 'published')\n }\n\n /**\n * Searches the parsed Astro page set.\n *\n * @param query - User-entered search query.\n * @returns Ranked search results derived from the published pages.\n */\n async search(query: string): Promise<DocsSearchResult[]> {\n const normalizedQuery = query.trim().toLowerCase()\n\n if (!normalizedQuery) {\n return []\n }\n\n return this.pages\n .filter((page) => page.status === 'published')\n .map((page) => {\n let score = 0\n\n if (page.title.toLowerCase().includes(normalizedQuery)) {\n score += 10\n }\n if (page.tags.some((tag) => tag.toLowerCase().includes(normalizedQuery))) {\n score += 4\n }\n if (page.content.toLowerCase().includes(normalizedQuery)) {\n score += 2\n }\n if (score === 0) {\n return null\n }\n\n return {\n pageId: page.id,\n pageTitle: page.title,\n sectionTitle: sectionTitle(page.sectionId),\n slug: page.slug,\n highlight: highlightMatch(page.excerpt ?? page.content, query),\n score,\n }\n })\n .filter((result): result is DocsSearchResult => result !== null)\n .sort((left, right) => right.score - left.score)\n }\n\n /**\n * Resolves previous and next pages for a slug.\n *\n * @param slug - Target page slug.\n * @returns Linked previous and next page records when available.\n */\n async getNavigation(\n slug: string,\n ): Promise<{ prev: DocsPage | null; next: DocsPage | null }> {\n const page = this.pages.find((entry) => entry.slug === slug)\n\n if (!page) {\n return { prev: null, next: null }\n }\n\n return {\n prev: page.prev\n ? this.pages.find((entry) => entry.slug === page.prev?.slug) ?? null\n : null,\n next: page.next\n ? this.pages.find((entry) => entry.slug === page.next?.slug) ?? null\n : null,\n }\n }\n}\n","/**\n * @module fumadocsProvider\n * @package @geenius/docs/shared\n * @description Implements the Fumadocs-backed provider used to normalise\n * source pages and page-tree metadata from Fumadocs into the shared docs\n * contract consumed by the framework variants.\n */\n\nimport type {\n DocAccess,\n DocNavigationLink,\n DocStatus,\n DocsPage,\n DocsProvider,\n DocsSearchResult,\n DocsSidebar,\n DocsSidebarItem,\n TocItem,\n} from '../types'\nimport { calcWordCount, extractToc, highlightMatch, slugify } from '../utilities'\n\nfunction sectionTitle(sectionId: string): string {\n return sectionId\n .split(/[-_/]/)\n .filter(Boolean)\n .map((part) => `${part[0]?.toUpperCase() ?? ''}${part.slice(1)}`)\n .join(' ') || 'General'\n}\n\nfunction asString(value: unknown): string | undefined {\n return typeof value === 'string' && value.trim().length > 0\n ? value.trim()\n : undefined\n}\n\nfunction _asNumber(value: unknown): number {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return value\n }\n\n return 0\n}\n\nfunction asAccess(value: unknown): DocAccess {\n if (value === 'team' || value === 'admin') {\n return value\n }\n\n return 'public'\n}\n\nfunction asStatus(value: unknown): DocStatus {\n if (value === 'draft' || value === 'archived') {\n return value\n }\n\n return 'published'\n}\n\nfunction asTags(value: unknown): string[] {\n if (Array.isArray(value)) {\n return value.filter((entry): entry is string => typeof entry === 'string')\n }\n\n if (typeof value === 'string') {\n return value\n .split(',')\n .map((entry) => entry.trim())\n .filter(Boolean)\n }\n\n return []\n}\n\nfunction createSidebar(pages: DocsPage[]): DocsSidebar {\n const sections = new Map<string, DocsSidebarItem>()\n\n for (const page of pages.filter((entry) => entry.status === 'published')) {\n const title = sectionTitle(page.sectionId)\n const existing = sections.get(page.sectionId) ?? {\n id: page.sectionId,\n title,\n slug: slugify(title),\n pages: [],\n }\n\n existing.pages.push({ slug: page.slug, title: page.title })\n sections.set(page.sectionId, existing)\n }\n\n return [...sections.values()]\n}\n\n/**\n * Fumadocs source-page shape accepted by the provider.\n */\nexport interface FumadocsSourcePage {\n slug?: string\n slugs?: string[]\n url?: string\n data: {\n title?: string\n description?: string\n body?: string\n icon?: string\n order?: number\n toc?: TocItem[]\n draft?: boolean\n status?: DocStatus\n access?: DocAccess\n author?: string\n avatar?: string\n tags?: string[] | string\n version?: string\n lastModified?: string\n lastUpdated?: string\n [key: string]: unknown\n }\n}\n\n/**\n * Fumadocs tree-node shape accepted by the provider.\n */\nexport interface FumadocsTreeNode {\n type: 'page' | 'folder' | 'separator'\n name?: string\n slug?: string\n icon?: string\n children?: FumadocsTreeNode[]\n}\n\n/**\n * Fumadocs provider that bridges source pages and trees into the shared docs contract.\n */\nexport class FumadocsDocsProvider implements DocsProvider {\n private pages: DocsPage[] = []\n private tree: FumadocsTreeNode[] = []\n\n /**\n * Loads pages and an optional page tree from Fumadocs.\n *\n * @param pages - Source pages supplied by Fumadocs.\n * @param tree - Optional source page tree for nested sidebar rendering.\n * @returns Nothing. The provider page set is replaced in memory.\n */\n loadFromSource(\n pages: FumadocsSourcePage[],\n tree: FumadocsTreeNode[] = [],\n ): void {\n this.tree = tree\n this.pages = this.linkPages(pages.map((page) => this.normalizePage(page)))\n }\n\n private normalizePage(page: FumadocsSourcePage): DocsPage {\n const slugParts = page.slugs ?? page.slug?.split('/') ?? []\n const slug = slugParts.join('/')\n const sectionId = slugParts[0] ?? 'general'\n const title = page.data.title ?? slugParts[slugParts.length - 1] ?? slug\n const content = page.data.body ?? ''\n const { wordCount, readingTime } = calcWordCount(content)\n const now = new Date().toISOString()\n\n return {\n id: slug,\n title,\n slug,\n content,\n excerpt: page.data.description,\n sectionId,\n order: page.data.order ?? 0,\n author: {\n name: page.data.author ?? 'Geenius',\n avatar: asString(page.data.avatar),\n },\n lastEditedBy: asString(page.data.lastModified ?? page.data.lastUpdated)\n ? {\n name: page.data.author ?? 'Geenius',\n editedAt: asString(page.data.lastModified ?? page.data.lastUpdated) ?? now,\n }\n : undefined,\n version: asString(page.data.version),\n access: asAccess(page.data.access),\n tags: asTags(page.data.tags),\n status: page.data.draft === true\n ? 'draft'\n : asStatus(page.data.status),\n createdAt: now,\n updatedAt: asString(page.data.lastModified ?? page.data.lastUpdated) ?? now,\n wordCount,\n readingTime,\n viewCount: 0,\n toc: page.data.toc ?? extractToc(content),\n }\n }\n\n private linkPages(pages: DocsPage[]): DocsPage[] {\n const sorted = [...pages].sort((left, right) => left.order - right.order)\n\n return sorted.map((page, index) => {\n const prev = sorted[index - 1]\n const next = sorted[index + 1]\n const prevLink: DocNavigationLink | null = prev\n ? { slug: prev.slug, title: prev.title }\n : null\n const nextLink: DocNavigationLink | null = next\n ? { slug: next.slug, title: next.title }\n : null\n\n return {\n ...page,\n prev: prevLink,\n next: nextLink,\n }\n })\n }\n\n private treeToSidebar(nodes: FumadocsTreeNode[]): DocsSidebar {\n return nodes\n .filter((node) => node.type === 'folder')\n .map((folder) => {\n const title = folder.name ?? 'Section'\n const children = folder.children ?? []\n const pages = children\n .filter((child) => child.type === 'page')\n .map((child) => ({\n slug: child.slug ?? '',\n title: child.name ?? child.slug ?? 'Untitled',\n }))\n const nestedChildren = this.treeToSidebar(\n children.filter((child) => child.type === 'folder'),\n )\n\n return {\n id: folder.slug ?? slugify(title),\n title,\n slug: folder.slug ?? slugify(title),\n icon: folder.icon,\n pages,\n children: nestedChildren.length > 0 ? nestedChildren : undefined,\n }\n })\n }\n\n /**\n * Loads the sidebar structure derived from the Fumadocs tree or grouped pages.\n *\n * @returns Sidebar navigation entries derived from the published pages.\n */\n async getSidebar(): Promise<DocsSidebar> {\n if (this.tree.length > 0) {\n return this.treeToSidebar(this.tree)\n }\n\n return createSidebar(this.pages)\n }\n\n /**\n * Resolves a linked docs page by slug.\n *\n * @param slug - Target page slug.\n * @returns The linked page or `null` when no page matches the slug.\n */\n async getPage(slug: string): Promise<DocsPage | null> {\n return this.pages.find((page) => page.slug === slug) ?? null\n }\n\n /**\n * Returns all published pages managed by the provider.\n *\n * @returns Published pages in their linked navigation order.\n */\n async getAllPages(): Promise<DocsPage[]> {\n return this.pages.filter((page) => page.status === 'published')\n }\n\n /**\n * Searches the provider-backed page set.\n *\n * @param query - User-entered search query.\n * @returns Ranked search results derived from the published pages.\n */\n async search(query: string): Promise<DocsSearchResult[]> {\n const normalizedQuery = query.trim().toLowerCase()\n\n if (!normalizedQuery) {\n return []\n }\n\n return this.pages\n .filter((page) => page.status === 'published')\n .map((page) => {\n let score = 0\n\n if (page.title.toLowerCase().includes(normalizedQuery)) {\n score += 10\n }\n if (page.tags.some((tag) => tag.toLowerCase().includes(normalizedQuery))) {\n score += 4\n }\n if (page.content.toLowerCase().includes(normalizedQuery)) {\n score += 2\n }\n if (page.excerpt?.toLowerCase().includes(normalizedQuery)) {\n score += 1\n }\n if (score === 0) {\n return null\n }\n\n return {\n pageId: page.id,\n pageTitle: page.title,\n sectionTitle: sectionTitle(page.sectionId),\n slug: page.slug,\n highlight: highlightMatch(page.excerpt ?? page.content, query),\n score,\n }\n })\n .filter((result): result is DocsSearchResult => result !== null)\n .sort((left, right) => right.score - left.score)\n }\n\n /**\n * Resolves previous and next pages for a slug.\n *\n * @param slug - Target page slug.\n * @returns Linked previous and next page records when available.\n */\n async getNavigation(\n slug: string,\n ): Promise<{ prev: DocsPage | null; next: DocsPage | null }> {\n const page = this.pages.find((entry) => entry.slug === slug)\n\n if (!page) {\n return { prev: null, next: null }\n }\n\n return {\n prev: page.prev\n ? this.pages.find((entry) => entry.slug === page.prev?.slug) ?? null\n : null,\n next: page.next\n ? this.pages.find((entry) => entry.slug === page.next?.slug) ?? null\n : null,\n }\n }\n}\n","/**\n * @module internalDocsProvider\n * @package @geenius/docs/shared\n * @description Implements the in-memory docs provider used by local fixtures,\n * tests, and apps that already have page records loaded in process memory.\n */\n\nimport type {\n DocNavigationLink,\n DocPage,\n DocsPage,\n DocsProvider,\n DocsSearchResult,\n DocsSidebar,\n DocsSidebarItem,\n} from '../types'\nimport { extractToc, highlightMatch, slugify } from '../utilities'\n\nfunction sectionTitle(sectionId: string): string {\n return sectionId\n .split(/[-_/]/)\n .filter(Boolean)\n .map((part) => `${part[0]?.toUpperCase() ?? ''}${part.slice(1)}`)\n .join(' ') || 'General'\n}\n\nfunction createSidebar(pages: DocsPage[]): DocsSidebar {\n const sections = new Map<string, DocsSidebarItem>()\n\n for (const page of pages.filter((entry) => entry.status === 'published')) {\n const title = sectionTitle(page.sectionId)\n const entry = sections.get(page.sectionId) ?? {\n id: page.sectionId,\n title,\n slug: slugify(title),\n pages: [],\n }\n\n entry.pages.push({ slug: page.slug, title: page.title })\n sections.set(page.sectionId, entry)\n }\n\n return [...sections.values()].map((entry) => ({\n ...entry,\n pages: [...entry.pages].sort((left, right) =>\n left.title.localeCompare(right.title),\n ),\n }))\n}\n\n/**\n * In-memory provider for already-hydrated docs pages.\n */\nexport class InternalDocsProvider implements DocsProvider {\n private pages: DocsPage[] = []\n\n /**\n * @param pages - Optional initial page records to seed the provider with.\n */\n constructor(pages: DocPage[] = []) {\n this.pages = this.linkPages(pages)\n }\n\n /**\n * Replaces the provider's page set.\n *\n * @param pages - Fresh page records to seed into the provider.\n * @returns Nothing. The provider page set is replaced in memory.\n */\n setPages(pages: DocPage[]): void {\n this.pages = this.linkPages(pages)\n }\n\n private linkPages(pages: DocPage[]): DocsPage[] {\n const sorted = [...pages].sort((left, right) => left.order - right.order)\n\n return sorted.map((page, index) => {\n const prev = sorted[index - 1]\n const next = sorted[index + 1]\n const prevLink: DocNavigationLink | null = prev\n ? { slug: prev.slug, title: prev.title }\n : null\n const nextLink: DocNavigationLink | null = next\n ? { slug: next.slug, title: next.title }\n : null\n\n return {\n ...page,\n prev: prevLink,\n next: nextLink,\n toc: extractToc(page.content),\n }\n })\n }\n\n /**\n * Loads the sidebar structure derived from the current page set.\n *\n * @returns Sidebar navigation entries derived from the published pages.\n */\n async getSidebar(): Promise<DocsSidebar> {\n return createSidebar(this.pages)\n }\n\n /**\n * Resolves a linked docs page by slug.\n *\n * @param slug - Target page slug.\n * @returns The linked page or `null` when no page matches the slug.\n */\n async getPage(slug: string): Promise<DocsPage | null> {\n return this.pages.find((page) => page.slug === slug) ?? null\n }\n\n /**\n * Returns all published pages managed by the provider.\n *\n * @returns Published pages in their linked navigation order.\n */\n async getAllPages(): Promise<DocsPage[]> {\n return this.pages.filter((page) => page.status === 'published')\n }\n\n /**\n * Searches the provider-backed page set.\n *\n * @param query - User-entered search query.\n * @returns Ranked search results derived from the published pages.\n */\n async search(query: string): Promise<DocsSearchResult[]> {\n const normalizedQuery = query.trim().toLowerCase()\n\n if (!normalizedQuery) {\n return []\n }\n\n return this.pages\n .filter((page) => page.status === 'published')\n .map((page) => {\n let score = 0\n\n if (page.title.toLowerCase().includes(normalizedQuery)) {\n score += 10\n }\n if (page.tags.some((tag) => tag.toLowerCase().includes(normalizedQuery))) {\n score += 4\n }\n if (page.content.toLowerCase().includes(normalizedQuery)) {\n score += 2\n }\n if (score === 0) {\n return null\n }\n\n return {\n pageId: page.id,\n pageTitle: page.title,\n sectionTitle: sectionTitle(page.sectionId),\n slug: page.slug,\n highlight: highlightMatch(page.excerpt ?? page.content, query),\n score,\n }\n })\n .filter((result): result is DocsSearchResult => result !== null)\n .sort((left, right) => right.score - left.score)\n }\n\n /**\n * Resolves previous and next pages for a slug.\n *\n * @param slug - Target page slug.\n * @returns Linked previous and next page records when available.\n */\n async getNavigation(\n slug: string,\n ): Promise<{ prev: DocsPage | null; next: DocsPage | null }> {\n const page = this.pages.find((entry) => entry.slug === slug)\n\n if (!page) {\n return { prev: null, next: null }\n }\n\n return {\n prev: page.prev\n ? this.pages.find((entry) => entry.slug === page.prev?.slug) ?? null\n : null,\n next: page.next\n ? this.pages.find((entry) => entry.slug === page.next?.slug) ?? null\n : null,\n }\n }\n}\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @module docsTypes
|
|
3
|
-
* @package @geenius/docs
|
|
3
|
+
* @package @geenius/docs/shared
|
|
4
4
|
* @description Declares the shared docs domain model used by the framework
|
|
5
5
|
* variants, Convex integration, and provider adapters. These types form the
|
|
6
6
|
* public contract exported from `@geenius/docs`.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|