@eqtylab/docs 0.3.4 → 0.3.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/runtime/chrome/Header.astro +1 -3
- package/dist/runtime/chrome/Prose.astro +1 -1
- package/dist/runtime/components/CodeFence.astro +1 -1
- package/dist/runtime/layouts/DocsShell.astro +10 -1
- package/dist/runtime/styles/prose.css +9 -2
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -412,6 +412,8 @@ function docs(options = {}) {
|
|
|
412
412
|
...cfg.code.langs.length ? { langs: cfg.code.langs } : {}
|
|
413
413
|
}
|
|
414
414
|
};
|
|
415
|
+
markdown.gfm = true;
|
|
416
|
+
markdown.smartypants = true;
|
|
415
417
|
markdown.rehypePlugins = [
|
|
416
418
|
[rehypeBaseUrl, { base: config.base }],
|
|
417
419
|
// Must follow rehypeBaseUrl: the hrefs this emits already carry `base`, and
|
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/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 /*\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 // 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"]}
|
|
@@ -51,9 +51,7 @@ const navLink = 'eq-nav-control flex';
|
|
|
51
51
|
alt={CONFIG.logo.alt}
|
|
52
52
|
height="24"
|
|
53
53
|
/>
|
|
54
|
-
) :
|
|
55
|
-
<span class="whitespace-nowrap text-xl font-bold">{CONFIG.title}</span>
|
|
56
|
-
)
|
|
54
|
+
) : null
|
|
57
55
|
}
|
|
58
56
|
<span class="eq-display-gradient whitespace-nowrap text-xl font-bold forced-colors:text-inherit">
|
|
59
57
|
{CONFIG.title}
|
|
@@ -89,7 +89,7 @@ const action =
|
|
|
89
89
|
title sits entirely in the gradient's flat start. */
|
|
90
90
|
}
|
|
91
91
|
<h1
|
|
92
|
-
class="
|
|
92
|
+
class="w-fit text-4xl font-bold text-text-primary"
|
|
93
93
|
data-pagefind-meta="title"
|
|
94
94
|
>
|
|
95
95
|
{title}
|
|
@@ -26,7 +26,7 @@ const language = lang.toLowerCase();
|
|
|
26
26
|
loses to `.code-block` and the sample silently goes back to scrolling at 16rem.
|
|
27
27
|
*/}
|
|
28
28
|
<eq-highlight
|
|
29
|
-
class="mb-4 block [&_[class*=code-block]]:max-h-none!"
|
|
29
|
+
class="mb-4 block font-mono [&_[class*=code-block]]:max-h-none!"
|
|
30
30
|
data-eq-chrome
|
|
31
31
|
data-eq-copy={code}
|
|
32
32
|
>
|
|
@@ -16,6 +16,15 @@ interface Props {
|
|
|
16
16
|
|
|
17
17
|
const { title, description, noIndex, canonical } = Astro.props;
|
|
18
18
|
|
|
19
|
+
/*
|
|
20
|
+
* The `font-sans` class on <body> is load-bearing. Equality declares --font-sans in
|
|
21
|
+
* `@theme inline`, so Tailwind emits it only where something references it, and
|
|
22
|
+
* Equality's preflight sets `font-family: var(--font-sans)` on html. A consumer that
|
|
23
|
+
* never happens to use the utility drops the variable, the preflight resolves to
|
|
24
|
+
* nothing, and every page silently renders in the browser's default serif. Referencing
|
|
25
|
+
* it here is what keeps the design system's typeface applied for every consumer.
|
|
26
|
+
*/
|
|
27
|
+
|
|
19
28
|
const paths = {
|
|
20
29
|
base: import.meta.env.BASE_URL,
|
|
21
30
|
pathPrefix: CONFIG.pathPrefix,
|
|
@@ -86,7 +95,7 @@ const themeBootstrap = `
|
|
|
86
95
|
<script is:inline set:html={themeBootstrap} />
|
|
87
96
|
<slot name="head" />
|
|
88
97
|
</head>
|
|
89
|
-
<body>
|
|
98
|
+
<body class="font-sans">
|
|
90
99
|
<slot />
|
|
91
100
|
</body>
|
|
92
101
|
</html>
|
|
@@ -88,9 +88,16 @@
|
|
|
88
88
|
@apply text-text-primary hover:text-lilac-400 font-medium underline underline-offset-4 transition-all;
|
|
89
89
|
}
|
|
90
90
|
|
|
91
|
-
/*
|
|
91
|
+
/*
|
|
92
|
+
Inline code, but never the contents of a highlighted block.
|
|
93
|
+
|
|
94
|
+
`font-mono` is not decoration: Equality's preflight reaches --font-mono through
|
|
95
|
+
`var()`, and that variable is declared `@theme inline`, so Tailwind emits it only
|
|
96
|
+
where a utility references it. The utility inlines the literal stack instead, which
|
|
97
|
+
is what keeps code monospaced in a consumer that uses it nowhere else.
|
|
98
|
+
*/
|
|
92
99
|
:not(pre) > &:is(code) {
|
|
93
|
-
@apply dark:bg-background-overlay bg-greyscale-200 text-text-secondary rounded-sm p-1 text-sm;
|
|
100
|
+
@apply dark:bg-background-overlay bg-greyscale-200 text-text-secondary rounded-sm p-1 font-mono text-sm;
|
|
94
101
|
}
|
|
95
102
|
|
|
96
103
|
/* No table rules: markdown tables render through Equality's Table. */
|
package/package.json
CHANGED