/* eslint-disable new-cap */ import { RenderContext } from "@xarc/render-context"; import { createTemplateTags, TokenInvoke, TagRenderer } from "@xarc/tag-renderer"; import { PageOptions } from "./types"; import { initContext, initSubApp, loadSubApp, startSubApp, isSubAppReady, subAppReady, InitProps, } from "./index"; import { until } from "./utils"; /** * Options for rendering a page for each request */ export type RenderOptions = { /** * Your HTTP framework's request object. Will be passed into UI components as is * through React context. */ request?: any; /** namespace to load the subapps */ namespace?: string; /** * Turn on/off server side rendering for the entire render, regardless if subapp * wants ssr. Setting this flag to `true` will not make a subapp that sets its * own `ssr` to `false` do SSR. */ ssr?: boolean; /** * If you only want to prepare data for when `ssr` is `true`, set this to `true`. * This will affect all subapps in this render */ prepareOnly?: boolean; }; /** * Renderer to render a page with xarc subapps on it */ export class PageRenderer { private _options: PageOptions; private _template: any[]; private _renderer: TagRenderer; constructor(options: PageOptions) { this._options = options; const { subApps } = options; const { namespace, nonce, prodAssetData, devAssetData, templateInserts: { head = {}, body = {} } = {}, } = options; const { charSet = "UTF-8" } = options; const charSetStr = charSet ? `\n\n` : ""; const initProps: InitProps = { prodAssetData, devAssetData, nonce, namespace }; this._template = createTemplateTags`
${charSetStr} ${head.begin} ${options.pageTitle && `