{"version":3,"file":"cisstech-nge-doc-ssr.mjs","sources":["../../../projects/nge/doc/ssr/assets.ts","../../../projects/nge/doc/ssr/prerender.ts","../../../projects/nge/doc/ssr/cisstech-nge-doc-ssr.ts"],"sourcesContent":["import {\n  EnvironmentProviders,\n  Injectable,\n  InjectionToken,\n  TransferState,\n  inject,\n  makeEnvironmentProviders,\n} from '@angular/core'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { join } from 'node:path'\nimport { NgeDocAssets, docsAssetStateKey } from '@cisstech/nge/doc'\n\nexport interface NgeDocSsrOptions {\n  /**\n   * Directories searched, in order, for the docs assets, relative to the\n   * working directory of the build. Default: `['public']`, the assets folder\n   * of a standard Angular workspace; a monorepo passes its own\n   * (`['projects/demo/public']`).\n   */\n  roots?: string[]\n}\n\nconst NGE_DOC_SSR_OPTIONS = new InjectionToken<NgeDocSsrOptions>('NGE_DOC_SSR_OPTIONS')\n\n/**\n * Serves the docs assets from the filesystem: prerendering runs without an\n * HTTP server, so the relative urls the runtime fetches would never resolve.\n * Everything served is also recorded in transfer state, letting the hydrated\n * page reuse the embedded content instead of refetching it.\n */\n@Injectable()\nexport class FsNgeDocAssets implements NgeDocAssets {\n  private readonly transferState = inject(TransferState)\n  private readonly roots = inject(NGE_DOC_SSR_OPTIONS).roots ?? ['public']\n\n  async text(url: string): Promise<string> {\n    const rel = url.replace(/^\\/+/, '')\n    const path = this.roots.map((root) => join(root, rel)).find((candidate) => existsSync(candidate))\n    if (!path) {\n      throw new Error(\n        `[nge-doc]: '${url}' was not found under ${this.roots.join(', ')} while rendering on the server. ` +\n          'Serve it from your public directory (or pass its directory to provideNgeDocSsr({ roots })); ' +\n          'if the page only works in the browser, mark it `prerender: false` in its frontmatter.'\n      )\n    }\n    const content = readFileSync(path, 'utf8')\n    this.transferState.set(docsAssetStateKey(url), content)\n    return content\n  }\n\n  async json<T>(url: string): Promise<T> {\n    return JSON.parse(await this.text(url)) as T\n  }\n}\n\n/**\n * Server-side docs providers: add to the providers of `app.config.server.ts`.\n * Replaces the HTTP assets fetcher with the filesystem adapter.\n */\nexport function provideNgeDocSsr(options: NgeDocSsrOptions = {}): EnvironmentProviders {\n  return makeEnvironmentProviders([\n    { provide: NGE_DOC_SSR_OPTIONS, useValue: options },\n    { provide: NgeDocAssets, useClass: FsNgeDocAssets },\n  ])\n}\n","import { PrerenderFallback, RenderMode, ServerRoute } from '@angular/ssr'\nimport { readFileSync } from 'node:fs'\nimport { NgeDocManifest, contentPages } from '@cisstech/nge/doc'\n\n/**\n * Builds the prerender server route of one or more compiled docs sites, one\n * route per `nge-doc.json`. Each manifest is read at build time to enumerate\n * the pages to render; pages marked `prerender: false` in their frontmatter\n * fall back to client rendering, like any url not listed (a 404, a search url).\n *\n * ```ts\n * export const serverRoutes: ServerRoute[] = [\n *   ...ngeDocPrerenderRoutes('projects/demo/public/docs/nge-doc.json'),\n *   { path: '**', renderMode: RenderMode.Client },\n * ]\n * ```\n */\nexport function ngeDocPrerenderRoutes(...manifestPaths: string[]): ServerRoute[] {\n  return manifestPaths.map((path) => {\n    const manifest = JSON.parse(readFileSync(path, 'utf8')) as NgeDocManifest\n    const root = manifest.meta.root\n    return {\n      path: `${root.replace(/^\\/+/, '')}/**`,\n      renderMode: RenderMode.Prerender,\n      fallback: PrerenderFallback.Client,\n      getPrerenderParams: async () =>\n        contentPages(manifest.pages)\n          .filter((page) => page.prerender !== false)\n          .map((page) => ({ '**': (page.href ?? '').slice(root.length).replace(/^\\//, '') })),\n    }\n  })\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}