@nestjs-ssr/react 0.1.9 → 0.1.11

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.
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/render/template-parser.service.ts","../../src/render/error-pages/error-page-development.tsx","../../src/render/error-pages/error-page-production.tsx","../../src/render/streaming-error-handler.ts","../../src/render/render.service.ts","../../src/decorators/react-render.decorator.ts","../../src/render/render.interceptor.ts","../../src/render/vite-initializer.service.ts","../../src/render/render.module.ts"],"names":["TemplateParserService","headTagRenderers","key","render","v","escapeHtml","parseTemplate","html","rootStartMarker","rootStartIndex","indexOf","Error","commentMarker","commentIndex","rootEndMarker","rootEndIndex","htmlStart","substring","rootStart","rootEnd","htmlEnd","length","buildInlineScripts","data","context","componentName","serialize","isJSON","getClientScriptTag","isDevelopment","manifest","entryFile","file","getStylesheetTags","entry","css","map","join","buildHeadTags","head","tags","value","push","links","link","buildTag","meta","tagName","attrs","attrString","Object","entries","String","ErrorPageDevelopment","error","viewPath","phase","stackLines","stack","split","slice","lang","charSet","name","content","title","style","dangerouslySetInnerHTML","__html","body","div","className","h1","message","h2","pre","p","strong","ErrorPageProduction","StreamingErrorHandler","logger","Logger","errorPageDevelopment","errorPageProduction","handleShellError","res","statusCode","setHeader","send","renderDevelopmentErrorPage","renderProductionErrorPage","handleStreamError","ErrorComponent","element","createElement","renderToStaticMarkup","RenderService","vite","template","serverManifest","ssrMode","entryServerPath","templateParser","streamingErrorHandler","defaultHead","process","env","NODE_ENV","SSR_MODE","absoluteServerPath","__dirname","relativeServerPath","relative","cwd","startsWith","replace","templatePath","packageTemplatePaths","localTemplatePath","foundPackageTemplate","find","existsSync","readFileSync","log","manifestPath","JSON","parse","warn","serverManifestPath","setViteServer","viewComponent","mergedHead","mergeHead","renderToStream","renderToString","pageHead","undefined","startTime","Date","now","transformIndexHtml","renderModule","ssrLoadModule","manifestEntry","isEntry","includes","serverPath","pageData","__context","appHtml","renderComponent","displayName","initialStateScript","clientScript","styles","cssFiles","headTags","duration","shellReadyTime","templateParts","inlineScripts","stylesheetTags","didError","pipe","abort","renderComponentStream","onShellReady","write","ttfb","onShellError","onError","onAllReady","end","totalTime","streamTime","on","RENDER_KEY","isRenderResponse","RenderInterceptor","reflector","renderService","intercept","next","viewPathOrComponent","get","getHandler","handle","switchMap","httpContext","switchToHttp","request","getRequest","response","getResponse","renderContext","url","path","query","params","userAgent","headers","acceptLanguage","referer","renderResponse","props","fullData","type","ViteInitializerService","viteMode","vitePort","viteServer","httpAdapterHost","viteConfig","mode","port","onModuleInit","setupDevelopmentMode","setupProductionMode","createServer","createViteServer","server","middlewareMode","appType","mountViteMiddleware","setupViteProxy","httpAdapter","app","getInstance","use","middlewares","createProxyMiddleware","viteProxy","target","changeOrigin","ws","pathFilter","pathname","require","express","static","index","maxAge","onModuleDestroy","close","RenderModule","register","config","providers","provide","APP_INTERCEPTOR","useClass","useValue","global","module","exports","registerAsync","options","configProvider","useFactory","inject","imports"],"mappings":"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","file":"index.js","sourcesContent":["import { Injectable } from '@nestjs/common';\nimport serialize from 'serialize-javascript';\nimport escapeHtml from 'escape-html';\nimport type { TemplateParts, HeadData } from '../interfaces';\n\n/**\n * Service for parsing HTML templates and building inline scripts for SSR\n */\n@Injectable()\nexport class TemplateParserService {\n // Mapping of HeadData fields to their HTML tag renderers\n // Order matters: title and description first for SEO best practices\n private readonly headTagRenderers = [\n {\n key: 'title' as const,\n render: (v: string) => `<title>${escapeHtml(v)}</title>`,\n },\n {\n key: 'description' as const,\n render: (v: string) =>\n `<meta name=\"description\" content=\"${escapeHtml(v)}\" />`,\n },\n {\n key: 'keywords' as const,\n render: (v: string) =>\n `<meta name=\"keywords\" content=\"${escapeHtml(v)}\" />`,\n },\n {\n key: 'canonical' as const,\n render: (v: string) => `<link rel=\"canonical\" href=\"${escapeHtml(v)}\" />`,\n },\n {\n key: 'ogTitle' as const,\n render: (v: string) =>\n `<meta property=\"og:title\" content=\"${escapeHtml(v)}\" />`,\n },\n {\n key: 'ogDescription' as const,\n render: (v: string) =>\n `<meta property=\"og:description\" content=\"${escapeHtml(v)}\" />`,\n },\n {\n key: 'ogImage' as const,\n render: (v: string) =>\n `<meta property=\"og:image\" content=\"${escapeHtml(v)}\" />`,\n },\n ];\n /**\n * Parse HTML template into parts for streaming SSR\n *\n * Splits the template at strategic injection points:\n * - Before root div: Shell HTML (head, body start)\n * - Root div start\n * - Root div end\n * - After root: Scripts and closing tags\n */\n parseTemplate(html: string): TemplateParts {\n // Find the root div markers\n const rootStartMarker = '<div id=\"root\">';\n const rootStartIndex = html.indexOf(rootStartMarker);\n\n if (rootStartIndex === -1) {\n throw new Error('Template must contain <div id=\"root\">');\n }\n\n // Find the closing div (first </div> after root start)\n const commentMarker = '<!--app-html-->';\n const commentIndex = html.indexOf(commentMarker, rootStartIndex);\n\n if (commentIndex === -1) {\n throw new Error('Template must contain <!--app-html--> placeholder');\n }\n\n // Find the closing </div> after the comment\n const rootEndMarker = '</div>';\n const rootEndIndex = html.indexOf(rootEndMarker, commentIndex);\n\n if (rootEndIndex === -1) {\n throw new Error('Template must have closing </div> for root');\n }\n\n // Split template into parts\n const htmlStart = html.substring(0, rootStartIndex);\n const rootStart = rootStartMarker;\n const rootEnd = rootEndMarker;\n const htmlEnd = html.substring(rootEndIndex + rootEndMarker.length);\n\n return {\n htmlStart,\n rootStart,\n rootEnd,\n htmlEnd,\n };\n }\n\n /**\n * Build inline script that provides initial state to the client\n *\n * Safely serializes data using serialize-javascript to avoid XSS vulnerabilities.\n * This library handles all edge cases including escaping dangerous characters,\n * functions, dates, regexes, and prevents prototype pollution.\n */\n buildInlineScripts(data: any, context: any, componentName: string): string {\n // Use serialize-javascript with isJSON flag for consistent, secure serialization\n // Same approach used in string mode for consistency across rendering modes\n return `<script>\nwindow.__INITIAL_STATE__ = ${serialize(data, { isJSON: true })};\nwindow.__CONTEXT__ = ${serialize(context, { isJSON: true })};\nwindow.__COMPONENT_NAME__ = ${serialize(componentName, { isJSON: true })};\n</script>`;\n }\n\n /**\n * Get client script tag for hydration\n *\n * In development: Direct module import with Vite HMR\n * In production: Hashed filename from manifest\n */\n getClientScriptTag(isDevelopment: boolean, manifest?: any): string {\n if (isDevelopment) {\n return '<script type=\"module\" src=\"/src/views/entry-client.tsx\"></script>';\n }\n\n // Look for entry-client in manifest\n if (!manifest || !manifest['src/views/entry-client.tsx']) {\n throw new Error('Manifest missing entry for src/views/entry-client.tsx');\n }\n\n const entryFile = manifest['src/views/entry-client.tsx'].file;\n return `<script type=\"module\" src=\"/${entryFile}\"></script>`;\n }\n\n /**\n * Get stylesheet link tags\n *\n * In development: Direct link to source CSS file\n * In production: Hashed CSS files from manifest\n */\n getStylesheetTags(isDevelopment: boolean, manifest?: any): string {\n if (isDevelopment) {\n return '';\n }\n\n if (!manifest || !manifest['src/views/entry-client.tsx']) {\n return '';\n }\n\n const entry = manifest['src/views/entry-client.tsx'];\n if (!entry.css || entry.css.length === 0) {\n return '';\n }\n\n return entry.css\n .map((css: string) => `<link rel=\"stylesheet\" href=\"/${css}\" />`)\n .join('\\n ');\n }\n\n /**\n * Build HTML head tags from HeadData\n *\n * Generates title, meta tags, and link tags for SEO and page metadata.\n * Safely escapes content using escape-html to prevent XSS.\n */\n buildHeadTags(head?: HeadData): string {\n if (!head) {\n return '';\n }\n\n const tags: string[] = [];\n\n // Process predefined tags (title, description, OG tags, etc.)\n for (const { key, render } of this.headTagRenderers) {\n const value = head[key];\n if (value && typeof value === 'string') {\n tags.push(render(value));\n }\n }\n\n // Custom link tags (fonts, icons, preloads, etc.)\n if (head.links?.length) {\n tags.push(...head.links.map((link) => this.buildTag('link', link)));\n }\n\n // Custom meta tags\n if (head.meta?.length) {\n tags.push(...head.meta.map((meta) => this.buildTag('meta', meta)));\n }\n\n return tags.join('\\n ');\n }\n\n /**\n * Build an HTML tag from an object of attributes\n */\n private buildTag(tagName: string, attrs: Record<string, any>): string {\n const attrString = Object.entries(attrs)\n .map(([key, value]) => `${key}=\"${escapeHtml(String(value))}\"`)\n .join(' ');\n return `<${tagName} ${attrString} />`;\n }\n}\n","export interface ErrorPageDevelopmentProps {\n error: Error;\n viewPath: string;\n phase: 'shell' | 'streaming';\n}\n\n/**\n * Default development error page component\n *\n * Shows detailed error information with stack trace\n * App developers can override this by providing their own component\n */\nexport function ErrorPageDevelopment({\n error,\n viewPath,\n phase,\n}: ErrorPageDevelopmentProps) {\n const stackLines = error.stack ? error.stack.split('\\n').slice(1) : [];\n\n return (\n <html lang=\"en\">\n <head>\n <meta charSet=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <title>{`SSR Error - ${error.name}`}</title>\n <style\n dangerouslySetInnerHTML={{\n __html: `\n body {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;\n line-height: 1.6;\n padding: 2rem;\n background: #1a1a1a;\n color: #e0e0e0;\n }\n .error-container {\n max-width: 900px;\n margin: 0 auto;\n }\n h1 {\n color: #ff6b6b;\n font-size: 2rem;\n margin-bottom: 0.5rem;\n }\n .error-type {\n color: #ffa502;\n font-size: 1.2rem;\n margin-bottom: 1rem;\n }\n .error-message {\n background: #2d2d2d;\n padding: 1rem;\n border-left: 4px solid #ff6b6b;\n margin: 1rem 0;\n font-family: 'Courier New', Courier, monospace;\n }\n .stack-trace {\n background: #2d2d2d;\n padding: 1rem;\n border-radius: 4px;\n overflow-x: auto;\n margin: 1rem 0;\n }\n .stack-trace pre {\n margin: 0;\n font-family: 'Courier New', Courier, monospace;\n font-size: 0.9rem;\n color: #a0a0a0;\n }\n .meta {\n color: #888;\n font-size: 0.9rem;\n margin-top: 2rem;\n }\n `,\n }}\n />\n </head>\n <body>\n <div className=\"error-container\">\n <h1>Server-Side Rendering Error</h1>\n <div className=\"error-type\">{error.name}</div>\n <div className=\"error-message\">{error.message}</div>\n\n <h2>Stack Trace</h2>\n <div className=\"stack-trace\">\n <pre>{stackLines.join('\\n')}</pre>\n </div>\n\n <div className=\"meta\">\n <p>\n <strong>View Path:</strong> {viewPath}\n </p>\n <p>\n <strong>Error Phase:</strong>{' '}\n {phase === 'shell'\n ? 'Shell (before streaming started)'\n : 'Streaming (during content delivery)'}\n </p>\n <p>\n <strong>Environment:</strong> Development\n </p>\n </div>\n </div>\n </body>\n </html>\n );\n}\n","/**\n * Default production error page component\n *\n * Shows generic error message without sensitive details\n * App developers can override this by providing their own component\n */\nexport function ErrorPageProduction() {\n return (\n <html lang=\"en\">\n <head>\n <meta charSet=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <title>Error</title>\n <style\n dangerouslySetInnerHTML={{\n __html: `\n body {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 100vh;\n margin: 0;\n background: #f5f5f5;\n }\n .error-container {\n text-align: center;\n padding: 2rem;\n }\n h1 {\n font-size: 3rem;\n color: #333;\n margin: 0 0 1rem 0;\n }\n p {\n font-size: 1.2rem;\n color: #666;\n }\n `,\n }}\n />\n </head>\n <body>\n <div className=\"error-container\">\n <h1>500</h1>\n <p>Internal Server Error</p>\n <p>Something went wrong while rendering this page.</p>\n </div>\n </body>\n </html>\n );\n}\n","import { Injectable, Inject, Optional, Logger } from '@nestjs/common';\nimport type { Response } from 'express';\nimport type { ComponentType } from 'react';\nimport { renderToStaticMarkup } from 'react-dom/server';\nimport { createElement } from 'react';\nimport { ErrorPageDevelopment, ErrorPageProduction } from './error-pages';\nimport type { ErrorPageDevelopmentProps } from '../interfaces';\n\n/**\n * Error handling strategies for streaming SSR\n *\n * Streaming has different error phases:\n * 1. Shell errors: Before any content sent (can send 500)\n * 2. Stream errors: After headers sent (can only log)\n * 3. Client errors: Handled by ErrorBoundary\n */\n@Injectable()\nexport class StreamingErrorHandler {\n private readonly logger = new Logger(StreamingErrorHandler.name);\n\n constructor(\n @Optional()\n @Inject('ERROR_PAGE_DEVELOPMENT')\n private readonly errorPageDevelopment?: ComponentType<ErrorPageDevelopmentProps>,\n @Optional()\n @Inject('ERROR_PAGE_PRODUCTION')\n private readonly errorPageProduction?: ComponentType,\n ) {}\n\n /**\n * Handle error that occurred before shell was ready\n * Can still set HTTP status code and send error page\n */\n handleShellError(\n error: Error,\n res: Response,\n viewPath: string,\n isDevelopment: boolean,\n ): void {\n // Log error with context\n this.logger.error(\n `Shell error rendering ${viewPath}: ${error.message}`,\n error.stack,\n );\n\n // Set error status\n res.statusCode = 500;\n res.setHeader('Content-Type', 'text/html; charset=utf-8');\n\n // Send error page\n if (isDevelopment) {\n // Development: Show detailed error\n res.send(this.renderDevelopmentErrorPage(error, viewPath, 'shell'));\n } else {\n // Production: Generic error message\n res.send(this.renderProductionErrorPage());\n }\n }\n\n /**\n * Handle error that occurred during streaming\n * Headers already sent, can only log the error\n */\n handleStreamError(error: Error, viewPath: string): void {\n // Log error with context\n this.logger.error(\n `Streaming error rendering ${viewPath}: ${error.message}`,\n error.stack,\n );\n\n // Cannot send error page (headers already sent)\n // Error will be logged, and partial content already delivered\n // Client ErrorBoundary should handle gracefully\n }\n\n /**\n * Render development error page using React component\n */\n private renderDevelopmentErrorPage(\n error: Error,\n viewPath: string,\n phase: 'shell' | 'streaming',\n ): string {\n const ErrorComponent = this.errorPageDevelopment || ErrorPageDevelopment;\n\n const element = createElement(ErrorComponent, {\n error,\n viewPath,\n phase,\n });\n\n return '<!DOCTYPE html>\\n' + renderToStaticMarkup(element);\n }\n\n /**\n * Render production error page using React component\n */\n private renderProductionErrorPage(): string {\n const ErrorComponent = this.errorPageProduction || ErrorPageProduction;\n\n const element = createElement(ErrorComponent);\n\n return '<!DOCTYPE html>\\n' + renderToStaticMarkup(element);\n }\n}\n","import { Injectable, Inject, Logger, Optional } from '@nestjs/common';\nimport { readFileSync, existsSync } from 'fs';\nimport { join, relative } from 'path';\nimport serialize from 'serialize-javascript';\nimport type { ViteDevServer } from 'vite';\nimport type { Response } from 'express';\nimport { Writable } from 'stream';\nimport type { SSRMode, HeadData } from '../interfaces';\nimport { TemplateParserService } from './template-parser.service';\nimport { StreamingErrorHandler } from './streaming-error-handler';\n\ninterface ViteManifest {\n [key: string]: {\n file: string;\n src?: string;\n isEntry?: boolean;\n imports?: string[];\n css?: string[];\n };\n}\n\n@Injectable()\nexport class RenderService {\n private readonly logger = new Logger(RenderService.name);\n private vite: ViteDevServer | null = null;\n private template: string;\n private manifest: ViteManifest | null = null;\n private serverManifest: ViteManifest | null = null;\n private isDevelopment: boolean;\n private ssrMode: SSRMode;\n private readonly entryServerPath: string;\n\n constructor(\n private readonly templateParser: TemplateParserService,\n private readonly streamingErrorHandler: StreamingErrorHandler,\n @Optional() @Inject('SSR_MODE') ssrMode?: SSRMode,\n @Optional() @Inject('DEFAULT_HEAD') private readonly defaultHead?: HeadData,\n ) {\n this.isDevelopment = process.env.NODE_ENV !== 'production';\n this.ssrMode = ssrMode || (process.env.SSR_MODE as SSRMode) || 'string';\n\n // Resolve entry-server.tsx path for Vite\n // Get absolute path to the template file\n const absoluteServerPath = join(__dirname, '/templates/entry-server.tsx');\n // Convert to path relative to app root\n const relativeServerPath = relative(process.cwd(), absoluteServerPath);\n\n // If path goes outside app root (starts with ..), use absolute path\n // Otherwise use app-relative path with / prefix\n if (relativeServerPath.startsWith('..')) {\n this.entryServerPath = absoluteServerPath;\n } else {\n this.entryServerPath = '/' + relativeServerPath.replace(/\\\\/g, '/');\n }\n\n // Load HTML template\n // Try package template first (new approach), then fall back to local template (backward compatibility)\n let templatePath: string;\n\n if (this.isDevelopment) {\n // In dev mode, try package templates (both source and built), then fall back to local\n const packageTemplatePaths = [\n join(__dirname, '../templates/index.html'), // From dist/render -> dist/templates (built package)\n join(__dirname, '../src/templates/index.html'), // From render/ -> src/templates (dev with ts-node)\n join(__dirname, '../../src/templates/index.html'), // Alternative: from dist/render -> src/templates\n ];\n const localTemplatePath = join(process.cwd(), 'src/views/index.html');\n\n const foundPackageTemplate = packageTemplatePaths.find((p) =>\n existsSync(p),\n );\n\n if (foundPackageTemplate) {\n templatePath = foundPackageTemplate;\n } else if (existsSync(localTemplatePath)) {\n templatePath = localTemplatePath;\n } else {\n throw new Error(\n `Template file not found. Tried:\\n` +\n packageTemplatePaths\n .map((p) => ` - ${p} (package template)`)\n .join('\\n') +\n `\\n` +\n ` - ${localTemplatePath} (local template)`,\n );\n }\n } else {\n templatePath = join(process.cwd(), 'dist/client/index.html');\n\n if (!existsSync(templatePath)) {\n throw new Error(\n `Template file not found at ${templatePath}. ` +\n `Make sure to run the build process first.`,\n );\n }\n }\n\n try {\n this.template = readFileSync(templatePath, 'utf-8');\n this.logger.log(`✓ Loaded template from ${templatePath}`);\n } catch (error: any) {\n throw new Error(\n `Failed to read template file at ${templatePath}: ${error.message}`,\n );\n }\n\n // In production, load the Vite manifests to get hashed filenames\n if (!this.isDevelopment) {\n // Load client manifest\n const manifestPath = join(\n process.cwd(),\n 'dist/client/.vite/manifest.json',\n );\n if (existsSync(manifestPath)) {\n this.manifest = JSON.parse(readFileSync(manifestPath, 'utf-8'));\n } else {\n this.logger.warn(\n '⚠️ Client manifest not found. Run `pnpm build:client` first.',\n );\n }\n\n // Load server manifest\n const serverManifestPath = join(\n process.cwd(),\n 'dist/server/.vite/manifest.json',\n );\n if (existsSync(serverManifestPath)) {\n this.serverManifest = JSON.parse(\n readFileSync(serverManifestPath, 'utf-8'),\n );\n } else {\n this.logger.warn(\n '⚠️ Server manifest not found. Run `pnpm build:server` first.',\n );\n }\n }\n }\n\n setViteServer(vite: ViteDevServer) {\n this.vite = vite;\n }\n\n /**\n * Main render method that routes to string or stream mode\n */\n async render(\n viewComponent: any,\n data: any = {},\n res?: Response,\n head?: HeadData,\n ): Promise<string | void> {\n // Merge default head with page-specific head\n const mergedHead = this.mergeHead(this.defaultHead, head);\n\n if (this.ssrMode === 'stream') {\n if (!res) {\n throw new Error(\n 'Response object is required for streaming SSR mode. Pass res as third parameter.',\n );\n }\n return this.renderToStream(viewComponent, data, res, mergedHead);\n }\n return this.renderToString(viewComponent, data, mergedHead);\n }\n\n /**\n * Merge default head with page-specific head\n * Page-specific head values override defaults\n */\n private mergeHead(\n defaultHead?: HeadData,\n pageHead?: HeadData,\n ): HeadData | undefined {\n if (!defaultHead && !pageHead) {\n return undefined;\n }\n\n return {\n ...defaultHead,\n ...pageHead,\n // Merge arrays (links and meta) instead of replacing\n links: [...(defaultHead?.links || []), ...(pageHead?.links || [])],\n meta: [...(defaultHead?.meta || []), ...(pageHead?.meta || [])],\n };\n }\n\n /**\n * Traditional string-based SSR using renderToString\n */\n private async renderToString(\n viewComponent: any,\n data: any = {},\n head?: HeadData,\n ): Promise<string> {\n const startTime = Date.now();\n\n try {\n let template = this.template;\n\n // In development, transform the template with Vite\n if (this.vite) {\n template = await this.vite.transformIndexHtml('/', template);\n }\n\n // Import and use the SSR render function\n let renderModule;\n if (this.vite) {\n // Development: Use Vite's SSR loading with HMR support from package template\n renderModule = await this.vite.ssrLoadModule(this.entryServerPath);\n } else {\n // Production: Import the built server bundle using manifest\n if (this.serverManifest) {\n // Find the entry file in the manifest (supports both old and new paths)\n const manifestEntry = Object.entries(this.serverManifest).find(\n ([key, value]: [string, any]) =>\n value.isEntry && key.includes('entry-server'),\n );\n\n if (manifestEntry) {\n const [, entry] = manifestEntry;\n const serverPath = join(process.cwd(), 'dist/server', entry.file);\n renderModule = await import(serverPath);\n } else {\n throw new Error(\n 'Server bundle not found in manifest. Run `pnpm build:server` to generate the server bundle.',\n );\n }\n } else {\n throw new Error(\n 'Server bundle not found in manifest. Run `pnpm build:server` to generate the server bundle.',\n );\n }\n }\n\n // Extract data and context\n const { data: pageData, __context: context } = data;\n\n // Render the React component (pass component directly)\n const appHtml = await renderModule.renderComponent(viewComponent, data);\n\n // Get component name for client-side hydration\n const componentName =\n viewComponent.displayName || viewComponent.name || 'Component';\n\n // Serialize initial state and context for client\n const initialStateScript = `\n <script>\n window.__INITIAL_STATE__ = ${serialize(pageData, { isJSON: true })};\n window.__CONTEXT__ = ${serialize(context, { isJSON: true })};\n window.__COMPONENT_NAME__ = ${serialize(componentName, { isJSON: true })};\n </script>\n `;\n\n // Inject client script and styles\n let clientScript = '';\n let styles = '';\n\n if (this.vite) {\n // Development: Use app's local entry-client in views directory\n clientScript = `<script type=\"module\" src=\"/src/views/entry-client.tsx\"></script>`;\n // Note: CSS is handled by Vite in dev mode via @vitejs/plugin-react\n styles = '';\n } else {\n // Production: Use manifest to get hashed filename\n if (this.manifest) {\n // Find the entry file in the manifest (supports both old and new paths)\n const manifestEntry = Object.entries(this.manifest).find(\n ([key, value]: [string, any]) =>\n value.isEntry && key.includes('entry-client'),\n );\n\n if (manifestEntry) {\n const [, entry] = manifestEntry;\n const entryFile = entry.file;\n clientScript = `<script type=\"module\" src=\"/${entryFile}\"></script>`;\n\n // Inject CSS from manifest\n if (entry.css) {\n const cssFiles = entry.css;\n styles = cssFiles\n .map((css) => `<link rel=\"stylesheet\" href=\"/${css}\" />`)\n .join('\\n ');\n }\n } else {\n this.logger.error('⚠️ Client entry not found in manifest');\n clientScript = `<script type=\"module\" src=\"/assets/client.js\"></script>`;\n }\n } else {\n this.logger.error('⚠️ Client manifest not found');\n clientScript = `<script type=\"module\" src=\"/assets/client.js\"></script>`;\n }\n }\n\n // Generate head tags\n const headTags = this.templateParser.buildHeadTags(head);\n\n // Replace placeholders\n let html = template.replace('<!--app-html-->', appHtml);\n html = html.replace('<!--initial-state-->', initialStateScript);\n html = html.replace('<!--client-scripts-->', clientScript);\n html = html.replace('<!--styles-->', styles);\n html = html.replace('<!--head-meta-->', headTags);\n\n // Log performance metrics in development\n if (this.isDevelopment) {\n const duration = Date.now() - startTime;\n const componentName =\n typeof viewComponent === 'function'\n ? viewComponent.name\n : String(viewComponent);\n this.logger.log(\n `[SSR] ${componentName} rendered in ${duration}ms (string mode)`,\n );\n }\n\n return html;\n } catch (error) {\n // Re-throw error - let NestJS exception layer handle it\n throw error;\n }\n }\n\n /**\n * Modern streaming SSR using renderToPipeableStream\n */\n private async renderToStream(\n viewComponent: any,\n data: any = {},\n res: Response,\n head?: HeadData,\n ): Promise<void> {\n const startTime = Date.now();\n let shellReadyTime = 0;\n\n try {\n let template = this.template;\n\n // In development, transform the template with Vite\n if (this.vite) {\n template = await this.vite.transformIndexHtml('/', template);\n }\n\n // Parse template into parts\n const templateParts = this.templateParser.parseTemplate(template);\n\n // Import and use the SSR render function\n let renderModule;\n if (this.vite) {\n // Development: Use Vite's SSR loading with HMR support from package template\n renderModule = await this.vite.ssrLoadModule(this.entryServerPath);\n } else {\n // Production: Import the built server bundle using manifest\n if (this.serverManifest) {\n // Find the entry file in the manifest (supports both old and new paths)\n const manifestEntry = Object.entries(this.serverManifest).find(\n ([key, value]: [string, any]) =>\n value.isEntry && key.includes('entry-server'),\n );\n\n if (manifestEntry) {\n const [, entry] = manifestEntry;\n const serverPath = join(process.cwd(), 'dist/server', entry.file);\n renderModule = await import(serverPath);\n } else {\n throw new Error(\n 'Server bundle not found in manifest. Run `pnpm build:server` to generate the server bundle.',\n );\n }\n } else {\n throw new Error(\n 'Server bundle not found in manifest. Run `pnpm build:server` to generate the server bundle.',\n );\n }\n }\n\n // Extract data and context\n const { data: pageData, __context: context } = data;\n\n // Get component name for client-side hydration and logging\n const componentName =\n viewComponent.displayName || viewComponent.name || 'Component';\n\n // Build inline scripts\n const inlineScripts = this.templateParser.buildInlineScripts(\n pageData,\n context,\n componentName,\n );\n\n // Get client script tag\n const clientScript = this.templateParser.getClientScriptTag(\n this.isDevelopment,\n this.manifest,\n );\n\n // Get stylesheet tags\n const stylesheetTags = this.templateParser.getStylesheetTags(\n this.isDevelopment,\n this.manifest,\n );\n\n // Generate head tags\n const headTags = this.templateParser.buildHeadTags(head);\n\n // Set up streaming with error handlers\n let didError = false;\n\n const { pipe, abort } = renderModule.renderComponentStream(\n viewComponent,\n data,\n {\n onShellReady: () => {\n // Shell is ready - start streaming\n shellReadyTime = Date.now();\n res.statusCode = didError ? 500 : 200;\n res.setHeader('Content-Type', 'text/html; charset=utf-8');\n\n // Write HTML start with styles and head meta injected\n let htmlStart = templateParts.htmlStart;\n htmlStart = htmlStart.replace('<!--styles-->', stylesheetTags);\n htmlStart = htmlStart.replace('<!--head-meta-->', headTags);\n res.write(htmlStart);\n\n // Write root div start\n res.write(templateParts.rootStart);\n\n // Pipe React stream to response\n pipe(res as unknown as Writable);\n\n // Log TTFB (Time to First Byte) in development\n if (this.isDevelopment) {\n const ttfb = shellReadyTime - startTime;\n this.logger.log(\n `[SSR] ${componentName} shell ready in ${ttfb}ms (stream mode - TTFB)`,\n );\n }\n },\n\n onShellError: (error: Error) => {\n // Error before shell ready - can still send error page\n this.streamingErrorHandler.handleShellError(\n error,\n res,\n componentName,\n this.isDevelopment,\n );\n },\n\n onError: (error: Error) => {\n // Error during streaming - headers already sent\n didError = true;\n this.streamingErrorHandler.handleStreamError(error, componentName);\n },\n\n onAllReady: () => {\n // All content ready (including Suspense)\n // Write inline scripts\n res.write(inlineScripts);\n\n // Write client script\n res.write(clientScript);\n\n // Write root div end\n res.write(templateParts.rootEnd);\n\n // Write HTML end\n res.write(templateParts.htmlEnd);\n\n // End the response\n res.end();\n\n // Log total streaming time in development\n if (this.isDevelopment) {\n const totalTime = Date.now() - startTime;\n const streamTime = Date.now() - shellReadyTime;\n this.logger.log(\n `[SSR] ${componentName} streaming complete in ${totalTime}ms total (${streamTime}ms streaming)`,\n );\n }\n },\n },\n );\n\n // Handle client disconnection\n res.on('close', () => {\n abort();\n });\n } catch (error) {\n // Handle error before streaming started\n const componentName =\n typeof viewComponent === 'function'\n ? viewComponent.name\n : String(viewComponent);\n this.streamingErrorHandler.handleShellError(\n error as Error,\n res,\n componentName,\n this.isDevelopment,\n );\n }\n }\n}\n","import { SetMetadata } from '@nestjs/common';\nimport type React from 'react';\nimport type { PageProps } from '../interfaces/page-props.interface';\n\nexport const RENDER_KEY = 'render';\n\n/**\n * Extract the data type T from PageProps<T>.\n * PageProps<T> = T & { head?, context }, so we extract T by removing those keys.\n */\ntype ExtractPagePropsData<P> = P extends PageProps<infer T>\n ? T\n : P extends { head?: any; context: any }\n ? Omit<P, 'head' | 'context'>\n : P;\n\n/**\n * Extract controller return type from a React component's props.\n */\ntype ExtractComponentData<T> = T extends React.ComponentType<infer P>\n ? ExtractPagePropsData<P>\n : never;\n\n/**\n * Decorator to render a React component as the response.\n *\n * Import the component directly for Cmd+Click navigation in your IDE.\n * TypeScript automatically validates your controller returns the correct props.\n *\n * @param component - The React component to render\n *\n * @example\n * ```typescript\n * // Your view component (views/home.tsx)\n * export interface HomeProps {\n * message: string;\n * }\n * export default function Home(props: PageProps<HomeProps>) { ... }\n *\n * // Your controller - Cmd+Click on Home navigates to the view file!\n * import Home from './views/home';\n *\n * @Get()\n * @Render(Home) // Type-safe! Wrong props = build error\n * getHome() {\n * return { message: 'Hello' }; // ✅ Correct\n * // return { wrong: 'prop' }; // ❌ Type error!\n * }\n * ```\n */\nexport function Render<T extends React.ComponentType<any>>(\n component: T,\n): <TMethod extends (...args: any[]) => ExtractComponentData<T> | Promise<ExtractComponentData<T>>>(\n target: any,\n propertyKey: string | symbol,\n descriptor: TypedPropertyDescriptor<TMethod>,\n) => TypedPropertyDescriptor<TMethod> | void {\n return (target: any, propertyKey: string | symbol, descriptor: any) => {\n SetMetadata(RENDER_KEY, component)(target, propertyKey, descriptor);\n };\n}\n\n/**\n * @deprecated Use `Render` instead. This alias will be removed in a future version.\n */\nexport const ReactRender = Render;\n","import {\n Injectable,\n NestInterceptor,\n ExecutionContext,\n CallHandler,\n} from '@nestjs/common';\nimport { Reflector } from '@nestjs/core';\nimport { Observable } from 'rxjs';\nimport { switchMap } from 'rxjs/operators';\nimport { Request, Response } from 'express';\nimport { RenderService } from './render.service';\nimport { RENDER_KEY } from '../decorators/react-render.decorator';\nimport type { RenderContext, RenderResponse } from '../interfaces/index';\n\n/**\n * Type guard to check if data is a RenderResponse\n */\nfunction isRenderResponse(data: any): data is RenderResponse {\n return data && typeof data === 'object' && 'props' in data;\n}\n\n@Injectable()\nexport class RenderInterceptor implements NestInterceptor {\n constructor(\n private reflector: Reflector,\n private renderService: RenderService,\n ) {}\n\n intercept(context: ExecutionContext, next: CallHandler): Observable<any> {\n const viewPathOrComponent = this.reflector.get<string | Function>(\n RENDER_KEY,\n context.getHandler(),\n );\n\n if (!viewPathOrComponent) {\n // No @Render decorator, proceed normally\n return next.handle();\n }\n\n return next.handle().pipe(\n switchMap(async (data) => {\n const httpContext = context.switchToHttp();\n const request = httpContext.getRequest<Request>();\n const response = httpContext.getResponse<Response>();\n\n // Build render context from request\n const renderContext: RenderContext = {\n url: request.url,\n path: request.path,\n query: request.query as Record<string, string | string[]>,\n params: request.params as Record<string, string>,\n userAgent: request.headers['user-agent'],\n acceptLanguage: request.headers['accept-language'],\n referer: request.headers.referer,\n };\n\n // Normalize data to RenderResponse structure\n // Auto-wrap flat objects: { foo: 1 } → { props: { foo: 1 } }\n const renderResponse: RenderResponse = isRenderResponse(data)\n ? data\n : { props: data };\n\n // Merge props with context\n const fullData = {\n data: renderResponse.props,\n __context: renderContext,\n };\n\n try {\n // Render the React component\n // Pass response object for streaming mode support\n // Pass head data for template injection\n const html = await this.renderService.render(\n viewPathOrComponent as string,\n fullData,\n response,\n renderResponse.head,\n );\n\n // In streaming mode, render() returns void and handles response directly\n // In string mode, render() returns HTML string\n if (html !== undefined) {\n // String mode: Set content type and let NestJS handle sending the response\n response.type('text/html');\n return html;\n }\n\n // Streaming mode: Response already sent, return empty to prevent NestJS from sending again\n return;\n } catch (error) {\n // Re-throw error - let NestJS exception layer handle it\n throw error;\n }\n }),\n );\n }\n}\n","import {\n Injectable,\n OnModuleInit,\n OnModuleDestroy,\n Logger,\n Inject,\n Optional,\n} from '@nestjs/common';\nimport { HttpAdapterHost } from '@nestjs/core';\nimport { RenderService } from './render.service';\nimport type { ViteConfig } from '../interfaces';\nimport type { ViteDevServer } from 'vite';\n\n/**\n * Automatically initializes Vite in development or static assets in production\n */\n@Injectable()\nexport class ViteInitializerService implements OnModuleInit, OnModuleDestroy {\n private readonly logger = new Logger(ViteInitializerService.name);\n private readonly viteMode: 'proxy' | 'embedded';\n private readonly vitePort: number;\n private viteServer: ViteDevServer | null = null;\n\n constructor(\n private readonly renderService: RenderService,\n private readonly httpAdapterHost: HttpAdapterHost,\n @Optional() @Inject('VITE_CONFIG') viteConfig?: ViteConfig,\n ) {\n // Default to embedded mode (simplest setup, no HMR)\n this.viteMode = viteConfig?.mode || 'embedded';\n this.vitePort = viteConfig?.port || 5173;\n }\n\n async onModuleInit() {\n const isDevelopment = process.env.NODE_ENV !== 'production';\n\n if (isDevelopment) {\n await this.setupDevelopmentMode();\n } else {\n this.setupProductionMode();\n }\n }\n\n private async setupDevelopmentMode() {\n try {\n // Dynamically import Vite (ESM)\n const { createServer: createViteServer } = await import('vite');\n\n // Create Vite server for SSR module loading\n this.viteServer = await createViteServer({\n server: { middlewareMode: true },\n appType: 'custom',\n });\n\n this.renderService.setViteServer(this.viteServer);\n\n // Mount Vite middleware for embedded mode or set up proxy for external mode\n if (this.viteMode === 'embedded') {\n await this.mountViteMiddleware(this.viteServer);\n } else if (this.viteMode === 'proxy') {\n await this.setupViteProxy();\n }\n\n this.logger.log(`✓ Vite initialized for SSR (mode: ${this.viteMode})`);\n } catch (error: any) {\n this.logger.warn(\n `Failed to initialize Vite: ${error.message}. Make sure vite is installed.`,\n );\n }\n }\n\n private async mountViteMiddleware(vite: any) {\n try {\n const httpAdapter = this.httpAdapterHost.httpAdapter;\n if (!httpAdapter) {\n this.logger.warn(\n 'HTTP adapter not available, skipping Vite middleware setup',\n );\n return;\n }\n\n const app = httpAdapter.getInstance();\n\n // Mount Vite's middleware to handle all Vite-related requests\n // This includes /@vite/client, /@react-refresh, /src/*, etc.\n app.use(vite.middlewares);\n\n this.logger.log(`✓ Vite middleware mounted (embedded mode with HMR)`);\n } catch (error: any) {\n this.logger.warn(`Failed to mount Vite middleware: ${error.message}`);\n }\n }\n\n private async setupViteProxy() {\n try {\n const httpAdapter = this.httpAdapterHost.httpAdapter;\n if (!httpAdapter) {\n this.logger.warn(\n 'HTTP adapter not available, skipping Vite proxy setup',\n );\n return;\n }\n\n const app = httpAdapter.getInstance();\n\n // Dynamically import http-proxy-middleware\n const { createProxyMiddleware } = await import('http-proxy-middleware');\n\n const viteProxy = createProxyMiddleware({\n target: `http://localhost:${this.vitePort}`,\n changeOrigin: true,\n ws: true, // Enable WebSocket for HMR\n pathFilter: (pathname: string) => {\n return (\n pathname.startsWith('/src/') ||\n pathname.startsWith('/@') ||\n pathname.startsWith('/node_modules/')\n );\n },\n });\n\n app.use(viteProxy);\n this.logger.log(\n `✓ Vite HMR proxy configured (external Vite on port ${this.vitePort})`,\n );\n } catch (error: any) {\n this.logger.warn(\n `Failed to setup Vite proxy: ${error.message}. Make sure http-proxy-middleware is installed.`,\n );\n }\n }\n\n private setupProductionMode() {\n try {\n const httpAdapter = this.httpAdapterHost.httpAdapter;\n if (httpAdapter) {\n const app = httpAdapter.getInstance();\n const { join } = require('path');\n const express = require('express');\n\n // Serve static assets from dist/client\n app.use(\n express.static(join(process.cwd(), 'dist/client'), {\n index: false,\n maxAge: '1y',\n }),\n );\n\n this.logger.log('✓ Static assets configured (dist/client)');\n }\n } catch (error: any) {\n this.logger.warn(`Failed to setup static assets: ${error.message}`);\n }\n }\n\n /**\n * Cleanup: Close Vite server on module destroy\n * This prevents port conflicts on hot reload\n */\n async onModuleDestroy() {\n if (this.viteServer) {\n try {\n await this.viteServer.close();\n this.logger.log('✓ Vite server closed');\n } catch (error: any) {\n this.logger.warn(`Failed to close Vite server: ${error.message}`);\n }\n }\n }\n}\n","import { Global, Module, DynamicModule, Provider } from '@nestjs/common';\nimport { APP_INTERCEPTOR } from '@nestjs/core';\nimport { RenderService } from './render.service';\nimport { RenderInterceptor } from './render.interceptor';\nimport { TemplateParserService } from './template-parser.service';\nimport { StreamingErrorHandler } from './streaming-error-handler';\nimport { ViteInitializerService } from './vite-initializer.service';\nimport type { RenderConfig } from '../interfaces';\n\n@Global()\n@Module({\n providers: [\n RenderService,\n TemplateParserService,\n StreamingErrorHandler,\n ViteInitializerService, // Auto-initializes Vite in development (embedded mode by default)\n {\n provide: APP_INTERCEPTOR,\n useClass: RenderInterceptor,\n },\n {\n provide: 'VITE_CONFIG',\n useValue: {}, // Empty config = embedded mode (default)\n },\n ],\n exports: [RenderService],\n})\nexport class RenderModule {\n /**\n * Register the render module with optional configuration\n *\n * @param config - Optional render configuration\n * @returns Dynamic module\n *\n * @example\n * ```ts\n * // Zero config - embedded mode by default (simplest)\n * @Module({\n * imports: [RenderModule],\n * })\n *\n * // Enable HMR with proxy mode\n * @Module({\n * imports: [\n * RenderModule.register({\n * vite: { mode: 'proxy', port: 5173 }\n * })\n * ],\n * })\n *\n * // Enable streaming SSR\n * RenderModule.register({ mode: 'stream' })\n *\n * // Custom error pages\n * RenderModule.register({\n * mode: 'stream',\n * errorPageDevelopment: MyCustomDevErrorPage,\n * errorPageProduction: MyCustomProdErrorPage,\n * })\n * ```\n */\n static register(config?: RenderConfig): DynamicModule {\n const providers: Provider[] = [\n RenderService,\n TemplateParserService,\n StreamingErrorHandler,\n ViteInitializerService, // Auto-initializes Vite in development\n {\n provide: APP_INTERCEPTOR,\n useClass: RenderInterceptor,\n },\n ];\n\n // Add Vite configuration (defaults applied in ViteInitializerService)\n providers.push({\n provide: 'VITE_CONFIG',\n useValue: config?.vite || {},\n });\n\n // Add SSR mode configuration if provided\n if (config?.mode) {\n providers.push({\n provide: 'SSR_MODE',\n useValue: config.mode,\n });\n }\n\n // Add custom error page components if provided\n if (config?.errorPageDevelopment) {\n providers.push({\n provide: 'ERROR_PAGE_DEVELOPMENT',\n useValue: config.errorPageDevelopment,\n });\n }\n\n if (config?.errorPageProduction) {\n providers.push({\n provide: 'ERROR_PAGE_PRODUCTION',\n useValue: config.errorPageProduction,\n });\n }\n\n // Add default head configuration if provided\n if (config?.defaultHead) {\n providers.push({\n provide: 'DEFAULT_HEAD',\n useValue: config.defaultHead,\n });\n }\n\n return {\n global: true,\n module: RenderModule,\n providers,\n exports: [RenderService],\n };\n }\n\n /**\n * Register the render module asynchronously with dynamic configuration\n *\n * Use this when you need to inject services (e.g., load config from database)\n *\n * @param options - Async configuration options\n * @returns Dynamic module\n *\n * @example\n * ```ts\n * // Load default head from database\n * RenderModule.registerAsync({\n * imports: [TenantModule],\n * inject: [TenantRepository],\n * useFactory: async (tenantRepo: TenantRepository) => {\n * const tenant = await tenantRepo.findDefaultTenant();\n * return {\n * defaultHead: {\n * title: tenant.appName,\n * description: tenant.description,\n * links: [\n * { rel: 'icon', href: tenant.favicon }\n * ]\n * }\n * };\n * }\n * })\n * ```\n */\n static registerAsync(options: {\n imports?: any[];\n inject?: any[];\n useFactory: (...args: any[]) => Promise<RenderConfig> | RenderConfig;\n }): DynamicModule {\n const configProvider: Provider = {\n provide: 'RENDER_CONFIG',\n useFactory: options.useFactory,\n inject: options.inject || [],\n };\n\n const providers: Provider[] = [\n configProvider,\n RenderService,\n TemplateParserService,\n StreamingErrorHandler,\n ViteInitializerService, // Auto-initializes Vite in development\n {\n provide: APP_INTERCEPTOR,\n useClass: RenderInterceptor,\n },\n // Vite configuration provider - reads from config\n {\n provide: 'VITE_CONFIG',\n useFactory: (config: RenderConfig) => config?.vite || {},\n inject: ['RENDER_CONFIG'],\n },\n // SSR mode provider - reads from config\n {\n provide: 'SSR_MODE',\n useFactory: (config: RenderConfig) => config?.mode,\n inject: ['RENDER_CONFIG'],\n },\n // Error page providers - read from config\n {\n provide: 'ERROR_PAGE_DEVELOPMENT',\n useFactory: (config: RenderConfig) => config?.errorPageDevelopment,\n inject: ['RENDER_CONFIG'],\n },\n {\n provide: 'ERROR_PAGE_PRODUCTION',\n useFactory: (config: RenderConfig) => config?.errorPageProduction,\n inject: ['RENDER_CONFIG'],\n },\n // Default head provider - reads from config\n {\n provide: 'DEFAULT_HEAD',\n useFactory: (config: RenderConfig) => config?.defaultHead,\n inject: ['RENDER_CONFIG'],\n },\n ];\n\n return {\n global: true,\n module: RenderModule,\n imports: options.imports || [],\n providers,\n exports: [RenderService],\n };\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/render/template-parser.service.ts","../../src/render/error-pages/error-page-development.tsx","../../src/render/error-pages/error-page-production.tsx","../../src/render/streaming-error-handler.ts","../../src/render/render.service.ts","../../src/decorators/react-render.decorator.ts","../../src/render/render.interceptor.ts","../../src/render/vite-initializer.service.ts","../../src/render/render.module.ts"],"names":["TemplateParserService","headTagRenderers","key","render","v","escapeHtml","parseTemplate","html","rootStartMarker","rootStartIndex","indexOf","Error","commentMarker","commentIndex","rootEndMarker","rootEndIndex","htmlStart","substring","rootStart","rootEnd","htmlEnd","length","buildInlineScripts","data","context","componentName","serialize","isJSON","getClientScriptTag","isDevelopment","manifest","entryFile","file","getStylesheetTags","entry","css","map","join","buildHeadTags","head","tags","value","push","links","link","buildTag","meta","tagName","attrs","attrString","Object","entries","String","ErrorPageDevelopment","error","viewPath","phase","stackLines","stack","split","slice","lang","charSet","name","content","title","style","dangerouslySetInnerHTML","__html","body","div","className","h1","message","h2","pre","p","strong","ErrorPageProduction","StreamingErrorHandler","logger","Logger","errorPageDevelopment","errorPageProduction","handleShellError","res","statusCode","setHeader","send","renderDevelopmentErrorPage","renderProductionErrorPage","handleStreamError","ErrorComponent","element","createElement","renderToStaticMarkup","RenderService","vite","template","serverManifest","ssrMode","entryServerPath","templateParser","streamingErrorHandler","defaultHead","process","env","NODE_ENV","SSR_MODE","absoluteServerPath","__dirname","relativeServerPath","relative","cwd","startsWith","replace","templatePath","packageTemplatePaths","localTemplatePath","foundPackageTemplate","find","existsSync","readFileSync","log","manifestPath","JSON","parse","warn","serverManifestPath","setViteServer","viewComponent","mergedHead","mergeHead","renderToStream","renderToString","pageHead","undefined","startTime","Date","now","transformIndexHtml","renderModule","ssrLoadModule","manifestEntry","isEntry","includes","serverPath","pageData","__context","appHtml","renderComponent","displayName","initialStateScript","clientScript","styles","cssFiles","headTags","duration","shellReadyTime","templateParts","inlineScripts","stylesheetTags","didError","pipe","abort","renderComponentStream","onShellReady","write","ttfb","onShellError","onError","onAllReady","end","totalTime","streamTime","on","RENDER_KEY","isRenderResponse","RenderInterceptor","reflector","renderService","intercept","next","viewPathOrComponent","get","getHandler","handle","switchMap","httpContext","switchToHttp","request","getRequest","response","getResponse","renderContext","url","path","query","params","userAgent","headers","acceptLanguage","referer","renderResponse","props","fullData","type","ViteInitializerService","viteMode","vitePort","viteServer","httpAdapterHost","viteConfig","mode","port","onModuleInit","setupDevelopmentMode","setupProductionMode","createServer","createViteServer","server","middlewareMode","appType","mountViteMiddleware","setupViteProxy","httpAdapter","app","getInstance","use","middlewares","createProxyMiddleware","viteProxy","target","changeOrigin","ws","pathFilter","pathname","require","express","static","index","maxAge","onModuleDestroy","close","RenderModule","register","config","providers","provide","APP_INTERCEPTOR","useClass","useValue","global","module","exports","registerAsync","options","configProvider","useFactory","inject","imports"],"mappings":"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","file":"index.mjs","sourcesContent":["import { Injectable } from '@nestjs/common';\nimport serialize from 'serialize-javascript';\nimport escapeHtml from 'escape-html';\nimport type { TemplateParts, HeadData } from '../interfaces';\n\n/**\n * Service for parsing HTML templates and building inline scripts for SSR\n */\n@Injectable()\nexport class TemplateParserService {\n // Mapping of HeadData fields to their HTML tag renderers\n // Order matters: title and description first for SEO best practices\n private readonly headTagRenderers = [\n {\n key: 'title' as const,\n render: (v: string) => `<title>${escapeHtml(v)}</title>`,\n },\n {\n key: 'description' as const,\n render: (v: string) =>\n `<meta name=\"description\" content=\"${escapeHtml(v)}\" />`,\n },\n {\n key: 'keywords' as const,\n render: (v: string) =>\n `<meta name=\"keywords\" content=\"${escapeHtml(v)}\" />`,\n },\n {\n key: 'canonical' as const,\n render: (v: string) => `<link rel=\"canonical\" href=\"${escapeHtml(v)}\" />`,\n },\n {\n key: 'ogTitle' as const,\n render: (v: string) =>\n `<meta property=\"og:title\" content=\"${escapeHtml(v)}\" />`,\n },\n {\n key: 'ogDescription' as const,\n render: (v: string) =>\n `<meta property=\"og:description\" content=\"${escapeHtml(v)}\" />`,\n },\n {\n key: 'ogImage' as const,\n render: (v: string) =>\n `<meta property=\"og:image\" content=\"${escapeHtml(v)}\" />`,\n },\n ];\n /**\n * Parse HTML template into parts for streaming SSR\n *\n * Splits the template at strategic injection points:\n * - Before root div: Shell HTML (head, body start)\n * - Root div start\n * - Root div end\n * - After root: Scripts and closing tags\n */\n parseTemplate(html: string): TemplateParts {\n // Find the root div markers\n const rootStartMarker = '<div id=\"root\">';\n const rootStartIndex = html.indexOf(rootStartMarker);\n\n if (rootStartIndex === -1) {\n throw new Error('Template must contain <div id=\"root\">');\n }\n\n // Find the closing div (first </div> after root start)\n const commentMarker = '<!--app-html-->';\n const commentIndex = html.indexOf(commentMarker, rootStartIndex);\n\n if (commentIndex === -1) {\n throw new Error('Template must contain <!--app-html--> placeholder');\n }\n\n // Find the closing </div> after the comment\n const rootEndMarker = '</div>';\n const rootEndIndex = html.indexOf(rootEndMarker, commentIndex);\n\n if (rootEndIndex === -1) {\n throw new Error('Template must have closing </div> for root');\n }\n\n // Split template into parts\n const htmlStart = html.substring(0, rootStartIndex);\n const rootStart = rootStartMarker;\n const rootEnd = rootEndMarker;\n const htmlEnd = html.substring(rootEndIndex + rootEndMarker.length);\n\n return {\n htmlStart,\n rootStart,\n rootEnd,\n htmlEnd,\n };\n }\n\n /**\n * Build inline script that provides initial state to the client\n *\n * Safely serializes data using serialize-javascript to avoid XSS vulnerabilities.\n * This library handles all edge cases including escaping dangerous characters,\n * functions, dates, regexes, and prevents prototype pollution.\n */\n buildInlineScripts(data: any, context: any, componentName: string): string {\n // Use serialize-javascript with isJSON flag for consistent, secure serialization\n // Same approach used in string mode for consistency across rendering modes\n return `<script>\nwindow.__INITIAL_STATE__ = ${serialize(data, { isJSON: true })};\nwindow.__CONTEXT__ = ${serialize(context, { isJSON: true })};\nwindow.__COMPONENT_NAME__ = ${serialize(componentName, { isJSON: true })};\n</script>`;\n }\n\n /**\n * Get client script tag for hydration\n *\n * In development: Direct module import with Vite HMR\n * In production: Hashed filename from manifest\n */\n getClientScriptTag(isDevelopment: boolean, manifest?: any): string {\n if (isDevelopment) {\n return '<script type=\"module\" src=\"/src/views/entry-client.tsx\"></script>';\n }\n\n // Look for entry-client in manifest\n if (!manifest || !manifest['src/views/entry-client.tsx']) {\n throw new Error('Manifest missing entry for src/views/entry-client.tsx');\n }\n\n const entryFile = manifest['src/views/entry-client.tsx'].file;\n return `<script type=\"module\" src=\"/${entryFile}\"></script>`;\n }\n\n /**\n * Get stylesheet link tags\n *\n * In development: Direct link to source CSS file\n * In production: Hashed CSS files from manifest\n */\n getStylesheetTags(isDevelopment: boolean, manifest?: any): string {\n if (isDevelopment) {\n return '';\n }\n\n if (!manifest || !manifest['src/views/entry-client.tsx']) {\n return '';\n }\n\n const entry = manifest['src/views/entry-client.tsx'];\n if (!entry.css || entry.css.length === 0) {\n return '';\n }\n\n return entry.css\n .map((css: string) => `<link rel=\"stylesheet\" href=\"/${css}\" />`)\n .join('\\n ');\n }\n\n /**\n * Build HTML head tags from HeadData\n *\n * Generates title, meta tags, and link tags for SEO and page metadata.\n * Safely escapes content using escape-html to prevent XSS.\n */\n buildHeadTags(head?: HeadData): string {\n if (!head) {\n return '';\n }\n\n const tags: string[] = [];\n\n // Process predefined tags (title, description, OG tags, etc.)\n for (const { key, render } of this.headTagRenderers) {\n const value = head[key];\n if (value && typeof value === 'string') {\n tags.push(render(value));\n }\n }\n\n // Custom link tags (fonts, icons, preloads, etc.)\n if (head.links?.length) {\n tags.push(...head.links.map((link) => this.buildTag('link', link)));\n }\n\n // Custom meta tags\n if (head.meta?.length) {\n tags.push(...head.meta.map((meta) => this.buildTag('meta', meta)));\n }\n\n return tags.join('\\n ');\n }\n\n /**\n * Build an HTML tag from an object of attributes\n */\n private buildTag(tagName: string, attrs: Record<string, any>): string {\n const attrString = Object.entries(attrs)\n .map(([key, value]) => `${key}=\"${escapeHtml(String(value))}\"`)\n .join(' ');\n return `<${tagName} ${attrString} />`;\n }\n}\n","export interface ErrorPageDevelopmentProps {\n error: Error;\n viewPath: string;\n phase: 'shell' | 'streaming';\n}\n\n/**\n * Default development error page component\n *\n * Shows detailed error information with stack trace\n * App developers can override this by providing their own component\n */\nexport function ErrorPageDevelopment({\n error,\n viewPath,\n phase,\n}: ErrorPageDevelopmentProps) {\n const stackLines = error.stack ? error.stack.split('\\n').slice(1) : [];\n\n return (\n <html lang=\"en\">\n <head>\n <meta charSet=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <title>{`SSR Error - ${error.name}`}</title>\n <style\n dangerouslySetInnerHTML={{\n __html: `\n body {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;\n line-height: 1.6;\n padding: 2rem;\n background: #1a1a1a;\n color: #e0e0e0;\n }\n .error-container {\n max-width: 900px;\n margin: 0 auto;\n }\n h1 {\n color: #ff6b6b;\n font-size: 2rem;\n margin-bottom: 0.5rem;\n }\n .error-type {\n color: #ffa502;\n font-size: 1.2rem;\n margin-bottom: 1rem;\n }\n .error-message {\n background: #2d2d2d;\n padding: 1rem;\n border-left: 4px solid #ff6b6b;\n margin: 1rem 0;\n font-family: 'Courier New', Courier, monospace;\n }\n .stack-trace {\n background: #2d2d2d;\n padding: 1rem;\n border-radius: 4px;\n overflow-x: auto;\n margin: 1rem 0;\n }\n .stack-trace pre {\n margin: 0;\n font-family: 'Courier New', Courier, monospace;\n font-size: 0.9rem;\n color: #a0a0a0;\n }\n .meta {\n color: #888;\n font-size: 0.9rem;\n margin-top: 2rem;\n }\n `,\n }}\n />\n </head>\n <body>\n <div className=\"error-container\">\n <h1>Server-Side Rendering Error</h1>\n <div className=\"error-type\">{error.name}</div>\n <div className=\"error-message\">{error.message}</div>\n\n <h2>Stack Trace</h2>\n <div className=\"stack-trace\">\n <pre>{stackLines.join('\\n')}</pre>\n </div>\n\n <div className=\"meta\">\n <p>\n <strong>View Path:</strong> {viewPath}\n </p>\n <p>\n <strong>Error Phase:</strong>{' '}\n {phase === 'shell'\n ? 'Shell (before streaming started)'\n : 'Streaming (during content delivery)'}\n </p>\n <p>\n <strong>Environment:</strong> Development\n </p>\n </div>\n </div>\n </body>\n </html>\n );\n}\n","/**\n * Default production error page component\n *\n * Shows generic error message without sensitive details\n * App developers can override this by providing their own component\n */\nexport function ErrorPageProduction() {\n return (\n <html lang=\"en\">\n <head>\n <meta charSet=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <title>Error</title>\n <style\n dangerouslySetInnerHTML={{\n __html: `\n body {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 100vh;\n margin: 0;\n background: #f5f5f5;\n }\n .error-container {\n text-align: center;\n padding: 2rem;\n }\n h1 {\n font-size: 3rem;\n color: #333;\n margin: 0 0 1rem 0;\n }\n p {\n font-size: 1.2rem;\n color: #666;\n }\n `,\n }}\n />\n </head>\n <body>\n <div className=\"error-container\">\n <h1>500</h1>\n <p>Internal Server Error</p>\n <p>Something went wrong while rendering this page.</p>\n </div>\n </body>\n </html>\n );\n}\n","import { Injectable, Inject, Optional, Logger } from '@nestjs/common';\nimport type { Response } from 'express';\nimport type { ComponentType } from 'react';\nimport { renderToStaticMarkup } from 'react-dom/server';\nimport { createElement } from 'react';\nimport { ErrorPageDevelopment, ErrorPageProduction } from './error-pages';\nimport type { ErrorPageDevelopmentProps } from '../interfaces';\n\n/**\n * Error handling strategies for streaming SSR\n *\n * Streaming has different error phases:\n * 1. Shell errors: Before any content sent (can send 500)\n * 2. Stream errors: After headers sent (can only log)\n * 3. Client errors: Handled by ErrorBoundary\n */\n@Injectable()\nexport class StreamingErrorHandler {\n private readonly logger = new Logger(StreamingErrorHandler.name);\n\n constructor(\n @Optional()\n @Inject('ERROR_PAGE_DEVELOPMENT')\n private readonly errorPageDevelopment?: ComponentType<ErrorPageDevelopmentProps>,\n @Optional()\n @Inject('ERROR_PAGE_PRODUCTION')\n private readonly errorPageProduction?: ComponentType,\n ) {}\n\n /**\n * Handle error that occurred before shell was ready\n * Can still set HTTP status code and send error page\n */\n handleShellError(\n error: Error,\n res: Response,\n viewPath: string,\n isDevelopment: boolean,\n ): void {\n // Log error with context\n this.logger.error(\n `Shell error rendering ${viewPath}: ${error.message}`,\n error.stack,\n );\n\n // Set error status\n res.statusCode = 500;\n res.setHeader('Content-Type', 'text/html; charset=utf-8');\n\n // Send error page\n if (isDevelopment) {\n // Development: Show detailed error\n res.send(this.renderDevelopmentErrorPage(error, viewPath, 'shell'));\n } else {\n // Production: Generic error message\n res.send(this.renderProductionErrorPage());\n }\n }\n\n /**\n * Handle error that occurred during streaming\n * Headers already sent, can only log the error\n */\n handleStreamError(error: Error, viewPath: string): void {\n // Log error with context\n this.logger.error(\n `Streaming error rendering ${viewPath}: ${error.message}`,\n error.stack,\n );\n\n // Cannot send error page (headers already sent)\n // Error will be logged, and partial content already delivered\n // Client ErrorBoundary should handle gracefully\n }\n\n /**\n * Render development error page using React component\n */\n private renderDevelopmentErrorPage(\n error: Error,\n viewPath: string,\n phase: 'shell' | 'streaming',\n ): string {\n const ErrorComponent = this.errorPageDevelopment || ErrorPageDevelopment;\n\n const element = createElement(ErrorComponent, {\n error,\n viewPath,\n phase,\n });\n\n return '<!DOCTYPE html>\\n' + renderToStaticMarkup(element);\n }\n\n /**\n * Render production error page using React component\n */\n private renderProductionErrorPage(): string {\n const ErrorComponent = this.errorPageProduction || ErrorPageProduction;\n\n const element = createElement(ErrorComponent);\n\n return '<!DOCTYPE html>\\n' + renderToStaticMarkup(element);\n }\n}\n","import { Injectable, Inject, Logger, Optional } from '@nestjs/common';\nimport { readFileSync, existsSync } from 'fs';\nimport { join, relative } from 'path';\nimport serialize from 'serialize-javascript';\nimport type { ViteDevServer } from 'vite';\nimport type { Response } from 'express';\nimport { Writable } from 'stream';\nimport type { SSRMode, HeadData } from '../interfaces';\nimport { TemplateParserService } from './template-parser.service';\nimport { StreamingErrorHandler } from './streaming-error-handler';\n\ninterface ViteManifest {\n [key: string]: {\n file: string;\n src?: string;\n isEntry?: boolean;\n imports?: string[];\n css?: string[];\n };\n}\n\n@Injectable()\nexport class RenderService {\n private readonly logger = new Logger(RenderService.name);\n private vite: ViteDevServer | null = null;\n private template: string;\n private manifest: ViteManifest | null = null;\n private serverManifest: ViteManifest | null = null;\n private isDevelopment: boolean;\n private ssrMode: SSRMode;\n private readonly entryServerPath: string;\n\n constructor(\n private readonly templateParser: TemplateParserService,\n private readonly streamingErrorHandler: StreamingErrorHandler,\n @Optional() @Inject('SSR_MODE') ssrMode?: SSRMode,\n @Optional() @Inject('DEFAULT_HEAD') private readonly defaultHead?: HeadData,\n ) {\n this.isDevelopment = process.env.NODE_ENV !== 'production';\n this.ssrMode = ssrMode || (process.env.SSR_MODE as SSRMode) || 'string';\n\n // Resolve entry-server.tsx path for Vite\n // Get absolute path to the template file\n const absoluteServerPath = join(__dirname, '/templates/entry-server.tsx');\n // Convert to path relative to app root\n const relativeServerPath = relative(process.cwd(), absoluteServerPath);\n\n // If path goes outside app root (starts with ..), use absolute path\n // Otherwise use app-relative path with / prefix\n if (relativeServerPath.startsWith('..')) {\n this.entryServerPath = absoluteServerPath;\n } else {\n this.entryServerPath = '/' + relativeServerPath.replace(/\\\\/g, '/');\n }\n\n // Load HTML template\n // Try package template first (new approach), then fall back to local template (backward compatibility)\n let templatePath: string;\n\n if (this.isDevelopment) {\n // In dev mode, try package templates (both source and built), then fall back to local\n const packageTemplatePaths = [\n join(__dirname, '../templates/index.html'), // From dist/render -> dist/templates (built package)\n join(__dirname, '../src/templates/index.html'), // From render/ -> src/templates (dev with ts-node)\n join(__dirname, '../../src/templates/index.html'), // Alternative: from dist/render -> src/templates\n ];\n const localTemplatePath = join(process.cwd(), 'src/views/index.html');\n\n const foundPackageTemplate = packageTemplatePaths.find((p) =>\n existsSync(p),\n );\n\n if (foundPackageTemplate) {\n templatePath = foundPackageTemplate;\n } else if (existsSync(localTemplatePath)) {\n templatePath = localTemplatePath;\n } else {\n throw new Error(\n `Template file not found. Tried:\\n` +\n packageTemplatePaths\n .map((p) => ` - ${p} (package template)`)\n .join('\\n') +\n `\\n` +\n ` - ${localTemplatePath} (local template)`,\n );\n }\n } else {\n templatePath = join(process.cwd(), 'dist/client/index.html');\n\n if (!existsSync(templatePath)) {\n throw new Error(\n `Template file not found at ${templatePath}. ` +\n `Make sure to run the build process first.`,\n );\n }\n }\n\n try {\n this.template = readFileSync(templatePath, 'utf-8');\n this.logger.log(`✓ Loaded template from ${templatePath}`);\n } catch (error: any) {\n throw new Error(\n `Failed to read template file at ${templatePath}: ${error.message}`,\n );\n }\n\n // In production, load the Vite manifests to get hashed filenames\n if (!this.isDevelopment) {\n // Load client manifest\n const manifestPath = join(\n process.cwd(),\n 'dist/client/.vite/manifest.json',\n );\n if (existsSync(manifestPath)) {\n this.manifest = JSON.parse(readFileSync(manifestPath, 'utf-8'));\n } else {\n this.logger.warn(\n '⚠️ Client manifest not found. Run `pnpm build:client` first.',\n );\n }\n\n // Load server manifest\n const serverManifestPath = join(\n process.cwd(),\n 'dist/server/.vite/manifest.json',\n );\n if (existsSync(serverManifestPath)) {\n this.serverManifest = JSON.parse(\n readFileSync(serverManifestPath, 'utf-8'),\n );\n } else {\n this.logger.warn(\n '⚠️ Server manifest not found. Run `pnpm build:server` first.',\n );\n }\n }\n }\n\n setViteServer(vite: ViteDevServer) {\n this.vite = vite;\n }\n\n /**\n * Main render method that routes to string or stream mode\n */\n async render(\n viewComponent: any,\n data: any = {},\n res?: Response,\n head?: HeadData,\n ): Promise<string | void> {\n // Merge default head with page-specific head\n const mergedHead = this.mergeHead(this.defaultHead, head);\n\n if (this.ssrMode === 'stream') {\n if (!res) {\n throw new Error(\n 'Response object is required for streaming SSR mode. Pass res as third parameter.',\n );\n }\n return this.renderToStream(viewComponent, data, res, mergedHead);\n }\n return this.renderToString(viewComponent, data, mergedHead);\n }\n\n /**\n * Merge default head with page-specific head\n * Page-specific head values override defaults\n */\n private mergeHead(\n defaultHead?: HeadData,\n pageHead?: HeadData,\n ): HeadData | undefined {\n if (!defaultHead && !pageHead) {\n return undefined;\n }\n\n return {\n ...defaultHead,\n ...pageHead,\n // Merge arrays (links and meta) instead of replacing\n links: [...(defaultHead?.links || []), ...(pageHead?.links || [])],\n meta: [...(defaultHead?.meta || []), ...(pageHead?.meta || [])],\n };\n }\n\n /**\n * Traditional string-based SSR using renderToString\n */\n private async renderToString(\n viewComponent: any,\n data: any = {},\n head?: HeadData,\n ): Promise<string> {\n const startTime = Date.now();\n\n try {\n let template = this.template;\n\n // In development, transform the template with Vite\n if (this.vite) {\n template = await this.vite.transformIndexHtml('/', template);\n }\n\n // Import and use the SSR render function\n let renderModule;\n if (this.vite) {\n // Development: Use Vite's SSR loading with HMR support from package template\n renderModule = await this.vite.ssrLoadModule(this.entryServerPath);\n } else {\n // Production: Import the built server bundle using manifest\n if (this.serverManifest) {\n // Find the entry file in the manifest (supports both old and new paths)\n const manifestEntry = Object.entries(this.serverManifest).find(\n ([key, value]: [string, any]) =>\n value.isEntry && key.includes('entry-server'),\n );\n\n if (manifestEntry) {\n const [, entry] = manifestEntry;\n const serverPath = join(process.cwd(), 'dist/server', entry.file);\n renderModule = await import(serverPath);\n } else {\n throw new Error(\n 'Server bundle not found in manifest. Run `pnpm build:server` to generate the server bundle.',\n );\n }\n } else {\n throw new Error(\n 'Server bundle not found in manifest. Run `pnpm build:server` to generate the server bundle.',\n );\n }\n }\n\n // Extract data and context\n const { data: pageData, __context: context } = data;\n\n // Render the React component (pass component directly)\n const appHtml = await renderModule.renderComponent(viewComponent, data);\n\n // Get component name for client-side hydration\n const componentName =\n viewComponent.displayName || viewComponent.name || 'Component';\n\n // Serialize initial state and context for client\n const initialStateScript = `\n <script>\n window.__INITIAL_STATE__ = ${serialize(pageData, { isJSON: true })};\n window.__CONTEXT__ = ${serialize(context, { isJSON: true })};\n window.__COMPONENT_NAME__ = ${serialize(componentName, { isJSON: true })};\n </script>\n `;\n\n // Inject client script and styles\n let clientScript = '';\n let styles = '';\n\n if (this.vite) {\n // Development: Use app's local entry-client in views directory\n clientScript = `<script type=\"module\" src=\"/src/views/entry-client.tsx\"></script>`;\n // Note: CSS is handled by Vite in dev mode via @vitejs/plugin-react\n styles = '';\n } else {\n // Production: Use manifest to get hashed filename\n if (this.manifest) {\n // Find the entry file in the manifest (supports both old and new paths)\n const manifestEntry = Object.entries(this.manifest).find(\n ([key, value]: [string, any]) =>\n value.isEntry && key.includes('entry-client'),\n );\n\n if (manifestEntry) {\n const [, entry] = manifestEntry;\n const entryFile = entry.file;\n clientScript = `<script type=\"module\" src=\"/${entryFile}\"></script>`;\n\n // Inject CSS from manifest\n if (entry.css) {\n const cssFiles = entry.css;\n styles = cssFiles\n .map((css) => `<link rel=\"stylesheet\" href=\"/${css}\" />`)\n .join('\\n ');\n }\n } else {\n this.logger.error('⚠️ Client entry not found in manifest');\n clientScript = `<script type=\"module\" src=\"/assets/client.js\"></script>`;\n }\n } else {\n this.logger.error('⚠️ Client manifest not found');\n clientScript = `<script type=\"module\" src=\"/assets/client.js\"></script>`;\n }\n }\n\n // Generate head tags\n const headTags = this.templateParser.buildHeadTags(head);\n\n // Replace placeholders\n let html = template.replace('<!--app-html-->', appHtml);\n html = html.replace('<!--initial-state-->', initialStateScript);\n html = html.replace('<!--client-scripts-->', clientScript);\n html = html.replace('<!--styles-->', styles);\n html = html.replace('<!--head-meta-->', headTags);\n\n // Log performance metrics in development\n if (this.isDevelopment) {\n const duration = Date.now() - startTime;\n const componentName =\n typeof viewComponent === 'function'\n ? viewComponent.name\n : String(viewComponent);\n this.logger.log(\n `[SSR] ${componentName} rendered in ${duration}ms (string mode)`,\n );\n }\n\n return html;\n } catch (error) {\n // Re-throw error - let NestJS exception layer handle it\n throw error;\n }\n }\n\n /**\n * Modern streaming SSR using renderToPipeableStream\n */\n private async renderToStream(\n viewComponent: any,\n data: any = {},\n res: Response,\n head?: HeadData,\n ): Promise<void> {\n const startTime = Date.now();\n let shellReadyTime = 0;\n\n try {\n let template = this.template;\n\n // In development, transform the template with Vite\n if (this.vite) {\n template = await this.vite.transformIndexHtml('/', template);\n }\n\n // Parse template into parts\n const templateParts = this.templateParser.parseTemplate(template);\n\n // Import and use the SSR render function\n let renderModule;\n if (this.vite) {\n // Development: Use Vite's SSR loading with HMR support from package template\n renderModule = await this.vite.ssrLoadModule(this.entryServerPath);\n } else {\n // Production: Import the built server bundle using manifest\n if (this.serverManifest) {\n // Find the entry file in the manifest (supports both old and new paths)\n const manifestEntry = Object.entries(this.serverManifest).find(\n ([key, value]: [string, any]) =>\n value.isEntry && key.includes('entry-server'),\n );\n\n if (manifestEntry) {\n const [, entry] = manifestEntry;\n const serverPath = join(process.cwd(), 'dist/server', entry.file);\n renderModule = await import(serverPath);\n } else {\n throw new Error(\n 'Server bundle not found in manifest. Run `pnpm build:server` to generate the server bundle.',\n );\n }\n } else {\n throw new Error(\n 'Server bundle not found in manifest. Run `pnpm build:server` to generate the server bundle.',\n );\n }\n }\n\n // Extract data and context\n const { data: pageData, __context: context } = data;\n\n // Get component name for client-side hydration and logging\n const componentName =\n viewComponent.displayName || viewComponent.name || 'Component';\n\n // Build inline scripts\n const inlineScripts = this.templateParser.buildInlineScripts(\n pageData,\n context,\n componentName,\n );\n\n // Get client script tag\n const clientScript = this.templateParser.getClientScriptTag(\n this.isDevelopment,\n this.manifest,\n );\n\n // Get stylesheet tags\n const stylesheetTags = this.templateParser.getStylesheetTags(\n this.isDevelopment,\n this.manifest,\n );\n\n // Generate head tags\n const headTags = this.templateParser.buildHeadTags(head);\n\n // Set up streaming with error handlers\n let didError = false;\n\n const { pipe, abort } = renderModule.renderComponentStream(\n viewComponent,\n data,\n {\n onShellReady: () => {\n // Shell is ready - start streaming\n shellReadyTime = Date.now();\n res.statusCode = didError ? 500 : 200;\n res.setHeader('Content-Type', 'text/html; charset=utf-8');\n\n // Write HTML start with styles and head meta injected\n let htmlStart = templateParts.htmlStart;\n htmlStart = htmlStart.replace('<!--styles-->', stylesheetTags);\n htmlStart = htmlStart.replace('<!--head-meta-->', headTags);\n res.write(htmlStart);\n\n // Write root div start\n res.write(templateParts.rootStart);\n\n // Pipe React stream to response\n pipe(res as unknown as Writable);\n\n // Log TTFB (Time to First Byte) in development\n if (this.isDevelopment) {\n const ttfb = shellReadyTime - startTime;\n this.logger.log(\n `[SSR] ${componentName} shell ready in ${ttfb}ms (stream mode - TTFB)`,\n );\n }\n },\n\n onShellError: (error: Error) => {\n // Error before shell ready - can still send error page\n this.streamingErrorHandler.handleShellError(\n error,\n res,\n componentName,\n this.isDevelopment,\n );\n },\n\n onError: (error: Error) => {\n // Error during streaming - headers already sent\n didError = true;\n this.streamingErrorHandler.handleStreamError(error, componentName);\n },\n\n onAllReady: () => {\n // All content ready (including Suspense)\n // Write inline scripts\n res.write(inlineScripts);\n\n // Write client script\n res.write(clientScript);\n\n // Write root div end\n res.write(templateParts.rootEnd);\n\n // Write HTML end\n res.write(templateParts.htmlEnd);\n\n // End the response\n res.end();\n\n // Log total streaming time in development\n if (this.isDevelopment) {\n const totalTime = Date.now() - startTime;\n const streamTime = Date.now() - shellReadyTime;\n this.logger.log(\n `[SSR] ${componentName} streaming complete in ${totalTime}ms total (${streamTime}ms streaming)`,\n );\n }\n },\n },\n );\n\n // Handle client disconnection\n res.on('close', () => {\n abort();\n });\n } catch (error) {\n // Handle error before streaming started\n const componentName =\n typeof viewComponent === 'function'\n ? viewComponent.name\n : String(viewComponent);\n this.streamingErrorHandler.handleShellError(\n error as Error,\n res,\n componentName,\n this.isDevelopment,\n );\n }\n }\n}\n","import { SetMetadata } from '@nestjs/common';\nimport type React from 'react';\nimport type { PageProps } from '../interfaces/page-props.interface';\n\nexport const RENDER_KEY = 'render';\n\n/**\n * Extract the data type T from PageProps<T>.\n * PageProps<T> = T & { head?, context }, so we extract T by removing those keys.\n */\ntype ExtractPagePropsData<P> = P extends PageProps<infer T>\n ? T\n : P extends { head?: any; context: any }\n ? Omit<P, 'head' | 'context'>\n : P;\n\n/**\n * Extract controller return type from a React component's props.\n */\ntype ExtractComponentData<T> = T extends React.ComponentType<infer P>\n ? ExtractPagePropsData<P>\n : never;\n\n/**\n * Decorator to render a React component as the response.\n *\n * Import the component directly for Cmd+Click navigation in your IDE.\n * TypeScript automatically validates your controller returns the correct props.\n *\n * @param component - The React component to render\n *\n * @example\n * ```typescript\n * // Your view component (views/home.tsx)\n * export interface HomeProps {\n * message: string;\n * }\n * export default function Home(props: PageProps<HomeProps>) { ... }\n *\n * // Your controller - Cmd+Click on Home navigates to the view file!\n * import Home from './views/home';\n *\n * @Get()\n * @Render(Home) // Type-safe! Wrong props = build error\n * getHome() {\n * return { message: 'Hello' }; // ✅ Correct\n * // return { wrong: 'prop' }; // ❌ Type error!\n * }\n * ```\n */\nexport function Render<T extends React.ComponentType<any>>(\n component: T,\n): <TMethod extends (...args: any[]) => ExtractComponentData<T> | Promise<ExtractComponentData<T>>>(\n target: any,\n propertyKey: string | symbol,\n descriptor: TypedPropertyDescriptor<TMethod>,\n) => TypedPropertyDescriptor<TMethod> | void {\n return (target: any, propertyKey: string | symbol, descriptor: any) => {\n SetMetadata(RENDER_KEY, component)(target, propertyKey, descriptor);\n };\n}\n\n/**\n * @deprecated Use `Render` instead. This alias will be removed in a future version.\n */\nexport const ReactRender = Render;\n","import {\n Injectable,\n NestInterceptor,\n ExecutionContext,\n CallHandler,\n} from '@nestjs/common';\nimport { Reflector } from '@nestjs/core';\nimport { Observable } from 'rxjs';\nimport { switchMap } from 'rxjs/operators';\nimport { Request, Response } from 'express';\nimport { RenderService } from './render.service';\nimport { RENDER_KEY } from '../decorators/react-render.decorator';\nimport type { RenderContext, RenderResponse } from '../interfaces/index';\n\n/**\n * Type guard to check if data is a RenderResponse\n */\nfunction isRenderResponse(data: any): data is RenderResponse {\n return data && typeof data === 'object' && 'props' in data;\n}\n\n@Injectable()\nexport class RenderInterceptor implements NestInterceptor {\n constructor(\n private reflector: Reflector,\n private renderService: RenderService,\n ) {}\n\n intercept(context: ExecutionContext, next: CallHandler): Observable<any> {\n const viewPathOrComponent = this.reflector.get<string | Function>(\n RENDER_KEY,\n context.getHandler(),\n );\n\n if (!viewPathOrComponent) {\n // No @Render decorator, proceed normally\n return next.handle();\n }\n\n return next.handle().pipe(\n switchMap(async (data) => {\n const httpContext = context.switchToHttp();\n const request = httpContext.getRequest<Request>();\n const response = httpContext.getResponse<Response>();\n\n // Build render context from request\n const renderContext: RenderContext = {\n url: request.url,\n path: request.path,\n query: request.query as Record<string, string | string[]>,\n params: request.params as Record<string, string>,\n userAgent: request.headers['user-agent'],\n acceptLanguage: request.headers['accept-language'],\n referer: request.headers.referer,\n };\n\n // Normalize data to RenderResponse structure\n // Auto-wrap flat objects: { foo: 1 } → { props: { foo: 1 } }\n const renderResponse: RenderResponse = isRenderResponse(data)\n ? data\n : { props: data };\n\n // Merge props with context\n const fullData = {\n data: renderResponse.props,\n __context: renderContext,\n };\n\n try {\n // Render the React component\n // Pass response object for streaming mode support\n // Pass head data for template injection\n const html = await this.renderService.render(\n viewPathOrComponent as string,\n fullData,\n response,\n renderResponse.head,\n );\n\n // In streaming mode, render() returns void and handles response directly\n // In string mode, render() returns HTML string\n if (html !== undefined) {\n // String mode: Set content type and let NestJS handle sending the response\n response.type('text/html');\n return html;\n }\n\n // Streaming mode: Response already sent, return empty to prevent NestJS from sending again\n return;\n } catch (error) {\n // Re-throw error - let NestJS exception layer handle it\n throw error;\n }\n }),\n );\n }\n}\n","import {\n Injectable,\n OnModuleInit,\n OnModuleDestroy,\n Logger,\n Inject,\n Optional,\n} from '@nestjs/common';\nimport { HttpAdapterHost } from '@nestjs/core';\nimport { RenderService } from './render.service';\nimport type { ViteConfig } from '../interfaces';\nimport type { ViteDevServer } from 'vite';\n\n/**\n * Automatically initializes Vite in development or static assets in production\n */\n@Injectable()\nexport class ViteInitializerService implements OnModuleInit, OnModuleDestroy {\n private readonly logger = new Logger(ViteInitializerService.name);\n private readonly viteMode: 'proxy' | 'embedded';\n private readonly vitePort: number;\n private viteServer: ViteDevServer | null = null;\n\n constructor(\n private readonly renderService: RenderService,\n private readonly httpAdapterHost: HttpAdapterHost,\n @Optional() @Inject('VITE_CONFIG') viteConfig?: ViteConfig,\n ) {\n // Default to embedded mode (simplest setup, no HMR)\n this.viteMode = viteConfig?.mode || 'embedded';\n this.vitePort = viteConfig?.port || 5173;\n }\n\n async onModuleInit() {\n const isDevelopment = process.env.NODE_ENV !== 'production';\n\n if (isDevelopment) {\n await this.setupDevelopmentMode();\n } else {\n this.setupProductionMode();\n }\n }\n\n private async setupDevelopmentMode() {\n try {\n // Dynamically import Vite (ESM)\n const { createServer: createViteServer } = await import('vite');\n\n // Create Vite server for SSR module loading\n this.viteServer = await createViteServer({\n server: { middlewareMode: true },\n appType: 'custom',\n });\n\n this.renderService.setViteServer(this.viteServer);\n\n // Mount Vite middleware for embedded mode or set up proxy for external mode\n if (this.viteMode === 'embedded') {\n await this.mountViteMiddleware(this.viteServer);\n } else if (this.viteMode === 'proxy') {\n await this.setupViteProxy();\n }\n\n this.logger.log(`✓ Vite initialized for SSR (mode: ${this.viteMode})`);\n } catch (error: any) {\n this.logger.warn(\n `Failed to initialize Vite: ${error.message}. Make sure vite is installed.`,\n );\n }\n }\n\n private async mountViteMiddleware(vite: any) {\n try {\n const httpAdapter = this.httpAdapterHost.httpAdapter;\n if (!httpAdapter) {\n this.logger.warn(\n 'HTTP adapter not available, skipping Vite middleware setup',\n );\n return;\n }\n\n const app = httpAdapter.getInstance();\n\n // Mount Vite's middleware to handle all Vite-related requests\n // This includes /@vite/client, /@react-refresh, /src/*, etc.\n app.use(vite.middlewares);\n\n this.logger.log(`✓ Vite middleware mounted (embedded mode with HMR)`);\n } catch (error: any) {\n this.logger.warn(`Failed to mount Vite middleware: ${error.message}`);\n }\n }\n\n private async setupViteProxy() {\n try {\n const httpAdapter = this.httpAdapterHost.httpAdapter;\n if (!httpAdapter) {\n this.logger.warn(\n 'HTTP adapter not available, skipping Vite proxy setup',\n );\n return;\n }\n\n const app = httpAdapter.getInstance();\n\n // Dynamically import http-proxy-middleware\n const { createProxyMiddleware } = await import('http-proxy-middleware');\n\n const viteProxy = createProxyMiddleware({\n target: `http://localhost:${this.vitePort}`,\n changeOrigin: true,\n ws: true, // Enable WebSocket for HMR\n pathFilter: (pathname: string) => {\n return (\n pathname.startsWith('/src/') ||\n pathname.startsWith('/@') ||\n pathname.startsWith('/node_modules/')\n );\n },\n });\n\n app.use(viteProxy);\n this.logger.log(\n `✓ Vite HMR proxy configured (external Vite on port ${this.vitePort})`,\n );\n } catch (error: any) {\n this.logger.warn(\n `Failed to setup Vite proxy: ${error.message}. Make sure http-proxy-middleware is installed.`,\n );\n }\n }\n\n private setupProductionMode() {\n try {\n const httpAdapter = this.httpAdapterHost.httpAdapter;\n if (httpAdapter) {\n const app = httpAdapter.getInstance();\n const { join } = require('path');\n const express = require('express');\n\n // Serve static assets from dist/client\n app.use(\n express.static(join(process.cwd(), 'dist/client'), {\n index: false,\n maxAge: '1y',\n }),\n );\n\n this.logger.log('✓ Static assets configured (dist/client)');\n }\n } catch (error: any) {\n this.logger.warn(`Failed to setup static assets: ${error.message}`);\n }\n }\n\n /**\n * Cleanup: Close Vite server on module destroy\n * This prevents port conflicts on hot reload\n */\n async onModuleDestroy() {\n if (this.viteServer) {\n try {\n await this.viteServer.close();\n this.logger.log('✓ Vite server closed');\n } catch (error: any) {\n this.logger.warn(`Failed to close Vite server: ${error.message}`);\n }\n }\n }\n}\n","import { Global, Module, DynamicModule, Provider } from '@nestjs/common';\nimport { APP_INTERCEPTOR } from '@nestjs/core';\nimport { RenderService } from './render.service';\nimport { RenderInterceptor } from './render.interceptor';\nimport { TemplateParserService } from './template-parser.service';\nimport { StreamingErrorHandler } from './streaming-error-handler';\nimport { ViteInitializerService } from './vite-initializer.service';\nimport type { RenderConfig } from '../interfaces';\n\n@Global()\n@Module({\n providers: [\n RenderService,\n TemplateParserService,\n StreamingErrorHandler,\n ViteInitializerService, // Auto-initializes Vite in development (embedded mode by default)\n {\n provide: APP_INTERCEPTOR,\n useClass: RenderInterceptor,\n },\n {\n provide: 'VITE_CONFIG',\n useValue: {}, // Empty config = embedded mode (default)\n },\n ],\n exports: [RenderService],\n})\nexport class RenderModule {\n /**\n * Register the render module with optional configuration\n *\n * @param config - Optional render configuration\n * @returns Dynamic module\n *\n * @example\n * ```ts\n * // Zero config - embedded mode by default (simplest)\n * @Module({\n * imports: [RenderModule],\n * })\n *\n * // Enable HMR with proxy mode\n * @Module({\n * imports: [\n * RenderModule.register({\n * vite: { mode: 'proxy', port: 5173 }\n * })\n * ],\n * })\n *\n * // Enable streaming SSR\n * RenderModule.register({ mode: 'stream' })\n *\n * // Custom error pages\n * RenderModule.register({\n * mode: 'stream',\n * errorPageDevelopment: MyCustomDevErrorPage,\n * errorPageProduction: MyCustomProdErrorPage,\n * })\n * ```\n */\n static register(config?: RenderConfig): DynamicModule {\n const providers: Provider[] = [\n RenderService,\n TemplateParserService,\n StreamingErrorHandler,\n ViteInitializerService, // Auto-initializes Vite in development\n {\n provide: APP_INTERCEPTOR,\n useClass: RenderInterceptor,\n },\n ];\n\n // Add Vite configuration (defaults applied in ViteInitializerService)\n providers.push({\n provide: 'VITE_CONFIG',\n useValue: config?.vite || {},\n });\n\n // Add SSR mode configuration if provided\n if (config?.mode) {\n providers.push({\n provide: 'SSR_MODE',\n useValue: config.mode,\n });\n }\n\n // Add custom error page components if provided\n if (config?.errorPageDevelopment) {\n providers.push({\n provide: 'ERROR_PAGE_DEVELOPMENT',\n useValue: config.errorPageDevelopment,\n });\n }\n\n if (config?.errorPageProduction) {\n providers.push({\n provide: 'ERROR_PAGE_PRODUCTION',\n useValue: config.errorPageProduction,\n });\n }\n\n // Add default head configuration if provided\n if (config?.defaultHead) {\n providers.push({\n provide: 'DEFAULT_HEAD',\n useValue: config.defaultHead,\n });\n }\n\n return {\n global: true,\n module: RenderModule,\n providers,\n exports: [RenderService],\n };\n }\n\n /**\n * Register the render module asynchronously with dynamic configuration\n *\n * Use this when you need to inject services (e.g., load config from database)\n *\n * @param options - Async configuration options\n * @returns Dynamic module\n *\n * @example\n * ```ts\n * // Load default head from database\n * RenderModule.registerAsync({\n * imports: [TenantModule],\n * inject: [TenantRepository],\n * useFactory: async (tenantRepo: TenantRepository) => {\n * const tenant = await tenantRepo.findDefaultTenant();\n * return {\n * defaultHead: {\n * title: tenant.appName,\n * description: tenant.description,\n * links: [\n * { rel: 'icon', href: tenant.favicon }\n * ]\n * }\n * };\n * }\n * })\n * ```\n */\n static registerAsync(options: {\n imports?: any[];\n inject?: any[];\n useFactory: (...args: any[]) => Promise<RenderConfig> | RenderConfig;\n }): DynamicModule {\n const configProvider: Provider = {\n provide: 'RENDER_CONFIG',\n useFactory: options.useFactory,\n inject: options.inject || [],\n };\n\n const providers: Provider[] = [\n configProvider,\n RenderService,\n TemplateParserService,\n StreamingErrorHandler,\n ViteInitializerService, // Auto-initializes Vite in development\n {\n provide: APP_INTERCEPTOR,\n useClass: RenderInterceptor,\n },\n // Vite configuration provider - reads from config\n {\n provide: 'VITE_CONFIG',\n useFactory: (config: RenderConfig) => config?.vite || {},\n inject: ['RENDER_CONFIG'],\n },\n // SSR mode provider - reads from config\n {\n provide: 'SSR_MODE',\n useFactory: (config: RenderConfig) => config?.mode,\n inject: ['RENDER_CONFIG'],\n },\n // Error page providers - read from config\n {\n provide: 'ERROR_PAGE_DEVELOPMENT',\n useFactory: (config: RenderConfig) => config?.errorPageDevelopment,\n inject: ['RENDER_CONFIG'],\n },\n {\n provide: 'ERROR_PAGE_PRODUCTION',\n useFactory: (config: RenderConfig) => config?.errorPageProduction,\n inject: ['RENDER_CONFIG'],\n },\n // Default head provider - reads from config\n {\n provide: 'DEFAULT_HEAD',\n useFactory: (config: RenderConfig) => config?.defaultHead,\n inject: ['RENDER_CONFIG'],\n },\n ];\n\n return {\n global: true,\n module: RenderModule,\n imports: options.imports || [],\n providers,\n exports: [RenderService],\n };\n }\n}\n"]}