From 42ba2deb00a4c498edb047bfb36eb751881e42c7 Mon Sep 17 00:00:00 2001 From: Kaylee <65376239+KayleeWilliams@users.noreply.github.com> Date: Wed, 22 Apr 2026 18:16:43 -0400 Subject: [PATCH 1/2] Make docs components app-owned --- README.md | 23 +-- .../docs/guides/components-fixture.mdx | 16 +- .../content/docs/guides/quickstart.mdx | 10 +- apps/docs-smoke/content/docs/index.mdx | 27 ++- .../src/components/docs-mdx}/accordion.tsx | 0 .../src/components/docs-mdx}/callout.tsx | 0 .../src/components/docs-mdx}/card.tsx | 0 .../src/components/docs-mdx}/command-tabs.tsx | 6 +- .../src/components/docs-mdx}/example.tsx | 8 +- .../src/components/docs-mdx}/index.ts | 3 +- .../components/docs-mdx}/mdx-components.ts | 10 -- .../src/components/docs-mdx}/mermaid.tsx | 4 +- .../src/components/docs-mdx}/selector.tsx | 14 +- .../src/components/docs-mdx}/steps.tsx | 0 .../src/components/docs-mdx}/tabs.tsx | 22 +-- .../components/docs-mdx}/topic-switcher.tsx | 0 .../src/components/docs-mdx}/type-table.tsx | 22 +-- .../src/generated/docs-search-content.json | 2 +- .../src/generated/docs-search-index.json | 2 +- apps/docs-smoke/src/lib/docs.ts | 25 ++- apps/docs-smoke/src/mdx-components.tsx | 2 +- apps/docs-smoke/src/routes/docs/index.tsx | 2 +- apps/docs-smoke/src/routes/index.tsx | 13 +- apps/docs-smoke/src/routes/playground.tsx | 16 +- apps/docs-smoke/tests/e2e/smoke.e2e.ts | 8 +- bun.lock | 6 - packages/docs/README.md | 13 +- .../docs/agent-docs-src/docs/components.mdx | 33 ++-- packages/docs/agent-docs-src/docs/index.mdx | 9 +- packages/docs/agent-docs/docs/components.md | 35 ++-- packages/docs/agent-docs/docs/index.md | 9 +- .../docs/llms-full/authoring/components.txt | 35 ++-- .../agent-docs/docs/llms-full/overview.txt | 11 +- packages/docs/agent-docs/docs/llms.txt | 2 +- packages/docs/package.json | 16 +- .../docs/src/components/components.test.tsx | 154 ------------------ .../docs/src/internal/package-surface.test.ts | 27 +++ .../docs/src/remark/remark-output.test.ts | 4 +- packages/docs/tsconfig.json | 2 +- packages/docs/tsup.config.ts | 12 -- 40 files changed, 215 insertions(+), 388 deletions(-) rename {packages/docs/src/components => apps/docs-smoke/src/components/docs-mdx}/accordion.tsx (100%) rename {packages/docs/src/components => apps/docs-smoke/src/components/docs-mdx}/callout.tsx (100%) rename {packages/docs/src/components => apps/docs-smoke/src/components/docs-mdx}/card.tsx (100%) rename {packages/docs/src/components => apps/docs-smoke/src/components/docs-mdx}/command-tabs.tsx (98%) rename {packages/docs/src/components => apps/docs-smoke/src/components/docs-mdx}/example.tsx (98%) rename {packages/docs/src/components => apps/docs-smoke/src/components/docs-mdx}/index.ts (92%) rename {packages/docs/src/components => apps/docs-smoke/src/components/docs-mdx}/mdx-components.ts (67%) rename {packages/docs/src/components => apps/docs-smoke/src/components/docs-mdx}/mermaid.tsx (93%) rename {packages/docs/src/components => apps/docs-smoke/src/components/docs-mdx}/selector.tsx (94%) rename {packages/docs/src/components => apps/docs-smoke/src/components/docs-mdx}/steps.tsx (100%) rename {packages/docs/src/components => apps/docs-smoke/src/components/docs-mdx}/tabs.tsx (98%) rename {packages/docs/src/components => apps/docs-smoke/src/components/docs-mdx}/topic-switcher.tsx (100%) rename {packages/docs/src/components => apps/docs-smoke/src/components/docs-mdx}/type-table.tsx (97%) delete mode 100644 packages/docs/src/components/components.test.tsx create mode 100644 packages/docs/src/internal/package-surface.test.ts diff --git a/README.md b/README.md index eed6f41..0d80bd0 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,9 @@ # @inth/docs -Shared docs tooling for Inth docs projects: React MDX rendering, MDX-to-markdown conversion, LLM bundles, validation, and static search. +Shared docs tooling for Inth docs projects: framework-neutral MDX-to-markdown conversion, LLM bundles, validation, and static search. `@inth/docs` is split into focused public entry points: -- `@inth/docs`: React MDX component adapters via `mdxComponents` - `@inth/docs/remark`: remark plugins plus `defaultRemarkPlugins` - `@inth/docs/convert`: MDX-to-markdown conversion APIs - `@inth/docs/llm`: `llms.txt` and topic-scoped full-context generation @@ -23,21 +22,15 @@ pnpm add @inth/docs ## Basic Usage -### Render MDX components +### Own MDX components in your app -```tsx -import { mdxComponents } from "@inth/docs"; - -const components = { - ...mdxComponents, -}; -``` +`@inth/docs` does not export prebuilt React, Vue, Nuxt, Svelte, or Astro components. Define the MDX component map in the docs app that renders your pages. ## Live Example App The repo includes a canonical consumer demo at `apps/docs-smoke`. -- Renders real `.mdx` fixture files through the package's exported `mdxComponents`. +- Renders real `.mdx` fixture files through app-owned `mdxComponents`. - Uses TanStack Start for SSR and hydration coverage. - Shows extracted `ExtractedTypeTable` output while keeping pipeline fixtures in the validation path. @@ -58,7 +51,7 @@ bun run --filter docs-smoke test:e2e Validation layers: -- Package unit tests in `packages/docs/src/**/*.test.ts*` cover component semantics and pure library behavior. +- Package unit tests in `packages/docs/src/**/*.test.ts*` cover framework-neutral conversion, search, linting, and generated docs behavior. - Pipeline fixtures in `apps/docs-smoke/scripts` and `apps/docs-smoke/content` cover MDX conversion, LLM generation, and `ExtractedTypeTable`. - The TanStack Start demo app in `apps/docs-smoke/src` covers real browser rendering and hydration. @@ -66,13 +59,15 @@ Validation layers: `@inth/docs` is not a hosted docs platform or a complete docs-site framework. Use tools such as Mintlify, Fumadocs, or Starlight when the primary job is shipping a polished docs website quickly. -Use this package when the primary job is shared docs infrastructure: MDX rendering adapters, MDX-to-markdown conversion, LLM bundles, linting, static search artifacts, answer helpers, and agent-facing docs output that can feed multiple apps and tools. +Use this package when the primary job is shared docs infrastructure: MDX-to-markdown conversion, LLM bundles, linting, static search artifacts, answer helpers, and agent-facing docs output that can feed multiple apps and tools. + +The pipeline entry points are framework-neutral. React, Vue, Nuxt, Svelte, Astro, and other stacks can use conversion, LLM, lint, and search APIs while owning their own runtime component rendering. ## Wiring It Into An App In a c15t-style repo with a top-level `docs/` directory, wire `@inth/docs` into the docs app and docs scripts: -- The docs app imports `mdxComponents` only if it renders MDX directly. +- The docs app owns `mdxComponents` if it renders MDX directly. - A conversion script runs `convertAllMdx({ srcDir: process.cwd(), outDir: "public" })`. - LLM and search scripts read the converted markdown under `public/docs/`. - Product code does not import `@inth/docs` unless it also renders docs pages. diff --git a/apps/docs-smoke/content/docs/guides/components-fixture.mdx b/apps/docs-smoke/content/docs/guides/components-fixture.mdx index ea120a5..14499ef 100644 --- a/apps/docs-smoke/content/docs/guides/components-fixture.mdx +++ b/apps/docs-smoke/content/docs/guides/components-fixture.mdx @@ -1,19 +1,19 @@ --- title: "Runtime Components" -description: "Render the browser-facing @inth/docs adapters through authored MDX." +description: "Render app-owned MDX components through authored docs content." --- # Runtime Components - This page exercises the exported MDX adapters without replacing them with app-local variants. + This page exercises the smoke app's MDX components without relying on package-owned runtime UI. ## Authoring Contract ```mdx - Render exported adapters through your shared `mdxComponents` map. + Render app-owned components through your shared `mdxComponents` map. @@ -70,7 +70,7 @@ description: "Render the browser-facing @inth/docs adapters through authored MDX Use semantic components such as `Callout`, `Tabs`, `Cards`, `Steps`, `CommandTabs`, `Accordion`, `Example`, `TopicSwitcher`, and `TypeTable`. - Import the `.mdx` file directly and provide `mdxComponents` through the shared runtime map. + Import the `.mdx` file directly and provide the app's `mdxComponents` through the shared runtime map. Keep `ExtractedTypeTable` coverage in the conversion pipeline where source extraction has a stable file-system base path. @@ -90,7 +90,7 @@ description: "Render the browser-facing @inth/docs adapters through authored MDX - This tabset proves the package adapters hydrate correctly inside the demo app. + This tabset proves the app-owned components hydrate correctly inside the demo app. `TypeTable` is safe to render live because all of its data is already present in the MDX payload. @@ -130,14 +130,14 @@ description: "Render the browser-facing @inth/docs adapters through authored MDX description="Preview the output and inspect the source." filename="mdx-components.tsx" language="tsx" - code={`import { mdxComponents } from "@inth/docs"; + code={`import { mdxComponents } from "@/components/docs-mdx"; export const components = { ...mdxComponents, };`} > - - The host app owns styling while `@inth/docs` owns the MDX component contract. + + The host app owns styling and runtime components while `@inth/docs` owns conversion. diff --git a/apps/docs-smoke/content/docs/guides/quickstart.mdx b/apps/docs-smoke/content/docs/guides/quickstart.mdx index 0dfdc1f..580fc09 100644 --- a/apps/docs-smoke/content/docs/guides/quickstart.mdx +++ b/apps/docs-smoke/content/docs/guides/quickstart.mdx @@ -5,7 +5,7 @@ description: "Wire @inth/docs into a docs app and docs pipeline." # Quickstart -`@inth/docs` is docs infrastructure. In a product repo such as c15t, you wire it into the docs app and docs scripts, not into the product runtime unless that runtime renders docs pages. +`@inth/docs` is docs infrastructure. In a product repo such as c15t, you wire it into the docs app and docs scripts, not into the product runtime unless that runtime renders or serves docs pages. ## What You Are Wiring @@ -13,7 +13,7 @@ description: "Wire @inth/docs into a docs app and docs pipeline." properties={{ "Docs app": { type: "runtime", - description: "Use `mdxComponents` when your React docs app imports and renders MDX files.", + description: "Define `mdxComponents` in your docs app when it imports and renders MDX files.", required: true, }, "Markdown export": { @@ -63,7 +63,7 @@ If your docs live under `content/docs/` instead, set `srcDir: "content"` and the Use this only in the app that renders documentation pages. ```tsx -import { mdxComponents } from "@inth/docs"; +import { mdxComponents } from "@/components/docs-mdx"; export const components = { ...mdxComponents, @@ -72,7 +72,9 @@ export const components = { }; ``` -`@inth/docs` does not own your routing, sidebar, layout, hosting, or framework. A Next.js, TanStack Start, Vite, Fumadocs, or Astro-backed docs app can still own those pieces. +`@inth/docs` does not own your routing, sidebar, layout, hosting, framework, or runtime UI components. A React, Next.js, TanStack Start, Vite, Fumadocs, or Astro-backed docs app can still own those pieces. + +React, Vue, Nuxt, Svelte, Astro, and other stacks can use the conversion, LLM, lint, and search entry points. Runtime MDX components should live in the consuming docs app. Framework docs can be exposed through `TopicSwitcher` while the conversion pipeline still resolves `{framework}` placeholders from `/docs/frameworks/:framework` routes. diff --git a/apps/docs-smoke/content/docs/index.mdx b/apps/docs-smoke/content/docs/index.mdx index 895e958..69c9cad 100644 --- a/apps/docs-smoke/content/docs/index.mdx +++ b/apps/docs-smoke/content/docs/index.mdx @@ -5,17 +5,12 @@ description: "Developer reference for rendering MDX, converting docs, generating # @inth/docs -`@inth/docs` is the shared package for docs rendering, docs pipelines, LLM-friendly output, validation, and local search. Use the smallest entry point that matches where your code runs. +`@inth/docs` is the shared package for framework-neutral docs pipelines, LLM-friendly output, validation, and local search. Use the smallest entry point that matches where your code runs. ## Package Surfaces - - Import `mdxComponents` from `@inth/docs`, spread it into your MDX provider, and override individual entries only when your app needs custom styling. + + Define `mdxComponents` in the docs app that renders your pages. `@inth/docs` intentionally does not export prebuilt UI components. Use `@inth/docs/convert` with `@inth/docs/remark` to flatten authored MDX into markdown that works in LLM bundles and search indexes. @@ -82,21 +77,25 @@ Use Mintlify, Fumadocs, or Starlight when the primary job is to ship a complete | [Mintlify](https://mintlify.com/) | Managed developer documentation platform with hosted docs, API docs, and AI-oriented product features. | Teams that want a polished docs product without owning the whole site pipeline. | | [Fumadocs](https://fumadocs.dev/) | Documentation framework and toolchain for React docs sites, especially Next.js. | Teams that want framework-level routing, navigation, UI, content adapters, search, and OpenAPI support. | | [Starlight](https://starlight.astro.build/) | Full-featured documentation framework built on Astro. | Teams already using Astro or wanting an Astro-native docs site. | -| `@inth/docs` | Shared docs infrastructure package: React MDX adapters, MDX-to-markdown conversion, LLM bundles, linting, static search, and answer helpers. | Teams that want to own the app shell while reusing one docs pipeline across sites, agents, search APIs, and internal tools. | +| `@inth/docs` | Shared docs infrastructure package: framework-neutral MDX-to-markdown conversion, LLM bundles, linting, static search, and answer helpers. | Teams that want to own the app shell and runtime components while reusing one docs pipeline across sites, agents, search APIs, and internal tools. | These tools are not mutually exclusive. A site framework can own the public docs experience while `@inth/docs` owns conversion, validation, search artifacts, and agent-facing bundles. +## Other Frameworks + +React, Vue, Nuxt, Svelte, Astro, and other stacks can use `@inth/docs/convert`, `@inth/docs/remark`, `@inth/docs/llm`, `@inth/docs/search`, and `@inth/docs/lint` today. Runtime MDX components belong in the consuming docs app, not this package. + ## Render MDX ```tsx -import { mdxComponents } from "@inth/docs"; +import { mdxComponents } from "@/components/docs-mdx"; export const components = { ...mdxComponents, }; ``` -The root export is a runtime contract. It is not tied to TanStack Start, shadcn, or this demo shell. +This smoke app keeps its React MDX components under `src/components/docs-mdx`. Consumers should create their own components that match their framework, design system, and accessibility requirements. ## Convert And Generate @@ -123,7 +122,7 @@ After conversion, use `@inth/docs/llm` to write `llms.txt` and topic-scoped full /> @@ -142,7 +141,7 @@ After conversion, use `@inth/docs/llm` to write `llms.txt` and topic-scoped full - Cover semantic HTML and safe runtime behavior in `packages/docs/src/**/*.test.ts*`. + Cover framework-neutral conversion, search, linting, and generated docs behavior in `packages/docs/src/**/*.test.ts*`. Cover conversion, type extraction, LLM output, and search generation in `apps/docs-smoke/scripts` and `apps/docs-smoke/content`. diff --git a/packages/docs/src/components/accordion.tsx b/apps/docs-smoke/src/components/docs-mdx/accordion.tsx similarity index 100% rename from packages/docs/src/components/accordion.tsx rename to apps/docs-smoke/src/components/docs-mdx/accordion.tsx diff --git a/packages/docs/src/components/callout.tsx b/apps/docs-smoke/src/components/docs-mdx/callout.tsx similarity index 100% rename from packages/docs/src/components/callout.tsx rename to apps/docs-smoke/src/components/docs-mdx/callout.tsx diff --git a/packages/docs/src/components/card.tsx b/apps/docs-smoke/src/components/docs-mdx/card.tsx similarity index 100% rename from packages/docs/src/components/card.tsx rename to apps/docs-smoke/src/components/docs-mdx/card.tsx diff --git a/packages/docs/src/components/command-tabs.tsx b/apps/docs-smoke/src/components/docs-mdx/command-tabs.tsx similarity index 98% rename from packages/docs/src/components/command-tabs.tsx rename to apps/docs-smoke/src/components/docs-mdx/command-tabs.tsx index 5263026..33b77ce 100644 --- a/packages/docs/src/components/command-tabs.tsx +++ b/apps/docs-smoke/src/components/docs-mdx/command-tabs.tsx @@ -7,12 +7,12 @@ const MANAGERS = ["npm", "pnpm", "yarn", "bun"] as const; export type PackageManager = (typeof MANAGERS)[number]; export type CommandMode = "run" | "install" | "create"; -type BaseCommandTabsProps = { +interface BaseCommandTabsProps { + children?: ReactNode; /** Or pass pre-rendered commands per manager */ commands?: Partial>; defaultManager?: PackageManager; - children?: ReactNode; -}; +} type ModeCommandTabsProps = BaseCommandTabsProps & { /** Command template. `{pm}` is replaced with the active package manager. */ diff --git a/packages/docs/src/components/example.tsx b/apps/docs-smoke/src/components/docs-mdx/example.tsx similarity index 98% rename from packages/docs/src/components/example.tsx rename to apps/docs-smoke/src/components/docs-mdx/example.tsx index 1af9c20..8f05e43 100644 --- a/packages/docs/src/components/example.tsx +++ b/apps/docs-smoke/src/components/docs-mdx/example.tsx @@ -2,12 +2,12 @@ import type { HTMLAttributes, ReactNode } from "react"; const SOURCE_FILE_KEY_HASH_MODULUS = 2_147_483_647; -export type ExampleSourceFile = { - id?: string; +export interface ExampleSourceFile { + code: string; filename: string; + id?: string; language?: string; - code: string; -}; +} export type ExampleProps = HTMLAttributes & { title?: string; diff --git a/packages/docs/src/components/index.ts b/apps/docs-smoke/src/components/docs-mdx/index.ts similarity index 92% rename from packages/docs/src/components/index.ts rename to apps/docs-smoke/src/components/docs-mdx/index.ts index fe5f3d9..09d5080 100644 --- a/packages/docs/src/components/index.ts +++ b/apps/docs-smoke/src/components/docs-mdx/index.ts @@ -1,5 +1,4 @@ -/** @biome-ignore lint/performance/noBarrelFile: package entry point */ - +// biome-ignore lint/performance/noBarrelFile: app-local MDX component entry point export { Accordion, AccordionItem, diff --git a/packages/docs/src/components/mdx-components.ts b/apps/docs-smoke/src/components/docs-mdx/mdx-components.ts similarity index 67% rename from packages/docs/src/components/mdx-components.ts rename to apps/docs-smoke/src/components/docs-mdx/mdx-components.ts index 552f07a..b1d5ee5 100644 --- a/packages/docs/src/components/mdx-components.ts +++ b/apps/docs-smoke/src/components/docs-mdx/mdx-components.ts @@ -10,16 +10,6 @@ import { Tab, Tabs } from "./tabs"; import { TopicSwitcher } from "./topic-switcher"; import { ExtractedTypeTable, TypeTable } from "./type-table"; -/** - * Default MDX component adapter map. Spread this into your MDXProvider (or - * framework-specific equivalent) and override individual entries with your - * own styled components: - * - * import { mdxComponents } from "@inth/docs"; - * import { MyCallout } from "./my-callout"; - * - * const components = { ...mdxComponents, Callout: MyCallout }; - */ export const mdxComponents = { Accordion, AccordionItem, diff --git a/packages/docs/src/components/mermaid.tsx b/apps/docs-smoke/src/components/docs-mdx/mermaid.tsx similarity index 93% rename from packages/docs/src/components/mermaid.tsx rename to apps/docs-smoke/src/components/docs-mdx/mermaid.tsx index 37a40c0..443bd56 100644 --- a/packages/docs/src/components/mermaid.tsx +++ b/apps/docs-smoke/src/components/docs-mdx/mermaid.tsx @@ -1,9 +1,9 @@ import type { ReactNode } from "react"; -export type MermaidProps = { +export interface MermaidProps { chart?: string; children?: ReactNode; -}; +} /** * Placeholder Mermaid renderer. Emits a `
` block so
diff --git a/packages/docs/src/components/selector.tsx b/apps/docs-smoke/src/components/docs-mdx/selector.tsx
similarity index 94%
rename from packages/docs/src/components/selector.tsx
rename to apps/docs-smoke/src/components/docs-mdx/selector.tsx
index 6348743..3483523 100644
--- a/packages/docs/src/components/selector.tsx
+++ b/apps/docs-smoke/src/components/docs-mdx/selector.tsx
@@ -2,17 +2,17 @@
 
 import { type ReactNode, useId, useState } from "react";
 
-export type SelectorOption = {
-  value: string;
+export interface SelectorOption {
   label: string;
-};
+  value: string;
+}
 
-export type SelectorProps = {
+export interface SelectorProps {
+  children?: (activeValue: string) => ReactNode;
+  defaultValue?: string;
   label?: string;
   options: SelectorOption[];
-  defaultValue?: string;
-  children?: (activeValue: string) => ReactNode;
-};
+}
 
 /**
  * Minimal dropdown-style selector. Consumers typically replace this with
diff --git a/packages/docs/src/components/steps.tsx b/apps/docs-smoke/src/components/docs-mdx/steps.tsx
similarity index 100%
rename from packages/docs/src/components/steps.tsx
rename to apps/docs-smoke/src/components/docs-mdx/steps.tsx
diff --git a/packages/docs/src/components/tabs.tsx b/apps/docs-smoke/src/components/docs-mdx/tabs.tsx
similarity index 98%
rename from packages/docs/src/components/tabs.tsx
rename to apps/docs-smoke/src/components/docs-mdx/tabs.tsx
index 1953ce7..89f1006 100644
--- a/packages/docs/src/components/tabs.tsx
+++ b/apps/docs-smoke/src/components/docs-mdx/tabs.tsx
@@ -10,12 +10,12 @@ import {
   useState,
 } from "react";
 
-type TabsContextValue = {
-  items: string[];
+interface TabsContextValue {
   activeValue: string;
-  setActiveValue: (value: string) => void;
   groupId: string;
-};
+  items: string[];
+  setActiveValue: (value: string) => void;
+}
 
 const TabsContext = createContext(null);
 
@@ -44,11 +44,11 @@ function panelId(groupId: string, normalized: string, index: number): string {
   return `${groupId}-panel-${normalized}-${index}`;
 }
 
-export type TabsProps = {
-  items?: string[];
-  defaultIndex?: number;
+export interface TabsProps {
   children?: ReactNode;
-};
+  defaultIndex?: number;
+  items?: string[];
+}
 
 export function Tabs({ items = [], defaultIndex = 0, children }: TabsProps) {
   const initial = items[defaultIndex] ?? items[0] ?? "";
@@ -126,10 +126,10 @@ export function Tabs({ items = [], defaultIndex = 0, children }: TabsProps) {
   );
 }
 
-export type TabProps = {
-  value: string;
+export interface TabProps {
   children?: ReactNode;
-};
+  value: string;
+}
 
 export function Tab({ value, children }: TabProps) {
   const { items, activeValue, groupId } = useTabsContext();
diff --git a/packages/docs/src/components/topic-switcher.tsx b/apps/docs-smoke/src/components/docs-mdx/topic-switcher.tsx
similarity index 100%
rename from packages/docs/src/components/topic-switcher.tsx
rename to apps/docs-smoke/src/components/docs-mdx/topic-switcher.tsx
diff --git a/packages/docs/src/components/type-table.tsx b/apps/docs-smoke/src/components/docs-mdx/type-table.tsx
similarity index 97%
rename from packages/docs/src/components/type-table.tsx
rename to apps/docs-smoke/src/components/docs-mdx/type-table.tsx
index d5e8b87..cad7a51 100644
--- a/packages/docs/src/components/type-table.tsx
+++ b/apps/docs-smoke/src/components/docs-mdx/type-table.tsx
@@ -1,14 +1,14 @@
 import type { ReactNode } from "react";
 
-export type TypeTableProperty = {
+export interface TypeTableProperty {
+  default?: string;
+  deprecated?: boolean;
   description?: ReactNode;
+  required?: boolean;
   type: string;
   typeDescription?: ReactNode;
   typeDescriptionLink?: string;
-  default?: string;
-  required?: boolean;
-  deprecated?: boolean;
-};
+}
 
 const SAFE_URL_SCHEMES = new Set(["http:", "https:", "mailto:"]);
 
@@ -50,9 +50,9 @@ function renderTypeWithLink(property: TypeTableProperty): ReactNode {
   );
 }
 
-export type TypeTableProps = {
+export interface TypeTableProps {
   properties?: Record;
-};
+}
 
 export function TypeTable({ properties }: TypeTableProps) {
   const rows = Object.entries(properties ?? {});
@@ -107,13 +107,13 @@ export function TypeTable({ properties }: TypeTableProps) {
   );
 }
 
-export type ExtractedTypeTableProps = {
-  /** Path to the source file — rendered as a caption; actual type extraction happens at build time via the remark plugin */
-  path?: string;
+export interface ExtractedTypeTableProps {
   /** The exported type name in the source file */
   name?: string;
+  /** Path to the source file — rendered as a caption; actual type extraction happens at build time via the remark plugin */
+  path?: string;
   properties?: Record;
-};
+}
 
 export function ExtractedTypeTable({
   path,
diff --git a/apps/docs-smoke/src/generated/docs-search-content.json b/apps/docs-smoke/src/generated/docs-search-content.json
index d0871a4..28f17de 100644
--- a/apps/docs-smoke/src/generated/docs-search-content.json
+++ b/apps/docs-smoke/src/generated/docs-search-content.json
@@ -1 +1 @@
-{"version":2,"generatedAt":"2026-04-22T22:16:29.604Z","chunks":["Runtime Components\n\nRender the browser-facing @inth/docs adapters through authored MDX.\n\nRuntime Components\n\n✅ Success Runtime fixture This page exercises the exported MDX adapters without replacing them with app-local variants.","Runtime Components\n\nRender the browser-facing @inth/docs adapters through authored MDX.\n\nRuntime Components\n\nAuthoring Contract\n\n```mdx  Render exported adapters through your shared `mdxComponents` map.      Accordion content is collapsible in the browser and still available after MDX-to-markdown conversion.    Tabs hydrate in the browser. Use `TypeTable` when type data already exists in MDX.    B[mdxComponents] B --> C[Rendered route] `} /> ```","Runtime Components\n\nRender the browser-facing @inth/docs adapters through authored MDX.\n\nRuntime Components\n\nNavigation Cards\n\nQuickstart route External reference","Runtime Components\n\nRender the browser-facing @inth/docs adapters through authored MDX.\n\nRuntime Components\n\nBrowser Flow\n\n1. Author MDX Use semantic components such as Callout , Tabs , Cards , Steps , CommandTabs , Accordion , Example , TopicSwitcher , and TypeTable . 2. Render in the app Import the .mdx file directly and provide mdxComponents through the shared runtime map. 3. Validate the pipeline separately Keep ExtractedTypeTable coverage in the conversion pipeline where source extraction has a stable file-system base path. Package manager Command -- -- npm npm install @inth/docs pnpm pnpm add @inth/docs yarn yarn add @inth/docs bun bun add @inth/docs Authoring rule Prefer semantic components whose content can flatten cleanly into markdown for agents, search indexes, and LLM bundles. Naming rule Use TopicSwitcher for equivalent docs slices. Frameworks are one topic category, not the whole abstraction. Overview This tabset proves the package adapters hydrate correctly inside the demo app. Tables TypeTable is safe to render live because all of its data is already present in the MDX payload. Pipeline note ExtractedTypeTable is rendered on /docs with extracted type data and verified in content/docs/guides/extracted-type-table-fixture.mdx .\n\n```tsx import { mdxComponents } from \"@inth/docs\"; export const components = { ...mdxComponents, }; ``` ```mermaid `flowchart LR A[Authored MDX] --> B[mdxComponents] B --> C[TanStack Start route] C --> D[Playwright coverage] ```","Runtime Components\n\nRender the browser-facing @inth/docs adapters through authored MDX.\n\nRuntime Components\n\nBrowser Flow\n\nX payload. Pipeline note ExtractedTypeTable is rendered on /docs with extracted type data and verified in content/docs/guides/extracted-type-table-fixture.mdx . Framework React — React integration Next.js — Next.js integration Svelte — Svelte integration Render MDX Preview the output and inspect the source. ✅ Success Runtime adapter The host app owns styling while @inth/docs owns the MDX component contract. mdx-components.tsx Property Type Description Default Required -- -- -- -- -- command string Package name, CLI name, or custom command template with a \\ pm placeholder. - ✅ Required mode \"install\" \\ \"run\" \\ \"create\" Optional expansion mode for package names, CLI names, or project starters such as \\ pnpm create next-app\\ . - Optional commands Partial\\ Render app-owned components through your shared `mdxComponents` map.      Accordion content is collapsible in the browser and still available after MDX-to-markdown conversion.    Tabs hydrate in the browser. Use `TypeTable` when type data already exists in MDX.    B[mdxComponents] B --> C[Rendered route] `} /> ```","Runtime Components\n\nRender app-owned MDX components through authored docs content.\n\nRuntime Components\n\nNavigation Cards\n\nQuickstart route External reference","Runtime Components\n\nRender app-owned MDX components through authored docs content.\n\nRuntime Components\n\nBrowser Flow\n\n1. Author MDX Use semantic components such as Callout , Tabs , Cards , Steps , CommandTabs , Accordion , Example , TopicSwitcher , and TypeTable . 2. Render in the app Import the .mdx file directly and provide the app's mdxComponents through the shared runtime map. 3. Validate the pipeline separately Keep ExtractedTypeTable coverage in the conversion pipeline where source extraction has a stable file-system base path. Package manager Command -- -- npm npm install @inth/docs pnpm pnpm add @inth/docs yarn yarn add @inth/docs bun bun add @inth/docs Authoring rule Prefer semantic components whose content can flatten cleanly into markdown for agents, search indexes, and LLM bundles. Naming rule Use TopicSwitcher for equivalent docs slices. Frameworks are one topic category, not the whole abstraction. Overview This tabset proves the app-owned components hydrate correctly inside the demo app. Tables TypeTable is safe to render live because all of its data is already present in the MDX payload. Pipeline note ExtractedTypeTable is rendered on /docs with extracted type data and verified in content/docs/guides/extracted-type-table-fixture.mdx .\n\n```tsx import { mdxComponents } from \"@/components/docs-mdx\"; export const components = { ...mdxComponents, }; ``` ```mermaid `flowchart LR A[Authored MDX] --> B[mdxComponents] B --> C[TanStack Start route] C --> D[Playwright coverage] ```","Runtime Components\n\nRender app-owned MDX components through authored docs content.\n\nRuntime Components\n\nBrowser Flow\n\nX payload. Pipeline note ExtractedTypeTable is rendered on /docs with extracted type data and verified in content/docs/guides/extracted-type-table-fixture.mdx . Framework React — React integration Next.js — Next.js integration Svelte — Svelte integration Render MDX Preview the output and inspect the source. ✅ Success Runtime components The host app owns styling and runtime components while @inth/docs owns conversion. mdx-components.tsx Property Type Description Default Required -- -- -- -- -- command string Package name, CLI name, or custom command template with a \\ pm placeholder. - ✅ Required mode \"install\" \\ \"run\" \\ \"create\" Optional expansion mode for package names, CLI names, or project starters such as \\ pnpm create next-app\\ . - Optional commands Partial\\;
 
diff --git a/apps/docs-smoke/src/routes/docs/index.tsx b/apps/docs-smoke/src/routes/docs/index.tsx
index 8bae4bc..3674b22 100644
--- a/apps/docs-smoke/src/routes/docs/index.tsx
+++ b/apps/docs-smoke/src/routes/docs/index.tsx
@@ -1,8 +1,8 @@
 import { dirname, resolve } from "node:path";
 import { fileURLToPath } from "node:url";
-import { Callout, ExtractedTypeTable } from "@inth/docs";
 import { createFileRoute } from "@tanstack/react-router";
 import { createServerFn } from "@tanstack/react-start";
+import { Callout, ExtractedTypeTable } from "@/components/docs-mdx";
 import DocsIndex from "../../../content/docs/index.mdx";
 
 const routeDirectory = dirname(fileURLToPath(import.meta.url));
diff --git a/apps/docs-smoke/src/routes/index.tsx b/apps/docs-smoke/src/routes/index.tsx
index e2b8b89..e32d138 100644
--- a/apps/docs-smoke/src/routes/index.tsx
+++ b/apps/docs-smoke/src/routes/index.tsx
@@ -31,9 +31,9 @@ function HomeRoute() {
               Build docs with @inth/docs
             
             

- Shared React MDX components, MDX conversion, LLM bundles, docs - linting, and static search in one package. This app renders the - package docs and keeps the integration paths easy to test. + Framework-neutral MDX conversion, LLM bundles, docs linting, and + static search. This app owns its MDX components while rendering + the package docs and keeping integration paths easy to test.

{startRoutes.map((route) => ( @@ -59,8 +59,9 @@ function HomeRoute() { Implementation contract

- Spread the package map into your MDX provider. Override - individual entries only when the app needs local styling. + Define the MDX component map in the docs app and spread it + into your MDX provider. The package owns conversion and + generation, not prebuilt UI.

-              {`import { mdxComponents } from "@inth/docs";
+              {`import { mdxComponents } from "@/components/docs-mdx";
 
 export const components = {
   ...mdxComponents,
diff --git a/apps/docs-smoke/src/routes/playground.tsx b/apps/docs-smoke/src/routes/playground.tsx
index f8079db..9424ba0 100644
--- a/apps/docs-smoke/src/routes/playground.tsx
+++ b/apps/docs-smoke/src/routes/playground.tsx
@@ -1,5 +1,6 @@
 "use client";
 
+import { createFileRoute, Link } from "@tanstack/react-router";
 import {
   Callout,
   CommandTabs,
@@ -7,16 +8,15 @@ import {
   Tab,
   Tabs,
   TypeTable,
-} from "@inth/docs";
-import { createFileRoute, Link } from "@tanstack/react-router";
+} from "@/components/docs-mdx";
 import { SiteHeader } from "@/components/site-header";
 
 const recipes = {
   render: {
     title: "Render MDX",
     summary:
-      "Use the root export when your docs site renders authored MDX in React.",
-    imports: `import { mdxComponents } from "@inth/docs";`,
+      "Define the MDX component map in your docs app when it renders authored MDX in React.",
+    imports: `import { mdxComponents } from "@/components/docs-mdx";`,
     code: `export const components = {
   ...mdxComponents,
 };`,
@@ -137,7 +137,7 @@ function RecipePanel({ activeValue }: { activeValue: string }) {
       
 
       
-

Live package behavior

+

Live app behavior

@@ -197,14 +197,14 @@ function RecipePreview({ activeValue }: { activeValue: string }) { return (
- + The default `mdxComponents` map keeps authored MDX semantic while the host app owns the surrounding shell and styling. - Write MDX with package components such as `Callout`, `Tabs`, `Cards`, - and `TypeTable`. + Write MDX with app-owned components such as `Callout`, `Tabs`, + `Cards`, and `TypeTable`. Spread `mdxComponents` into your MDX provider and override individual diff --git a/apps/docs-smoke/tests/e2e/smoke.e2e.ts b/apps/docs-smoke/tests/e2e/smoke.e2e.ts index c60cb67..5cc8c8b 100644 --- a/apps/docs-smoke/tests/e2e/smoke.e2e.ts +++ b/apps/docs-smoke/tests/e2e/smoke.e2e.ts @@ -12,7 +12,7 @@ async function waitForClientHydration(page: Page): Promise { ); } -test("home route renders the developer dashboard and package surfaces", async ({ +test("home route renders the developer dashboard and pipeline package surfaces", async ({ page, request, }) => { @@ -36,7 +36,7 @@ test("home route renders the developer dashboard and package surfaces", async ({ ).toBeVisible(); }); -test("docs route renders package docs and extracted ExtractedTypeTable output", async ({ +test("docs route renders docs pipeline reference and extracted ExtractedTypeTable output", async ({ page, request, }) => { @@ -80,7 +80,7 @@ test("search docs route explains the headless search APIs", async ({ ).toBeVisible(); }); -test("quickstart route renders MDX content on the server and hydrates interactive adapters", async ({ +test("quickstart route renders MDX content on the server and hydrates app-owned components", async ({ page, request, }) => { @@ -114,7 +114,7 @@ test("quickstart route renders MDX content on the server and hydrates interactiv ).toBeVisible(); }); -test("components fixture renders package adapters and preserves external link safety", async ({ +test("components fixture renders app-owned MDX components and preserves external link safety", async ({ page, request, }) => { diff --git a/bun.lock b/bun.lock index 316abca..75d1c06 100644 --- a/bun.lock +++ b/bun.lock @@ -87,13 +87,9 @@ "@tanstack/ai": "^0.13.0", "@types/mdast": "4.0.4", "@types/node": "^22.10.0", - "@types/react": "^19.0.0", - "@types/react-dom": "^19.0.0", "ai": "^6.0.168", "bash-tool": "1.3.16", "just-bash": "2.14.2", - "react": "^19.0.0", - "react-dom": "^19.0.0", "tsup": "^8.3.5", "typescript": "5.9.2", "vitest": "^2.1.8", @@ -104,7 +100,6 @@ "ai": ">=6.0.0", "bash-tool": ">=1.3.16", "just-bash": ">=2.14.2", - "react": ">=19.0.0", "typescript": ">=5.0.0", }, "optionalPeers": [ @@ -113,7 +108,6 @@ "ai", "bash-tool", "just-bash", - "react", "typescript", ], }, diff --git a/packages/docs/README.md b/packages/docs/README.md index b74993d..8c2558a 100644 --- a/packages/docs/README.md +++ b/packages/docs/README.md @@ -1,10 +1,9 @@ # @inth/docs -Shared MDX-to-markdown tooling for Inth docs projects. +Framework-neutral docs pipeline tooling for Inth docs projects. ## Package Surfaces -- `@inth/docs`: React MDX component adapters via `mdxComponents` - `@inth/docs/remark`: remark plugins plus `defaultRemarkPlugins` - `@inth/docs/convert`: MDX-to-markdown conversion APIs - `@inth/docs/llm`: `llms.txt` and topic-scoped full-context generation @@ -23,6 +22,8 @@ pnpm add @inth/docs ## Convert Docs +`@inth/docs` does not export prebuilt UI components. The docs app owns its MDX component map and styling; this package owns the framework-neutral conversion, LLM, lint, and search pipeline: + ```ts import { convertAllMdx } from "@inth/docs/convert"; import { defaultRemarkPlugins, remarkInclude } from "@inth/docs/remark"; @@ -38,9 +39,9 @@ await convertAllMdx({ This package is verified in three distinct layers: -- Package unit tests in `packages/docs/src/**/*.test.ts*` cover pure library behavior such as semantic markup and safe-link handling. +- Package unit tests in `packages/docs/src/**/*.test.ts*` cover pure library behavior such as conversion, search, linting, and generated docs output. - Pipeline fixtures in `apps/docs-smoke/scripts` and `apps/docs-smoke/content` exercise MDX conversion, LLM generation, and `ExtractedTypeTable`. -- The live consumer demo in `apps/docs-smoke` renders the exported `mdxComponents` inside a TanStack Start app and provides Playwright browser coverage. +- The live consumer demo in `apps/docs-smoke` owns and renders its MDX components inside a TanStack Start app and provides Playwright browser coverage. Use the demo app as the reference integration when you need to see how a consumer should host and style the package in practice. @@ -50,11 +51,13 @@ Use the demo app as the reference integration when you need to see how a consume Use `@inth/docs` when the docs pipeline also needs to feed converted markdown, agent bundles, lint checks, static search data, source-grounded answer routes, and internal tooling while the consuming app keeps control of routing, layout, hosting, and framework choices. +React, Vue, Nuxt, Svelte, Astro, and other stacks can use the framework-neutral pipeline APIs today while owning their own runtime component rendering. + ## App Wiring Model In a consuming repo, wire this package into the docs surface: -- Runtime docs app: spread `mdxComponents` into the MDX provider when the app renders MDX directly. +- Runtime docs app: define `mdxComponents` in the app when it renders MDX directly. - Docs pipeline: run `convertAllMdx` against the docs source tree. - Agent output: run `generateLlmsTxt` and `generateLLMFullContextFiles` against the converted markdown. - Search output: run `generateDocsSearchFiles`, then import the generated JSON in your docs search route. diff --git a/packages/docs/agent-docs-src/docs/components.mdx b/packages/docs/agent-docs-src/docs/components.mdx index 069bfd5..9cccae5 100644 --- a/packages/docs/agent-docs-src/docs/components.mdx +++ b/packages/docs/agent-docs-src/docs/components.mdx @@ -1,21 +1,19 @@ --- title: "Components" -description: "How to use the React MDX component adapters exported by @inth/docs." +description: "How to define app-owned MDX components that the @inth/docs pipeline can flatten." --- # Components -Import the default adapter map from the package root: +`@inth/docs` does not export prebuilt UI components or a `mdxComponents` map. The consuming docs app owns runtime rendering, styling, accessibility, and framework-specific integration. -```tsx -import { mdxComponents } from "@inth/docs"; -``` +The package only assumes a small authoring contract for MDX component names so the remark pipeline can flatten those components into markdown for agents, LLM bundles, search indexes, and validation. -The root export is intentionally small. It gives consumers a ready-to-spread MDX component map and the individual component implementations used by that map. +## App-Owned Adapter Map -## Default Adapter Map +Define your own `mdxComponents` map in the docs app. The smoke app keeps its example implementation under `apps/docs-smoke/src/components/docs-mdx`. -`mdxComponents` includes: +Common component names handled by the default remark pipeline include: - `Accordion` - `AccordionItem` @@ -37,15 +35,14 @@ The root export is intentionally small. It gives consumers a ready-to-spread MDX Use it like this: ```tsx -import { mdxComponents } from "@inth/docs"; +import { mdxComponents } from "@/components/docs-mdx"; const components = { ...mdxComponents, - Callout: MyCallout, }; ``` -Override individual entries rather than replacing the full map unless you want to own all component bindings. +If your app uses different names, add custom remark plugins or adapter components that map authored MDX back to the names handled by the pipeline. ## Important Components @@ -84,7 +81,7 @@ Use `mode="install"` when `command` is a package name, `mode="run"` when `comman ### `Example` -Use for data-driven preview and source examples. The package component receives code as data; host apps can add filesystem loaders or dynamic imports outside `@inth/docs` when they need app-specific behavior. +Use for data-driven preview and source examples. The app-owned component receives code as data; host apps can add filesystem loaders or dynamic imports outside `@inth/docs` when they need app-specific behavior. ```tsx - - The host app owns styling while `@inth/docs` owns the MDX component contract. + + The host app owns styling and runtime components while `@inth/docs` owns conversion. ``` @@ -114,7 +111,7 @@ Use `TypeTable` for explicit prop or type rows you already know. Use `ExtractedT ### `Tabs`, `Tab`, `Steps`, `Step` -These components are primarily authoring affordances in MDX. When the markdown conversion pipeline runs, their content is flattened into standard markdown so agents do not need JSX-aware renderers. +These component names are primarily authoring affordances in MDX. When the markdown conversion pipeline runs, their content is flattened into standard markdown so agents do not need JSX-aware renderers. ### `TopicSwitcher` @@ -145,6 +142,6 @@ Use for reader-facing navigation across equivalent documentation topics. ## Guidance -- Prefer the package root export for React doc-site rendering. -- Override styling in the host app rather than forking the semantics. +- Keep runtime components in the docs app. +- Keep component names stable when the conversion pipeline depends on them. - If the goal is agent-readable markdown, read [Remark](/docs/remark) instead of reimplementing the JSX flattening rules. diff --git a/packages/docs/agent-docs-src/docs/index.mdx b/packages/docs/agent-docs-src/docs/index.mdx index bd107ea..bfd3984 100644 --- a/packages/docs/agent-docs-src/docs/index.mdx +++ b/packages/docs/agent-docs-src/docs/index.mdx @@ -7,7 +7,6 @@ description: "Reference map for the shared MDX conversion, linting, and LLM doc- `@inth/docs` is the shared docs package for Inth properties. It provides: -- React MDX component adapters for doc sites. - A remark pipeline that flattens MDX components into LLM-friendly markdown. - MDX to markdown conversion utilities. - `llms.txt` and topic-scoped `llms-full/*.txt` generators. @@ -16,7 +15,7 @@ description: "Reference map for the shared MDX conversion, linting, and LLM doc- ## Package Surfaces -- [Components](/docs/components): React components and the `mdxComponents` adapter map. +- [Components](/docs/components): The app-owned MDX component contract used by the remark pipeline. - [Convert](/docs/convert): `convertMdxToMarkdown`, `writeMdxFileAsMarkdown`, and `convertAllMdx`. - [Remark](/docs/remark): individual remark plugins plus `defaultRemarkPlugins`. - [LLM](/docs/llm): `generateLlmsTxt` and `generateLLMFullContextFiles`. @@ -25,9 +24,13 @@ description: "Reference map for the shared MDX conversion, linting, and LLM doc- ## When To Read Which Page -- Reach for [Components](/docs/components) when wiring MDX rendering into an app. +- Reach for [Components](/docs/components) when defining app-owned MDX components for authored docs. - Read [Convert](/docs/convert) when you need markdown output from `.mdx` files. - Read [Remark](/docs/remark) when you need custom plugin order or component flattening behavior. - Read [LLM](/docs/llm) when generating `llms.txt` or topic-scoped full-context bundles. - Read [Search](/docs/search) when generating a static index, querying docs at runtime, or streaming grounded answers. - Read [Lint](/docs/lint) when validating frontmatter, docs URLs, or sidebar metadata. + +## Other Frameworks + +React, Vue, Nuxt, Svelte, Astro, and other stacks can use the conversion, LLM, lint, and search entry points today. Runtime MDX components belong in the consuming docs app, not this package. diff --git a/packages/docs/agent-docs/docs/components.md b/packages/docs/agent-docs/docs/components.md index b86cf32..e11e15c 100644 --- a/packages/docs/agent-docs/docs/components.md +++ b/packages/docs/agent-docs/docs/components.md @@ -1,20 +1,20 @@ --- title: Components -description: How to use the React MDX component adapters exported by @inth/docs. +description: >- + How to define app-owned MDX components that the @inth/docs pipeline can + flatten. --- # Components -Import the default adapter map from the package root: +`@inth/docs` does not export prebuilt UI components or a `mdxComponents` map. The consuming docs app owns runtime rendering, styling, accessibility, and framework-specific integration. -```tsx -import { mdxComponents } from "@inth/docs"; -``` +The package only assumes a small authoring contract for MDX component names so the remark pipeline can flatten those components into markdown for agents, LLM bundles, search indexes, and validation. -The root export is intentionally small. It gives consumers a ready-to-spread MDX component map and the individual component implementations used by that map. +## App-Owned Adapter Map -## Default Adapter Map +Define your own `mdxComponents` map in the docs app. The smoke app keeps its example implementation under `apps/docs-smoke/src/components/docs-mdx`. -`mdxComponents` includes: +Common component names handled by the default remark pipeline include: * `Accordion` * `AccordionItem` @@ -36,15 +36,14 @@ The root export is intentionally small. It gives consumers a ready-to-spread MDX Use it like this: ```tsx -import { mdxComponents } from "@inth/docs"; +import { mdxComponents } from "@/components/docs-mdx"; const components = { ...mdxComponents, - Callout: MyCallout, }; ``` -Override individual entries rather than replacing the full map unless you want to own all component bindings. +If your app uses different names, add custom remark plugins or adapter components that map authored MDX back to the names handled by the pipeline. ## Important Components @@ -83,7 +82,7 @@ Use `mode="install"` when `command` is a package name, `mode="run"` when `comman ### `Example` -Use for data-driven preview and source examples. The package component receives code as data; host apps can add filesystem loaders or dynamic imports outside `@inth/docs` when they need app-specific behavior. +Use for data-driven preview and source examples. The app-owned component receives code as data; host apps can add filesystem loaders or dynamic imports outside `@inth/docs` when they need app-specific behavior. ```tsx - - The host app owns styling while `@inth/docs` owns the MDX component contract. + + The host app owns styling and runtime components while `@inth/docs` owns conversion. ``` @@ -113,7 +112,7 @@ Use `TypeTable` for explicit prop or type rows you already know. Use `ExtractedT ### `Tabs`, `Tab`, `Steps`, `Step` -These components are primarily authoring affordances in MDX. When the markdown conversion pipeline runs, their content is flattened into standard markdown so agents do not need JSX-aware renderers. +These component names are primarily authoring affordances in MDX. When the markdown conversion pipeline runs, their content is flattened into standard markdown so agents do not need JSX-aware renderers. ### `TopicSwitcher` @@ -144,6 +143,6 @@ Use for reader-facing navigation across equivalent documentation topics. ## Guidance -* Prefer the package root export for React doc-site rendering. -* Override styling in the host app rather than forking the semantics. +* Keep runtime components in the docs app. +* Keep component names stable when the conversion pipeline depends on them. * If the goal is agent-readable markdown, read [Remark](/docs/remark) instead of reimplementing the JSX flattening rules. diff --git a/packages/docs/agent-docs/docs/index.md b/packages/docs/agent-docs/docs/index.md index 6b53549..d23b537 100644 --- a/packages/docs/agent-docs/docs/index.md +++ b/packages/docs/agent-docs/docs/index.md @@ -8,7 +8,6 @@ description: >- `@inth/docs` is the shared docs package for Inth properties. It provides: -* React MDX component adapters for doc sites. * A remark pipeline that flattens MDX components into LLM-friendly markdown. * MDX to markdown conversion utilities. * `llms.txt` and topic-scoped `llms-full/*.txt` generators. @@ -17,7 +16,7 @@ description: >- ## Package Surfaces -* [Components](/docs/components): React components and the `mdxComponents` adapter map. +* [Components](/docs/components): The app-owned MDX component contract used by the remark pipeline. * [Convert](/docs/convert): `convertMdxToMarkdown`, `writeMdxFileAsMarkdown`, and `convertAllMdx`. * [Remark](/docs/remark): individual remark plugins plus `defaultRemarkPlugins`. * [LLM](/docs/llm): `generateLlmsTxt` and `generateLLMFullContextFiles`. @@ -26,9 +25,13 @@ description: >- ## When To Read Which Page -* Reach for [Components](/docs/components) when wiring MDX rendering into an app. +* Reach for [Components](/docs/components) when defining app-owned MDX components for authored docs. * Read [Convert](/docs/convert) when you need markdown output from `.mdx` files. * Read [Remark](/docs/remark) when you need custom plugin order or component flattening behavior. * Read [LLM](/docs/llm) when generating `llms.txt` or topic-scoped full-context bundles. * Read [Search](/docs/search) when generating a static index, querying docs at runtime, or streaming grounded answers. * Read [Lint](/docs/lint) when validating frontmatter, docs URLs, or sidebar metadata. + +## Other Frameworks + +React, Vue, Nuxt, Svelte, Astro, and other stacks can use the conversion, LLM, lint, and search entry points today. Runtime MDX components belong in the consuming docs app, not this package. diff --git a/packages/docs/agent-docs/docs/llms-full/authoring/components.txt b/packages/docs/agent-docs/docs/llms-full/authoring/components.txt index 9a9bd86..30cc7d7 100644 --- a/packages/docs/agent-docs/docs/llms-full/authoring/components.txt +++ b/packages/docs/agent-docs/docs/llms-full/authoring/components.txt @@ -4,27 +4,25 @@ ## Included Pages -- [Components](https://example.invalid/@inth/docs/docs/components): How to use the React MDX component adapters exported by @inth/docs. +- [Components](https://example.invalid/@inth/docs/docs/components): How to define app-owned MDX components that the @inth/docs pipeline can flatten. ## Content # Components URL: https://example.invalid/@inth/docs/docs/components -How to use the React MDX component adapters exported by @inth/docs. +How to define app-owned MDX components that the @inth/docs pipeline can flatten. # Components -Import the default adapter map from the package root: +`@inth/docs` does not export prebuilt UI components or a `mdxComponents` map. The consuming docs app owns runtime rendering, styling, accessibility, and framework-specific integration. -```tsx -import { mdxComponents } from "@inth/docs"; -``` +The package only assumes a small authoring contract for MDX component names so the remark pipeline can flatten those components into markdown for agents, LLM bundles, search indexes, and validation. -The root export is intentionally small. It gives consumers a ready-to-spread MDX component map and the individual component implementations used by that map. +## App-Owned Adapter Map -## Default Adapter Map +Define your own `mdxComponents` map in the docs app. The smoke app keeps its example implementation under `apps/docs-smoke/src/components/docs-mdx`. -`mdxComponents` includes: +Common component names handled by the default remark pipeline include: * `Accordion` * `AccordionItem` @@ -46,15 +44,14 @@ The root export is intentionally small. It gives consumers a ready-to-spread MDX Use it like this: ```tsx -import { mdxComponents } from "@inth/docs"; +import { mdxComponents } from "@/components/docs-mdx"; const components = { ...mdxComponents, - Callout: MyCallout, }; ``` -Override individual entries rather than replacing the full map unless you want to own all component bindings. +If your app uses different names, add custom remark plugins or adapter components that map authored MDX back to the names handled by the pipeline. ## Important Components @@ -93,7 +90,7 @@ Use `mode="install"` when `command` is a package name, `mode="run"` when `comman ### `Example` -Use for data-driven preview and source examples. The package component receives code as data; host apps can add filesystem loaders or dynamic imports outside `@inth/docs` when they need app-specific behavior. +Use for data-driven preview and source examples. The app-owned component receives code as data; host apps can add filesystem loaders or dynamic imports outside `@inth/docs` when they need app-specific behavior. ```tsx - - The host app owns styling while `@inth/docs` owns the MDX component contract. + + The host app owns styling and runtime components while `@inth/docs` owns conversion. ``` @@ -123,7 +120,7 @@ Use `TypeTable` for explicit prop or type rows you already know. Use `ExtractedT ### `Tabs`, `Tab`, `Steps`, `Step` -These components are primarily authoring affordances in MDX. When the markdown conversion pipeline runs, their content is flattened into standard markdown so agents do not need JSX-aware renderers. +These component names are primarily authoring affordances in MDX. When the markdown conversion pipeline runs, their content is flattened into standard markdown so agents do not need JSX-aware renderers. ### `TopicSwitcher` @@ -154,6 +151,6 @@ Use for reader-facing navigation across equivalent documentation topics. ## Guidance -* Prefer the package root export for React doc-site rendering. -* Override styling in the host app rather than forking the semantics. +* Keep runtime components in the docs app. +* Keep component names stable when the conversion pipeline depends on them. * If the goal is agent-readable markdown, read [Remark](/docs/remark) instead of reimplementing the JSX flattening rules. \ No newline at end of file diff --git a/packages/docs/agent-docs/docs/llms-full/overview.txt b/packages/docs/agent-docs/docs/llms-full/overview.txt index 5c694f3..fae2663 100644 --- a/packages/docs/agent-docs/docs/llms-full/overview.txt +++ b/packages/docs/agent-docs/docs/llms-full/overview.txt @@ -16,7 +16,6 @@ Reference map for the shared MDX conversion, linting, and LLM doc-generation pac `@inth/docs` is the shared docs package for Inth properties. It provides: -* React MDX component adapters for doc sites. * A remark pipeline that flattens MDX components into LLM-friendly markdown. * MDX to markdown conversion utilities. * `llms.txt` and topic-scoped `llms-full/*.txt` generators. @@ -25,7 +24,7 @@ Reference map for the shared MDX conversion, linting, and LLM doc-generation pac ## Package Surfaces -* [Components](/docs/components): React components and the `mdxComponents` adapter map. +* [Components](/docs/components): The app-owned MDX component contract used by the remark pipeline. * [Convert](/docs/convert): `convertMdxToMarkdown`, `writeMdxFileAsMarkdown`, and `convertAllMdx`. * [Remark](/docs/remark): individual remark plugins plus `defaultRemarkPlugins`. * [LLM](/docs/llm): `generateLlmsTxt` and `generateLLMFullContextFiles`. @@ -34,9 +33,13 @@ Reference map for the shared MDX conversion, linting, and LLM doc-generation pac ## When To Read Which Page -* Reach for [Components](/docs/components) when wiring MDX rendering into an app. +* Reach for [Components](/docs/components) when defining app-owned MDX components for authored docs. * Read [Convert](/docs/convert) when you need markdown output from `.mdx` files. * Read [Remark](/docs/remark) when you need custom plugin order or component flattening behavior. * Read [LLM](/docs/llm) when generating `llms.txt` or topic-scoped full-context bundles. * Read [Search](/docs/search) when generating a static index, querying docs at runtime, or streaming grounded answers. -* Read [Lint](/docs/lint) when validating frontmatter, docs URLs, or sidebar metadata. \ No newline at end of file +* Read [Lint](/docs/lint) when validating frontmatter, docs URLs, or sidebar metadata. + +## Other Frameworks + +React, Vue, Nuxt, Svelte, Astro, and other stacks can use the conversion, LLM, lint, and search entry points today. Runtime MDX components belong in the consuming docs app, not this package. \ No newline at end of file diff --git a/packages/docs/agent-docs/docs/llms.txt b/packages/docs/agent-docs/docs/llms.txt index 63121d2..313242e 100644 --- a/packages/docs/agent-docs/docs/llms.txt +++ b/packages/docs/agent-docs/docs/llms.txt @@ -16,7 +16,7 @@ Start here for package scope and surface selection. React MDX components and remark pipeline behavior. -- [Components](https://example.invalid/@inth/docs/docs/components): How to use the React MDX component adapters exported by @inth/docs. +- [Components](https://example.invalid/@inth/docs/docs/components): How to define app-owned MDX components that the @inth/docs pipeline can flatten. - [Remark](https://example.invalid/@inth/docs/docs/remark): Reference for the remark plugins and default plugin pipeline exported by @inth/docs. ## Generation diff --git a/packages/docs/package.json b/packages/docs/package.json index 77578c1..5f6dbc2 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -1,20 +1,14 @@ { "name": "@inth/docs", "version": "0.0.0", - "description": "Shared MDX→MD pipeline and React component adapters for Inth public docs", + "description": "Framework-neutral docs pipeline tooling for Inth public docs", "type": "module", "license": "MIT", "publishConfig": { "access": "public" }, "sideEffects": false, - "main": "./dist/components/index.js", - "types": "./dist/components/index.d.ts", "exports": { - ".": { - "types": "./dist/components/index.d.ts", - "import": "./dist/components/index.js" - }, "./remark": { "types": "./dist/remark/index.d.ts", "import": "./dist/remark/index.js" @@ -104,13 +98,9 @@ "@tanstack/ai": "^0.13.0", "@types/mdast": "4.0.4", "@types/node": "^22.10.0", - "@types/react": "^19.0.0", - "@types/react-dom": "^19.0.0", "ai": "^6.0.168", "bash-tool": "1.3.16", "just-bash": "2.14.2", - "react": "^19.0.0", - "react-dom": "^19.0.0", "tsup": "^8.3.5", "typescript": "5.9.2", "vitest": "^2.1.8" @@ -121,7 +111,6 @@ "ai": ">=6.0.0", "bash-tool": ">=1.3.16", "just-bash": ">=2.14.2", - "react": ">=19.0.0", "typescript": ">=5.0.0" }, "peerDependenciesMeta": { @@ -140,9 +129,6 @@ "just-bash": { "optional": true }, - "react": { - "optional": true - }, "typescript": { "optional": true } diff --git a/packages/docs/src/components/components.test.tsx b/packages/docs/src/components/components.test.tsx deleted file mode 100644 index f5e3a98..0000000 --- a/packages/docs/src/components/components.test.tsx +++ /dev/null @@ -1,154 +0,0 @@ -import { renderToStaticMarkup } from "react-dom/server"; -import { describe, expect, it } from "vitest"; -import { Accordion, AccordionItem } from "./accordion"; -import { Callout } from "./callout"; -import { Card } from "./card"; -import { CommandTabs } from "./command-tabs"; -import { Example } from "./example"; -import { Mermaid } from "./mermaid"; -import { TopicSwitcher, type TopicSwitcherItem } from "./topic-switcher"; -import { TypeTable } from "./type-table"; - -describe("component semantics", () => { - it("renders callouts as notes with a default title", () => { - const markup = renderToStaticMarkup( - Watch out. - ); - - expect(markup).toContain('role="note"'); - expect(markup).toContain("Warning"); - expect(markup).toContain("Watch out."); - }); - - it("adds safe external link attributes to cards", () => { - const markup = renderToStaticMarkup( - - ); - - expect(markup).toContain('target="_blank"'); - expect(markup).toContain('rel="noopener"'); - }); - - it("renders mermaid content as a plain code block fallback", () => { - const markup = renderToStaticMarkup( - B[Browser]"} /> - ); - - expect(markup).toContain("data-inth-mermaid"); - expect(markup).toContain("flowchart TD"); - }); - - it("renders install commands from package names", () => { - const markup = renderToStaticMarkup( - - ); - - expect(markup).toContain("npm install @inth/docs"); - }); - - it("keeps custom package manager command templates", () => { - const markup = renderToStaticMarkup( - - ); - - expect(markup).toContain("npm exec inth-docs-lint"); - }); - - it("renders create commands from starter names", () => { - const markup = renderToStaticMarkup( - - ); - - expect(markup).toContain("npm create next-app"); - }); - - it("drops unsafe type description links", () => { - const markup = renderToStaticMarkup( - - ); - - expect(markup).not.toContain("javascript:alert"); - expect(markup).not.toContain("string"); - }); - - it("renders accordion items as native details and summary elements", () => { - const markup = renderToStaticMarkup( - - Hidden content. - - ); - - expect(markup).toContain(" { - const markup = renderToStaticMarkup( - - Preview content. - - ); - - expect(markup).toContain("Preview content."); - expect(markup).toContain("export const value = true;"); - expect(markup).toContain('data-language="ts"'); - expect(markup).toContain("example.ts"); - }); - - it("marks the active topic switcher item as the current page", () => { - const markup = renderToStaticMarkup( - - ); - - expect(markup).toContain('aria-current="page"'); - expect(markup).toContain("/docs/frameworks/react/quickstart"); - expect(markup).toContain("/docs/frameworks/vue/quickstart"); - }); - - it("does not throw when topic switcher content omits an href at runtime", () => { - const malformedItems = [ - { value: "broken", label: "Broken" }, - ] as unknown as TopicSwitcherItem[]; - - const markup = renderToStaticMarkup( - - ); - - expect(markup).toContain("Broken"); - expect(markup).toContain('aria-disabled="true"'); - }); -}); diff --git a/packages/docs/src/internal/package-surface.test.ts b/packages/docs/src/internal/package-surface.test.ts new file mode 100644 index 0000000..0aac287 --- /dev/null +++ b/packages/docs/src/internal/package-surface.test.ts @@ -0,0 +1,27 @@ +import { describe, expect, it } from "vitest"; +import packageJson from "../../package.json"; + +const exportedPaths = Object.keys(packageJson.exports); + +describe("package surface", () => { + it("does not expose runtime component entry points", () => { + expect(exportedPaths).toEqual([ + "./remark", + "./convert", + "./llm", + "./search", + "./search/node", + "./search/ai", + "./search/bash", + "./search/vercel", + "./search/tanstack", + "./search/cloudflare", + "./lint", + ]); + }); + + it("does not expose root or runtime component adapters", () => { + expect(exportedPaths).not.toContain("."); + expect(exportedPaths).not.toContain("./react"); + }); +}); diff --git a/packages/docs/src/remark/remark-output.test.ts b/packages/docs/src/remark/remark-output.test.ts index 22ee451..9ef7f47 100644 --- a/packages/docs/src/remark/remark-output.test.ts +++ b/packages/docs/src/remark/remark-output.test.ts @@ -186,7 +186,7 @@ Body description="Preview the output and inspect the source." filename="mdx-components.tsx" language="tsx" - code={\`import { mdxComponents } from "@inth/docs"; + code={\`import { mdxComponents } from "@/components/docs-mdx"; export const components = { ...mdxComponents, @@ -204,7 +204,7 @@ export const components = { expect(result.markdown).toContain("**mdx-components.tsx**"); expect(result.markdown).toContain("```tsx"); expect(result.markdown).toContain( - 'import { mdxComponents } from "@inth/docs";' + 'import { mdxComponents } from "@/components/docs-mdx";' ); }); diff --git a/packages/docs/tsconfig.json b/packages/docs/tsconfig.json index 2f0ddd0..25e9ca7 100644 --- a/packages/docs/tsconfig.json +++ b/packages/docs/tsconfig.json @@ -1,6 +1,6 @@ { "$schema": "https://json.schemastore.org/tsconfig", - "extends": "@repo/typescript-config/react-library.json", + "extends": "@repo/typescript-config/base.json", "compilerOptions": { "outDir": "dist", "rootDir": "src", diff --git a/packages/docs/tsup.config.ts b/packages/docs/tsup.config.ts index b17ca70..f86cdbe 100644 --- a/packages/docs/tsup.config.ts +++ b/packages/docs/tsup.config.ts @@ -2,7 +2,6 @@ import { defineConfig } from "tsup"; export default defineConfig({ entry: { - "components/index": "src/components/index.ts", "remark/index": "src/remark/index.ts", "convert/index": "src/convert/index.ts", "llm/index": "src/llm/index.ts", @@ -26,24 +25,13 @@ export default defineConfig({ onSuccess: async () => { const { chmod, readFile, writeFile } = await import("node:fs/promises"); const cli = "dist/lint/cli.js"; - const components = "dist/components/index.js"; const contents = await readFile(cli, "utf8"); if (!contents.startsWith("#!")) { await writeFile(cli, `#!/usr/bin/env node\n${contents}`); } - const componentContents = await readFile(components, "utf8"); - // Consumers import the bundled root entry in RSC-aware apps, so the built - // barrel needs a client boundary even though only some source files use - // hooks directly. - if (!componentContents.startsWith('"use client";')) { - await writeFile(components, `"use client";\n${componentContents}`); - } await chmod(cli, 0o755); }, external: [ - "react", - "react-dom", - "next", "typescript", "fs", "path", From e50e4d55dcdda4a33c69f32706958895fb9dcc57 Mon Sep 17 00:00:00 2001 From: Kaylee <65376239+KayleeWilliams@users.noreply.github.com> Date: Thu, 23 Apr 2026 15:45:54 -0400 Subject: [PATCH 2/2] Address docs review comments --- packages/docs/agent-docs-src/docs/components.mdx | 2 +- packages/docs/agent-docs-src/docs/index.mdx | 10 +++++----- packages/docs/agent-docs/docs/components.md | 2 +- packages/docs/agent-docs/docs/index.md | 10 +++++----- .../agent-docs/docs/llms-full/authoring/components.txt | 2 +- packages/docs/agent-docs/docs/llms-full/overview.txt | 10 +++++----- packages/docs/src/internal/package-surface.test.ts | 7 +++++-- 7 files changed, 23 insertions(+), 20 deletions(-) diff --git a/packages/docs/agent-docs-src/docs/components.mdx b/packages/docs/agent-docs-src/docs/components.mdx index 9cccae5..01a444b 100644 --- a/packages/docs/agent-docs-src/docs/components.mdx +++ b/packages/docs/agent-docs-src/docs/components.mdx @@ -7,7 +7,7 @@ description: "How to define app-owned MDX components that the @inth/docs pipelin `@inth/docs` does not export prebuilt UI components or a `mdxComponents` map. The consuming docs app owns runtime rendering, styling, accessibility, and framework-specific integration. -The package only assumes a small authoring contract for MDX component names so the remark pipeline can flatten those components into markdown for agents, LLM bundles, search indexes, and validation. +The package only assumes a small authoring contract for MDX component names so the remark pipeline can flatten those components into Markdown for agents, LLM bundles, search indexes, and validation. ## App-Owned Adapter Map diff --git a/packages/docs/agent-docs-src/docs/index.mdx b/packages/docs/agent-docs-src/docs/index.mdx index bfd3984..5d522dc 100644 --- a/packages/docs/agent-docs-src/docs/index.mdx +++ b/packages/docs/agent-docs-src/docs/index.mdx @@ -25,11 +25,11 @@ description: "Reference map for the shared MDX conversion, linting, and LLM doc- ## When To Read Which Page - Reach for [Components](/docs/components) when defining app-owned MDX components for authored docs. -- Read [Convert](/docs/convert) when you need markdown output from `.mdx` files. -- Read [Remark](/docs/remark) when you need custom plugin order or component flattening behavior. -- Read [LLM](/docs/llm) when generating `llms.txt` or topic-scoped full-context bundles. -- Read [Search](/docs/search) when generating a static index, querying docs at runtime, or streaming grounded answers. -- Read [Lint](/docs/lint) when validating frontmatter, docs URLs, or sidebar metadata. +- Use [Convert](/docs/convert) when you need markdown output from `.mdx` files. +- Check [Remark](/docs/remark) for custom plugin order or component flattening behavior. +- Open [LLM](/docs/llm) when generating `llms.txt` or topic-scoped full-context bundles. +- See [Search](/docs/search) for static indexing, runtime querying, or grounded answer streaming. +- Use [Lint](/docs/lint) to validate frontmatter, docs URLs, or sidebar metadata. ## Other Frameworks diff --git a/packages/docs/agent-docs/docs/components.md b/packages/docs/agent-docs/docs/components.md index e11e15c..aa69beb 100644 --- a/packages/docs/agent-docs/docs/components.md +++ b/packages/docs/agent-docs/docs/components.md @@ -8,7 +8,7 @@ description: >- `@inth/docs` does not export prebuilt UI components or a `mdxComponents` map. The consuming docs app owns runtime rendering, styling, accessibility, and framework-specific integration. -The package only assumes a small authoring contract for MDX component names so the remark pipeline can flatten those components into markdown for agents, LLM bundles, search indexes, and validation. +The package only assumes a small authoring contract for MDX component names so the remark pipeline can flatten those components into Markdown for agents, LLM bundles, search indexes, and validation. ## App-Owned Adapter Map diff --git a/packages/docs/agent-docs/docs/index.md b/packages/docs/agent-docs/docs/index.md index d23b537..8e5a9fa 100644 --- a/packages/docs/agent-docs/docs/index.md +++ b/packages/docs/agent-docs/docs/index.md @@ -26,11 +26,11 @@ description: >- ## When To Read Which Page * Reach for [Components](/docs/components) when defining app-owned MDX components for authored docs. -* Read [Convert](/docs/convert) when you need markdown output from `.mdx` files. -* Read [Remark](/docs/remark) when you need custom plugin order or component flattening behavior. -* Read [LLM](/docs/llm) when generating `llms.txt` or topic-scoped full-context bundles. -* Read [Search](/docs/search) when generating a static index, querying docs at runtime, or streaming grounded answers. -* Read [Lint](/docs/lint) when validating frontmatter, docs URLs, or sidebar metadata. +* Use [Convert](/docs/convert) when you need markdown output from `.mdx` files. +* Check [Remark](/docs/remark) for custom plugin order or component flattening behavior. +* Open [LLM](/docs/llm) when generating `llms.txt` or topic-scoped full-context bundles. +* See [Search](/docs/search) for static indexing, runtime querying, or grounded answer streaming. +* Use [Lint](/docs/lint) to validate frontmatter, docs URLs, or sidebar metadata. ## Other Frameworks diff --git a/packages/docs/agent-docs/docs/llms-full/authoring/components.txt b/packages/docs/agent-docs/docs/llms-full/authoring/components.txt index 30cc7d7..b8cabca 100644 --- a/packages/docs/agent-docs/docs/llms-full/authoring/components.txt +++ b/packages/docs/agent-docs/docs/llms-full/authoring/components.txt @@ -16,7 +16,7 @@ How to define app-owned MDX components that the @inth/docs pipeline can flatten. `@inth/docs` does not export prebuilt UI components or a `mdxComponents` map. The consuming docs app owns runtime rendering, styling, accessibility, and framework-specific integration. -The package only assumes a small authoring contract for MDX component names so the remark pipeline can flatten those components into markdown for agents, LLM bundles, search indexes, and validation. +The package only assumes a small authoring contract for MDX component names so the remark pipeline can flatten those components into Markdown for agents, LLM bundles, search indexes, and validation. ## App-Owned Adapter Map diff --git a/packages/docs/agent-docs/docs/llms-full/overview.txt b/packages/docs/agent-docs/docs/llms-full/overview.txt index fae2663..63032f2 100644 --- a/packages/docs/agent-docs/docs/llms-full/overview.txt +++ b/packages/docs/agent-docs/docs/llms-full/overview.txt @@ -34,11 +34,11 @@ Reference map for the shared MDX conversion, linting, and LLM doc-generation pac ## When To Read Which Page * Reach for [Components](/docs/components) when defining app-owned MDX components for authored docs. -* Read [Convert](/docs/convert) when you need markdown output from `.mdx` files. -* Read [Remark](/docs/remark) when you need custom plugin order or component flattening behavior. -* Read [LLM](/docs/llm) when generating `llms.txt` or topic-scoped full-context bundles. -* Read [Search](/docs/search) when generating a static index, querying docs at runtime, or streaming grounded answers. -* Read [Lint](/docs/lint) when validating frontmatter, docs URLs, or sidebar metadata. +* Use [Convert](/docs/convert) when you need markdown output from `.mdx` files. +* Check [Remark](/docs/remark) for custom plugin order or component flattening behavior. +* Open [LLM](/docs/llm) when generating `llms.txt` or topic-scoped full-context bundles. +* See [Search](/docs/search) for static indexing, runtime querying, or grounded answer streaming. +* Use [Lint](/docs/lint) to validate frontmatter, docs URLs, or sidebar metadata. ## Other Frameworks diff --git a/packages/docs/src/internal/package-surface.test.ts b/packages/docs/src/internal/package-surface.test.ts index 0aac287..80997dc 100644 --- a/packages/docs/src/internal/package-surface.test.ts +++ b/packages/docs/src/internal/package-surface.test.ts @@ -5,7 +5,7 @@ const exportedPaths = Object.keys(packageJson.exports); describe("package surface", () => { it("does not expose runtime component entry points", () => { - expect(exportedPaths).toEqual([ + const expectedExportedPaths = [ "./remark", "./convert", "./llm", @@ -17,7 +17,10 @@ describe("package surface", () => { "./search/tanstack", "./search/cloudflare", "./lint", - ]); + ] as const; + + expect(exportedPaths).toHaveLength(expectedExportedPaths.length); + expect(new Set(exportedPaths)).toEqual(new Set(expectedExportedPaths)); }); it("does not expose root or runtime component adapters", () => {