@eqtylab/docs 0.3.4 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/README.md +45 -12
  2. package/dist/{chunk-VJN3HXKM.js → chunk-LNQV7TVH.js} +18 -6
  3. package/dist/chunk-LNQV7TVH.js.map +1 -0
  4. package/dist/chunk-OM7745ZQ.js +77 -0
  5. package/dist/chunk-OM7745ZQ.js.map +1 -0
  6. package/dist/{chunk-IWKZQ4CW.js → chunk-VNQZJMDO.js} +4 -2
  7. package/dist/chunk-VNQZJMDO.js.map +1 -0
  8. package/dist/{chunk-K7PJRTK3.js → chunk-X4LT7ASQ.js} +31 -4
  9. package/dist/chunk-X4LT7ASQ.js.map +1 -0
  10. package/dist/config.d.ts +10 -1
  11. package/dist/config.js +1 -1
  12. package/dist/index.js +297 -28
  13. package/dist/index.js.map +1 -1
  14. package/dist/internal/extract-versions.d.ts +33 -0
  15. package/dist/internal/rehype-base-url.d.ts +9 -2
  16. package/dist/internal/rehype-base-url.js +1 -1
  17. package/dist/internal/remark-archive-document.d.ts +6 -0
  18. package/dist/loaders.d.ts +5 -5
  19. package/dist/loaders.js +18 -7
  20. package/dist/loaders.js.map +1 -1
  21. package/dist/nav.d.ts +4 -0
  22. package/dist/nav.js +21 -7
  23. package/dist/nav.js.map +1 -1
  24. package/dist/paths.d.ts +25 -3
  25. package/dist/paths.js +1 -1
  26. package/dist/runtime/chrome/GlobalSearch.tsx +7 -2
  27. package/dist/runtime/chrome/Header.astro +9 -6
  28. package/dist/runtime/chrome/NavDrawer.astro +44 -1
  29. package/dist/runtime/chrome/NavTree.astro +1 -11
  30. package/dist/runtime/chrome/Prose.astro +18 -4
  31. package/dist/runtime/chrome/VersionBanner.astro +19 -0
  32. package/dist/runtime/chrome/VersionSwitcher.tsx +105 -0
  33. package/dist/runtime/components/CodeFence.astro +1 -1
  34. package/dist/runtime/layouts/DocsPage.astro +36 -4
  35. package/dist/runtime/layouts/DocsShell.astro +14 -3
  36. package/dist/runtime/layouts/RedirectPage.astro +19 -0
  37. package/dist/runtime/lib/nav-data.ts +44 -15
  38. package/dist/runtime/lib/versions-ui.ts +12 -0
  39. package/dist/runtime/routes/docs-md.ts +50 -11
  40. package/dist/runtime/routes/docs.astro +182 -73
  41. package/dist/runtime/routes/llms-txt.ts +2 -1
  42. package/dist/runtime/routes/not-found.astro +27 -0
  43. package/dist/runtime/styles/prose.css +9 -2
  44. package/dist/schema.d.ts +1 -0
  45. package/dist/schema.js +1 -1
  46. package/dist/versions.d.ts +37 -0
  47. package/package.json +2 -2
  48. package/dist/chunk-GSSSQTEV.js +0 -51
  49. package/dist/chunk-GSSSQTEV.js.map +0 -1
  50. package/dist/chunk-IWKZQ4CW.js.map +0 -1
  51. package/dist/chunk-K7PJRTK3.js.map +0 -1
  52. package/dist/chunk-VJN3HXKM.js.map +0 -1
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/internal/assert-mdx-only.ts","../src/internal/microlighter-grammars.ts","../src/internal/pagefind.ts","../src/internal/rehype-code-fence.ts","../src/internal/rehype-prose-scope.ts","../src/internal/rehype-relative-links.ts","../src/internal/rehype-table-columns.ts","../src/internal/scan-consumer-pages.ts","../src/internal/virtual-config.ts","../src/index.ts"],"names":["path","fileURLToPath","visit","fs","globSync"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Only MDX supports the component overrides and the loader globs `.mdx` only,\n * so a stray `.md` would be silently absent from the site. Fail loudly instead.\n */\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { globSync } from 'tinyglobby';\n\nexport function assertMdxOnly(contentDir: URL): void {\n const dir = fileURLToPath(contentDir);\n\n let strays: string[] = [];\n try {\n strays = globSync(['**/*.md'], { cwd: dir, absolute: false });\n } catch {\n return;\n }\n if (strays.length === 0) return;\n\n const list = strays\n .sort()\n .map((file) => ` - ${file} -> ${file.replace(/\\.md$/i, '.mdx')}`)\n .join('\\n');\n\n throw new Error(\n `[@eqtylab/docs] Found ${strays.length} Markdown file${strays.length > 1 ? 's' : ''} in ` +\n `${path.relative(process.cwd(), dir) || dir}:\\n${list}\\n\\n` +\n `Docs content must be .mdx. Only MDX supports the component overrides that render\\n` +\n `tables, code fences and callouts through Equality, so a .md page would look\\n` +\n `different from every other page. Renaming is usually the only change needed --\\n` +\n `MDX is a superset of Markdown.`\n );\n}\n","/**\n * Emits microlighter's grammar modules beside the chunks that ask for them.\n * CodeBlock loads grammars with `import('./grammars/' + language)`, which no\n * bundler can expand; without this the build succeeds and code renders unhighlighted.\n */\nimport { readdirSync, readFileSync } from 'node:fs';\nimport { createRequire } from 'node:module';\nimport path from 'node:path';\nimport type { AstroIntegrationLogger } from 'astro';\nimport type { Plugin } from 'vite';\n\n/** Residue of the dynamic import in the emitted chunk. */\nconst GRAMMAR_IMPORT = 'grammars/${';\n\n/** Two hops from the consumer: microlighter is a dependency of @eqtylab/equality, which is only a peer here. */\nfunction findGrammarDir(projectRoot: URL): string {\n const requireFromProject = createRequire(new URL('package.json', projectRoot));\n const equalityEntry = requireFromProject.resolve('@eqtylab/equality');\n const requireFromEquality = createRequire(equalityEntry);\n return path.resolve(path.dirname(requireFromEquality.resolve('microlighter')), 'grammars');\n}\n\nexport function microlighterGrammarsPlugin(\n projectRoot: URL,\n logger: AstroIntegrationLogger\n): Plugin {\n return {\n name: 'eqty-docs:microlighter-grammars',\n apply: 'build',\n generateBundle(_options, bundle) {\n const directories = new Set(\n Object.values(bundle)\n .filter((output) => output.type === 'chunk' && output.code.includes(GRAMMAR_IMPORT))\n .map((output) => path.posix.dirname(output.fileName))\n );\n if (directories.size === 0) return;\n\n let grammarDir: string;\n let grammars: string[];\n try {\n grammarDir = findGrammarDir(projectRoot);\n grammars = readdirSync(grammarDir).filter((file) => file.endsWith('.js'));\n } catch (error) {\n // Warn rather than fail the build over highlighting.\n logger.warn(\n 'Code blocks ask for microlighter grammars, but they could not be resolved. ' +\n 'Fenced code will render unhighlighted. Check that @eqtylab/equality is ' +\n `installed in this project.\\n ${String(error)}`\n );\n return;\n }\n\n for (const directory of directories) {\n for (const grammar of grammars) {\n this.emitFile({\n type: 'asset',\n fileName:\n directory === '.' ? `grammars/${grammar}` : `${directory}/grammars/${grammar}`,\n source: readFileSync(path.resolve(grammarDir, grammar), 'utf8'),\n });\n }\n }\n },\n };\n}\n","/**\n * Not `astro-pagefind`: it ships TypeScript, and Node will not compile that under\n * node_modules when this integration reaches it from its own bundle.\n *\n * The build writes the index; dev serves that same index off disk, so it always\n * describes the last build.\n */\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport type { AstroIntegration } from 'astro';\n\nconst INDEX_DIR = 'pagefind';\n\n/** Everything else Pagefind fetches is read as bytes, so the type never reaches a parser. */\nconst MIME: Record<string, string> = {\n '.js': 'text/javascript',\n '.css': 'text/css',\n '.json': 'application/json',\n '.wasm': 'application/wasm',\n};\n\n/** Pagefind collects errors per step and carries on; any of them means no usable index. */\nfunction failOn(\n errors: string[],\n logger: { error: (message: string) => void },\n what: string\n): void {\n if (!errors.length) return;\n errors.forEach((error) => logger.error(error));\n throw new Error(`[@eqtylab/docs] Pagefind could not ${what}.`);\n}\n\nfunction indexRequest(url: string | undefined, base: string): string | null {\n if (!url) return null;\n const pathname = decodeURIComponent(url.split(/[?#]/)[0]);\n const prefix = `${base.replace(/\\/+$/, '')}/${INDEX_DIR}/`;\n return pathname.startsWith(prefix) ? pathname.slice(prefix.length) : null;\n}\n\nexport function pagefindIntegration(): AstroIntegration {\n let indexDir = '';\n\n return {\n name: '@eqtylab/docs/pagefind',\n hooks: {\n 'astro:config:setup'({ config, logger }) {\n indexDir = path.join(fileURLToPath(config.outDir), INDEX_DIR);\n\n if (config.output === 'server') {\n logger.warn(\n 'Output \"server\" emits no static HTML, so there is nothing for Pagefind to index.'\n );\n }\n },\n\n /** Runs ahead of Vite's static middleware and Astro's handler; move it and `/pagefind/*` 404s. */\n 'astro:server:setup'({ server, logger }) {\n const base = server.config.base ?? '/';\n\n logger.info(\n fs.existsSync(indexDir)\n ? 'serving the search index from the last build; rebuild to pick up edits'\n : 'no search index yet — run `astro build` once to search in dev'\n );\n\n server.middlewares.use((req, res, next) => {\n const requested = indexRequest(req.url, base);\n if (requested === null) return next();\n\n const file = path.join(indexDir, requested);\n // The prefix check is what stops `..` climbing out of the index directory.\n if (!file.startsWith(indexDir + path.sep) || !fs.existsSync(file)) return next();\n\n res.setHeader('Content-Type', MIME[path.extname(file)] ?? 'application/octet-stream');\n // The next build rewrites these in place, and a cached fragment would outlive it.\n res.setHeader('Cache-Control', 'no-store');\n fs.createReadStream(file).pipe(res);\n });\n },\n\n /** The last hook of the build, and the first moment every page exists on disk to read. */\n async 'astro:build:done'({ dir, logger }) {\n const outDir = fileURLToPath(dir);\n const { createIndex } = await import('pagefind');\n\n const { index, errors } = await createIndex();\n failOn(errors, logger, 'create an index');\n if (!index) throw new Error('[@eqtylab/docs] Pagefind returned no index.');\n\n const { page_count, errors: addErrors } = await index.addDirectory({ path: outDir });\n failOn(addErrors, logger, 'index the built output');\n\n const { outputPath, errors: writeErrors } = await index.writeFiles({\n outputPath: path.join(outDir, INDEX_DIR),\n });\n failOn(writeErrors, logger, 'write the index');\n\n logger.info(`indexed ${page_count} pages to ${outputPath}`);\n },\n },\n };\n}\n","/**\n * Lifts each fence's source, language and title onto its `<pre>`. Do not recover\n * the source from the rendered slot: `Astro.slots.render()` escapes in dev but not in build.\n */\nimport { visit } from 'unist-util-visit';\n\ninterface Node {\n type: string;\n tagName?: string;\n value?: string;\n properties?: Record<string, unknown>;\n children?: Node[];\n data?: { meta?: string };\n}\n\nfunction textOf(node: Node): string {\n if (node.type === 'text') return node.value ?? '';\n return (node.children ?? []).map(textOf).join('');\n}\n\nfunction classNames(props: Record<string, unknown> | undefined): string[] {\n const raw = props?.className ?? props?.class;\n if (Array.isArray(raw)) return raw.map(String);\n if (typeof raw === 'string') return raw.split(/\\s+/);\n return [];\n}\n\n/** ```ts title=\"button.tsx\" -> \"button.tsx\" */\nfunction titleFromMeta(meta: string | undefined): string | undefined {\n const match = meta?.match(/(?:^|\\s)title=(?:\"([^\"]*)\"|'([^']*)'|(\\S+))/);\n return match ? (match[1] ?? match[2] ?? match[3]) : undefined;\n}\n\nexport function rehypeCodeFence() {\n return function transformer(tree: unknown) {\n visit(tree as never, 'element', (node: Node) => {\n if (node.tagName !== 'pre') return;\n\n const code = (node.children ?? []).find(\n (child) => child.type === 'element' && child.tagName === 'code'\n );\n if (!code) return;\n\n const language = classNames(code.properties)\n .find((name) => name.startsWith('language-'))\n ?.slice('language-'.length);\n\n const title = titleFromMeta(code.data?.meta);\n\n node.properties = {\n ...node.properties,\n dataCode: textOf(code).replace(/\\n$/, ''),\n ...(language ? { dataLanguage: language } : {}),\n ...(title ? { dataTitle: title } : {}),\n };\n });\n };\n}\n","/**\n * Marks the content a page authored as markdown or as plain HTML, so\n * `prose.css` can typeset it without reaching inside a component.\n *\n * MDX parses a component's children as markdown whenever they sit on their own\n * lines, so `<Badge icon=\"Shield\">\\n Primary\\n</Badge>` renders a `<p>` inside\n * the badge — and prettier puts them there. Authoring discipline cannot fix it;\n * the boundary has to be drawn here. Everything below a capitalised JSX tag is\n * that component's business, `<div>` and friends are the page's own.\n */\nimport { SKIP, visit } from 'unist-util-visit';\n\nconst MARKER = 'data-eq-md';\n\ninterface Attribute {\n type: string;\n name?: string | null;\n}\n\ninterface Node {\n type: string;\n name?: string | null;\n properties?: Record<string, unknown>;\n attributes?: Attribute[];\n}\n\n/** Capitalised or dotted JSX names are components; `div`, `span` and friends are not. */\nfunction isComponent(node: Node): boolean {\n if (node.type !== 'mdxJsxFlowElement' && node.type !== 'mdxJsxTextElement') return false;\n const name = node.name;\n return typeof name === 'string' && (/^[A-Z]/.test(name) || name.includes('.'));\n}\n\n/**\n * Structural components that hold the page's own prose rather than content of their own.\n * Without this a heading or list inside a `<TabItem>` would render untypeset.\n */\nconst CONTAINERS = new Set(['Tabs', 'TabItem']);\n\nfunction isContainer(node: Node): boolean {\n return typeof node.name === 'string' && CONTAINERS.has(node.name);\n}\n\nexport function rehypeProseScope() {\n return function transformer(tree: unknown) {\n visit(tree as never, (node: Node) => {\n // A container's children are the page's own markup, so traversal continues into them.\n // The component tag itself is never page markup and never takes the marker.\n if (isComponent(node)) return isContainer(node) ? undefined : SKIP;\n\n if (node.type === 'element') {\n node.properties = { ...node.properties, dataEqMd: '' };\n return undefined;\n }\n\n // Authored HTML. A JSX fragment has no name and nothing to mark.\n if ((node.type === 'mdxJsxFlowElement' || node.type === 'mdxJsxTextElement') && node.name) {\n const attributes = node.attributes ?? [];\n if (!attributes.some((a) => a.type === 'mdxJsxAttribute' && a.name === MARKER)) {\n attributes.push({ type: 'mdxJsxAttribute', name: MARKER, value: '' } as Attribute);\n }\n node.attributes = attributes;\n }\n\n return undefined;\n });\n };\n}\n","/**\n * Resolves authored relative links between content files - `./usage.mdx`,\n * `../guides/index.md#anchor` - into the public URL of the page they name.\n * Markdown's own convention is a path on disk; the browser needs a route.\n *\n * Only files inside the content root are resolved, and only targets that land\n * inside it: a link out of the collection is someone else's URL to own.\n */\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { visit } from 'unist-util-visit';\n\nimport { docsHref, isExternalHref, type PathContext } from '../paths.ts';\n\ninterface ElementNode {\n type: string;\n properties?: Record<string, unknown>;\n}\n\ninterface VFile {\n path?: string;\n}\n\nexport interface RelativeLinkOptions extends PathContext {\n /** Absolute path of the docs content directory. */\n contentRoot: string;\n /** Called with the resolved-but-missing target, so a typo fails loudly. */\n onMissing?: (href: string, filePath: string) => void;\n}\n\nconst CONTENT_EXTENSIONS = ['.mdx', '.md'];\n\n/** True once the id names a file Astro will have turned into a page. */\nfunction hasEntry(contentRoot: string, id: string): boolean {\n const stem = path.join(contentRoot, id);\n return CONTENT_EXTENSIONS.some(\n (ext) => fs.existsSync(stem + ext) || fs.existsSync(path.join(stem, `index${ext}`))\n );\n}\n\n/** A content-relative link, split into the file part and any `#hash` / `?query`. */\nfunction splitTarget(href: string): { target: string; suffix: string } | undefined {\n if (!href || isExternalHref(href)) return undefined;\n // Site-absolute, fragment-only and query-only links are already URLs.\n if (href.startsWith('/') || href.startsWith('#') || href.startsWith('?')) return undefined;\n const match = /^([^#?]*)([#?].*)?$/.exec(href);\n const target = match?.[1];\n if (!target || !/\\.mdx?$/i.test(target)) return undefined;\n return { target, suffix: match?.[2] ?? '' };\n}\n\nexport function rehypeRelativeLinks(options: RelativeLinkOptions) {\n const { contentRoot, onMissing, ...ctx } = options;\n\n return function transformer(tree: unknown, file?: VFile) {\n const filePath = file?.path;\n if (!filePath) return;\n\n // Content files only. A page elsewhere in the project has its own notion of \"here\".\n const fromRoot = path.relative(contentRoot, filePath);\n if (!fromRoot || fromRoot.startsWith('..') || path.isAbsolute(fromRoot)) return;\n\n visit(tree as never, 'element', (node: ElementNode) => {\n const props = node.properties;\n const href = props?.href;\n if (!props || typeof href !== 'string') return;\n\n const split = splitTarget(href);\n if (!split) return;\n\n const absolute = path.resolve(path.dirname(filePath), split.target);\n const relative = path.relative(contentRoot, absolute);\n if (!relative || relative.startsWith('..') || path.isAbsolute(relative)) return;\n\n // Astro's ids are extensionless and drop a folder's `index`, except at the root.\n const id = relative\n .split(path.sep)\n .join('/')\n .replace(/\\.mdx?$/i, '')\n .replace(/\\/index$/, '');\n\n if (!hasEntry(contentRoot, id)) onMissing?.(href, filePath);\n\n props.href = docsHref(id, ctx) + split.suffix;\n });\n };\n}\n","/**\n * Annotates each markdown table with its column count. Equality's `TableContainer`\n * is a CSS grid and collapses to one column without an explicit track list.\n */\nimport { visit } from 'unist-util-visit';\n\ninterface ElementNode {\n type: string;\n tagName?: string;\n properties?: Record<string, unknown>;\n children?: ElementNode[];\n}\n\n/** First `tr` in document order, searching thead before tbody. */\nfunction firstRow(table: ElementNode): ElementNode | undefined {\n let found: ElementNode | undefined;\n visit(table as never, 'element', (node: ElementNode) => {\n if (found) return false;\n if (node.tagName === 'tr') {\n found = node;\n return false;\n }\n return undefined;\n });\n return found;\n}\n\nfunction countCells(row: ElementNode): number {\n return (row.children ?? []).reduce((total, child) => {\n if (child.type !== 'element') return total;\n if (child.tagName !== 'th' && child.tagName !== 'td') return total;\n const span = Number(child.properties?.colSpan ?? child.properties?.colspan ?? 1);\n return total + (Number.isFinite(span) && span > 0 ? span : 1);\n }, 0);\n}\n\nexport function rehypeTableColumns() {\n return function transformer(tree: unknown) {\n visit(tree as never, 'element', (node: ElementNode) => {\n if (node.tagName !== 'table') return;\n const row = firstRow(node);\n const count = row ? countCells(row) : 0;\n if (count <= 0) return;\n node.properties = { ...node.properties, dataColumnCount: String(count) };\n });\n };\n}\n","/**\n * Routes the consumer's own `src/pages` already claim. Astro does NOT de-duplicate\n * injected routes against file-based ones: a path claimed by both is emitted\n * twice and the winner is write order, so yielding has to be explicit here.\n */\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { globSync } from 'tinyglobby';\n\nconst PAGE_EXTENSIONS = ['astro', 'md', 'mdx', 'html', 'ts', 'js'];\n\nexport interface ConsumerPages {\n /** Concrete route paths the consumer's pages generate, normalised without trailing slash. */\n ownedPaths: string[];\n /** Route patterns claimed by consumer pages, e.g. '/[...slug]' or '/404'. */\n claimedPatterns: Set<string>;\n}\n\n/** `index.astro` -> '', `a/b.astro` -> '/a/b', `[...slug].astro` -> '/[...slug]' */\nfunction toRoutePath(relative: string): string {\n const withoutExt = relative.replace(/\\.[^./]+$/, '');\n const segments = withoutExt.split(path.sep).join('/').split('/').filter(Boolean);\n if (segments.at(-1) === 'index') segments.pop();\n return '/' + segments.join('/');\n}\n\nexport function scanConsumerPages(srcDir: URL): ConsumerPages {\n const pagesDir = fileURLToPath(new URL('./pages/', srcDir));\n\n let files: string[] = [];\n try {\n files = globSync([`**/*.{${PAGE_EXTENSIONS.join(',')}}`], {\n cwd: pagesDir,\n absolute: false,\n });\n } catch {\n // No src/pages: a docs-only site.\n return { ownedPaths: [], claimedPatterns: new Set() };\n }\n\n const ownedPaths: string[] = [];\n const claimedPatterns = new Set<string>();\n\n for (const file of files) {\n // Astro ignores files and directories prefixed with `_`.\n if (file.split(path.sep).some((segment) => segment.startsWith('_'))) continue;\n\n const routePath = toRoutePath(file);\n claimedPatterns.add(routePath === '' ? '/' : routePath);\n\n if (!/[[\\]]/.test(file)) {\n ownedPaths.push(routePath.replace(/\\/+$/, '') || '/');\n }\n }\n\n return { ownedPaths, claimedPatterns };\n}\n","/** Serves the resolved config to runtime components, which ship from node_modules and cannot reach the consumer's project by path. */\nimport type { Plugin } from 'vite';\n\nconst MODULE_ID = 'virtual:eqty-docs/config';\nconst RESOLVED_ID = '\\0' + MODULE_ID;\n\nexport function virtualConfigPlugin(getPayload: () => Record<string, unknown>): Plugin {\n return {\n name: 'eqty-docs:virtual-config',\n resolveId(id) {\n return id === MODULE_ID ? RESOLVED_ID : null;\n },\n load(id) {\n if (id !== RESOLVED_ID) return null;\n return `export default ${JSON.stringify(getPayload())};`;\n },\n };\n}\n","import path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport type { AstroIntegration } from 'astro';\n\nimport { resolveConfig, type DocsConfig, type DocsUserConfig } from './config.ts';\nimport { resolveDocsEnv, type DocsEnv } from './env.ts';\nimport { assertMdxOnly } from './internal/assert-mdx-only.ts';\nimport { microlighterGrammarsPlugin } from './internal/microlighter-grammars.ts';\nimport { pagefindIntegration } from './internal/pagefind.ts';\nimport { rehypeBaseUrl } from './internal/rehype-base-url.ts';\nimport { rehypeCodeFence } from './internal/rehype-code-fence.ts';\nimport { rehypeProseScope } from './internal/rehype-prose-scope.ts';\nimport { rehypeRelativeLinks } from './internal/rehype-relative-links.ts';\nimport { rehypeTableColumns } from './internal/rehype-table-columns.ts';\nimport { scanConsumerPages } from './internal/scan-consumer-pages.ts';\nimport { virtualConfigPlugin } from './internal/virtual-config.ts';\n\nexport { resolveConfig, type DocsConfig, type DocsUserConfig } from './config.ts';\nexport { resolveDocsEnv, type DocsEnv } from './env.ts';\n// Do not re-export the loaders: this entry runs in Node when astro.config loads,\n// and they import `astro:content`, which only exists in the Vite graph.\nexport { docsSchema, groupSchema, badgeSchema } from './schema.ts';\nexport * from './types.ts';\n\nexport interface DocsIntegrationOptions extends DocsUserConfig {\n /** Build environment for versioned deploys. Defaults to `resolveDocsEnv()`. */\n env?: Partial<DocsEnv>;\n}\n\n/** Route patterns the integration would like to own, paired with their entrypoints. */\nfunction plannedRoutes(cfg: DocsConfig) {\n const prefix = cfg.pathPrefix ? `/${cfg.pathPrefix.replace(/^\\/|\\/$/g, '')}` : '';\n const routes: Array<{ pattern: string; entrypoint: string; enabled: boolean }> = [\n {\n pattern: `${prefix}/[...slug]`,\n entrypoint: '@eqtylab/docs/routes/docs.astro',\n enabled: cfg.routing.injectPages,\n },\n {\n pattern: `${prefix}/[...slug].md`,\n entrypoint: '@eqtylab/docs/routes/docs-md.ts',\n enabled: cfg.routing.markdownTwins,\n },\n {\n pattern: '/llms.txt',\n entrypoint: '@eqtylab/docs/routes/llms-txt.ts',\n enabled: cfg.routing.markdownTwins,\n },\n {\n pattern: '/404',\n entrypoint: '@eqtylab/docs/routes/not-found.astro',\n enabled: cfg.routing.notFound,\n },\n ];\n return routes.filter((r) => r.enabled);\n}\n\nexport default function docs(\n options: DocsIntegrationOptions = {} as DocsIntegrationOptions\n): AstroIntegration {\n const { env: envOverrides, ...userConfig } = options;\n const cfg = resolveConfig(userConfig);\n const env = resolveDocsEnv(envOverrides);\n\n let payload: Record<string, unknown> = {};\n\n return {\n name: '@eqtylab/docs',\n hooks: {\n async 'astro:config:setup'(params) {\n const { config, injectRoute, injectScript, updateConfig, addWatchFile, logger, command } =\n params;\n\n assertMdxOnly(new URL(`./${cfg.contentDir}/`, config.srcDir));\n\n const consumer = scanConsumerPages(config.srcDir);\n\n for (const route of plannedRoutes(cfg)) {\n if (consumer.claimedPatterns.has(route.pattern)) {\n logger.info(\n `yielding ${route.pattern} to your own src/pages file (docs route not injected)`\n );\n continue;\n }\n injectRoute({ pattern: route.pattern, entrypoint: route.entrypoint, prerender: true });\n }\n\n payload = {\n ...cfg,\n env,\n // Read by the catch-all's getStaticPaths so no path is emitted twice.\n ownedByConsumer: consumer.ownedPaths,\n };\n\n // So `_group.yaml` edits reload in dev.\n if (command === 'dev') {\n addWatchFile(new URL(`./${cfg.contentDir}/`, config.srcDir));\n }\n\n const integrationNames = new Set(config.integrations.map((i) => i.name));\n const added: AstroIntegration[] = [];\n\n if (cfg.autoIntegrations) {\n if (!integrationNames.has('@astrojs/mdx')) {\n const { default: mdx } = await import('@astrojs/mdx');\n added.push(mdx());\n }\n if (!integrationNames.has('@astrojs/react')) {\n const { default: react } = await import('@astrojs/react');\n added.push(react());\n }\n if (cfg.search.provider === 'pagefind' && !integrationNames.has('pagefind')) {\n added.push(pagefindIntegration());\n }\n }\n\n const vitePlugins: unknown[] = [virtualConfigPlugin(() => payload)];\n\n // Shiki tokenises at build time and needs no grammars emitted.\n if (cfg.code.highlighter === 'codeblock') {\n vitePlugins.push(microlighterGrammarsPlugin(config.root, logger));\n }\n\n if (cfg.autoIntegrations) {\n // Cast first: `.flat(Infinity)` over Vite's recursive PluginOption hits TS2589.\n const existing = (config.vite?.plugins ?? []) as unknown[];\n const hasTailwind = existing\n .flat(Infinity as 1)\n .some(\n (p) =>\n typeof (p as { name?: string })?.name === 'string' &&\n (p as { name: string }).name.includes('tailwind')\n );\n if (!hasTailwind) {\n const { default: tailwindcss } = await import('@tailwindcss/vite');\n vitePlugins.push(tailwindcss());\n }\n }\n\n // Typed loosely on purpose: inlining this hits \"type instantiation is excessively deep\".\n const markdown: Record<string, unknown> =\n cfg.code.highlighter === 'codeblock'\n ? {\n // Shiki must be off so the `pre` override receives raw source.\n syntaxHighlight: false,\n }\n : {\n shikiConfig: {\n themes: cfg.code.themes,\n defaultColor: false,\n wrap: cfg.code.wrap,\n ...(cfg.code.langs.length ? { langs: cfg.code.langs } : {}),\n },\n };\n\n // Astro does not apply `base` to authored markdown links. MDX inherits these via extendMarkdownConfig.\n markdown.rehypePlugins = [\n [rehypeBaseUrl, { base: config.base }],\n // Must follow rehypeBaseUrl: the hrefs this emits already carry `base`, and\n // rehypeBaseUrl would prefix them a second time.\n [\n rehypeRelativeLinks,\n {\n contentRoot: fileURLToPath(new URL(`./${cfg.contentDir}/`, config.srcDir)),\n base: config.base,\n pathPrefix: cfg.pathPrefix,\n onMissing: (href: string, filePath: string) =>\n logger.warn(\n `${path.relative(fileURLToPath(config.root), filePath)} links to ${href}, ` +\n `which is not a page in ${cfg.contentDir}`\n ),\n },\n ],\n rehypeProseScope,\n rehypeTableColumns,\n ...(cfg.code.highlighter === 'codeblock' ? [rehypeCodeFence] : []),\n ];\n\n // Resolve against the project root first, or a './...' path means different things\n // in dev and in a build.\n const resolveAsset = (spec: string) =>\n spec.startsWith('.') ? fileURLToPath(new URL(spec, config.root)) : spec;\n\n for (const href of cfg.customCss) {\n injectScript('page-ssr', `import ${JSON.stringify(resolveAsset(href))};`);\n }\n for (const src of cfg.clientScripts) {\n injectScript('page', `import ${JSON.stringify(resolveAsset(src))};`);\n }\n\n updateConfig({\n integrations: added,\n vite: { plugins: vitePlugins as never },\n markdown,\n } as never);\n },\n\n 'astro:config:done'({ injectTypes }) {\n injectTypes({\n filename: 'types.d.ts',\n content: [\n `declare module 'virtual:eqty-docs/config' {`,\n ` const config: import('@eqtylab/docs').DocsConfig & {`,\n ` env: import('@eqtylab/docs').DocsEnv;`,\n ` ownedByConsumer: string[];`,\n ` };`,\n ` export default config;`,\n `}`,\n '',\n ].join('\\n'),\n });\n },\n\n 'astro:routes:resolved'({ routes, logger }) {\n // Catches collisions the filesystem scan cannot see.\n const seen = new Map<string, string>();\n for (const route of routes as Array<{ pattern: string; entrypoint: string }>) {\n const previous = seen.get(route.pattern);\n if (previous && previous !== route.entrypoint) {\n logger.warn(\n `Route ${route.pattern} is claimed twice:\\n ${previous}\\n ${route.entrypoint}\\n` +\n `One of them will be overwritten in the static build.`\n );\n }\n seen.set(route.pattern, route.entrypoint);\n }\n },\n },\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/internal/assert-mdx-only.ts","../src/versions.ts","../src/internal/extract-versions.ts","../src/internal/microlighter-grammars.ts","../src/internal/pagefind.ts","../src/internal/rehype-code-fence.ts","../src/internal/rehype-prose-scope.ts","../src/internal/rehype-relative-links.ts","../src/internal/rehype-table-columns.ts","../src/internal/remark-archive-document.ts","../src/internal/scan-consumer-pages.ts","../src/internal/virtual-config.ts","../src/index.ts"],"names":["path","fileURLToPath","fs","visit","globSync"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Only MDX supports the component overrides and the loader globs `.mdx` only,\n * so a stray `.md` would be silently absent from the site. Fail loudly instead.\n */\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { globSync } from 'tinyglobby';\n\nexport function assertMdxOnly(contentDir: URL): void {\n const dir = fileURLToPath(contentDir);\n\n let strays: string[] = [];\n try {\n strays = globSync(['**/*.md'], { cwd: dir, absolute: false });\n } catch {\n return;\n }\n if (strays.length === 0) return;\n\n const list = strays\n .sort()\n .map((file) => ` - ${file} -> ${file.replace(/\\.md$/i, '.mdx')}`)\n .join('\\n');\n\n throw new Error(\n `[@eqtylab/docs] Found ${strays.length} Markdown file${strays.length > 1 ? 's' : ''} in ` +\n `${path.relative(process.cwd(), dir) || dir}:\\n${list}\\n\\n` +\n `Docs content must be .mdx. Only MDX supports the component overrides that render\\n` +\n `tables, code fences and callouts through Equality, so a .md page would look\\n` +\n `different from every other page. Renaming is usually the only change needed --\\n` +\n `MDX is a superset of Markdown.`\n );\n}\n","/** Pure. Turns a tag list into the copies to build and the release URLs that redirect to them. */\n\nexport type Granularity = 'major' | 'minor' | 'patch';\n\nexport interface ParsedTag {\n tag: string;\n major: number;\n minor: number;\n patch: number;\n version: string;\n}\n\nexport interface VersionCopy {\n id: string;\n suffix: string;\n group: string;\n tag: string;\n}\n\n/** `to: null` means latest, i.e. `/`. */\nexport interface VersionRedirect {\n id: string;\n to: string | null;\n}\n\nexport interface VersionSelection {\n /** Newest first. */\n copies: VersionCopy[];\n redirects: VersionRedirect[];\n /** Tags that did not parse as MAJOR.MINOR.PATCH, prereleases included. */\n skipped: string[];\n /** Parsed tags above `current`. */\n above: string[];\n}\n\n/*\n * The prefix is free, the version is not. `tags` decides which tags are considered; this decides\n * what counts as a release among them, and a consumer tagging `@scope/pkg@1.2.3` or `sdk-v1.2.3`\n * has no glob that could rescue them from a `^v?` anchor. Strict after the prefix, so\n * `v1.2.3-beta.1`, `v1.2` and `v1.2.3.4` all still fall out as skipped.\n */\nconst SEMVER = /(?:^|[^0-9.])(\\d+)\\.(\\d+)\\.(\\d+)$/;\n\n/** Finest to coarsest. A granularity's own level is included, so the current group gets a stub. */\nconst LEVELS: Granularity[] = ['patch', 'minor', 'major'];\n\nexport function parseTag(tag: string): ParsedTag | null {\n const m = SEMVER.exec(tag.trim());\n if (!m) return null;\n const major = Number(m[1]);\n const minor = Number(m[2]);\n const patch = Number(m[3]);\n return { tag, major, minor, patch, version: `${major}.${minor}.${patch}` };\n}\n\nexport function compareTags(a: ParsedTag, b: ParsedTag): number {\n return a.major - b.major || a.minor - b.minor || a.patch - b.patch;\n}\n\nexport function groupOf(v: ParsedTag, granularity: Granularity): string {\n if (granularity === 'major') return `${v.major}`;\n if (granularity === 'minor') return `${v.major}.${v.minor}`;\n return v.version;\n}\n\nexport function idOf(group: string): string {\n return `v${group}`;\n}\n\n/** Collection names are identifiers, so `v3.9` becomes `v3_9`. */\nexport function suffixOf(id: string): string {\n return id.replace(/\\./g, '_');\n}\n\nexport function highestTag(tags: string[]): ParsedTag | null {\n const parsed = tags.map(parseTag).filter((t): t is ParsedTag => t !== null);\n if (!parsed.length) return null;\n return parsed.sort(compareTags)[parsed.length - 1]!;\n}\n\nexport function selectVersions(\n tags: string[],\n current: string,\n granularity: Granularity,\n skippedGroups: string[] = []\n): VersionSelection {\n const cur = parseTag(current);\n if (!cur) {\n throw new Error(`[@eqtylab/docs] versions.current \"${current}\" is not MAJOR.MINOR.PATCH`);\n }\n\n const skipped: string[] = [];\n const above: string[] = [];\n const parsed: ParsedTag[] = [];\n for (const tag of tags) {\n const p = parseTag(tag);\n if (p) parsed.push(p);\n else skipped.push(tag);\n }\n parsed.sort(compareTags);\n\n const currentGroup = groupOf(cur, granularity);\n const skip = new Set(skippedGroups);\n\n // Ascending insertion order, so \"nearest lower covered group\" is a running variable.\n const byGroup = new Map<string, ParsedTag[]>();\n const inCurrent: ParsedTag[] = [];\n const covered: ParsedTag[] = [];\n for (const p of parsed) {\n if (compareTags(p, cur) > 0) {\n above.push(p.tag);\n continue;\n }\n covered.push(p);\n const g = groupOf(p, granularity);\n if (g === currentGroup) {\n inCurrent.push(p);\n continue;\n }\n if (!byGroup.has(g)) byGroup.set(g, []);\n byGroup.get(g)!.push(p);\n }\n\n const copies: VersionCopy[] = [];\n const picks: ParsedTag[] = [];\n const coverOf = new Map<string, string | null>();\n let lastCovered: string | null = null;\n for (const [g, members] of byGroup) {\n if (skip.has(g)) {\n coverOf.set(g, lastCovered);\n continue;\n }\n const pick = members[members.length - 1]!;\n const id = idOf(g);\n copies.push({ id, suffix: suffixOf(id), group: g, tag: pick.tag });\n picks.push(pick);\n coverOf.set(g, id);\n lastCovered = id;\n }\n\n const redirects: VersionRedirect[] = [];\n for (const [g, members] of byGroup) {\n const to = coverOf.get(g) ?? null;\n for (const p of members) {\n const id = idOf(p.version);\n // At `patch` granularity the copy is its own tag; a self-redirect would collide with its root.\n if (id === to) continue;\n redirects.push({ id, to });\n }\n }\n for (const p of inCurrent) redirects.push({ id: idOf(p.version), to: null });\n\n copies.reverse();\n picks.reverse();\n\n // Group stubs are what make `granularity` a setting rather than a one-way door. Every grouping\n // at or coarser than the configured one resolves to the best copy inside it, so `/v3.9/` keeps\n // working after a move to `patch` and `/v3.9.1/` keeps working after a move back. Without them a\n // change of setting silently retires every URL the previous setting published: at `patch` every\n // copy is its own tag, so nothing above emits `v3.9`, which is not a tag and never was.\n const emittedIds = new Set(redirects.map((r) => r.id));\n const copyIds = new Set(copies.map((c) => c.id));\n // The current version is known from config and need not be tagged yet, so it is seeded here:\n // `/v4.0/` and `/v4/` should resolve to latest on the strength of the config alone. Only when\n // a copy exists, though, or a repository with no tags would stop being dormant.\n const stubSources = copies.length\n ? covered.some((p) => p.version === cur.version)\n ? covered\n : [...covered, cur]\n : [];\n\n for (const level of LEVELS.slice(LEVELS.indexOf(granularity))) {\n const seenGroups = new Set<string>();\n for (let i = stubSources.length - 1; i >= 0; i--) {\n const group = groupOf(stubSources[i]!, level);\n if (seenGroups.has(group)) continue;\n seenGroups.add(group);\n\n const id = idOf(group);\n if (copyIds.has(id) || emittedIds.has(id)) continue;\n\n const holdsCurrent = groupOf(cur, level) === group;\n let cover: string | null = null;\n for (let c = 0; !holdsCurrent && c < copies.length; c++) {\n if (groupOf(picks[c]!, level) === group) {\n cover = copies[c]!.id;\n break;\n }\n }\n\n // A group with no copy beneath it and no claim on latest has nothing honest to point at.\n // Sending `/v2/` to latest would tell a reader that v2 docs are the current ones.\n if (!holdsCurrent && cover === null) continue;\n\n redirects.push({ id, to: cover });\n emittedIds.add(id);\n }\n }\n\n return { copies, redirects, skipped, above };\n}\n","/**\n * Reads release tags and pulls each pick's content directory out of git into the cache.\n * Runs once per build or dev start, inside `astro:config:setup`, before the content layer syncs.\n */\nimport { execFileSync } from 'node:child_process';\nimport fs from 'node:fs';\nimport path from 'node:path';\n\nimport {\n groupOf,\n highestTag,\n idOf,\n parseTag,\n selectVersions,\n type Granularity,\n type VersionRedirect,\n} from '../versions.ts';\n\nexport interface ExtractOptions {\n root: string;\n contentDirAbs: string;\n cacheDir: string;\n current?: string;\n tags: string;\n granularity: Granularity;\n logger: { info(msg: string): void; warn(msg: string): void };\n}\n\nexport interface CurrentVersion {\n id: string;\n group: string;\n version: string;\n}\n\nexport interface ManifestEntry {\n id: string;\n suffix: string;\n group: string;\n tag: string;\n /** Filesystem path of the extracted content directory. */\n dir: string;\n}\n\nexport interface ExtractResult {\n currentVersion: CurrentVersion | null;\n versionManifest: ManifestEntry[];\n versionRedirects: VersionRedirect[];\n}\n\nexport const EMPTY_VERSIONS: ExtractResult = {\n currentVersion: null,\n versionManifest: [],\n versionRedirects: [],\n};\n\nconst TAG = '[@eqtylab/docs] versions:';\n\nfunction git(cwd: string, ...args: string[]): string {\n return execFileSync('git', args, {\n cwd,\n encoding: 'utf8',\n stdio: ['ignore', 'pipe', 'pipe'],\n }).trim();\n}\n\n/**\n * git reports resolved paths, so a project reached through a symlink (macOS `/tmp`, a linked\n * home, a linked workspace) yields a relative path full of `..` and matches no tag. The failure\n * is silent: every group looks like it predates the content directory and gets skipped.\n */\nfunction realpath(p: string): string {\n try {\n return fs.realpathSync(p);\n } catch {\n return p;\n }\n}\n\nfunction hasPathAtTag(repoRoot: string, tag: string, rel: string): boolean {\n try {\n execFileSync('git', ['cat-file', '-e', `${tag}:${rel}`], { cwd: repoRoot, stdio: 'ignore' });\n return true;\n } catch {\n return false;\n }\n}\n\nexport function extractVersions(o: ExtractOptions): ExtractResult {\n let repoRoot: string;\n try {\n repoRoot = git(o.root, 'rev-parse', '--show-toplevel');\n } catch {\n o.logger.warn(\n `${TAG} not a git repository, or git is missing. Versioning is off for this build.`\n );\n return EMPTY_VERSIONS;\n }\n\n if (git(o.root, 'rev-parse', '--is-shallow-repository') === 'true') {\n o.logger.warn(`${TAG} shallow clone; tags may be incomplete. Check out with fetch-depth: 0.`);\n }\n\n const tags = git(o.root, 'tag', '--list', o.tags).split('\\n').filter(Boolean);\n const currentVersion = o.current ?? highestTag(tags)?.version;\n if (!currentVersion) {\n o.logger.info(\n `${TAG} on and dormant. No tag matches \"${o.tags}\"; versioning activates at the first release tag.`\n );\n return EMPTY_VERSIONS;\n }\n\n const contentRel = path\n .relative(realpath(repoRoot), realpath(o.contentDirAbs))\n .split(path.sep)\n .join('/');\n\n let selection = selectVersions(tags, currentVersion, o.granularity);\n for (const tag of selection.skipped) {\n o.logger.warn(`${TAG} tag \"${tag}\" is not MAJOR.MINOR.PATCH; skipped.`);\n }\n if (selection.above.length) {\n o.logger.warn(\n `${TAG} tags above current ${currentVersion} ignored: ${selection.above.join(', ')}.`\n );\n }\n\n // A pick whose tree predates the content directory takes its whole group out, and selection\n // re-runs so that group's releases redirect lower. One pass suffices: skipping never adds groups.\n const missing = selection.copies.filter((c) => !hasPathAtTag(repoRoot, c.tag, contentRel));\n if (missing.length) {\n for (const c of missing) {\n o.logger.warn(\n `${TAG} ${c.tag} has no ${contentRel}; skipping ${c.id}. Its releases redirect to the copy below.`\n );\n }\n selection = selectVersions(\n tags,\n currentVersion,\n o.granularity,\n missing.map((c) => c.group)\n );\n }\n\n const versionsDir = path.join(o.cacheDir, 'versions');\n fs.rmSync(versionsDir, { recursive: true, force: true });\n const versionManifest: ManifestEntry[] = selection.copies.map((c) => {\n const dir = path.join(versionsDir, c.id);\n fs.mkdirSync(dir, { recursive: true });\n // Two processes rather than a shell pipeline: a pipeline reports only tar's status, so a\n // failed `git archive` left an empty directory, a manifest entry pointing at it, and a build\n // that succeeded with a version serving zero pages. `set -o pipefail` would fix that on\n // macOS and break it on CI, where /bin/sh is dash and rejects the option outright.\n try {\n // `<tag>:<path>` makes the path the archive root, so there is nothing to strip.\n const archive = execFileSync('git', ['archive', `${c.tag}:${contentRel}`], {\n cwd: repoRoot,\n maxBuffer: 512 * 1024 * 1024,\n stdio: ['ignore', 'pipe', 'inherit'],\n });\n execFileSync('tar', ['-x', '-C', dir], {\n input: archive,\n stdio: ['pipe', 'ignore', 'inherit'],\n });\n } catch (cause) {\n throw new Error(`${TAG} ${c.tag} failed to extract ${contentRel} into ${dir}`, { cause });\n }\n // A content path that is a file rather than a directory passes `cat-file -e` and yields an\n // archive of nothing, so the exit status alone is not enough.\n if (!fs.readdirSync(dir).length) {\n throw new Error(`${TAG} ${c.tag} extracted no files into ${dir}`);\n }\n return { ...c, dir };\n });\n\n const cur = parseTag(currentVersion)!;\n const group = groupOf(cur, o.granularity);\n const result: ExtractResult = {\n currentVersion: { id: idOf(group), group, version: cur.version },\n versionManifest,\n versionRedirects: selection.redirects,\n };\n\n fs.mkdirSync(o.cacheDir, { recursive: true });\n fs.writeFileSync(path.join(o.cacheDir, 'versions.json'), JSON.stringify(result, null, 2));\n o.logger.info(\n `${TAG} current ${result.currentVersion!.id}; ${versionManifest.length} older ${\n versionManifest.length === 1 ? 'copy' : 'copies'\n }, ${selection.redirects.length} redirects.`\n );\n return result;\n}\n","/**\n * Emits microlighter's grammar modules beside the chunks that ask for them.\n * CodeBlock loads grammars with `import('./grammars/' + language)`, which no\n * bundler can expand; without this the build succeeds and code renders unhighlighted.\n */\nimport { readdirSync, readFileSync } from 'node:fs';\nimport { createRequire } from 'node:module';\nimport path from 'node:path';\nimport type { AstroIntegrationLogger } from 'astro';\nimport type { Plugin } from 'vite';\n\n/** Residue of the dynamic import in the emitted chunk. */\nconst GRAMMAR_IMPORT = 'grammars/${';\n\n/** Two hops from the consumer: microlighter is a dependency of @eqtylab/equality, which is only a peer here. */\nfunction findGrammarDir(projectRoot: URL): string {\n const requireFromProject = createRequire(new URL('package.json', projectRoot));\n const equalityEntry = requireFromProject.resolve('@eqtylab/equality');\n const requireFromEquality = createRequire(equalityEntry);\n return path.resolve(path.dirname(requireFromEquality.resolve('microlighter')), 'grammars');\n}\n\nexport function microlighterGrammarsPlugin(\n projectRoot: URL,\n logger: AstroIntegrationLogger\n): Plugin {\n return {\n name: 'eqty-docs:microlighter-grammars',\n apply: 'build',\n generateBundle(_options, bundle) {\n const directories = new Set(\n Object.values(bundle)\n .filter((output) => output.type === 'chunk' && output.code.includes(GRAMMAR_IMPORT))\n .map((output) => path.posix.dirname(output.fileName))\n );\n if (directories.size === 0) return;\n\n let grammarDir: string;\n let grammars: string[];\n try {\n grammarDir = findGrammarDir(projectRoot);\n grammars = readdirSync(grammarDir).filter((file) => file.endsWith('.js'));\n } catch (error) {\n // Warn rather than fail the build over highlighting.\n logger.warn(\n 'Code blocks ask for microlighter grammars, but they could not be resolved. ' +\n 'Fenced code will render unhighlighted. Check that @eqtylab/equality is ' +\n `installed in this project.\\n ${String(error)}`\n );\n return;\n }\n\n for (const directory of directories) {\n for (const grammar of grammars) {\n this.emitFile({\n type: 'asset',\n fileName:\n directory === '.' ? `grammars/${grammar}` : `${directory}/grammars/${grammar}`,\n source: readFileSync(path.resolve(grammarDir, grammar), 'utf8'),\n });\n }\n }\n },\n };\n}\n","/**\n * Not `astro-pagefind`: it ships TypeScript, and Node will not compile that under\n * node_modules when this integration reaches it from its own bundle.\n *\n * The build writes the index; dev serves that same index off disk, so it always\n * describes the last build.\n */\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport type { AstroIntegration } from 'astro';\n\nconst INDEX_DIR = 'pagefind';\n\n/** Everything else Pagefind fetches is read as bytes, so the type never reaches a parser. */\nconst MIME: Record<string, string> = {\n '.js': 'text/javascript',\n '.css': 'text/css',\n '.json': 'application/json',\n '.wasm': 'application/wasm',\n};\n\n/** Pagefind collects errors per step and carries on; any of them means no usable index. */\nfunction failOn(\n errors: string[],\n logger: { error: (message: string) => void },\n what: string\n): void {\n if (!errors.length) return;\n errors.forEach((error) => logger.error(error));\n throw new Error(`[@eqtylab/docs] Pagefind could not ${what}.`);\n}\n\nfunction indexRequest(url: string | undefined, base: string): string | null {\n if (!url) return null;\n const pathname = decodeURIComponent(url.split(/[?#]/)[0]);\n const prefix = `${base.replace(/\\/+$/, '')}/${INDEX_DIR}/`;\n return pathname.startsWith(prefix) ? pathname.slice(prefix.length) : null;\n}\n\nexport function pagefindIntegration(): AstroIntegration {\n let indexDir = '';\n\n return {\n name: '@eqtylab/docs/pagefind',\n hooks: {\n 'astro:config:setup'({ config, logger }) {\n indexDir = path.join(fileURLToPath(config.outDir), INDEX_DIR);\n\n if (config.output === 'server') {\n logger.warn(\n 'Output \"server\" emits no static HTML, so there is nothing for Pagefind to index.'\n );\n }\n },\n\n /** Runs ahead of Vite's static middleware and Astro's handler; move it and `/pagefind/*` 404s. */\n 'astro:server:setup'({ server, logger }) {\n const base = server.config.base ?? '/';\n\n logger.info(\n fs.existsSync(indexDir)\n ? 'serving the search index from the last build; rebuild to pick up edits'\n : 'no search index yet — run `astro build` once to search in dev'\n );\n\n server.middlewares.use((req, res, next) => {\n const requested = indexRequest(req.url, base);\n if (requested === null) return next();\n\n const file = path.join(indexDir, requested);\n // The prefix check is what stops `..` climbing out of the index directory.\n if (!file.startsWith(indexDir + path.sep) || !fs.existsSync(file)) return next();\n\n res.setHeader('Content-Type', MIME[path.extname(file)] ?? 'application/octet-stream');\n // The next build rewrites these in place, and a cached fragment would outlive it.\n res.setHeader('Cache-Control', 'no-store');\n fs.createReadStream(file).pipe(res);\n });\n },\n\n /** The last hook of the build, and the first moment every page exists on disk to read. */\n async 'astro:build:done'({ dir, logger }) {\n const outDir = fileURLToPath(dir);\n const { createIndex } = await import('pagefind');\n\n const { index, errors } = await createIndex();\n failOn(errors, logger, 'create an index');\n if (!index) throw new Error('[@eqtylab/docs] Pagefind returned no index.');\n\n const { page_count, errors: addErrors } = await index.addDirectory({ path: outDir });\n failOn(addErrors, logger, 'index the built output');\n\n const { outputPath, errors: writeErrors } = await index.writeFiles({\n outputPath: path.join(outDir, INDEX_DIR),\n });\n failOn(writeErrors, logger, 'write the index');\n\n logger.info(`indexed ${page_count} pages to ${outputPath}`);\n },\n },\n };\n}\n","/**\n * Lifts each fence's source, language and title onto its `<pre>`. Do not recover\n * the source from the rendered slot: `Astro.slots.render()` escapes in dev but not in build.\n */\nimport { visit } from 'unist-util-visit';\n\ninterface Node {\n type: string;\n tagName?: string;\n value?: string;\n properties?: Record<string, unknown>;\n children?: Node[];\n data?: { meta?: string };\n}\n\nfunction textOf(node: Node): string {\n if (node.type === 'text') return node.value ?? '';\n return (node.children ?? []).map(textOf).join('');\n}\n\nfunction classNames(props: Record<string, unknown> | undefined): string[] {\n const raw = props?.className ?? props?.class;\n if (Array.isArray(raw)) return raw.map(String);\n if (typeof raw === 'string') return raw.split(/\\s+/);\n return [];\n}\n\n/** ```ts title=\"button.tsx\" -> \"button.tsx\" */\nfunction titleFromMeta(meta: string | undefined): string | undefined {\n const match = meta?.match(/(?:^|\\s)title=(?:\"([^\"]*)\"|'([^']*)'|(\\S+))/);\n return match ? (match[1] ?? match[2] ?? match[3]) : undefined;\n}\n\nexport function rehypeCodeFence() {\n return function transformer(tree: unknown) {\n visit(tree as never, 'element', (node: Node) => {\n if (node.tagName !== 'pre') return;\n\n const code = (node.children ?? []).find(\n (child) => child.type === 'element' && child.tagName === 'code'\n );\n if (!code) return;\n\n const language = classNames(code.properties)\n .find((name) => name.startsWith('language-'))\n ?.slice('language-'.length);\n\n const title = titleFromMeta(code.data?.meta);\n\n node.properties = {\n ...node.properties,\n dataCode: textOf(code).replace(/\\n$/, ''),\n ...(language ? { dataLanguage: language } : {}),\n ...(title ? { dataTitle: title } : {}),\n };\n });\n };\n}\n","/**\n * Marks the content a page authored as markdown or as plain HTML, so\n * `prose.css` can typeset it without reaching inside a component.\n *\n * MDX parses a component's children as markdown whenever they sit on their own\n * lines, so `<Badge icon=\"Shield\">\\n Primary\\n</Badge>` renders a `<p>` inside\n * the badge — and prettier puts them there. Authoring discipline cannot fix it;\n * the boundary has to be drawn here. Everything below a capitalised JSX tag is\n * that component's business, `<div>` and friends are the page's own.\n */\nimport { SKIP, visit } from 'unist-util-visit';\n\nconst MARKER = 'data-eq-md';\n\ninterface Attribute {\n type: string;\n name?: string | null;\n}\n\ninterface Node {\n type: string;\n name?: string | null;\n properties?: Record<string, unknown>;\n attributes?: Attribute[];\n}\n\n/** Capitalised or dotted JSX names are components; `div`, `span` and friends are not. */\nfunction isComponent(node: Node): boolean {\n if (node.type !== 'mdxJsxFlowElement' && node.type !== 'mdxJsxTextElement') return false;\n const name = node.name;\n return typeof name === 'string' && (/^[A-Z]/.test(name) || name.includes('.'));\n}\n\n/**\n * Structural components that hold the page's own prose rather than content of their own.\n * Without this a heading or list inside a `<TabItem>` would render untypeset.\n */\nconst CONTAINERS = new Set(['Tabs', 'TabItem']);\n\nfunction isContainer(node: Node): boolean {\n return typeof node.name === 'string' && CONTAINERS.has(node.name);\n}\n\nexport function rehypeProseScope() {\n return function transformer(tree: unknown) {\n visit(tree as never, (node: Node) => {\n // A container's children are the page's own markup, so traversal continues into them.\n // The component tag itself is never page markup and never takes the marker.\n if (isComponent(node)) return isContainer(node) ? undefined : SKIP;\n\n if (node.type === 'element') {\n node.properties = { ...node.properties, dataEqMd: '' };\n return undefined;\n }\n\n // Authored HTML. A JSX fragment has no name and nothing to mark.\n if ((node.type === 'mdxJsxFlowElement' || node.type === 'mdxJsxTextElement') && node.name) {\n const attributes = node.attributes ?? [];\n if (!attributes.some((a) => a.type === 'mdxJsxAttribute' && a.name === MARKER)) {\n attributes.push({ type: 'mdxJsxAttribute', name: MARKER, value: '' } as Attribute);\n }\n node.attributes = attributes;\n }\n\n return undefined;\n });\n };\n}\n","/**\n * Resolves authored relative links between content files - `./usage.mdx`,\n * `../guides/index.md#anchor` - into the public URL of the page they name.\n * Markdown's own convention is a path on disk; the browser needs a route.\n *\n * Only files inside the content root are resolved, and only targets that land\n * inside it: a link out of the collection is someone else's URL to own.\n */\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { visit } from 'unist-util-visit';\n\nimport { docsHref, isExternalHref, type PathContext } from '../paths.ts';\n\ninterface ElementNode {\n type: string;\n properties?: Record<string, unknown>;\n}\n\ninterface VFile {\n path?: string;\n}\n\nexport interface RelativeLinkOptions extends PathContext {\n /** Absolute path of the docs content directory. */\n contentRoot: string;\n /** Called with the resolved-but-missing target, so a typo fails loudly. */\n onMissing?: (href: string, filePath: string) => void;\n}\n\nconst CONTENT_EXTENSIONS = ['.mdx', '.md'];\n\n/** True once the id names a file Astro will have turned into a page. */\nfunction hasEntry(contentRoot: string, id: string): boolean {\n const stem = path.join(contentRoot, id);\n return CONTENT_EXTENSIONS.some(\n (ext) => fs.existsSync(stem + ext) || fs.existsSync(path.join(stem, `index${ext}`))\n );\n}\n\n/** A content-relative link, split into the file part and any `#hash` / `?query`. */\nfunction splitTarget(href: string): { target: string; suffix: string } | undefined {\n if (!href || isExternalHref(href)) return undefined;\n // Site-absolute, fragment-only and query-only links are already URLs.\n if (href.startsWith('/') || href.startsWith('#') || href.startsWith('?')) return undefined;\n const match = /^([^#?]*)([#?].*)?$/.exec(href);\n const target = match?.[1];\n if (!target || !/\\.mdx?$/i.test(target)) return undefined;\n return { target, suffix: match?.[2] ?? '' };\n}\n\nexport function rehypeRelativeLinks(options: RelativeLinkOptions) {\n const { contentRoot, onMissing, ...ctx } = options;\n\n return function transformer(tree: unknown, file?: VFile) {\n const filePath = file?.path;\n if (!filePath) return;\n\n // Content files only. A page elsewhere in the project has its own notion of \"here\".\n const fromRoot = path.relative(contentRoot, filePath);\n if (!fromRoot || fromRoot.startsWith('..') || path.isAbsolute(fromRoot)) return;\n\n visit(tree as never, 'element', (node: ElementNode) => {\n const props = node.properties;\n const href = props?.href;\n if (!props || typeof href !== 'string') return;\n\n const split = splitTarget(href);\n if (!split) return;\n\n const absolute = path.resolve(path.dirname(filePath), split.target);\n const relative = path.relative(contentRoot, absolute);\n if (!relative || relative.startsWith('..') || path.isAbsolute(relative)) return;\n\n // Astro's ids are extensionless and drop a folder's `index`, except at the root.\n const id = relative\n .split(path.sep)\n .join('/')\n .replace(/\\.mdx?$/i, '')\n .replace(/\\/index$/, '');\n\n if (!hasEntry(contentRoot, id)) onMissing?.(href, filePath);\n\n props.href = docsHref(id, ctx) + split.suffix;\n });\n };\n}\n","/**\n * Annotates each markdown table with its column count. Equality's `TableContainer`\n * is a CSS grid and collapses to one column without an explicit track list.\n */\nimport { visit } from 'unist-util-visit';\n\ninterface ElementNode {\n type: string;\n tagName?: string;\n properties?: Record<string, unknown>;\n children?: ElementNode[];\n}\n\n/** First `tr` in document order, searching thead before tbody. */\nfunction firstRow(table: ElementNode): ElementNode | undefined {\n let found: ElementNode | undefined;\n visit(table as never, 'element', (node: ElementNode) => {\n if (found) return false;\n if (node.tagName === 'tr') {\n found = node;\n return false;\n }\n return undefined;\n });\n return found;\n}\n\nfunction countCells(row: ElementNode): number {\n return (row.children ?? []).reduce((total, child) => {\n if (child.type !== 'element') return total;\n if (child.tagName !== 'th' && child.tagName !== 'td') return total;\n const span = Number(child.properties?.colSpan ?? child.properties?.colspan ?? 1);\n return total + (Number.isFinite(span) && span > 0 ? span : 1);\n }, 0);\n}\n\nexport function rehypeTableColumns() {\n return function transformer(tree: unknown) {\n visit(tree as never, 'element', (node: ElementNode) => {\n if (node.tagName !== 'table') return;\n const row = firstRow(node);\n const count = row ? countCells(row) : 0;\n if (count <= 0) return;\n node.properties = { ...node.properties, dataColumnCount: String(count) };\n });\n };\n}\n","/**\n * Strips every MDX-specific node from an archived page, leaving headings, prose, lists, tables\n * and code fences.\n *\n * A versioned docsite freezes content, not code. An archived page's imports bind it to whatever\n * the library and the demo scaffolding look like today, so a removed export or a deleted widget\n * breaks a page nobody can edit. Dropping the imports and the elements they feed turns the page\n * back into what it was always a record of: the words and the samples.\n *\n * Remark, not rehype: the failure is Rollup refusing an import that no longer resolves, which\n * happens after MDX has compiled to JavaScript. The node has to be gone at the mdast stage.\n */\nimport { versionFromPath } from './rehype-base-url.ts';\n\ninterface Node {\n type: string;\n children?: Node[];\n}\n\nconst MDX_NODES = new Set([\n 'mdxjsEsm',\n 'mdxJsxFlowElement',\n 'mdxJsxTextElement',\n 'mdxFlowExpression',\n 'mdxTextExpression',\n]);\n\nfunction prune(node: Node): void {\n if (!Array.isArray(node.children)) return;\n node.children = node.children.filter((child) => !MDX_NODES.has(child.type));\n for (const child of node.children) prune(child);\n}\n\nexport function remarkArchiveDocument(options: { versionsDir?: string }) {\n return function transformer(tree: unknown, file?: { path?: string; history?: string[] }): void {\n const version = versionFromPath(file?.path ?? file?.history?.[0], options.versionsDir);\n if (!version) return;\n prune(tree as Node);\n };\n}\n","/**\n * Routes the consumer's own `src/pages` already claim. Astro does NOT de-duplicate\n * injected routes against file-based ones: a path claimed by both is emitted\n * twice and the winner is write order, so yielding has to be explicit here.\n */\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { globSync } from 'tinyglobby';\n\nconst PAGE_EXTENSIONS = ['astro', 'md', 'mdx', 'html', 'ts', 'js'];\n\nexport interface ConsumerPages {\n /** Concrete route paths the consumer's pages generate, normalised without trailing slash. */\n ownedPaths: string[];\n /** Route patterns claimed by consumer pages, e.g. '/[...slug]' or '/404'. */\n claimedPatterns: Set<string>;\n}\n\n/** `index.astro` -> '', `a/b.astro` -> '/a/b', `[...slug].astro` -> '/[...slug]' */\nfunction toRoutePath(relative: string): string {\n const withoutExt = relative.replace(/\\.[^./]+$/, '');\n const segments = withoutExt.split(path.sep).join('/').split('/').filter(Boolean);\n if (segments.at(-1) === 'index') segments.pop();\n return '/' + segments.join('/');\n}\n\nexport function scanConsumerPages(srcDir: URL): ConsumerPages {\n const pagesDir = fileURLToPath(new URL('./pages/', srcDir));\n\n let files: string[] = [];\n try {\n files = globSync([`**/*.{${PAGE_EXTENSIONS.join(',')}}`], {\n cwd: pagesDir,\n absolute: false,\n });\n } catch {\n // No src/pages: a docs-only site.\n return { ownedPaths: [], claimedPatterns: new Set() };\n }\n\n const ownedPaths: string[] = [];\n const claimedPatterns = new Set<string>();\n\n for (const file of files) {\n // Astro ignores files and directories prefixed with `_`.\n if (file.split(path.sep).some((segment) => segment.startsWith('_'))) continue;\n\n const routePath = toRoutePath(file);\n claimedPatterns.add(routePath === '' ? '/' : routePath);\n\n if (!/[[\\]]/.test(file)) {\n ownedPaths.push(routePath.replace(/\\/+$/, '') || '/');\n }\n }\n\n return { ownedPaths, claimedPatterns };\n}\n","/** Serves the resolved config to runtime components, which ship from node_modules and cannot reach the consumer's project by path. */\nimport type { Plugin } from 'vite';\n\nconst MODULE_ID = 'virtual:eqty-docs/config';\nconst RESOLVED_ID = '\\0' + MODULE_ID;\n\nexport function virtualConfigPlugin(getPayload: () => Record<string, unknown>): Plugin {\n return {\n name: 'eqty-docs:virtual-config',\n resolveId(id) {\n return id === MODULE_ID ? RESOLVED_ID : null;\n },\n load(id) {\n if (id !== RESOLVED_ID) return null;\n return `export default ${JSON.stringify(getPayload())};`;\n },\n };\n}\n","import path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport type { AstroIntegration } from 'astro';\n\nimport { resolveConfig, type DocsConfig, type DocsUserConfig } from './config.ts';\nimport { resolveDocsEnv, type DocsEnv } from './env.ts';\nimport { assertMdxOnly } from './internal/assert-mdx-only.ts';\nimport { EMPTY_VERSIONS, extractVersions } from './internal/extract-versions.ts';\nimport { microlighterGrammarsPlugin } from './internal/microlighter-grammars.ts';\nimport { pagefindIntegration } from './internal/pagefind.ts';\nimport { rehypeBaseUrl } from './internal/rehype-base-url.ts';\nimport { rehypeCodeFence } from './internal/rehype-code-fence.ts';\nimport { rehypeProseScope } from './internal/rehype-prose-scope.ts';\nimport { rehypeRelativeLinks } from './internal/rehype-relative-links.ts';\nimport { rehypeTableColumns } from './internal/rehype-table-columns.ts';\nimport { remarkArchiveDocument } from './internal/remark-archive-document.ts';\nimport { scanConsumerPages } from './internal/scan-consumer-pages.ts';\nimport { virtualConfigPlugin } from './internal/virtual-config.ts';\n\nexport { resolveConfig, type DocsConfig, type DocsUserConfig } from './config.ts';\nexport { resolveDocsEnv, type DocsEnv } from './env.ts';\n// Do not re-export the loaders: this entry runs in Node when astro.config loads,\n// and they import `astro:content`, which only exists in the Vite graph.\nexport { docsSchema, groupSchema, badgeSchema } from './schema.ts';\nexport * from './types.ts';\n\nexport interface DocsIntegrationOptions extends DocsUserConfig {\n /** Build environment for versioned deploys. Defaults to `resolveDocsEnv()`. */\n env?: Partial<DocsEnv>;\n}\n\n/** Route patterns the integration would like to own, paired with their entrypoints. */\nfunction plannedRoutes(cfg: DocsConfig) {\n const prefix = cfg.pathPrefix ? `/${cfg.pathPrefix.replace(/^\\/|\\/$/g, '')}` : '';\n const routes: Array<{ pattern: string; entrypoint: string; enabled: boolean }> = [\n {\n pattern: `${prefix}/[...slug]`,\n entrypoint: '@eqtylab/docs/routes/docs.astro',\n enabled: cfg.routing.injectPages,\n },\n {\n pattern: `${prefix}/[...slug].md`,\n entrypoint: '@eqtylab/docs/routes/docs-md.ts',\n enabled: cfg.routing.markdownTwins,\n },\n {\n pattern: '/llms.txt',\n entrypoint: '@eqtylab/docs/routes/llms-txt.ts',\n enabled: cfg.routing.markdownTwins,\n },\n {\n pattern: '/404',\n entrypoint: '@eqtylab/docs/routes/not-found.astro',\n enabled: cfg.routing.notFound,\n },\n ];\n return routes.filter((r) => r.enabled);\n}\n\nexport default function docs(\n options: DocsIntegrationOptions = {} as DocsIntegrationOptions\n): AstroIntegration {\n const { env: envOverrides, ...userConfig } = options;\n const cfg = resolveConfig(userConfig);\n const env = resolveDocsEnv(envOverrides);\n\n let payload: Record<string, unknown> = {};\n\n return {\n name: '@eqtylab/docs',\n hooks: {\n async 'astro:config:setup'(params) {\n const { config, injectRoute, injectScript, updateConfig, addWatchFile, logger, command } =\n params;\n\n assertMdxOnly(new URL(`./${cfg.contentDir}/`, config.srcDir));\n\n // Runs before the content layer syncs, so the version collections find their files.\n const versionData =\n cfg.versions === false\n ? EMPTY_VERSIONS\n : extractVersions({\n root: fileURLToPath(config.root),\n contentDirAbs: fileURLToPath(new URL(`./${cfg.contentDir}/`, config.srcDir)),\n cacheDir: fileURLToPath(new URL('./.astro/eqty-docs/', config.root)),\n current: cfg.versions.current,\n tags: cfg.versions.tags,\n granularity: cfg.versions.granularity,\n logger,\n });\n\n const consumer = scanConsumerPages(config.srcDir);\n\n for (const route of plannedRoutes(cfg)) {\n if (consumer.claimedPatterns.has(route.pattern)) {\n logger.info(\n `yielding ${route.pattern} to your own src/pages file (docs route not injected)`\n );\n continue;\n }\n injectRoute({ pattern: route.pattern, entrypoint: route.entrypoint, prerender: true });\n }\n\n payload = {\n ...cfg,\n env,\n // Read by the catch-all's getStaticPaths so no path is emitted twice.\n ownedByConsumer: consumer.ownedPaths,\n ...versionData,\n };\n\n // So `_group.yaml` edits reload in dev.\n if (command === 'dev') {\n addWatchFile(new URL(`./${cfg.contentDir}/`, config.srcDir));\n }\n\n const integrationNames = new Set(config.integrations.map((i) => i.name));\n const added: AstroIntegration[] = [];\n\n if (cfg.autoIntegrations) {\n if (!integrationNames.has('@astrojs/mdx')) {\n const { default: mdx } = await import('@astrojs/mdx');\n added.push(mdx());\n }\n if (!integrationNames.has('@astrojs/react')) {\n const { default: react } = await import('@astrojs/react');\n added.push(react());\n }\n if (cfg.search.provider === 'pagefind' && !integrationNames.has('pagefind')) {\n added.push(pagefindIntegration());\n }\n }\n\n const vitePlugins: unknown[] = [virtualConfigPlugin(() => payload)];\n\n // Shiki tokenises at build time and needs no grammars emitted.\n if (cfg.code.highlighter === 'codeblock') {\n vitePlugins.push(microlighterGrammarsPlugin(config.root, logger));\n }\n\n if (cfg.autoIntegrations) {\n // Cast first: `.flat(Infinity)` over Vite's recursive PluginOption hits TS2589.\n const existing = (config.vite?.plugins ?? []) as unknown[];\n const hasTailwind = existing\n .flat(Infinity as 1)\n .some(\n (p) =>\n typeof (p as { name?: string })?.name === 'string' &&\n (p as { name: string }).name.includes('tailwind')\n );\n if (!hasTailwind) {\n const { default: tailwindcss } = await import('@tailwindcss/vite');\n vitePlugins.push(tailwindcss());\n }\n }\n\n // Typed loosely on purpose: inlining this hits \"type instantiation is excessively deep\".\n const markdown: Record<string, unknown> =\n cfg.code.highlighter === 'codeblock'\n ? {\n // Shiki must be off so the `pre` override receives raw source.\n syntaxHighlight: false,\n }\n : {\n shikiConfig: {\n themes: cfg.code.themes,\n defaultColor: false,\n wrap: cfg.code.wrap,\n ...(cfg.code.langs.length ? { langs: cfg.code.langs } : {}),\n },\n };\n\n /*\n Pin the markdown flavour rather than inheriting Astro's defaults. Astro 6.4 stopped defaulting `gfm` and `smartypants` onto `config.markdown`.\n */\n markdown.gfm = true;\n markdown.smartypants = true;\n\n const versionsDir = fileURLToPath(new URL('./.astro/eqty-docs/versions/', config.root));\n\n // Archived pages are documents, not apps: their imports bind them to today's library.\n markdown.remarkPlugins = [[remarkArchiveDocument, { versionsDir }]];\n\n // Astro does not apply `base` to authored markdown links. MDX inherits these via extendMarkdownConfig.\n markdown.rehypePlugins = [\n [rehypeBaseUrl, { base: config.base, pathPrefix: cfg.pathPrefix, versionsDir }],\n // Must follow rehypeBaseUrl: the hrefs this emits already carry `base`, and\n // rehypeBaseUrl would prefix them a second time.\n [\n rehypeRelativeLinks,\n {\n contentRoot: fileURLToPath(new URL(`./${cfg.contentDir}/`, config.srcDir)),\n base: config.base,\n pathPrefix: cfg.pathPrefix,\n onMissing: (href: string, filePath: string) =>\n logger.warn(\n `${path.relative(fileURLToPath(config.root), filePath)} links to ${href}, ` +\n `which is not a page in ${cfg.contentDir}`\n ),\n },\n ],\n rehypeProseScope,\n rehypeTableColumns,\n ...(cfg.code.highlighter === 'codeblock' ? [rehypeCodeFence] : []),\n ];\n\n // Resolve against the project root first, or a './...' path means different things\n // in dev and in a build.\n const resolveAsset = (spec: string) =>\n spec.startsWith('.') ? fileURLToPath(new URL(spec, config.root)) : spec;\n\n for (const href of cfg.customCss) {\n injectScript('page-ssr', `import ${JSON.stringify(resolveAsset(href))};`);\n }\n for (const src of cfg.clientScripts) {\n injectScript('page', `import ${JSON.stringify(resolveAsset(src))};`);\n }\n\n updateConfig({\n integrations: added,\n vite: { plugins: vitePlugins as never },\n markdown,\n } as never);\n },\n\n 'astro:config:done'({ injectTypes }) {\n injectTypes({\n filename: 'types.d.ts',\n content: [\n `declare module 'virtual:eqty-docs/config' {`,\n ` const config: import('@eqtylab/docs').DocsConfig & {`,\n ` env: import('@eqtylab/docs').DocsEnv;`,\n ` ownedByConsumer: string[];`,\n ` currentVersion: { id: string; group: string; version: string } | null;`,\n ` versionManifest: Array<{ id: string; suffix: string; group: string; tag: string; dir: string }>;`,\n ` versionRedirects: Array<{ id: string; to: string | null }>;`,\n ` };`,\n ` export default config;`,\n `}`,\n '',\n ].join('\\n'),\n });\n },\n\n 'astro:routes:resolved'({ routes, logger }) {\n // Catches collisions the filesystem scan cannot see.\n const seen = new Map<string, string>();\n for (const route of routes as Array<{ pattern: string; entrypoint: string }>) {\n const previous = seen.get(route.pattern);\n if (previous && previous !== route.entrypoint) {\n logger.warn(\n `Route ${route.pattern} is claimed twice:\\n ${previous}\\n ${route.entrypoint}\\n` +\n `One of them will be overwritten in the static build.`\n );\n }\n seen.set(route.pattern, route.entrypoint);\n }\n },\n },\n };\n}\n"]}
@@ -0,0 +1,33 @@
1
+ import { type Granularity, type VersionRedirect } from '../versions.ts';
2
+ export interface ExtractOptions {
3
+ root: string;
4
+ contentDirAbs: string;
5
+ cacheDir: string;
6
+ current?: string;
7
+ tags: string;
8
+ granularity: Granularity;
9
+ logger: {
10
+ info(msg: string): void;
11
+ warn(msg: string): void;
12
+ };
13
+ }
14
+ export interface CurrentVersion {
15
+ id: string;
16
+ group: string;
17
+ version: string;
18
+ }
19
+ export interface ManifestEntry {
20
+ id: string;
21
+ suffix: string;
22
+ group: string;
23
+ tag: string;
24
+ /** Filesystem path of the extracted content directory. */
25
+ dir: string;
26
+ }
27
+ export interface ExtractResult {
28
+ currentVersion: CurrentVersion | null;
29
+ versionManifest: ManifestEntry[];
30
+ versionRedirects: VersionRedirect[];
31
+ }
32
+ export declare const EMPTY_VERSIONS: ExtractResult;
33
+ export declare function extractVersions(o: ExtractOptions): ExtractResult;
@@ -1,5 +1,12 @@
1
+ /** The version id when `filePath` sits under `<versionsDir>/<id>/`, else undefined. */
2
+ export declare function versionFromPath(filePath: string | undefined, versionsDir: string | undefined): string | undefined;
1
3
  export declare function rehypeBaseUrl(options: {
2
4
  base: string;
3
- }): (tree: unknown) => void;
5
+ pathPrefix?: string;
6
+ versionsDir?: string;
7
+ }): (tree: unknown, file?: {
8
+ path?: string;
9
+ history?: string[];
10
+ }) => void;
4
11
  /** Same, for authored HTML strings in frontmatter. */
5
- export declare function rewriteHtmlBase(html: string, base: string): string;
12
+ export declare function rewriteHtmlBase(html: string, base: string, pathPrefix?: string, version?: string): string;
@@ -1,3 +1,3 @@
1
- export { rehypeBaseUrl, rewriteHtmlBase } from '../chunk-GSSSQTEV.js';
1
+ export { rehypeBaseUrl, rewriteHtmlBase, versionFromPath } from '../chunk-OM7745ZQ.js';
2
2
  //# sourceMappingURL=rehype-base-url.js.map
3
3
  //# sourceMappingURL=rehype-base-url.js.map
@@ -0,0 +1,6 @@
1
+ export declare function remarkArchiveDocument(options: {
2
+ versionsDir?: string;
3
+ }): (tree: unknown, file?: {
4
+ path?: string;
5
+ history?: string[];
6
+ }) => void;
package/dist/loaders.d.ts CHANGED
@@ -4,17 +4,17 @@ export declare const ROOT_GROUP_ID = "~root";
4
4
  /**
5
5
  * MDX only; stray `.md` files fail in `assertMdxOnly`. The `_*` negation is
6
6
  * required: the glob loader has no underscore skipping, so `_group.yaml` would become a page.
7
+ * `dir` is an absolute path for an extracted version; `base` is relative to `src/` for latest.
7
8
  */
8
9
  export declare function docsLoader(options?: {
9
10
  base?: string;
11
+ dir?: string;
10
12
  }): Loader;
11
13
  export declare function groupsLoader(options?: {
12
14
  base?: string;
15
+ dir?: string;
13
16
  }): Loader;
14
- /** Both collections, ready to spread. */
17
+ /** Latest plus one pair per extracted version, ready to spread into `collections`. */
15
18
  export declare function docsCollections(options?: {
16
19
  base?: string;
17
- }): {
18
- docs: unknown;
19
- docsGroups: unknown;
20
- };
20
+ }): Record<string, unknown>;
package/dist/loaders.js CHANGED
@@ -1,28 +1,28 @@
1
- import { groupSchema, docsSchema } from './chunk-IWKZQ4CW.js';
1
+ import { groupSchema, docsSchema } from './chunk-VNQZJMDO.js';
2
2
  import { readFile } from 'fs/promises';
3
3
  import path from 'path';
4
4
  import { fileURLToPath } from 'url';
5
5
  import { defineCollection } from 'astro:content';
6
6
  import { glob } from 'astro/loaders';
7
7
  import { globSync } from 'tinyglobby';
8
+ import CONFIG from 'virtual:eqty-docs/config';
8
9
  import { parse } from 'yaml';
9
10
 
10
11
  var GROUP_GLOB = "**/_group.{yaml,yml,json}";
11
12
  var ROOT_GROUP_ID = "~root";
12
13
  function docsLoader(options = {}) {
13
- const base = options.base ?? "content/docs";
14
+ const base = options.dir ?? `./src/${options.base ?? "content/docs"}`;
14
15
  return glob({
15
- base: `./src/${base}`,
16
+ base,
16
17
  pattern: ["**/*.mdx", "!**/_*", "!**/_*/**"]
17
18
  });
18
19
  }
19
20
  function groupsLoader(options = {}) {
20
21
  const base = options.base ?? "content/docs";
21
22
  return {
22
- name: "@eqtylab/docs:groups",
23
+ name: options.dir ? `@eqtylab/docs:groups:${path.basename(options.dir)}` : "@eqtylab/docs:groups",
23
24
  async load({ store, parseData, generateDigest, watcher, logger, config }) {
24
- const rootUrl = new URL(`./${base}/`, config.srcDir);
25
- const rootDir = fileURLToPath(rootUrl);
25
+ const rootDir = options.dir ?? fileURLToPath(new URL(`./${base}/`, config.srcDir));
26
26
  const files = globSync([GROUP_GLOB], { cwd: rootDir, absolute: false });
27
27
  const untouched = new Set(store.keys());
28
28
  for (const rel of files) {
@@ -68,7 +68,7 @@ function groupsLoader(options = {}) {
68
68
  };
69
69
  }
70
70
  function docsCollections(options = {}) {
71
- return {
71
+ const collections = {
72
72
  docs: defineCollection({
73
73
  loader: docsLoader(options),
74
74
  schema: docsSchema()
@@ -78,6 +78,17 @@ function docsCollections(options = {}) {
78
78
  schema: groupSchema()
79
79
  })
80
80
  };
81
+ for (const version of CONFIG.versionManifest ?? []) {
82
+ collections[`docs_${version.suffix}`] = defineCollection({
83
+ loader: docsLoader({ dir: version.dir }),
84
+ schema: docsSchema()
85
+ });
86
+ collections[`docsGroups_${version.suffix}`] = defineCollection({
87
+ loader: groupsLoader({ dir: version.dir }),
88
+ schema: groupSchema()
89
+ });
90
+ }
91
+ return collections;
81
92
  }
82
93
 
83
94
  export { ROOT_GROUP_ID, docsCollections, docsLoader, groupsLoader };
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/loaders.ts"],"names":["parseYaml"],"mappings":"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","file":"loaders.js","sourcesContent":["/** Astro cannot inject collections from an integration, so these are imported from the consumer's `content.config.ts`. */\nimport { readFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { defineCollection } from 'astro:content';\nimport { glob } from 'astro/loaders';\nimport type { Loader, LoaderContext } from 'astro/loaders';\nimport { globSync } from 'tinyglobby';\nimport { parse as parseYaml } from 'yaml';\n\nimport { docsSchema, groupSchema } from './schema.ts';\n\nconst GROUP_GLOB = '**/_group.{yaml,yml,json}';\n\n/** Sentinel id for the content root's own `_group.yaml`; '' is not a valid store key. */\nexport const ROOT_GROUP_ID = '~root';\n\n/**\n * MDX only; stray `.md` files fail in `assertMdxOnly`. The `_*` negation is\n * required: the glob loader has no underscore skipping, so `_group.yaml` would become a page.\n */\nexport function docsLoader(options: { base?: string } = {}): Loader {\n const base = options.base ?? 'content/docs';\n return glob({\n base: `./src/${base}`,\n pattern: ['**/*.mdx', '!**/_*', '!**/_*/**'],\n });\n}\n\nexport function groupsLoader(options: { base?: string } = {}): Loader {\n const base = options.base ?? 'content/docs';\n\n return {\n name: '@eqtylab/docs:groups',\n\n async load({ store, parseData, generateDigest, watcher, logger, config }: LoaderContext) {\n const rootUrl = new URL(`./${base}/`, config.srcDir);\n const rootDir = fileURLToPath(rootUrl);\n\n const files = globSync([GROUP_GLOB], { cwd: rootDir, absolute: false });\n const untouched = new Set(store.keys());\n\n for (const rel of files) {\n const dir = path.posix.dirname(rel.split(path.sep).join('/'));\n const id = dir === '.' ? ROOT_GROUP_ID : dir;\n const abs = path.join(rootDir, rel);\n\n let text: string;\n try {\n text = await readFile(abs, 'utf8');\n } catch (err) {\n logger.warn(`Could not read ${rel}: ${(err as Error).message}`);\n continue;\n }\n\n const digest = generateDigest(text);\n if (store.get(id)?.digest === digest) {\n untouched.delete(id);\n continue;\n }\n\n let raw: unknown;\n try {\n raw = rel.endsWith('.json') ? JSON.parse(text) : parseYaml(text);\n } catch (err) {\n throw new Error(`[@eqtylab/docs] Could not parse ${rel}: ${(err as Error).message}`);\n }\n\n const data = await parseData({\n id,\n data: (raw ?? {}) as Record<string, unknown>,\n filePath: path.relative(fileURLToPath(config.root), abs),\n });\n\n store.set({\n id,\n data,\n digest,\n filePath: path.relative(fileURLToPath(config.root), abs),\n });\n untouched.delete(id);\n }\n\n // Anything left was deleted on disk.\n for (const id of untouched) store.delete(id);\n\n if (watcher) {\n watcher.add(rootDir);\n }\n },\n };\n}\n\n/** Both collections, ready to spread. */\nexport function docsCollections(options: { base?: string } = {}) {\n return {\n docs: defineCollection({\n loader: docsLoader(options),\n schema: docsSchema(),\n }),\n docsGroups: defineCollection({\n loader: groupsLoader(options),\n schema: groupSchema(),\n }),\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/loaders.ts"],"names":["parseYaml"],"mappings":"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","file":"loaders.js","sourcesContent":["/** Astro cannot inject collections from an integration, so these are imported from the consumer's `content.config.ts`. */\nimport { readFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { defineCollection } from 'astro:content';\nimport { glob } from 'astro/loaders';\nimport type { Loader, LoaderContext } from 'astro/loaders';\nimport { globSync } from 'tinyglobby';\nimport CONFIG from 'virtual:eqty-docs/config';\nimport { parse as parseYaml } from 'yaml';\n\nimport { docsSchema, groupSchema } from './schema.ts';\n\nconst GROUP_GLOB = '**/_group.{yaml,yml,json}';\n\n/** Sentinel id for the content root's own `_group.yaml`; '' is not a valid store key. */\nexport const ROOT_GROUP_ID = '~root';\n\n/**\n * MDX only; stray `.md` files fail in `assertMdxOnly`. The `_*` negation is\n * required: the glob loader has no underscore skipping, so `_group.yaml` would become a page.\n * `dir` is an absolute path for an extracted version; `base` is relative to `src/` for latest.\n */\nexport function docsLoader(options: { base?: string; dir?: string } = {}): Loader {\n const base = options.dir ?? `./src/${options.base ?? 'content/docs'}`;\n return glob({\n base,\n pattern: ['**/*.mdx', '!**/_*', '!**/_*/**'],\n });\n}\n\nexport function groupsLoader(options: { base?: string; dir?: string } = {}): Loader {\n const base = options.base ?? 'content/docs';\n\n return {\n name: options.dir\n ? `@eqtylab/docs:groups:${path.basename(options.dir)}`\n : '@eqtylab/docs:groups',\n\n async load({ store, parseData, generateDigest, watcher, logger, config }: LoaderContext) {\n const rootDir = options.dir ?? fileURLToPath(new URL(`./${base}/`, config.srcDir));\n\n const files = globSync([GROUP_GLOB], { cwd: rootDir, absolute: false });\n const untouched = new Set(store.keys());\n\n for (const rel of files) {\n const dir = path.posix.dirname(rel.split(path.sep).join('/'));\n const id = dir === '.' ? ROOT_GROUP_ID : dir;\n const abs = path.join(rootDir, rel);\n\n let text: string;\n try {\n text = await readFile(abs, 'utf8');\n } catch (err) {\n logger.warn(`Could not read ${rel}: ${(err as Error).message}`);\n continue;\n }\n\n const digest = generateDigest(text);\n if (store.get(id)?.digest === digest) {\n untouched.delete(id);\n continue;\n }\n\n let raw: unknown;\n try {\n raw = rel.endsWith('.json') ? JSON.parse(text) : parseYaml(text);\n } catch (err) {\n throw new Error(`[@eqtylab/docs] Could not parse ${rel}: ${(err as Error).message}`);\n }\n\n const data = await parseData({\n id,\n data: (raw ?? {}) as Record<string, unknown>,\n filePath: path.relative(fileURLToPath(config.root), abs),\n });\n\n store.set({\n id,\n data,\n digest,\n filePath: path.relative(fileURLToPath(config.root), abs),\n });\n untouched.delete(id);\n }\n\n // Anything left was deleted on disk.\n for (const id of untouched) store.delete(id);\n\n if (watcher) {\n watcher.add(rootDir);\n }\n },\n };\n}\n\n/** Latest plus one pair per extracted version, ready to spread into `collections`. */\nexport function docsCollections(options: { base?: string } = {}) {\n const collections: Record<string, ReturnType<typeof defineCollection>> = {\n docs: defineCollection({\n loader: docsLoader(options),\n schema: docsSchema(),\n }),\n docsGroups: defineCollection({\n loader: groupsLoader(options),\n schema: groupSchema(),\n }),\n };\n for (const version of CONFIG.versionManifest ?? []) {\n collections[`docs_${version.suffix}`] = defineCollection({\n loader: docsLoader({ dir: version.dir }),\n schema: docsSchema(),\n });\n collections[`docsGroups_${version.suffix}`] = defineCollection({\n loader: groupsLoader({ dir: version.dir }),\n schema: groupSchema(),\n });\n }\n return collections;\n}\n"]}
package/dist/nav.d.ts CHANGED
@@ -8,6 +8,8 @@ export type SortMode = 'alpha' | 'filename' | 'manual';
8
8
  export interface GroupConfig {
9
9
  label?: string;
10
10
  icon?: string;
11
+ /** Label for the row linking to this folder's own index page. */
12
+ indexLabel?: string;
11
13
  order: string[];
12
14
  sort?: SortMode;
13
15
  collapsed?: boolean;
@@ -31,6 +33,8 @@ export interface BuildNavOptions {
31
33
  paths: PathContext;
32
34
  defaultCollapsed: boolean;
33
35
  defaultSort: SortMode;
36
+ /** Label for the row linking to a section's own index page. Defaults to 'Overview'. */
37
+ defaultIndexLabel?: string;
34
38
  /** Appended after folder-derived nodes. Plugin-contributed sections land here. */
35
39
  extra?: NavNode[];
36
40
  onWarn?: (message: string) => void;
package/dist/nav.js CHANGED
@@ -1,4 +1,4 @@
1
- import { isActive, docsHref, isAncestor } from './chunk-VJN3HXKM.js';
1
+ import { isActive, docsHref, isAncestor } from './chunk-LNQV7TVH.js';
2
2
 
3
3
  // src/nav.ts
4
4
  function titleCase(slug) {
@@ -33,6 +33,10 @@ function ancestorsOf(dir) {
33
33
  for (let i = 1; i <= parts.length; i++) out.push(parts.slice(0, i).join("/"));
34
34
  return out;
35
35
  }
36
+ var INDEX_LABEL = "Overview";
37
+ function isOverview(node) {
38
+ return node.kind === "page" && (node.name.toLowerCase() === INDEX_LABEL.toLowerCase() || node.label.trim().toLowerCase() === INDEX_LABEL.toLowerCase());
39
+ }
36
40
  function buildNavTree(options) {
37
41
  const {
38
42
  entries,
@@ -41,6 +45,9 @@ function buildNavTree(options) {
41
45
  paths,
42
46
  defaultCollapsed,
43
47
  defaultSort,
48
+ // Never let this be blank: an older consumer's stored config predates the option, and
49
+ // a nameless row is worse than a wrong one.
50
+ defaultIndexLabel = INDEX_LABEL,
44
51
  extra = [],
45
52
  onWarn
46
53
  } = options;
@@ -108,19 +115,24 @@ function buildNavTree(options) {
108
115
  attrs: link.attrs
109
116
  });
110
117
  }
111
- if (children.length === 0 && !index) return null;
118
+ if (index && dir) {
119
+ children.unshift({
120
+ ...pageNode(index),
121
+ name: cfg?.indexLabel ?? defaultIndexLabel,
122
+ label: cfg?.indexLabel ?? defaultIndexLabel
123
+ });
124
+ }
125
+ if (children.length === 0) return null;
112
126
  if (cfg?.hidden) return null;
113
- const href = index ? docsHref(index.entry.id, paths) : void 0;
127
+ const indexHref = index ? docsHref(index.entry.id, paths) : void 0;
114
128
  const label = cfg?.label ?? index?.entry.label ?? titleCase(dir.split("/").pop() ?? "");
115
- const inPath = (href ? isAncestor(currentPath, href) : false) || children.some((c) => c.inPath);
129
+ const inPath = (indexHref ? isAncestor(currentPath, indexHref) : false) || children.some((c) => c.inPath);
116
130
  return {
117
131
  kind: "group",
118
132
  name: dir.split("/").pop() ?? "",
119
133
  label,
120
- href,
121
134
  icon: cfg?.icon ?? index?.entry.icon,
122
135
  badge: cfg?.badge ?? index?.entry.badge,
123
- current: href ? isActive(currentPath, href) : false,
124
136
  inPath,
125
137
  // Containing the current page wins over `collapsed: true`.
126
138
  open: inPath || !(cfg?.collapsed ?? defaultCollapsed),
@@ -163,7 +175,9 @@ function orderChildren(children, cfg, sortMode, dir, onWarn) {
163
175
  } else {
164
176
  rest.sort((a, b) => byLocale(a.label, b.label) || byLocale(a.name, b.name));
165
177
  }
166
- return [...ordered, ...rest];
178
+ const all = [...ordered, ...rest];
179
+ const overview = all.filter(isOverview);
180
+ return overview.length ? [...overview, ...all.filter((c) => !isOverview(c))] : all;
167
181
  }
168
182
  function flattenNav(tree) {
169
183
  const out = [];