{"version":3,"sources":["../src/api/artifacts/generateBookmarksHtml.ts","../src/api/artifacts/generateCsv.ts","../src/api/artifacts/buildFeedVM.ts","../src/api/artifacts/generateJsonFeed.ts","../src/api/artifacts/generateRssXml.ts","../src/api/artifacts/generateSitemap.ts","../src/schemas/helpers/slugify.ts","../src/api/helpers/placeholderContext.ts","../src/api/helpers/renderTemplate.ts","../src/cache/types.ts","../src/cache/manager.ts","../src/core/helpers/stopwords.ts","../src/core/helpers/buildIndex.ts","../src/core/helpers/computeDeterministicItemId.ts","../src/core/helpers/extractInlineTags.ts","../src/schemas/v1/domain.v1.ts","../src/core/mdastToDomain.ts","../node_modules/.pnpm/unist-util-stringify-position@4.0.0/node_modules/unist-util-stringify-position/lib/index.js","../node_modules/.pnpm/vfile-message@4.0.3/node_modules/vfile-message/lib/index.js","../node_modules/.pnpm/vfile@6.0.3/node_modules/vfile/lib/minurl.shared.js","../node_modules/.pnpm/vfile@6.0.3/node_modules/vfile/lib/index.js","../src/core/helpers/detectLanguage.ts","../src/core/helpers/escapeHtml.ts","../src/plugins/awesomePagesMarkers.ts","../src/core/parser.ts","../src/sources/errors.ts","../src/sources/helpers/resolveFetch.ts","../src/sources/helpers/slugifyEnv.ts","../src/sources/resolveGithubToken.ts","../src/sources/githubContents.ts","../src/sources/httpRawSource.ts","../src/sources/localFile.ts","../src/sources/createSource.ts","../src/api/parseRunner.ts","../src/api/schema.ts","../src/api/index.ts","../src/schemas/v1/jsonSchema.ts"],"names":["escapeXml","path","z","fs","stopwords","visit","toHast","toHtml","point","index","default","field","fileURLToPath","francAll","escapeHtml","extractText","unified","remarkParse","remarkGfm","remarkFrontmatter","promisify","execFile","raw","parsed","buf","fg","zodToJsonSchema"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { DomainV1, ItemV1, SectionV1 } from '@/schemas/v1/domain.v1';\n\ninterface BookmarkFolder {\n\ttitle: string;\n\titems: ItemV1[];\n\tchildren: BookmarkFolder[];\n}\n\n/**\n * Escapes HTML entities in text content for safe insertion into HTML attributes and text nodes.\n */\nfunction escapeHtml(text: string): string {\n\treturn text\n\t\t.replace(/&/g, '&amp;')\n\t\t.replace(/</g, '&lt;')\n\t\t.replace(/>/g, '&gt;')\n\t\t.replace(/\"/g, '&quot;')\n\t\t.replace(/'/g, '&#39;');\n}\n\n/**\n * Builds a hierarchical folder structure from flat sections array.\n */\nfunction buildFolderHierarchy(\n\tsections: SectionV1[],\n\titems: ItemV1[],\n): BookmarkFolder[] {\n\tconst sectionMap = new Map<string, SectionV1>();\n\tconst folderMap = new Map<string, BookmarkFolder>();\n\n\t// Create map of all sections\n\tfor (const section of sections) {\n\t\tsectionMap.set(section.id, section);\n\t}\n\n\t// Create folders for all sections\n\tfor (const section of sections) {\n\t\tfolderMap.set(section.id, {\n\t\t\ttitle: section.title,\n\t\t\titems: items.filter((item) => item.sectionId === section.id),\n\t\t\tchildren: [],\n\t\t});\n\t}\n\n\t// Build hierarchy\n\tconst rootFolders: BookmarkFolder[] = [];\n\n\tfor (const section of sections) {\n\t\tconst folder = folderMap.get(section.id);\n\t\tif (!folder) continue;\n\n\t\tif (section.parentId === null) {\n\t\t\t// Root level section\n\t\t\trootFolders.push(folder);\n\t\t} else {\n\t\t\t// Child section\n\t\t\tconst parentFolder = folderMap.get(section.parentId);\n\t\t\tif (parentFolder) {\n\t\t\t\tparentFolder.children.push(folder);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Sort folders and items by order\n\tconst sortFolders = (folders: BookmarkFolder[]) => {\n\t\tfolders.sort((a, b) => {\n\t\t\tconst sectionA = sections.find((s) => s.title === a.title);\n\t\t\tconst sectionB = sections.find((s) => s.title === b.title);\n\t\t\treturn (sectionA?.order ?? 0) - (sectionB?.order ?? 0);\n\t\t});\n\n\t\tfor (const folder of folders) {\n\t\t\tfolder.items.sort((a, b) => a.order - b.order);\n\t\t\tif (folder.children.length > 0) {\n\t\t\t\tsortFolders(folder.children);\n\t\t\t}\n\t\t}\n\t};\n\n\tsortFolders(rootFolders);\n\n\treturn rootFolders;\n}\n\n/**\n * Generates the ADD_DATE timestamp (Unix timestamp in seconds).\n */\nfunction getTimestamp(): number {\n\treturn Math.floor(Date.now() / 1000);\n}\n\n/**\n * Renders a single bookmark item as HTML.\n */\nfunction renderBookmarkItem(item: ItemV1, timestamp: number): string {\n\tconst href = item.url || '#';\n\tconst title = escapeHtml(item.title);\n\tconst description = item.description\n\t\t? ` - ${escapeHtml(item.description)}`\n\t\t: '';\n\n\t// Chrome bookmarks format uses HREF, ADD_DATE attributes\n\treturn `        <DT><A HREF=\"${escapeHtml(href)}\" ADD_DATE=\"${timestamp}\">${title}</A>${description}`;\n}\n\n/**\n * Renders a bookmark folder and its contents recursively.\n */\nfunction renderBookmarkFolder(\n\tfolder: BookmarkFolder,\n\ttimestamp: number,\n\tindentLevel = 1,\n): string {\n\tconst indent = '    '.repeat(indentLevel);\n\tconst listIndent = '    '.repeat(indentLevel + 1);\n\n\tlet html = `${indent}<DT><H3 ADD_DATE=\"${timestamp}\">${escapeHtml(folder.title)}</H3>\\n`;\n\thtml += `${indent}<DL><p>\\n`;\n\n\t// Render items in this folder\n\tfor (const item of folder.items) {\n\t\thtml += renderBookmarkItem(item, timestamp) + '\\n';\n\t}\n\n\t// Render child folders recursively\n\tfor (const child of folder.children) {\n\t\thtml += renderBookmarkFolder(child, timestamp, indentLevel + 1);\n\t}\n\n\thtml += `${indent}</DL><p>\\n`;\n\n\treturn html;\n}\n\n/**\n * Generates a Chrome-compatible bookmarks HTML file from DomainV1.\n *\n * The format follows the Netscape Bookmark File Format, which is supported\n * by Chrome, Firefox, Edge, and other modern browsers.\n *\n * @param domain - The parsed domain object containing sections and items\n * @returns HTML string ready to be imported as bookmarks\n */\nexport function generateBookmarksHtml(domain: DomainV1): string {\n\tconst timestamp = getTimestamp();\n\tconst title = domain.meta.title || 'Awesome List';\n\tconst folders = buildFolderHierarchy(domain.sections, domain.items);\n\n\tlet html = '<!DOCTYPE NETSCAPE-Bookmark-file-1>\\n';\n\thtml += '<!-- This is an automatically generated file.\\n';\n\thtml += '     It will be read and overwritten.\\n';\n\thtml += '     DO NOT EDIT! -->\\n';\n\thtml += `<META HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html; charset=UTF-8\">\\n`;\n\thtml += `<TITLE>${escapeHtml(title)}</TITLE>\\n`;\n\thtml += `<H1>${escapeHtml(title)}</H1>\\n`;\n\thtml += '<DL><p>\\n';\n\n\t// Create a root folder with the list title\n\thtml += `    <DT><H3 ADD_DATE=\"${timestamp}\">${escapeHtml(title)}</H3>\\n`;\n\thtml += '    <DL><p>\\n';\n\n\t// Render all folders\n\tfor (const folder of folders) {\n\t\thtml += renderBookmarkFolder(folder, timestamp, 2);\n\t}\n\n\thtml += '    </DL><p>\\n';\n\thtml += '</DL><p>\\n';\n\n\treturn html;\n}\n","import type { DomainV1 } from '@/schemas/v1/domain.v1';\n\n/**\n * Escapes a CSV field value according to RFC 4180.\n * - Wraps in quotes if the value contains comma, quote, or newline\n * - Doubles internal quotes\n */\nfunction escapeCsvField(value: string): string {\n\tif (!value) return '';\n\n\tconst needsQuoting = /[\",\\n\\r]/.test(value);\n\n\tif (needsQuoting) {\n\t\t// Double any internal quotes and wrap in quotes\n\t\treturn `\"${value.replace(/\"/g, '\"\"')}\"`;\n\t}\n\n\treturn value;\n}\n\n/**\n * Generates a CSV (Comma-Separated Values) file from DomainV1.\n *\n * The CSV format is useful for importing awesome-lists into spreadsheets,\n * BI tools, or other data processing pipelines that work with tabular data.\n *\n * CSV structure:\n * - Header row with column names\n * - One row per item from domain.items\n * - Proper RFC 4180 quoting for commas, quotes, and newlines\n *\n * Columns:\n * - id: item id\n * - title: item title\n * - url: item URL (if any)\n * - sectionId: section id where the item lives\n * - sectionTitle: section title (denormalized)\n * - description: plain-text description\n * - tags: tags joined by pipe (|)\n *\n * @param domain - The parsed domain object containing sections and items\n * @returns UTF-8 CSV string with header and data rows\n */\nexport function generateCsv(domain: DomainV1): string {\n\t// Build section map for quick lookups\n\tconst sectionMap = new Map(\n\t\tdomain.sections.map((section) => [section.id, section]),\n\t);\n\n\t// CSV header\n\tconst header = 'id,title,url,sectionId,sectionTitle,description,tags\\n';\n\n\t// Generate rows\n\tconst rows = domain.items.map((item) => {\n\t\tconst section = sectionMap.get(item.sectionId);\n\t\tconst sectionTitle = section ? section.title : '';\n\n\t\tconst fields = [\n\t\t\titem.id,\n\t\t\titem.title,\n\t\t\titem.url || '',\n\t\t\titem.sectionId,\n\t\t\tsectionTitle,\n\t\t\titem.description || '',\n\t\t\titem.tags.join('|'),\n\t\t];\n\n\t\treturn fields.map(escapeCsvField).join(',');\n\t});\n\n\treturn header + rows.join('\\n') + (rows.length > 0 ? '\\n' : '');\n}\n","import type { DomainV1 } from '@/schemas/v1/domain.v1';\n\n/**\n * Common feed view model used by both JSON Feed and RSS XML generators.\n * This intermediate representation makes it easier to maintain consistency\n * between the two feed formats.\n */\nexport interface FeedVM {\n\ttitle: string;\n\tdescription: string | null;\n\thomePageUrl: string | null;\n\tgeneratedAt: string;\n\titems: FeedItemVM[];\n}\n\nexport interface FeedItemVM {\n\tid: string;\n\turl: string;\n\ttitle: string;\n\tdescription: string | null;\n\tpublishedAt: string;\n}\n\n/**\n * Extracts the home page URL from the domain source.\n * Supports GitHub repo URLs in the format: github:owner/repo@ref:path or github://owner/repo@ref:path\n */\nfunction extractHomePageUrl(source: string | null | undefined): string | null {\n\tif (!source) return null;\n\n\t// Match github:owner/repo@ref:path or github://owner/repo@ref:path\n\tconst githubMatch = source.match(/^github:\\/?\\/?([^@]+)@/);\n\tif (githubMatch) {\n\t\treturn `https://github.com/${githubMatch[1]}`;\n\t}\n\n\t// If it's already an HTTP(S) URL, return it\n\tif (source.startsWith('http://') || source.startsWith('https://')) {\n\t\treturn source;\n\t}\n\n\treturn null;\n}\n\n/**\n * Builds a feed view model from DomainV1.\n * This is the single source of truth for feed data used by both JSON Feed and RSS XML generators.\n *\n * @param domain - The parsed domain object\n * @returns A feed view model with all items that have valid URLs\n */\nexport function buildFeedVM(domain: DomainV1): FeedVM {\n\tconst title = domain.meta.title || 'Awesome List';\n\tconst description = domain.meta.description || null;\n\tconst homePageUrl = extractHomePageUrl(domain.meta.source);\n\tconst generatedAt = domain.meta.generatedAt;\n\n\t// Collect all items with valid URLs, flattened from all sections\n\tconst items: FeedItemVM[] = [];\n\n\tfor (const section of domain.sections) {\n\t\tconst sectionItems = domain.items.filter(\n\t\t\t(item) => item.sectionId === section.id && item.url,\n\t\t);\n\n\t\tfor (const item of sectionItems) {\n\t\t\titems.push({\n\t\t\t\tid: item.id,\n\t\t\t\turl: item.url!,\n\t\t\t\ttitle: item.title,\n\t\t\t\tdescription: item.description,\n\t\t\t\tpublishedAt: generatedAt, // Use generation time as publish date\n\t\t\t});\n\t\t}\n\t}\n\n\treturn {\n\t\ttitle,\n\t\tdescription,\n\t\thomePageUrl,\n\t\tgeneratedAt,\n\t\titems,\n\t};\n}\n","import type { DomainV1 } from '@/schemas/v1/domain.v1';\nimport { buildFeedVM } from './buildFeedVM';\n\n/**\n * JSON Feed v1.1 format types\n * @see https://jsonfeed.org/version/1.1\n */\ninterface JsonFeed {\n\tversion: string;\n\ttitle: string;\n\thome_page_url?: string;\n\tfeed_url?: string;\n\tdescription?: string;\n\titems: JsonFeedItem[];\n}\n\ninterface JsonFeedItem {\n\tid: string;\n\turl?: string;\n\ttitle?: string;\n\tcontent_text?: string;\n\tdate_published?: string;\n}\n\n/**\n * Generates a JSON Feed v1.1 document from DomainV1.\n *\n * JSON Feed is a modern, JSON-based alternative to RSS/Atom feeds.\n * It's easier to parse and work with in JavaScript applications.\n *\n * @see https://jsonfeed.org/version/1.1\n * @param domain - The parsed domain object\n * @param feedUrl - Optional URL where this feed will be published\n * @returns JSON string in JSON Feed v1.1 format\n */\nexport function generateJsonFeed(domain: DomainV1, feedUrl?: string): string {\n\tconst feed = buildFeedVM(domain);\n\n\tconst jsonFeed: JsonFeed = {\n\t\tversion: 'https://jsonfeed.org/version/1.1',\n\t\ttitle: feed.title,\n\t\titems: feed.items.map((item) => ({\n\t\t\tid: item.id,\n\t\t\turl: item.url,\n\t\t\ttitle: item.title,\n\t\t\tcontent_text: item.description || undefined,\n\t\t\tdate_published: item.publishedAt,\n\t\t})),\n\t};\n\n\t// Add optional fields if they exist\n\tif (feed.homePageUrl) {\n\t\tjsonFeed.home_page_url = feed.homePageUrl;\n\t}\n\n\tif (feedUrl) {\n\t\tjsonFeed.feed_url = feedUrl;\n\t}\n\n\tif (feed.description) {\n\t\tjsonFeed.description = feed.description;\n\t}\n\n\treturn JSON.stringify(jsonFeed, null, 2);\n}\n","import type { DomainV1 } from '@/schemas/v1/domain.v1';\nimport { buildFeedVM } from './buildFeedVM';\n\n/**\n * Escapes XML special characters to prevent XML injection and ensure valid XML output.\n */\nfunction escapeXml(text: string): string {\n\treturn text\n\t\t.replace(/&/g, '&amp;')\n\t\t.replace(/</g, '&lt;')\n\t\t.replace(/>/g, '&gt;')\n\t\t.replace(/\"/g, '&quot;')\n\t\t.replace(/'/g, '&apos;');\n}\n\n/**\n * Formats an ISO 8601 date string to RFC 822 format required by RSS 2.0.\n * Example: \"2025-11-08T12:00:00.000Z\" → \"Fri, 08 Nov 2025 12:00:00 GMT\"\n */\nfunction formatRfc822Date(isoDate: string): string {\n\tconst date = new Date(isoDate);\n\treturn date.toUTCString();\n}\n\n/**\n * Generates an RSS 2.0 XML feed from DomainV1.\n *\n * RSS 2.0 is the classic, widely-supported feed format used by\n * feed readers like Feedly, Inoreader, and Thunderbird.\n *\n * @see https://www.rssboard.org/rss-specification\n * @param domain - The parsed domain object\n * @returns RSS 2.0 XML string\n */\nexport function generateRssXml(domain: DomainV1): string {\n\tconst feed = buildFeedVM(domain);\n\tconst lastBuildDate = formatRfc822Date(feed.generatedAt);\n\n\tlet xml = '<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n';\n\txml += '<rss version=\"2.0\">\\n';\n\txml += '  <channel>\\n';\n\n\t// Required channel elements\n\txml += `    <title>${escapeXml(feed.title)}</title>\\n`;\n\txml += `    <link>${escapeXml(feed.homePageUrl || '')}</link>\\n`;\n\txml += `    <description>${escapeXml(feed.description || '')}</description>\\n`;\n\n\t// Optional channel elements\n\txml += `    <lastBuildDate>${lastBuildDate}</lastBuildDate>\\n`;\n\txml += '    <generator>awesome-pages/parser</generator>\\n';\n\n\t// Items\n\tfor (const item of feed.items) {\n\t\txml += '    <item>\\n';\n\t\txml += `      <title>${escapeXml(item.title)}</title>\\n`;\n\t\txml += `      <link>${escapeXml(item.url)}</link>\\n`;\n\t\txml += `      <guid isPermaLink=\"false\">${escapeXml(item.id)}</guid>\\n`;\n\n\t\tif (item.description) {\n\t\t\txml += `      <description>${escapeXml(item.description)}</description>\\n`;\n\t\t}\n\n\t\txml += `      <pubDate>${formatRfc822Date(item.publishedAt)}</pubDate>\\n`;\n\t\txml += '    </item>\\n';\n\t}\n\n\txml += '  </channel>\\n';\n\txml += '</rss>\\n';\n\n\treturn xml;\n}\n","import type { DomainV1 } from '@/schemas/v1/domain.v1';\n\n/**\n * Escapes XML special characters to prevent XML injection and ensure valid XML output.\n */\nfunction escapeXml(text: string): string {\n\treturn text\n\t\t.replace(/&/g, '&amp;')\n\t\t.replace(/</g, '&lt;')\n\t\t.replace(/>/g, '&gt;')\n\t\t.replace(/\"/g, '&quot;')\n\t\t.replace(/'/g, '&apos;');\n}\n\n/**\n * Formats a date to W3C datetime format (YYYY-MM-DD) required by sitemap protocol.\n */\nfunction formatDate(date: string): string {\n\treturn date.split('T')[0];\n}\n\n/**\n * Generates a sitemap.xml file from DomainV1.\n *\n * The format follows the Sitemap Protocol (https://www.sitemaps.org/protocol.html),\n * which is used by search engines like Google, Bing, and others to discover URLs.\n *\n * Each item with a valid URL becomes a <url> entry in the sitemap.\n * The lastmod date is set to the domain's generatedAt timestamp.\n *\n * @param domain - The parsed domain object containing sections and items\n * @param baseUrl - The base URL for the sitemap (e.g., 'https://example.com')\n * @returns XML string ready to be saved as sitemap.xml\n */\nexport function generateSitemap(domain: DomainV1, baseUrl?: string): string {\n\tconst lastmod = formatDate(domain.meta.generatedAt);\n\n\tlet xml = '<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n';\n\txml += '<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\\n';\n\n\t// Add items with valid URLs to the sitemap\n\tfor (const section of domain.sections) {\n\t\tconst sectionItems = domain.items.filter(\n\t\t\t(item) => item.sectionId === section.id && item.url,\n\t\t);\n\n\t\tfor (const item of sectionItems) {\n\t\t\tconst loc = item.url!;\n\n\t\t\txml += '  <url>\\n';\n\t\t\txml += `    <loc>${escapeXml(loc)}</loc>\\n`;\n\t\t\txml += `    <lastmod>${lastmod}</lastmod>\\n`;\n\t\t\txml += '    <changefreq>weekly</changefreq>\\n';\n\t\t\txml += '    <priority>0.5</priority>\\n';\n\t\t\txml += '  </url>\\n';\n\t\t}\n\t}\n\n\txml += '</urlset>\\n';\n\n\treturn xml;\n}\n","const slugify = (input: string) =>\n\tinput\n\t\t.trim()\n\t\t.toLowerCase()\n\t\t.normalize('NFD')\n\t\t.replace(/\\p{Diacritic}/gu, '')\n\t\t.replace(/[^a-z0-9]+/g, '-')\n\t\t.replace(/^-+|-+$/g, '');\n\nexport default slugify;\n","import path from 'node:path';\nimport slugify from '@/schemas/helpers/slugify';\n\nexport interface PlaceholderContext {\n\t/** Directory relative to rootDir (for local files) or repo path dir (for github) */\n\tdir: string;\n\t/** Basename without extension (slugified) */\n\tname: string;\n\t/** File extension without dot (e.g. \"md\", \"json\") */\n\text: string;\n\t/** GitHub owner (slugified), when available */\n\towner?: string;\n\t/** GitHub repo (slugified), when available */\n\trepo?: string;\n\t/** Git ref (slugified), when available */\n\tref?: string;\n\t/** Path inside the repo, when available (raw, not slugified) */\n\tpath?: string;\n}\n\nfunction normalizeSegment(segment: string): string {\n\tif (!segment) return '';\n\t// reaproveita seu slugify e garante que não entra lixo em path\n\tconst s = slugify(segment);\n\treturn s.replace(/[^a-z0-9/_.-]+/g, '-');\n}\n\nfunction buildLocalContext(\n\tinput: string,\n\trootDir: string,\n): Pick<PlaceholderContext, 'dir' | 'name' | 'ext'> {\n\tconst abs = path.isAbsolute(input) ? input : path.join(rootDir, input);\n\tconst rel = path.relative(rootDir, abs) || path.basename(abs);\n\n\tconst dirRaw = path.dirname(rel);\n\tconst base = path.basename(rel);\n\tconst ext = path.extname(base).slice(1); // sem o ponto\n\tconst nameRaw = ext ? base.slice(0, -(ext.length + 1)) : base;\n\n\treturn {\n\t\tdir: normalizeSegment(dirRaw === '.' ? '' : dirRaw),\n\t\tname: normalizeSegment(nameRaw),\n\t\text,\n\t};\n}\n\nfunction buildGithubContext(sourceId: string): PlaceholderContext {\n\t// Formato esperado: github:owner/repo@ref:path/to/file.md\n\tconst m = sourceId.match(/^github:([^/]+)\\/([^@]+)@([^:]+):(.+)$/);\n\n\tif (!m) {\n\t\t// fallback mínimo\n\t\treturn {\n\t\t\tdir: '',\n\t\t\tname: 'readme',\n\t\t\text: 'md',\n\t\t};\n\t}\n\n\tconst [, ownerRaw, repoRaw, refRaw, pathInRepo] = m;\n\tconst base = path.basename(pathInRepo || 'README.md');\n\tconst ext = path.extname(base).slice(1);\n\tconst nameRaw = ext ? base.slice(0, -(ext.length + 1)) : base;\n\tconst dirRaw = path.dirname(pathInRepo);\n\n\treturn {\n\t\tdir: normalizeSegment(dirRaw === '.' ? '' : dirRaw),\n\t\tname: normalizeSegment(nameRaw),\n\t\text,\n\t\towner: normalizeSegment(ownerRaw),\n\t\trepo: normalizeSegment(repoRaw),\n\t\tref: normalizeSegment(refRaw),\n\t\tpath: pathInRepo,\n\t};\n}\n\nfunction buildHttpContext(sourceId: string): PlaceholderContext {\n\t// sourceId esperado: \"http:https://example.com/foo/bar.md\"\n\tconst urlStr = sourceId.replace(/^http:/, '');\n\n\tlet url: URL;\n\ttry {\n\t\turl = new URL(urlStr);\n\t} catch {\n\t\treturn {\n\t\t\tdir: '',\n\t\t\tname: 'index',\n\t\t\text: '',\n\t\t};\n\t}\n\n\tconst pathname = url.pathname || '/';\n\tconst base = path.basename(pathname) || 'index';\n\tconst ext = path.extname(base).slice(1);\n\tconst nameRaw = ext ? base.slice(0, -(ext.length + 1)) : base;\n\tconst dirRaw = path.dirname(pathname);\n\n\treturn {\n\t\tdir: normalizeSegment(dirRaw === '/' || dirRaw === '.' ? '' : dirRaw),\n\t\tname: normalizeSegment(nameRaw),\n\t\text,\n\t};\n}\n\nexport function buildPlaceholderContext(params: {\n\tinput: string;\n\tsourceId: string;\n\trootDir: string;\n}): PlaceholderContext {\n\tconst { input, sourceId, rootDir } = params;\n\n\tif (sourceId.startsWith('github:')) {\n\t\treturn buildGithubContext(sourceId);\n\t}\n\n\tif (sourceId.startsWith('http:')) {\n\t\treturn buildHttpContext(sourceId);\n\t}\n\n\t// default: trata como arquivo local\n\treturn buildLocalContext(input, rootDir);\n}\n","type TemplateContextValue = string | number | null | undefined;\n\nexport type TemplateContext = Record<string, TemplateContextValue>;\n\n/**\n * Very small placeholder renderer.\n * Replaces `{key}` by `String(ctx[key])` if defined, or `\"\"` otherwise.\n */\nexport function renderTemplate(tpl: string, ctx: TemplateContext): string {\n\treturn tpl.replace(/\\{([a-zA-Z0-9_:-]+)\\}/g, (_match, rawKey) => {\n\t\tconst key = String(rawKey);\n\t\tconst value = ctx[key];\n\t\tif (value === undefined || value === null) return '';\n\t\treturn String(value);\n\t});\n}\n","import { z } from 'zod';\n\n/**\n * Cache entry for remote sources (GitHub, HTTP)\n */\nexport const RemoteCacheEntrySchema = z.object({\n\tkind: z.literal('remote'),\n\tetag: z.string().optional(),\n\tlastModified: z.string().optional(),\n\tlastSeen: z.string(),\n\tlastStatus: z.number().int().optional(),\n});\n\nexport type RemoteCacheEntry = z.infer<typeof RemoteCacheEntrySchema>;\n\n/**\n * Cache entry for local file sources\n */\nexport const LocalCacheEntrySchema = z.object({\n\tkind: z.literal('local'),\n\tmtimeMs: z.number(),\n\tsize: z.number().int(),\n\tlastSeen: z.string(),\n});\n\nexport type LocalCacheEntry = z.infer<typeof LocalCacheEntrySchema>;\n\n/**\n * Union of all cache entry types\n */\nexport const CacheEntrySchema = z.discriminatedUnion('kind', [\n\tRemoteCacheEntrySchema,\n\tLocalCacheEntrySchema,\n]);\n\nexport type CacheEntry = z.infer<typeof CacheEntrySchema>;\n\n/**\n * The cache file structure\n */\nexport const CacheFileSchema = z.object({\n\tversion: z.literal(1),\n\tentries: z.record(z.string(), CacheEntrySchema),\n});\n\nexport type CacheFile = z.infer<typeof CacheFileSchema>;\n\n/**\n * Interface for cache operations\n */\nexport interface CacheManager {\n\tgetEntry(sourceId: string): CacheEntry | undefined;\n\tsetEntry(sourceId: string, entry: CacheEntry): void;\n\tsave(): Promise<void>;\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport type {\n\tCacheEntry,\n\tCacheFile,\n\tCacheManager as ICacheManager,\n} from './types';\nimport { CacheFileSchema } from './types';\n\n/**\n * Implementation of cache manager that loads/saves cache from disk\n */\nexport class CacheManager implements ICacheManager {\n\tprivate entries: Map<string, CacheEntry>;\n\tprivate cachePath: string;\n\n\tconstructor(\n\t\tcachePath: string,\n\t\tinitialEntries: Record<string, CacheEntry> = {},\n\t) {\n\t\tthis.cachePath = cachePath;\n\t\tthis.entries = new Map(Object.entries(initialEntries));\n\t}\n\n\tgetEntry(sourceId: string): CacheEntry | undefined {\n\t\treturn this.entries.get(sourceId);\n\t}\n\n\tsetEntry(sourceId: string, entry: CacheEntry): void {\n\t\tthis.entries.set(sourceId, entry);\n\t}\n\n\tasync save(): Promise<void> {\n\t\tconst cacheFile: CacheFile = {\n\t\t\tversion: 1,\n\t\t\tentries: Object.fromEntries(this.entries.entries()),\n\t\t};\n\n\t\tawait fs.mkdir(path.dirname(this.cachePath), { recursive: true });\n\t\tawait fs.writeFile(\n\t\t\tthis.cachePath,\n\t\t\tJSON.stringify(cacheFile, null, 2),\n\t\t\t'utf8',\n\t\t);\n\t}\n\n\t/**\n\t * Load cache from disk, creating empty cache if file doesn't exist or is corrupted\n\t */\n\tstatic async load(cachePath: string): Promise<CacheManager> {\n\t\ttry {\n\t\t\tconst content = await fs.readFile(cachePath, 'utf8');\n\t\t\tconst json = JSON.parse(content);\n\t\t\tconst parsed = CacheFileSchema.safeParse(json);\n\n\t\t\tif (!parsed.success) {\n\t\t\t\t// Corrupted or version mismatch - start fresh\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`Cache file at ${cachePath} is corrupted or has wrong version. Starting fresh.`,\n\t\t\t\t);\n\t\t\t\treturn new CacheManager(cachePath);\n\t\t\t}\n\n\t\t\treturn new CacheManager(cachePath, parsed.data.entries);\n\t\t} catch (err) {\n\t\t\t// File doesn't exist or can't be read - start fresh\n\t\t\tif ((err as NodeJS.ErrnoException).code === 'ENOENT') {\n\t\t\t\treturn new CacheManager(cachePath);\n\t\t\t}\n\t\t\tconsole.warn(`Failed to load cache from ${cachePath}:`, err);\n\t\t\treturn new CacheManager(cachePath);\n\t\t}\n\t}\n}\n\n/**\n * No-op cache manager that doesn't read or write anything\n */\nexport class NoopCacheManager implements ICacheManager {\n\tgetEntry(_sourceId: string): CacheEntry | undefined {\n\t\treturn undefined;\n\t}\n\n\tsetEntry(_sourceId: string, _entry: CacheEntry): void {\n\t\t// no-op\n\t}\n\n\tasync save(): Promise<void> {\n\t\t// no-op\n\t}\n}\n","/**\n * Language-specific stopwords for search indexing\n * Uses stopwords-iso package for comprehensive multilingual support\n */\n\n// @ts-expect-error - stopwords-iso doesn't have type definitions\nimport stopwords from 'stopwords-iso';\n\n/**\n * Common technology terms that should NOT be treated as stopwords,\n * even if they appear in stopwords-iso lists.\n * These are important for technical documentation and awesome lists.\n */\nconst TECH_TERMS_WHITELIST = new Set([\n\t// AI/ML terms\n\t'ai',\n\t'ml',\n\t'llm',\n\t'gpt',\n\t'nlp',\n\t'cv',\n\t'nn',\n\t// Web technologies\n\t'html',\n\t'css',\n\t'js',\n\t'ts',\n\t'jsx',\n\t'tsx',\n\t'xml',\n\t'json',\n\t'yaml',\n\t'toml',\n\t'svg',\n\t'http',\n\t'https',\n\t'ssh',\n\t'ftp',\n\t'tcp',\n\t'udp',\n\t'ip',\n\t'dns',\n\t'url',\n\t'uri',\n\t'api',\n\t'rest',\n\t'graphql',\n\t'grpc',\n\t'soap',\n\t'cors',\n\t'csrf',\n\t'xss',\n\t'sql',\n\t'nosql',\n\t// Development tools\n\t'git',\n\t'npm',\n\t'yarn',\n\t'pnpm',\n\t'pip',\n\t'cli',\n\t'gui',\n\t'ide',\n\t'sdk',\n\t'ci',\n\t'cd',\n\t'devops',\n\t// Cloud/Infrastructure\n\t'aws',\n\t'gcp',\n\t'azure',\n\t'cdn',\n\t'vpn',\n\t'ssl',\n\t'tls',\n\t'dns',\n\t'k8s',\n\t'docker',\n\t// Database\n\t'db',\n\t'sql',\n\t'orm',\n\t'crud',\n\t// Design/UX\n\t'ui',\n\t'ux',\n\t'seo',\n\t'a11y',\n\t'i18n',\n\t'l10n',\n\t// Architectures/Patterns\n\t'mvc',\n\t'mvvm',\n\t'spa',\n\t'pwa',\n\t'ssr',\n\t'csr',\n\t// Auth\n\t'jwt',\n\t'oauth',\n\t'saml',\n\t'sso',\n\t// Browser APIs\n\t'dom',\n\t'bom',\n\t'xhr',\n\t'ajax',\n\t'wasm',\n\t// Operating Systems\n\t'os',\n\t'ios',\n\t'macos',\n\t'linux',\n\t'unix',\n\t// File formats\n\t'pdf',\n\t'csv',\n\t'md',\n\t'rst',\n]);\n\n/**\n * Get stopwords for a specific language.\n * Extracts the primary language code from BCP 47 tags (e.g., 'pt-BR' -> 'pt').\n * Falls back to English if the language is not supported.\n * Excludes common tech terms from the stopwords list.\n *\n * @param language - BCP 47 language tag (e.g., 'en', 'pt-BR', 'zh-CN')\n * @returns Set of stopwords for the language\n */\nexport function getStopwords(language: string): Set<string> {\n\t// Extract primary language code (e.g., 'pt-BR' -> 'pt')\n\tconst primaryLang = language.split('-')[0].toLowerCase();\n\n\t// Get stopwords for the language from stopwords-iso\n\tconst languageStopwords = stopwords[primaryLang as keyof typeof stopwords];\n\n\tlet stopwordsList: string[];\n\tif (languageStopwords && Array.isArray(languageStopwords)) {\n\t\tstopwordsList = languageStopwords;\n\t} else {\n\t\t// Fallback to English stopwords\n\t\tstopwordsList = stopwords.en || [];\n\t}\n\n\t// Filter out tech terms from stopwords\n\tconst filteredStopwords = stopwordsList.filter(\n\t\t(word) => !TECH_TERMS_WHITELIST.has(word),\n\t);\n\n\treturn new Set(filteredStopwords);\n}\n","import type { DomainV1 } from '@/schemas/v1/domain.v1';\nimport { getStopwords } from './stopwords.js';\n\nexport interface SearchIndex {\n\tschemaVersion: 1;\n\tmeta: {\n\t\tsource?: string;\n\t\trepo?: string;\n\t\tref?: string;\n\t\tpath?: string;\n\t\tgeneratedAt: string;\n\t\tfieldWeights: {\n\t\t\ttitle: number;\n\t\t\tdescription: number;\n\t\t\ttags: number;\n\t\t};\n\t};\n\tstats?: {\n\t\tdocs: number;\n\t\tterms: number;\n\t};\n\tdocs: Record<\n\t\tstring,\n\t\t{\n\t\t\ttitle: string;\n\t\t\turl?: string;\n\t\t\tsectionId: string;\n\t\t}\n\t>;\n\tterms: Record<\n\t\tstring,\n\t\tArray<{\n\t\t\tid: string;\n\t\t\tf: number;\n\t\t}>\n\t>;\n}\n\n/**\n * Tokenize and normalize text for indexing.\n * - Converts to lowercase\n * - Removes punctuation\n * - Splits on whitespace\n * - Removes stopwords based on language\n * - Normalizes version suffixes (e.g., \"v2\" -> \"v\")\n */\nexport function tokenize(text: string, stopwords: Set<string>): string[] {\n\tif (!text) return [];\n\n\t// Lowercase and replace punctuation with spaces, but keep dots temporarily for version detection\n\tconst normalized = text\n\t\t.toLowerCase()\n\t\t.replace(/[,!?:;()[\\]{}'\"]/g, ' ')\n\t\t// Keep hyphens and dots temporarily\n\t\t.replace(/[-_/]/g, ' ');\n\n\t// Split on whitespace and filter\n\tconst tokens = normalized\n\t\t.split(/\\s+/)\n\t\t.filter((token) => token.length > 0)\n\t\t.map((token) => {\n\t\t\t// Normalize version suffixes: v2, v3.1 -> v\n\t\t\t// Must happen before removing dots\n\t\t\treturn token.replace(/^v\\d+(\\.\\d+)*$/, 'v');\n\t\t})\n\t\t// Now remove remaining dots and filter out empty strings\n\t\t.map((token) => token.replace(/\\./g, ''))\n\t\t.filter((token) => token.length > 0)\n\t\t.filter((token) => !stopwords.has(token));\n\n\treturn tokens;\n}\n\n/**\n * Parse source string into structured parts.\n * Formats: \"github:owner/repo@ref:path\" or \"local:path\" or any other string\n */\nfunction parseSource(source: string): {\n\tsource?: string;\n\trepo?: string;\n\tref?: string;\n\tpath?: string;\n} {\n\t// Match github format: github:owner/repo@ref:path\n\tconst githubMatch = source.match(/^github:([^@]+)@([^:]+):(.+)$/);\n\tif (githubMatch) {\n\t\treturn {\n\t\t\trepo: githubMatch[1],\n\t\t\tref: githubMatch[2],\n\t\t\tpath: githubMatch[3],\n\t\t};\n\t}\n\n\t// For other formats, keep the original source\n\treturn { source };\n}\n\n/**\n * Build an inverted index from a DomainV1 object.\n * Creates a searchable index with:\n * - docs: minimal metadata per item\n * - terms: postings list mapping terms to document IDs with frequencies\n */\nexport function buildIndex(domain: DomainV1): SearchIndex {\n\tconst docs: SearchIndex['docs'] = {};\n\tconst termFrequencies = new Map<\n\t\tstring,\n\t\tMap<string, { title: number; description: number; tags: number }>\n\t>();\n\n\t// Get stopwords based on domain language\n\tconst language = domain.meta.language || 'en';\n\tconst stopwords = getStopwords(language);\n\n\t// Process each item in the domain\n\tfor (const item of domain.items) {\n\t\t// Build docs map\n\t\tdocs[item.id] = {\n\t\t\ttitle: item.title,\n\t\t\turl: item.url,\n\t\t\tsectionId: item.sectionId,\n\t\t};\n\n\t\t// Tokenize title (weight: 2)\n\t\tconst titleTokens = tokenize(item.title, stopwords);\n\t\tfor (const token of titleTokens) {\n\t\t\tif (!termFrequencies.has(token)) {\n\t\t\t\ttermFrequencies.set(token, new Map());\n\t\t\t}\n\t\t\tconst docFreqs = termFrequencies.get(token)!;\n\t\t\tif (!docFreqs.has(item.id)) {\n\t\t\t\tdocFreqs.set(item.id, { title: 0, description: 0, tags: 0 });\n\t\t\t}\n\t\t\tdocFreqs.get(item.id)!.title += 1;\n\t\t}\n\n\t\t// Tokenize description (weight: 1)\n\t\tif (item.description) {\n\t\t\tconst descTokens = tokenize(item.description, stopwords);\n\t\t\tfor (const token of descTokens) {\n\t\t\t\tif (!termFrequencies.has(token)) {\n\t\t\t\t\ttermFrequencies.set(token, new Map());\n\t\t\t\t}\n\t\t\t\tconst docFreqs = termFrequencies.get(token)!;\n\t\t\t\tif (!docFreqs.has(item.id)) {\n\t\t\t\t\tdocFreqs.set(item.id, { title: 0, description: 0, tags: 0 });\n\t\t\t\t}\n\t\t\t\tdocFreqs.get(item.id)!.description += 1;\n\t\t\t}\n\t\t}\n\n\t\t// Tokenize tags (weight: 1.5)\n\t\tif (item.tags && item.tags.length > 0) {\n\t\t\tfor (const tag of item.tags) {\n\t\t\t\tconst tagTokens = tokenize(tag, stopwords);\n\t\t\t\tfor (const token of tagTokens) {\n\t\t\t\t\tif (!termFrequencies.has(token)) {\n\t\t\t\t\t\ttermFrequencies.set(token, new Map());\n\t\t\t\t\t}\n\t\t\t\t\tconst docFreqs = termFrequencies.get(token)!;\n\t\t\t\t\tif (!docFreqs.has(item.id)) {\n\t\t\t\t\t\tdocFreqs.set(item.id, { title: 0, description: 0, tags: 0 });\n\t\t\t\t\t}\n\t\t\t\t\tdocFreqs.get(item.id)!.tags += 1;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Build the terms postings list with weighted frequencies\n\tconst terms: SearchIndex['terms'] = {};\n\tconst fieldWeights = { title: 2, description: 1, tags: 1.5 };\n\n\tfor (const [term, docFreqs] of termFrequencies.entries()) {\n\t\tconst postings: Array<{ id: string; f: number }> = [];\n\n\t\tfor (const [docId, freqs] of docFreqs.entries()) {\n\t\t\t// Calculate weighted frequency\n\t\t\tconst weightedFreq =\n\t\t\t\tfreqs.title * fieldWeights.title +\n\t\t\t\tfreqs.description * fieldWeights.description +\n\t\t\t\tfreqs.tags * fieldWeights.tags;\n\n\t\t\tpostings.push({\n\t\t\t\tid: docId,\n\t\t\t\tf: weightedFreq,\n\t\t\t});\n\t\t}\n\n\t\t// Sort by frequency (descending) for better performance\n\t\tpostings.sort((a, b) => b.f - a.f);\n\n\t\tterms[term] = postings;\n\t}\n\n\treturn {\n\t\tschemaVersion: 1,\n\t\tmeta: {\n\t\t\t...parseSource(domain.meta.source),\n\t\t\tgeneratedAt: domain.meta.generatedAt,\n\t\t\tfieldWeights,\n\t\t},\n\t\tstats: {\n\t\t\tdocs: Object.keys(docs).length,\n\t\t\tterms: Object.keys(terms).length,\n\t\t},\n\t\tdocs,\n\t\tterms,\n\t};\n}\n","/**\n * Deterministic item ID generator, isolated by section.\n * - Uses a slugified title as base.\n * - Ensures uniqueness within the same section (suffix -2, -3, ...).\n * - Deterministic: same inputs → same IDs given same order.\n */\n\nimport slugify from '@/schemas/helpers/slugify';\n\nconst takenBySection = new Map<string, Set<string>>();\n\nexport function computeDeterministicItemId(\n\tsectionId: string,\n\ttitle: string,\n): string {\n\t// get or create the Set for this section\n\tlet taken = takenBySection.get(sectionId);\n\tif (!taken) {\n\t\ttaken = new Set<string>();\n\t\ttakenBySection.set(sectionId, taken);\n\t}\n\n\t// create a clean slug\n\tconst base = slugify(title);\n\tlet candidate = base;\n\tlet n = 2;\n\n\t// resolve collisions inside the same section\n\twhile (taken.has(candidate)) {\n\t\tcandidate = `${base}-${n++}`;\n\t}\n\n\t// mark as taken and return\n\ttaken.add(candidate);\n\treturn candidate;\n}\n","function extractInlineTags(desc: string): { clean: string; tags: string[] } {\n\t// Match trailing parenthesized tags e.g., \"... description (#ai #llm)\"\n\tconst m = desc.match(/\\((\\s*#[a-z0-9_-]+(?:\\s+#[a-z0-9_-]+)*\\s*)\\)\\s*$/i);\n\tif (!m) return { clean: desc, tags: [] };\n\tconst rawTags = m[1]\n\t\t.trim()\n\t\t.split(/\\s+/)\n\t\t.map((t) => t.replace(/^#/, '').toLowerCase());\n\t// Remove the matched tags block from the description\n\tconst clean = desc.slice(0, m.index).trim();\n\t// De-duplicate while preserving order\n\tconst seen = new Set<string>();\n\tconst tags = rawTags.filter((t) =>\n\t\tseen.has(t) ? false : (seen.add(t), true),\n\t);\n\treturn { clean, tags };\n}\n\nexport default extractInlineTags;\n","import { z } from 'zod';\nimport slugify from '@/schemas/helpers/slugify';\n\nconst NonEmpty = z.string().trim().min(1);\n\n// Schema base da Section (output/estrutura final)\nexport const SectionV1Base = z.object({\n\tid: NonEmpty,\n\ttitle: NonEmpty,\n\tparentId: z.string().trim().nullable(),\n\tdepth: z.number().int().nonnegative(),\n\torder: z.number().int().nonnegative(),\n\tpath: NonEmpty,\n\tdescriptionHtml: z.string().trim().nullable(),\n});\nexport type SectionV1 = z.infer<typeof SectionV1Base>;\n\n// Schema de input para Section\nexport const SectionIn = z.object({\n\ttitle: NonEmpty,\n\tparentId: z.string().trim().nullable(),\n\tdepth: z.number().int().nonnegative(),\n\torder: z.number().int().nonnegative(),\n\tdescriptionHtml: z.string().trim().nullable().optional(),\n});\nexport type SectionIn = z.infer<typeof SectionIn>;\n\n// Schema com transform para parsing\nexport const SectionV1Schema = SectionIn.transform((s) => {\n\tconst id = slugify(s.title);\n\tconst path = s.parentId ? `${s.parentId}/${id}` : id;\n\treturn {\n\t\tid,\n\t\ttitle: s.title.trim(),\n\t\tparentId: s.parentId,\n\t\tdepth: s.depth,\n\t\torder: s.order,\n\t\tpath,\n\t\tdescriptionHtml: s.descriptionHtml ?? null,\n\t};\n});\n\n// Schema base do Item (output/estrutura final)\nexport const ItemV1Base = z.object({\n\tid: NonEmpty,\n\tsectionId: NonEmpty,\n\ttitle: NonEmpty,\n\turl: z.string().url().optional(),\n\tdescription: z.string().trim().nullable(),\n\tdescriptionHtml: z.string().trim().nullable(),\n\torder: z.number().int().nonnegative(),\n\ttags: z.array(z.string()),\n});\nexport type ItemV1 = z.infer<typeof ItemV1Base>;\n\n// Schema de input para Item\nexport const ItemIn = z.object({\n\tid: NonEmpty,\n\tsectionId: NonEmpty,\n\ttitle: NonEmpty,\n\turl: z.string().url().optional(),\n\tdescription: z.string().trim().nullable().optional(),\n\tdescriptionHtml: z.string().trim().nullable().optional(),\n\torder: z.number().int().nonnegative().optional(),\n\ttags: z.array(z.string()).optional(),\n});\nexport type ItemIn = z.infer<typeof ItemIn>;\n\n// Schema com transform para parsing\nexport const ItemV1Schema = ItemIn.transform((i) => ({\n\tid: i.id,\n\tsectionId: i.sectionId,\n\ttitle: i.title.trim(),\n\turl: i.url,\n\tdescription: i.description ?? null,\n\tdescriptionHtml: i.descriptionHtml ?? null,\n\torder: i.order ?? 0,\n\ttags: i.tags ?? [],\n}));\n\n// Schema base do DomainV1 (output/estrutura final)\nexport const DomainV1Base = z.object({\n\t$schema: z.string().url().optional(),\n\tschemaVersion: z.literal(1),\n\tmeta: z.object({\n\t\ttitle: z.string().optional(),\n\t\tdescription: z.string().optional(),\n\t\tdescriptionHtml: z.string().optional(),\n\t\tgeneratedAt: z.string().datetime(),\n\t\tsource: z.string().min(1),\n\t\tlanguage: z.string().optional(),\n\t\tfrontmatter: z.record(z.any()).optional(),\n\t}),\n\tsections: z.array(SectionV1Base),\n\titems: z.array(ItemV1Base),\n});\nexport type DomainV1 = z.infer<typeof DomainV1Base>;\n\n// Schema com transform e validação para parsing\nexport const DomainV1Schema = z\n\t.object({\n\t\t$schema: z.string().url().optional(),\n\t\tschemaVersion: z.literal(1),\n\t\tmeta: z.object({\n\t\t\ttitle: z.string().optional(),\n\t\t\tdescription: z.string().optional(),\n\t\t\tdescriptionHtml: z.string().optional(),\n\t\t\tgeneratedAt: z.string().datetime(),\n\t\t\tsource: z.string().min(1),\n\t\t\tlanguage: z.string().optional(),\n\t\t\tfrontmatter: z.record(z.any()).optional(),\n\t\t}),\n\t\tsections: z.array(SectionV1Schema),\n\t\titems: z.array(ItemV1Schema),\n\t})\n\t.superRefine((dom, ctx) => {\n\t\tconst sectionIds = new Set(dom.sections.map((s) => s.id));\n\t\tfor (const it of dom.items) {\n\t\t\tif (!sectionIds.has(it.sectionId)) {\n\t\t\t\tctx.addIssue({\n\t\t\t\t\tcode: z.ZodIssueCode.custom,\n\t\t\t\t\tmessage: `item.sectionId \"${it.sectionId}\" does not exist in sections`,\n\t\t\t\t\tpath: ['items', 'sectionId'],\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t});\n","import { toHtml } from 'hast-util-to-html';\nimport type {\n\tHeading,\n\tLink,\n\tList,\n\tParagraph,\n\tPhrasingContent,\n\tRoot,\n\tRootContent,\n\tText,\n} from 'mdast';\nimport { toHast } from 'mdast-util-to-hast';\nimport { visit } from 'unist-util-visit';\nimport { computeDeterministicItemId } from '@/core/helpers/computeDeterministicItemId.js';\nimport extractInlineTags from '@/core/helpers/extractInlineTags';\nimport {\n\tDomainV1Schema,\n\ttype ItemV1,\n\tItemV1Schema,\n\ttype SectionV1,\n\tSectionV1Schema,\n} from '@/schemas/v1/domain.v1.js';\n\ninterface Options {\n\ttitle?: string | null;\n\tdescription?: string | null;\n\tdescriptionHtml?: string | null;\n\tfrontmatter?: Record<string, unknown> | null;\n\tlanguage?: string;\n\tgeneratedAt?: string;\n\tsource: string;\n\tstrict?: boolean;\n}\n\nfunction extractText(node: RootContent): string {\n\tif (\n\t\t'value' in node &&\n\t\ttypeof (node as { value?: unknown }).value === 'string'\n\t) {\n\t\treturn (node as { value: string }).value;\n\t}\n\tif (\n\t\t'children' in node &&\n\t\tArray.isArray((node as { children?: unknown }).children)\n\t) {\n\t\treturn (node as { children: RootContent[] }).children\n\t\t\t.map((child) => extractText(child))\n\t\t\t.join('');\n\t}\n\treturn '';\n}\n\nfunction findFirstLink(p: Paragraph): Link | null {\n\tfor (const child of p.children) {\n\t\tif (child.type === 'link') return child as Link;\n\t}\n\treturn null;\n}\n\nexport function mdastToDomain(tree: Root, opts: Options) {\n\tconst sections: SectionV1[] = [];\n\tconst items: ItemV1[] = [];\n\n\tconst sectionStack: (string | null)[] = [];\n\tlet sectionOrder = 0;\n\n\tvisit(tree, (node) => {\n\t\tif (node.type === 'heading') {\n\t\t\tconst h = node as Heading;\n\t\t\tif (h.depth >= 2) {\n\t\t\t\tconst title = extractText(h as RootContent).trim();\n\t\t\t\tconst parentId =\n\t\t\t\t\th.depth === 2 ? null : (sectionStack[h.depth - 3] ?? null);\n\n\t\t\t\tconst section = SectionV1Schema.parse({\n\t\t\t\t\ttitle,\n\t\t\t\t\tparentId,\n\t\t\t\t\tdepth: h.depth - 2,\n\t\t\t\t\torder: sectionOrder++,\n\t\t\t\t\tdescriptionHtml: null,\n\t\t\t\t});\n\n\t\t\t\tsections.push(section);\n\t\t\t\tsectionStack[h.depth - 2] = section.id;\n\t\t\t\tsectionStack.length = h.depth - 1;\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tif (node.type === 'list') {\n\t\t\tconst list = node as List;\n\t\t\tconst currentSectionId =\n\t\t\t\tsectionStack\n\t\t\t\t\t.slice()\n\t\t\t\t\t.reverse()\n\t\t\t\t\t.find((id) => id != null) ?? null;\n\t\t\tif (!currentSectionId) return;\n\n\t\t\tlet itemOrder = 0;\n\n\t\t\tfor (const li of list.children) {\n\t\t\t\tconst para = li.children.find((c) => c.type === 'paragraph') as\n\t\t\t\t\t| Paragraph\n\t\t\t\t\t| undefined;\n\t\t\t\tif (!para) continue;\n\n\t\t\t\tconst link = findFirstLink(para);\n\t\t\t\tconst title = link\n\t\t\t\t\t? extractText(link as RootContent)\n\t\t\t\t\t: extractText(para as RootContent);\n\t\t\t\tconst url = link?.url;\n\n\t\t\t\t// Build a paragraph with description only (excluding the link)\n\t\t\t\tconst descChildren: PhrasingContent[] = [];\n\t\t\t\tfor (const ch of para.children) {\n\t\t\t\t\tif (ch === link) continue;\n\t\t\t\t\tdescChildren.push(ch);\n\t\t\t\t}\n\n\t\t\t\tconst descParts: string[] = [];\n\t\t\t\tfor (const ch of para.children) {\n\t\t\t\t\tif (ch === link) continue;\n\t\t\t\t\tif (ch.type === 'text') descParts.push((ch as Text).value);\n\t\t\t\t}\n\t\t\t\t// Normalize description and remove leading separators like '-', '–', '—', ':'\n\t\t\t\tconst rawDesc = descParts.join(' ').replace(/\\s+/g, ' ').trim();\n\t\t\t\tconst normalized = rawDesc ? rawDesc.replace(/^[\\s-–—:]+/, '') : '';\n\t\t\t\tconst { clean, tags } = normalized\n\t\t\t\t\t? extractInlineTags(normalized)\n\t\t\t\t\t: { clean: '', tags: [] };\n\t\t\t\tconst description = clean || null;\n\n\t\t\t\t// Generate descriptionHtml from the description paragraph\n\t\t\t\tlet descriptionHtml: string | null = null;\n\t\t\t\tif (descChildren.length > 0) {\n\t\t\t\t\t// Normalize the first text node to remove leading separators\n\t\t\t\t\tconst normalizedChildren: PhrasingContent[] = descChildren.map(\n\t\t\t\t\t\t(child, idx) => {\n\t\t\t\t\t\t\tif (idx === 0 && child.type === 'text') {\n\t\t\t\t\t\t\t\tconst textNode = child as Text;\n\t\t\t\t\t\t\t\tconst cleaned = textNode.value.replace(/^[\\s-–—:]+/, '');\n\t\t\t\t\t\t\t\treturn { ...textNode, value: cleaned };\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn child;\n\t\t\t\t\t\t},\n\t\t\t\t\t);\n\n\t\t\t\t\t// Create a paragraph node with description content\n\t\t\t\t\tconst descParagraph: Paragraph = {\n\t\t\t\t\t\ttype: 'paragraph',\n\t\t\t\t\t\tchildren: normalizedChildren,\n\t\t\t\t\t};\n\t\t\t\t\tconst hast = toHast(descParagraph);\n\t\t\t\t\tif (hast) {\n\t\t\t\t\t\tdescriptionHtml = toHtml(hast);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst id = computeDeterministicItemId(currentSectionId, title);\n\t\t\t\tconst item = ItemV1Schema.parse({\n\t\t\t\t\tid,\n\t\t\t\t\tsectionId: currentSectionId,\n\t\t\t\t\ttitle,\n\t\t\t\t\turl,\n\t\t\t\t\tdescription,\n\t\t\t\t\tdescriptionHtml,\n\t\t\t\t\torder: itemOrder++,\n\t\t\t\t\ttags,\n\t\t\t\t});\n\t\t\t\titems.push(item);\n\t\t\t}\n\t\t}\n\t});\n\n\tconst domain = {\n\t\t$schema: 'https://awesome-pages.github.io/schemas/domain/v1.json',\n\t\tschemaVersion: 1 as const,\n\t\tmeta: {\n\t\t\ttitle: opts.title ?? undefined,\n\t\t\tdescription: opts.description ?? undefined,\n\t\t\tdescriptionHtml: opts.descriptionHtml ?? undefined,\n\t\t\tgeneratedAt: opts.generatedAt ?? new Date().toISOString(),\n\t\t\tsource: opts.source,\n\t\t\tlanguage: opts.language ?? undefined,\n\t\t\tfrontmatter: opts.frontmatter ?? undefined,\n\t\t},\n\t\tsections,\n\t\titems,\n\t};\n\n\treturn DomainV1Schema.parse(domain);\n}\n","/**\n * @typedef {import('unist').Node} Node\n * @typedef {import('unist').Point} Point\n * @typedef {import('unist').Position} Position\n */\n\n/**\n * @typedef NodeLike\n * @property {string} type\n * @property {PositionLike | null | undefined} [position]\n *\n * @typedef PointLike\n * @property {number | null | undefined} [line]\n * @property {number | null | undefined} [column]\n * @property {number | null | undefined} [offset]\n *\n * @typedef PositionLike\n * @property {PointLike | null | undefined} [start]\n * @property {PointLike | null | undefined} [end]\n */\n\n/**\n * Serialize the positional info of a point, position (start and end points),\n * or node.\n *\n * @param {Node | NodeLike | Point | PointLike | Position | PositionLike | null | undefined} [value]\n *   Node, position, or point.\n * @returns {string}\n *   Pretty printed positional info of a node (`string`).\n *\n *   In the format of a range `ls:cs-le:ce` (when given `node` or `position`)\n *   or a point `l:c` (when given `point`), where `l` stands for line, `c` for\n *   column, `s` for `start`, and `e` for end.\n *   An empty string (`''`) is returned if the given value is neither `node`,\n *   `position`, nor `point`.\n */\nexport function stringifyPosition(value) {\n  // Nothing.\n  if (!value || typeof value !== 'object') {\n    return ''\n  }\n\n  // Node.\n  if ('position' in value || 'type' in value) {\n    return position(value.position)\n  }\n\n  // Position.\n  if ('start' in value || 'end' in value) {\n    return position(value)\n  }\n\n  // Point.\n  if ('line' in value || 'column' in value) {\n    return point(value)\n  }\n\n  // ?\n  return ''\n}\n\n/**\n * @param {Point | PointLike | null | undefined} point\n * @returns {string}\n */\nfunction point(point) {\n  return index(point && point.line) + ':' + index(point && point.column)\n}\n\n/**\n * @param {Position | PositionLike | null | undefined} pos\n * @returns {string}\n */\nfunction position(pos) {\n  return point(pos && pos.start) + '-' + point(pos && pos.end)\n}\n\n/**\n * @param {number | null | undefined} value\n * @returns {number}\n */\nfunction index(value) {\n  return value && typeof value === 'number' ? value : 1\n}\n","/**\n * @import {Node, Point, Position} from 'unist'\n */\n\n/**\n * @typedef {object & {type: string, position?: Position | undefined}} NodeLike\n *\n * @typedef Options\n *   Configuration.\n * @property {Array<Node> | null | undefined} [ancestors]\n *   Stack of (inclusive) ancestor nodes surrounding the message (optional).\n * @property {Error | null | undefined} [cause]\n *   Original error cause of the message (optional).\n * @property {Point | Position | null | undefined} [place]\n *   Place of message (optional).\n * @property {string | null | undefined} [ruleId]\n *   Category of message (optional, example: `'my-rule'`).\n * @property {string | null | undefined} [source]\n *   Namespace of who sent the message (optional, example: `'my-package'`).\n */\n\nimport {stringifyPosition} from 'unist-util-stringify-position'\n\n/**\n * Message.\n */\nexport class VFileMessage extends Error {\n  /**\n   * Create a message for `reason`.\n   *\n   * > 🪦 **Note**: also has obsolete signatures.\n   *\n   * @overload\n   * @param {string} reason\n   * @param {Options | null | undefined} [options]\n   * @returns\n   *\n   * @overload\n   * @param {string} reason\n   * @param {Node | NodeLike | null | undefined} parent\n   * @param {string | null | undefined} [origin]\n   * @returns\n   *\n   * @overload\n   * @param {string} reason\n   * @param {Point | Position | null | undefined} place\n   * @param {string | null | undefined} [origin]\n   * @returns\n   *\n   * @overload\n   * @param {string} reason\n   * @param {string | null | undefined} [origin]\n   * @returns\n   *\n   * @overload\n   * @param {Error | VFileMessage} cause\n   * @param {Node | NodeLike | null | undefined} parent\n   * @param {string | null | undefined} [origin]\n   * @returns\n   *\n   * @overload\n   * @param {Error | VFileMessage} cause\n   * @param {Point | Position | null | undefined} place\n   * @param {string | null | undefined} [origin]\n   * @returns\n   *\n   * @overload\n   * @param {Error | VFileMessage} cause\n   * @param {string | null | undefined} [origin]\n   * @returns\n   *\n   * @param {Error | VFileMessage | string} causeOrReason\n   *   Reason for message, should use markdown.\n   * @param {Node | NodeLike | Options | Point | Position | string | null | undefined} [optionsOrParentOrPlace]\n   *   Configuration (optional).\n   * @param {string | null | undefined} [origin]\n   *   Place in code where the message originates (example:\n   *   `'my-package:my-rule'` or `'my-rule'`).\n   * @returns\n   *   Instance of `VFileMessage`.\n   */\n  // eslint-disable-next-line complexity\n  constructor(causeOrReason, optionsOrParentOrPlace, origin) {\n    super()\n\n    if (typeof optionsOrParentOrPlace === 'string') {\n      origin = optionsOrParentOrPlace\n      optionsOrParentOrPlace = undefined\n    }\n\n    /** @type {string} */\n    let reason = ''\n    /** @type {Options} */\n    let options = {}\n    let legacyCause = false\n\n    if (optionsOrParentOrPlace) {\n      // Point.\n      if (\n        'line' in optionsOrParentOrPlace &&\n        'column' in optionsOrParentOrPlace\n      ) {\n        options = {place: optionsOrParentOrPlace}\n      }\n      // Position.\n      else if (\n        'start' in optionsOrParentOrPlace &&\n        'end' in optionsOrParentOrPlace\n      ) {\n        options = {place: optionsOrParentOrPlace}\n      }\n      // Node.\n      else if ('type' in optionsOrParentOrPlace) {\n        options = {\n          ancestors: [optionsOrParentOrPlace],\n          place: optionsOrParentOrPlace.position\n        }\n      }\n      // Options.\n      else {\n        options = {...optionsOrParentOrPlace}\n      }\n    }\n\n    if (typeof causeOrReason === 'string') {\n      reason = causeOrReason\n    }\n    // Error.\n    else if (!options.cause && causeOrReason) {\n      legacyCause = true\n      reason = causeOrReason.message\n      options.cause = causeOrReason\n    }\n\n    if (!options.ruleId && !options.source && typeof origin === 'string') {\n      const index = origin.indexOf(':')\n\n      if (index === -1) {\n        options.ruleId = origin\n      } else {\n        options.source = origin.slice(0, index)\n        options.ruleId = origin.slice(index + 1)\n      }\n    }\n\n    if (!options.place && options.ancestors && options.ancestors) {\n      const parent = options.ancestors[options.ancestors.length - 1]\n\n      if (parent) {\n        options.place = parent.position\n      }\n    }\n\n    const start =\n      options.place && 'start' in options.place\n        ? options.place.start\n        : options.place\n\n    /**\n     * Stack of ancestor nodes surrounding the message.\n     *\n     * @type {Array<Node> | undefined}\n     */\n    this.ancestors = options.ancestors || undefined\n\n    /**\n     * Original error cause of the message.\n     *\n     * @type {Error | undefined}\n     */\n    this.cause = options.cause || undefined\n\n    /**\n     * Starting column of message.\n     *\n     * @type {number | undefined}\n     */\n    this.column = start ? start.column : undefined\n\n    /**\n     * State of problem.\n     *\n     * * `true` — error, file not usable\n     * * `false` — warning, change may be needed\n     * * `undefined` — change likely not needed\n     *\n     * @type {boolean | null | undefined}\n     */\n    this.fatal = undefined\n\n    /**\n     * Path of a file (used throughout the `VFile` ecosystem).\n     *\n     * @type {string | undefined}\n     */\n    this.file = ''\n\n    // Field from `Error`.\n    /**\n     * Reason for message.\n     *\n     * @type {string}\n     */\n    this.message = reason\n\n    /**\n     * Starting line of error.\n     *\n     * @type {number | undefined}\n     */\n    this.line = start ? start.line : undefined\n\n    // Field from `Error`.\n    /**\n     * Serialized positional info of message.\n     *\n     * On normal errors, this would be something like `ParseError`, buit in\n     * `VFile` messages we use this space to show where an error happened.\n     */\n    this.name = stringifyPosition(options.place) || '1:1'\n\n    /**\n     * Place of message.\n     *\n     * @type {Point | Position | undefined}\n     */\n    this.place = options.place || undefined\n\n    /**\n     * Reason for message, should use markdown.\n     *\n     * @type {string}\n     */\n    this.reason = this.message\n\n    /**\n     * Category of message (example: `'my-rule'`).\n     *\n     * @type {string | undefined}\n     */\n    this.ruleId = options.ruleId || undefined\n\n    /**\n     * Namespace of message (example: `'my-package'`).\n     *\n     * @type {string | undefined}\n     */\n    this.source = options.source || undefined\n\n    // Field from `Error`.\n    /**\n     * Stack of message.\n     *\n     * This is used by normal errors to show where something happened in\n     * programming code, irrelevant for `VFile` messages,\n     *\n     * @type {string}\n     */\n    this.stack =\n      legacyCause && options.cause && typeof options.cause.stack === 'string'\n        ? options.cause.stack\n        : ''\n\n    // The following fields are “well known”.\n    // Not standard.\n    // Feel free to add other non-standard fields to your messages.\n\n    /**\n     * Specify the source value that’s being reported, which is deemed\n     * incorrect.\n     *\n     * @type {string | undefined}\n     */\n    this.actual = undefined\n\n    /**\n     * Suggest acceptable values that can be used instead of `actual`.\n     *\n     * @type {Array<string> | undefined}\n     */\n    this.expected = undefined\n\n    /**\n     * Long form description of the message (you should use markdown).\n     *\n     * @type {string | undefined}\n     */\n    this.note = undefined\n\n    /**\n     * Link to docs for the message.\n     *\n     * > 👉 **Note**: this must be an absolute URL that can be passed as `x`\n     * > to `new URL(x)`.\n     *\n     * @type {string | undefined}\n     */\n    this.url = undefined\n  }\n}\n\nVFileMessage.prototype.file = ''\nVFileMessage.prototype.name = ''\nVFileMessage.prototype.reason = ''\nVFileMessage.prototype.message = ''\nVFileMessage.prototype.stack = ''\nVFileMessage.prototype.column = undefined\nVFileMessage.prototype.line = undefined\nVFileMessage.prototype.ancestors = undefined\nVFileMessage.prototype.cause = undefined\nVFileMessage.prototype.fatal = undefined\nVFileMessage.prototype.place = undefined\nVFileMessage.prototype.ruleId = undefined\nVFileMessage.prototype.source = undefined\n","/**\n * Checks if a value has the shape of a WHATWG URL object.\n *\n * Using a symbol or instanceof would not be able to recognize URL objects\n * coming from other implementations (e.g. in Electron), so instead we are\n * checking some well known properties for a lack of a better test.\n *\n * We use `href` and `protocol` as they are the only properties that are\n * easy to retrieve and calculate due to the lazy nature of the getters.\n *\n * We check for auth attribute to distinguish legacy url instance with\n * WHATWG URL instance.\n *\n * @param {unknown} fileUrlOrPath\n *   File path or URL.\n * @returns {fileUrlOrPath is URL}\n *   Whether it’s a URL.\n */\n// From: <https://github.com/nodejs/node/blob/6a3403c/lib/internal/url.js#L720>\nexport function isUrl(fileUrlOrPath) {\n  return Boolean(\n    fileUrlOrPath !== null &&\n      typeof fileUrlOrPath === 'object' &&\n      'href' in fileUrlOrPath &&\n      fileUrlOrPath.href &&\n      'protocol' in fileUrlOrPath &&\n      fileUrlOrPath.protocol &&\n      // @ts-expect-error: indexing is fine.\n      fileUrlOrPath.auth === undefined\n  )\n}\n","/**\n * @import {Node, Point, Position} from 'unist'\n * @import {Options as MessageOptions} from 'vfile-message'\n * @import {Compatible, Data, Map, Options, Value} from 'vfile'\n */\n\n/**\n * @typedef {object & {type: string, position?: Position | undefined}} NodeLike\n */\n\nimport {VFileMessage} from 'vfile-message'\nimport {minpath} from '#minpath'\nimport {minproc} from '#minproc'\nimport {urlToPath, isUrl} from '#minurl'\n\n/**\n * Order of setting (least specific to most), we need this because otherwise\n * `{stem: 'a', path: '~/b.js'}` would throw, as a path is needed before a\n * stem can be set.\n */\nconst order = /** @type {const} */ ([\n  'history',\n  'path',\n  'basename',\n  'stem',\n  'extname',\n  'dirname'\n])\n\nexport class VFile {\n  /**\n   * Create a new virtual file.\n   *\n   * `options` is treated as:\n   *\n   * *   `string` or `Uint8Array` — `{value: options}`\n   * *   `URL` — `{path: options}`\n   * *   `VFile` — shallow copies its data over to the new file\n   * *   `object` — all fields are shallow copied over to the new file\n   *\n   * Path related fields are set in the following order (least specific to\n   * most specific): `history`, `path`, `basename`, `stem`, `extname`,\n   * `dirname`.\n   *\n   * You cannot set `dirname` or `extname` without setting either `history`,\n   * `path`, `basename`, or `stem` too.\n   *\n   * @param {Compatible | null | undefined} [value]\n   *   File value.\n   * @returns\n   *   New instance.\n   */\n  constructor(value) {\n    /** @type {Options | VFile} */\n    let options\n\n    if (!value) {\n      options = {}\n    } else if (isUrl(value)) {\n      options = {path: value}\n    } else if (typeof value === 'string' || isUint8Array(value)) {\n      options = {value}\n    } else {\n      options = value\n    }\n\n    /* eslint-disable no-unused-expressions */\n\n    /**\n     * Base of `path` (default: `process.cwd()` or `'/'` in browsers).\n     *\n     * @type {string}\n     */\n    // Prevent calling `cwd` (which could be expensive) if it’s not needed;\n    // the empty string will be overridden in the next block.\n    this.cwd = 'cwd' in options ? '' : minproc.cwd()\n\n    /**\n     * Place to store custom info (default: `{}`).\n     *\n     * It’s OK to store custom data directly on the file but moving it to\n     * `data` is recommended.\n     *\n     * @type {Data}\n     */\n    this.data = {}\n\n    /**\n     * List of file paths the file moved between.\n     *\n     * The first is the original path and the last is the current path.\n     *\n     * @type {Array<string>}\n     */\n    this.history = []\n\n    /**\n     * List of messages associated with the file.\n     *\n     * @type {Array<VFileMessage>}\n     */\n    this.messages = []\n\n    /**\n     * Raw value.\n     *\n     * @type {Value}\n     */\n    this.value\n\n    // The below are non-standard, they are “well-known”.\n    // As in, used in several tools.\n    /**\n     * Source map.\n     *\n     * This type is equivalent to the `RawSourceMap` type from the `source-map`\n     * module.\n     *\n     * @type {Map | null | undefined}\n     */\n    this.map\n\n    /**\n     * Custom, non-string, compiled, representation.\n     *\n     * This is used by unified to store non-string results.\n     * One example is when turning markdown into React nodes.\n     *\n     * @type {unknown}\n     */\n    this.result\n\n    /**\n     * Whether a file was saved to disk.\n     *\n     * This is used by vfile reporters.\n     *\n     * @type {boolean}\n     */\n    this.stored\n    /* eslint-enable no-unused-expressions */\n\n    // Set path related properties in the correct order.\n    let index = -1\n\n    while (++index < order.length) {\n      const field = order[index]\n\n      // Note: we specifically use `in` instead of `hasOwnProperty` to accept\n      // `vfile`s too.\n      if (\n        field in options &&\n        options[field] !== undefined &&\n        options[field] !== null\n      ) {\n        // @ts-expect-error: TS doesn’t understand basic reality.\n        this[field] = field === 'history' ? [...options[field]] : options[field]\n      }\n    }\n\n    /** @type {string} */\n    let field\n\n    // Set non-path related properties.\n    for (field in options) {\n      // @ts-expect-error: fine to set other things.\n      if (!order.includes(field)) {\n        // @ts-expect-error: fine to set other things.\n        this[field] = options[field]\n      }\n    }\n  }\n\n  /**\n   * Get the basename (including extname) (example: `'index.min.js'`).\n   *\n   * @returns {string | undefined}\n   *   Basename.\n   */\n  get basename() {\n    return typeof this.path === 'string'\n      ? minpath.basename(this.path)\n      : undefined\n  }\n\n  /**\n   * Set basename (including extname) (`'index.min.js'`).\n   *\n   * Cannot contain path separators (`'/'` on unix, macOS, and browsers, `'\\'`\n   * on windows).\n   * Cannot be nullified (use `file.path = file.dirname` instead).\n   *\n   * @param {string} basename\n   *   Basename.\n   * @returns {undefined}\n   *   Nothing.\n   */\n  set basename(basename) {\n    assertNonEmpty(basename, 'basename')\n    assertPart(basename, 'basename')\n    this.path = minpath.join(this.dirname || '', basename)\n  }\n\n  /**\n   * Get the parent path (example: `'~'`).\n   *\n   * @returns {string | undefined}\n   *   Dirname.\n   */\n  get dirname() {\n    return typeof this.path === 'string'\n      ? minpath.dirname(this.path)\n      : undefined\n  }\n\n  /**\n   * Set the parent path (example: `'~'`).\n   *\n   * Cannot be set if there’s no `path` yet.\n   *\n   * @param {string | undefined} dirname\n   *   Dirname.\n   * @returns {undefined}\n   *   Nothing.\n   */\n  set dirname(dirname) {\n    assertPath(this.basename, 'dirname')\n    this.path = minpath.join(dirname || '', this.basename)\n  }\n\n  /**\n   * Get the extname (including dot) (example: `'.js'`).\n   *\n   * @returns {string | undefined}\n   *   Extname.\n   */\n  get extname() {\n    return typeof this.path === 'string'\n      ? minpath.extname(this.path)\n      : undefined\n  }\n\n  /**\n   * Set the extname (including dot) (example: `'.js'`).\n   *\n   * Cannot contain path separators (`'/'` on unix, macOS, and browsers, `'\\'`\n   * on windows).\n   * Cannot be set if there’s no `path` yet.\n   *\n   * @param {string | undefined} extname\n   *   Extname.\n   * @returns {undefined}\n   *   Nothing.\n   */\n  set extname(extname) {\n    assertPart(extname, 'extname')\n    assertPath(this.dirname, 'extname')\n\n    if (extname) {\n      if (extname.codePointAt(0) !== 46 /* `.` */) {\n        throw new Error('`extname` must start with `.`')\n      }\n\n      if (extname.includes('.', 1)) {\n        throw new Error('`extname` cannot contain multiple dots')\n      }\n    }\n\n    this.path = minpath.join(this.dirname, this.stem + (extname || ''))\n  }\n\n  /**\n   * Get the full path (example: `'~/index.min.js'`).\n   *\n   * @returns {string}\n   *   Path.\n   */\n  get path() {\n    return this.history[this.history.length - 1]\n  }\n\n  /**\n   * Set the full path (example: `'~/index.min.js'`).\n   *\n   * Cannot be nullified.\n   * You can set a file URL (a `URL` object with a `file:` protocol) which will\n   * be turned into a path with `url.fileURLToPath`.\n   *\n   * @param {URL | string} path\n   *   Path.\n   * @returns {undefined}\n   *   Nothing.\n   */\n  set path(path) {\n    if (isUrl(path)) {\n      path = urlToPath(path)\n    }\n\n    assertNonEmpty(path, 'path')\n\n    if (this.path !== path) {\n      this.history.push(path)\n    }\n  }\n\n  /**\n   * Get the stem (basename w/o extname) (example: `'index.min'`).\n   *\n   * @returns {string | undefined}\n   *   Stem.\n   */\n  get stem() {\n    return typeof this.path === 'string'\n      ? minpath.basename(this.path, this.extname)\n      : undefined\n  }\n\n  /**\n   * Set the stem (basename w/o extname) (example: `'index.min'`).\n   *\n   * Cannot contain path separators (`'/'` on unix, macOS, and browsers, `'\\'`\n   * on windows).\n   * Cannot be nullified (use `file.path = file.dirname` instead).\n   *\n   * @param {string} stem\n   *   Stem.\n   * @returns {undefined}\n   *   Nothing.\n   */\n  set stem(stem) {\n    assertNonEmpty(stem, 'stem')\n    assertPart(stem, 'stem')\n    this.path = minpath.join(this.dirname || '', stem + (this.extname || ''))\n  }\n\n  // Normal prototypal methods.\n  /**\n   * Create a fatal message for `reason` associated with the file.\n   *\n   * The `fatal` field of the message is set to `true` (error; file not usable)\n   * and the `file` field is set to the current file path.\n   * The message is added to the `messages` field on `file`.\n   *\n   * > 🪦 **Note**: also has obsolete signatures.\n   *\n   * @overload\n   * @param {string} reason\n   * @param {MessageOptions | null | undefined} [options]\n   * @returns {never}\n   *\n   * @overload\n   * @param {string} reason\n   * @param {Node | NodeLike | null | undefined} parent\n   * @param {string | null | undefined} [origin]\n   * @returns {never}\n   *\n   * @overload\n   * @param {string} reason\n   * @param {Point | Position | null | undefined} place\n   * @param {string | null | undefined} [origin]\n   * @returns {never}\n   *\n   * @overload\n   * @param {string} reason\n   * @param {string | null | undefined} [origin]\n   * @returns {never}\n   *\n   * @overload\n   * @param {Error | VFileMessage} cause\n   * @param {Node | NodeLike | null | undefined} parent\n   * @param {string | null | undefined} [origin]\n   * @returns {never}\n   *\n   * @overload\n   * @param {Error | VFileMessage} cause\n   * @param {Point | Position | null | undefined} place\n   * @param {string | null | undefined} [origin]\n   * @returns {never}\n   *\n   * @overload\n   * @param {Error | VFileMessage} cause\n   * @param {string | null | undefined} [origin]\n   * @returns {never}\n   *\n   * @param {Error | VFileMessage | string} causeOrReason\n   *   Reason for message, should use markdown.\n   * @param {Node | NodeLike | MessageOptions | Point | Position | string | null | undefined} [optionsOrParentOrPlace]\n   *   Configuration (optional).\n   * @param {string | null | undefined} [origin]\n   *   Place in code where the message originates (example:\n   *   `'my-package:my-rule'` or `'my-rule'`).\n   * @returns {never}\n   *   Never.\n   * @throws {VFileMessage}\n   *   Message.\n   */\n  fail(causeOrReason, optionsOrParentOrPlace, origin) {\n    // @ts-expect-error: the overloads are fine.\n    const message = this.message(causeOrReason, optionsOrParentOrPlace, origin)\n\n    message.fatal = true\n\n    throw message\n  }\n\n  /**\n   * Create an info message for `reason` associated with the file.\n   *\n   * The `fatal` field of the message is set to `undefined` (info; change\n   * likely not needed) and the `file` field is set to the current file path.\n   * The message is added to the `messages` field on `file`.\n   *\n   * > 🪦 **Note**: also has obsolete signatures.\n   *\n   * @overload\n   * @param {string} reason\n   * @param {MessageOptions | null | undefined} [options]\n   * @returns {VFileMessage}\n   *\n   * @overload\n   * @param {string} reason\n   * @param {Node | NodeLike | null | undefined} parent\n   * @param {string | null | undefined} [origin]\n   * @returns {VFileMessage}\n   *\n   * @overload\n   * @param {string} reason\n   * @param {Point | Position | null | undefined} place\n   * @param {string | null | undefined} [origin]\n   * @returns {VFileMessage}\n   *\n   * @overload\n   * @param {string} reason\n   * @param {string | null | undefined} [origin]\n   * @returns {VFileMessage}\n   *\n   * @overload\n   * @param {Error | VFileMessage} cause\n   * @param {Node | NodeLike | null | undefined} parent\n   * @param {string | null | undefined} [origin]\n   * @returns {VFileMessage}\n   *\n   * @overload\n   * @param {Error | VFileMessage} cause\n   * @param {Point | Position | null | undefined} place\n   * @param {string | null | undefined} [origin]\n   * @returns {VFileMessage}\n   *\n   * @overload\n   * @param {Error | VFileMessage} cause\n   * @param {string | null | undefined} [origin]\n   * @returns {VFileMessage}\n   *\n   * @param {Error | VFileMessage | string} causeOrReason\n   *   Reason for message, should use markdown.\n   * @param {Node | NodeLike | MessageOptions | Point | Position | string | null | undefined} [optionsOrParentOrPlace]\n   *   Configuration (optional).\n   * @param {string | null | undefined} [origin]\n   *   Place in code where the message originates (example:\n   *   `'my-package:my-rule'` or `'my-rule'`).\n   * @returns {VFileMessage}\n   *   Message.\n   */\n  info(causeOrReason, optionsOrParentOrPlace, origin) {\n    // @ts-expect-error: the overloads are fine.\n    const message = this.message(causeOrReason, optionsOrParentOrPlace, origin)\n\n    message.fatal = undefined\n\n    return message\n  }\n\n  /**\n   * Create a message for `reason` associated with the file.\n   *\n   * The `fatal` field of the message is set to `false` (warning; change may be\n   * needed) and the `file` field is set to the current file path.\n   * The message is added to the `messages` field on `file`.\n   *\n   * > 🪦 **Note**: also has obsolete signatures.\n   *\n   * @overload\n   * @param {string} reason\n   * @param {MessageOptions | null | undefined} [options]\n   * @returns {VFileMessage}\n   *\n   * @overload\n   * @param {string} reason\n   * @param {Node | NodeLike | null | undefined} parent\n   * @param {string | null | undefined} [origin]\n   * @returns {VFileMessage}\n   *\n   * @overload\n   * @param {string} reason\n   * @param {Point | Position | null | undefined} place\n   * @param {string | null | undefined} [origin]\n   * @returns {VFileMessage}\n   *\n   * @overload\n   * @param {string} reason\n   * @param {string | null | undefined} [origin]\n   * @returns {VFileMessage}\n   *\n   * @overload\n   * @param {Error | VFileMessage} cause\n   * @param {Node | NodeLike | null | undefined} parent\n   * @param {string | null | undefined} [origin]\n   * @returns {VFileMessage}\n   *\n   * @overload\n   * @param {Error | VFileMessage} cause\n   * @param {Point | Position | null | undefined} place\n   * @param {string | null | undefined} [origin]\n   * @returns {VFileMessage}\n   *\n   * @overload\n   * @param {Error | VFileMessage} cause\n   * @param {string | null | undefined} [origin]\n   * @returns {VFileMessage}\n   *\n   * @param {Error | VFileMessage | string} causeOrReason\n   *   Reason for message, should use markdown.\n   * @param {Node | NodeLike | MessageOptions | Point | Position | string | null | undefined} [optionsOrParentOrPlace]\n   *   Configuration (optional).\n   * @param {string | null | undefined} [origin]\n   *   Place in code where the message originates (example:\n   *   `'my-package:my-rule'` or `'my-rule'`).\n   * @returns {VFileMessage}\n   *   Message.\n   */\n  message(causeOrReason, optionsOrParentOrPlace, origin) {\n    const message = new VFileMessage(\n      // @ts-expect-error: the overloads are fine.\n      causeOrReason,\n      optionsOrParentOrPlace,\n      origin\n    )\n\n    if (this.path) {\n      message.name = this.path + ':' + message.name\n      message.file = this.path\n    }\n\n    message.fatal = false\n\n    this.messages.push(message)\n\n    return message\n  }\n\n  /**\n   * Serialize the file.\n   *\n   * > **Note**: which encodings are supported depends on the engine.\n   * > For info on Node.js, see:\n   * > <https://nodejs.org/api/util.html#whatwg-supported-encodings>.\n   *\n   * @param {string | null | undefined} [encoding='utf8']\n   *   Character encoding to understand `value` as when it’s a `Uint8Array`\n   *   (default: `'utf-8'`).\n   * @returns {string}\n   *   Serialized file.\n   */\n  toString(encoding) {\n    if (this.value === undefined) {\n      return ''\n    }\n\n    if (typeof this.value === 'string') {\n      return this.value\n    }\n\n    const decoder = new TextDecoder(encoding || undefined)\n    return decoder.decode(this.value)\n  }\n}\n\n/**\n * Assert that `part` is not a path (as in, does not contain `path.sep`).\n *\n * @param {string | null | undefined} part\n *   File path part.\n * @param {string} name\n *   Part name.\n * @returns {undefined}\n *   Nothing.\n */\nfunction assertPart(part, name) {\n  if (part && part.includes(minpath.sep)) {\n    throw new Error(\n      '`' + name + '` cannot be a path: did not expect `' + minpath.sep + '`'\n    )\n  }\n}\n\n/**\n * Assert that `part` is not empty.\n *\n * @param {string | undefined} part\n *   Thing.\n * @param {string} name\n *   Part name.\n * @returns {asserts part is string}\n *   Nothing.\n */\nfunction assertNonEmpty(part, name) {\n  if (!part) {\n    throw new Error('`' + name + '` cannot be empty')\n  }\n}\n\n/**\n * Assert `path` exists.\n *\n * @param {string | undefined} path\n *   Path.\n * @param {string} name\n *   Dependency name.\n * @returns {asserts path is string}\n *   Nothing.\n */\nfunction assertPath(path, name) {\n  if (!path) {\n    throw new Error('Setting `' + name + '` requires `path` to be set too')\n  }\n}\n\n/**\n * Assert `value` is an `Uint8Array`.\n *\n * @param {unknown} value\n *   thing.\n * @returns {value is Uint8Array}\n *   Whether `value` is an `Uint8Array`.\n */\nfunction isUint8Array(value) {\n  return Boolean(\n    value &&\n      typeof value === 'object' &&\n      'byteLength' in value &&\n      'byteOffset' in value\n  )\n}\n","import { francAll } from 'franc-min';\n\n/**\n * Map from ISO 639-3 (franc output) to BCP 47 language tags\n * franc returns ISO 639-3 codes, but BCP 47 uses ISO 639-1 when available\n */\nconst ISO_639_3_TO_BCP_47: Record<string, string> = {\n\teng: 'en',\n\tspa: 'es',\n\tfra: 'fr',\n\tdeu: 'de',\n\tita: 'it',\n\tpor: 'pt',\n\trus: 'ru',\n\tjpn: 'ja',\n\tkor: 'ko',\n\tzho: 'zh',\n\tara: 'ar',\n\thin: 'hi',\n\tben: 'bn',\n\tnld: 'nl',\n\tpol: 'pl',\n\ttur: 'tr',\n\tvie: 'vi',\n\ttha: 'th',\n\tswe: 'sv',\n\tdan: 'da',\n\tfin: 'fi',\n\tnor: 'no',\n\tces: 'cs',\n\tron: 'ro',\n\thun: 'hu',\n\tell: 'el',\n\theb: 'he',\n\tukr: 'uk',\n\tcat: 'ca',\n\tind: 'id',\n\tmsa: 'ms',\n\tfas: 'fa',\n};\n\n/**\n * Detects the language of a text and returns the BCP 47 language tag\n * @param text - The text to analyze\n * @param minConfidence - Minimum confidence threshold (0-1). Default: 0.5\n * @returns BCP 47 language tag or 'en' if detection fails\n */\nexport function detectLanguage(text: string, minConfidence = 0.5): string {\n\tif (!text || text.trim().length < 30) {\n\t\t// Too short to reliably detect, default to English\n\t\treturn 'en';\n\t}\n\n\ttry {\n\t\t// francAll returns array of [language, confidence] tuples\n\t\tconst results = francAll(text, { minLength: 3 });\n\n\t\tif (results.length === 0 || results[0][0] === 'und') {\n\t\t\t// 'und' means undetermined\n\t\t\treturn 'en';\n\t\t}\n\n\t\tconst [detectedLang, confidence] = results[0];\n\n\t\t// Check if confidence meets threshold\n\t\tif (confidence < minConfidence) {\n\t\t\treturn 'en';\n\t\t}\n\n\t\t// Convert from ISO 639-3 to BCP 47\n\t\treturn ISO_639_3_TO_BCP_47[detectedLang] || detectedLang;\n\t} catch {\n\t\t// If detection fails, default to English\n\t\treturn 'en';\n\t}\n}\n\n/**\n * Validates and normalizes a BCP 47 language tag\n * Accepts both full BCP 47 tags (e.g., 'en-US') and simple codes (e.g., 'en')\n */\nexport function normalizeBcp47(tag: string): string {\n\tif (!tag) return 'en';\n\n\t// Basic validation: should start with 2-3 letter language code\n\tconst normalized = tag.trim().toLowerCase();\n\tconst match = normalized.match(/^[a-z]{2,3}(-[a-z]{2,4})?$/i);\n\n\tif (!match) {\n\t\treturn 'en';\n\t}\n\n\treturn normalized;\n}\n","function escapeHtml(value: string): string {\n\treturn value\n\t\t.replace(/&/g, '&amp;')\n\t\t.replace(/</g, '&lt;')\n\t\t.replace(/>/g, '&gt;')\n\t\t.replace(/\"/g, '&quot;')\n\t\t.replace(/'/g, '&#39;');\n}\nexport { escapeHtml };\n","import type { Html, Root, RootContent } from 'mdast';\nimport type { Plugin } from 'unified';\nimport type { VFile } from 'vfile';\n\nconst remarkAwesomePagesMarkers: Plugin<[], Root> =\n\t() =>\n\t(tree: Root, file: VFile): void => {\n\t\tconst isCmd = (value: string, cmd: string): boolean =>\n\t\t\tvalue.trim() === `<!--awesome-pages:${cmd}-->`;\n\n\t\tlet hasExplicitBlocks = false;\n\t\tfor (const node of tree.children) {\n\t\t\tif (node.type === 'html') {\n\t\t\t\tconst htmlNode = node as Html;\n\t\t\t\tif (isCmd(htmlNode.value, 'start')) {\n\t\t\t\t\thasExplicitBlocks = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tlet parseDepth = 0;\n\t\tlet ignoreDepth = 0;\n\t\tconst kept: RootContent[] = [];\n\n\t\tfor (const node of tree.children) {\n\t\t\tif (node.type === 'html') {\n\t\t\t\tconst htmlNode = node as Html;\n\t\t\t\tconst v = htmlNode.value.trim();\n\n\t\t\t\tif (isCmd(v, 'start')) {\n\t\t\t\t\tparseDepth++;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (isCmd(v, 'end')) {\n\t\t\t\t\tparseDepth = Math.max(0, parseDepth - 1);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (isCmd(v, 'ignore:start')) {\n\t\t\t\t\tignoreDepth++;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (isCmd(v, 'ignore:end')) {\n\t\t\t\t\tignoreDepth = Math.max(0, ignoreDepth - 1);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst include = hasExplicitBlocks\n\t\t\t\t? parseDepth > 0 && ignoreDepth === 0\n\t\t\t\t: ignoreDepth === 0;\n\n\t\t\tif (include) kept.push(node);\n\t\t}\n\n\t\ttree.children = kept;\n\n\t\tconst data = file.data as Record<string, unknown>;\n\t\tdata.awesomePages = { hasExplicitBlocks };\n\t};\n\nexport default remarkAwesomePagesMarkers;\n","import path from 'node:path';\nimport { toHtml } from 'hast-util-to-html';\nimport type { Heading, Paragraph, Root, RootContent, Yaml } from 'mdast';\nimport { toHast } from 'mdast-util-to-hast';\nimport remarkFrontmatter from 'remark-frontmatter';\nimport remarkGfm from 'remark-gfm';\nimport remarkParse from 'remark-parse';\nimport { unified } from 'unified';\nimport { VFile } from 'vfile';\nimport {\n\tdetectLanguage,\n\tnormalizeBcp47,\n} from '@/core/helpers/detectLanguage.js';\nimport { escapeHtml } from '@/core/helpers/escapeHtml';\nimport remarkAwesomePagesMarkers from '@/plugins/awesomePagesMarkers.js';\n\ninterface AwesomePagesData {\n\tawesomePages?: {\n\t\thasExplicitBlocks?: boolean;\n\t};\n}\n\nexport interface ParsedAst {\n\ttree: Root;\n\ttitle: string | null;\n\tdescription: string | null;\n\tdescriptionHtml: string | null;\n\tfrontmatter: Record<string, unknown> | null;\n\tlanguage: string;\n\thasExplicitBlocks: boolean;\n}\n\nfunction extractText(node: RootContent): string {\n\tif (node.type === 'html') {\n\t\treturn '';\n\t}\n\n\tif (node.type === 'image') {\n\t\treturn '';\n\t}\n\n\tif (\n\t\t'value' in node &&\n\t\ttypeof (node as { value?: unknown }).value === 'string'\n\t) {\n\t\treturn (node as { value: string }).value;\n\t}\n\n\tif (\n\t\t'children' in node &&\n\t\tArray.isArray((node as { children?: unknown }).children)\n\t) {\n\t\treturn (node as { children: RootContent[] }).children\n\t\t\t.map((child) => extractText(child))\n\t\t\t.filter((text) => text.length > 0)\n\t\t\t.join('');\n\t}\n\n\treturn '';\n}\n\nfunction parseFrontmatter(yamlContent: string): Record<string, unknown> | null {\n\ttry {\n\t\tconst lines = yamlContent.split('\\n');\n\t\tconst result: Record<string, unknown> = {};\n\n\t\tfor (const line of lines) {\n\t\t\tconst match = line.match(/^(\\w+):\\s*(.+)$/);\n\t\t\tif (match) {\n\t\t\t\tconst [, key, value] = match;\n\t\t\t\tresult[key] = value.replace(/^[\"']|[\"']$/g, '').trim();\n\t\t\t}\n\t\t}\n\n\t\treturn Object.keys(result).length > 0 ? result : null;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction extractMetadata(\n\ttree: Root,\n\tsourceId?: string,\n): {\n\ttitle: string | null;\n\tdescription: string | null;\n\tdescriptionHtml: string | null;\n\tfrontmatter: Record<string, unknown> | null;\n\tlanguage: string | null;\n} {\n\tlet frontmatter: Record<string, unknown> | null = null;\n\tlet title: string | null = null;\n\tlet description: string | null = null;\n\tlet descriptionHtml: string | null = null;\n\tlet language: string | null = null;\n\tlet foundH1 = false;\n\tlet foundFirstParagraph = false;\n\n\tfor (const node of tree.children) {\n\t\tif (node.type === 'yaml') {\n\t\t\tconst yamlNode = node as Yaml;\n\t\t\tfrontmatter = parseFrontmatter(yamlNode.value);\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (frontmatter?.title && typeof frontmatter.title === 'string') {\n\t\ttitle = frontmatter.title;\n\t}\n\n\tif (frontmatter?.language && typeof frontmatter.language === 'string') {\n\t\tlanguage = normalizeBcp47(frontmatter.language);\n\t}\n\n\tif (frontmatter?.description && typeof frontmatter.description === 'string') {\n\t\tdescription = frontmatter.description;\n\n\t\t// Generate HTML for descriptionHtml based on frontmatter description\n\t\tconst para: Paragraph = {\n\t\t\ttype: 'paragraph',\n\t\t\tchildren: [\n\t\t\t\t{\n\t\t\t\t\ttype: 'text',\n\t\t\t\t\tvalue: description,\n\t\t\t\t},\n\t\t\t],\n\t\t};\n\t\tconst hast = toHast(para, { allowDangerousHtml: false });\n\t\tif (hast) {\n\t\t\tdescriptionHtml = toHtml(hast);\n\t\t} else {\n\t\t\tdescriptionHtml = `<p>${escapeHtml(description)}</p>`;\n\t\t}\n\t}\n\n\tfor (const node of tree.children) {\n\t\tif (node.type === 'yaml' || node.type === 'html') {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (!title && node.type === 'heading') {\n\t\t\tconst heading = node as Heading;\n\t\t\tif (heading.depth === 1) {\n\t\t\t\ttitle = extractText(heading as RootContent).trim();\n\t\t\t\tfoundH1 = true;\n\t\t\t}\n\t\t}\n\n\t\tif (\n\t\t\t!description &&\n\t\t\t(foundH1 || frontmatter?.title) &&\n\t\t\tnode.type === 'paragraph'\n\t\t) {\n\t\t\tif (!foundFirstParagraph) {\n\t\t\t\tconst para = node as Paragraph;\n\t\t\t\tconst text = extractText(para as RootContent).trim();\n\t\t\t\tif (text.length > 0) {\n\t\t\t\t\tdescription = text;\n\n\t\t\t\t\t// Generate safe HTML fragment for descriptionHtml\n\t\t\t\t\tconst hast = toHast(para, { allowDangerousHtml: false });\n\t\t\t\t\tif (hast) {\n\t\t\t\t\t\tdescriptionHtml = toHtml(hast);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tdescriptionHtml = `<p>${description}</p>`;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfoundFirstParagraph = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (foundH1 && node.type === 'heading') {\n\t\t\tconst heading = node as Heading;\n\t\t\tif (heading.depth >= 2) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (!title && sourceId) {\n\t\ttitle = path.basename(sourceId);\n\t}\n\n\treturn { title, description, descriptionHtml, frontmatter, language };\n}\n\nexport async function markdownToAst(\n\tmarkdown: string,\n\tsourceId?: string,\n): Promise<ParsedAst> {\n\tconst processor = unified()\n\t\t.use(remarkParse)\n\t\t.use(remarkGfm)\n\t\t.use(remarkFrontmatter, ['yaml'])\n\t\t.use(remarkAwesomePagesMarkers);\n\n\tconst fullTree = processor.parse(markdown) as Root;\n\n\tconst {\n\t\ttitle,\n\t\tdescription,\n\t\tdescriptionHtml,\n\t\tfrontmatter,\n\t\tlanguage: frontmatterLanguage,\n\t} = extractMetadata(fullTree, sourceId);\n\n\t// Detect language if not specified in frontmatter\n\tconst language =\n\t\tfrontmatterLanguage ||\n\t\tdetectLanguage(\n\t\t\t[title, description]\n\t\t\t\t.filter((text): text is string => text !== null)\n\t\t\t\t.join(' ') || markdown,\n\t\t);\n\n\tconst vfile = new VFile({ value: markdown, path: sourceId });\n\tconst transformedTree = await processor.run(fullTree, vfile);\n\n\tconst data = vfile.data as AwesomePagesData;\n\tconst hasExplicitBlocks = data?.awesomePages?.hasExplicitBlocks === true;\n\n\treturn {\n\t\ttree: transformedTree,\n\t\ttitle,\n\t\tdescription,\n\t\tdescriptionHtml,\n\t\tfrontmatter,\n\t\tlanguage,\n\t\thasExplicitBlocks,\n\t};\n}\n","export class MarkdownSourceError extends Error {\n\tconstructor(\n\t\tmessage: string,\n\t\tpublic code: string,\n\t\tpublic cause?: unknown,\n\t) {\n\t\tsuper(message);\n\t\tthis.name = 'MarkdownSourceError';\n\t}\n}\n\nexport class RawFetchError extends MarkdownSourceError {\n\tconstructor(\n\t\tpublic status: number,\n\t\tpublic url: string,\n\t\tpublic body?: string,\n\t) {\n\t\tsuper(`RAW fetch failed (${status}) for ${url}`, 'RAW_FETCH_ERROR');\n\t}\n}\n\nexport class PrivateRepoError extends MarkdownSourceError {\n\tconstructor(public url: string) {\n\t\tsuper(`Private repository requires GITHUB_TOKEN: ${url}`, 'PRIVATE_REPO');\n\t}\n}\n\nexport class NotFoundError extends MarkdownSourceError {\n\tconstructor(public url: string) {\n\t\tsuper(`File not found on GitHub: ${url}`, 'NOT_FOUND');\n\t}\n}\n\nexport class GitHubApiError extends MarkdownSourceError {\n\tconstructor(\n\t\tpublic status: number,\n\t\tpublic url: string,\n\t\tpublic body?: string,\n\t) {\n\t\tsuper(`GitHub API ${status} for ${url}`, 'GITHUB_API_ERROR');\n\t}\n}\n\nexport class GithubTokenResolutionError extends Error {\n\tconstructor(\n\t\tpublic stage: string,\n\t\tmessage: string,\n\t\tpublic cause?: unknown,\n\t) {\n\t\tsuper(`Failed to resolve GitHub token during ${stage}: ${message}`);\n\t\tthis.name = 'GithubTokenResolutionError';\n\t}\n}\n\nexport class UnsupportedMimeTypeError extends MarkdownSourceError {\n\tconstructor(\n\t\tpublic url: string,\n\t\tpublic contentType: string | null,\n\t\tpublic allowed: readonly string[],\n\t) {\n\t\tsuper(\n\t\t\t`Invalid content-type '${contentType ?? 'null'}' for ${url}. Allowed: ${allowed.join(', ')}`,\n\t\t\t'UNSUPPORTED_MIME',\n\t\t);\n\t}\n}\n","export type FetchLike = (\n\tinput: string,\n\tinit?: RequestInit,\n) => Promise<Response>;\n\n/**\n * Returns a Fetch-compatible function that works in:\n * - Node >= 18 (uses global fetch)\n * - Node < 18 (lazy-loads node-fetch)\n * - Browser (global fetch)\n */\nexport async function resolveFetch(): Promise<FetchLike> {\n\t// Browser or Node >= 18\n\tconst g = globalThis as unknown as { fetch?: FetchLike };\n\tif (typeof g.fetch === 'function') {\n\t\treturn g.fetch;\n\t}\n\n\t// Node < 18 fallback\n\tconst mod = await import('node-fetch');\n\tconst fetchImpl = (mod.default ?? mod) as unknown as FetchLike;\n\treturn fetchImpl;\n}\n","function slugifyEnv(s: string): string {\n\treturn s\n\t\t.replace(/[^a-zA-Z0-9]+/g, '_')\n\t\t.replace(/^_+|_+$/g, '')\n\t\t.toUpperCase();\n}\n\nexport { slugifyEnv };\n","import { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport { GithubTokenResolutionError } from '@/sources/errors';\nimport { slugifyEnv } from '@/sources/helpers/slugifyEnv.js';\n\nconst execFileAsync = promisify(execFile);\n\nexport interface RepoRef {\n\thost: string;\n\towner: string;\n\trepo: string;\n}\n\n/**\n * Resolve GitHub token in a secure, minimal way:\n * 1) Namespaced env vars: GITHUB_TOKEN_<HOST>_<OWNER>_<REPO>\n * 2) Env generic: GITHUB_TOKEN, GH_TOKEN\n * 3) Optional fallback to GH CLI: `gh auth token`\n * If nothing resolves, returns undefined (allowing public/anonymous flows).\n */\nexport async function resolveGithubToken(\n\tref: RepoRef,\n): Promise<string | undefined> {\n\tconst hostU = slugifyEnv(ref.host);\n\tconst ownerU = slugifyEnv(ref.owner);\n\tconst repoU = slugifyEnv(ref.repo);\n\n\t// 1) Namespaced env (host + owner + repo) → most specific\n\tconst candidates = [\n\t\t`GITHUB_TOKEN_${hostU}_${ownerU}_${repoU}`,\n\t\t`GITHUB_TOKEN_${ownerU}_${repoU}`, // assumes github.com\n\t\tprocess.env.GITHUB_TOKEN ? 'GITHUB_TOKEN' : undefined,\n\t\tprocess.env.GH_TOKEN ? 'GH_TOKEN' : undefined,\n\t].filter(Boolean) as string[];\n\n\tfor (const k of candidates) {\n\t\tconst v = process.env[k];\n\t\tif (v) return v;\n\t}\n\n\t// 2) Optional GH CLI fallback (silent): try `gh auth token`\n\ttry {\n\t\tconst { stdout } = await execFileAsync('gh', ['auth', 'token']);\n\t\tconst tok = stdout?.toString().trim();\n\t\tif (tok) return tok;\n\t\t// If gh CLI returns empty output, return undefined\n\t\treturn undefined;\n\t} catch (err) {\n\t\t// Check if it's ENOENT (gh not found) - in that case, silently return undefined\n\t\tif (\n\t\t\terr &&\n\t\t\ttypeof err === 'object' &&\n\t\t\t'code' in err &&\n\t\t\terr.code === 'ENOENT'\n\t\t) {\n\t\t\treturn undefined;\n\t\t}\n\t\t// For other errors (gh exists but fails), throw a typed error\n\t\tthrow new GithubTokenResolutionError(\n\t\t\t'gh-cli',\n\t\t\t'Failed to invoke GitHub CLI (gh auth token)',\n\t\t\terr,\n\t\t);\n\t}\n}\n","import { z } from 'zod';\nimport type { CacheManager } from '@/cache/types';\nimport {\n\tGitHubApiError,\n\ttype MarkdownSourceError,\n\tNotFoundError,\n\tPrivateRepoError,\n\tRawFetchError,\n} from '@/sources/errors';\nimport { resolveFetch } from '@/sources/helpers/resolveFetch';\nimport { resolveGithubToken } from '@/sources/resolveGithubToken';\nimport type { MarkdownSource } from '@/sources/types';\n\nconst GHContentsSchema = z.object({\n\tcontent: z.string(),\n\tencoding: z.literal('base64'),\n});\n\n// Minimal Contents API client\nexport class GitHubContentsApiSource implements MarkdownSource {\n\tconstructor(\n\t\tprivate owner: string,\n\t\tprivate repo: string,\n\t\tprivate ref: string,\n\t\tprivate filePath: string,\n\t\tprivate token?: string,\n\t) {}\n\tid() {\n\t\treturn `github:${this.owner}/${this.repo}@${this.ref}:${this.filePath}`;\n\t}\n\n\tasync read(cache?: CacheManager): Promise<string> {\n\t\tconst sourceId = this.id();\n\t\tconst url = `https://api.github.com/repos/${this.owner}/${this.repo}/contents/${encodeURIComponent(this.filePath)}?ref=${encodeURIComponent(this.ref)}`;\n\t\tconst headers: Record<string, string> = {\n\t\t\tAccept: 'application/vnd.github+json',\n\t\t\t'User-Agent': 'awesome-pages-parser',\n\t\t};\n\t\tconst token =\n\t\t\tthis.token ??\n\t\t\t(await resolveGithubToken({\n\t\t\t\thost: 'github.com',\n\t\t\t\towner: this.owner,\n\t\t\t\trepo: this.repo,\n\t\t\t}));\n\t\tif (token) headers.Authorization = `Bearer ${token}`;\n\n\t\t// Add conditional headers from cache\n\t\tif (cache) {\n\t\t\tconst cached = cache.getEntry(sourceId);\n\t\t\tif (cached && cached.kind === 'remote') {\n\t\t\t\tif (cached.etag) {\n\t\t\t\t\theaders['If-None-Match'] = cached.etag;\n\t\t\t\t}\n\t\t\t\tif (cached.lastModified) {\n\t\t\t\t\theaders['If-Modified-Since'] = cached.lastModified;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst fetchFn = await resolveFetch();\n\n\t\t// --- RAW-FIRST when no token (fast path for public repos) ---\n\t\tlet rawFallbackHint: MarkdownSourceError | null = null;\n\t\tif (!token) {\n\t\t\tconst rawUrl = `https://raw.githubusercontent.com/${this.owner}/${this.repo}/${this.ref}/${this.filePath}`;\n\t\t\tconst rawHeaders: Record<string, string> = {};\n\n\t\t\t// Add conditional headers for raw endpoint too\n\t\t\tif (cache) {\n\t\t\t\tconst cached = cache.getEntry(sourceId);\n\t\t\t\tif (cached && cached.kind === 'remote') {\n\t\t\t\t\tif (cached.etag) {\n\t\t\t\t\t\trawHeaders['If-None-Match'] = cached.etag;\n\t\t\t\t\t}\n\t\t\t\t\tif (cached.lastModified) {\n\t\t\t\t\t\trawHeaders['If-Modified-Since'] = cached.lastModified;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst rawRes = await fetchFn(\n\t\t\t\trawUrl,\n\t\t\t\tObject.keys(rawHeaders).length > 0\n\t\t\t\t\t? { headers: rawHeaders }\n\t\t\t\t\t: undefined,\n\t\t\t);\n\n\t\t\tif (rawRes.status === 304) {\n\t\t\t\t// Content not modified - update cache and re-fetch without conditional headers\n\t\t\t\t// (we don't store content, so we need to fetch again)\n\t\t\t\tif (cache) {\n\t\t\t\t\tcache.setEntry(sourceId, {\n\t\t\t\t\t\tkind: 'remote',\n\t\t\t\t\t\tetag: rawRes.headers.get('etag') || undefined,\n\t\t\t\t\t\tlastModified: rawRes.headers.get('last-modified') || undefined,\n\t\t\t\t\t\tlastSeen: new Date().toISOString(),\n\t\t\t\t\t\tlastStatus: 304,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\t// Fetch again without conditional headers to get the content\n\t\t\t\tconst freshRes = await fetchFn(rawUrl);\n\t\t\t\tif (freshRes.ok) {\n\t\t\t\t\treturn await freshRes.text();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (rawRes.ok) {\n\t\t\t\t// Update cache on successful response\n\t\t\t\tif (cache) {\n\t\t\t\t\tcache.setEntry(sourceId, {\n\t\t\t\t\t\tkind: 'remote',\n\t\t\t\t\t\tetag: rawRes.headers.get('etag') || undefined,\n\t\t\t\t\t\tlastModified: rawRes.headers.get('last-modified') || undefined,\n\t\t\t\t\t\tlastSeen: new Date().toISOString(),\n\t\t\t\t\t\tlastStatus: rawRes.status,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn await rawRes.text();\n\t\t\t}\n\t\t\t// RAW failed → for 403/404 we keep a typed hint and fall through to the Contents API\n\t\t\tif (rawRes.status === 403) {\n\t\t\t\trawFallbackHint = new PrivateRepoError(this.id());\n\t\t\t} else if (rawRes.status === 404) {\n\t\t\t\trawFallbackHint = new NotFoundError(this.id());\n\t\t\t} else {\n\t\t\t\tconst body = await rawRes.text().catch(() => '');\n\t\t\t\tthrow new RawFetchError(rawRes.status, this.id(), body.slice(0, 200));\n\t\t\t}\n\t\t}\n\n\t\tconst res = await fetchFn(url, { headers });\n\n\t\t// Handle 304 Not Modified\n\t\tif (res.status === 304) {\n\t\t\tif (cache) {\n\t\t\t\tcache.setEntry(sourceId, {\n\t\t\t\t\tkind: 'remote',\n\t\t\t\t\tetag: res.headers.get('etag') || undefined,\n\t\t\t\t\tlastModified: res.headers.get('last-modified') || undefined,\n\t\t\t\t\tlastSeen: new Date().toISOString(),\n\t\t\t\t\tlastStatus: 304,\n\t\t\t\t});\n\t\t\t}\n\t\t\t// Fetch again without conditional headers to get the content\n\t\t\tconst freshHeaders = { ...headers };\n\t\t\tdelete freshHeaders['If-None-Match'];\n\t\t\tdelete freshHeaders['If-Modified-Since'];\n\t\t\tconst freshRes = await fetchFn(url, { headers: freshHeaders });\n\t\t\tif (!freshRes.ok) {\n\t\t\t\tconst body = await freshRes.text().catch(() => '');\n\t\t\t\tthrow new GitHubApiError(freshRes.status, this.id(), body);\n\t\t\t}\n\t\t\tconst raw = await freshRes.json();\n\t\t\tconst parsed = GHContentsSchema.safeParse(raw);\n\t\t\tif (!parsed.success) {\n\t\t\t\tthrow new GitHubApiError(\n\t\t\t\t\t200,\n\t\t\t\t\tthis.id(),\n\t\t\t\t\t'Unexpected GitHub contents response shape',\n\t\t\t\t);\n\t\t\t}\n\t\t\tconst buf = Buffer.from(parsed.data.content, 'base64');\n\t\t\treturn buf.toString('utf8');\n\t\t}\n\n\t\tif (!res.ok) {\n\t\t\tconst body = await res.text().catch(() => '');\n\t\t\tif (rawFallbackHint) {\n\t\t\t\trawFallbackHint.cause = body;\n\t\t\t\tthrow rawFallbackHint;\n\t\t\t}\n\t\t\tthrow new GitHubApiError(res.status, this.id(), body);\n\t\t}\n\n\t\tconst raw = await res.json();\n\t\tconst parsed = GHContentsSchema.safeParse(raw);\n\t\tif (!parsed.success) {\n\t\t\tthrow new GitHubApiError(\n\t\t\t\t200,\n\t\t\t\tthis.id(),\n\t\t\t\t'Unexpected GitHub contents response shape',\n\t\t\t);\n\t\t}\n\n\t\t// Update cache on successful response\n\t\tif (cache) {\n\t\t\tcache.setEntry(sourceId, {\n\t\t\t\tkind: 'remote',\n\t\t\t\tetag: res.headers.get('etag') || undefined,\n\t\t\t\tlastModified: res.headers.get('last-modified') || undefined,\n\t\t\t\tlastSeen: new Date().toISOString(),\n\t\t\t\tlastStatus: res.status,\n\t\t\t});\n\t\t}\n\n\t\tconst buf = Buffer.from(parsed.data.content, 'base64');\n\t\treturn buf.toString('utf8');\n\t}\n}\n","import type { CacheManager } from '@/cache/types';\nimport {\n\tMarkdownSourceError,\n\tUnsupportedMimeTypeError,\n} from '@/sources/errors';\nimport { type FetchLike, resolveFetch } from '@/sources/helpers/resolveFetch';\nimport type { MarkdownSource } from '@/sources/types';\n\nexport interface HttpRawOptions {\n\t/** Allowed MIME types (default cobre os cenários comuns) */\n\tallowedContentTypes?: readonly string[];\n\t/** Timeout em ms (default 10s) */\n\ttimeoutMs?: number;\n\t/** Limite de tamanho em bytes (Content-Length) antes de baixar (default: 2MB) */\n\tmaxBytes?: number;\n\t/** Aceitar extensão .md como fallback mesmo que o Content-Type seja “genérico” */\n\tallowMdExtensionFallback?: boolean;\n\t/** User-Agent customizado (default: 'awesome-pages-parser') */\n\tuserAgent?: string;\n\t/** Função de fetch injetável para testes */\n\tfetchFn?: FetchLike;\n}\n\nconst DEFAULT_ALLOWED_CT = [\n\t'text/markdown',\n\t'text/x-markdown',\n\t'text/plain',\n\t'application/octet-stream',\n] as const;\n\nconst DEFAULTS: Required<\n\tPick<\n\t\tHttpRawOptions,\n\t\t| 'allowedContentTypes'\n\t\t| 'timeoutMs'\n\t\t| 'maxBytes'\n\t\t| 'allowMdExtensionFallback'\n\t\t| 'userAgent'\n\t>\n> = {\n\tallowedContentTypes: DEFAULT_ALLOWED_CT,\n\ttimeoutMs: 10_000,\n\tmaxBytes: 2 * 1024 * 1024, // 2MB\n\tallowMdExtensionFallback: true,\n\tuserAgent: 'awesome-pages-parser',\n};\n\nexport class HttpRawSource implements MarkdownSource {\n\tconstructor(\n\t\tprivate url: string,\n\t\tprivate opt: HttpRawOptions = {},\n\t) {}\n\n\tid(): string {\n\t\treturn `http:${this.url}`;\n\t}\n\n\tasync read(cache?: CacheManager): Promise<string> {\n\t\tconst sourceId = this.id();\n\t\tconst {\n\t\t\tallowedContentTypes,\n\t\t\ttimeoutMs,\n\t\t\tmaxBytes,\n\t\t\tallowMdExtensionFallback,\n\t\t\tuserAgent,\n\t\t} = { ...DEFAULTS, ...this.opt };\n\n\t\tconst fetchFn = await resolveFetch();\n\n\t\t// Timeout por AbortController\n\t\tconst ctl = new AbortController();\n\t\tconst timer = setTimeout(() => ctl.abort(), timeoutMs);\n\n\t\tconst headers: Record<string, string> = {\n\t\t\t'User-Agent': userAgent,\n\t\t\tAccept: '*/*',\n\t\t};\n\n\t\t// Add conditional headers from cache\n\t\tif (cache) {\n\t\t\tconst cached = cache.getEntry(sourceId);\n\t\t\tif (cached && cached.kind === 'remote') {\n\t\t\t\tif (cached.etag) {\n\t\t\t\t\theaders['If-None-Match'] = cached.etag;\n\t\t\t\t}\n\t\t\t\tif (cached.lastModified) {\n\t\t\t\t\theaders['If-Modified-Since'] = cached.lastModified;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tlet res: Response;\n\t\ttry {\n\t\t\tres = await fetchFn(this.url, {\n\t\t\t\tredirect: 'follow',\n\t\t\t\theaders,\n\t\t\t\tsignal: ctl.signal,\n\t\t\t});\n\t\t} catch (err) {\n\t\t\tclearTimeout(timer);\n\t\t\tthrow new MarkdownSourceError(\n\t\t\t\t`Network error for ${this.url}`,\n\t\t\t\t'HTTP_FETCH',\n\t\t\t\terr,\n\t\t\t);\n\t\t} finally {\n\t\t\tclearTimeout(timer);\n\t\t}\n\n\t\t// Handle 304 Not Modified\n\t\tlet was304 = false;\n\t\tif (res.status === 304) {\n\t\t\twas304 = true;\n\t\t\tif (cache) {\n\t\t\t\tcache.setEntry(sourceId, {\n\t\t\t\t\tkind: 'remote',\n\t\t\t\t\tetag: res.headers.get('etag') || undefined,\n\t\t\t\t\tlastModified: res.headers.get('last-modified') || undefined,\n\t\t\t\t\tlastSeen: new Date().toISOString(),\n\t\t\t\t\tlastStatus: 304,\n\t\t\t\t});\n\t\t\t}\n\t\t\t// Fetch again without conditional headers to get the content\n\t\t\tconst freshHeaders = {\n\t\t\t\t'User-Agent': userAgent,\n\t\t\t\tAccept: '*/*',\n\t\t\t};\n\t\t\tconst freshTimer = setTimeout(() => ctl.abort(), timeoutMs);\n\t\t\ttry {\n\t\t\t\tres = await fetchFn(this.url, {\n\t\t\t\t\tredirect: 'follow',\n\t\t\t\t\theaders: freshHeaders,\n\t\t\t\t\tsignal: ctl.signal,\n\t\t\t\t});\n\t\t\t} catch (err) {\n\t\t\t\tclearTimeout(freshTimer);\n\t\t\t\tthrow new MarkdownSourceError(\n\t\t\t\t\t`Network error for ${this.url}`,\n\t\t\t\t\t'HTTP_FETCH',\n\t\t\t\t\terr,\n\t\t\t\t);\n\t\t\t} finally {\n\t\t\t\tclearTimeout(freshTimer);\n\t\t\t}\n\t\t}\n\n\t\t// Status check\n\t\tif (!res.ok) {\n\t\t\tlet body = '';\n\t\t\ttry {\n\t\t\t\tbody = await res.text();\n\t\t\t} catch {\n\t\t\t\t/* ignore */\n\t\t\t}\n\t\t\tthrow new MarkdownSourceError(\n\t\t\t\t`HTTP ${res.status} for ${this.url}`,\n\t\t\t\t'HTTP_STATUS',\n\t\t\t\tbody.slice(0, 200),\n\t\t\t);\n\t\t}\n\n\t\t// Tamanho (Content-Length) se presente\n\t\tconst lenHeader = res.headers.get('content-length');\n\t\tif (lenHeader) {\n\t\t\tconst len = Number(lenHeader);\n\t\t\tif (!Number.isNaN(len) && len > maxBytes) {\n\t\t\t\tthrow new MarkdownSourceError(\n\t\t\t\t\t`Response too large (${len} bytes) for ${this.url}`,\n\t\t\t\t\t'HTTP_MAX_SIZE',\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\t// Content-Type check (com fallback de extensão .md)\n\t\tconst ctFull = res.headers.get('content-type');\n\t\tconst ct = ctFull ? ctFull.split(';')[0].trim().toLowerCase() : null;\n\n\t\tconst isMdExt = this.url.toLowerCase().endsWith('.md');\n\t\tconst ctAllowed = ct ? allowedContentTypes.includes(ct) : false;\n\n\t\tconst accept = ctAllowed || (allowMdExtensionFallback && isMdExt);\n\n\t\tif (!accept) {\n\t\t\tthrow new UnsupportedMimeTypeError(this.url, ct, allowedContentTypes);\n\t\t}\n\n\t\t// Baixa como texto (para streams enormes, poderia ler incrementalmente)\n\t\tconst text = await res.text();\n\n\t\t// Checagem final de tamanho (caso Content-Length não estivesse presente)\n\t\tif (text.length > maxBytes) {\n\t\t\tthrow new MarkdownSourceError(\n\t\t\t\t`Response too large after download (${text.length} bytes) for ${this.url}`,\n\t\t\t\t'HTTP_MAX_SIZE',\n\t\t\t);\n\t\t}\n\n\t\t// Update cache on successful response\n\t\tif (cache && !was304) {\n\t\t\tcache.setEntry(sourceId, {\n\t\t\t\tkind: 'remote',\n\t\t\t\tetag: res.headers.get('etag') || undefined,\n\t\t\t\tlastModified: res.headers.get('last-modified') || undefined,\n\t\t\t\tlastSeen: new Date().toISOString(),\n\t\t\t\tlastStatus: res.status,\n\t\t\t});\n\t\t}\n\n\t\treturn text;\n\t}\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport type { CacheManager } from '@/cache/types';\nimport type { MarkdownSource } from './types.js';\n\nexport class LocalFileSource implements MarkdownSource {\n\tconstructor(private filepath: string) {}\n\tid() {\n\t\treturn `local:${path.resolve(this.filepath)}`;\n\t}\n\tasync read(cache?: CacheManager): Promise<string> {\n\t\tconst sourceId = this.id();\n\n\t\t// Get file stats for cache\n\t\tif (cache) {\n\t\t\tconst stats = await fs.stat(this.filepath);\n\t\t\tcache.setEntry(sourceId, {\n\t\t\t\tkind: 'local',\n\t\t\t\tmtimeMs: stats.mtimeMs,\n\t\t\t\tsize: stats.size,\n\t\t\t\tlastSeen: new Date().toISOString(),\n\t\t\t});\n\t\t}\n\n\t\treturn fs.readFile(this.filepath, 'utf8');\n\t}\n}\n","import { GitHubContentsApiSource } from '@/sources/githubContents';\nimport { HttpRawSource } from '@/sources/httpRawSource';\nimport { LocalFileSource } from '@/sources/localFile';\nimport type { MarkdownSource } from '@/sources/types';\n\nexport interface CreateSourceOpts {\n\tgithubToken?: string;\n}\n\nexport function createSource(\n\tinput: string,\n\topts: CreateSourceOpts = {},\n): MarkdownSource {\n\t// github://owner/repo@ref:path\n\tconst m = input.match(/^github:\\/\\/([^/]+)\\/([^@]+)@([^:]+):(.+)$/);\n\tif (m) {\n\t\tconst [, owner, repo, ref, filePath] = m;\n\t\treturn new GitHubContentsApiSource(\n\t\t\towner,\n\t\t\trepo,\n\t\t\tref,\n\t\t\tfilePath,\n\t\t\topts.githubToken,\n\t\t);\n\t}\n\tif (/^https?:\\/\\//i.test(input)) {\n\t\tconsole.log('Creating HttpRawSource for', input);\n\t\treturn new HttpRawSource(input);\n\t}\n\n\treturn new LocalFileSource(input);\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport fg from 'fast-glob';\nimport { generateBookmarksHtml } from '@/api/artifacts/generateBookmarksHtml';\nimport { generateCsv } from '@/api/artifacts/generateCsv';\nimport { generateJsonFeed } from '@/api/artifacts/generateJsonFeed';\nimport { generateRssXml } from '@/api/artifacts/generateRssXml';\nimport { generateSitemap } from '@/api/artifacts/generateSitemap';\nimport { buildPlaceholderContext } from '@/api/helpers/placeholderContext';\nimport { renderTemplate } from '@/api/helpers/renderTemplate';\nimport { CacheManager, NoopCacheManager } from '@/cache/manager';\nimport { buildIndex } from '@/core/helpers/buildIndex';\nimport { mdastToDomain } from '@/core/mdastToDomain';\nimport { markdownToAst } from '@/core/parser';\nimport type { DomainV1 } from '@/schemas/v1/domain.v1';\nimport { createSource } from '@/sources/createSource';\nimport type { Artifact, ParseResultFile } from './index';\nimport type { NormalizedOptions } from './schema';\n\nexport async function runParse(\n\topts: NormalizedOptions,\n): Promise<ParseResultFile[]> {\n\tconst results: ParseResultFile[] = [];\n\n\t// Load cache if enabled\n\tconst cache = opts.cache\n\t\t? await CacheManager.load(opts.cachePath)\n\t\t: new NoopCacheManager();\n\n\ttry {\n\t\tfor (const spec of opts.sources) {\n\t\t\tconst strict = spec.strict ?? opts.strict ?? false;\n\n\t\t\tfor (const from of spec.from) {\n\t\t\t\tconst isHttp = /^https?:\\/\\//i.test(from);\n\t\t\t\tconst isGithub = /^github:\\/\\//i.test(from);\n\t\t\t\tconst isLocal = !isHttp && !isGithub;\n\n\t\t\t\tlet inputs: string[] = [];\n\n\t\t\t\tif (isLocal) {\n\t\t\t\t\tconst hasGlob = /[*?[\\]{},]/.test(from);\n\t\t\t\t\tif (hasGlob) {\n\t\t\t\t\t\tconst matches = await fg(from, {\n\t\t\t\t\t\t\tcwd: opts.rootDir,\n\t\t\t\t\t\t\tabsolute: true,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tinputs = matches;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst abs = path.isAbsolute(from)\n\t\t\t\t\t\t\t? from\n\t\t\t\t\t\t\t: path.join(opts.rootDir, from);\n\t\t\t\t\t\tinputs = [abs];\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tinputs = [from];\n\t\t\t\t}\n\n\t\t\t\tfor (const input of inputs) {\n\t\t\t\t\tconst source = createSource(input, { githubToken: opts.githubToken });\n\t\t\t\t\tconst markdown = await source.read(cache);\n\t\t\t\t\tconst sourceId = source.id();\n\n\t\t\t\t\tconst {\n\t\t\t\t\t\ttree,\n\t\t\t\t\t\ttitle,\n\t\t\t\t\t\tdescription,\n\t\t\t\t\t\tdescriptionHtml,\n\t\t\t\t\t\tfrontmatter,\n\t\t\t\t\t\tlanguage,\n\t\t\t\t\t} = await markdownToAst(markdown, sourceId);\n\n\t\t\t\t\tconst domain: DomainV1 = mdastToDomain(tree, {\n\t\t\t\t\t\ttitle,\n\t\t\t\t\t\tdescription,\n\t\t\t\t\t\tdescriptionHtml,\n\t\t\t\t\t\tfrontmatter,\n\t\t\t\t\t\tlanguage,\n\t\t\t\t\t\tgeneratedAt: new Date().toISOString(),\n\t\t\t\t\t\tsource: sourceId,\n\t\t\t\t\t\tstrict,\n\t\t\t\t\t});\n\n\t\t\t\t\tconst baseCtx = buildPlaceholderContext({\n\t\t\t\t\t\tinput,\n\t\t\t\t\t\tsourceId,\n\t\t\t\t\t\trootDir: opts.rootDir,\n\t\t\t\t\t});\n\n\t\t\t\t\tfor (const out of spec.outputs) {\n\t\t\t\t\t\tfor (const artifact of out.artifact) {\n\t\t\t\t\t\t\tconst content = await emitArtifact(artifact, domain, sourceId);\n\t\t\t\t\t\t\tconst rendered = renderTemplate(out.to, {\n\t\t\t\t\t\t\t\t...baseCtx,\n\t\t\t\t\t\t\t\tartifact,\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tconst finalPath = path.isAbsolute(rendered)\n\t\t\t\t\t\t\t\t? rendered\n\t\t\t\t\t\t\t\t: path.join(opts.rootDir, rendered);\n\n\t\t\t\t\t\t\tawait fs.mkdir(path.dirname(finalPath), { recursive: true });\n\t\t\t\t\t\t\tawait fs.writeFile(finalPath, content, 'utf8');\n\n\t\t\t\t\t\t\tresults.push({\n\t\t\t\t\t\t\t\tfile: finalPath,\n\t\t\t\t\t\t\t\tartifact,\n\t\t\t\t\t\t\t\tsourceId,\n\t\t\t\t\t\t\t\tbytes: Buffer.byteLength(content, 'utf8'),\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} finally {\n\t\t// Always save cache at the end (even if there were errors)\n\t\tif (opts.cache) {\n\t\t\tawait cache.save();\n\t\t}\n\t}\n\n\treturn results;\n}\n\nasync function emitArtifact(\n\tartifact: Artifact,\n\tdomain: DomainV1,\n\tsourceId: string,\n): Promise<string> {\n\tswitch (artifact) {\n\t\tcase 'domain':\n\t\t\treturn JSON.stringify(domain, null, 2);\n\t\tcase 'index':\n\t\t\treturn JSON.stringify(buildIndex(domain), null, 2);\n\t\tcase 'bookmarks':\n\t\t\treturn generateBookmarksHtml(domain);\n\t\tcase 'sitemap':\n\t\t\treturn generateSitemap(domain);\n\t\tcase 'rss-json':\n\t\t\treturn generateJsonFeed(domain);\n\t\tcase 'rss-xml':\n\t\t\treturn generateRssXml(domain);\n\t\tcase 'csv':\n\t\t\treturn generateCsv(domain);\n\t}\n}\n","import { z } from 'zod';\nimport type { Artifact } from './index';\n\nexport const ArtifactSchema = z.enum([\n\t'domain',\n\t'index',\n\t'bookmarks',\n\t'sitemap',\n\t'rss-json',\n\t'rss-xml',\n\t'csv',\n]);\nexport type ArtifactZ = z.infer<typeof ArtifactSchema>;\n\nexport const OutputTargetSchema = z.object({\n\tartifact: z.union([ArtifactSchema, z.array(ArtifactSchema).min(1)]),\n\tto: z.string().min(1),\n});\n\nexport const SourceSpecSchema = z.object({\n\tfrom: z.union([z.string().min(1), z.array(z.string().min(1)).min(1)]),\n\toutputs: z.array(OutputTargetSchema).min(1),\n\tstrict: z.boolean().optional(),\n});\n\nexport const ParseOptionsSchema = z.object({\n\tstrict: z.boolean().optional(),\n\tconcurrency: z.number().int().positive().max(128).default(8),\n\tgithubToken: z.string().min(1).optional(),\n\trootDir: z.string().min(1).optional(),\n\tcache: z.boolean().optional().default(true),\n\tcachePath: z.string().min(1).optional(),\n\tsources: z.array(SourceSpecSchema).min(1),\n});\n\nexport type NormalizedOutput = {\n\tartifact: Artifact[];\n\tto: string;\n};\n\nexport type NormalizedSource = {\n\tfrom: string[];\n\toutputs: NormalizedOutput[];\n\tstrict?: boolean;\n};\n\nexport type NormalizedOptions = {\n\tstrict?: boolean;\n\tconcurrency: number;\n\tgithubToken?: string;\n\trootDir: string;\n\tcache: boolean;\n\tcachePath: string;\n\tsources: NormalizedSource[];\n};\n\nexport function parseAndNormalizeOptions(input: unknown): NormalizedOptions {\n\tconst parsed = ParseOptionsSchema.parse(input);\n\n\tconst rootDir = parsed.rootDir ?? process.cwd();\n\tconst cachePath =\n\t\tparsed.cachePath ?? `${rootDir}/.awesome-pages/cache.v1.json`;\n\n\treturn {\n\t\tstrict: parsed.strict,\n\t\tconcurrency: parsed.concurrency,\n\t\tgithubToken: parsed.githubToken,\n\t\trootDir,\n\t\tcache: parsed.cache,\n\t\tcachePath,\n\t\tsources: parsed.sources.map((s) => ({\n\t\t\tstrict: s.strict,\n\t\t\tfrom: Array.isArray(s.from) ? s.from : [s.from],\n\t\t\toutputs: s.outputs.map((o) => ({\n\t\t\t\tartifact: Array.isArray(o.artifact) ? o.artifact : [o.artifact],\n\t\t\t\tto: o.to,\n\t\t\t})),\n\t\t})),\n\t};\n}\n","import { runParse } from '@/api/parseRunner';\nimport { parseAndNormalizeOptions } from '@/api/schema';\n\nexport type Artifact =\n\t| 'domain'\n\t| 'index'\n\t| 'bookmarks'\n\t| 'sitemap'\n\t| 'rss-json'\n\t| 'rss-xml'\n\t| 'csv';\n\nexport type OutputTarget = {\n\t/** One or more artifacts to emit for this source */\n\tartifact: Artifact | Artifact[];\n\t/** Output path template with placeholders like {artifact}, {name}, {dir}, {ext}, {owner}, {repo}, {ref}, {path} */\n\tto: string;\n};\n\nexport type SourceSpec = {\n\tfrom: string | string[];\n\toutputs: OutputTarget[];\n\tstrict?: boolean;\n};\n\nexport type ParseOptions = {\n\tstrict?: boolean;\n\tconcurrency?: number;\n\tgithubToken?: string;\n\trootDir?: string;\n\tcache?: boolean;\n\tcachePath?: string;\n\tsources: SourceSpec[];\n};\n\nexport type ParseResultFile = {\n\tfile: string;\n\tartifact: Artifact;\n\tsourceId: string;\n\tbytes: number;\n};\n\n/**\n * High-level API: parse multiple markdown sources and emit one or more artifacts per source.\n */\nexport async function parse(opts: ParseOptions): Promise<ParseResultFile[]> {\n\tconst normalized = parseAndNormalizeOptions(opts);\n\treturn runParse(normalized);\n}\n","import { zodToJsonSchema } from 'zod-to-json-schema';\nimport { DomainV1Base } from './domain.v1';\n\n/**\n * Gera o JSON Schema para DomainV1\n * Usa o schema base (sem transforms) que representa a estrutura final\n */\nexport function generateDomainV1JsonSchema() {\n\treturn zodToJsonSchema(DomainV1Base, {\n\t\tname: 'awesome-pages-domain.v1',\n\t\t$refStrategy: 'none',\n\t});\n}\n"]}