@tenphi/docs 0.15.0 → 0.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/config/index.d.ts +3 -3
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +1 -1
- package/dist/config/schema.json +342 -8
- package/dist/{config-DoR8g9IM.js → config-Ci9Nv0wQ.js} +285 -13
- package/dist/config-Ci9Nv0wQ.js.map +1 -0
- package/dist/content/index.d.ts +1 -1
- package/dist/content/index.js +1 -1
- package/dist/{content-BIpXueW7.js → content-XLQlJDnf.js} +232 -16
- package/dist/content-XLQlJDnf.js.map +1 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/markdown/index.d.ts +1 -1
- package/dist/{types-B-msp1dH.d.ts → types-C-AgUcAb.d.ts} +87 -21
- package/dist/{types-B-msp1dH.d.ts.map → types-C-AgUcAb.d.ts.map} +1 -1
- package/package.json +2 -2
- package/dist/config-DoR8g9IM.js.map +0 -1
- package/dist/content-BIpXueW7.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types-
|
|
1
|
+
{"version":3,"file":"types-C-AgUcAb.d.ts","names":[],"sources":["../../../node_modules/.pnpm/@types+unist@3.0.3/node_modules/@types/unist/index.d.ts","../../../node_modules/.pnpm/@types+mdast@4.0.4/node_modules/@types/mdast/index.d.ts","../src/types.ts"],"x_google_ignoreList":[0,1],"mappings":";;;;;;;;;;;;;;;;;;;;;;;UAqBiB;;;;UAKA;;;;EAIb;;;;EAKA;;;;EAIA;;;;;;;UAQa;;;;EAIb,OAAO;;;;EAKP,KAAK;;;;;;;;;;;;UA6BQ;;;;EAIb;;;;EAKA,OAAO;;;;;;;EAQP,WAAW;;;;;;;;;;;;;;;;;;;;;;KCjFH;;;;;;;;;;KAWA;;;;;UAOK;;;;;EAKb;;;;;;;;;;;UAYa;;;;;;;;;;;;;;EAcb;;;;;;;;;;EAWA;;;;;UAMa,kBAAkB;;;;EAI/B,eAAe;;;;;UAMF;;;;EAIb;;;;;EAKA;;;;;;;;;;;;;;;;;;;;;UAuBa,aAAa;;;;;;;;;KAWlB,eAAe,sBAAsB;;;;;;;;;;;;;;;;;;UAmBhC;EACb,YAAY;EACZ,MAAM;EACN,SAAS;EACT,MAAM;EACN,MAAM;EACN,WAAW;EACX,OAAO;EACP,eAAe;;;;;;;;;KAUP,oBAAoB,2BAA2B;;;;;;;;;;;;;;;;;UAkB1C;EACb,YAAY;EACZ,oBAAoB;;;;;;;;;KAwCZ,cAAc,qBAAqB;;;;;;;;;;;;;;;;;UAkB9B;EACb,UAAU;;;;;;;;;KAUF,kBAAkB,yBAAyB;;;;;;;;;;;;;;;;;;UAmBtC;EACb,OAAO;EACP,QAAQ;EACR,UAAU;EACV,mBAAmB;EACnB,MAAM;EACN,OAAO;EACP,gBAAgB;EAChB,YAAY;EACZ,MAAM;EACN,eAAe;EACf,QAAQ;EACR,MAAM;;;;;;;;KASE,cAAc,qBAAqB;;;;;;;;;;;;;;;;;;;;UAqB9B;EACb,YAAY;EACZ,OAAO;EACP,MAAM;EACN,YAAY;EACZ,QAAQ;EACR,UAAU;EACV,oBAAoB;EACpB,mBAAmB;EACnB,SAAS;EACT,MAAM;EACN,OAAO;EACP,gBAAgB;EAChB,YAAY;EACZ,MAAM;EACN,eAAe;EACf,MAAM;EACN,UAAU;EACV,WAAW;EACX,QAAQ;EACR,OAAO;EACP,WAAW;EACX,UAAU;EACV,MAAM;EACN,eAAe;EACf,MAAM;;;;;;;;;KAUE,aAAa,oBAAoB;;;;;;;;;;;;;;;;;UAkB5B;EACb,WAAW;;;;;;;;;KAUH,eAAe,sBAAsB;;;;;;;;;;;;;;;;;UAkBhC;EACb,UAAU;;;;;;;;KAUF,UAAU;;;;;;;;;UA+CL,gBAAgB;;;;EAI7B;;;;;;;;;;;;;;;UAgBa,aAAa;;;;EAI1B,OAAO;;;;;;;;;UAUM,eAAe;;;;EAI5B,UAAU;;;;;;UAQG,mBAAmB;;;;EAIhC;;;;EAIA,UAAU,MAAM,eAAe;;;;EAI/B,OAAO;;;;;UAMM,uBAAuB;;;;UAKvB,cAAc;;;;EAI3B;;;;EAIA,OAAO;;;;;UAMM,kBAAkB;;;;UAKlB,aAAa;;;;EAI1B;;;;EAIA;;;;;;EAMA;;;;EAIA,OAAO;;;;;UAMM,iBAAiB;;;;UAKjB,mBAAmB,MAAM,aAAa;;;;EAInD;;;;EAIA,OAAO;;;;;UAMM,uBAAuB;;;;UAKvB,eAAe;;;;EAI5B;;;;EAIA,UAAU;;;;EAIV,OAAO;;;;;UAMM,mBAAmB;;;;UAKnB,iBAAiB;;;;EAI9B;;;;EAIA,UAAU;;;;EAIV,OAAO;;;;;UAMM,qBAAqB;;;;UAKrB,2BAA2B,QAAQ;;;;EAIhD;;;;EAIA,UAAU,MAAM,eAAe;;;;EAI/B,OAAO;;;;;UAMM,+BAA+B;;;;UAK/B,0BAA0B,aAAa;;;;EAIpD;;;;EAIA,OAAO;;;;;UAMM,8BAA8B;;;;UAK9B,gBAAgB;;;;EAI7B;;;;;;EAMA;;;;EAIA,UAAU;;;;EAIV,OAAO;;;;;UAMM,oBAAoB;;;;UAKpB,aAAa;;;;EAI1B;;;;EAIA,OAAO;;;;;UAMM,iBAAiB;;;;UAajB,cAAc,aAAa,MAAM;;;;EAI9C;;;;EAIA,OAAO;;;;;UAMM,kBAAkB;;;;UAKlB,uBAAuB,aAAa,MAAM;;;;EAIvD;;;;EAIA,OAAO;;;;;UAMM,2BAA2B;;;;UAK3B,mBAAmB;;;;EAIhC;;;;EAIA,OAAO;;;;;UAMM,uBAAuB;;;;UAKvB,aAAa,QAAQ;;;;EAIlC;;;;EAIA,UAAU;;;;EAIV,OAAO;;;;;UAMM,iBAAiB;;;;UAKjB,sBAAsB,QAAQ;;;;EAI3C;;;;EAIA,UAAU;;;;EAIV,OAAO;;;;;UAMM,0BAA0B;;;;UAK1B,aAAa;;;;EAI1B;;;;;EAKA;;;;EAIA;;;;;EAKA;;;;EAIA,UAAU;;;;EAIV,OAAO;;;;;UAMM,iBAAiB;;;;UAKjB,iBAAiB;;;;EAI9B;;;;;;;EAOA;;;;;EAKA;;;;EAIA,UAAU,MAAM,eAAe;;;;EAI/B,OAAO;;;;;UAMM,qBAAqB;;;;UAKrB,kBAAkB;;;;EAI/B;;;;EAIA,UAAU;;;;EAIV,OAAO;;;;;UAMM,sBAAsB;;;;;;UAOtB,aAAa;;;;EAI1B;;;;EAIA,OAAO;;;;;UAMM,iBAAiB;;;;UAKjB,eAAe;;;;EAI5B;;;;EAIA,UAAU;;;;EAIV,OAAO;;;;;UAMM,mBAAmB;;;;UAKnB,cAAc;;;;EAI3B;;;;EAIA,QAAQ;;;;EAIR,UAAU;;;;EAIV,OAAO;;;;;UAMM,kBAAkB;;;;UAKlB,iBAAiB;;;;EAI9B;;;;EAIA,UAAU;;;;EAIV,OAAO;;;;;UAMM,qBAAqB;;;;UAKrB,kBAAkB;;;;EAI/B;;;;EAIA,UAAU;;;;EAIV,OAAO;;;;;UAMM,sBAAsB;;;;UAKtB,aAAa;;;;EAI1B;;;;EAIA,OAAO;;;;;UAMM,iBAAiB;;;;UAKjB,sBAAsB;;;;EAInC;;;;EAIA,OAAO;;;;;UAMM,0BAA0B;;;;UAK1B,aAAa;;;;EAI1B;;;;EAIA,OAAO;;;;;UAMM,iBAAiB;;;KCllCtB;UAEK;EACf;EACA,UAAU;EACV;EACA;EACA;EACA;EACA;EACA,UAAU;IAAQ;IAAc;IAAe;;;UAGhC;EACf;;EAEA;;EAEA,WAAW;EACX;EACA;EACA;;EAEA,cAAc;;EAEd,mBAAmB;;UAGJ;EACf;EACA;;UAGe;EACf;;EAEA;;EAEA;EACA;;UAGe;;EAEf;;EAEA;;;UAIe;EACf;;EAEA;EACA;;UAGe;;EAEf;;;UAIe;EACf;EACA,QAAQ;EACR;;UAGe;EACf;EACA;EACA;;KAGU;;EAEV;EACA;;EAGI;EACA;EACA;EACA;EACA;EACA,qBAAqB;;EAGrB;EACA;EACA;EACA;EACA;EACA;;EAGA;EACA;EACA;EACA;EACA;EACA;EACA;;;EAIA;EACA;EACA;;UAIW;EACf,UAAU;EACV;;EAEA;;EAEA;;KAGU;EAEN;EAAe;EAAe,OAAO;;EACrC;EAAe;EAAe;IAAgB;;;EAC9C;EAAe;;UAEJ;EACf;EACA;;EAEA,QAAQ;;UAGO;EACf,QAAQ;;EAER,OAAO;;KAGG,mBAAmB,KAAK;;EAElC;EACA;IAAa;;EACb;;KAGU,cACR;EAEE,MAAM;EACN;IAAa;;EACb;IAEF;KAEQ;;;;;UAMK;EACf,OAAO;EACP,UAAU;EACV,iBAAiB;EACjB,kBAAkB;EAClB,mBAAmB;EACnB,oBAAoB;EACpB,kBAAkB;EAClB,mBAAmB;EACnB,mBAAmB;EACnB,oBAAoB;GACnB,qBAAqB;GACrB,gCAAgC;;UAGlB;EACf;EACA,WAAW;EACX,aAAa;EACb,gBAAgB;EAChB,aAAa;EACb,iBAAiB;EACjB,WAAW;EACX,gBAAgB;EAChB,YAAY;;;UAIG;EACf,OAAO;EACP,UAAU;EACV,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,aAAa;EACb,QAAQ;EACR,OAAO;GACN,eAAe;;;UAID;;EAEf;;EAEA;EACA;;;KAIU;EAEN;EAAgB;;EAChB;EAAgB,OAAO;;UAEZ;EACf,OAAO;EACP,UAAU;EACV,OAAO;;;KAIG,oBAAoB,kBAAkB;;UAGjC;EACf,OAAO;EACP,UAAU;EACV,UAAU;EACV,SAAS;;EAET,UAAU;;EAEV,SAAS;;EAET,UAAU;;EAEV,OAAO;;EAEP,WAAW;;;cAIA;KAqCD,gCAAgC;;cAG/B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA+MD,gCACV,aAAa,iCACH,iCAAiC;;KAGjC,kBAAkB;EAC5B;EACA;EACA;GACC,sBAAsB;GACtB,sBAAsB;GACtB,sBAAsB;;;KAIb,uBAAuB;;KAGvB,wBAAwB,aAAa,yBAC/C,kBACE,QAAQ,OAAO,gCAAgC,OAAO;KAE9C,2BACT,QAAQ,yBAAyB,wBAAwB;UAG3C;EACf,QAAQ;EACR,UAAU;EACV,QAAQ;EACR,SAAS;EACT,SAAS;EACT,UAAU;;EAEV,SAAS;;EAET,eAAe,eAAe;EAC9B;;UAGe;EACf;;EAEA;;UAGe;EACf;;UAGe;;EAEf,YAAY;;UAGG;EACf;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;UAGe;;EAEf;;EAEA,YAAY;EACZ,OAAO;EACP,OAAO;;EAEP,WAAW;;EAEX;;EAEA,UAAU,eAAe;;EAEzB;EACA,UAAU;EACV,aAAa,mBAAmB;EAChC,QAAQ;EACR,WAAW;EACX,SAAS;EACT,aAAa;EACb,QAAQ;;UAGO;EACf,WAAW;EACX,MAAM;EACN,MAAM;EACN,WAAW;EACX;EACA,UAAU,eAAe;EACzB;EACA,SAAS,SACP,KAAK,kEAEL;EACF,YAAY;EACZ,OAAO;IAAgB,OAAO;;EAC9B,UAAU,SAAS,KAAK,qDACtB;EACF,QAAQ,SAAS;EACjB,YAAY;EACZ,OAAO,SAAS;IAAiB;;;UAGlB;EACf;EACA;EACA;EACA;EACA;EACA;IAAoB;IAAgB;IAAgB;;EACpD;IACY;IAA0B;;EACtC;;EAEA;EACA;IACE;IACA;IACA;MACM;;MACA;MAAc;;MACd;MAAc;MAAe;;IACnC,UAAU;MACR;MACA;MACA;;;EAGJ,wBAAwB;EACxB;IAA0B;IAAe;;EACzC;IAA0B;IAAe;;EACzC;IAAW;;EACX;EACA,OAAO,MAAM;;UAGE;EACf;EACA;EACA;EACA;;UAGe;EACf;EACA;EACA;EACA;EACA;;UAGe,kBAAkB;EACjC;EACA;EACA;EACA;;UAGe;EACf;EACA;EACA;EACA,UAAU;EACV;EACA;EACA;EACA;EACA;EACA;EACA,aAAa;EACb,UAAU;EACV;EACA;EACA,KAAK;EACL,OAAO;EACP,QAAQ;EACR;EACA;IAAY;IAAmB;;;UAGhB;EACf;EACA;EACA;EACA;EACA,kBAAkB;;UAGH;EACf,WAAW;EACX;EACA,QAAQ;EACR,SAAS;EACT,QAAQ;EACR,QAAQ;EACR,aAAa;EACb,aAAa,gBAAgB;EAC7B,cAAc,oBAAoB,oBAAoB;;UAGvC;EACf;EACA;EACA;EACA;EACA;;UAGe;EACf;EACA,SAAS;;UAGM;EACf;EACA;EACA;EACA;EACA;IAAwB;IAAe;IAAc;;EACrD;IACE;IACA;IACA;IACA;MAAU,QAAQ;;;EAEpB;EACA;;UAGe;EACf;EACA,UAAU;EACV;EACA;EACA;;UAGe;EACf;EACA,SAAS;EACT,OAAO;;EAEP"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tenphi/docs",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.17.0",
|
|
4
4
|
"description": "Repository-native content and configuration engine for Cookbook",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"sideEffects": false,
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
"LICENSE"
|
|
34
34
|
],
|
|
35
35
|
"engines": {
|
|
36
|
-
"node": ">=22.
|
|
36
|
+
"node": ">=22.19"
|
|
37
37
|
},
|
|
38
38
|
"publishConfig": {
|
|
39
39
|
"access": "public"
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"config-DoR8g9IM.js","names":[],"sources":["../src/types.ts","../src/config/index.ts"],"sourcesContent":["import type { Styles, StylesWithoutSelectors } from \"@tenphi/tasty/core\";\nimport type { GlazeColorValue } from \"@tenphi/glaze\";\nimport type { Root } from \"mdast\";\n\nexport type DiagnosticSeverity = \"warning\" | \"error\";\n\nexport interface DocsDiagnostic {\n code: string;\n severity: DiagnosticSeverity;\n message: string;\n file?: string;\n line?: number;\n column?: number;\n hint?: string;\n related?: Array<{ file: string; line?: number; message: string }>;\n}\n\nexport interface SiteConfig {\n title?: string;\n /** Version of the documented package, rendered beside the site title. */\n version?: string;\n description?: string;\n url?: string;\n repository?: string;\n /** Source artwork used to generate browser, touch, and installable-app icons. */\n favicon?: string | SiteIconConfig;\n}\n\nexport interface SiteIconConfig {\n /** Local SVG, PNG, JPEG, WebP, AVIF, or GIF path, relative to the project root. */\n source: string;\n /** Opaque background for touch and maskable icons. */\n background?: string;\n}\n\n/** A language exposed by Starlight's locale picker and routing. */\nexport interface LocaleConfig {\n label: string;\n /** BCP-47 language tag. Defaults to the locale key. */\n lang?: string;\n dir?: \"ltr\" | \"rtl\";\n}\n\nexport interface EditLinkConfig {\n /** Base URL joined with each page's repository-relative source path. */\n baseUrl: string;\n}\n\n/** A custom HTML element rendered in the document head. */\nexport interface HeadConfig {\n tag: string;\n attrs?: Record<string, string | boolean | undefined>;\n content?: string;\n}\n\nexport interface NavigationPlacement {\n label?: string;\n order?: number;\n group?: string;\n}\n\nexport type DocsSource = {\n /** Stable name for cross-source links and repeated mounts. */\n id?: string;\n routeBase?: string;\n} & (\n | {\n file: string;\n root?: string;\n route?: string;\n title?: string;\n description?: string;\n navigation?: false | NavigationPlacement;\n }\n | {\n glob: string | string[];\n root?: string;\n base?: string;\n routeBase?: string;\n exclude?: string[];\n navigation?: \"auto\" | false;\n }\n | {\n package: string;\n registry?: string;\n include?: string[];\n exclude?: string[];\n index?: string;\n routeBase?: string;\n trust?: \"markdown\" | \"mdx\";\n }\n);\n\nexport interface ContentConfig {\n sources?: DocsSource[];\n allowOutsideRoot?: boolean;\n /** Rewrite absolute links into the current repository to matching Cookbook routes. */\n localizeRepositoryLinks?: boolean;\n /** Keep unrelated metadata without exposing it as renderer frontmatter. */\n frontmatter?: \"preserve\" | \"reject\";\n}\n\nexport type NavigationItem =\n | string\n | { label: string; items: NavigationItem[] }\n | { label: string; autogenerate: { directory: string } }\n | { label: string; link: string };\n\nexport interface NavigationTab {\n label: string;\n link: string;\n /** Sidebar tree shown while this tab is active. */\n items?: NavigationItem[];\n}\n\nexport interface NavigationConfig {\n items?: NavigationItem[];\n /** Optional primary navigation rendered as a compact row below the header. */\n tabs?: NavigationTab[];\n}\n\nexport type BrandConfig =\n | GlazeColorValue\n | {\n from: GlazeColorValue;\n contrast?: { apca: number | [number, number] };\n unsafeContrast?: boolean;\n };\n\nexport type ThemeTokenValue = string | number;\n\n/**\n * Tasty design tokens. `$name` is emitted as `--name`; existing `--name`\n * custom-property keys remain supported for compatibility.\n */\nexport interface ThemeTokens {\n $gap?: ThemeTokenValue;\n $radius?: ThemeTokenValue;\n \"$card-radius\"?: ThemeTokenValue;\n \"$border-width\"?: ThemeTokenValue;\n \"$outline-width\"?: ThemeTokenValue;\n \"$outline-offset\"?: ThemeTokenValue;\n \"$layout-width\"?: ThemeTokenValue;\n \"$content-width\"?: ThemeTokenValue;\n \"$sidebar-width\"?: ThemeTokenValue;\n \"$control-height\"?: ThemeTokenValue;\n [name: `$${string}`]: ThemeTokenValue | undefined;\n [customProperty: `--${string}`]: ThemeTokenValue | undefined;\n}\n\nexport interface TypographyPreset {\n fontFamily?: string;\n fontSize?: ThemeTokenValue;\n lineHeight?: ThemeTokenValue;\n letterSpacing?: ThemeTokenValue;\n fontWeight?: ThemeTokenValue;\n boldFontWeight?: ThemeTokenValue;\n iconSize?: ThemeTokenValue;\n textTransform?: ThemeTokenValue;\n fontStyle?: ThemeTokenValue;\n}\n\n/** Built-in presets can be overridden and additional Tasty presets may be added. */\nexport interface TypographyPresets {\n body?: TypographyPreset;\n heading?: TypographyPreset;\n h1?: TypographyPreset;\n h2?: TypographyPreset;\n h3?: TypographyPreset;\n h4?: TypographyPreset;\n h5?: TypographyPreset;\n h6?: TypographyPreset;\n navigation?: TypographyPreset;\n small?: TypographyPreset;\n code?: TypographyPreset;\n [name: string]: TypographyPreset | undefined;\n}\n\n/** Semantic palette inputs. Glaze resolves every value for all appearance modes. */\nexport interface ThemePaletteConfig {\n info?: GlazeColorValue;\n success?: GlazeColorValue;\n warning?: GlazeColorValue;\n danger?: GlazeColorValue;\n /** Light-scheme page surface; dark and high-contrast values adapt. */\n surface?: GlazeColorValue;\n /** Primary reading text seed, resolved against `surface`. */\n text?: GlazeColorValue;\n /** Secondary text seed, resolved against `surface`. */\n textSoft?: GlazeColorValue;\n}\n\n/** Cookbook UI surfaces whose default Tasty styles can be customized. */\nexport const COOKBOOK_COMPONENT_NAMES = [\n \"Card\",\n \"Callout\",\n \"CodeGroup\",\n \"Tab\",\n \"Footer\",\n \"Hero\",\n \"LanguageSelect\",\n \"Logo\",\n \"MarkdownCodeBlock\",\n \"MarkdownHeading\",\n \"MarkdownInlineCode\",\n \"MarkdownTable\",\n \"Mermaid\",\n \"MobileMenuFooter\",\n \"MobileMenuToggle\",\n \"MobileNavigationTabs\",\n \"MobileTableOfContents\",\n \"PackageVersion\",\n \"Preview\",\n \"Sidebar\",\n \"SocialIcons\",\n \"Steps\",\n \"Tabs\",\n \"TableOfContents\",\n \"ThemeSelect\",\n \"TopNavigation\",\n \"StarlightHeader\",\n] as const;\n\nexport type CookbookComponentName = (typeof COOKBOOK_COMPONENT_NAMES)[number];\n\n/** Named Tasty sub-elements available on each configurable Cookbook surface. */\nexport const COOKBOOK_COMPONENT_SUB_ELEMENTS = {\n Card: [\"Heading2\", \"Heading3\", \"Paragraph\"],\n Callout: [\"Title\", \"Body\", \"Tip\", \"Caution\", \"Danger\"],\n CodeGroup: [\"Caption\", \"Pre\", \"Code\"],\n Tab: [\"Heading\", \"Hidden\", \"HiddenHeading\"],\n Footer: [\n \"Meta\",\n \"LoneMetaItem\",\n \"MetaLink\",\n \"HoverMetaLink\",\n \"Credit\",\n \"CreditLink\",\n \"HoverCreditLink\",\n ],\n Hero: [\n \"Visual\",\n \"Stack\",\n \"Copy\",\n \"Title\",\n \"Tagline\",\n \"Actions\",\n \"Action\",\n \"HoverAction\",\n \"PrimaryAction\",\n \"SecondaryAction\",\n \"MinimalAction\",\n \"ActionIcon\",\n ],\n LanguageSelect: [\n \"Label\",\n \"HoverLabel\",\n \"LabelIcon\",\n \"Select\",\n \"Caret\",\n \"Option\",\n ],\n Logo: [\"Svg\", \"Mark\"],\n MarkdownCodeBlock: [\n \"Pre\",\n \"CopyButton\",\n \"HoverCopyButton\",\n \"CopiedButton\",\n \"CopyIcon\",\n \"CopiedIcon\",\n ],\n MarkdownHeading: [\n \"Heading\",\n \"Heading1\",\n \"Heading2\",\n \"Heading3\",\n \"Heading4\",\n \"Heading5\",\n \"Heading6\",\n \"Link\",\n \"HoverLink\",\n \"LinkIcon\",\n ],\n MarkdownTable: [\"Table\", \"Cell\", \"LastBodyRowCell\", \"HeaderCell\"],\n MarkdownInlineCode: [],\n Mermaid: [\"Diagram\", \"Text\", \"MonoText\"],\n MobileMenuFooter: [\"Social\"],\n MobileMenuToggle: [\"Control\", \"Icon\", \"HoverControl\", \"ActiveControl\"],\n MobileNavigationTabs: [\n \"Label\",\n \"List\",\n \"Item\",\n \"Link\",\n \"HoverLink\",\n \"CurrentLink\",\n ],\n MobileTableOfContents: [\n \"Item\",\n \"Link\",\n \"LinkLabel\",\n \"HoverLink\",\n \"CurrentLink\",\n \"CurrentIndicator\",\n ],\n PackageVersion: [],\n Preview: [\"Caption\", \"Stage\", \"Frame\", \"Code\", \"Summary\", \"Pre\"],\n Sidebar: [\n \"CurrentLink\",\n \"OpenPane\",\n \"Content\",\n \"List\",\n \"Item\",\n \"TopLevelSpacing\",\n \"GroupSpacing\",\n \"NestedItem\",\n \"Control\",\n \"Summary\",\n \"GroupLabel\",\n \"GroupLabelText\",\n \"Link\",\n \"LinkLabel\",\n \"InteractiveControl\",\n \"SummaryMarker\",\n \"TopLevelLink\",\n ],\n Steps: [\"Item\", \"Marker\"],\n SocialIcons: [\"Link\", \"HoverLink\", \"Icon\"],\n Tabs: [\"List\", \"Button\", \"SelectedButton\", \"FocusedButton\"],\n TableOfContents: [\n \"Heading\",\n \"List\",\n \"Item\",\n \"Link\",\n \"LinkLabel\",\n \"HoverLink\",\n \"CurrentLink\",\n ],\n ThemeSelect: [\n \"Trigger\",\n \"HoverTrigger\",\n \"Icon\",\n \"Panel\",\n \"Section\",\n \"SectionSpacing\",\n \"SectionLabel\",\n \"Option\",\n \"HoverOption\",\n \"CheckedOption\",\n \"FocusedOption\",\n \"Input\",\n \"OptionIcon\",\n \"Checkmark\",\n \"SelectedCheckmark\",\n ],\n TopNavigation: [\n \"Scrollbar\",\n \"Link\",\n \"HoverLink\",\n \"CurrentLink\",\n \"ActiveIndicator\",\n ],\n StarlightHeader: [\n \"Primary\",\n \"TitleAndSearch\",\n \"Title\",\n \"Logo\",\n \"SiteTitle\",\n \"Search\",\n \"SearchElement\",\n \"Tools\",\n \"ToolItem\",\n \"Social\",\n \"MobileTheme\",\n ],\n} as const satisfies Record<CookbookComponentName, readonly string[]>;\n\nexport type CookbookComponentSubElementName<\n Name extends CookbookComponentName,\n> = (typeof COOKBOOK_COMPONENT_SUB_ELEMENTS)[Name][number];\n\n/** A serializable partial Tasty style object, merged into the base internally. */\nexport type ComponentStyles = StylesWithoutSelectors & {\n $?: string;\n mode?: never;\n recipe?: string;\n [token: `$${string}`]: Styles[string];\n [color: `#${string}`]: Styles[string];\n [state: `@${string}`]: Styles[string];\n};\n\n/** Style properties supplied by the user to override Cookbook defaults. */\nexport type ComponentStyleConfig = ComponentStyles;\n\n/** A component override with typed suggestions for its named sub-elements. */\nexport type CookbookComponentStyles<Name extends CookbookComponentName> =\n ComponentStyles &\n Partial<Record<CookbookComponentSubElementName<Name>, ComponentStyles>>;\n\nexport type ComponentStylesConfig = {\n [Name in CookbookComponentName]?: CookbookComponentStyles<Name>;\n};\n\nexport interface ThemeConfig {\n brand?: BrandConfig;\n palette?: ThemePaletteConfig;\n states?: Record<string, string>;\n tokens?: ThemeTokens;\n presets?: TypographyPresets;\n /** Tasty UI styles, keyed by Cookbook component or bridge name. */\n styles?: ComponentStylesConfig;\n /** Explicit registration and overrides for user-authored components. */\n customStyles?: Record<string, Styles>;\n contrastLevel?: number | \"auto\";\n}\n\nexport interface MarkdownConfig {\n stripLeadingBadges?: boolean;\n /** Raw HTML policy for trusted Markdown. Untrusted package Markdown is always sanitized. */\n rawHtml?: \"allow\" | \"sanitize\" | \"strip\" | \"reject\";\n}\n\nexport interface SearchConfig {\n enabled?: boolean;\n}\n\nexport interface ComponentsConfig {\n /** Astro component paths keyed by Starlight component name. `Footer` also accepts `false`. */\n overrides?: Record<string, string | false>;\n}\n\nexport interface BuildConfig {\n strict?: boolean;\n ci?: boolean;\n cacheDir?: string;\n maxArtifactBytes?: number;\n maxUnpackedBytes?: number;\n maxFiles?: number;\n maxPathDepth?: number;\n maxAssetBytes?: number;\n}\n\nexport interface DocsConfig {\n /** Content and lock directory, relative to docs.config.ts (or the inline root). */\n root?: string;\n /** Old public routes mapped to current document routes. */\n redirects?: Record<string, string>;\n site?: SiteConfig;\n head?: HeadConfig[];\n /** Enable source-aware “Edit page” links. */\n editLink?: EditLinkConfig;\n /** Show the most recent Git commit date for each local page. */\n lastUpdated?: boolean;\n /** Languages keyed by their URL segment, or `root` for `/`. */\n locales?: Record<string, LocaleConfig>;\n /** Locale key used for fallback content. */\n defaultLocale?: string;\n content?: ContentConfig;\n navigation?: NavigationConfig | NavigationItem[];\n theme?: ThemeConfig;\n markdown?: MarkdownConfig;\n search?: SearchConfig;\n components?: ComponentsConfig;\n build?: BuildConfig;\n}\n\nexport interface NormalizedDocsConfig {\n redirects: Record<string, string>;\n site: SiteConfig;\n head: HeadConfig[];\n editLink?: EditLinkConfig;\n lastUpdated: boolean;\n locales?: Record<string, LocaleConfig>;\n defaultLocale?: string;\n content: Required<\n Pick<ContentConfig, \"allowOutsideRoot\" | \"localizeRepositoryLinks\">\n > &\n ContentConfig;\n navigation: NavigationConfig;\n theme: ThemeConfig & { brand: BrandConfig };\n markdown: Required<Pick<MarkdownConfig, \"stripLeadingBadges\" | \"rawHtml\">> &\n MarkdownConfig;\n search: Required<SearchConfig>;\n components: ComponentsConfig;\n build: Required<BuildConfig> & { base: string };\n}\n\nexport interface DocsFrontmatter {\n aliases?: string[];\n title?: string;\n description?: string;\n slug?: string;\n draft?: boolean;\n sidebar?: false | { label?: string; order?: number; group?: string };\n tableOfContents?:\n false | { minHeadingLevel?: number; maxHeadingLevel?: number };\n editUrl?: false | string;\n /** Starlight page layout. */\n template?: \"doc\" | \"splash\";\n hero?: {\n title?: string;\n tagline?: string;\n image?:\n | { html: string }\n | { file: string; alt?: string }\n | { dark: string; light: string; alt?: string };\n actions?: Array<{\n text: string;\n link: string;\n variant?: \"primary\" | \"secondary\" | \"minimal\";\n }>;\n };\n lastUpdated?: boolean | Date;\n prev?: false | string | { link?: string; label?: string };\n next?: false | string | { link?: string; label?: string };\n banner?: { content: string };\n pagefind?: boolean;\n head?: Array<Record<string, unknown>>;\n}\n\nexport interface DocsHeading {\n depth: number;\n text: string;\n slug: string;\n line?: number;\n}\n\nexport interface DocsReference {\n original: string;\n resolved?: string;\n targetSource?: string;\n fragment?: string;\n line?: number;\n}\n\nexport interface DocsAsset extends DocsReference {\n sourcePath?: string;\n publicPath?: string;\n hash?: string;\n bytes?: number;\n}\n\nexport interface DocsEntry {\n id: string;\n sourceId: string;\n routeBase: string;\n metadata: Record<string, unknown>;\n sourcePath: string;\n absolutePath: string;\n sourceRoot: string;\n route: string;\n title: string;\n description?: string;\n frontmatter: DocsFrontmatter;\n headings: DocsHeading[];\n body: string;\n transformedBody: string;\n ast: Root;\n links: DocsReference[];\n assets: DocsAsset[];\n trust: \"markdown\" | \"mdx\";\n package?: { requested: string; resolved: string };\n}\n\nexport interface DocsRoute {\n route: string;\n entryId: string;\n sourcePath: string;\n title: string;\n sidebar?: false | NavigationPlacement;\n}\n\nexport interface DocsGraph {\n redirects: Record<string, string>;\n root: string;\n config: NormalizedDocsConfig;\n entries: DocsEntry[];\n routes: DocsRoute[];\n assets: DocsAsset[];\n diagnostics: DocsDiagnostic[];\n entryByRoute(route: string): DocsEntry | undefined;\n entryBySource(sourcePath: string, sourceId?: string): DocsEntry | undefined;\n}\n\nexport interface PackageLockSource {\n requested: string;\n resolved: string;\n registry: string;\n integrity: string;\n vendored?: string;\n}\n\nexport interface CookbookLock {\n schemaVersion: 1;\n sources: PackageLockSource[];\n}\n\nexport interface PackageManifest {\n name: string;\n version: string;\n description?: string;\n homepage?: string;\n repository?: string | { type?: string; url?: string; directory?: string };\n cookbook?: {\n index?: string;\n include?: string[];\n exclude?: string[];\n theme?: { brand?: BrandConfig };\n };\n _integrity?: string;\n _resolved?: string;\n}\n\nexport interface PackageDiscovery {\n root: string;\n manifest: PackageManifest;\n home?: string;\n pages: string[];\n assets: string[];\n}\n\nexport interface CreateDocsGraphOptions {\n root?: string;\n config?: DocsConfig;\n lock?: CookbookLock;\n /** Public URL base used when rewriting routes and assets. */\n base?: string;\n}\n","import { glaze } from \"@tenphi/glaze\";\nimport { mergeStyles, type Styles } from \"@tenphi/tasty/core\";\nimport {\n COOKBOOK_COMPONENT_NAMES,\n COOKBOOK_COMPONENT_SUB_ELEMENTS,\n} from \"../types.js\";\nimport type {\n DocsConfig,\n DocsDiagnostic,\n NormalizedDocsConfig,\n} from \"../types.js\";\n\nconst DEFAULT_BRAND = \"#315efb\";\nconst HEAD_KEYS = new Set([\"tag\", \"attrs\", \"content\"]);\nconst SITE_ICON_KEYS = new Set([\"source\", \"background\"]);\nconst ROOT_KEYS = new Set([\n \"root\",\n \"redirects\",\n \"site\",\n \"head\",\n \"editLink\",\n \"lastUpdated\",\n \"locales\",\n \"defaultLocale\",\n \"content\",\n \"navigation\",\n \"theme\",\n \"markdown\",\n \"search\",\n \"components\",\n \"build\",\n]);\n\nconst OBJECT_KEYS: Record<string, Set<string>> = {\n site: new Set([\n \"title\",\n \"version\",\n \"description\",\n \"url\",\n \"repository\",\n \"favicon\",\n ]),\n content: new Set([\n \"sources\",\n \"allowOutsideRoot\",\n \"localizeRepositoryLinks\",\n \"frontmatter\",\n ]),\n markdown: new Set([\"stripLeadingBadges\", \"rawHtml\"]),\n search: new Set([\"enabled\"]),\n components: new Set([\"overrides\"]),\n theme: new Set([\n \"brand\",\n \"palette\",\n \"states\",\n \"tokens\",\n \"presets\",\n \"styles\",\n \"customStyles\",\n \"contrastLevel\",\n ]),\n build: new Set([\n \"strict\",\n \"ci\",\n \"cacheDir\",\n \"maxArtifactBytes\",\n \"maxUnpackedBytes\",\n \"maxFiles\",\n \"maxPathDepth\",\n \"maxAssetBytes\",\n ]),\n};\n\nexport class DocsConfigError extends Error {\n readonly diagnostics: DocsDiagnostic[];\n\n constructor(diagnostics: DocsDiagnostic[]) {\n super(diagnostics.map((diagnostic) => diagnostic.message).join(\"\\n\"));\n this.name = \"DocsConfigError\";\n this.diagnostics = diagnostics;\n }\n}\n\nexport function validateConfig(config: DocsConfig): DocsDiagnostic[] {\n const diagnostics: DocsDiagnostic[] = [];\n if (config === null || typeof config !== \"object\" || Array.isArray(config)) {\n invalid(diagnostics, \"Documentation configuration must be an object.\");\n return diagnostics;\n }\n if (config.root !== undefined && typeof config.root !== \"string\") {\n invalid(diagnostics, \"root must be a directory path.\");\n }\n for (const key of Object.keys(config)) {\n if (!ROOT_KEYS.has(key)) unknown(diagnostics, key);\n }\n for (const [section, keys] of Object.entries(OBJECT_KEYS)) {\n const value = config[section as keyof DocsConfig];\n if (value === undefined) continue;\n if (!isRecord(value)) {\n invalid(diagnostics, `${section} must be an object.`);\n continue;\n }\n for (const key of Object.keys(value)) {\n if (!keys.has(key)) unknown(diagnostics, `${section}.${key}`);\n }\n }\n\n if (config.navigation !== undefined && !Array.isArray(config.navigation)) {\n if (!isRecord(config.navigation)) {\n invalid(diagnostics, \"navigation must be an array or object.\");\n } else {\n for (const key of Object.keys(config.navigation)) {\n if (!new Set([\"items\", \"tabs\"]).has(key)) {\n unknown(diagnostics, `navigation.${key}`);\n }\n }\n if (\n config.navigation.items !== undefined &&\n !Array.isArray(config.navigation.items)\n ) {\n invalid(diagnostics, \"navigation.items must be an array.\");\n }\n if (\n config.navigation.tabs !== undefined &&\n !Array.isArray(config.navigation.tabs)\n ) {\n invalid(diagnostics, \"navigation.tabs must be an array.\");\n }\n }\n }\n\n if (\n config.redirects !== undefined &&\n (!isRecord(config.redirects) ||\n Object.values(config.redirects).some(\n (value) => typeof value !== \"string\",\n ))\n )\n invalid(diagnostics, \"redirects must map old routes to document routes.\");\n const head = config.head;\n if (head !== undefined && !Array.isArray(head)) {\n invalid(diagnostics, \"head must be an array.\");\n } else {\n for (const [index, entry] of (head ?? []).entries()) {\n if (!isRecord(entry)) {\n invalid(diagnostics, `head[${index}] must be an object.`);\n continue;\n }\n for (const key of Object.keys(entry)) {\n if (!HEAD_KEYS.has(key)) {\n unknown(diagnostics, `head[${index}].${key}`);\n }\n }\n if (typeof entry.tag !== \"string\") {\n invalid(diagnostics, `head[${index}].tag must be a string.`);\n }\n if (entry.attrs !== undefined && !isRecord(entry.attrs)) {\n invalid(diagnostics, `head[${index}].attrs must be an object.`);\n } else {\n for (const [name, value] of Object.entries(entry.attrs ?? {})) {\n if (\n value !== undefined &&\n typeof value !== \"string\" &&\n typeof value !== \"boolean\"\n ) {\n invalid(\n diagnostics,\n `head[${index}].attrs.${name} must be a string or boolean.`,\n );\n }\n }\n }\n if (entry.content !== undefined && typeof entry.content !== \"string\") {\n invalid(diagnostics, `head[${index}].content must be a string.`);\n }\n }\n }\n\n const favicon = config.site?.favicon;\n if (favicon !== undefined) {\n if (typeof favicon === \"string\") {\n if (favicon.trim() === \"\") {\n invalid(diagnostics, \"site.favicon must be a non-empty local path.\");\n }\n } else if (!isRecord(favicon)) {\n invalid(\n diagnostics,\n \"site.favicon must be a local path or an object with a source path.\",\n );\n } else {\n for (const key of Object.keys(favicon)) {\n if (!SITE_ICON_KEYS.has(key)) {\n unknown(diagnostics, `site.favicon.${key}`);\n }\n }\n if (typeof favicon.source !== \"string\" || favicon.source.trim() === \"\") {\n invalid(diagnostics, \"site.favicon.source must be a non-empty string.\");\n }\n if (\n favicon.background !== undefined &&\n (typeof favicon.background !== \"string\" ||\n favicon.background.trim() === \"\")\n ) {\n invalid(\n diagnostics,\n \"site.favicon.background must be a non-empty color string.\",\n );\n }\n }\n }\n for (const field of [\"url\", \"repository\"] as const) {\n const value = config.site?.[field];\n if (value === undefined) continue;\n if (typeof value !== \"string\" || !isHttpUrl(value)) {\n invalid(diagnostics, `site.${field} must be an absolute HTTP(S) URL.`);\n }\n }\n\n if (\n config.editLink !== undefined &&\n (!isRecord(config.editLink) || typeof config.editLink.baseUrl !== \"string\")\n ) {\n invalid(diagnostics, \"editLink must contain a string baseUrl.\");\n } else if (config.editLink !== undefined) {\n for (const key of Object.keys(config.editLink)) {\n if (key !== \"baseUrl\") unknown(diagnostics, `editLink.${key}`);\n }\n try {\n new URL(config.editLink.baseUrl);\n } catch {\n invalid(diagnostics, \"editLink.baseUrl must be an absolute URL.\");\n }\n }\n if (\n config.lastUpdated !== undefined &&\n typeof config.lastUpdated !== \"boolean\"\n ) {\n invalid(diagnostics, \"lastUpdated must be a boolean.\");\n }\n if (config.locales !== undefined && !isRecord(config.locales)) {\n invalid(diagnostics, \"locales must be an object.\");\n } else {\n for (const [key, locale] of Object.entries(config.locales ?? {})) {\n if (!isRecord(locale) || typeof locale.label !== \"string\") {\n invalid(diagnostics, `locales.${key} must contain a string label.`);\n continue;\n }\n for (const property of Object.keys(locale)) {\n if (![\"label\", \"lang\", \"dir\"].includes(property)) {\n unknown(diagnostics, `locales.${key}.${property}`);\n }\n }\n if (locale.lang !== undefined && typeof locale.lang !== \"string\") {\n invalid(diagnostics, `locales.${key}.lang must be a string.`);\n }\n if (\n locale.dir !== undefined &&\n locale.dir !== \"ltr\" &&\n locale.dir !== \"rtl\"\n ) {\n invalid(diagnostics, `locales.${key}.dir must be \"ltr\" or \"rtl\".`);\n }\n }\n }\n if (\n config.defaultLocale !== undefined &&\n typeof config.defaultLocale !== \"string\"\n ) {\n invalid(diagnostics, \"defaultLocale must be a string.\");\n } else if (\n config.defaultLocale !== undefined &&\n (config.locales === undefined || !(config.defaultLocale in config.locales))\n ) {\n invalid(\n diagnostics,\n `defaultLocale must match a key in locales; received \"${config.defaultLocale}\".`,\n );\n }\n\n if (\n config.content?.allowOutsideRoot !== undefined &&\n typeof config.content.allowOutsideRoot !== \"boolean\"\n ) {\n invalid(diagnostics, \"content.allowOutsideRoot must be a boolean.\");\n }\n if (\n config.content?.localizeRepositoryLinks !== undefined &&\n typeof config.content.localizeRepositoryLinks !== \"boolean\"\n ) {\n invalid(diagnostics, \"content.localizeRepositoryLinks must be a boolean.\");\n }\n const configuredSources = config.content?.sources;\n if (configuredSources !== undefined && !Array.isArray(configuredSources)) {\n invalid(diagnostics, \"content.sources must be an array.\");\n }\n const sources = Array.isArray(configuredSources) ? configuredSources : [];\n for (const [index, source] of sources.entries()) {\n if (!isRecord(source)) {\n invalid(diagnostics, `content.sources[${index}] must be an object.`);\n continue;\n }\n const sourceRecord = source as unknown as Record<string, unknown>;\n const variants = [\"file\", \"glob\", \"package\"].filter((key) => key in source);\n if (variants.length !== 1) {\n diagnostics.push({\n code: \"DOCS_CONFIG_INVALID\",\n severity: \"error\",\n message: `content.sources[${index}] must select exactly one of file, glob, or package.`,\n });\n continue;\n }\n const variant = variants[0] as \"file\" | \"glob\" | \"package\";\n const allowed = {\n file: new Set([\n \"id\",\n \"root\",\n \"routeBase\",\n \"file\",\n \"route\",\n \"title\",\n \"description\",\n \"navigation\",\n ]),\n glob: new Set([\n \"id\",\n \"root\",\n \"glob\",\n \"base\",\n \"routeBase\",\n \"exclude\",\n \"navigation\",\n ]),\n package: new Set([\n \"id\",\n \"package\",\n \"registry\",\n \"include\",\n \"exclude\",\n \"index\",\n \"routeBase\",\n \"trust\",\n ]),\n }[variant];\n for (const key of Object.keys(source)) {\n if (!allowed.has(key))\n unknown(diagnostics, `content.sources[${index}].${key}`);\n }\n for (const field of [\n \"id\",\n \"root\",\n \"route\",\n \"routeBase\",\n \"base\",\n \"index\",\n \"title\",\n \"description\",\n \"registry\",\n ]) {\n if (\n sourceRecord[field] !== undefined &&\n typeof sourceRecord[field] !== \"string\"\n )\n invalid(\n diagnostics,\n `content.sources[${index}].${field} must be a string.`,\n );\n }\n if (\n typeof sourceRecord.id === \"string\" &&\n !/^[a-zA-Z0-9_-]+$/.test(sourceRecord.id)\n )\n invalid(\n diagnostics,\n `content.sources[${index}].id must contain only letters, numbers, underscores, and hyphens.`,\n );\n if (\n sourceRecord.trust !== undefined &&\n ![\"markdown\", \"mdx\"].includes(String(sourceRecord.trust))\n )\n invalid(\n diagnostics,\n `content.sources[${index}].trust must be \"markdown\" or \"mdx\".`,\n );\n if (\n typeof sourceRecord.registry === \"string\" &&\n !isHttpUrl(sourceRecord.registry)\n )\n invalid(\n diagnostics,\n `content.sources[${index}].registry must be an absolute HTTP(S) URL.`,\n );\n const selector = sourceRecord[variant];\n if (\n variant === \"glob\"\n ? typeof selector !== \"string\" &&\n (!Array.isArray(selector) ||\n selector.some((value) => typeof value !== \"string\"))\n : typeof selector !== \"string\" || selector.trim() === \"\"\n ) {\n invalid(\n diagnostics,\n `content.sources[${index}].${variant} must be ${variant === \"glob\" ? \"a string or string array\" : \"a non-empty string\"}.`,\n );\n }\n for (const list of [\"include\", \"exclude\"] as const) {\n const value = sourceRecord[list];\n if (\n value !== undefined &&\n (!Array.isArray(value) ||\n value.some((entry) => typeof entry !== \"string\"))\n ) {\n invalid(\n diagnostics,\n `content.sources[${index}].${list} must be a string array.`,\n );\n }\n }\n }\n\n if (\n config.markdown?.stripLeadingBadges !== undefined &&\n typeof config.markdown.stripLeadingBadges !== \"boolean\"\n ) {\n invalid(diagnostics, \"markdown.stripLeadingBadges must be a boolean.\");\n }\n if (\n config.markdown?.rawHtml !== undefined &&\n ![\"allow\", \"sanitize\", \"strip\", \"reject\"].includes(config.markdown.rawHtml)\n ) {\n invalid(\n diagnostics,\n 'markdown.rawHtml must be \"allow\", \"sanitize\", \"strip\", or \"reject\".',\n );\n }\n if (\n config.search?.enabled !== undefined &&\n typeof config.search.enabled !== \"boolean\"\n ) {\n invalid(diagnostics, \"search.enabled must be a boolean.\");\n }\n for (const key of [\"strict\", \"ci\"] as const) {\n const value = config.build?.[key];\n if (value !== undefined && typeof value !== \"boolean\") {\n invalid(diagnostics, `build.${key} must be a boolean.`);\n }\n }\n for (const key of [\n \"maxArtifactBytes\",\n \"maxUnpackedBytes\",\n \"maxFiles\",\n \"maxPathDepth\",\n \"maxAssetBytes\",\n ] as const) {\n const value = config.build?.[key];\n if (value !== undefined && (!Number.isSafeInteger(value) || value <= 0)) {\n invalid(diagnostics, `build.${key} must be a positive integer.`);\n }\n }\n\n const brand = config.theme?.brand;\n if (\n typeof brand === \"object\" &&\n brand !== null &&\n \"contrast\" in brand &&\n !brand.unsafeContrast\n ) {\n const target = brand.contrast?.apca;\n const normal = Array.isArray(target) ? target[0] : target;\n if (typeof normal === \"number\" && normal < 45) {\n diagnostics.push({\n code: \"DOCS_CONFIG_INVALID\",\n severity: \"error\",\n message:\n \"theme.brand.contrast.apca cannot be below 45 without unsafeContrast.\",\n hint: \"Remove the override, use 45 or higher, or explicitly set unsafeContrast: true.\",\n });\n }\n }\n\n if (\n config.content?.frontmatter !== undefined &&\n ![\"preserve\", \"reject\"].includes(config.content.frontmatter)\n )\n invalid(diagnostics, 'content.frontmatter must be \"preserve\" or \"reject\".');\n for (const field of [\n \"styles\",\n \"customStyles\",\n \"palette\",\n \"tokens\",\n \"states\",\n \"presets\",\n ] as const) {\n if (config.theme?.[field] !== undefined && !isRecord(config.theme[field]))\n invalid(diagnostics, `theme.${field} must be an object.`);\n }\n for (const [name, entry] of Object.entries(config.theme?.styles ?? {})) {\n if (!(COOKBOOK_COMPONENT_NAMES as readonly string[]).includes(name)) {\n unknown(\n diagnostics,\n `theme.styles.${name}; register custom components under theme.customStyles`,\n );\n continue;\n }\n if (!isRecord(entry))\n invalid(\n diagnostics,\n `theme.styles.${name} must be a Tasty style object.`,\n );\n else {\n if (\"mode\" in entry)\n invalid(\n diagnostics,\n `theme.styles.${name} must contain only Tasty properties, without a mode wrapper.`,\n );\n const elements: readonly string[] =\n COOKBOOK_COMPONENT_SUB_ELEMENTS[\n name as keyof typeof COOKBOOK_COMPONENT_SUB_ELEMENTS\n ];\n for (const key of Object.keys(entry)) {\n if (/^[A-Z]/.test(key) && !elements.includes(key))\n unknown(diagnostics, `theme.styles.${name}.${key}`);\n }\n }\n }\n for (const [name, entry] of Object.entries(\n config.theme?.customStyles ?? {},\n )) {\n if ((COOKBOOK_COMPONENT_NAMES as readonly string[]).includes(name))\n invalid(\n diagnostics,\n `Use theme.styles.${name} for a built-in component.`,\n );\n if (\n !/^[A-Za-z][A-Za-z0-9_-]*$/.test(name) ||\n !isRecord(entry) ||\n \"mode\" in entry\n )\n invalid(\n diagnostics,\n `theme.customStyles.${name} must be a named partial Tasty style object.`,\n );\n }\n for (const [name, value] of Object.entries(config.theme?.palette ?? {})) {\n if (\n ![\n \"surface\",\n \"text\",\n \"textSoft\",\n \"info\",\n \"success\",\n \"warning\",\n \"danger\",\n ].includes(name)\n )\n unknown(diagnostics, `theme.palette.${name}`);\n try {\n glaze.color({ from: value }).resolve();\n } catch (error) {\n invalid(\n diagnostics,\n `theme.palette.${name}: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n if (brand !== undefined) {\n try {\n glaze\n .color({\n from:\n typeof brand === \"object\" && brand !== null && \"from\" in brand\n ? brand.from\n : brand,\n })\n .resolve();\n } catch (error) {\n invalid(\n diagnostics,\n `theme.brand: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n const contrast = config.theme?.contrastLevel;\n if (\n contrast !== undefined &&\n contrast !== \"auto\" &&\n (typeof contrast !== \"number\" ||\n !Number.isFinite(contrast) ||\n contrast < 0 ||\n contrast > 100)\n )\n invalid(\n diagnostics,\n 'theme.contrastLevel must be \"auto\" or a number from 0 to 100.',\n );\n\n const componentOverrides = config.components?.overrides;\n if (componentOverrides !== undefined && !isRecord(componentOverrides)) {\n invalid(diagnostics, \"components.overrides must be an object.\");\n } else {\n for (const [name, override] of Object.entries(componentOverrides ?? {})) {\n if (typeof override === \"string\") continue;\n if (name === \"Footer\" && override === false) continue;\n invalid(\n diagnostics,\n `components.overrides.${name} must be an Astro component path${name === \"Footer\" ? \" or false\" : \"\"}.`,\n );\n }\n }\n return diagnostics;\n}\n\nfunction unknown(diagnostics: DocsDiagnostic[], path: string): void {\n diagnostics.push({\n code: \"DOCS_CONFIG_UNKNOWN_KEY\",\n severity: \"error\",\n message: `Unknown configuration key \"${path}\".`,\n });\n}\n\nfunction invalid(diagnostics: DocsDiagnostic[], message: string): void {\n diagnostics.push({\n code: \"DOCS_CONFIG_INVALID\",\n severity: \"error\",\n message,\n });\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isHttpUrl(value: string): boolean {\n try {\n return [\"http:\", \"https:\"].includes(new URL(value).protocol);\n } catch {\n return false;\n }\n}\n\nexport function normalizeDocsConfig(\n config: DocsConfig = {},\n): NormalizedDocsConfig {\n const diagnostics = validateConfig(config);\n if (diagnostics.length > 0) throw new DocsConfigError(diagnostics);\n const navigation = Array.isArray(config.navigation)\n ? { items: config.navigation }\n : (config.navigation ?? {});\n\n return {\n redirects: { ...config.redirects },\n site: { ...config.site },\n head: [...(config.head ?? [])],\n ...(config.editLink ? { editLink: { ...config.editLink } } : {}),\n lastUpdated: config.lastUpdated ?? false,\n ...(config.locales ? { locales: { ...config.locales } } : {}),\n ...(config.defaultLocale ? { defaultLocale: config.defaultLocale } : {}),\n content: {\n allowOutsideRoot: false,\n localizeRepositoryLinks: false,\n ...config.content,\n },\n navigation,\n theme: { ...config.theme, brand: config.theme?.brand ?? DEFAULT_BRAND },\n markdown: {\n stripLeadingBadges: true,\n rawHtml: \"sanitize\",\n ...config.markdown,\n },\n search: { enabled: true, ...config.search },\n components: { ...config.components },\n build: {\n strict: true,\n ci: process.env.CI === \"true\",\n base: \"/\",\n cacheDir: \"\",\n maxArtifactBytes: 25 * 1024 * 1024,\n maxUnpackedBytes: 100 * 1024 * 1024,\n maxFiles: 10_000,\n maxPathDepth: 24,\n maxAssetBytes: 20 * 1024 * 1024,\n ...config.build,\n },\n };\n}\n\nexport function defineDocsConfig(config: DocsConfig): DocsConfig {\n const diagnostics = validateConfig(config);\n if (diagnostics.length > 0) throw new DocsConfigError(diagnostics);\n return config;\n}\n\n/** Compose presets. Objects merge, arrays replace, and styles use Tasty semantics. */\nexport function mergeDocsConfig(...configs: DocsConfig[]): DocsConfig {\n const merge = (\n base: Record<string, unknown>,\n next: Record<string, unknown>,\n ) => {\n const result = { ...base };\n for (const [key, value] of Object.entries(next)) {\n if (value === undefined) continue;\n result[key] = isRecord(value)\n ? merge(isRecord(result[key]) ? result[key] : {}, value)\n : Array.isArray(value)\n ? [...value]\n : value;\n }\n return result;\n };\n return defineDocsConfig(\n configs.reduce<DocsConfig>((base, next) => {\n const diagnostics = validateConfig(next);\n if (diagnostics.length) throw new DocsConfigError(diagnostics);\n const result = merge(\n base as Record<string, unknown>,\n next as Record<string, unknown>,\n ) as DocsConfig;\n for (const field of [\"styles\", \"customStyles\"] as const) {\n if (!next.theme?.[field]) continue;\n const styles = { ...base.theme?.[field] } as Record<string, Styles>;\n for (const [name, configured] of Object.entries(next.theme[field])) {\n styles[name] = mergeStyles(styles[name] ?? {}, configured);\n }\n result.theme![field] = styles;\n }\n return result;\n }, {}),\n );\n}\n\nexport { COOKBOOK_COMPONENT_NAMES, COOKBOOK_COMPONENT_SUB_ELEMENTS };\n\nexport type {\n BrandConfig,\n BuildConfig,\n ComponentStyleConfig,\n ComponentStyles,\n ComponentStylesConfig,\n CookbookComponentName,\n ComponentsConfig,\n ContentConfig,\n DocsConfig,\n DocsSource,\n EditLinkConfig,\n HeadConfig,\n LocaleConfig,\n MarkdownConfig,\n NavigationConfig,\n NavigationItem,\n NavigationPlacement,\n NavigationTab,\n NormalizedDocsConfig,\n SearchConfig,\n SiteConfig,\n SiteIconConfig,\n ThemeConfig,\n ThemePaletteConfig,\n ThemeTokens,\n ThemeTokenValue,\n TypographyPreset,\n TypographyPresets,\n} from \"../types.js\";\n"],"mappings":";;;;AAiMA,MAAa,2BAA2B;CACtC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;;AAKA,MAAa,kCAAkC;CAC7C,MAAM;EAAC;EAAY;EAAY;CAAW;CAC1C,SAAS;EAAC;EAAS;EAAQ;EAAO;EAAW;CAAQ;CACrD,WAAW;EAAC;EAAW;EAAO;CAAM;CACpC,KAAK;EAAC;EAAW;EAAU;CAAe;CAC1C,QAAQ;EACN;EACA;EACA;EACA;EACA;EACA;EACA;CACF;CACA,MAAM;EACJ;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;CACA,gBAAgB;EACd;EACA;EACA;EACA;EACA;EACA;CACF;CACA,MAAM,CAAC,OAAO,MAAM;CACpB,mBAAmB;EACjB;EACA;EACA;EACA;EACA;EACA;CACF;CACA,iBAAiB;EACf;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;CACA,eAAe;EAAC;EAAS;EAAQ;EAAmB;CAAY;CAChE,oBAAoB,CAAC;CACrB,SAAS;EAAC;EAAW;EAAQ;CAAU;CACvC,kBAAkB,CAAC,QAAQ;CAC3B,kBAAkB;EAAC;EAAW;EAAQ;EAAgB;CAAe;CACrE,sBAAsB;EACpB;EACA;EACA;EACA;EACA;EACA;CACF;CACA,uBAAuB;EACrB;EACA;EACA;EACA;EACA;EACA;CACF;CACA,gBAAgB,CAAC;CACjB,SAAS;EAAC;EAAW;EAAS;EAAS;EAAQ;EAAW;CAAK;CAC/D,SAAS;EACP;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;CACA,OAAO,CAAC,QAAQ,QAAQ;CACxB,aAAa;EAAC;EAAQ;EAAa;CAAM;CACzC,MAAM;EAAC;EAAQ;EAAU;EAAkB;CAAe;CAC1D,iBAAiB;EACf;EACA;EACA;EACA;EACA;EACA;EACA;CACF;CACA,aAAa;EACX;EA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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"content-BIpXueW7.js","names":["inside","parseYaml"],"sources":["../src/html/index.ts","../src/npm/index.ts","../src/graph/index.ts","../src/validation/index.ts","../src/content/index.ts"],"sourcesContent":["import type { Root } from \"hast\";\nimport { fromHtml } from \"hast-util-from-html\";\nimport { defaultSchema, sanitize } from \"hast-util-sanitize\";\nimport { toHtml } from \"hast-util-to-html\";\nimport { visit } from \"unist-util-visit\";\n\nconst schema = {\n ...defaultSchema,\n strip: [\"script\", \"style\", \"iframe\", \"object\", \"embed\", \"template\"],\n protocols: {\n ...defaultSchema.protocols,\n href: [...(defaultSchema.protocols?.href ?? []), \"source\"],\n },\n attributes: {\n ...defaultSchema.attributes,\n \"*\":\n defaultSchema.attributes?.[\"*\"]?.filter(\n (attribute) =>\n typeof attribute !== \"string\" ||\n ![\n \"color\",\n \"bgColor\",\n \"align\",\n \"border\",\n \"cellPadding\",\n \"cellSpacing\",\n ].includes(attribute),\n ) ?? [],\n },\n};\n\n/** Sanitize raw Markdown HTML while preserving separate inline opening/closing tags. */\nexport async function sanitizeMarkup(\n html: string,\n rewrite: (url: string, kind: \"link\" | \"image\") => Promise<string>,\n): Promise<string> {\n const closing = /^<\\/([a-z][a-z\\d-]*)\\s*>$/i.exec(html.trim());\n if (closing) {\n const tag = closing[1]?.toLowerCase() ?? \"\";\n return schema.tagNames?.includes(tag) ? `</${tag}>` : \"\";\n }\n const tree = sanitize(fromHtml(html, { fragment: true }), schema) as Root;\n const tasks: Promise<void>[] = [];\n visit(tree, \"element\", (element) => {\n for (const [property, kind] of [\n [\"href\", \"link\"],\n [\"src\", \"image\"],\n ] as const) {\n const value = element.properties[property];\n if (typeof value !== \"string\") continue;\n tasks.push(\n rewrite(value, kind).then((resolved) => {\n element.properties[property] = resolved;\n }),\n );\n }\n });\n await Promise.all(tasks);\n let result = toHtml(tree);\n // mdast represents inline <strong>text</strong> as three distinct nodes.\n const opening =\n /^<([a-z][a-z\\d-]*)(?:\\s+(?:[^<>\"']|\"[^\"]*\"|'[^']*')*)?\\s*>$/i.exec(\n html.trim(),\n );\n const first = tree.children[0];\n if (\n opening &&\n tree.children.length === 1 &&\n first?.type === \"element\" &&\n first.tagName === opening[1]?.toLowerCase() &&\n first.children.length === 0\n ) {\n result = result.replace(new RegExp(`</${first.tagName}>$`), \"\");\n }\n return result;\n}\n","import { createHash } from \"node:crypto\";\nimport { homedir } from \"node:os\";\nimport {\n lstat,\n mkdir,\n mkdtemp,\n readFile,\n readdir,\n rename,\n rm,\n stat,\n writeFile,\n} from \"node:fs/promises\";\nimport { dirname, isAbsolute, join, relative, resolve, sep } from \"node:path\";\nimport npa from \"npm-package-arg\";\nimport pacote from \"pacote\";\nimport { glob } from \"tinyglobby\";\nimport type {\n NormalizedDocsConfig,\n PackageDiscovery,\n PackageLockSource,\n PackageManifest,\n CookbookLock,\n DocsConfig,\n} from \"../types.js\";\n\nconst DEFAULT_REGISTRY = \"https://registry.npmjs.org/\";\nconst LOCK_FILE = \"cookbook.lock.json\";\n\nexport interface ResolvePackageOptions {\n registry?: string;\n cacheDir?: string;\n}\n\nexport async function resolvePackageLock(\n requested: string,\n options: ResolvePackageOptions = {},\n): Promise<PackageLockSource> {\n const parsed = npa(requested);\n if (![\"tag\", \"version\", \"range\"].includes(parsed.type)) {\n throw new Error(\n `Only npm registry package specifiers are supported (received ${parsed.type}).`,\n );\n }\n const registry = options.registry ?? DEFAULT_REGISTRY;\n const manifest = (await pacote.manifest(requested, {\n registry,\n ...(options.cacheDir ? { cache: options.cacheDir } : {}),\n fullMetadata: true,\n })) as PackageManifest;\n if (!manifest.name || !manifest.version || !manifest._integrity) {\n throw new Error(\n `Registry metadata for ${requested} did not include version and integrity.`,\n );\n }\n return {\n requested,\n resolved: `${manifest.name}@${manifest.version}`,\n registry,\n integrity: manifest._integrity,\n };\n}\n\nexport async function readDocsLock(\n root: string,\n): Promise<CookbookLock | undefined> {\n try {\n const value = JSON.parse(\n await readFile(join(root, LOCK_FILE), \"utf8\"),\n ) as CookbookLock;\n validateLock(value);\n return value;\n } catch (error) {\n if (isMissing(error)) return undefined;\n throw error;\n }\n}\n\nexport async function writeDocsLock(\n root: string,\n lock: CookbookLock,\n): Promise<void> {\n validateLock(lock);\n const temporary = await mkdtemp(join(root, \".cookbook-lock-\"));\n try {\n await writeFile(\n join(temporary, LOCK_FILE),\n `${JSON.stringify(lock, null, 2)}\\n`,\n \"utf8\",\n );\n await rename(join(temporary, LOCK_FILE), join(root, LOCK_FILE));\n } finally {\n await rm(temporary, { recursive: true, force: true });\n }\n}\n\n/** Reconcile declarations, including the first lock and removed sources. */\nexport async function reconcileDocsLock(\n config: DocsConfig,\n existing: CookbookLock | undefined,\n options: {\n packages?: string[];\n resolve?: typeof resolvePackageLock;\n } = {},\n): Promise<CookbookLock> {\n const configured = (config.content?.sources ?? []).filter(\n (source) => \"package\" in source,\n );\n const unique = new Map<string, (typeof configured)[number]>();\n for (const declaration of configured) {\n const previous = unique.get(declaration.package);\n if (\n previous?.registry &&\n declaration.registry &&\n previous.registry !== declaration.registry\n )\n throw new Error(\n `Package source ${declaration.package} declares conflicting registries.`,\n );\n unique.set(declaration.package, {\n ...declaration,\n ...(previous?.registry ? { registry: previous.registry } : {}),\n });\n }\n const declarations = [...unique.values()];\n const selectors = options.packages ?? [];\n for (const selector of selectors) {\n if (\n !declarations.some(\n (source) =>\n source.package === selector ||\n packageNameFromSpecifier(source.package) === selector,\n )\n ) {\n throw new Error(`No configured package source matches \"${selector}\".`);\n }\n }\n const sources: PackageLockSource[] = [];\n for (const declaration of declarations) {\n const current = existing?.sources.find(\n (source) => source.requested === declaration.package,\n );\n const selected =\n selectors.length === 0 ||\n selectors.some(\n (selector) =>\n selector === declaration.package ||\n selector === packageNameFromSpecifier(declaration.package),\n );\n if (\n !selected &&\n current &&\n (!declaration.registry || declaration.registry === current.registry)\n ) {\n sources.push(current);\n continue;\n }\n if (!selected)\n throw new Error(\n `Package source ${declaration.package} is not locked. Run \"cookbook update\" without a package selector.`,\n );\n const previous =\n current ??\n existing?.sources.find(\n (source) =>\n packageNameFromSpecifier(source.requested) ===\n packageNameFromSpecifier(declaration.package),\n );\n const registry = declaration.registry ?? previous?.registry;\n const next = await (options.resolve ?? resolvePackageLock)(\n declaration.package,\n registry ? { registry } : {},\n );\n if (previous?.vendored) {\n next.vendored =\n next.integrity === previous.integrity\n ? previous.vendored\n : `.cookbook/vendor/${createHash(\"sha256\").update(next.integrity).digest(\"hex\")}`;\n }\n sources.push(next);\n }\n return defaultLock(sources);\n}\n\nexport function validateLock(lock: CookbookLock): void {\n if (lock.schemaVersion !== 1 || !Array.isArray(lock.sources)) {\n throw new Error(\"Unsupported or invalid cookbook.lock.json.\");\n }\n for (const source of lock.sources) {\n if (\n !source.requested ||\n !source.resolved ||\n !source.registry ||\n !source.integrity\n ) {\n throw new Error(\n \"Every lock source requires requested, resolved, registry, and integrity.\",\n );\n }\n const parsed = npa(source.resolved);\n if (parsed.type !== \"version\") {\n throw new Error(\n `Locked source must use an exact version: ${source.resolved}.`,\n );\n }\n if (\n source.vendored &&\n (source.vendored.startsWith(\"/\") ||\n source.vendored.split(/[\\\\/]/).includes(\"..\"))\n ) {\n throw new Error(\n `Vendored package path must stay within the project: ${source.vendored}.`,\n );\n }\n }\n}\n\nexport async function materializePackage(\n source: PackageLockSource,\n config: NormalizedDocsConfig[\"build\"],\n projectRoot?: string,\n): Promise<string> {\n if (source.vendored) {\n if (!projectRoot) {\n throw new Error(\n `Vendored source ${source.resolved} requires a project root.`,\n );\n }\n const vendored = resolve(projectRoot, source.vendored);\n if (!inside(projectRoot, vendored)) {\n throw new Error(\n `Vendored package path escapes the project root: ${source.vendored}.`,\n );\n }\n const marker = (\n await readFile(join(vendored, \".cookbook-integrity\"), \"utf8\")\n ).trim();\n if (marker !== source.integrity) {\n throw new Error(\n `Vendored package integrity marker does not match ${source.resolved}.`,\n );\n }\n await validateExtractedTree(vendored, config);\n return vendored;\n }\n const cacheRoot = resolve(\n config.cacheDir || join(homedir(), \".cache\", \"cookbook\"),\n \"artifacts\",\n );\n const key = createHash(\"sha256\").update(source.integrity).digest(\"hex\");\n const destination = join(cacheRoot, key);\n const marker = join(destination, \".cookbook-integrity\");\n try {\n if ((await readFile(marker, \"utf8\")).trim() === source.integrity) {\n await validateExtractedTree(destination, config);\n return destination;\n }\n } catch (error) {\n if (!isMissing(error)) throw error;\n }\n\n await mkdir(cacheRoot, { recursive: true });\n const temporary = await mkdtemp(join(cacheRoot, \".extract-\"));\n try {\n const tarball = await pacote.tarball(source.resolved, {\n registry: source.registry,\n integrity: source.integrity,\n cache: join(cacheRoot, \"_cacache\"),\n });\n if (tarball.byteLength > config.maxArtifactBytes) {\n throw new Error(\n `Package artifact is ${tarball.byteLength} bytes; limit is ${config.maxArtifactBytes}.`,\n );\n }\n await pacote.extract(source.resolved, temporary, {\n registry: source.registry,\n integrity: source.integrity,\n cache: join(cacheRoot, \"_cacache\"),\n });\n await validateExtractedTree(temporary, config);\n await writeFile(\n join(temporary, \".cookbook-integrity\"),\n `${source.integrity}\\n`,\n );\n await rm(destination, { recursive: true, force: true });\n await rename(temporary, destination);\n return destination;\n } catch (error) {\n await rm(temporary, { recursive: true, force: true });\n throw error;\n }\n}\n\nasync function validateExtractedTree(\n root: string,\n config: NormalizedDocsConfig[\"build\"],\n): Promise<void> {\n let files = 0;\n let bytes = 0;\n const pending = [root];\n while (pending.length > 0) {\n const directory = pending.pop();\n if (!directory) break;\n for (const name of await readdir(directory)) {\n if (name === \".cookbook-integrity\") continue;\n const path = join(directory, name);\n const info = await lstat(path);\n const rel = relative(root, path);\n if (rel.startsWith(`..${sep}`) || rel === \"..\") {\n throw new Error(`Package path escapes artifact root: ${rel}.`);\n }\n if (rel.split(sep).length > config.maxPathDepth) {\n throw new Error(`Package path exceeds maximum depth: ${rel}.`);\n }\n if (info.isSymbolicLink()) {\n throw new Error(`Package symlinks are not allowed: ${rel}.`);\n }\n if (info.isDirectory()) {\n pending.push(path);\n } else if (info.isFile()) {\n files += 1;\n bytes += info.size;\n if (info.size > config.maxAssetBytes) {\n throw new Error(`Package file exceeds maximum size: ${rel}.`);\n }\n if (files > config.maxFiles || bytes > config.maxUnpackedBytes) {\n throw new Error(\n \"Package exceeds configured file-count or unpacked-size limit.\",\n );\n }\n } else {\n throw new Error(`Unsupported package entry type: ${rel}.`);\n }\n }\n }\n}\n\nexport async function discoverPackage(root: string): Promise<PackageDiscovery> {\n const manifest = JSON.parse(\n await readFile(join(root, \"package.json\"), \"utf8\"),\n ) as PackageManifest;\n const hints = manifest.cookbook;\n const homeCandidates = [hints?.index, \"README.md\", \"readme.md\"].filter(\n (candidate): candidate is string => Boolean(candidate),\n );\n let home: string | undefined;\n for (const candidate of homeCandidates) {\n assertSafePackagePath(candidate, \"cookbook.index\");\n try {\n const path = resolve(root, candidate);\n if (!inside(root, path)) {\n throw new Error(\n `cookbook.index escapes the package root: ${candidate}.`,\n );\n }\n if ((await stat(path)).isFile()) {\n home = candidate;\n break;\n }\n } catch (error) {\n if (!isMissing(error)) throw error;\n }\n }\n\n const patterns = hints?.include?.length\n ? hints.include\n : [\n \"docs/**/*.{md,mdx}\",\n \"docs/**/*.{png,jpg,jpeg,gif,webp,avif,svg,pdf,txt,zip}\",\n ];\n for (const pattern of patterns) {\n assertSafePackagePath(pattern, \"cookbook.include\");\n }\n for (const pattern of hints?.exclude ?? []) {\n assertSafePackagePath(pattern, \"cookbook.exclude\");\n }\n const discovered = await glob(patterns, {\n cwd: root,\n onlyFiles: true,\n dot: false,\n ignore: hints?.exclude ?? [],\n });\n for (const path of discovered) {\n assertSafePackagePath(path, \"discovered package path\");\n if (!inside(root, resolve(root, path))) {\n throw new Error(`Discovered path escapes the package root: ${path}.`);\n }\n }\n const pages = discovered.filter((path) => /\\.mdx?$/i.test(path));\n if (home && !pages.includes(home)) pages.unshift(home);\n const assets = discovered.filter((path) => !/\\.mdx?$/i.test(path));\n return { root, manifest, ...(home ? { home } : {}), pages, assets };\n}\n\nexport function packageNameFromSpecifier(specifier: string): string {\n const parsed = npa(specifier);\n if (!parsed.name)\n throw new Error(`Invalid npm package specifier: ${specifier}.`);\n return parsed.name;\n}\n\nexport function lockForSource(\n lock: CookbookLock | undefined,\n requested: string,\n): PackageLockSource {\n const exact = lock?.sources.find((source) => source.requested === requested);\n if (exact) return exact;\n throw new Error(\n `Package source ${requested} is not locked. Run \"cookbook update\" to reconcile ${LOCK_FILE} with docs.config.ts.`,\n );\n}\n\n/** Reject paths and glob patterns that could address files outside a package. */\nexport function assertSafePackagePath(path: string, field: string): void {\n const normalized = path.replaceAll(\"\\\\\", \"/\");\n if (\n path.trim() === \"\" ||\n path.includes(\"\\0\") ||\n isAbsolute(path) ||\n normalized.startsWith(\"/\") ||\n /^[a-z]:\\//i.test(normalized) ||\n normalized.includes(\"..\")\n ) {\n throw new Error(`${field} must stay within the package root: ${path}.`);\n }\n}\n\nexport function defaultLock(sources: PackageLockSource[]): CookbookLock {\n return { schemaVersion: 1, sources };\n}\n\nfunction isMissing(error: unknown): boolean {\n return (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n error.code === \"ENOENT\"\n );\n}\n\nfunction inside(root: string, path: string): boolean {\n const rel = relative(resolve(root), resolve(path));\n return (\n rel === \"\" ||\n (!rel.startsWith(`..${sep}`) && rel !== \"..\" && !isAbsolute(rel))\n );\n}\n","import { createHash } from \"node:crypto\";\nimport { execFile } from \"node:child_process\";\nimport { readFile, stat } from \"node:fs/promises\";\nimport {\n basename,\n dirname,\n extname,\n isAbsolute,\n relative,\n resolve,\n sep,\n} from \"node:path\";\nimport { promisify } from \"node:util\";\nimport type { Definition, Image, Link, Root } from \"mdast\";\nimport { glob } from \"tinyglobby\";\nimport { visit } from \"unist-util-visit\";\nimport { parse as parseYaml } from \"yaml\";\nimport { sanitizeMarkup } from \"../html/index.js\";\nimport { normalizeDocsConfig } from \"../config/index.js\";\nimport {\n cloneAst,\n parseMarkdown,\n removeRenderedTitle,\n serializeMarkdown,\n stripLeadingBadgeBlock,\n} from \"../markdown/index.js\";\nimport {\n assertSafePackagePath,\n discoverPackage,\n lockForSource,\n materializePackage,\n readDocsLock,\n} from \"../npm/index.js\";\nimport type {\n CreateDocsGraphOptions,\n DocsAsset,\n DocsDiagnostic,\n DocsEntry,\n DocsFrontmatter,\n DocsGraph,\n DocsRoute,\n DocsSource,\n NavigationItem,\n NormalizedDocsConfig,\n NavigationPlacement,\n PackageLockSource,\n} from \"../types.js\";\n\ninterface RepositoryMetadata {\n url: string;\n directory?: string;\n}\n\ninterface CollectedSource {\n sourceId: string;\n routeBase?: string;\n absolutePath: string;\n sourcePath: string;\n sourceRoot: string;\n editPath?: string;\n route?: string;\n title?: string;\n description?: string;\n navigation?: false | NavigationPlacement;\n trust: \"markdown\" | \"mdx\";\n packageLock?: PackageLockSource;\n repository?: RepositoryMetadata;\n}\n\nconst MARKDOWN_EXTENSIONS = [\".md\", \".mdx\"];\nconst execFileAsync = promisify(execFile);\nconst FRONTMATTER_KEYS = new Set([\n \"aliases\",\n \"title\",\n \"description\",\n \"slug\",\n \"draft\",\n \"sidebar\",\n \"tableOfContents\",\n \"editUrl\",\n \"template\",\n \"hero\",\n \"lastUpdated\",\n \"prev\",\n \"next\",\n \"banner\",\n \"pagefind\",\n \"head\",\n]);\n\nexport async function createDocsGraph(\n options: CreateDocsGraphOptions = {},\n): Promise<DocsGraph> {\n const root = resolve(options.root ?? process.cwd());\n const normalized = normalizeDocsConfig(options.config);\n const config: NormalizedDocsConfig = options.base\n ? { ...normalized, build: { ...normalized.build, base: options.base } }\n : normalized;\n const diagnostics: DocsDiagnostic[] = [];\n const lock = options.lock ?? (await readDocsLock(root));\n const collected = await collectSources(root, config, lock, diagnostics);\n const entries: DocsEntry[] = [];\n const routeMap = new Map<string, DocsEntry>();\n const absoluteMap = new Map<string, DocsEntry[]>();\n const sourceMap = new Map<string, DocsEntry[]>();\n const repositoryMap = new Map<string, RepositoryMetadata>();\n\n for (const source of collected) {\n const entry = await readEntry(source, config, diagnostics);\n if (!entry) continue;\n const existing = routeMap.get(entry.route);\n if (existing) {\n diagnostics.push({\n code: \"DOCS_DUPLICATE_ROUTE\",\n severity: \"error\",\n message: `Route ${entry.route} is owned by both ${existing.sourcePath} and ${entry.sourcePath}.`,\n file: entry.sourcePath,\n related: [{ file: existing.sourcePath, message: \"First route owner.\" }],\n });\n continue;\n }\n routeMap.set(entry.route, entry);\n const absolute = normalizeFs(entry.absolutePath);\n absoluteMap.set(absolute, [...(absoluteMap.get(absolute) ?? []), entry]);\n sourceMap.set(entry.sourcePath, [\n ...(sourceMap.get(entry.sourcePath) ?? []),\n entry,\n ]);\n sourceMap.set(entry.id, [entry]);\n if (source.repository) repositoryMap.set(entry.id, source.repository);\n entries.push(entry);\n }\n\n if (entries.length === 0) {\n diagnostics.push({\n code: \"DOCS_NO_PAGES\",\n severity: \"error\",\n message:\n \"No documentation pages were found. Add README.md, docs/**/*.md, or configure content.sources.\",\n });\n }\n\n const redirects = resolveRedirects(\n config.redirects,\n entries,\n routeMap,\n diagnostics,\n );\n for (const [alias, target] of Object.entries(redirects)) {\n const entry = routeMap.get(target);\n if (entry) routeMap.set(alias, entry);\n }\n for (const entry of entries) {\n await transformEntry(\n entry,\n absoluteMap,\n routeMap,\n repositoryMap,\n config,\n diagnostics,\n );\n }\n validateNavigation(config.navigation.items ?? [], routeMap, diagnostics);\n for (const tab of config.navigation.tabs ?? []) {\n validateNavigation(\n [{ label: tab.label, link: tab.link }],\n routeMap,\n diagnostics,\n );\n validateNavigation(tab.items ?? [], routeMap, diagnostics);\n }\n\n entries.sort((left, right) => left.route.localeCompare(right.route));\n const routes: DocsRoute[] = entries.map((entry) => ({\n route: entry.route,\n entryId: entry.id,\n sourcePath: entry.sourcePath,\n title: entry.title,\n ...(entry.frontmatter.sidebar !== undefined\n ? { sidebar: entry.frontmatter.sidebar }\n : {}),\n }));\n const assets = Array.from(\n new Map(\n entries\n .flatMap((entry) => entry.assets)\n .map((asset) => [\n asset.publicPath ?? `${asset.original}:${asset.line ?? \"\"}`,\n asset,\n ]),\n ).values(),\n );\n return {\n redirects,\n root,\n config,\n entries,\n routes,\n assets,\n diagnostics,\n entryByRoute(route) {\n return routeMap.get(normalizeRoute(route));\n },\n entryBySource(sourcePath, sourceId) {\n const matches = sourceMap.get(sourcePath) ?? [];\n return sourceId\n ? matches.find((entry) => entry.sourceId === sourceId)\n : matches.length === 1\n ? matches[0]\n : undefined;\n },\n };\n}\n\nfunction resolveRedirects(\n configured: Record<string, string>,\n entries: DocsEntry[],\n routes: Map<string, DocsEntry>,\n diagnostics: DocsDiagnostic[],\n): Record<string, string> {\n const requested = new Map<string, string>();\n const error = (message: string) =>\n diagnostics.push({\n code: \"DOCS_REDIRECT_INVALID\",\n severity: \"error\",\n message,\n });\n const add = (from: string, to: string) => {\n try {\n const alias = normalizeRoute(from);\n const target = normalizeRoute(to);\n if (routes.has(alias) || requested.has(alias))\n error(`Redirect ${alias} conflicts with an existing page or redirect.`);\n else requested.set(alias, target);\n } catch (cause) {\n error(errorMessage(cause));\n }\n };\n for (const [from, to] of Object.entries(configured)) add(from, to);\n for (const entry of entries) {\n for (const alias of entry.frontmatter.aliases ?? [])\n add(`${entry.routeBase}/${alias}`, entry.route);\n }\n const result: Record<string, string> = {};\n for (const [alias, target] of requested) {\n const seen = new Set([alias]);\n let current = target;\n while (requested.has(current) && !seen.has(current)) {\n seen.add(current);\n current = requested.get(current)!;\n }\n if (seen.has(current)) error(`Redirect cycle includes ${alias}.`);\n else if (!routes.has(current))\n error(`Redirect ${alias} points to missing document ${current}.`);\n else result[alias] = current;\n }\n return result;\n}\n\nasync function collectSources(\n root: string,\n config: NormalizedDocsConfig,\n lock: CreateDocsGraphOptions[\"lock\"],\n diagnostics: DocsDiagnostic[],\n): Promise<CollectedSource[]> {\n const declarations =\n config.content.sources ?? (await conventionSources(root));\n const results: CollectedSource[] = [];\n const identities = new Set<string>();\n\n const sourceIds = new Set<string>();\n for (const [index, declaration] of declarations.entries()) {\n const sourceId = declaration.id ?? `source-${index + 1}`;\n if (sourceIds.has(sourceId)) {\n diagnostics.push({\n code: \"DOCS_DUPLICATE_SOURCE\",\n severity: \"error\",\n message: `Source id ${sourceId} is declared more than once.`,\n });\n continue;\n }\n sourceIds.add(sourceId);\n try {\n const found = await collectDeclaration(\n root,\n declaration,\n config,\n lock,\n sourceId,\n );\n if (found.length === 0) {\n diagnostics.push({\n code: \"DOCS_SOURCE_NOT_FOUND\",\n severity: \"error\",\n message: `Source did not match any files: ${sourceLabel(declaration)}.`,\n });\n }\n for (const source of found) {\n const identity = `${sourceId}:${normalizeFs(source.absolutePath)}`;\n if (identities.has(identity)) continue;\n identities.add(identity);\n results.push(source);\n }\n } catch (error) {\n diagnostics.push({\n code:\n error instanceof OutsideRootError\n ? \"DOCS_SOURCE_OUTSIDE_ROOT\"\n : \"DOCS_SOURCE_NOT_FOUND\",\n severity: \"error\",\n message: errorMessage(error),\n });\n }\n }\n return results;\n}\n\nasync function conventionSources(root: string): Promise<DocsSource[]> {\n const sources: DocsSource[] = [];\n if (await isFile(resolve(root, \"README.md\")))\n sources.push({ file: \"README.md\", route: \"/\" });\n const docs = resolve(root, \"docs\");\n if (await isDirectory(docs)) {\n sources.push({ glob: \"docs/**/*.{md,mdx}\", base: \"docs\" });\n }\n return sources;\n}\n\nasync function collectDeclaration(\n root: string,\n declaration: DocsSource,\n config: NormalizedDocsConfig,\n lock: CreateDocsGraphOptions[\"lock\"],\n sourceId: string,\n): Promise<CollectedSource[]> {\n if (\"package\" in declaration) {\n const packageLock = lockForSource(lock, declaration.package);\n if (declaration.registry && packageLock.registry !== declaration.registry) {\n throw new Error(\n `Registry changed for ${declaration.package}. Run \"cookbook update\".`,\n );\n }\n const sourceRoot = await materializePackage(\n packageLock,\n config.build,\n root,\n );\n const discovery = await discoverPackage(sourceRoot);\n const repository = config.content.localizeRepositoryLinks\n ? repositoryMetadata(discovery.manifest.repository)\n : undefined;\n const patterns = declaration.include?.length\n ? declaration.include\n : discovery.pages;\n for (const pattern of patterns) {\n assertSafePackagePath(pattern, \"Package source include\");\n }\n for (const pattern of declaration.exclude ?? []) {\n assertSafePackagePath(pattern, \"Package source exclude\");\n }\n if (declaration.index) {\n assertSafePackagePath(declaration.index, \"Package source index\");\n }\n const files = await glob(patterns, {\n cwd: sourceRoot,\n onlyFiles: true,\n ignore: declaration.exclude ?? [],\n });\n const index = declaration.index ?? discovery.home;\n return files\n .filter((path) =>\n MARKDOWN_EXTENSIONS.includes(extname(path).toLowerCase()),\n )\n .map((path) => {\n assertSafePackagePath(path, \"Discovered package source\");\n const absolutePath = resolve(sourceRoot, path);\n if (!inside(sourceRoot, absolutePath)) throw new OutsideRootError(path);\n return {\n sourceId,\n ...(declaration.routeBase\n ? { routeBase: declaration.routeBase }\n : {}),\n absolutePath,\n sourcePath: path,\n sourceRoot,\n route:\n path === index\n ? normalizeRoute(declaration.routeBase ?? \"/\")\n : routeForPath(path, \"docs\", declaration.routeBase),\n trust: declaration.trust ?? \"markdown\",\n packageLock,\n ...(repository ? { repository } : {}),\n };\n });\n }\n\n const sourceRoot = resolve(root, declaration.root ?? \".\");\n const repository = config.content.localizeRepositoryLinks\n ? repositoryMetadata(config.site.repository)\n : undefined;\n\n if (\"file\" in declaration) {\n const absolutePath = resolveSourcePath(\n sourceRoot,\n declaration.file,\n config.content.allowOutsideRoot,\n );\n if (!(await isFile(absolutePath))) return [];\n return [\n {\n sourceId,\n ...(declaration.routeBase ? { routeBase: declaration.routeBase } : {}),\n absolutePath,\n sourcePath: toPosix(relative(sourceRoot, absolutePath)),\n editPath: toPosix(\n relative(\n inside(root, absolutePath) ? root : sourceRoot,\n absolutePath,\n ),\n ),\n sourceRoot,\n route: declaration.route\n ? normalizeRoute(\n `${declaration.routeBase ?? \"\"}/${declaration.route}`,\n )\n : routeForPath(declaration.file, undefined, declaration.routeBase),\n ...(declaration.title ? { title: declaration.title } : {}),\n ...(declaration.description\n ? { description: declaration.description }\n : {}),\n ...(declaration.navigation !== undefined\n ? { navigation: declaration.navigation }\n : {}),\n trust: \"mdx\",\n ...(repository ? { repository } : {}),\n },\n ];\n }\n\n const patterns = Array.isArray(declaration.glob)\n ? declaration.glob\n : [declaration.glob];\n const paths = await glob(patterns, {\n cwd: sourceRoot,\n onlyFiles: true,\n dot: false,\n ignore: [\"**/_*/**\", \"**/_*\", ...(declaration.exclude ?? [])],\n });\n return paths.map((path) => {\n const absolutePath = resolveSourcePath(\n sourceRoot,\n path,\n config.content.allowOutsideRoot,\n );\n return {\n sourceId,\n ...(declaration.routeBase ? { routeBase: declaration.routeBase } : {}),\n absolutePath,\n sourcePath: toPosix(relative(sourceRoot, absolutePath)),\n editPath: toPosix(\n relative(inside(root, absolutePath) ? root : sourceRoot, absolutePath),\n ),\n sourceRoot,\n route: routeForPath(path, declaration.base, declaration.routeBase),\n ...(declaration.navigation === false ? { navigation: false } : {}),\n trust: \"mdx\",\n ...(repository ? { repository } : {}),\n };\n });\n}\n\nasync function readEntry(\n source: CollectedSource,\n config: NormalizedDocsConfig,\n diagnostics: DocsDiagnostic[],\n): Promise<DocsEntry | undefined> {\n if (\n extname(source.sourcePath).toLowerCase() === \".mdx\" &&\n source.trust !== \"mdx\"\n ) {\n diagnostics.push({\n code: \"DOCS_UNTRUSTED_MDX\",\n severity: \"error\",\n message: `Package MDX requires trust: 'mdx': ${source.sourcePath}.`,\n file: source.sourcePath,\n hint: \"Keep package sources in Markdown-safe mode or explicitly trust this locked artifact.\",\n });\n return undefined;\n }\n const original = await readFile(source.absolutePath, \"utf8\");\n let parsedMatter: ReturnType<typeof parseFrontmatter>;\n try {\n parsedMatter = parseFrontmatter(original);\n } catch (error) {\n diagnostics.push({\n code: \"DOCS_FRONTMATTER_INVALID\",\n severity: \"error\",\n message: `Could not parse frontmatter: ${errorMessage(error)}.`,\n file: source.sourcePath,\n });\n return undefined;\n }\n const frontmatter = parsedMatter.data;\n if (frontmatter.sidebar === undefined && source.navigation !== undefined) {\n frontmatter.sidebar = source.navigation;\n }\n const diagnosticCount = diagnostics.length;\n const metadata: Record<string, unknown> = {};\n for (const key of Object.keys(frontmatter)) {\n if (!FRONTMATTER_KEYS.has(key)) {\n if (config.content.frontmatter !== \"reject\") {\n metadata[key] = (frontmatter as Record<string, unknown>)[key];\n delete (frontmatter as Record<string, unknown>)[key];\n continue;\n }\n diagnostics.push({\n code: \"DOCS_FRONTMATTER_INVALID\",\n severity: \"error\",\n message: `Unknown frontmatter key \"${key}\".`,\n file: source.sourcePath,\n });\n }\n }\n validateFrontmatter(frontmatter, source.sourcePath, diagnostics);\n if (diagnostics.length > diagnosticCount) return undefined;\n const mdx = extname(source.sourcePath).toLowerCase() === \".mdx\";\n const parsed = parseMarkdown(parsedMatter.content, { mdx });\n const route = normalizeRoute(\n frontmatter.slug !== undefined\n ? `${source.routeBase ?? \"\"}/${frontmatter.slug}`\n : (source.route ?? routeForPath(source.sourcePath)),\n );\n const title =\n frontmatter.title ??\n source.title ??\n parsed.firstHeading ??\n titleFromFile(source.sourcePath);\n const description =\n frontmatter.description ?? source.description ?? parsed.description;\n await resolvePageMetadata(frontmatter, source, config);\n const duplicateTitles = new Map<string, number>();\n for (const heading of parsed.headings) {\n const count = (duplicateTitles.get(heading.text) ?? 0) + 1;\n duplicateTitles.set(heading.text, count);\n if (count > 1) {\n diagnostics.push({\n code: \"DOCS_HEADING_DUPLICATE\",\n severity: \"warning\",\n message: `Repeated heading \"${heading.text}\" receives the generated ID \"${heading.slug}\".`,\n file: source.sourcePath,\n ...(heading.line ? { line: heading.line } : {}),\n });\n }\n }\n return {\n id: `${source.sourceId}:${source.sourcePath}`,\n sourceId: source.sourceId,\n routeBase: source.routeBase ?? \"/\",\n metadata,\n sourcePath: source.sourcePath,\n absolutePath: source.absolutePath,\n sourceRoot: source.sourceRoot,\n route,\n title,\n ...(description ? { description } : {}),\n frontmatter,\n headings: parsed.headings,\n body: parsedMatter.content,\n transformedBody: parsedMatter.content,\n ast: parsed.ast,\n links: [],\n assets: [],\n trust: source.trust,\n ...(source.packageLock\n ? {\n package: {\n requested: source.packageLock.requested,\n resolved: source.packageLock.resolved,\n },\n }\n : {}),\n };\n}\n\nasync function resolvePageMetadata(\n frontmatter: DocsFrontmatter,\n source: CollectedSource,\n config: NormalizedDocsConfig,\n): Promise<void> {\n if (frontmatter.editUrl === undefined && config.editLink) {\n const baseUrl = config.editLink.baseUrl.endsWith(\"/\")\n ? config.editLink.baseUrl\n : `${config.editLink.baseUrl}/`;\n frontmatter.editUrl = `${baseUrl}${(source.editPath ?? source.sourcePath).replace(/^\\/+/, \"\")}`;\n }\n\n if (frontmatter.lastUpdated === false) return;\n if (frontmatter.lastUpdated === undefined && config.lastUpdated === false) {\n return;\n }\n if (frontmatter.lastUpdated instanceof Date) return;\n\n try {\n const { stdout } = await execFileAsync(\n \"git\",\n [\"log\", \"-1\", \"--format=%ct\", \"--\", source.absolutePath],\n { cwd: source.sourceRoot },\n );\n const timestamp = Number(stdout.trim());\n if (Number.isFinite(timestamp) && timestamp > 0) {\n frontmatter.lastUpdated = new Date(timestamp * 1000);\n }\n } catch {\n // Sources can come from npm caches or directories without Git history.\n }\n}\n\nasync function transformEntry(\n entry: DocsEntry,\n absoluteMap: Map<string, DocsEntry[]>,\n routeMap: Map<string, DocsEntry>,\n repositoryMap: Map<string, RepositoryMetadata>,\n config: NormalizedDocsConfig,\n diagnostics: DocsDiagnostic[],\n): Promise<void> {\n sanitizeUntrustedFrontmatter(entry, config, diagnostics);\n const ast = cloneAst(entry.ast);\n if (config.markdown.stripLeadingBadges) stripLeadingBadgeBlock(ast);\n removeRenderedTitle(ast, entry.title);\n\n const htmlTasks: Promise<void>[] = [];\n visit(ast, \"html\", (node) => {\n const policy = rawHtmlPolicy(entry, config);\n if (policy === \"allow\") return;\n if (policy === \"sanitize\") {\n htmlTasks.push(\n sanitizeMarkup(node.value, async (url, kind) => {\n const reference: Link = {\n type: \"link\",\n url,\n children: [],\n ...(node.position ? { position: node.position } : {}),\n };\n if (kind === \"link\") {\n await rewriteLink(\n reference,\n entry,\n absoluteMap,\n routeMap,\n repositoryMap,\n config,\n diagnostics,\n );\n } else {\n const image: Image = {\n type: \"image\",\n url,\n alt: \"\",\n ...(node.position ? { position: node.position } : {}),\n };\n await rewriteAsset(image, entry, config, diagnostics);\n reference.url = image.url;\n }\n return reference.url;\n }).then((html) => {\n node.value = html;\n }),\n );\n return;\n }\n diagnostics.push({\n code:\n policy === \"reject\"\n ? \"DOCS_RAW_HTML_REJECTED\"\n : \"DOCS_RAW_HTML_STRIPPED\",\n severity: policy === \"reject\" ? \"error\" : \"warning\",\n message: `Raw HTML was ${policy === \"reject\" ? \"rejected\" : \"removed\"}: ${entry.sourcePath}.`,\n file: entry.sourcePath,\n ...lineData(node),\n });\n node.value = \"\";\n });\n await Promise.all(htmlTasks);\n\n const referenceKinds = new Map<string, \"link\" | \"image\" | \"mixed\">();\n visit(ast, (node) => {\n if (node.type !== \"linkReference\" && node.type !== \"imageReference\") {\n return;\n }\n const key = node.identifier.toLowerCase();\n const kind = node.type === \"imageReference\" ? \"image\" : \"link\";\n const previous = referenceKinds.get(key);\n referenceKinds.set(key, previous && previous !== kind ? \"mixed\" : kind);\n });\n\n const linkTasks: Promise<void>[] = [];\n visit(ast, (node) => {\n if (node.type === \"link\") {\n linkTasks.push(\n rewriteLink(\n node,\n entry,\n absoluteMap,\n routeMap,\n repositoryMap,\n config,\n diagnostics,\n ),\n );\n } else if (node.type === \"image\") {\n linkTasks.push(rewriteAsset(node, entry, config, diagnostics));\n } else if (node.type === \"definition\") {\n const kind = referenceKinds.get(node.identifier.toLowerCase());\n if (kind === \"image\") {\n linkTasks.push(rewriteAsset(node, entry, config, diagnostics));\n } else if (kind === \"link\") {\n linkTasks.push(\n rewriteLink(\n node,\n entry,\n absoluteMap,\n routeMap,\n repositoryMap,\n config,\n diagnostics,\n ),\n );\n } else if (kind === \"mixed\") {\n linkTasks.push(\n rewriteDefinition(\n node,\n entry,\n absoluteMap,\n routeMap,\n repositoryMap,\n config,\n diagnostics,\n ),\n );\n }\n }\n });\n await Promise.all(linkTasks);\n await rewriteFrontmatterReferences(\n entry,\n absoluteMap,\n routeMap,\n repositoryMap,\n config,\n diagnostics,\n );\n entry.ast = ast;\n entry.transformedBody = serializeMarkdown(ast, {\n mdx: extname(entry.sourcePath).toLowerCase() === \".mdx\",\n });\n}\n\nfunction sanitizeUntrustedFrontmatter(\n entry: DocsEntry,\n config: NormalizedDocsConfig,\n diagnostics: DocsDiagnostic[],\n): void {\n if (entry.trust !== \"markdown\") return;\n let removed = false;\n const plainText = (value: string): string => {\n const sanitized = value.replace(/<!--[\\s\\S]*?-->|<[^>]*>/g, \"\");\n if (sanitized !== value) removed = true;\n return sanitized;\n };\n\n entry.title = plainText(entry.title);\n if (entry.frontmatter.title !== undefined) {\n entry.frontmatter.title = plainText(entry.frontmatter.title);\n }\n const hero = entry.frontmatter.hero;\n if (hero?.title !== undefined) hero.title = plainText(hero.title);\n if (hero?.tagline !== undefined) hero.tagline = plainText(hero.tagline);\n if (hero?.image && \"html\" in hero.image) {\n delete hero.image;\n removed = true;\n }\n if (entry.frontmatter.banner) {\n entry.frontmatter.banner.content = plainText(\n entry.frontmatter.banner.content,\n );\n }\n if (entry.frontmatter.head) {\n delete entry.frontmatter.head;\n removed = true;\n }\n\n if (removed) {\n diagnostics.push({\n code:\n config.markdown.rawHtml === \"reject\"\n ? \"DOCS_RAW_HTML_REJECTED\"\n : \"DOCS_UNTRUSTED_HTML\",\n severity: config.markdown.rawHtml === \"reject\" ? \"error\" : \"warning\",\n message:\n config.markdown.rawHtml === \"reject\"\n ? `HTML-capable frontmatter is not allowed by markdown.rawHtml: ${entry.sourcePath}.`\n : \"HTML-capable frontmatter was sanitized in package Markdown. Use trust: 'mdx' only for packages you trust.\",\n file: entry.sourcePath,\n });\n }\n}\n\nfunction rawHtmlPolicy(\n entry: DocsEntry,\n config: NormalizedDocsConfig,\n): NormalizedDocsConfig[\"markdown\"][\"rawHtml\"] {\n if (config.markdown.rawHtml === \"reject\") return \"reject\";\n if (config.markdown.rawHtml === \"strip\") return \"strip\";\n return entry.trust === \"markdown\" ? \"sanitize\" : config.markdown.rawHtml;\n}\n\nasync function rewriteFrontmatterReferences(\n entry: DocsEntry,\n absoluteMap: Map<string, DocsEntry[]>,\n routeMap: Map<string, DocsEntry>,\n repositoryMap: Map<string, RepositoryMetadata>,\n config: NormalizedDocsConfig,\n diagnostics: DocsDiagnostic[],\n): Promise<void> {\n for (const action of entry.frontmatter.hero?.actions ?? []) {\n const node: Link = { type: \"link\", url: action.link, children: [] };\n await rewriteLink(\n node,\n entry,\n absoluteMap,\n routeMap,\n repositoryMap,\n config,\n diagnostics,\n );\n action.link = node.url;\n }\n\n const image = entry.frontmatter.hero?.image;\n if (!image || \"html\" in image) return;\n if (\"file\" in image) {\n image.file = await rewriteFrontmatterAsset(\n image.file,\n entry,\n config,\n diagnostics,\n );\n return;\n }\n const [dark, light] = await Promise.all([\n rewriteFrontmatterAsset(image.dark, entry, config, diagnostics),\n rewriteFrontmatterAsset(image.light, entry, config, diagnostics),\n ]);\n image.dark = dark;\n image.light = light;\n}\n\nasync function rewriteFrontmatterAsset(\n url: string,\n entry: DocsEntry,\n config: NormalizedDocsConfig,\n diagnostics: DocsDiagnostic[],\n): Promise<string> {\n const asset = await materializeAsset(url, entry, config, diagnostics, {});\n entry.assets.push(asset);\n return asset.resolved ?? url;\n}\n\nasync function rewriteLink(\n node: Link | Definition,\n entry: DocsEntry,\n absoluteMap: Map<string, DocsEntry[]>,\n routeMap: Map<string, DocsEntry>,\n repositoryMap: Map<string, RepositoryMetadata>,\n config: NormalizedDocsConfig,\n diagnostics: DocsDiagnostic[],\n): Promise<void> {\n const reference: import(\"../types.js\").DocsReference = {\n original: node.url,\n ...lineData(node),\n };\n entry.links.push(reference);\n if (node.url.startsWith(\"source:\")) {\n const { pathname, query, fragment } = splitReference(node.url.slice(7));\n const slash = pathname.indexOf(\"/\");\n const sourceId = slash < 0 ? pathname : pathname.slice(0, slash);\n const sourcePath = safeDecode(pathname.slice(slash + 1));\n const target = [...absoluteMap.values()]\n .flat()\n .find(\n (candidate) =>\n candidate.sourceId === sourceId &&\n candidate.sourcePath === sourcePath,\n );\n if (!target || slash < 0)\n missingLink(diagnostics, entry, node, node.url, config);\n else {\n node.url = `${withBase(target.route, config.build.base)}${query}${fragment ? `#${fragment}` : \"\"}`;\n reference.resolved = node.url;\n reference.targetSource = target.sourcePath;\n validateFragment(fragment, target, entry, node, diagnostics, config);\n }\n return;\n }\n if (unsafeProtocol(node.url)) {\n diagnostic(\n diagnostics,\n \"DOCS_LINK_UNSAFE\",\n `Unsafe URL protocol: ${node.url}.`,\n entry,\n node,\n );\n return;\n }\n if (isExternal(node.url)) {\n const target = config.content.localizeRepositoryLinks\n ? localizedRepositoryTarget(\n node.url,\n entry,\n absoluteMap,\n repositoryMap.get(entry.id),\n )\n : undefined;\n if (!target) return;\n const { query, fragment } = splitReference(node.url);\n node.url = `${withBase(target.route, config.build.base)}${query}${fragment ? `#${fragment}` : \"\"}`;\n reference.resolved = node.url;\n reference.targetSource = target.sourcePath;\n if (fragment) reference.fragment = fragment;\n validateFragment(fragment, target, entry, node, diagnostics, config);\n return;\n }\n if (node.url.startsWith(\"#\")) return;\n const { pathname, query, fragment } = splitReference(node.url);\n if (pathname.startsWith(\"/\")) {\n const target = routeMap.get(normalizeRoute(pathname));\n if (!target) missingLink(diagnostics, entry, node, node.url, config);\n else {\n node.url = `${withBase(target.route, config.build.base)}${query}${fragment ? `#${fragment}` : \"\"}`;\n reference.resolved = node.url;\n reference.targetSource = target.sourcePath;\n if (fragment) reference.fragment = fragment;\n validateFragment(fragment, target, entry, node, diagnostics, config);\n }\n return;\n }\n const decoded = safeDecode(pathname);\n const targetPath = resolve(dirname(entry.absolutePath), decoded);\n if (!inside(entry.sourceRoot, targetPath)) {\n diagnostic(\n diagnostics,\n \"DOCS_SOURCE_OUTSIDE_ROOT\",\n `Link escapes its allowed source root: ${node.url}.`,\n entry,\n node,\n );\n return;\n }\n const target = findDocument(targetPath, absoluteMap, entry.sourceId);\n if (!target) {\n if (documentMatches(targetPath, absoluteMap).length > 1) {\n diagnostic(\n diagnostics,\n \"DOCS_AMBIGUOUS_LINK\",\n `Link matches multiple source mounts: ${node.url}. Use source:<id>/<path> to choose a source.`,\n entry,\n node,\n );\n return;\n }\n if (await isFile(targetPath)) {\n const asset = await materializeAsset(\n node.url,\n entry,\n config,\n diagnostics,\n node,\n );\n if (asset.resolved) {\n node.url = asset.resolved;\n reference.resolved = asset.resolved;\n }\n entry.assets.push(asset);\n return;\n }\n missingLink(diagnostics, entry, node, node.url, config);\n return;\n }\n node.url = `${withBase(target.route, config.build.base)}${query}${fragment ? `#${fragment}` : \"\"}`;\n reference.resolved = node.url;\n reference.targetSource = target.sourcePath;\n if (fragment) reference.fragment = fragment;\n validateFragment(fragment, target, entry, node, diagnostics, config);\n}\n\nasync function rewriteAsset(\n node: Image | Definition,\n entry: DocsEntry,\n config: NormalizedDocsConfig,\n diagnostics: DocsDiagnostic[],\n): Promise<void> {\n const asset = await materializeAsset(\n node.url,\n entry,\n config,\n diagnostics,\n node,\n );\n entry.assets.push(asset);\n if (asset.resolved) node.url = asset.resolved;\n}\n\nasync function materializeAsset(\n url: string,\n entry: DocsEntry,\n config: NormalizedDocsConfig,\n diagnostics: DocsDiagnostic[],\n node: PositionedNode,\n): Promise<DocsAsset> {\n const asset: DocsAsset = { original: url, ...lineData(node) };\n if (unsafeProtocol(url)) {\n diagnostic(\n diagnostics,\n \"DOCS_ASSET_UNSAFE\",\n `Unsafe asset URL: ${url}.`,\n entry,\n node,\n );\n return asset;\n }\n if (isExternal(url) || url.startsWith(\"#\")) return asset;\n const { pathname, query, fragment } = splitReference(url);\n const absolute = resolve(dirname(entry.absolutePath), safeDecode(pathname));\n if (!inside(entry.sourceRoot, absolute)) {\n diagnostic(\n diagnostics,\n \"DOCS_SOURCE_OUTSIDE_ROOT\",\n `Asset escapes its allowed source root: ${url}.`,\n entry,\n node,\n );\n return asset;\n }\n try {\n const info = await stat(absolute);\n if (!info.isFile()) throw new Error(\"not a file\");\n if (info.size > config.build.maxAssetBytes) {\n throw new Error(`asset exceeds ${config.build.maxAssetBytes} bytes`);\n }\n const hash = createHash(\"sha256\")\n .update(await readFile(absolute))\n .digest(\"hex\")\n .slice(0, 12);\n const publicPath = withBase(\n `/_tasty-assets/${hash}-${basename(absolute)}`,\n config.build.base,\n );\n const resolved = `${publicPath}${query}${fragment ? `#${fragment}` : \"\"}`;\n Object.assign(asset, {\n resolved,\n sourcePath: absolute,\n publicPath,\n hash,\n bytes: info.size,\n });\n } catch (error) {\n diagnostic(\n diagnostics,\n \"DOCS_ASSET_NOT_FOUND\",\n `Asset not found or invalid: ${url} (${errorMessage(error)}).`,\n entry,\n node,\n );\n }\n return asset;\n}\n\nasync function rewriteDefinition(\n node: Definition,\n entry: DocsEntry,\n absoluteMap: Map<string, DocsEntry[]>,\n routeMap: Map<string, DocsEntry>,\n repositoryMap: Map<string, RepositoryMetadata>,\n config: NormalizedDocsConfig,\n diagnostics: DocsDiagnostic[],\n): Promise<void> {\n const { pathname } = splitReference(node.url);\n const targetPath = resolve(dirname(entry.absolutePath), safeDecode(pathname));\n if (\n documentMatches(targetPath, absoluteMap).length > 0 ||\n node.url.startsWith(\"source:\") ||\n pathname.startsWith(\"/\")\n ) {\n await rewriteLink(\n node,\n entry,\n absoluteMap,\n routeMap,\n repositoryMap,\n config,\n diagnostics,\n );\n } else {\n await rewriteAsset(node, entry, config, diagnostics);\n }\n}\n\nfunction findDocument(\n path: string,\n absoluteMap: Map<string, DocsEntry[]>,\n sourceId?: string,\n): DocsEntry | undefined {\n const matches = documentMatches(path, absoluteMap);\n return (\n matches.find((item) => item.sourceId === sourceId) ??\n (matches.length === 1 ? matches[0] : undefined)\n );\n}\n\nfunction documentMatches(\n path: string,\n absoluteMap: Map<string, DocsEntry[]>,\n): DocsEntry[] {\n const candidates = [\n path,\n ...MARKDOWN_EXTENSIONS.map((extension) => `${path}${extension}`),\n ...MARKDOWN_EXTENSIONS.map((extension) =>\n resolve(path, `README${extension}`),\n ),\n ...MARKDOWN_EXTENSIONS.map((extension) =>\n resolve(path, `index${extension}`),\n ),\n ];\n for (const candidate of candidates) {\n const matches = absoluteMap.get(normalizeFs(candidate)) ?? [];\n if (matches.length) return matches;\n }\n return [];\n}\n\nfunction validateFragment(\n fragment: string,\n target: DocsEntry,\n source: DocsEntry,\n node: Link | Definition,\n diagnostics: DocsDiagnostic[],\n config: NormalizedDocsConfig,\n): void {\n if (!fragment) return;\n const decoded = safeDecode(fragment);\n if (!target.headings.some((heading) => heading.slug === decoded)) {\n diagnostics.push({\n code: \"DOCS_FRAGMENT_NOT_FOUND\",\n severity: config.build.ci ? \"error\" : \"warning\",\n message: `Heading fragment #${fragment} does not exist on ${target.route}.`,\n file: source.sourcePath,\n ...lineData(node),\n hint: `Known headings: ${target.headings.map((heading) => `#${heading.slug}`).join(\", \") || \"(none)\"}.`,\n });\n }\n}\n\nfunction missingLink(\n diagnostics: DocsDiagnostic[],\n entry: DocsEntry,\n node: Link | Definition,\n url: string,\n config: NormalizedDocsConfig,\n): void {\n diagnostics.push({\n code: \"DOCS_LINK_NOT_FOUND\",\n severity: config.build.strict ? \"error\" : \"warning\",\n message: `Internal link target not found: ${url}.`,\n file: entry.sourcePath,\n ...lineData(node),\n });\n}\n\nfunction validateNavigation(\n items: NavigationItem[],\n routes: Map<string, DocsEntry>,\n diagnostics: DocsDiagnostic[],\n): void {\n for (const item of items) {\n if (typeof item === \"string\") {\n if (!routes.has(normalizeRoute(item))) {\n diagnostics.push({\n code: \"DOCS_NAV_TARGET_NOT_FOUND\",\n severity: \"error\",\n message: `Navigation target does not exist: ${item}.`,\n });\n }\n } else if (\"items\" in item) {\n validateNavigation(item.items, routes, diagnostics);\n } else if (\n \"link\" in item &&\n item.link.startsWith(\"/\") &&\n !routes.has(normalizeRoute(item.link))\n ) {\n diagnostics.push({\n code: \"DOCS_NAV_TARGET_NOT_FOUND\",\n severity: \"error\",\n message: `Navigation target does not exist: ${item.link}.`,\n });\n }\n }\n}\n\nexport function normalizeRoute(route: string): string {\n const clean =\n route\n .split(/[?#]/, 1)[0]\n ?.replace(/\\\\/g, \"/\")\n .replace(/\\/{2,}/g, \"/\") ?? \"/\";\n const segments = clean.split(\"/\").filter(Boolean);\n if (segments.some((segment) => segment === \"..\"))\n throw new Error(`Route may not contain \"..\": ${route}.`);\n const normalized = `/${segments.join(\"/\")}`;\n return normalized === \"/\" ? \"/\" : normalized.replace(/\\/$/, \"\");\n}\n\nexport function routeForPath(\n path: string,\n base?: string,\n routeBase?: string,\n): string {\n let relativePath = toPosix(path);\n if (base) {\n const normalizedBase = toPosix(base)\n .replace(/^\\.\\//, \"\")\n .replace(/\\/$/, \"\");\n if (relativePath === normalizedBase) relativePath = \"\";\n else if (relativePath.startsWith(`${normalizedBase}/`))\n relativePath = relativePath.slice(normalizedBase.length + 1);\n }\n relativePath = relativePath.replace(/\\.(md|mdx)$/i, \"\");\n relativePath = relativePath\n .replace(/(^|\\/)README$/i, \"$1\")\n .replace(/(^|\\/)index$/i, \"$1\");\n return normalizeRoute(`${routeBase ?? \"\"}/${relativePath}`);\n}\n\nfunction resolveSourcePath(\n root: string,\n path: string,\n allowOutsideRoot: boolean,\n): string {\n const absolute = isAbsolute(path) ? resolve(path) : resolve(root, path);\n if (!allowOutsideRoot && !inside(root, absolute))\n throw new OutsideRootError(path);\n return absolute;\n}\n\nfunction inside(root: string, path: string): boolean {\n const rel = relative(resolve(root), resolve(path));\n return (\n rel === \"\" ||\n (!rel.startsWith(`..${sep}`) && rel !== \"..\" && !isAbsolute(rel))\n );\n}\n\nfunction splitReference(url: string): {\n pathname: string;\n query: string;\n fragment: string;\n} {\n const hashIndex = url.indexOf(\"#\");\n const fragment = hashIndex >= 0 ? url.slice(hashIndex + 1) : \"\";\n const withoutHash = hashIndex >= 0 ? url.slice(0, hashIndex) : url;\n const queryIndex = withoutHash.indexOf(\"?\");\n return {\n pathname: queryIndex >= 0 ? withoutHash.slice(0, queryIndex) : withoutHash,\n query: queryIndex >= 0 ? withoutHash.slice(queryIndex) : \"\",\n fragment,\n };\n}\n\nfunction isExternal(url: string): boolean {\n return /^(?:[a-z][a-z\\d+.-]*:|\\/\\/)/i.test(url);\n}\n\nfunction localizedRepositoryTarget(\n value: string,\n entry: DocsEntry,\n entries: Map<string, DocsEntry[]>,\n metadata: RepositoryMetadata | undefined,\n): DocsEntry | undefined {\n if (!metadata) return undefined;\n let link: URL;\n let repository: URL;\n try {\n link = new URL(value);\n repository = new URL(metadata.url);\n } catch {\n return undefined;\n }\n const repositoryPath = repository.pathname.replace(/\\/+$/, \"\");\n if (\n link.origin !== repository.origin ||\n !link.pathname.startsWith(`${repositoryPath}/`)\n ) {\n return undefined;\n }\n const repositoryRelative = safeDecode(\n link.pathname.slice(repositoryPath.length + 1),\n );\n if (\n !/^(?:-\\/(?:blob|tree|raw)|blob|tree|raw|src)\\//.test(repositoryRelative)\n ) {\n return undefined;\n }\n\n const directory = metadata.directory?.replace(/^\\/+|\\/+$/g, \"\");\n const matches = [...entries.values()]\n .flat()\n .filter((candidate) => candidate.sourceRoot === entry.sourceRoot)\n .flatMap((candidate) => {\n const sourcePath = candidate.sourcePath.replace(/^\\/+/, \"\");\n const paths = [sourcePath];\n if (/(?:^|\\/)(?:README|index)\\.mdx?$/i.test(sourcePath)) {\n paths.push(sourcePath.replace(/(?:^|\\/)(?:README|index)\\.mdx?$/i, \"\"));\n }\n const repositoryPaths = paths\n .flatMap((path) => [\n path,\n ...(directory ? [`${directory}/${path}`] : []),\n ])\n .map((path) => path.replace(/\\/+$/, \"\"))\n .filter(Boolean);\n const matched = repositoryPaths.find(\n (path) =>\n repositoryRelative === path ||\n repositoryRelative.endsWith(`/${path}`),\n );\n return matched ? [{ candidate, length: matched.length }] : [];\n })\n .sort(\n (left, right) =>\n Number(right.candidate.sourceId === entry.sourceId) -\n Number(left.candidate.sourceId === entry.sourceId) ||\n right.length - left.length,\n );\n return matches[0]?.candidate;\n}\n\nfunction repositoryMetadata(\n repository:\n string | { type?: string; url?: string; directory?: string } | undefined,\n): RepositoryMetadata | undefined {\n let raw = typeof repository === \"string\" ? repository : repository?.url;\n if (!raw) return undefined;\n raw = raw.replace(/^git\\+/, \"\");\n const scp = /^git@([^:]+):(.+)$/.exec(raw);\n if (scp) raw = `https://${scp[1]}/${scp[2]}`;\n try {\n let url = new URL(raw);\n if (url.protocol !== \"http:\" && url.protocol !== \"https:\") {\n if (!url.hostname || ![\"git:\", \"ssh:\"].includes(url.protocol)) {\n return undefined;\n }\n url = new URL(`https://${url.hostname}${url.pathname}`);\n }\n url.search = \"\";\n url.hash = \"\";\n url.pathname = url.pathname.replace(/\\.git\\/?$/, \"\").replace(/\\/+$/, \"\");\n const directory =\n typeof repository === \"object\"\n ? repository.directory?.replaceAll(\"\\\\\", \"/\").replace(/^\\/+|\\/+$/g, \"\")\n : undefined;\n return {\n url: url.href.replace(/\\/$/, \"\"),\n ...(directory ? { directory } : {}),\n };\n } catch {\n return undefined;\n }\n}\n\nfunction unsafeProtocol(url: string): boolean {\n return /^(?:javascript|vbscript|data):/i.test(url.trim());\n}\n\nfunction withBase(route: string, base: string): string {\n const normalizedBase =\n base === \"/\" ? \"\" : `/${base.replace(/^\\/+|\\/+$/g, \"\")}`;\n return `${normalizedBase}${normalizeRoute(route)}` || \"/\";\n}\n\nfunction titleFromFile(path: string): string {\n const raw = basename(path, extname(path)).replace(\n /^README$/i,\n basename(dirname(path)) || \"Documentation\",\n );\n return raw\n .replace(/[-_]+/g, \" \")\n .replace(/\\b\\w/g, (letter) => letter.toUpperCase());\n}\n\nfunction diagnostic(\n diagnostics: DocsDiagnostic[],\n code: string,\n message: string,\n entry: DocsEntry,\n node: PositionedNode,\n): void {\n diagnostics.push({\n code,\n severity: \"error\",\n message,\n file: entry.sourcePath,\n ...lineData(node),\n });\n}\n\ntype PositionedNode = { position?: { start: { line: number } } | undefined };\n\nfunction lineOf(node: PositionedNode): number | undefined {\n return node.position?.start.line;\n}\n\nfunction lineData(\n node: PositionedNode,\n): { line: number } | Record<string, never> {\n const line = lineOf(node);\n return line === undefined ? {} : { line };\n}\n\nfunction safeDecode(value: string): string {\n try {\n return decodeURIComponent(value);\n } catch {\n return value;\n }\n}\n\nfunction sourceLabel(source: DocsSource): string {\n if (\"file\" in source) return source.file;\n if (\"glob\" in source)\n return Array.isArray(source.glob) ? source.glob.join(\", \") : source.glob;\n return source.package;\n}\n\nfunction normalizeFs(path: string): string {\n return resolve(path);\n}\n\nfunction toPosix(path: string): string {\n return path.split(sep).join(\"/\");\n}\n\nasync function isFile(path: string): Promise<boolean> {\n try {\n return (await stat(path)).isFile();\n } catch {\n return false;\n }\n}\n\nasync function isDirectory(path: string): Promise<boolean> {\n try {\n return (await stat(path)).isDirectory();\n } catch {\n return false;\n }\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nclass OutsideRootError extends Error {\n constructor(path: string) {\n super(`Source path is outside the repository root: ${path}.`);\n this.name = \"OutsideRootError\";\n }\n}\n\nfunction parseFrontmatter(source: string): {\n data: DocsFrontmatter;\n content: string;\n} {\n const match =\n /^(?:\\uFEFF)?---[\\t ]*\\r?\\n([\\s\\S]*?)\\r?\\n(?:---|\\.\\.\\.)[\\t ]*(?:\\r?\\n|$)/.exec(\n source,\n );\n if (!match) return { data: {}, content: source };\n const value = parseYaml(match[1] ?? \"\");\n if (value !== null && !isPlainRecord(value)) {\n throw new Error(\"Markdown frontmatter must be a YAML object.\");\n }\n const data = (value ?? {}) as DocsFrontmatter;\n if (\n typeof data.lastUpdated === \"string\" &&\n !Number.isNaN(Date.parse(data.lastUpdated))\n ) {\n data.lastUpdated = new Date(data.lastUpdated);\n }\n return { data, content: source.slice(match[0].length) };\n}\n\nfunction isPlainRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction validateFrontmatter(\n value: DocsFrontmatter,\n file: string,\n diagnostics: DocsDiagnostic[],\n): void {\n const record = value as Record<string, unknown>;\n const error = (message: string) =>\n diagnostics.push({\n code: \"DOCS_FRONTMATTER_INVALID\",\n severity: \"error\",\n message,\n file,\n });\n if (\n value.aliases !== undefined &&\n (!Array.isArray(value.aliases) ||\n value.aliases.some((alias) => typeof alias !== \"string\"))\n )\n error(\"aliases must be an array of route strings.\");\n for (const key of [\"title\", \"description\", \"slug\"] as const) {\n if (record[key] !== undefined && typeof record[key] !== \"string\") {\n error(`${key} must be a string.`);\n }\n }\n for (const key of [\"draft\", \"pagefind\"] as const) {\n if (record[key] !== undefined && typeof record[key] !== \"boolean\") {\n error(`${key} must be a boolean.`);\n }\n }\n if (\n record.template !== undefined &&\n record.template !== \"doc\" &&\n record.template !== \"splash\"\n ) {\n error('template must be \"doc\" or \"splash\".');\n }\n for (const key of [\"sidebar\", \"tableOfContents\"] as const) {\n const entry = record[key];\n if (entry !== undefined && entry !== false && !isPlainRecord(entry)) {\n error(`${key} must be false or an object.`);\n }\n }\n if (isPlainRecord(record.sidebar)) {\n validateOptionalStrings(\n record.sidebar,\n [\"label\", \"group\"],\n \"sidebar\",\n error,\n );\n if (\n record.sidebar.order !== undefined &&\n typeof record.sidebar.order !== \"number\"\n ) {\n error(\"sidebar.order must be a number.\");\n }\n }\n if (isPlainRecord(record.tableOfContents)) {\n for (const key of [\"minHeadingLevel\", \"maxHeadingLevel\"] as const) {\n const level = record.tableOfContents[key];\n if (\n level !== undefined &&\n (!Number.isInteger(level) || Number(level) < 1 || Number(level) > 6)\n ) {\n error(`tableOfContents.${key} must be an integer from 1 to 6.`);\n }\n }\n }\n if (\n record.editUrl !== undefined &&\n record.editUrl !== false &&\n typeof record.editUrl !== \"string\"\n ) {\n error(\"editUrl must be false or a string.\");\n }\n if (\n record.lastUpdated !== undefined &&\n typeof record.lastUpdated !== \"boolean\" &&\n !(record.lastUpdated instanceof Date)\n ) {\n error(\"lastUpdated must be a date or boolean.\");\n }\n if (record.hero !== undefined) {\n if (!isPlainRecord(record.hero)) {\n error(\"hero must be an object.\");\n } else {\n validateHero(record.hero, error);\n }\n }\n if (record.banner !== undefined) {\n if (!isPlainRecord(record.banner)) {\n error(\"banner must be an object.\");\n } else if (typeof record.banner.content !== \"string\") {\n error(\"banner.content must be a string.\");\n }\n }\n for (const key of [\"prev\", \"next\"] as const) {\n const adjacent = record[key];\n if (\n adjacent !== undefined &&\n adjacent !== false &&\n typeof adjacent !== \"string\" &&\n !isPlainRecord(adjacent)\n ) {\n error(`${key} must be false, a string, or an object.`);\n } else if (isPlainRecord(adjacent)) {\n validateOptionalStrings(adjacent, [\"link\", \"label\"], key, error);\n }\n }\n if (\n record.head !== undefined &&\n (!Array.isArray(record.head) || !record.head.every(isPlainRecord))\n ) {\n error(\"head must be an array of objects.\");\n }\n}\n\nfunction validateHero(\n hero: Record<string, unknown>,\n error: (message: string) => void,\n): void {\n validateOptionalStrings(hero, [\"title\", \"tagline\"], \"hero\", error);\n if (hero.image !== undefined) {\n if (!isPlainRecord(hero.image)) {\n error(\"hero.image must be an object.\");\n } else {\n const image = hero.image;\n const shapes = [\"html\", \"file\", \"dark\"].filter(\n (key) => image[key] !== undefined,\n );\n if (shapes.length !== 1) {\n error(\n \"hero.image must define exactly one of html, file, or dark/light.\",\n );\n }\n for (const key of [\"html\", \"file\", \"dark\", \"light\", \"alt\"] as const) {\n if (image[key] !== undefined && typeof image[key] !== \"string\") {\n error(`hero.image.${key} must be a string.`);\n }\n }\n if (image.dark !== undefined && typeof image.light !== \"string\") {\n error(\"hero.image.light must accompany hero.image.dark.\");\n }\n if (image.light !== undefined && typeof image.dark !== \"string\") {\n error(\"hero.image.dark must accompany hero.image.light.\");\n }\n }\n }\n if (hero.actions !== undefined) {\n if (!Array.isArray(hero.actions)) {\n error(\"hero.actions must be an array.\");\n } else {\n for (const [index, action] of hero.actions.entries()) {\n if (!isPlainRecord(action)) {\n error(`hero.actions[${index}] must be an object.`);\n continue;\n }\n for (const key of [\"text\", \"link\"] as const) {\n if (typeof action[key] !== \"string\") {\n error(`hero.actions[${index}].${key} must be a string.`);\n }\n }\n if (\n action.variant !== undefined &&\n ![\"primary\", \"secondary\", \"minimal\"].includes(String(action.variant))\n ) {\n error(\n `hero.actions[${index}].variant must be primary, secondary, or minimal.`,\n );\n }\n }\n }\n }\n}\n\nfunction validateOptionalStrings(\n record: Record<string, unknown>,\n keys: readonly string[],\n prefix: string,\n error: (message: string) => void,\n): void {\n for (const key of keys) {\n if (record[key] !== undefined && typeof record[key] !== \"string\") {\n error(`${prefix}.${key} must be a string.`);\n }\n }\n}\n","import type { DocsDiagnostic, DocsGraph } from \"../types.js\";\n\nexport class DocsValidationError extends Error {\n readonly diagnostics: DocsDiagnostic[];\n\n constructor(diagnostics: DocsDiagnostic[]) {\n super(formatDiagnostics(diagnostics));\n this.name = \"DocsValidationError\";\n this.diagnostics = diagnostics;\n }\n}\n\nexport function validateDocs(graph: DocsGraph): DocsDiagnostic[] {\n return [...graph.diagnostics];\n}\n\nexport function assertValidDocs(graph: DocsGraph): void {\n const errors = graph.diagnostics.filter(\n (diagnostic) => diagnostic.severity === \"error\",\n );\n if (errors.length > 0) throw new DocsValidationError(errors);\n}\n\nexport function formatDiagnostics(\n diagnostics: DocsDiagnostic[],\n json = false,\n): string {\n if (json) return JSON.stringify(diagnostics, null, 2);\n return diagnostics\n .map((diagnostic) => {\n const location = diagnostic.file\n ? `${diagnostic.file}${diagnostic.line ? `:${diagnostic.line}` : \"\"}: `\n : \"\";\n const hint = diagnostic.hint ? `\\n hint: ${diagnostic.hint}` : \"\";\n return `${diagnostic.severity.toUpperCase()} ${diagnostic.code} ${location}${diagnostic.message}${hint}`;\n })\n .join(\"\\n\");\n}\n","import { extname, join, relative, sep } from \"node:path\";\nimport { fileURLToPath, pathToFileURL } from \"node:url\";\nimport { createDocsGraph } from \"../graph/index.js\";\nimport { assertValidDocs } from \"../validation/index.js\";\nimport type {\n CreateDocsGraphOptions,\n DocsConfig,\n DocsEntry,\n} from \"../types.js\";\n\nexport interface DocsLoaderContext {\n store: {\n clear(): void;\n set(entry: {\n id: string;\n data: Record<string, unknown>;\n body: string;\n filePath?: string;\n digest?: string;\n rendered?: RenderedContent;\n assetImports?: string[];\n }): void;\n };\n logger?: { info(message: string): void };\n config?: { root: URL | string; srcDir: URL | string };\n parseData?: (input: {\n id: string;\n data: Record<string, unknown>;\n filePath?: string;\n }) => Promise<Record<string, unknown>>;\n renderMarkdown?: (\n content: string,\n options?: { fileURL?: URL },\n ) => Promise<RenderedContent>;\n generateDigest?: (data: Record<string, unknown> | string) => string;\n}\n\ninterface RenderedContent {\n html: string;\n metadata?: {\n imagePaths?: string[];\n headings?: Array<{ depth: number; slug: string; text: string }>;\n frontmatter?: Record<string, unknown>;\n [key: string]: unknown;\n };\n}\n\nexport function createDocsLoader(\n config?: DocsConfig,\n options: Omit<CreateDocsGraphOptions, \"config\"> = {},\n) {\n return {\n name: \"@tenphi/docs\",\n async load(context: DocsLoaderContext): Promise<void> {\n const graph = await createDocsGraph({\n ...options,\n ...(config ? { config } : {}),\n });\n assertValidDocs(graph);\n context.store.clear();\n for (const entry of graph.entries) {\n const loaderEntry = toLoaderEntry(entry);\n const filePath = starlightFilePath(entry, context.config);\n const data = context.parseData\n ? await context.parseData({\n id: loaderEntry.id,\n data: loaderEntry.data,\n filePath,\n })\n : loaderEntry.data;\n const rendered = await context.renderMarkdown?.(entry.transformedBody, {\n fileURL: pathToFileURL(entry.absolutePath),\n });\n context.store.set({\n ...loaderEntry,\n data,\n filePath,\n ...(context.generateDigest\n ? { digest: context.generateDigest(entry.transformedBody) }\n : {}),\n ...(rendered\n ? {\n rendered,\n assetImports: rendered.metadata?.imagePaths ?? [],\n }\n : {}),\n });\n }\n context.logger?.info(`Loaded ${graph.entries.length} Cookbook pages.`);\n },\n };\n}\n\nfunction starlightFilePath(\n entry: DocsEntry,\n config?: DocsLoaderContext[\"config\"],\n): string {\n const id = entry.route === \"/\" ? \"index\" : entry.route.slice(1);\n const extension =\n extname(entry.sourcePath).toLowerCase() === \".mdx\" ? \".mdx\" : \".md\";\n if (!config) return `src/content/docs/${id}${extension}`;\n\n const root = toPath(config.root);\n const srcDir = toPath(config.srcDir);\n return relative(root, join(srcDir, \"content\", \"docs\", `${id}${extension}`))\n .split(sep)\n .join(\"/\");\n}\n\nfunction toPath(value: URL | string): string {\n return typeof value === \"string\" ? value : fileURLToPath(value);\n}\n\nfunction toLoaderEntry(entry: DocsEntry): {\n id: string;\n data: Record<string, unknown>;\n body: string;\n} {\n return {\n id: entry.route === \"/\" ? \"index\" : entry.route.slice(1),\n data: {\n title: entry.title,\n draft: entry.frontmatter.draft ?? false,\n ...(entry.description ? { description: entry.description } : {}),\n ...entry.frontmatter,\n cookbook: {\n sourcePath: entry.sourcePath,\n route: entry.route,\n headings: entry.headings,\n },\n },\n body: entry.transformedBody,\n };\n}\n\nexport type { DocsEntry, DocsGraph, DocsRoute, DocsAsset } from \"../types.js\";\n"],"mappings":"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"}
|