2121import type { MetaObject , MetaRoot } from "@metaobjectsdev/metadata" ;
2222import { TYPE_TEMPLATE , TEMPLATE_SUBTYPE_OUTPUT } from "@metaobjectsdev/metadata" ;
2323import { render } from "@metaobjectsdev/render" ;
24+ import type { Provider } from "@metaobjectsdev/render" ;
2425import type { Generator , GeneratorFactory , EmittedFile } from "../generator.js" ;
2526import {
2627 docPageOutputPath ,
@@ -53,6 +54,20 @@ const TEMPLATE_REF = "docs/entity-page.md";
5354// sibling artifact, distinct from the entity page (Task 3).
5455const TEMPLATE_PAGE_REF = "docs/template-page.md" ;
5556
57+ /** Render one docs page, wrapping any engine error with the page ref + output
58+ * path so a template failure points at the exact page (shared by the entity
59+ * and template.output emission paths — identical error contract). */
60+ function renderDocPage ( ref : string , payload : unknown , provider : Provider , path : string ) : string {
61+ try {
62+ return render ( { ref, payload, provider, format : "markdown" } ) ;
63+ } catch ( err ) {
64+ const msg = err instanceof Error ? err . message : String ( err ) ;
65+ throw new Error ( `docs-file: failed rendering '${ ref } ' for '${ path } ': ${ msg } ` , {
66+ cause : err instanceof Error ? err : undefined ,
67+ } ) ;
68+ }
69+ }
70+
5671export const docsFile = function docsFile ( opts ?: DocsFileOpts ) : Generator {
5772 const generator : Generator = {
5873 name : "docs-file" ,
@@ -87,22 +102,7 @@ export const docsFile = function docsFile(opts?: DocsFileOpts): Generator {
87102 } ) ,
88103 loadedRoot : rc . loadedRoot ,
89104 } ) ;
90- let content : string ;
91- try {
92- content = render ( {
93- ref : TEMPLATE_REF ,
94- payload,
95- provider,
96- format : "markdown" ,
97- } ) ;
98- } catch ( err ) {
99- const msg = err instanceof Error ? err . message : String ( err ) ;
100- throw new Error (
101- `docs-file: failed rendering '${ TEMPLATE_REF } ' for '${ path } ': ${ msg } ` ,
102- { cause : err instanceof Error ? err : undefined } ,
103- ) ;
104- }
105- return { path, content } ;
105+ return { path, content : renderDocPage ( TEMPLATE_REF , payload , provider , path ) } ;
106106 } ) ;
107107
108108 // ALSO emit one NEUTRAL render-contract page per `template.output` node —
@@ -115,22 +115,7 @@ export const docsFile = function docsFile(opts?: DocsFileOpts): Generator {
115115 const path = docPageOutputPath ( layout , node ) ;
116116 placements . push ( { path, fqn : child . resolutionKey ( ) } ) ;
117117 const payload = buildTemplateDocData ( child , { layout, loadedRoot : ctx . loadedRoot } ) ;
118- let content : string ;
119- try {
120- content = render ( {
121- ref : TEMPLATE_PAGE_REF ,
122- payload,
123- provider,
124- format : "markdown" ,
125- } ) ;
126- } catch ( err ) {
127- const msg = err instanceof Error ? err . message : String ( err ) ;
128- throw new Error (
129- `docs-file: failed rendering '${ TEMPLATE_PAGE_REF } ' for '${ path } ': ${ msg } ` ,
130- { cause : err instanceof Error ? err : undefined } ,
131- ) ;
132- }
133- files . push ( { path, content } ) ;
118+ files . push ( { path, content : renderDocPage ( TEMPLATE_PAGE_REF , payload , provider , path ) } ) ;
134119 }
135120
136121 // Emit the neutral OVERVIEW/index page (README.md) at the docs root: the
0 commit comments