{"version":3,"sources":["../source/objects/Server/index.ts","../source/data/constants/general/index.ts","../source/data/constants/stiller/index.ts","../source/utilities/template/index.ts","../source/data/templates/index.ts","../source/objects/Renderer/template/index.ts","../source/objects/Renderer/index.ts","../source/objects/ContentGenerator/index.tsx","../source/utilities/wrapping/index.tsx","../source/objects/StillsManager/index.ts","../source/utilities/pttp/index.ts","../source/objects/LiveServer/index.ts","../source/objects/StillsGenerator/index.ts","../source/objects/Stiller/index.ts","../source/index.ts"],"sourcesContent":["// #region imports\n    // #region libraries\n    import {\n        Server,\n    } from 'http';\n    import fs from 'fs';\n    import path from 'path';\n\n    import express, {\n        Express,\n    } from 'express';\n\n    import compression from 'compression';\n\n    import open from 'open';\n\n    import {\n        ServerStyleSheet,\n    } from 'styled-components';\n\n    import {\n        Helmet,\n    } from 'react-helmet-async';\n\n    import {\n        time,\n        uuid,\n    } from '@plurid/plurid-functions';\n\n    import {\n        PluridRoute,\n        PluridRoutePlane,\n        PluridRouterProperties,\n        PluridPreserveOnServe,\n        PluridPreserveAfterServe,\n        PluridPreserveOnError,\n        PluridPreserveResponse,\n        PluridPreserveTransmission,\n\n        IsoMatcherRouteResult,\n    } from '@plurid/plurid-data';\n\n    import {\n        routing,\n    } from '@plurid/plurid-engine';\n\n    import {\n        serverComputeMetastate,\n        // getDirectPlaneMatch,\n\n        PluridReactComponent,\n    } from '@plurid/plurid-react';\n    // #endregion libraries\n\n\n    // #region external\n    import {\n        ServerRequest,\n        DebugLevels,\n\n        PluridServerMiddleware,\n        PluridServerService,\n        PluridServerOptions,\n        PluridServerPartialOptions,\n        PluridServerConfiguration,\n        PluridServerTemplateConfiguration,\n        PluridPreserveReact,\n\n        PTTPHandler,\n    } from '~data/interfaces';\n\n    import {\n        environment,\n\n        defaultStillerOptions,\n\n        NOT_FOUND_ROUTE,\n        DEFAULT_SERVER_PORT,\n        DEFAULT_SERVER_OPTIONS,\n\n        CATCH_ALL_ROUTE,\n        CATCH_ALL_ROUTE_PATTERN,\n        PTTP_ROUTE,\n    } from '~data/constants';\n\n    import {\n        NOT_FOUND_TEMPLATE,\n        SERVER_ERROR_TEMPLATE,\n    } from '~data/templates';\n\n    import PluridRenderer from '../Renderer';\n    import PluridContentGenerator from '../ContentGenerator';\n    import PluridStillsManager from '../StillsManager';\n\n    import {\n        recordToString,\n    } from '~utilities/template';\n\n    import {\n        resolveElementFromPlaneMatch,\n    } from '~utilities/pttp';\n    // #endregion external\n// #endregion imports\n\n\n\n// #region module\nconst {\n    IsoMatcher: PluridIsoMatcher,\n} = routing;\n\n\n\nclass PluridServer {\n    private routes: PluridRoute<PluridReactComponent>[];\n    private planes: PluridRoutePlane<PluridReactComponent>[];\n    private preserves: PluridPreserveReact[];\n    private helmet: Helmet;\n    private styles: string[];\n    private middleware: PluridServerMiddleware[];\n    private exterior: PluridReactComponent | undefined;\n    private shell: PluridReactComponent | undefined;\n    private routerProperties: Partial<PluridRouterProperties<PluridReactComponent>>;\n    private services: PluridServerService[];\n    private options: PluridServerOptions;\n    private template: PluridServerTemplateConfiguration | undefined;\n    public usePTTP: boolean;\n    private pttpHandler: PTTPHandler | undefined;\n    private elementqlEndpoint: string | undefined;\n\n    private serverApplication: Express;\n    private server: Server | undefined;\n    private port: number | string;\n\n    private stills: PluridStillsManager;\n    private isoMatcher: routing.IsoMatcher<PluridReactComponent>;\n\n\n    constructor(\n        configuration: PluridServerConfiguration,\n    ) {\n        const {\n            routes,\n            planes,\n            preserves,\n            helmet,\n            styles,\n            middleware,\n            exterior,\n            shell,\n            routerProperties,\n            services,\n            options,\n            template,\n            usePTTP,\n            pttpHandler,\n            elementqlEndpoint,\n        } = configuration;\n\n        this.routes = routes;\n        this.planes = planes || [];\n        this.preserves = preserves;\n        this.helmet = helmet;\n        this.styles = styles || [];\n        this.middleware = middleware || [];\n        this.exterior = exterior;\n        this.shell = shell;\n        this.routerProperties = routerProperties || {};\n        this.services = services || [];\n        this.options = this.handleOptions(options);\n        this.template = template;\n        this.usePTTP = usePTTP ?? false;\n        this.pttpHandler = pttpHandler;\n        this.elementqlEndpoint = elementqlEndpoint;\n\n        this.serverApplication = express();\n        this.port = DEFAULT_SERVER_PORT;\n\n\n        // const urlRoutes = this.routes.map(route => {\n        //     const {\n        //         value,\n        //         parameters,\n        //     } = route;\n\n        //     return {\n        //         value,\n        //         parameters,\n        //     };\n        // });\n        // this.urlRouter = new PluridURLRouter(urlRoutes);\n\n        this.stills = new PluridStillsManager(this.options);\n        this.isoMatcher = new PluridIsoMatcher(\n            {\n                routes: this.routes,\n                routePlanes: this.planes,\n            },\n            this.options.hostname,\n        );\n\n\n        this.configureServer();\n        this.handleEndpoints();\n\n        // Opt-out (default on for the CLI). A bound, stored handler is registered ONCE and\n        // removed in `stop()`, so multiple server instances don't pile up duplicate handlers,\n        // and an embedding host can disable process termination entirely.\n        if (this.options.attachSignalHandlers) {\n            this.attachSignalHandlers();\n        }\n    }\n\n    private handleProcessSignal = () => {\n        this.stop();\n        process.exit(0);\n    };\n\n    private signalHandlersAttached = false;\n\n    public attachSignalHandlers() {\n        if (this.signalHandlersAttached) {\n            return;\n        }\n        process.on('SIGINT', this.handleProcessSignal);\n        process.on('SIGTERM', this.handleProcessSignal);\n        this.signalHandlersAttached = true;\n    }\n\n    public detachSignalHandlers() {\n        process.removeListener('SIGINT', this.handleProcessSignal);\n        process.removeListener('SIGTERM', this.handleProcessSignal);\n        this.signalHandlersAttached = false;\n    }\n\n    static analysis(\n        pluridServer: PluridServer,\n    ) {\n        return {\n            routes: pluridServer.routes,\n            options: pluridServer.options,\n        };\n    }\n\n\n    public start(\n        port = this.port,\n    ) {\n        this.port = port;\n\n        const serverlink = `http://localhost:${port}`;\n\n        if (this.debugAllows('info')) {\n            console.info(\n                `\\n\\t[${time.stamp()}] ${this.options.serverName} Started on Port ${port}: ${serverlink}\\n`,\n            );\n        }\n\n        this.server = this.serverApplication.listen(port);\n\n        this.open(serverlink);\n\n        return this.server;\n    }\n\n    public stop() {\n        this.detachSignalHandlers();\n\n        if (this.server) {\n            if (this.debugAllows('info')) {\n                console.info(\n                    `\\n\\t[${time.stamp()}] ${this.options.serverName} Stopped on Port ${this.port}\\n`,\n                );\n            }\n\n            this.server.close();\n        } else {\n            if (this.debugAllows('info')) {\n                console.info(\n                    `\\n\\t[${time.stamp()}] ${this.options.serverName} Could not be Stopped on Port ${this.port}\\n`,\n                );\n            }\n        }\n    }\n\n    public handle() {\n        return {\n            post: (\n                path: string,\n                ...handlers: express.RequestHandler[]\n            ) => {\n                this.serverApplication.post(path, ...handlers);\n\n                return this.serverApplication;\n            },\n            patch: (\n                path: string,\n                ...handlers: express.RequestHandler[]\n            ) => {\n                this.serverApplication.patch(path, ...handlers);\n\n                return this.serverApplication;\n            },\n            put: (\n                path: string,\n                ...handlers: express.RequestHandler[]\n            ) => {\n                this.serverApplication.put(path, ...handlers);\n\n                return this.serverApplication;\n            },\n            delete: (\n                path: string,\n                ...handlers: express.RequestHandler[]\n            ) => {\n                this.serverApplication.delete(path, ...handlers);\n\n                return this.serverApplication;\n            },\n        };\n    }\n\n    public instance() {\n        return this.serverApplication;\n    }\n\n\n    private handleEndpoints() {\n        this.serverApplication.get(\n            CATCH_ALL_ROUTE_PATTERN,\n            async (request, response, next) => {\n                this.handleGetRequest(\n                    request, response, next,\n                );\n            },\n        );\n\n        if (this.usePTTP) {\n            this.serverApplication.post(\n                PTTP_ROUTE,\n                express.json() as any, // body parsing is built into Express 5\n                async (request, response, next) => {\n                    this.handlePTTPRequest(\n                        request, response,\n                    );\n                },\n            );\n        }\n    }\n\n    private async handleGetRequest(\n        request: express.Request,\n        response: express.Response,\n        next: express.NextFunction,\n    ) {\n        const requestID = (request as ServerRequest).requestID || uuid.generate();\n\n        try {\n            if (this.debugAllows('info')) {\n                console.info(\n                    `[${time.stamp()} :: ${requestID}] (000 Start) Handling GET ${request.path}`,\n                );\n            }\n\n\n            const ignorable = this.ignoreGetRequest(\n                request.path,\n            );\n\n            if (\n                ignorable\n            ) {\n                if (this.debugAllows('info')) {\n                    const requestTime = this.computeRequestTime(request);\n\n                    console.info(\n                        `[${time.stamp()} :: ${requestID}] (204 No Content) Ignored GET ${request.path}${requestTime}`,\n                    );\n                }\n\n                next();\n                return;\n            }\n\n\n            const {\n                preserveResponded,\n                preserveResult,\n                preserveAfterServe,\n            } = await this.resolvePreserve(\n                request,\n                response,\n            );\n\n            if (\n                preserveResponded\n            ) {\n                if (this.debugAllows('info')) {\n                    const requestTime = this.computeRequestTime(request);\n\n                    console.info(\n                        `[${time.stamp()} :: ${requestID}] (204 No Content) Preserve handled GET ${request.path}${requestTime}`,\n                    );\n                }\n\n                return;\n            }\n\n\n            const {\n                externalRedirect,\n                matchingPath,\n            } = this.resolveMatchingPath(\n                preserveResult,\n                request.originalUrl,\n            );\n\n            if (\n                externalRedirect\n            ) {\n                if (this.debugAllows('info')) {\n                    const requestTime = this.computeRequestTime(request);\n\n                    console.info(\n                        `[${time.stamp()} :: ${requestID}] (302 Redirect) Handled GET ${request.path} redirect to ${matchingPath}${requestTime}`,\n                    );\n                }\n\n                response\n                    .status(302)\n                    .redirect(matchingPath);\n\n                this.resolvePreserveAfterServe(\n                    preserveAfterServe,\n                    request,\n                    response,\n                );\n\n                return;\n            }\n\n\n            // const gatewayResponse = await this.handleGateway(\n            //     matchingPath,\n            //     request,\n            //     preserveResult,\n            // );\n\n            // if (\n            //     gatewayResponse\n            // ) {\n            //     if (this.debugAllows('info')) {\n            //         const requestTime = this.computeRequestTime(request);\n\n            //         console.info(\n            //             `[${time.stamp()} :: ${requestID}] (200 OK) Gateway handled GET ${matchingPath}${requestTime}`,\n            //         );\n            //     }\n\n            //     response.send(gatewayResponse);\n\n            //     this.resolvePreserveAfterServe(\n            //         preserveAfterServe,\n            //         request,\n            //         response,\n            //     );\n\n            //     return;\n            // }\n\n\n            // HANDLE STILLS — serve a pre-generated static still (if one exists for this route) instead of\n            // rendering on the fly. Stills are produced by `PluridStillsGenerator` and loaded by StillsManager.\n            const still = this.stills.get(matchingPath);\n\n            if (\n                still\n            ) {\n                if (this.debugAllows('info')) {\n                    const requestTime = this.computeRequestTime(request);\n\n                    console.info(\n                        `[${time.stamp()} :: ${requestID}] (200 OK) Still Handled GET ${matchingPath}${requestTime}`,\n                    );\n                }\n\n                response.send(still);\n\n                this.resolvePreserveAfterServe(\n                    preserveAfterServe,\n                    request,\n                    response,\n                );\n\n                return;\n            }\n\n\n            const isoMatch = this.isoMatcher.match(\n                matchingPath,\n                'route',\n            );\n            // console.log('Route isoMatch', matchingPath, isoMatch);\n\n            if (\n                !isoMatch\n            ) {\n                const notFoundStill = this.stills.get(NOT_FOUND_ROUTE);\n                if (notFoundStill) {\n                    if (this.debugAllows('info')) {\n                        const requestTime = this.computeRequestTime(request);\n\n                        console.info(\n                            `[${time.stamp()} :: ${requestID}] (404 Not Found) Handled GET ${matchingPath}${requestTime}`,\n                        );\n                    }\n\n                    response\n                        .status(404)\n                        .send(notFoundStill);\n\n                    this.resolvePreserveAfterServe(\n                        preserveAfterServe,\n                        request,\n                        response,\n                    );\n\n                    return;\n                }\n\n                const isoMatchNotFound = this.isoMatcher.match(\n                    NOT_FOUND_ROUTE,\n                    'route',\n                );\n                if (!isoMatchNotFound) {\n                    if (this.debugAllows('info')) {\n                        const requestTime = this.computeRequestTime(request);\n\n                        console.info(\n                            `[${time.stamp()} :: ${requestID}] (404 Not Found) Handled GET ${matchingPath}${requestTime}`,\n                        );\n                    }\n\n                    response\n                        .status(404)\n                        .send(NOT_FOUND_TEMPLATE);\n\n                    this.resolvePreserveAfterServe(\n                        preserveAfterServe,\n                        request,\n                        response,\n                    );\n\n                    return;\n                }\n\n\n                const renderer = await this.renderApplication(\n                    isoMatchNotFound,\n                    preserveResult,\n                );\n\n                if (this.debugAllows('info')) {\n                    const requestTime = this.computeRequestTime(request);\n\n                    console.info(\n                        `[${time.stamp()} :: ${requestID}] (404 Not Found) Handled GET ${matchingPath}${requestTime}`,\n                    );\n                }\n\n                response\n                    .status(404)\n                    .send(await renderer.html());\n\n                this.resolvePreserveAfterServe(\n                    preserveAfterServe,\n                    request,\n                    response,\n                );\n\n                response\n                    .status(404)\n                    .end();\n\n                return;\n            }\n\n\n            const renderer = await this.renderApplication(\n                isoMatch,\n                preserveResult,\n            );\n\n            if (this.debugAllows('info')) {\n                const requestTime = this.computeRequestTime(request);\n\n                console.info(\n                    `[${time.stamp()} :: ${requestID}] (200 OK) Handled GET ${matchingPath}${requestTime}`,\n                );\n            }\n\n            response.send(await renderer.html());\n\n            this.resolvePreserveAfterServe(\n                preserveAfterServe,\n                request,\n                response,\n            );\n\n            return;\n        } catch (error) {\n            if (this.debugAllows('error')) {\n                const requestTime = this.computeRequestTime(request);\n\n                console.error(\n                    `[${time.stamp()} :: ${requestID}] (500 Server Error) Could not handle GET ${request.path}${requestTime}`,\n                    error,\n                );\n            }\n\n            response\n                .status(500)\n                .send(this.template?.errorHtml || SERVER_ERROR_TEMPLATE);\n\n            return;\n        }\n    }\n\n    private async handlePTTPRequest(\n        request: express.Request,\n        response: express.Response,\n    ) {\n        const requestID = (request as ServerRequest).requestID || uuid.generate();\n\n        try {\n            if (this.debugAllows('info')) {\n                console.info(\n                    `[${time.stamp()} :: ${requestID}] (000 Start) Handling POST ${request.path}`,\n                );\n            }\n\n\n            response.setHeader('Access-Control-Allow-Origin', request.headers.origin || '');\n            response.setHeader('Access-Control-Allow-Credentials', 'true');\n\n\n            const data = request.body;\n            if (!data || !data.path) {\n                if (this.debugAllows('warn')) {\n                    const requestTime = this.computeRequestTime(request);\n\n                    console.info(\n                        `[${time.stamp()} :: ${requestID}] (400 Bad Request) Could not handle POST ${request.path}${requestTime}`,\n                    );\n                }\n\n                response\n                    .status(400)\n                    .end();\n                return;\n            }\n\n\n            if (this.pttpHandler) {\n                const pttpHandled = await this.pttpHandler(\n                    data.path,\n                );\n\n                if (pttpHandled) {\n                    if (this.debugAllows('info')) {\n                        const requestTime = this.computeRequestTime(request);\n\n                        console.info(\n                            `[${time.stamp()} :: ${requestID}] (200 OK) Handled POST ${request.path}${requestTime} in custom handler`,\n                        );\n                    }\n\n                    return;\n                }\n            }\n\n\n            const planeMatch = this.isoMatcher.match(\n                data.path,\n            );\n            if (!planeMatch) {\n                if (this.debugAllows('warn')) {\n                    const requestTime = this.computeRequestTime(request);\n\n                    console.info(\n                        `[${time.stamp()} :: ${requestID}] (400 Bad Request) Could not handle POST ${request.path}${requestTime}`,\n                    );\n                }\n\n                response\n                    .status(400)\n                    .end();\n                return;\n            }\n\n\n            const elementMatch = resolveElementFromPlaneMatch(\n                planeMatch,\n                this.elementqlEndpoint,\n            );\n            if (!elementMatch) {\n                if (this.debugAllows('warn')) {\n                    const requestTime = this.computeRequestTime(request);\n\n                    console.info(\n                        `[${time.stamp()} :: ${requestID}] (404 Not Found) Could not handle POST ${request.path}${requestTime}`,\n                    );\n                }\n\n                response\n                    .status(404)\n                    .end();\n                return;\n            }\n\n\n            const elementURL = elementMatch.url;\n            if (!elementURL) {\n                if (this.debugAllows('warn')) {\n                    const requestTime = this.computeRequestTime(request);\n\n                    console.info(\n                        `[${time.stamp()} :: ${requestID}] (400 Bad Request) Could not handle POST ${request.path}${requestTime}`,\n                    );\n                }\n\n                response\n                    .status(400)\n                    .end();\n                return;\n            }\n\n\n            if (this.debugAllows('info')) {\n                const requestTime = this.computeRequestTime(request);\n\n                console.info(\n                    `[${time.stamp()} :: ${requestID}] (200 OK) Handled POST ${request.path}${requestTime}`,\n                );\n            }\n\n            const elementName = elementMatch.name;\n            // given the plane match, gather the planes to which it links\n            const linksTo: any[] = [];\n\n            const element = {\n                url: elementURL,\n                name: elementName,\n                json: {\n                    elements: [\n                        {\n                            name: elementName,\n                        },\n                    ],\n                },\n                linksTo,\n            };\n\n            response.json({\n                element,\n            });\n        } catch (error) {\n            if (this.debugAllows('error')) {\n                const requestTime = this.computeRequestTime(request);\n\n                console.error(\n                    `[${time.stamp()} :: ${requestID}] (500 Server Error) Could not handle POST ${request.path}${requestTime}`,\n                    error,\n                );\n            }\n\n            response\n                .status(500)\n                .send(this.template?.errorHtml || SERVER_ERROR_TEMPLATE);\n\n            return;\n        }\n    }\n\n    private ignoreGetRequest(\n        path: string,\n    ) {\n        for (const ignore of this.options.ignore) {\n            const normalizedIgnore = ignore.endsWith('/') && ignore.length > 1\n                ? ignore.slice(0, ignore.length - 1)\n                : ignore\n\n            if (path === normalizedIgnore) {\n                return true;\n            }\n\n            if (normalizedIgnore.endsWith('/*')) {\n                const curatedIgnore = normalizedIgnore.replace('/*', '');\n\n                if (path.startsWith(curatedIgnore)) {\n                    return true;\n                }\n            }\n        }\n\n        return false;\n    }\n\n    private resolveMatchingPath(\n        preserveResult: PluridPreserveResponse | void,\n        path: string,\n    ) {\n        const redirect = preserveResult ? preserveResult.redirect : '';\n        const externalRedirect = !!(redirect?.startsWith('http'));\n        const matchingPath = redirect || path;\n\n        return {\n            externalRedirect,\n            matchingPath,\n        };\n    }\n\n    private async resolvePreserve(\n        request: express.Request,\n        response: express.Response,\n    ) {\n        const catchAll = this.preserves.find(\n            preserve => preserve.serve === CATCH_ALL_ROUTE,\n        );\n\n        const notFound = this.preserves.find(\n            preserve => preserve.serve === NOT_FOUND_ROUTE,\n        );\n\n        const isoMatch = this.isoMatcher.match(\n            request.originalUrl,\n            'route',\n        );\n\n        let preserveOnServe: undefined | PluridPreserveOnServe<\n            IsoMatcherRouteResult<PluridReactComponent<any>> | undefined,\n            express.Request,\n            express.Response\n        >;\n        let preserveAfterServe: undefined | PluridPreserveAfterServe<\n            IsoMatcherRouteResult<PluridReactComponent<any>> | undefined,\n            express.Request,\n            express.Response\n        >;\n        let preserveOnError: undefined | PluridPreserveOnError<\n            IsoMatcherRouteResult<PluridReactComponent<any>> | undefined,\n            express.Request,\n            express.Response\n        >;\n\n        if (\n            isoMatch\n            || catchAll\n            || notFound\n        ) {\n            const preserve = catchAll\n                ? catchAll\n                : notFound && !isoMatch\n                    ? notFound\n                    : this.preserves.find(\n                        preserve => preserve.serve === isoMatch?.data.value\n                    );\n\n            if (preserve) {\n                preserveOnServe = preserve.onServe;\n                preserveAfterServe = preserve.afterServe;\n                preserveOnError = preserve.onError;\n            }\n        }\n\n        let preserveResult: undefined | PluridPreserveResponse;\n        if (preserveOnServe) {\n            const transmission: PluridPreserveTransmission<\n                IsoMatcherRouteResult<PluridReactComponent<any>> | undefined,\n                express.Request,\n                express.Response\n            > = {\n                context: {\n                    route: request.originalUrl,\n                    match: isoMatch,\n                },\n                request,\n                response,\n            };\n\n            try {\n                preserveResult = await preserveOnServe(transmission);\n\n                if (preserveResult) {\n                    if (preserveResult.responded) {\n                        return {\n                            preserveResponded: true,\n                            preserveResult,\n                            preserveAfterServe,\n                        };\n                    }\n                }\n            } catch (error) {\n                if (preserveOnError) {\n                    const onErrorResponse = await preserveOnError(\n                        error,\n                        transmission,\n                    );\n\n                    if (onErrorResponse) {\n                        if (onErrorResponse.responded) {\n                            return {\n                                preserveResponded: true,\n                                preserveResult,\n                                preserveAfterServe,\n                            };\n                        }\n\n                        if (!onErrorResponse.depreserve) {\n                            return {\n                                preserveResponded: false,\n                                preserveResult,\n                                preserveAfterServe,\n                            };\n                        }\n                    }\n                }\n            }\n        }\n\n        return {\n            preserveResponded: false,\n            preserveResult,\n            preserveAfterServe,\n        };\n    }\n\n    private async resolvePreserveAfterServe(\n        preserveAfterServe: PluridPreserveAfterServe<\n            IsoMatcherRouteResult<PluridReactComponent<any>> | undefined,\n            express.Request,\n            express.Response\n        > | undefined,\n        request: express.Request,\n        response: express.Response,\n    ) {\n        if (preserveAfterServe) {\n            const isoMatch = this.isoMatcher.match(\n                request.originalUrl,\n                'route',\n            );\n\n            const transmission: PluridPreserveTransmission<\n                IsoMatcherRouteResult<PluridReactComponent<any>> | undefined,\n                express.Request,\n                express.Response\n            > = {\n                context: {\n                    route: request.originalUrl,\n                    match: isoMatch,\n                },\n                request,\n                response,\n            };\n\n            await preserveAfterServe(transmission);\n        }\n    }\n\n    private async handleGateway(\n        path: string,\n        request: express.Request,\n        preserveResult: any,\n    ) {\n        const {\n            gatewayEndpoint,\n        } = this.options;\n\n        if (path !== gatewayEndpoint) {\n            return;\n        }\n\n        const gatewayRoute = {\n            path: {\n                value: gatewayEndpoint,\n            },\n            pathname: gatewayEndpoint,\n            parameters: {},\n            query: {\n                __gatewayQuery: request.originalUrl,\n            },\n            fragments: {\n                texts: [],\n                elements: [],\n            },\n            route: gatewayEndpoint,\n        };\n\n        // const renderer = await this.renderApplication(\n        //     gatewayRoute,\n        //     preserveResult,\n        // );\n\n        // return renderer.html();\n        return '';\n    }\n\n\n    private async renderApplication(\n        isoMatch: IsoMatcherRouteResult<PluridReactComponent>,\n        preserveResult: PluridPreserveResponse | undefined,\n        matchedPlane?: any,\n    ) {\n        const globals = preserveResult?.globals;\n\n        const mergedHtmlLanguage = preserveResult?.template?.htmlLanguage\n            || this.template?.htmlLanguage;\n\n        const pluridMetastate = await serverComputeMetastate(\n            isoMatch,\n            this.routes,\n            globals,\n            this.options.hostname,\n        );\n\n        const {\n            content,\n            styles,\n        } = await this.getContentAndStyles(\n            isoMatch,\n            pluridMetastate,\n            preserveResult,\n            matchedPlane,\n        );\n\n        const stringedStyles = this.styles.reduce(\n            (accumulator, style) => accumulator + style,\n            '',\n        );\n        const preserveStyles = preserveResult?.template?.styles?.join(' ') || '';\n        const mergedStyles = styles\n            + stringedStyles\n            + preserveStyles;\n\n        const {\n            helmet,\n        }: any = this.helmet;\n\n        const helmetHead = helmet ? `\n            ${helmet.meta.toString()}\n            ${helmet.title.toString()}\n            ${helmet.base.toString()}\n            ${helmet.link.toString()}\n            ${helmet.style.toString()}\n            ${helmet.noscript.toString()}\n            ${helmet.script.toString()}\n        ` : '';\n\n        // Static head (favicon, manifest, default title/meta/links) from the\n        // template config, placed AFTER the helmet output so that per-route\n        // <Helmet> tags (which appear first) override these defaults.\n        const head = helmetHead + this.buildStaticHead();\n\n        const htmlAttributes = {\n            ...this.template?.htmlAttributes,\n            ...helmet?.htmlAttributes.toComponent(),\n        };\n        const mergedHtmlAttributes = recordToString(htmlAttributes)\n            + (preserveResult?.template?.htmlAttributes || '');\n\n        const bodyAttributes = helmet?.bodyAttributes.toString() || '';\n        const preserveBodyAttributes = preserveResult?.template?.bodyAttributes || '';\n        const mergedBodyAttributes = bodyAttributes\n            + preserveBodyAttributes;\n\n        const headScripts = this.template?.headScripts || [];\n        const mergedHeadScripts = [\n            ...headScripts,\n            ...(preserveResult?.template?.headScripts || []),\n        ];\n\n        const bodyScripts = this.template?.bodyScripts || [];\n        const mergedBodyScripts = [\n            ...bodyScripts,\n            ...(preserveResult?.template?.bodyScripts || []),\n        ];\n\n\n        const renderer = new PluridRenderer({\n            htmlLanguage: mergedHtmlLanguage,\n            head,\n            htmlAttributes: mergedHtmlAttributes,\n            bodyAttributes: mergedBodyAttributes,\n            defaultStyle: this.template?.defaultStyle,\n            styles: mergedStyles,\n            headScripts: mergedHeadScripts,\n            bodyScripts: mergedBodyScripts,\n            vendorScriptSource: this.template?.vendorScriptSource,\n            mainScriptSource: this.template?.mainScriptSource,\n            root: this.template?.root,\n            content,\n            defaultPreloadedPluridMetastate: this.template?.defaultPreloadedPluridMetastate,\n            pluridMetastate: JSON.stringify(pluridMetastate),\n            globals,\n            minify: this.template?.minify,\n        });\n\n        return renderer;\n    }\n\n    /**\n     * Build the static `<head>` markup from the template config (favicon set,\n     * manifest, default title / meta / links). Returns an empty string when none\n     * are configured, so the head is byte-identical to before for existing apps.\n     */\n    private buildStaticHead(): string {\n        const template = this.template;\n\n        if (!template) {\n            return '';\n        }\n\n        const escapeAttribute = (value: string) => value\n            .replace(/&/g, '&amp;')\n            .replace(/\"/g, '&quot;')\n            .replace(/</g, '&lt;');\n        const escapeText = (value: string) => value\n            .replace(/&/g, '&amp;')\n            .replace(/</g, '&lt;')\n            .replace(/>/g, '&gt;');\n\n        const parts: string[] = [];\n\n        const favicon = template.favicon;\n        if (typeof favicon === 'string') {\n            parts.push(`<link rel=\"icon\" href=\"${escapeAttribute(favicon)}\">`);\n        } else if (favicon) {\n            if (favicon.icon) {\n                parts.push(`<link rel=\"icon\" href=\"${escapeAttribute(favicon.icon)}\">`);\n            }\n            if (favicon.apple) {\n                parts.push(`<link rel=\"apple-touch-icon\" href=\"${escapeAttribute(favicon.apple)}\">`);\n            }\n            for (const [size, href] of Object.entries(favicon.sizes || {})) {\n                parts.push(`<link rel=\"icon\" sizes=\"${escapeAttribute(size)}\" href=\"${escapeAttribute(href)}\">`);\n            }\n            if (favicon.maskIcon) {\n                const color = favicon.themeColor\n                    ? ` color=\"${escapeAttribute(favicon.themeColor)}\"`\n                    : '';\n                parts.push(`<link rel=\"mask-icon\" href=\"${escapeAttribute(favicon.maskIcon)}\"${color}>`);\n            }\n            if (favicon.themeColor) {\n                parts.push(`<meta name=\"theme-color\" content=\"${escapeAttribute(favicon.themeColor)}\">`);\n            }\n        }\n\n        if (template.manifest) {\n            parts.push(`<link rel=\"manifest\" href=\"${escapeAttribute(template.manifest)}\">`);\n        }\n\n        const head = template.head;\n        if (head) {\n            if (head.title) {\n                parts.push(`<title>${escapeText(head.title)}</title>`);\n            }\n            if (head.description) {\n                parts.push(`<meta name=\"description\" content=\"${escapeAttribute(head.description)}\">`);\n            }\n            for (const meta of head.meta || []) {\n                const selector = meta.name\n                    ? `name=\"${escapeAttribute(meta.name)}\"`\n                    : meta.property\n                        ? `property=\"${escapeAttribute(meta.property)}\"`\n                        : '';\n                if (!selector) {\n                    continue;\n                }\n                parts.push(`<meta ${selector} content=\"${escapeAttribute(meta.content)}\">`);\n            }\n            for (const link of head.links || []) {\n                parts.push(`<link rel=\"${escapeAttribute(link.rel)}\" href=\"${escapeAttribute(link.href)}\">`);\n            }\n        }\n\n        if (parts.length === 0) {\n            return '';\n        }\n\n        return '\\n            ' + parts.join('\\n            ');\n    }\n\n    private async getContentAndStyles(\n        isoMatch: IsoMatcherRouteResult<PluridReactComponent>,\n        pluridMetastate: any,\n        preserveResult: PluridPreserveResponse | undefined,\n        matchedPlane?: any,\n    ) {\n        const stylesheet = new ServerStyleSheet();\n        let content = '';\n        let styles = '';\n\n        try {\n            // based on the route get the specific plurids to be rendered\n            // given the matchedRoute compute the metastate\n            // const pluridMetastate = serverComputeMetastate(\n            //     matchedRoute,\n            //     this.paths,\n            // );\n            // const gateway = matchedRoute.pathname === '/gateway';\n            // const gatewayQuery = matchedRoute.query.__gatewayQuery;\n            const gateway = false;\n            const gatewayQuery = '';\n            const {\n                gatewayEndpoint,\n            } = this.options;\n\n            const contentHandler = new PluridContentGenerator({\n                services: this.services,\n                stylesheet,\n                exterior: this.exterior,\n                shell: this.shell,\n                routerProperties: this.routerProperties,\n                helmet: this.helmet,\n                routes: this.routes,\n                planes: this.planes,\n                pluridMetastate,\n                gateway,\n                gatewayEndpoint,\n                gatewayQuery,\n                preserveResult,\n\n                pathname: isoMatch.match.value,\n                hostname: this.options.hostname,\n                matchedPlane: isoMatch.kind === 'RoutePlane'\n                    ? {\n                        value: isoMatch.match.value,\n                    }\n                    : undefined,\n            });\n\n            content = await contentHandler.render();\n\n            styles = stylesheet.getStyleTags();\n        } catch (error) {\n            if (\n                this.options.debug !== 'none'\n                && !this.options.quiet\n            ) {\n                const errorText = `${this.options.serverName} Error: Something went wrong in getContentAndStyles().`;\n\n                if (this.debugAllows('error')) {\n                    console.error(\n                        errorText,\n                        error,\n                    );\n                }\n            }\n\n            return {\n                content: '',\n                styles: '',\n            };\n        } finally {\n            stylesheet.seal();\n        }\n\n        return {\n            content,\n            styles,\n        };\n    }\n\n    private computeRequestTime(\n        request: express.Request,\n    ) {\n        const requestTime = (request as ServerRequest).requestTime;\n\n        if (!requestTime) {\n            return '';\n        }\n\n        const now = Date.now();\n        const difference = now - requestTime;\n\n        return ` in ${difference} ms`;\n    }\n\n\n    private handleOptions(\n        partialOptions?: PluridServerPartialOptions,\n    ) {\n        const options: PluridServerOptions = {\n            serverName: partialOptions?.serverName || DEFAULT_SERVER_OPTIONS.SERVER_NAME,\n            hostname: partialOptions?.hostname || DEFAULT_SERVER_OPTIONS.HOSTNAME,\n            quiet: partialOptions?.quiet || DEFAULT_SERVER_OPTIONS.QUIET,\n            debug: partialOptions?.debug\n                ? partialOptions?.debug\n                : environment.production ? 'error' : 'info',\n            compression: partialOptions?.compression ?? DEFAULT_SERVER_OPTIONS.COMPRESSION,\n            open: partialOptions?.open ?? DEFAULT_SERVER_OPTIONS.OPEN,\n            buildDirectory: partialOptions?.buildDirectory || DEFAULT_SERVER_OPTIONS.BUILD_DIRECTORY,\n            assetsDirectory: partialOptions?.assetsDirectory || DEFAULT_SERVER_OPTIONS.ASSETS_DIRECTORY,\n            publicDirectory: partialOptions?.publicDirectory || '',\n            gatewayEndpoint: partialOptions?.gatewayEndpoint || DEFAULT_SERVER_OPTIONS.GATEWAY,\n            staticCache: partialOptions?.staticCache || 0,\n            ignore: partialOptions?.ignore || [],\n            stillsDirectory: partialOptions?.stillsDirectory || DEFAULT_SERVER_OPTIONS.STILLS_DIRECTORY,\n            stiller: partialOptions?.stiller || defaultStillerOptions,\n            attachSignalHandlers: partialOptions?.attachSignalHandlers ?? true,\n        };\n        return options;\n    }\n\n    private configureServer() {\n        const clientPath = path.join(this.options.buildDirectory, './client');\n\n        this.serverApplication.disable('x-powered-by');\n\n        this.serverApplication.use(\n            (request, _, next) => {\n                const requestID = uuid.generate();\n                (request as ServerRequest).requestID = requestID;\n\n                const requestTime = Date.now();\n                (request as ServerRequest).requestTime = requestTime;\n\n                next();\n            }\n        );\n\n        if (this.options.compression) {\n            this.serverApplication.use(\n                compression() as any, // @types/compression targets Express 4's handler type\n            );\n\n            this.serverApplication.get(\n                '/vendor.js',\n                (request, response, next) => {\n                    response.setHeader(\n                        'Content-Type', 'application/javascript',\n                    );\n\n                    const vendorBrotliExists = fs.existsSync(\n                        path.join(clientPath, 'vendor.js.br')\n                    );\n                    const acceptEncoding = request.header('Accept-Encoding');\n\n                    if (acceptEncoding?.includes('br') && vendorBrotliExists) {\n                        request.url += '.br';\n                        response.set('Content-Encoding', 'br');\n                        next();\n                        return;\n                    }\n\n                    next();\n                },\n            );\n        }\n\n        this.serverApplication.use(\n            express.static(clientPath, {\n                maxAge: this.options.staticCache,\n            }),\n        );\n\n        // Serve the public directory (favicon, og-image, manifest, robots) at `/`.\n        // `index: false` keeps it from hijacking the `/` SSR route; the mount is\n        // skipped unless the directory exists, so apps without one are unaffected.\n        const publicPath = this.options.publicDirectory\n            || path.join(this.options.buildDirectory, 'public');\n\n        if (fs.existsSync(publicPath)) {\n            this.serverApplication.use(\n                express.static(publicPath, {\n                    index: false,\n                    maxAge: this.options.staticCache,\n                }),\n            );\n        }\n\n        this.loadMiddleware();\n    }\n\n    private loadMiddleware() {\n        for (const middleware of this.middleware) {\n            this.serverApplication.use(\n                (req, res, next) => middleware(req, res, next),\n            );\n        }\n    }\n\n\n    private open(\n        serverlink: string,\n    ) {\n        try {\n            const processDoNotOpen = process.env.PLURID_OPEN === 'false'\n                ? true\n                : false;\n\n            if (processDoNotOpen) {\n                return;\n            }\n\n            if (this.options.open) {\n                open(serverlink);\n            }\n        } catch (error) {\n            return;\n        }\n    }\n\n    private debugAllows(\n        level: DebugLevels,\n    ) {\n        if (this.options.quiet) {\n            return false;\n        }\n\n        if (this.options.debug === 'none') {\n            return false;\n        }\n\n        switch (level) {\n            case 'error':\n                return true;\n            case 'warn':\n                if (\n                    this.options.debug === 'error'\n                ) {\n                    return false;\n                }\n                return true;\n            case 'info':\n                if (\n                    this.options.debug === 'error'\n                    || this.options.debug === 'warn'\n                ) {\n                    return false;\n                }\n\n                return true;\n            default:\n                return false;\n        }\n    }\n}\n// #endregion module\n\n\n\n// #region exports\nexport default PluridServer;\n// #endregion exports\n","// #region module\nexport const DEFAULT_SERVER_PORT = process.env.PORT\n    ? parseInt(process.env.PORT)\n    : 8080;\n\n\nexport const DEFAULT_SERVER_OPTIONS_SERVER_NAME = 'Plurid Server';\nexport const DEFAULT_SERVER_OPTIONS_HOSTNAME = 'origin';\nexport const DEFAULT_SERVER_OPTIONS_QUIET = false;\nexport const DEFAULT_SERVER_OPTIONS_COMPRESSION = true;\nexport const DEFAULT_SERVER_OPTIONS_OPEN = false;\nexport const DEFAULT_SERVER_OPTIONS_BUILD_DIRECTORY = 'build';\nexport const DEFAULT_SERVER_OPTIONS_ASSETS_DIRECTORY = 'assets';\nexport const DEFAULT_SERVER_OPTIONS_STILLS_DIRECTORY = 'stills';\nexport const DEFAULT_SERVER_OPTIONS_GATEWAY = '/gateway';\n\nexport const DEFAULT_SERVER_OPTIONS = {\n    SERVER_NAME: DEFAULT_SERVER_OPTIONS_SERVER_NAME,\n    HOSTNAME: DEFAULT_SERVER_OPTIONS_HOSTNAME,\n    QUIET: DEFAULT_SERVER_OPTIONS_QUIET,\n    COMPRESSION: DEFAULT_SERVER_OPTIONS_COMPRESSION,\n    OPEN: DEFAULT_SERVER_OPTIONS_OPEN,\n    BUILD_DIRECTORY: DEFAULT_SERVER_OPTIONS_BUILD_DIRECTORY,\n    ASSETS_DIRECTORY: DEFAULT_SERVER_OPTIONS_ASSETS_DIRECTORY,\n    STILLS_DIRECTORY: DEFAULT_SERVER_OPTIONS_STILLS_DIRECTORY,\n    GATEWAY: DEFAULT_SERVER_OPTIONS_GATEWAY,\n};\n\n\nexport const DEFAULT_RENDERER_LANGUAGE = 'en';\nexport const DEFAULT_RENDERER_ROOT = 'root';\nexport const DEFAULT_RENDERER_PLURID_STATE = '{}';\nexport const DEFAULT_RENDERER_VENDOR_SCRIPT_SOURCE = '/vendor.js';\nexport const DEFAULT_RENDERER_MAIN_SCRIPT_SOURCE = '/index.js';\nexport const DEFAULT__PRELOADED_PLURID_METASTATE__ = '__PRELOADED_PLURID_METASTATE__';\n\n\n// String sentinel meaning \"all routes\" — used to match a catch-all `preserve` (`preserve.serve === '*'`).\nexport const CATCH_ALL_ROUTE = '*';\n// The Express route PATTERN for the catch-all GET. A RegExp (not the bare `'*'` string) so it works under\n// Express 5 / path-to-regexp v8, where unnamed string wildcards are no longer valid.\nexport const CATCH_ALL_ROUTE_PATTERN = /.*/;\nexport const NOT_FOUND_ROUTE = process.env.PLURID_SERVER_NOT_FOUND_ROUTE || '/not-found';\nexport const PTTP_ROUTE = process.env.PLURID_SERVER_PTTP_ROUTE || '/pttp';\n\n\n\nexport const environment = {\n    production: process.env.ENV_MODE === 'production',\n    development: process.env.ENV_MODE === 'development',\n};\n// #endregion module\n","// #region imports\n    // #region external\n    import {\n        PluridStillerOptions,\n    } from '~data/interfaces';\n    // #endregion external\n// #endregion imports\n\n\n\n// #region module\nexport const defaultStillerOptions: PluridStillerOptions = {\n    waitUntil: 'networkidle0',\n    timeout: 30_000,\n    ignore: [],\n};\n// #endregion module\n","// #region imports\n    // #region libraries\n    import {\n        minify,\n    } from 'html-minifier-terser';\n\n    import {\n        Theme,\n    } from '@plurid/plurid-themes';\n    // #endregion libraries\n// #endregion imports\n\n\n\n// #region module\nexport const cleanTemplate = (\n    template: string,\n) => {\n    return minify(\n        template,\n        {\n            collapseWhitespace: true,\n            conservativeCollapse: true,\n            collapseInlineTagWhitespace: false,\n        },\n    );\n}\n\n\nexport const resolveBackgroundStyle = (\n    store: string,\n) => {\n    const defaultBackground = {\n        gradientBackground: 'hsl(220, 10%, 32%)',\n        gradientForeground: 'hsl(220, 10%, 18%)',\n    };\n\n    try {\n        const storeJSON = JSON.parse(store);\n        const generalPluridTheme: Theme | undefined = storeJSON?.themes?.general;\n\n        if (!generalPluridTheme) {\n            return defaultBackground;\n        }\n\n        const gradientBackground = generalPluridTheme.type === 'dark'\n            ? generalPluridTheme.backgroundColorTertiary\n            : generalPluridTheme.backgroundColorPrimary\n        const gradientForeground = generalPluridTheme.type === 'dark'\n            ? generalPluridTheme.backgroundColorPrimary\n            : generalPluridTheme.backgroundColorTertiary\n\n        return {\n            gradientBackground,\n            gradientForeground,\n        };\n    } catch (error) {\n        return defaultBackground;\n    }\n}\n\n\n/**\n * Escape a value destined for a double-quoted HTML attribute, so a value containing `\"` (or angle\n * brackets) cannot break out of the attribute / tag. `&` first to avoid double-encoding.\n */\nexport const escapeAttribute = (\n    value: string,\n) => {\n    return String(value)\n        .replace(/&/g, '&amp;')\n        .replace(/\"/g, '&quot;')\n        .replace(/</g, '&lt;')\n        .replace(/>/g, '&gt;');\n}\n\n\nexport const recordToString = (\n    record: Record<string, string> | undefined,\n) => {\n    if (!record) {\n        return '';\n    }\n\n    // Space-separated `key=\"value\"` pairs, values escaped against attribute/tag breakout.\n    return Object.entries(record)\n        .map(([key, value]) => `${key}=\"${escapeAttribute(value)}\"`)\n        .join(' ');\n}\n\n\nexport const assetsPathRewrite = (\n    content: string,\n) => {\n    return content.replace(\n        /=\"client\\//g,\n        '=\"/',\n    );\n}\n\n\nexport const safeStore = (\n    store: string,\n) => {\n    return store.replace(\n        /</g,\n        '\\\\u003c',\n    );\n}\n\n\nexport const globalsInjector = (\n    globals: Record<string, string>,\n) => {\n    let globalsScript = '';\n\n    for (const [key, value] of Object.entries(globals)) {\n        const globalScript = `window.${key} = ${value};\\n`;\n        globalsScript += globalScript;\n    }\n\n    return globalsScript;\n}\n// #endregion module\n","// #region imports\n    // #region external\n    import {\n        cleanTemplate,\n    } from '~utilities/template';\n    // #endregion external\n// #endregion imports\n\n\n\n// #region module\nexport const NOT_FOUND_TEMPLATE = cleanTemplate(`\n<!DOCTYPE html>\n<html>\n    <head>\n        <title>[404] Not Found</title>\n        <style>\n            html, body {\n                margin: 0;\n                background: #242b33;\n                color: #ddd;\n                user-select: none;\n            }\n\n            .not-found {\n                position: absolute;\n                top: 50%;\n                left: 50%;\n                transform: translate(-50%, -50%);\n                font-family: 'Ubuntu', -apple-system, system-ui, BlinkMacSystemFont, 'Segoe UI', Roboto;\n            }\n        </style>\n    </head>\n\n    <body>\n        <div class=\"not-found\">[404] Not Found</div>\n    </body>\n</html>\n`);\n\n\nexport const SERVER_ERROR_TEMPLATE = cleanTemplate(`\n<!DOCTYPE html>\n<html>\n    <head>\n        <title>[500] Server Error</title>\n        <style>\n            html, body {\n                margin: 0;\n                background: #242b33;\n                color: #ddd;\n                user-select: none;\n            }\n\n            .error {\n                position: absolute;\n                top: 50%;\n                left: 50%;\n                transform: translate(-50%, -50%);\n                font-family: 'Ubuntu', -apple-system, system-ui, BlinkMacSystemFont, 'Segoe UI', Roboto;\n            }\n        </style>\n    </head>\n\n    <body>\n        <div class=\"error\">[500] Server Error</div>\n    </body>\n</html>\n`);\n// #endregion module\n","// #region imports\n    // #region external\n    import {\n        cleanTemplate,\n        globalsInjector,\n        safeStore,\n    } from '~utilities/template';\n\n    import {\n        RendererTemplateData,\n    } from '~data/interfaces';\n    // #endregion external\n// #endregion imports\n\n\n\n// #region module\nconst template = async (\n    data: RendererTemplateData,\n) => {\n    const {\n        htmlLanguage,\n        head,\n        htmlAttributes,\n        bodyAttributes,\n        defaultStyle,\n        styles,\n        headScripts,\n        bodyScripts,\n        vendorScriptSource,\n        mainScriptSource,\n        root,\n        content,\n        defaultPreloadedPluridMetastate,\n        pluridMetastate,\n        globals,\n        minify,\n    } = data;\n\n    const injectedGlobals = globalsInjector(globals);\n\n    const templateString = `\n<!DOCTYPE html>\n<html lang=\"${htmlLanguage}\" ${htmlAttributes}>\n    <head>\n        ${head}\n\n        ${defaultStyle && (\n            `<style>\n                ${defaultStyle}\n            </style>`\n        )}\n\n        ${styles}\n\n        ${headScripts.join('\\n')}\n\n        ${vendorScriptSource ? `<script src=\"${vendorScriptSource}\"></script>` : ''}\n        <script defer src=\"${mainScriptSource}\"></script>\n    </head>\n    <body ${bodyAttributes}>\n        <div id=\"${root}\">${content}</div>\n\n        <script>\n            ${injectedGlobals}\n            window.${defaultPreloadedPluridMetastate} = ${safeStore(pluridMetastate)};\n        </script>\n\n        ${bodyScripts.join('\\n')}\n    </body>\n</html>\n    `;\n\n    if (!minify) {\n        return templateString;\n    }\n\n    return cleanTemplate(templateString);\n}\n// #endregion module\n\n\n\n// #region exports\nexport default template;\n// #endregion exports\n","// #region imports\n    // #region external\n    import {\n        DEFAULT_RENDERER_LANGUAGE,\n        DEFAULT_RENDERER_ROOT,\n        DEFAULT_RENDERER_PLURID_STATE,\n        DEFAULT_RENDERER_MAIN_SCRIPT_SOURCE,\n        DEFAULT_RENDERER_VENDOR_SCRIPT_SOURCE,\n        DEFAULT__PRELOADED_PLURID_METASTATE__,\n    } from '~data/constants';\n\n    import {\n        PluridRendererConfiguration,\n        RendererTemplateData,\n    } from '~data/interfaces';\n\n    import {\n        resolveBackgroundStyle,\n        assetsPathRewrite,\n    } from '~utilities/template';\n    // #endregion external\n\n\n    // #region internal\n    import template from './template';\n    // #endregion internal\n// #endregion imports\n\n\n\n// #region module\nclass PluridRenderer {\n    private htmlLanguage: string;\n    private head: string;\n    private htmlAttributes: string;\n    private bodyAttributes: string;\n    private defaultStyle: string;\n    private styles: string;\n    private headScripts: string[];\n    private bodyScripts: string[];\n    private vendorScriptSource: string;\n    private mainScriptSource: string;\n    private root: string;\n    private content: string;\n    private defaultPreloadedPluridMetastate: string;\n    private pluridMetastate: string;\n    private globals: Record<string, string>;\n    private minify: boolean;\n\n    constructor(\n        configuration: PluridRendererConfiguration,\n    ) {\n        const {\n            htmlLanguage,\n            head,\n            htmlAttributes,\n            bodyAttributes,\n            defaultStyle,\n            styles,\n            headScripts,\n            bodyScripts,\n            vendorScriptSource,\n            mainScriptSource,\n            content,\n            root,\n            defaultPreloadedPluridMetastate,\n            pluridMetastate,\n            globals,\n            minify,\n        } = configuration;\n\n        const {\n            gradientBackground,\n            gradientForeground,\n        // The metastate carries `themes.general` (see `serverComputeMetastate`), so the SSR'd background\n        // gradient matches the active theme; `resolveBackgroundStyle` falls back to a default if it can't parse.\n        } = resolveBackgroundStyle(pluridMetastate || '');\n\n        const defaultStyleBasic = `\n            body {\n                background: radial-gradient(ellipse at center, ${gradientBackground} 0%, ${gradientForeground} 100%);\n                height: 100%;\n                margin: 0;\n            }\n        `;\n\n        this.htmlLanguage = htmlLanguage || DEFAULT_RENDERER_LANGUAGE;\n        this.head = head || '';\n        this.htmlAttributes = htmlAttributes;\n        this.bodyAttributes = bodyAttributes || '';\n        this.defaultStyle = defaultStyle ?? defaultStyleBasic;\n        this.styles = styles;\n        this.headScripts = headScripts;\n        this.bodyScripts = bodyScripts;\n        // `??` (not `||`) so an explicit empty string is preserved as \"no vendor\n        // chunk\" (single-bundle builds) and the template skips the `<script>`;\n        // `undefined` still falls back to the default `/vendor.js`.\n        this.vendorScriptSource = vendorScriptSource ?? DEFAULT_RENDERER_VENDOR_SCRIPT_SOURCE;\n        this.mainScriptSource = mainScriptSource || DEFAULT_RENDERER_MAIN_SCRIPT_SOURCE;\n        this.root = root || DEFAULT_RENDERER_ROOT;\n        this.content = assetsPathRewrite(content) || '';\n        this.defaultPreloadedPluridMetastate = defaultPreloadedPluridMetastate || DEFAULT__PRELOADED_PLURID_METASTATE__;\n        this.pluridMetastate = pluridMetastate || DEFAULT_RENDERER_PLURID_STATE;\n        this.globals = globals ?? {};\n        this.minify = minify ?? true;\n    }\n\n    public async html() {\n        const data: RendererTemplateData = {\n            htmlLanguage: this.htmlLanguage,\n            head: this.head,\n            htmlAttributes: this.htmlAttributes,\n            bodyAttributes: this.bodyAttributes,\n            defaultStyle: this.defaultStyle,\n            styles: this.styles,\n            headScripts: this.headScripts,\n            bodyScripts: this.bodyScripts,\n            vendorScriptSource: this.vendorScriptSource,\n            mainScriptSource: this.mainScriptSource,\n            root: this.root,\n            content: this.content,\n            defaultPreloadedPluridMetastate: this.defaultPreloadedPluridMetastate,\n            pluridMetastate: this.pluridMetastate,\n            globals: this.globals,\n            minify: this.minify,\n        };\n\n        return template(data);\n    }\n}\n// #endregion module\n\n\n\n// #region exports\nexport default PluridRenderer;\n// #endregion exports\n","// #region imports\n    // #region libraries\n    import React from 'react';\n\n    import {\n        renderToString,\n    } from 'react-dom/server';\n\n    import {\n        StyleSheetManager,\n    } from 'styled-components';\n\n    import {\n        HelmetProvider,\n    } from 'react-helmet-async';\n\n    import {\n        PluridProvider,\n        PluridRouterStatic,\n    } from '@plurid/plurid-react';\n    // #endregion libraries\n\n\n    // #region external\n    import {\n        PluridContentGeneratorData,\n    } from '~data/interfaces';\n\n    import wrapping from '~utilities/wrapping';\n    // #endregion external\n// #endregion imports\n\n\n\n// #region module\nclass PluridContentGenerator {\n    private data: PluridContentGeneratorData;\n\n\n    constructor(\n        data: PluridContentGeneratorData,\n    ) {\n        this.data = data;\n    }\n\n\n    public async render() {\n        const {\n            pluridMetastate,\n            routes,\n            planes,\n            exterior,\n            shell,\n            routerProperties,\n            gateway,\n            gatewayEndpoint,\n            gatewayQuery,\n            helmet,\n            services,\n            stylesheet,\n            preserveResult,\n            matchedPlane,\n\n            pathname,\n            hostname,\n        } = this.data;\n\n        const RoutedApplication = () => (\n            <PluridProvider\n                metastate={pluridMetastate}\n            >\n                <PluridRouterStatic\n                    path={pathname}\n                    directPlane={matchedPlane?.value}\n                    routes={routes}\n                    planes={planes}\n                    exterior={exterior}\n                    shell={shell}\n                    gateway={gateway}\n                    gatewayEndpoint={gatewayEndpoint}\n                    gatewayQuery={gatewayQuery}\n                    hostname={hostname}\n                    routerProperties={routerProperties}\n                />\n            </PluridProvider>\n        );\n\n        let Wrap = wrapping(\n            HelmetProvider,\n            RoutedApplication,\n            {\n                context: helmet,\n            },\n        );\n\n        for (const service of services) {\n            const preserveProperties = preserveResult?.providers?.[service.name];\n\n            Wrap = wrapping(\n                service.Provider,\n                Wrap,\n                {\n                    ...service.properties,\n                    ...preserveProperties,\n                },\n            );\n        }\n\n        const content = renderToString(\n            <StyleSheetManager\n                sheet={stylesheet.instance}\n            >\n                <Wrap />\n            </StyleSheetManager>\n        );\n\n        return content;\n    }\n}\n// #endregion module\n\n\n\n// #region exports\nexport default PluridContentGenerator;\n// #endregion exports\n","// #region imports\n    // #region libraries\n    import React from 'react';\n    // #endregion libraries\n// #endregion imports\n\n\n\n// #region module\nconst wrapping = (\n    WrappedComponent: any,\n    WrappeeComponent: any,\n    properties: any,\n) => {\n    return class extends React.Component {\n        constructor(props: any) {\n            super(props);\n        }\n\n        render() {\n            return (\n                <WrappedComponent\n                    {...properties}\n                >\n                    <WrappeeComponent />\n                </WrappedComponent>\n            )\n        }\n    }\n}\n// #endregion module\n\n\n\n// #region exports\nexport default wrapping;\n// #endregion exports\n","// #region imports\n    // #region libraries\n    import path from 'path';\n\n    import {\n        existsSync,\n        promises as fs,\n    } from 'fs';\n    // #endregion libraries\n\n\n    // #region external\n    import {\n        PluridServerOptions,\n        StilledPage,\n        StilledMetadataEntry,\n    } from '~data/interfaces';\n    // #endregion external\n// #endregion imports\n\n\n\n// #region module\nclass StillsManager {\n    private options: PluridServerOptions;\n    private stills: Map<string, StilledPage> = new Map();\n\n    constructor(\n        options: PluridServerOptions,\n    ) {\n        this.options = options;\n        this.findStills();\n    }\n\n    public get(\n        url: string\n    ) {\n        const still = this.stills.get(url);\n\n        if (!still) {\n            return;\n        }\n\n        return still.html;\n    }\n\n    private async findStills() {\n        const {\n            buildDirectory,\n            stillsDirectory,\n        } = this.options;\n\n        const stillsLocation = `${buildDirectory}/${stillsDirectory}`;\n        const stillsPath = path.join(process.cwd(), stillsLocation);\n\n        if (!existsSync(stillsPath)) {\n            return;\n        }\n\n        try {\n            const stillsMetadata = path.join(stillsPath, 'metadata.json');\n            const stillsMetadataFile = await fs.readFile(stillsMetadata, 'utf-8');\n            const stillsMetadataJSON: StilledMetadataEntry[] | undefined = JSON.parse(stillsMetadataFile);\n\n            if (!Array.isArray(stillsMetadataJSON)) {\n                return;\n            }\n\n            for (const still of stillsMetadataJSON) {\n                const stillFilePath = path.join(stillsPath, still.name);\n                const stillFileData = await fs.readFile(stillFilePath, 'utf-8');\n                const stillFileJSON: StilledPage | undefined = JSON.parse(stillFileData);\n\n                if (!stillFileJSON) {\n                    continue;\n                }\n\n                this.stills.set(stillFileJSON.route, stillFileJSON);\n            }\n        } catch (error) {\n            if (this.options.debug !== 'none' && !this.options.quiet) {\n                const errorText = 'Plurid Server Error: Could not read stills.'\n                if (this.options.debug === 'error') {\n                    console.error(errorText, error);\n                } else {\n                    console.log(errorText);\n                }\n            }\n\n            return;\n        }\n    }\n}\n// #endregion module\n\n\n\n// #region exports\nexport default StillsManager;\n// #endregion exports\n","// #region imports\n    // #region libraries\n    import {\n        IsoMatcherPlaneResult\n    } from '@plurid/plurid-data';\n\n    import {\n        PluridReactComponent,\n    } from '@plurid/plurid-react';\n    // #endregion libraries\n// #endregion imports\n\n\n\n// #region module\nexport const resolveElementFromPlaneMatch = (\n    planeMatch: IsoMatcherPlaneResult<PluridReactComponent<any>>,\n    elementqlEndpoint: string | undefined,\n) => {\n    if (typeof planeMatch.data.component === 'function') {\n        return;\n    }\n\n    if (typeof planeMatch.data.component === 'string') {\n        return {\n            name: planeMatch.data.component,\n            url: elementqlEndpoint,\n        };\n    }\n\n    return {\n        name: planeMatch.data.component.name,\n        url: planeMatch.data.component.url || elementqlEndpoint,\n    };\n}\n// #endregion module\n","// #region imports\n    // #region libraries\n    import {\n        Socket,\n    } from 'net';\n    import http from 'http';\n\n    import express, {\n        Application,\n    } from 'express';\n    // #endregion libraries\n\n\n    // #region external\n    import {\n        PluridLiveServerOptions,\n    } from '~data/interfaces';\n    // #endregion external\n// #endregion imports\n\n\n\n// #region module\nclass LiveServer {\n    private options: PluridLiveServerOptions;\n    private expressServer: Application;\n    private httpServer: http.Server;\n    private sockets: Socket[] = [];\n\n\n    constructor(\n        options?: Partial<PluridLiveServerOptions>,\n    ) {\n        this.options = this.resolveOptions(options);\n\n        this.expressServer = express();\n        this.setupExpressServer();\n\n        this.httpServer = http.createServer(this.expressServer);\n        this.setupHttpServer();\n    }\n\n\n    private resolveOptions = (\n        options?: Partial<PluridLiveServerOptions>,\n    ) => {\n        const defaultServerPath = './source/server/index.ts';\n\n        const resolvedOptions = {\n            server: options?.server || defaultServerPath,\n        };\n\n        return resolvedOptions;\n    }\n\n    private setupExpressServer() {\n        // Not implemented — see `start()`.\n    }\n\n    private setupHttpServer() {\n        this.httpServer.on('connection', (socket) => {\n            this.sockets.push(socket);\n\n            socket.once('close', () => {\n                this.sockets.splice(this.sockets.indexOf(socket), 1);\n            });\n        });\n\n        this.httpServer.on('error', (error) => {\n            throw error;\n        });\n    }\n\n\n    public start(): never {\n        // `LiveServer` (hot-reload dev server) is a stub — its setup/start are unimplemented. Fail loudly\n        // rather than silently no-op so callers aren't misled into thinking a server started. Use a bundler\n        // dev server (tsx / Vite) for live reload; `PluridServer` is the production server.\n        throw new Error(\n            'PluridLiveServer is not implemented yet. Use `PluridServer` (production) or a bundler dev server (tsx/Vite) for live reload.',\n        );\n    }\n}\n// #endregion module\n\n\n\n// #region exports\nexport default LiveServer;\n// #endregion exports\n","// #region imports\n    // #region libraries\n    import path from 'path';\n\n    import {\n        promises as fs,\n    } from 'fs'\n\n    import {\n        fork,\n    } from 'child_process';\n\n    import detectPort from 'detect-port';\n\n    import {\n        uuid,\n    } from '@plurid/plurid-functions';\n\n    import {\n        PluridReactRoute,\n    } from '@plurid/plurid-react';\n    // #endregion libraries\n\n\n    // #region external\n    import {\n        StillsGeneratorOptions,\n    } from '~data/interfaces';\n\n    import Stiller from '../Stiller';\n    import PluridServer from '../Server';\n    // #endregion external\n// #endregion imports\n\n\n\n// #region module\nclass StillsGenerator {\n    private options: StillsGeneratorOptions;\n\n    constructor(\n        options?: Partial<StillsGeneratorOptions>,\n    ) {\n        this.options = this.resolveOptions(options);\n    }\n\n    resolveOptions(\n        options?: Partial<StillsGeneratorOptions>,\n    ) {\n        const stillsGeneratorOptions: StillsGeneratorOptions = {\n            server: options?.server ?? './build/server.js',\n            build: options?.build ?? './build/',\n        };\n\n        return stillsGeneratorOptions;\n    }\n\n    async initialize() {\n        const serverPath = path.join(process.cwd(), this.options.server);\n        const buildPath = path.join(process.cwd(), this.options.build);\n\n        // The generator reads the application routes from the BUILT server bundle — fail with an actionable\n        // message (not a raw MODULE_NOT_FOUND) if it hasn't been built yet. Handle either default-exported\n        // (esbuild/tsup `export default`) or directly-exported server instances.\n        let serverModule: any;\n        try {\n            serverModule = require(serverPath);\n        } catch (error) {\n            const reason = error instanceof Error ? error.message : String(error);\n            throw new Error(\n                `Plurid StillsGenerator: could not load the built server at '${serverPath}'. `\n                + 'Build the server first so the generator can read its routes. '\n                + `(${reason})`,\n                { cause: error },\n            );\n        }\n        const pluridServer: PluridServer = serverModule?.default ?? serverModule;\n        const serverInformation = PluridServer.analysis(pluridServer);\n\n        const stillerOptions = serverInformation.options.stiller;\n\n        const serverPort = await detectPort(9900) + '';\n\n        const child = fork(serverPath, [], {\n            stdio: 'pipe',\n            env: {\n                PORT: serverPort,\n                PLURID_OPEN: 'false',\n            },\n        });\n\n        // Always stop the forked server — even if stilling throws partway — so it never outlives the run.\n        try {\n            /**\n             * Read the application routes.\n             */\n            const stillRoutes: PluridReactRoute[] = [];\n\n            for (const route of serverInformation.routes) {\n                if (route.value.includes('/:')) {\n                    continue;\n                }\n\n                if (stillerOptions.ignore.includes(route.value)) {\n                    continue;\n                }\n\n                stillRoutes.push(route);\n            }\n\n            const stillRoutesPaths = stillRoutes.map(stillRoute => stillRoute.value);\n\n            console.info('\\n\\tParsed the following still routes:');\n\n            for (const stillRoutePath of stillRoutesPaths) {\n                console.info(`\\t  ${stillRoutePath}`);\n            }\n\n\n            /**\n             * Sleep 1.5 seconds to let the server spin up.\n             */\n            await new Promise(resolve => setTimeout(resolve, 1500));\n\n            const startTime = Date.now();\n            const estimatedDuration = 3 * serverInformation.routes.length;\n            console.info(`\\n\\tStarting to generate stills... (this may take about ${estimatedDuration} seconds)\\n`);\n\n            const stiller = new Stiller({\n                host: 'http://localhost:' + serverPort,\n                routes: [\n                    ...stillRoutesPaths,\n                ],\n                configuration: {\n                    waitUntil: stillerOptions.waitUntil,\n                    timeout: stillerOptions.timeout,\n                },\n            });\n\n            // A Stiller failure (missing puppeteer, navigation timeout) propagates out of this loop, aborting\n            // the run with the underlying reason — rather than silently writing partial/empty stills.\n            const sequence = stiller.still();\n            const stills = [];\n            let next;\n            while (\n                !(next = await sequence.next()).done\n            ) {\n                stills.push(next.value);\n            }\n\n            const endTime = Date.now();\n            const duration = (endTime - startTime) / 1000;\n            const plural = stills.length === 1 ? '' : 's';\n            console.info(`\\n\\tGenerated ${stills.length} still${plural} in ${duration.toFixed(2)} seconds.\\n`);\n\n\n            /**\n             * Generate the stills as .json in the `/stills` build directory\n             * so they can be loaded by the Plurid Server\n             *\n             * Generate a metadata.json file.\n             */\n            const stillsPath = path.join(buildPath, './stills');\n            await fs.mkdir(\n                stillsPath,\n                {\n                    recursive: true,\n                },\n            );\n\n            const metadataFile = [];\n\n            for (const still of stills) {\n                if (!still) {\n                    continue;\n                }\n\n                const stillName = uuid.generate() + '.json';\n                const metadataItem = {\n                    route: still.route,\n                    name: stillName,\n                };\n                metadataFile.push(metadataItem);\n                const stillJSON = JSON.stringify(still, null, 4);\n                const stillFile = path.join(stillsPath, stillName);\n                await fs.writeFile(stillFile, stillJSON);\n            }\n\n            const metadataFilePath = path.join(stillsPath, 'metadata.json');\n            const metadataJSON = JSON.stringify(metadataFile, null, 4);\n            await fs.writeFile(metadataFilePath, metadataJSON);\n        } finally {\n            /**\n             * Gracefully stop the forked server (it handles SIGTERM via `attachSignalHandlers`).\n             */\n            child.kill('SIGTERM');\n        }\n    }\n}\n// #endregion module\n\n\n\n// #region exports\nexport default StillsGenerator;\n// #endregion exports\n","// #region imports\n    // #region external\n    import {\n        StillerOptions,\n        StillerConfiguration,\n    } from '~data/interfaces';\n    // #endregion external\n// #endregion imports\n\n\n\n// #region module\n/**\n * Replace the rendering viewport resolution in order to reduce the loading flash.\n * Exported for unit testing — it is the one pure, deterministic piece of the Puppeteer-driven Stiller.\n * @param html\n */\nexport const replacePluridResolution = (\n    html: string,\n) => {\n    const normalResolution = 'width: 1366px; height: 768px;';\n    const zeroResolution = 'width: 0px; height: 0px;';\n    return html.replace(normalResolution, zeroResolution);\n}\n\n/**\n * https://techoverflow.net/2019/11/08/how-to-fix-puppetteer-running-as-root-without-no-sandbox-is-not-supported/\n * `process.getuid` is POSIX-only (absent on Windows) — guard before calling so the Stiller doesn't\n * crash with `process.getuid is not a function`.\n */\nconst isCurrentUserRoot = () => {\n    return typeof process.getuid === 'function' && process.getuid() === 0;\n}\n\n/**\n * Still a single route on an ALREADY-LAUNCHED browser (one browser is reused across all routes — see\n * `still()`). A fresh page per route; the page is always closed, even on navigation failure.\n */\nconst render = async (\n    browser: any,\n    host: string,\n    route: string,\n    configuration: StillerConfiguration,\n) => {\n    const start = Date.now();\n\n    const page = await browser.newPage();\n\n    try {\n        /**\n         * `networkidle0` waits for the network to be idle (no requests for 500ms).\n         */\n        const url = host + route;\n        await page.goto(\n            url,\n            {\n                waitUntil: configuration.waitUntil,\n                timeout: configuration.timeout,\n            },\n        );\n\n        const pageContent = await page.content();\n        const html = replacePluridResolution(pageContent);\n\n        const stilltime = Date.now() - start;\n        console.info(`\\tStilled '${route}' in ${(stilltime / 1000).toFixed(2)} seconds.`);\n\n        return {\n            route,\n            html,\n            stilltime,\n        };\n    } catch (error) {\n        // Preserve the underlying Puppeteer reason (timeout / navigation / DNS) — in the message (so it\n        // surfaces everywhere) AND as the native `cause` (lib ES2022).\n        const reason = error instanceof Error ? error.message : String(error);\n        throw new Error(`Could not still '${route}': ${reason}`, { cause: error });\n    } finally {\n        await page.close();\n    }\n}\n\n\n/**\n * The Server will parse the given application routes,\n * and will decide which ones to send to the Stiller.\n *\n * The Stiller spins a server, accesses the routes,\n * views the application routes as a browser,\n * extracts the HTML of the plurid pages,\n * and returns a data structure which will be used by the Server\n * to serve the adequate plurid space structure when asked for the given route.\n */\nclass Stiller {\n    private puppeteer: any = null;\n    private host: string;\n    private routes: string[];\n    private configuration: StillerConfiguration;\n\n    constructor(\n        options: StillerOptions,\n    ) {\n        // `puppeteer` is an OPTIONAL dependency — only stills generation needs it, not SSR. Stay null on\n        // a missing install; `still()` fails fast with an actionable message instead of an `undefined` crash.\n        try {\n            this.puppeteer = require('puppeteer');\n        } catch (_error) {\n            this.puppeteer = null;\n        }\n\n        const {\n            host,\n            routes,\n            configuration,\n        } = options;\n\n        this.host = host;\n        this.routes = routes;\n        this.configuration = configuration;\n    }\n\n    async * still() {\n        if (!this.puppeteer) {\n            throw new Error(\n                \"Plurid Stiller: the optional 'puppeteer' dependency is not installed. \"\n                + 'Install it to generate stills (npm install puppeteer).',\n            );\n        }\n\n        // One browser for ALL routes — launching a browser costs seconds; a page is cheap. Always closed.\n        const browser = await this.puppeteer.launch({\n            defaultViewport: {\n                width: 1366,\n                height: 768,\n            },\n            headless: true,\n            args: isCurrentUserRoot() ? ['--no-sandbox'] : undefined,\n        });\n\n        try {\n            for (const route of this.routes) {\n                yield await render(\n                    browser,\n                    this.host,\n                    route,\n                    this.configuration,\n                );\n            }\n        } finally {\n            await browser.close();\n        }\n    }\n}\n// #endregion module\n\n\n\n// #region exports\nexport default Stiller;\n// #endregion exports\n","// #region imports\n    // #region internal\n    import PluridServer from './objects/Server';\n\n    import PluridLiveServer from './objects/LiveServer';\n    import PluridStillsGenerator from './objects/StillsGenerator';\n    // #endregion internal\n// #endregion imports\n\n\n\n// #region exports\nexport * from './data/interfaces/external';\n\nexport {\n    PluridLiveServer,\n    PluridStillsGenerator,\n};\n\n\nexport default PluridServer;\n// #endregion exports\n"],"mappings":"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","names":["fs","path","template","minify","minify","React","React","template","path","renderer","preserve","escapeAttribute","fs","express","path","fs","uuid","path","fs","uuid"]}