{"version":3,"file":"analogjs-router-server.mjs","sources":["../../../../packages/router/server/src/provide-server-context.ts","../../../../packages/router/server/src/tokens.ts","../../../../packages/router/server/src/server-component-render.ts","../../../../packages/router/server/src/render.ts","../../../../packages/router/server/src/analogjs-router-server.ts"],"sourcesContent":["import { StaticProvider, ɵresetCompiledComponents } from '@angular/core';\nimport { ɵSERVER_CONTEXT as SERVER_CONTEXT } from '@angular/platform-server';\n\nimport {\n  BASE_URL,\n  REQUEST,\n  RESPONSE,\n  ServerRequest,\n  ServerResponse,\n} from '@analogjs/router/tokens';\n\nexport function provideServerContext({\n  req,\n  res,\n}: {\n  req: ServerRequest;\n  res: ServerResponse;\n}): StaticProvider[] {\n  const baseUrl = getBaseUrl(req);\n\n  if (import.meta.env.DEV) {\n    ɵresetCompiledComponents();\n  }\n\n  return [\n    { provide: SERVER_CONTEXT, useValue: 'ssr-analog' },\n    { provide: REQUEST, useValue: req },\n    { provide: RESPONSE, useValue: res },\n    { provide: BASE_URL, useValue: baseUrl },\n  ];\n}\n\nexport function getBaseUrl(req: ServerRequest) {\n  const protocol = getRequestProtocol(req);\n  const { originalUrl, headers } = req;\n  const parsedUrl = new URL(\n    '',\n    `${protocol}://${headers.host}${\n      originalUrl.endsWith('/')\n        ? originalUrl.substring(0, originalUrl.length - 1)\n        : originalUrl\n    }`,\n  );\n  const baseUrl = parsedUrl.origin;\n\n  return baseUrl;\n}\n\nexport function getRequestProtocol(\n  req: ServerRequest,\n  opts: { xForwardedProto?: boolean } = {},\n) {\n  if (\n    opts.xForwardedProto !== false &&\n    req.headers['x-forwarded-proto'] === 'https'\n  ) {\n    return 'https';\n  }\n\n  return (req.connection as any)?.encrypted ? 'https' : 'http';\n}\n","import {\n  assertInInjectionContext,\n  inject,\n  InjectionToken,\n  makeStateKey,\n  Provider,\n  TransferState,\n} from '@angular/core';\n\nexport const STATIC_PROPS = new InjectionToken<Record<string, any>>(\n  'Static Props',\n);\n\nexport function provideStaticProps<T = Record<string, any>>(\n  props: T,\n): Provider {\n  return {\n    provide: STATIC_PROPS,\n    useFactory() {\n      return props;\n    },\n  };\n}\n\nexport function injectStaticProps() {\n  assertInInjectionContext(injectStaticProps);\n\n  return inject(STATIC_PROPS);\n}\n\nexport function injectStaticOutputs<T>() {\n  const transferState = inject(TransferState);\n  const outputsKey = makeStateKey<T>('_analog_output');\n\n  return {\n    set(data: T) {\n      transferState.set(outputsKey, data);\n    },\n  };\n}\n","import { ApplicationConfig, Type } from '@angular/core';\nimport {\n  bootstrapApplication,\n  type BootstrapContext,\n} from '@angular/platform-browser';\nimport {\n  reflectComponentType,\n  ɵConsole as Console,\n  APP_ID,\n} from '@angular/core';\nimport {\n  provideServerRendering,\n  renderApplication,\n  ɵSERVER_CONTEXT as SERVER_CONTEXT,\n} from '@angular/platform-server';\nimport { ServerContext } from '@analogjs/router/tokens';\nimport { createEvent, readBody, getHeader } from 'h3';\n\nimport { provideStaticProps } from './tokens';\n\ntype ComponentLoader = () => Promise<Type<unknown>>;\n\nexport function serverComponentRequest(serverContext: ServerContext) {\n  const serverComponentId = getHeader(\n    createEvent(serverContext.req, serverContext.res),\n    'X-Analog-Component',\n  );\n\n  if (\n    !serverComponentId &&\n    serverContext.req.url &&\n    serverContext.req.url.startsWith('/_analog/components')\n  ) {\n    const componentId = serverContext.req.url.split('/')?.[3];\n\n    return componentId;\n  }\n\n  return serverComponentId;\n}\n\nconst components = import.meta.glob([\n  '/src/server/components/**/*.{ts,analog,ag}',\n]);\n\nexport async function renderServerComponent(\n  url: string,\n  serverContext: ServerContext,\n  config?: ApplicationConfig,\n) {\n  const componentReqId = serverComponentRequest(serverContext) as string;\n  const { componentLoader, componentId } = getComponentLoader(componentReqId);\n\n  if (!componentLoader) {\n    return new Response(`Server Component Not Found ${componentId}`, {\n      status: 404,\n    });\n  }\n\n  const component = ((await componentLoader()) as any)[\n    'default'\n  ] as Type<unknown>;\n\n  if (!component) {\n    return new Response(`No default export for ${componentId}`, {\n      status: 422,\n    });\n  }\n\n  const mirror = reflectComponentType(component);\n  const selector = mirror?.selector.split(',')?.[0] || 'server-component';\n  const event = createEvent(serverContext.req, serverContext.res);\n  const body = (await readBody(event)) || {};\n  const appId = `analog-server-${selector.toLowerCase()}-${new Date().getTime()}`;\n\n  const bootstrap = (context?: BootstrapContext) =>\n    bootstrapApplication(\n      component,\n      {\n        providers: [\n          provideServerRendering(),\n          provideStaticProps(body),\n          { provide: SERVER_CONTEXT, useValue: 'analog-server-component' },\n          {\n            provide: APP_ID,\n            useFactory() {\n              return appId;\n            },\n          },\n          ...(config?.providers || []),\n        ],\n      },\n      context,\n    );\n\n  const html = await renderApplication(bootstrap, {\n    url,\n    document: `<${selector}></${selector}>`,\n    platformProviders: [\n      {\n        provide: Console,\n        useFactory() {\n          return {\n            warn: () => {},\n            log: () => {},\n          };\n        },\n      },\n    ],\n  });\n\n  const outputs = retrieveTransferredState(html, appId);\n  const responseData: { html: string; outputs: Record<string, any> } = {\n    html,\n    outputs,\n  };\n\n  return new Response(JSON.stringify(responseData), {\n    headers: {\n      'X-Analog-Component': 'true',\n    },\n  });\n}\n\nfunction getComponentLoader(componentReqId: string): {\n  componentLoader: ComponentLoader | undefined;\n  componentId: string;\n} {\n  let _componentId = `/src/server/components/${componentReqId.toLowerCase()}`;\n  let componentLoader: ComponentLoader | undefined = undefined;\n  let componentId = _componentId;\n\n  if (components[`${_componentId}.ts`]) {\n    componentId = `${_componentId}.ts`;\n    componentLoader = components[componentId] as ComponentLoader;\n  }\n\n  return { componentLoader, componentId };\n}\n\nfunction retrieveTransferredState(\n  html: string,\n  appId: string,\n): Record<string, unknown | undefined> {\n  const regex = new RegExp(\n    `<script id=\"${appId}-state\" type=\"application/json\">(.*?)<\\/script>`,\n  );\n  const match = html.match(regex);\n\n  if (match) {\n    const scriptContent = match[1];\n\n    if (scriptContent) {\n      try {\n        const parsedContent: {\n          _analog_output: Record<string, unknown | undefined>;\n        } = JSON.parse(scriptContent);\n        return parsedContent._analog_output || {};\n      } catch (e) {\n        console.warn('Exception while parsing static outputs for ' + appId, e);\n      }\n    }\n\n    return {};\n  } else {\n    return {};\n  }\n}\n","import {\n  ApplicationConfig,\n  Provider,\n  Type,\n  enableProdMode,\n} from '@angular/core';\nimport {\n  bootstrapApplication,\n  type BootstrapContext,\n} from '@angular/platform-browser';\nimport { renderApplication } from '@angular/platform-server';\nimport type { ServerContext } from '@analogjs/router/tokens';\n\nimport { provideServerContext } from './provide-server-context';\nimport {\n  serverComponentRequest,\n  renderServerComponent,\n} from './server-component-render';\n\nif (import.meta.env.PROD) {\n  enableProdMode();\n}\n\n/**\n * Returns a function that accepts the navigation URL,\n * the root HTML, and server context.\n *\n * @param rootComponent\n * @param config\n * @param platformProviders\n * @returns Promise<string | Reponse>\n */\nexport function render(\n  rootComponent: Type<unknown>,\n  config: ApplicationConfig,\n  platformProviders: Provider[] = [],\n) {\n  function bootstrap(context?: BootstrapContext) {\n    return bootstrapApplication(rootComponent, config, context);\n  }\n\n  return async function render(\n    url: string,\n    document: string,\n    serverContext: ServerContext,\n  ) {\n    if (serverComponentRequest(serverContext)) {\n      return await renderServerComponent(url, serverContext);\n    }\n\n    const html = await renderApplication(bootstrap, {\n      document,\n      url,\n      platformProviders: [\n        provideServerContext(serverContext),\n        platformProviders,\n      ],\n    });\n\n    return html;\n  };\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["ɵresetCompiledComponents","SERVER_CONTEXT","Console"],"mappings":"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"}