@lolyjs/core 0.2.0-alpha.2 → 0.2.0-alpha.21

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.
Files changed (47) hide show
  1. package/LICENCE.md +9 -0
  2. package/README.md +1074 -761
  3. package/dist/{bootstrap-BiCQmSkx.d.mts → bootstrap-BfGTMUkj.d.mts} +19 -0
  4. package/dist/{bootstrap-BiCQmSkx.d.ts → bootstrap-BfGTMUkj.d.ts} +19 -0
  5. package/dist/cli.cjs +16997 -4416
  6. package/dist/cli.cjs.map +1 -1
  7. package/dist/cli.js +17007 -4416
  8. package/dist/cli.js.map +1 -1
  9. package/dist/index.cjs +14731 -1652
  10. package/dist/index.cjs.map +1 -1
  11. package/dist/index.d.mts +295 -57
  12. package/dist/index.d.ts +295 -57
  13. package/dist/index.js +17190 -4102
  14. package/dist/index.js.map +1 -1
  15. package/dist/index.types-DMOO-uvF.d.mts +221 -0
  16. package/dist/index.types-DMOO-uvF.d.ts +221 -0
  17. package/dist/react/cache.cjs +107 -32
  18. package/dist/react/cache.cjs.map +1 -1
  19. package/dist/react/cache.d.mts +27 -21
  20. package/dist/react/cache.d.ts +27 -21
  21. package/dist/react/cache.js +107 -32
  22. package/dist/react/cache.js.map +1 -1
  23. package/dist/react/components.cjs +10 -8
  24. package/dist/react/components.cjs.map +1 -1
  25. package/dist/react/components.js +10 -8
  26. package/dist/react/components.js.map +1 -1
  27. package/dist/react/hooks.cjs +208 -26
  28. package/dist/react/hooks.cjs.map +1 -1
  29. package/dist/react/hooks.d.mts +75 -15
  30. package/dist/react/hooks.d.ts +75 -15
  31. package/dist/react/hooks.js +208 -26
  32. package/dist/react/hooks.js.map +1 -1
  33. package/dist/react/sockets.cjs +13 -6
  34. package/dist/react/sockets.cjs.map +1 -1
  35. package/dist/react/sockets.js +13 -6
  36. package/dist/react/sockets.js.map +1 -1
  37. package/dist/react/themes.cjs +61 -18
  38. package/dist/react/themes.cjs.map +1 -1
  39. package/dist/react/themes.js +63 -20
  40. package/dist/react/themes.js.map +1 -1
  41. package/dist/runtime.cjs +544 -111
  42. package/dist/runtime.cjs.map +1 -1
  43. package/dist/runtime.d.mts +2 -2
  44. package/dist/runtime.d.ts +2 -2
  45. package/dist/runtime.js +540 -107
  46. package/dist/runtime.js.map +1 -1
  47. package/package.json +49 -4
@@ -1 +1 @@
1
- {"version":3,"sources":["../constants/globals.ts","../src/index.ts","../src/server.ts","../modules/server/utils/server-dir.ts","../modules/server/init.ts","../modules/server/setup.ts","../modules/router/loader-pages.ts","../modules/router/constants/index.ts","../modules/router/path.ts","../modules/router/layout.ts","../modules/router/loader.ts","../modules/router/loader-api.ts","../modules/router/helpers/routes/index.ts","../modules/router/matcher.ts","../modules/router/manifest.ts","../modules/router/loader-routes.ts","../modules/router/route-loader.ts","../modules/router/loader-wss.ts","../modules/build/bundler/client.ts","../modules/build/config/client.ts","../modules/build/utils/index.ts","../../../node_modules/.pnpm/chokidar@4.0.3/node_modules/chokidar/esm/index.js","../../../node_modules/.pnpm/readdirp@4.1.2/node_modules/readdirp/esm/index.js","../../../node_modules/.pnpm/chokidar@4.0.3/node_modules/chokidar/esm/handler.js","../modules/dev/hot-reload-client/index.ts","../modules/dev/hot-reload-server/index.ts","../src/config.ts","../modules/security/sanitize.ts","../modules/server/middleware/rate-limit.ts","../modules/server/middleware/auto-rate-limit.ts","../modules/logger/index.ts","../modules/server/handlers/api.ts","../modules/server/handlers/pages.ts","../modules/rendering/createDocumentTree/index.ts","../modules/rendering/initialData/index.ts","../modules/server/handlers/middleware.ts","../modules/server/handlers/loader.ts","../modules/server/handlers/response.ts","../modules/server/handlers/ssg.ts","../modules/server/routes.ts","../modules/server/config.ts","../modules/server/wss.ts","../modules/server/application.ts","../modules/build/ssg/builder.ts","../modules/build/ssg/path.ts","../modules/build/ssg/renderer.ts","../modules/build/bundler/server.ts","../modules/build/index.ts","../modules/runtime/client/bootstrap.tsx","../modules/runtime/client/constants.ts","../modules/runtime/client/window-data.ts","../modules/runtime/client/route-matcher.ts","../modules/runtime/client/metadata.ts","../modules/runtime/client/AppShell.tsx","../modules/runtime/client/RouterView.tsx","../modules/react/cache/client-data-cache/index.ts","../modules/runtime/client/navigation.ts","../modules/cache/index.ts","../modules/validation/index.ts"],"sourcesContent":["export const BUILD_FOLDER_NAME = '.loly';\r\nexport const STYLE_FILE_NAME = 'styles.css';\r\n\r\n// Framework runtime constants\r\nexport const WINDOW_DATA_KEY = '__FW_DATA__';\r\nexport const APP_CONTAINER_ID = '__app';\r\nexport const STATIC_PATH = '/static';\r\nexport const NOT_FOUND_PATTERN = '/not-found';\r\nexport const ERROR_PATTERN = '/error';\r\nexport const NOT_FOUND_CHUNK_KEY = '__fw_not_found__';\r\nexport const ERROR_CHUNK_KEY = '__fw_error__';\r\n\r\n// Special page file names\r\nexport const NOT_FOUND_FILE_PREFIX = '_not-found';\r\nexport const ERROR_FILE_PREFIX = '_error';\r\nexport const PAGE_FILE_NAME = 'page';\r\nexport const LAYOUT_FILE_NAME = 'layout';\r\n\r\n// Static asset paths\r\nexport const FAVICON_PATH = '/static/favicon.png';\r\nexport const CLIENT_CSS_PATH = '/static/client.css';\r\nexport const CLIENT_JS_PATH = '/static/client.js';\r\nexport const ASSETS_BASE_DIR = '/static/assets';","export { startDevServer, startProdServer } from \"./server\";\r\nexport { InitServerData, ServerConfig } from \"@server/index\";\r\nexport { buildApp } from \"@build/index\";\r\nexport {\r\n ServerContext,\r\n LoaderResult,\r\n RouteMiddleware,\r\n ApiMiddleware,\r\n ApiContext,\r\n MetadataLoader,\r\n GenerateStaticParams,\r\n ServerLoader,\r\n WssContext,\r\n} from \"@router/index.types\";\r\nexport { bootstrapClient } from \"@runtime/client\";\r\nexport {\r\n FrameworkConfig,\r\n loadConfig,\r\n DEFAULT_CONFIG,\r\n getAppDir,\r\n getBuildDir,\r\n getStaticDir,\r\n} from \"./config\";\r\nexport { withCache } from \"@cache/index\";\r\nexport { validate, safeValidate, ValidationError, commonSchemas } from \"@validation/index\";\r\nexport { sanitizeString, sanitizeObject, sanitizeParams, sanitizeQuery } from \"@security/sanitize\";\r\nexport { createRateLimiter, defaultRateLimiter, strictRateLimiter, lenientRateLimiter } from \"@server/middleware/rate-limit\";\r\nexport {\r\n logger,\r\n Logger,\r\n createModuleLogger,\r\n getLogger,\r\n setLogger,\r\n resetLogger,\r\n requestLoggerMiddleware,\r\n getRequestLogger,\r\n generateRequestId,\r\n type LogLevel,\r\n type LoggerContext,\r\n type LoggerOptions,\r\n} from \"@logger/index\";\r\n","import fs from \"fs\";\r\nimport path from \"path\";\r\nimport { runInitIfExists } from \"@server/init\";\r\nimport { setupServer, setupRoutes, setupWssEvents } from \"@server/index\";\r\nimport { setupApplication } from \"@server/application\";\r\nimport { FilesystemRouteLoader, ManifestRouteLoader } from \"@router/index\";\r\nimport {\r\n loadConfig,\r\n getAppDir,\r\n getBuildDir,\r\n type FrameworkConfig,\r\n} from \"./config\";\r\nimport { createModuleLogger } from \"@logger/index\";\r\nimport dotenv from \"dotenv\";\r\n\r\ndotenv.config();\r\n\r\nconst logger = createModuleLogger(\"server\");\r\n\r\nexport interface StartServerOptions {\r\n port?: number;\r\n rootDir?: string;\r\n appDir?: string;\r\n isDev?: boolean;\r\n config?: FrameworkConfig;\r\n}\r\n\r\n/**\r\n * Unified server startup function.\r\n * Handles both development and production modes.\r\n *\r\n * @param options - Server startup options\r\n */\r\nexport async function startServer(options: StartServerOptions = {}) {\r\n const isDev = options.isDev ?? process.env.NODE_ENV === \"development\";\r\n const projectRoot = options.rootDir ?? process.cwd();\r\n\r\n // Load configuration\r\n const config = options.config ?? loadConfig(projectRoot);\r\n\r\n // Use config values, but allow overrides from options and environment variables\r\n // PORT and HOST are standard environment variables in hosting platforms (Render, Heroku, etc.)\r\n const port =\r\n options.port ??\r\n (process.env.PORT ? parseInt(process.env.PORT, 10) : undefined) ??\r\n config.server.port;\r\n\r\n // In production, default to 0.0.0.0 to be accessible from outside\r\n // This is required for platforms like Render.com, Heroku, etc.\r\n const host =\r\n process.env.HOST ?? (!isDev ? \"0.0.0.0\" : undefined) ?? config.server.host;\r\n\r\n const appDir =\r\n options.appDir ??\r\n (isDev\r\n ? getAppDir(projectRoot, config)\r\n : path.join(getBuildDir(projectRoot, config), \"server\"));\r\n\r\n if (!isDev && !fs.existsSync(appDir)) {\r\n logger.error(\"Compiled directory not found\", undefined, {\r\n buildDir: config.directories.build,\r\n appDir,\r\n environment: \"production\",\r\n });\r\n process.exit(1);\r\n }\r\n\r\n const { app, httpServer } = await setupApplication({\r\n projectRoot,\r\n });\r\n\r\n // @TODO: Remove or validate if send the server is needed\r\n await runInitIfExists(projectRoot, { server: httpServer });\r\n\r\n const { routes, apiRoutes, wssRoutes, notFoundPage, errorPage, getRoutes } =\r\n setupServer(app, {\r\n projectRoot,\r\n appDir,\r\n isDev,\r\n config,\r\n });\r\n\r\n const routeLoader = isDev\r\n ? new FilesystemRouteLoader(appDir)\r\n : new ManifestRouteLoader(projectRoot);\r\n\r\n // Set up Socket.IO server and WebSocket event handlers\r\n setupWssEvents({\r\n httpServer,\r\n wssRoutes,\r\n });\r\n\r\n setupRoutes({\r\n app,\r\n routes,\r\n apiRoutes,\r\n notFoundPage,\r\n errorPage,\r\n isDev,\r\n projectRoot,\r\n routeLoader,\r\n getRoutes,\r\n config,\r\n });\r\n\r\n httpServer.listen(port, host, () => {\r\n if (isDev) {\r\n logger.info(\"🚀 Dev server running\", {\r\n url: `http://${host}:${port}`,\r\n appDir,\r\n });\r\n logger.info(\"🧭 Reading routes from\", { appDir });\r\n logger.info(\"📦 Client served from /static/client.js\");\r\n } else {\r\n const buildDir = config.directories.build;\r\n logger.info(\"🚀 Prod server running\", {\r\n url: `http://${host}:${port}`,\r\n appDir,\r\n buildDir,\r\n });\r\n logger.info(\"🧭 Reading compiled routes from\", { appDir });\r\n logger.info(\"📦 Client served from\", {\r\n path: `/static (${buildDir}/client)`,\r\n });\r\n logger.info(\"📄 SSG served from\", {\r\n path: `${buildDir}/ssg (if exists)`,\r\n });\r\n }\r\n });\r\n}\r\n\r\nexport interface StartDevServerOptions {\r\n port?: number;\r\n rootDir?: string;\r\n appDir?: string;\r\n}\r\n\r\n/**\r\n * Development server startup.\r\n * Wrapper around startServer for backward compatibility.\r\n *\r\n * @param options - Server options\r\n */\r\nexport async function startDevServer(options: StartDevServerOptions = {}) {\r\n return startServer({\r\n ...options,\r\n isDev: true,\r\n });\r\n}\r\n\r\nexport interface StartProdServerOptions {\r\n port?: number;\r\n rootDir?: string;\r\n appDir?: string;\r\n}\r\n\r\n/**\r\n * Production server startup.\r\n * Wrapper around startServer for backward compatibility.\r\n *\r\n * @param options - Server options\r\n */\r\nexport async function startProdServer(options: StartProdServerOptions = {}) {\r\n return startServer({\r\n ...options,\r\n isDev: false,\r\n });\r\n}\r\n","import fs from \"fs\";\r\nimport path from \"path\";\r\nimport { BUILD_FOLDER_NAME } from \"@constants/globals\";\r\n\r\nexport const getServerFile = async (projectRoot: string, fileName: string) => {\r\n const fileTS = path.join(projectRoot, `${fileName}.ts`);\r\n const fileJS = path.join(projectRoot, BUILD_FOLDER_NAME, \"server\", `${fileName}.js`);\r\n\r\n const isDev = process.env.NODE_ENV === \"development\";\r\n let mod: any = null;\r\n\r\n if (isDev) {\r\n if (!fs.existsSync(fileTS)) {\r\n return null;\r\n }\r\n\r\n require(\"tsx/cjs\");\r\n mod = require(fileTS);\r\n } else {\r\n if (!fs.existsSync(fileJS)) {\r\n return null;\r\n }\r\n\r\n mod = require(fileJS);\r\n }\r\n\r\n return mod;\r\n};\r\n","import http from \"http\";\r\nimport { getServerFile } from \"./utils/server-dir\";\r\n\r\nexport const INIT_FILE_NAME = 'init.server';\r\n\r\nexport interface InitServerData {\r\n server: http.Server<typeof http.IncomingMessage, typeof http.ServerResponse>;\r\n}\r\n\r\nexport async function runInitIfExists(\r\n projectRoot: string,\r\n serverData: InitServerData\r\n): Promise<Record<string, any>> {\r\n let mod: any = await getServerFile(projectRoot, INIT_FILE_NAME);\r\n\r\n if (typeof mod?.init === \"function\") {\r\n const serverContext: any = { ...serverData };\r\n await mod.init({ serverContext });\r\n\r\n return serverContext;\r\n }\r\n\r\n return {};\r\n}\r\n","import express from \"express\";\r\nimport path from \"path\";\r\nimport {\r\n FilesystemRouteLoader,\r\n ManifestRouteLoader,\r\n RouteLoader,\r\n writeClientRoutesManifest,\r\n} from \"@router/index\";\r\nimport { startClientBundler } from \"@build/bundler/client\";\r\nimport { setupHotReload } from \"@dev/hot-reload-client\";\r\nimport { clearAppRequireCache } from \"@dev/hot-reload-server\";\r\nimport { LoadedRoute, ApiRoute, WssRoute } from \"@router/index.types\";\r\nimport { BUILD_FOLDER_NAME } from \"@constants/globals\";\r\nimport { getBuildDir } from \"@src/config\";\r\n\r\nexport { RouteLoader };\r\n\r\nimport type { FrameworkConfig } from \"@src/config\";\r\n\r\nexport interface ServerSetupOptions {\r\n projectRoot: string;\r\n appDir: string;\r\n isDev: boolean;\r\n config?: FrameworkConfig;\r\n}\r\n\r\nexport interface ServerSetupResult {\r\n routes: LoadedRoute[];\r\n wssRoutes: WssRoute[];\r\n notFoundPage: LoadedRoute | null;\r\n errorPage: LoadedRoute | null;\r\n apiRoutes: ApiRoute[];\r\n getRoutes?: () => {\r\n routes: LoadedRoute[];\r\n apiRoutes: ApiRoute[];\r\n };\r\n}\r\n\r\n/**\r\n * Sets up routes and bundler based on environment (dev/prod).\r\n *\r\n * @param app - Express application instance\r\n * @param options - Setup options\r\n * @returns Server setup result with routes and handlers\r\n */\r\nexport function setupServer(\r\n app: express.Application,\r\n options: ServerSetupOptions\r\n): ServerSetupResult {\r\n const { projectRoot, appDir, isDev, config } = options;\r\n\r\n const routeLoader: RouteLoader = isDev\r\n ? new FilesystemRouteLoader(appDir)\r\n : new ManifestRouteLoader(projectRoot);\r\n\r\n if (isDev) {\r\n const { outDir, waitForBuild } = startClientBundler(projectRoot, \"development\");\r\n \r\n // Callback to reload routes manifest and clear cache when files change\r\n const onFileChange = async (filePath: string) => {\r\n const rel = path.relative(appDir, filePath);\r\n const isPageFile = filePath.includes(\"page.tsx\") || filePath.includes(\"page.ts\") || \r\n filePath.includes(\"layout.tsx\") || filePath.includes(\"layout.ts\") ||\r\n filePath.includes(\"_not-found\") || filePath.includes(\"_error\");\r\n const isTsFile = filePath.endsWith(\".ts\") || filePath.endsWith(\".tsx\");\r\n \r\n // Clear require cache for ANY TypeScript/TSX file change\r\n // This ensures components, utilities, hooks, etc. are reloaded correctly\r\n if (isTsFile) {\r\n clearAppRequireCache(appDir);\r\n console.log(`[hot-reload] Cleared require cache for: ${rel}`);\r\n }\r\n \r\n // Reload client routes manifest for page files (affects client-side routing)\r\n // This is needed when routes are added/removed/changed\r\n if (isPageFile) {\r\n const loader = new FilesystemRouteLoader(appDir);\r\n const newRoutes = loader.loadRoutes();\r\n writeClientRoutesManifest(newRoutes, projectRoot);\r\n console.log(\"[hot-reload] Client routes manifest reloaded\");\r\n }\r\n \r\n // Note: \r\n // - API routes are already reloaded on each request via getRoutes().apiRoutes\r\n // - WSS routes require server restart to take effect (Socket.IO setup is one-time)\r\n // - Components and other files are handled by the bundler (Rspack watch mode)\r\n // and the require cache is cleared above to ensure server-side code reloads\r\n };\r\n \r\n setupHotReload({ app, appDir, waitForBuild, onFileChange });\r\n \r\n app.use(\"/static\", express.static(outDir));\r\n\r\n const routes = routeLoader.loadRoutes();\r\n const wssRoutes = routeLoader.loadWssRoutes();\r\n const notFoundPage = routeLoader.loadNotFoundRoute();\r\n const errorPage = routeLoader.loadErrorRoute();\r\n writeClientRoutesManifest(routes, projectRoot);\r\n\r\n function getRoutes() {\r\n clearAppRequireCache(appDir);\r\n const loader = new FilesystemRouteLoader(appDir);\r\n return {\r\n routes: loader.loadRoutes(),\r\n apiRoutes: loader.loadApiRoutes(),\r\n };\r\n }\r\n\r\n return {\r\n routes,\r\n wssRoutes,\r\n notFoundPage,\r\n errorPage,\r\n apiRoutes: routeLoader.loadApiRoutes(),\r\n getRoutes,\r\n };\r\n } else {\r\n const routes = routeLoader.loadRoutes();\r\n const apiRoutes = routeLoader.loadApiRoutes();\r\n const wssRoutes = routeLoader.loadWssRoutes();\r\n const notFoundPage = routeLoader.loadNotFoundRoute();\r\n const errorPage = routeLoader.loadErrorRoute();\r\n\r\n const buildDir = config ? getBuildDir(projectRoot, config) : path.join(projectRoot, BUILD_FOLDER_NAME);\r\n const clientOutDir = path.join(buildDir, \"client\");\r\n app.use(\r\n \"/static\",\r\n express.static(clientOutDir, {\r\n maxAge: \"1y\",\r\n immutable: true,\r\n })\r\n );\r\n\r\n return {\r\n routes,\r\n apiRoutes,\r\n wssRoutes,\r\n notFoundPage,\r\n errorPage,\r\n };\r\n }\r\n}\r\n","import fs from \"fs\";\r\nimport path from \"path\";\r\nimport { LoadedRoute, PageComponent } from \"./index.types\";\r\nimport { PAGE_FILE_REGEX } from \"./constants\";\r\nimport { buildRoutePathFromDir, buildRegexFromRoutePath } from \"./path\";\r\nimport { loadLayoutsForDir } from \"./layout\";\r\nimport { loadLoaderForDir } from \"./loader\";\r\n\r\n/**\r\n * Scans the app directory and loads all page routes.\r\n * \r\n * Recursively walks through the app directory, finding all `page.tsx`, `page.ts`,\r\n * `page.jsx`, or `page.js` files and creating route definitions.\r\n * \r\n * @param appDir - Root directory of the app (e.g., 'app')\r\n * @returns Array of loaded routes with components, layouts, loaders, etc.\r\n * \r\n * @example\r\n * const routes = loadRoutes('app');\r\n * // [\r\n * // { pattern: '/', component: HomePage, layouts: [], ... },\r\n * // { pattern: '/blog/[slug]', component: BlogPage, layouts: [RootLayout], ... },\r\n * // ]\r\n */\r\nexport function loadRoutes(appDir: string): LoadedRoute[] {\r\n if (!fs.existsSync(appDir)) {\r\n return [];\r\n }\r\n\r\n const routes: LoadedRoute[] = [];\r\n\r\n function walk(currentDir: string) {\r\n const entries = fs.readdirSync(currentDir, { withFileTypes: true });\r\n\r\n for (const entry of entries) {\r\n const fullPath = path.join(currentDir, entry.name);\r\n\r\n if (entry.isDirectory()) {\r\n walk(fullPath);\r\n continue;\r\n }\r\n\r\n if (!PAGE_FILE_REGEX.test(entry.name)) continue;\r\n\r\n // Skip special error pages - they're handled separately\r\n if (entry.name.startsWith(\"_not-found.\") || entry.name.startsWith(\"_error.\")) {\r\n continue;\r\n }\r\n\r\n const relDir = path.relative(appDir, currentDir);\r\n const routePath = buildRoutePathFromDir(relDir);\r\n const { regex, paramNames } = buildRegexFromRoutePath(routePath);\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-var-requires\r\n const mod = require(fullPath);\r\n const component: PageComponent = mod.default;\r\n\r\n if (!component) {\r\n continue;\r\n }\r\n\r\n const { components: layouts, files: layoutFiles } = loadLayoutsForDir(\r\n currentDir,\r\n appDir\r\n );\r\n\r\n const { middlewares, loader, dynamic, generateStaticParams } =\r\n loadLoaderForDir(currentDir);\r\n\r\n routes.push({\r\n pattern: routePath,\r\n regex,\r\n paramNames,\r\n component,\r\n layouts,\r\n pageFile: fullPath,\r\n layoutFiles,\r\n middlewares,\r\n loader,\r\n dynamic,\r\n generateStaticParams,\r\n });\r\n }\r\n }\r\n\r\n walk(appDir);\r\n\r\n return routes;\r\n}\r\n\r\n","import type { FrameworkConfig } from \"@src/config\";\r\n\r\nexport const PAGE_FILE_REGEX = /^page\\.(tsx|ts|jsx|js)$/;\r\nexport const LAYOUT_FILE_BASENAME = \"layout\";\r\n\r\n/**\r\n * Creates a regex pattern for page files based on configuration.\r\n * \r\n * @param config - Framework configuration\r\n * @returns Regex pattern for matching page files\r\n */\r\nexport function createPageFileRegex(config: FrameworkConfig): RegExp {\r\n const pageName = config.conventions.page;\r\n return new RegExp(`^${pageName}\\\\.(tsx|ts|jsx|js)$`);\r\n}\r\n\r\n/**\r\n * Gets the layout file basename from configuration.\r\n * \r\n * @param config - Framework configuration\r\n * @returns Layout file basename\r\n */\r\nexport function getLayoutFileBasename(config: FrameworkConfig): string {\r\n return config.conventions.layout;\r\n}","/**\r\n * Path utilities for building route paths and regex patterns.\r\n */\r\n\r\n/**\r\n * Builds a route path from a relative directory path.\r\n * \r\n * @param relDir - Relative directory path (e.g., '', 'about', 'blog\\\\[slug]')\r\n * @returns Route path (e.g., '/', '/about', '/blog/[slug]')\r\n * \r\n * @example\r\n * buildRoutePathFromDir('') // '/'\r\n * buildRoutePathFromDir('about') // '/about'\r\n * buildRoutePathFromDir('blog\\\\[slug]') // '/blog/[slug]'\r\n */\r\nexport function buildRoutePathFromDir(relDir: string): string {\r\n if (!relDir || relDir === \".\") return \"/\";\r\n const clean = relDir.replace(/\\\\/g, \"/\");\r\n return \"/\" + clean;\r\n}\r\n\r\n/**\r\n * Builds a regex pattern and parameter names from a route path.\r\n * \r\n * Supports:\r\n * - Static segments: `/about` → `/^\\/about\\/?$/`\r\n * - Dynamic segments: `[slug]` → captures single segment\r\n * - Catch-all segments: `[...path]` → captures remaining path (must be last)\r\n * \r\n * @param routePath - Route path pattern (e.g., '/blog/[slug]', '/post/[...path]')\r\n * @returns Object with regex pattern and parameter names\r\n * \r\n * @example\r\n * buildRegexFromRoutePath('/blog/[slug]')\r\n * // { regex: /^\\/blog\\/([^\\/]+)\\/?$/, paramNames: ['slug'] }\r\n * \r\n * buildRegexFromRoutePath('/post/[...path]')\r\n * // { regex: /^\\/post\\/(.+)\\/?$/, paramNames: ['path'] }\r\n * \r\n * @throws Error if catch-all segment is not the last segment\r\n */\r\nexport function buildRegexFromRoutePath(routePath: string): {\r\n regex: RegExp;\r\n paramNames: string[];\r\n} {\r\n const segments = routePath.split(\"/\").filter(Boolean);\r\n const paramNames: string[] = [];\r\n const regexParts: string[] = [];\r\n\r\n for (let i = 0; i < segments.length; i++) {\r\n const seg = segments[i];\r\n\r\n // 1) Catch-all: [...slug]\r\n if (seg.startsWith(\"[...\") && seg.endsWith(\"]\")) {\r\n const paramName = seg.slice(4, -1); // \"[...slug]\" -> \"slug\"\r\n paramNames.push(paramName);\r\n\r\n // Catch-all must be the last segment\r\n if (i !== segments.length - 1) {\r\n throw new Error(\r\n `Catch-all segment \"${seg}\" in \"${routePath}\" must be the last segment.`\r\n );\r\n }\r\n\r\n // (.+) = one or more characters (non-empty), allows \"/\" inside\r\n regexParts.push(\"(.+)\");\r\n continue;\r\n }\r\n\r\n // 2) Normal param: [slug]\r\n if (seg.startsWith(\"[\") && seg.endsWith(\"]\")) {\r\n const paramName = seg.slice(1, -1);\r\n paramNames.push(paramName);\r\n regexParts.push(\"([^/]+)\");\r\n continue;\r\n }\r\n\r\n // 3) Static segment - escape special regex characters\r\n const escaped = seg.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\r\n regexParts.push(escaped);\r\n }\r\n\r\n const regexSource = \"^/\" + regexParts.join(\"/\") + \"/?$\";\r\n const regex = new RegExp(regexSource);\r\n\r\n return { regex, paramNames };\r\n}\r\n\r\n","import fs from \"fs\";\r\nimport path from \"path\";\r\nimport { LayoutComponent } from \"./index.types\";\r\nimport { LAYOUT_FILE_BASENAME } from \"./constants\";\r\n\r\n/**\r\n * Finds a layout file in the given directory.\r\n * \r\n * Checks for layout files in this order:\r\n * 1. layout.tsx\r\n * 2. layout.ts\r\n * 3. layout.jsx\r\n * 4. layout.js\r\n * \r\n * @param dir - Directory to search for layout file\r\n * @returns Full path to layout file, or null if not found\r\n */\r\nexport function findLayoutFileInDir(dir: string): string | null {\r\n const candidates = [\r\n `${LAYOUT_FILE_BASENAME}.tsx`,\r\n `${LAYOUT_FILE_BASENAME}.ts`,\r\n `${LAYOUT_FILE_BASENAME}.jsx`,\r\n `${LAYOUT_FILE_BASENAME}.js`,\r\n ];\r\n\r\n for (const file of candidates) {\r\n const fullPath = path.join(dir, file);\r\n if (fs.existsSync(fullPath)) return fullPath;\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/**\r\n * Loads all layout components for a page directory.\r\n * \r\n * Walks up from the page directory to the app root, collecting layouts\r\n * at each level. Returns layouts in order from root to most specific.\r\n * \r\n * @param pageDir - Directory containing the page file\r\n * @param appDir - Root app directory\r\n * @returns Object with layout components and their file paths\r\n * \r\n * @example\r\n * // app/layout.tsx (root)\r\n * // app/blog/layout.tsx (blog)\r\n * // app/blog/[slug]/page.tsx (page)\r\n * \r\n * loadLayoutsForDir('app/blog/[slug]', 'app')\r\n * // Returns: [RootLayout, BlogLayout] (in that order)\r\n */\r\nexport function loadLayoutsForDir(\r\n pageDir: string,\r\n appDir: string\r\n): { components: LayoutComponent[]; files: string[] } {\r\n const componentsBottomUp: LayoutComponent[] = [];\r\n const filesBottomUp: string[] = [];\r\n\r\n let currentDir = pageDir;\r\n const appDirResolved = path.resolve(appDir);\r\n\r\n while (true) {\r\n const layoutFile = findLayoutFileInDir(currentDir);\r\n if (layoutFile) {\r\n // eslint-disable-next-line @typescript-eslint/no-var-requires\r\n const mod = require(layoutFile);\r\n const LayoutComp: LayoutComponent = mod.default;\r\n if (LayoutComp) {\r\n componentsBottomUp.push(LayoutComp);\r\n filesBottomUp.push(layoutFile);\r\n }\r\n }\r\n\r\n const currentResolved = path.resolve(currentDir);\r\n if (currentResolved === appDirResolved) break;\r\n\r\n const parent = path.dirname(currentDir);\r\n if (parent === currentDir) break; // Reached filesystem root\r\n currentDir = parent;\r\n }\r\n\r\n // Reverse to get root → most specific order\r\n return {\r\n components: componentsBottomUp.reverse(),\r\n files: filesBottomUp.reverse(),\r\n };\r\n}\r\n\r\n","import fs from \"fs\";\r\nimport path from \"path\";\r\nimport {\r\n DynamicMode,\r\n GenerateStaticParams,\r\n RouteMiddleware,\r\n ServerLoader,\r\n} from \"./index.types\";\r\n\r\nconst NAMING = {\r\n // Constants & Fns\r\n BEFORE_MIDDLEWARES: \"beforeServerData\",\r\n GET_SERVER_DATA_FN: \"getServerSideProps\",\r\n GENERATE_SSG_PARAMS: \"generateStaticParams\",\r\n RENDER_TYPE_CONST: \"dynamic\",\r\n\r\n // Files\r\n SERVER_HOOK: 'server.hook',\r\n};\r\n\r\n/**\r\n * Loads server-side hooks (loader, middlewares, SSG config) from a directory.\r\n *\r\n * Looks for `server.hook.ts` or `server.hook.js` in the given directory.\r\n *\r\n * @param currentDir - Directory to search for server hook file\r\n * @returns Object containing middlewares, loader, dynamic mode, and generateStaticParams\r\n *\r\n * @example\r\n * // app/blog/[slug]/server.hook.ts\r\n * export const beforeServerData = [authMiddleware];\r\n * export const getServerSideProps = async (ctx) => ({ props: {} });\r\n * export const dynamic = \"force-static\";\r\n * export const generateStaticParams = async () => [{ slug: \"post-1\" }];\r\n */\r\nexport function loadLoaderForDir(currentDir: string): {\r\n middlewares: RouteMiddleware[];\r\n loader: ServerLoader | null;\r\n dynamic: DynamicMode;\r\n generateStaticParams: GenerateStaticParams | null;\r\n} {\r\n const loaderTs = path.join(currentDir, `${NAMING.SERVER_HOOK}.ts`);\r\n const loaderJs = path.join(currentDir, `${NAMING.SERVER_HOOK}.js`);\r\n\r\n const file = fs.existsSync(loaderTs)\r\n ? loaderTs\r\n : fs.existsSync(loaderJs)\r\n ? loaderJs\r\n : null;\r\n\r\n if (!file) {\r\n return {\r\n middlewares: [],\r\n loader: null,\r\n dynamic: \"auto\",\r\n generateStaticParams: null,\r\n };\r\n }\r\n\r\n // Ensure tsx is loaded for TypeScript files during build\r\n // tsx automatically reads tsconfig.json from the project root to resolve path aliases\r\n if (file.endsWith('.ts') || file.endsWith('.tsx')) {\r\n try {\r\n // Load tsx if not already loaded - it will handle TypeScript compilation and path resolution\r\n require('tsx/cjs');\r\n } catch (e) {\r\n // tsx might already be loaded, ignore error\r\n }\r\n }\r\n\r\n let mod;\r\n try {\r\n // eslint-disable-next-line @typescript-eslint/no-var-requires\r\n mod = require(file);\r\n } catch (error) {\r\n console.error(\r\n `[framework][loader] Error loading server hook from ${file}:`,\r\n error\r\n );\r\n // Return defaults if module fails to load\r\n return {\r\n middlewares: [],\r\n loader: null,\r\n dynamic: \"auto\",\r\n generateStaticParams: null,\r\n };\r\n }\r\n\r\n const middlewares: RouteMiddleware[] = Array.isArray(\r\n mod?.[NAMING.BEFORE_MIDDLEWARES]\r\n )\r\n ? mod[NAMING.BEFORE_MIDDLEWARES]\r\n : [];\r\n\r\n const loader: ServerLoader | null =\r\n typeof mod?.[NAMING.GET_SERVER_DATA_FN] === \"function\"\r\n ? mod[NAMING.GET_SERVER_DATA_FN]\r\n : null;\r\n\r\n const dynamic: DynamicMode =\r\n mod?.[NAMING.RENDER_TYPE_CONST] === \"force-static\" ||\r\n mod?.[NAMING.RENDER_TYPE_CONST] === \"force-dynamic\"\r\n ? mod.dynamic\r\n : \"auto\";\r\n\r\n const generateStaticParams: GenerateStaticParams | null =\r\n typeof mod?.[NAMING.GENERATE_SSG_PARAMS] === \"function\"\r\n ? mod[NAMING.GENERATE_SSG_PARAMS]\r\n : null;\r\n\r\n return {\r\n middlewares,\r\n loader,\r\n dynamic,\r\n generateStaticParams,\r\n };\r\n}\r\n","import fs from \"fs\";\r\nimport path from \"path\";\r\nimport { ApiRoute } from \"./index.types\";\r\nimport {\r\n extractApiHandlers,\r\n extractApiMiddlewares,\r\n extractRouteRegex,\r\n loadModuleSafely,\r\n} from \"./helpers/routes\";\r\n\r\nconst ROUTE_FILE_REGEX = /route\\.(ts|tsx|js|jsx)$/;\r\nconst HTTP_METHODS = [\"GET\", \"POST\", \"PUT\", \"PATCH\", \"DELETE\", \"OPTIONS\"];\r\n\r\n/**\r\n * Scans the app/api directory and loads all API routes.\r\n * \r\n * Recursively walks through the app/api directory, finding all `route.ts`, `route.tsx`,\r\n * `route.js`, or `route.jsx` files and creating API route definitions.\r\n * \r\n * @param appDir - Root directory of the app (e.g., 'app')\r\n * @returns Array of loaded API routes with handlers and middlewares\r\n * \r\n * @example\r\n * const apiRoutes = loadApiRoutes('app');\r\n * // [\r\n * // {\r\n * // pattern: '/api/posts/[id]',\r\n * // handlers: { GET: getPost, POST: updatePost },\r\n * // middlewares: [authMiddleware],\r\n * // methodMiddlewares: { GET: [logMiddleware] },\r\n * // },\r\n * // ]\r\n */\r\nexport function loadApiRoutes(appDir: string): ApiRoute[] {\r\n const apiRoot = path.join(appDir, \"api\");\r\n const routes: ApiRoute[] = [];\r\n\r\n if (!fs.existsSync(apiRoot)) return routes;\r\n\r\n function walk(currentDir: string) {\r\n const entries = fs.readdirSync(currentDir, { withFileTypes: true });\r\n\r\n for (const entry of entries) {\r\n const fullPath = path.join(currentDir, entry.name);\r\n\r\n if (entry.isDirectory()) {\r\n walk(fullPath);\r\n continue;\r\n }\r\n\r\n // Only process route files\r\n if (!ROUTE_FILE_REGEX.test(entry.name)) continue;\r\n\r\n const relToApp = path.relative(appDir, fullPath).replace(/\\\\/g, \"/\");\r\n const withoutRoute = relToApp.replace(/\\/route\\.(ts|tsx|js|jsx)$/, \"\");\r\n const pattern = \"/\" + withoutRoute;\r\n\r\n const { regex, paramNames } = extractRouteRegex(pattern);\r\n\r\n const mod = loadModuleSafely(fullPath);\r\n if (!mod) {\r\n continue;\r\n }\r\n\r\n const handlers = extractApiHandlers(mod, HTTP_METHODS);\r\n const { global: globalMiddlewares, methodSpecific: methodMiddlewares } =\r\n extractApiMiddlewares(mod, HTTP_METHODS);\r\n\r\n routes.push({\r\n pattern,\r\n regex,\r\n paramNames,\r\n handlers,\r\n middlewares: globalMiddlewares,\r\n methodMiddlewares,\r\n filePath: fullPath,\r\n });\r\n }\r\n }\r\n\r\n walk(apiRoot);\r\n\r\n return routes;\r\n}\r\n\r\n","import fs from \"fs\";\r\nimport path from \"path\";\r\nimport {\r\n ApiHandler,\r\n ApiMiddleware,\r\n LayoutComponent,\r\n PageComponent,\r\n RoutesManifest,\r\n} from \"../../index.types\";\r\nimport { buildRegexFromRoutePath } from \"../../path\";\r\nimport { BUILD_FOLDER_NAME } from \"@constants/globals\";\r\n\r\n/**\r\n * Reads and parses the routes manifest file.\r\n */\r\nexport function readManifest(projectRoot: string): RoutesManifest | null {\r\n const manifestPath = path.join(\r\n projectRoot,\r\n BUILD_FOLDER_NAME,\r\n \"routes-manifest.json\"\r\n );\r\n\r\n if (!fs.existsSync(manifestPath)) {\r\n return null;\r\n }\r\n\r\n const raw = fs.readFileSync(manifestPath, \"utf-8\");\r\n return JSON.parse(raw) as RoutesManifest;\r\n}\r\n\r\n/**\r\n * Safely loads a module with error handling.\r\n */\r\nexport function loadModuleSafely(filePath: string): any | null {\r\n try {\r\n // eslint-disable-next-line @typescript-eslint/no-var-requires\r\n return require(filePath);\r\n } catch (err) {\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Loads and processes layout components from layout file paths.\r\n */\r\nexport function loadLayouts(\r\n layoutFiles: string[],\r\n projectRoot: string\r\n): LayoutComponent[] {\r\n const layoutMods = layoutFiles.map((lf) => {\r\n const fullPath = path.join(projectRoot, lf);\r\n return loadModuleSafely(fullPath);\r\n });\r\n\r\n return layoutMods\r\n .filter((m): m is { default: LayoutComponent } => !!m?.default)\r\n .map((m) => m.default);\r\n}\r\n\r\n/**\r\n * Builds regex and extracts param names from a route pattern.\r\n */\r\nexport function extractRouteRegex(pattern: string, paramNames?: string[]) {\r\n const { regex, paramNames: extractedParamNames } =\r\n buildRegexFromRoutePath(pattern);\r\n return {\r\n regex,\r\n paramNames: paramNames ?? extractedParamNames,\r\n };\r\n}\r\n\r\n/**\r\n * Extracts HTTP method handlers from a module.\r\n */\r\nexport function extractApiHandlers(\r\n mod: any,\r\n methods: string[]\r\n): Record<string, ApiHandler> {\r\n const handlers: Record<string, ApiHandler> = {};\r\n\r\n for (const method of methods) {\r\n if (typeof mod[method] === \"function\") {\r\n handlers[method] = mod[method] as ApiHandler;\r\n }\r\n }\r\n\r\n return handlers;\r\n}\r\n\r\n/**\r\n * Extracts global and method-specific middlewares from a module.\r\n */\r\nexport function extractApiMiddlewares(\r\n mod: any,\r\n methods: string[]\r\n): {\r\n global: ApiMiddleware[];\r\n methodSpecific: Record<string, ApiMiddleware[]>;\r\n} {\r\n const globalMiddlewares: ApiMiddleware[] = Array.isArray(mod.beforeApi)\r\n ? mod.beforeApi\r\n : [];\r\n\r\n const methodMiddlewares: Record<string, ApiMiddleware[]> = {};\r\n\r\n for (const method of methods) {\r\n const key = `before${method}`;\r\n const mws = mod[key];\r\n if (Array.isArray(mws)) {\r\n methodMiddlewares[method] = mws as ApiMiddleware[];\r\n }\r\n }\r\n\r\n return {\r\n global: globalMiddlewares,\r\n methodSpecific: methodMiddlewares,\r\n };\r\n}\r\n\r\n/**\r\n * Extracts WebSocket event handlers from a module.\r\n */\r\nexport function extractWssHandlers(\r\n mod: any,\r\n events: string[]\r\n): Record<string, ApiHandler> {\r\n const handlers: Record<string, ApiHandler> = {};\r\n\r\n if (!Array.isArray(mod.events)) {\r\n return handlers;\r\n }\r\n\r\n for (const eventName of events) {\r\n if (typeof eventName === \"string\") {\r\n const event = mod.events.find(\r\n (e: { name: string }) => e.name?.toLowerCase() === eventName.toLowerCase()\r\n );\r\n if (event?.handler) {\r\n handlers[eventName] = event.handler as ApiHandler;\r\n }\r\n }\r\n }\r\n\r\n return handlers;\r\n}\r\n\r\n/**\r\n * Extracts all WebSocket event handlers directly from a module's events array.\r\n * This is used when scanning filesystem routes where we iterate over all events.\r\n */\r\nexport function extractWssHandlersFromModule(mod: any): Record<string, ApiHandler> {\r\n const handlers: Record<string, ApiHandler> = {};\r\n\r\n if (!Array.isArray(mod?.events)) {\r\n return handlers;\r\n }\r\n\r\n for (const event of mod.events) {\r\n if (typeof event.handler === \"function\" && typeof event.name === \"string\") {\r\n handlers[event.name.toLowerCase()] = event.handler as ApiHandler;\r\n }\r\n }\r\n\r\n return handlers;\r\n}\r\n\r\n/**\r\n * Loads a page component from a file path.\r\n */\r\nexport function loadPageComponent(\r\n pageFile: string,\r\n projectRoot: string\r\n): PageComponent | null {\r\n const fullPath = path.join(projectRoot, pageFile);\r\n const pageMod = loadModuleSafely(fullPath);\r\n return pageMod?.default || null;\r\n}\r\n\r\n","import { ApiRoute, LoadedRoute } from \"./index.types\";\r\n\r\n/**\r\n * Matches a URL path against loaded routes and returns the matched route with params.\r\n * \r\n * @param routes - Array of loaded routes to match against\r\n * @param urlPath - URL path to match (e.g., '/blog/my-post')\r\n * @returns Matched route with extracted parameters, or null if no match\r\n * \r\n * @example\r\n * const routes = loadRoutes('app');\r\n * const match = matchRoute(routes, '/blog/my-post');\r\n * // { route: LoadedRoute, params: { slug: 'my-post' } }\r\n */\r\nexport function matchRoute(\r\n routes: LoadedRoute[],\r\n urlPath: string\r\n): { route: LoadedRoute; params: Record<string, string> } | null {\r\n for (const route of routes) {\r\n const match = route.regex.exec(urlPath);\r\n if (!match) continue;\r\n\r\n const params: Record<string, string> = {};\r\n route.paramNames.forEach((name, idx) => {\r\n params[name] = match[idx + 1];\r\n });\r\n\r\n return { route, params };\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/**\r\n * Matches a URL path against API routes and returns the matched route with params.\r\n * \r\n * @param routes - Array of API routes to match against\r\n * @param pathname - URL path to match (e.g., '/api/posts/123')\r\n * @returns Matched API route with extracted parameters, or null if no match\r\n * \r\n * @example\r\n * const apiRoutes = loadApiRoutes('app');\r\n * const match = matchApiRoute(apiRoutes, '/api/posts/123');\r\n * // { route: ApiRoute, params: { id: '123' } }\r\n */\r\nexport function matchApiRoute(\r\n routes: ApiRoute[],\r\n pathname: string\r\n): { route: ApiRoute; params: Record<string, string> } | null {\r\n for (const r of routes) {\r\n const match = r.regex.exec(pathname);\r\n if (!match) continue;\r\n\r\n const params: Record<string, string> = {};\r\n r.paramNames.forEach((name, idx) => {\r\n params[name] = match[idx + 1];\r\n });\r\n\r\n return { route: r, params };\r\n }\r\n return null;\r\n}\r\n\r\n","import fs from \"fs\";\r\nimport path from \"path\";\r\nimport {\r\n ApiRoute,\r\n ApiRouteManifestEntry,\r\n LoadedRoute,\r\n PageRouteManifestEntry,\r\n RoutesManifest,\r\n WssRoute,\r\n WssRouteManifestEntry,\r\n} from \"./index.types\";\r\nimport {\r\n BUILD_FOLDER_NAME,\r\n STYLE_FILE_NAME,\r\n NOT_FOUND_FILE_PREFIX,\r\n ERROR_FILE_PREFIX,\r\n NOT_FOUND_CHUNK_KEY,\r\n ERROR_CHUNK_KEY,\r\n NOT_FOUND_PATTERN,\r\n ERROR_PATTERN,\r\n} from \"@constants/globals\";\r\n\r\n/**\r\n * Writes the client-side routes manifest file.\r\n *\r\n * Generates a TypeScript file that exports route definitions with lazy-loaded\r\n * components for code splitting. The manifest is used by the client runtime\r\n * to handle client-side navigation.\r\n *\r\n * @param routes - Array of loaded routes\r\n * @param projectRoot - Root directory of the project\r\n * @param errorRoute - Optional error route for client-side error handling\r\n */\r\nexport function writeClientRoutesManifest(\r\n routes: LoadedRoute[],\r\n projectRoot: string\r\n): void {\r\n const fwDir = path.join(projectRoot, BUILD_FOLDER_NAME);\r\n if (!fs.existsSync(fwDir)) {\r\n fs.mkdirSync(fwDir, { recursive: true });\r\n }\r\n\r\n const manifestPath = path.join(fwDir, \"routes-client.ts\");\r\n const manifestDir = path.dirname(manifestPath);\r\n\r\n function toImportPath(filePath: string): string {\r\n const relRaw = path.relative(manifestDir, filePath).replace(/\\\\/g, \"/\");\r\n const rel = relRaw.startsWith(\".\") ? relRaw : \"./\" + relRaw;\r\n // Remove extension so bundler can resolve .tsx, .ts, .jsx, .js\r\n return rel.replace(/\\.(tsx|ts|jsx|js)$/, \"\");\r\n }\r\n\r\n function findUserNotFound(): string | null {\r\n const candidates = [\r\n `app/${NOT_FOUND_FILE_PREFIX}.tsx`,\r\n `app/${NOT_FOUND_FILE_PREFIX}.ts`,\r\n `app/${NOT_FOUND_FILE_PREFIX}.jsx`,\r\n `app/${NOT_FOUND_FILE_PREFIX}.js`,\r\n // Fallback to old style for backward compatibility\r\n \"app/not-found/page.tsx\",\r\n \"app/not-found/page.ts\",\r\n \"app/not-found/page.jsx\",\r\n \"app/not-found/page.js\",\r\n ];\r\n\r\n for (const rel of candidates) {\r\n const full = path.join(projectRoot, rel);\r\n if (fs.existsSync(full)) return full;\r\n }\r\n return null;\r\n }\r\n\r\n function findUserError(): string | null {\r\n const candidates = [\r\n `app/${ERROR_FILE_PREFIX}.tsx`,\r\n `app/${ERROR_FILE_PREFIX}.ts`,\r\n `app/${ERROR_FILE_PREFIX}.jsx`,\r\n `app/${ERROR_FILE_PREFIX}.js`,\r\n ];\r\n\r\n for (const rel of candidates) {\r\n const full = path.join(projectRoot, rel);\r\n if (fs.existsSync(full)) return full;\r\n }\r\n return null;\r\n }\r\n\r\n function findRootLayout(): string | null {\r\n const candidates = [\r\n \"app/layout.tsx\",\r\n \"app/layout.ts\",\r\n \"app/layout.jsx\",\r\n \"app/layout.js\",\r\n ];\r\n\r\n for (const rel of candidates) {\r\n const full = path.join(projectRoot, rel);\r\n if (fs.existsSync(full)) return full;\r\n }\r\n return null;\r\n }\r\n\r\n const lines: string[] = [];\r\n const chunkMap: Record<string, string> = {};\r\n\r\n lines.push(`import React from \"react\";`);\r\n lines.push(\"\");\r\n\r\n lines.push(`export interface ClientLoadedComponents {`);\r\n lines.push(` Page: React.ComponentType<any>;`);\r\n lines.push(` layouts: React.ComponentType<any>[];`);\r\n lines.push(`}`);\r\n lines.push(\"\");\r\n\r\n lines.push(`export interface ClientRouteLoaded {`);\r\n lines.push(` pattern: string;`);\r\n lines.push(` paramNames: string[];`);\r\n lines.push(` load: () => Promise<ClientLoadedComponents>;`);\r\n lines.push(`}`);\r\n lines.push(\"\");\r\n\r\n // --- rutas normales ---\r\n lines.push(`export const routes: ClientRouteLoaded[] = [`);\r\n\r\n for (const route of routes) {\r\n const pattern = route.pattern;\r\n const paramNames = route.paramNames;\r\n\r\n const modulePaths = [route.pageFile, ...route.layoutFiles].map(\r\n toImportPath\r\n );\r\n\r\n const safeName =\r\n pattern.replace(/^\\//, \"\").replace(/\\//g, \"_\").replace(/\\[|\\]/g, \"\") ||\r\n \"root\";\r\n\r\n const chunkName = `route-${safeName}`;\r\n chunkMap[pattern] = chunkName;\r\n\r\n lines.push(\" {\");\r\n lines.push(` pattern: ${JSON.stringify(pattern)},`);\r\n lines.push(` paramNames: ${JSON.stringify(paramNames)},`);\r\n lines.push(` load: async () => {`);\r\n lines.push(` const mods = await Promise.all([`);\r\n\r\n for (const p of modulePaths) {\r\n lines.push(\r\n ` import(/* webpackChunkName: \"${chunkName}\" */ \"${p}\"),`\r\n );\r\n }\r\n\r\n lines.push(\" ]);\");\r\n lines.push(\" const [pageMod, ...layoutMods] = mods;\");\r\n lines.push(\" return {\");\r\n lines.push(\" Page: pageMod.default,\");\r\n lines.push(\" layouts: layoutMods.map((m) => m.default),\");\r\n lines.push(\" };\");\r\n lines.push(\" },\");\r\n lines.push(\" },\");\r\n }\r\n\r\n lines.push(\"];\");\r\n lines.push(\"\");\r\n\r\n const notFoundPath = findUserNotFound();\r\n const errorPath = findUserError();\r\n const rootLayoutPath = findRootLayout();\r\n\r\n if (notFoundPath) {\r\n const notFoundImportPath = toImportPath(notFoundPath);\r\n const chunkName = \"route-not-found\";\r\n\r\n lines.push(`export const notFoundRoute: ClientRouteLoaded = {`);\r\n lines.push(` pattern: \"${NOT_FOUND_CHUNK_KEY}\",`);\r\n lines.push(` paramNames: [],`);\r\n lines.push(` load: async () => {`);\r\n lines.push(` const mods = await Promise.all([`);\r\n lines.push(\r\n ` import(/* webpackChunkName: \"${chunkName}\" */ \"${notFoundImportPath}\"),`\r\n );\r\n\r\n if (rootLayoutPath) {\r\n const rootLayoutImportPath = toImportPath(rootLayoutPath);\r\n lines.push(\r\n ` import(/* webpackChunkName: \"${chunkName}\" */ \"${rootLayoutImportPath}\"),`\r\n );\r\n }\r\n\r\n lines.push(` ]);`);\r\n lines.push(` const [pageMod, ...layoutMods] = mods;`);\r\n lines.push(` return {`);\r\n lines.push(` Page: pageMod.default,`);\r\n lines.push(` layouts: layoutMods.map((m) => m.default),`);\r\n lines.push(` };`);\r\n lines.push(` },`);\r\n lines.push(`};`);\r\n lines.push(\"\");\r\n\r\n chunkMap[NOT_FOUND_CHUNK_KEY] = chunkName;\r\n } else {\r\n lines.push(`export const notFoundRoute: ClientRouteLoaded | null = null;`);\r\n lines.push(\"\");\r\n }\r\n\r\n if (errorPath) {\r\n const errorImportPath = toImportPath(errorPath);\r\n const chunkName = \"route-error\";\r\n\r\n lines.push(`export const errorRoute: ClientRouteLoaded = {`);\r\n lines.push(` pattern: \"${ERROR_CHUNK_KEY}\",`);\r\n lines.push(` paramNames: [],`);\r\n lines.push(` load: async () => {`);\r\n lines.push(` const mods = await Promise.all([`);\r\n lines.push(\r\n ` import(/* webpackChunkName: \"${chunkName}\" */ \"${errorImportPath}\"),`\r\n );\r\n\r\n if (rootLayoutPath) {\r\n const rootLayoutImportPath = toImportPath(rootLayoutPath);\r\n lines.push(\r\n ` import(/* webpackChunkName: \"${chunkName}\" */ \"${rootLayoutImportPath}\"),`\r\n );\r\n }\r\n\r\n lines.push(` ]);`);\r\n lines.push(` const [pageMod, ...layoutMods] = mods;`);\r\n lines.push(` return {`);\r\n lines.push(` Page: pageMod.default,`);\r\n lines.push(` layouts: layoutMods.map((m) => m.default),`);\r\n lines.push(` };`);\r\n lines.push(` },`);\r\n lines.push(`};`);\r\n lines.push(\"\");\r\n\r\n chunkMap[ERROR_CHUNK_KEY] = chunkName;\r\n } else {\r\n lines.push(`export const errorRoute: ClientRouteLoaded | null = null;`);\r\n lines.push(\"\");\r\n }\r\n\r\n fs.writeFileSync(manifestPath, lines.join(\"\\n\"), \"utf-8\");\r\n\r\n const chunksJsonPath = path.join(fwDir, \"route-chunks.json\");\r\n fs.writeFileSync(chunksJsonPath, JSON.stringify(chunkMap, null, 2), \"utf-8\");\r\n}\r\n\r\n/**\r\n * Writes the client bootstrap manifest file.\r\n *\r\n * @param projectRoot - Root directory of the project\r\n */\r\nexport function writeClientBoostrapManifest(projectRoot: string): void {\r\n const buildDir = path.join(projectRoot, BUILD_FOLDER_NAME);\r\n if (!fs.existsSync(buildDir)) {\r\n fs.mkdirSync(buildDir, { recursive: true });\r\n }\r\n\r\n const manifestPath = path.join(buildDir, \"boostrap.ts\");\r\n\r\n const lines: string[] = [];\r\n\r\n lines.push(`import \"../app/${STYLE_FILE_NAME}\";`);\r\n lines.push(\"\");\r\n\r\n lines.push(`import {`);\r\n lines.push(` routes,`);\r\n lines.push(` type ClientRouteLoaded,`);\r\n lines.push(` notFoundRoute,`);\r\n lines.push(` errorRoute,`);\r\n lines.push(`} from \"./routes-client\";`);\r\n lines.push(\"\");\r\n\r\n lines.push(`import { bootstrapClient } from \"@lolyjs/core/runtime\"`);\r\n lines.push(\"\");\r\n lines.push(\r\n \"bootstrapClient(routes as ClientRouteLoaded[], notFoundRoute, errorRoute);\"\r\n );\r\n\r\n fs.writeFileSync(manifestPath, lines.join(\"\\n\"), \"utf-8\");\r\n}\r\n\r\n/**\r\n * Writes the routes manifest JSON file.\r\n *\r\n * This manifest contains only data (no functions) and is:\r\n * - Readable by Node without compiling TypeScript\r\n * - Usable by the production server\r\n * - Usable by build/SSG processes\r\n *\r\n * @param routes - Array of loaded page routes\r\n * @param apiRoutes - Array of loaded API routes\r\n * @param notFoundRoute - Not-found route definition\r\n * @param errorRoute - Error route definition (optional)\r\n * @param projectRoot - Root directory of the project\r\n * @param serverOutDir - Server output directory from buildServerApp\r\n * @param appDir - Absolute path to the app directory\r\n */\r\nexport function writeRoutesManifest({\r\n routes,\r\n apiRoutes,\r\n wssRoutes,\r\n notFoundRoute,\r\n errorRoute,\r\n projectRoot,\r\n serverOutDir,\r\n appDir,\r\n}: {\r\n routes: LoadedRoute[];\r\n apiRoutes: ApiRoute[];\r\n wssRoutes: WssRoute[];\r\n notFoundRoute: LoadedRoute;\r\n errorRoute: LoadedRoute | null;\r\n projectRoot: string;\r\n serverOutDir: string;\r\n appDir: string;\r\n}) {\r\n const fwDir = path.join(projectRoot, BUILD_FOLDER_NAME);\r\n if (!fs.existsSync(fwDir)) {\r\n fs.mkdirSync(fwDir, { recursive: true });\r\n }\r\n\r\n const manifestPath = path.join(fwDir, \"routes-manifest.json\");\r\n\r\n const toRelative = (abs: string) =>\r\n path.relative(projectRoot, abs).replace(/\\\\/g, \"/\");\r\n\r\n const convertToJs = (file: string) =>\r\n file.replace(/\\.(ts|tsx|jsx|mjs|cjs)$/i, \".js\");\r\n\r\n const pageEntries: PageRouteManifestEntry[] = routes.map((r) => {\r\n const relativeSource = path.relative(appDir, r.pageFile);\r\n\r\n const jsPageFile = path.join(serverOutDir, convertToJs(relativeSource));\r\n\r\n const jsLayoutFiles = r.layoutFiles.map((lf) => {\r\n const rel = path.relative(appDir, lf);\r\n return path.join(serverOutDir, convertToJs(rel));\r\n });\r\n\r\n return {\r\n type: \"page\",\r\n pattern: r.pattern,\r\n paramNames: r.paramNames,\r\n pageFile: toRelative(jsPageFile),\r\n layoutFiles: jsLayoutFiles.map(toRelative),\r\n dynamic: r.dynamic,\r\n };\r\n });\r\n\r\n const apiEntries: ApiRouteManifestEntry[] = apiRoutes\r\n .map((r) => {\r\n const anyRoute = r as any;\r\n const filePath: string | undefined = anyRoute.filePath;\r\n\r\n if (!filePath) {\r\n return undefined;\r\n }\r\n\r\n const relSource = path.relative(appDir, filePath);\r\n\r\n const jsApiFile = path.join(serverOutDir, convertToJs(relSource));\r\n\r\n const methods = Object.keys(r.handlers || {});\r\n\r\n const entry: ApiRouteManifestEntry = {\r\n type: \"api\",\r\n pattern: r.pattern,\r\n paramNames: r.paramNames,\r\n file: toRelative(jsApiFile),\r\n methods,\r\n };\r\n\r\n return entry;\r\n })\r\n .filter((e): e is ApiRouteManifestEntry => !!e);\r\n\r\n const wssEntries: WssRouteManifestEntry[] = wssRoutes\r\n .map((r) => {\r\n const anyRoute = r as any;\r\n const filePath: string | undefined = anyRoute.filePath;\r\n\r\n if (!filePath) {\r\n return undefined;\r\n }\r\n\r\n const relSource = path.relative(appDir, filePath);\r\n\r\n const jsApiFile = path.join(serverOutDir, convertToJs(relSource));\r\n\r\n const events = Object.keys(r.handlers || {});\r\n\r\n const entry: WssRouteManifestEntry = {\r\n type: \"wss\",\r\n pattern: r.pattern,\r\n paramNames: r.paramNames,\r\n file: toRelative(jsApiFile),\r\n events,\r\n };\r\n\r\n return entry;\r\n })\r\n .filter((e): e is WssRouteManifestEntry => !!e);\r\n\r\n // Build not-found page entry\r\n const notFoundLayoutFiles = notFoundRoute.layoutFiles || [];\r\n const notFoundJsLayoutFiles = notFoundLayoutFiles.map((lf) => {\r\n const rel = path.relative(appDir, lf);\r\n return path.join(serverOutDir, convertToJs(rel));\r\n });\r\n\r\n const notFoundRelativeSource = notFoundRoute.pageFile\r\n ? path.relative(appDir, notFoundRoute.pageFile)\r\n : `${NOT_FOUND_FILE_PREFIX}.tsx`;\r\n const notFoundJsPageFile = notFoundRoute.pageFile\r\n ? path.join(serverOutDir, convertToJs(notFoundRelativeSource))\r\n : path.join(serverOutDir, convertToJs(`${NOT_FOUND_FILE_PREFIX}.tsx`));\r\n\r\n const notFoundPage: PageRouteManifestEntry = {\r\n type: \"page\",\r\n pageFile: toRelative(notFoundJsPageFile),\r\n layoutFiles: notFoundJsLayoutFiles.map(toRelative),\r\n dynamic: \"force-static\",\r\n paramNames: [],\r\n pattern: NOT_FOUND_PATTERN,\r\n };\r\n\r\n // Build error page entry (if exists)\r\n let errorPageEntry: PageRouteManifestEntry | undefined;\r\n if (errorRoute && errorRoute.pageFile) {\r\n const errorLayoutFiles = errorRoute.layoutFiles || [];\r\n const errorJsLayoutFiles = errorLayoutFiles.map((lf) => {\r\n const rel = path.relative(appDir, lf);\r\n return path.join(serverOutDir, convertToJs(rel));\r\n });\r\n\r\n const errorRelativeSource = path.relative(appDir, errorRoute.pageFile);\r\n const errorJsPageFile = path.join(\r\n serverOutDir,\r\n convertToJs(errorRelativeSource)\r\n );\r\n\r\n errorPageEntry = {\r\n type: \"page\",\r\n pageFile: toRelative(errorJsPageFile),\r\n layoutFiles: errorJsLayoutFiles.map(toRelative),\r\n dynamic: \"force-static\",\r\n paramNames: [],\r\n pattern: ERROR_PATTERN,\r\n };\r\n }\r\n\r\n const manifest: RoutesManifest = {\r\n version: 1,\r\n basePath: \"\",\r\n caseSensitive: false,\r\n pages404: true,\r\n routes: pageEntries,\r\n apiRoutes: apiEntries,\r\n notFound: notFoundPage,\r\n wssRoutes: wssEntries,\r\n ...(errorPageEntry && { error: errorPageEntry }),\r\n };\r\n\r\n fs.writeFileSync(manifestPath, JSON.stringify(manifest, null, 2), \"utf-8\");\r\n}\r\n","import fs from \"fs\";\r\nimport path from \"path\";\r\nimport {\r\n ApiRoute,\r\n LoadedRoute,\r\n WssRoute,\r\n} from \"./index.types\";\r\nimport { loadLoaderForDir } from \"./loader\";\r\nimport { BUILD_FOLDER_NAME, ERROR_PATTERN } from \"@constants/globals\";\r\nimport {\r\n extractApiHandlers,\r\n extractApiMiddlewares,\r\n extractRouteRegex,\r\n extractWssHandlers,\r\n loadLayouts,\r\n loadModuleSafely,\r\n loadPageComponent,\r\n readManifest,\r\n} from \"./helpers/routes\";\r\n\r\n/**\r\n * Loads page and API routes from the routes manifest file.\r\n * Used in production to avoid filesystem scanning.\r\n *\r\n * @param projectRoot - Root directory of the project\r\n * @returns Object containing loaded routes and API routes\r\n */\r\nexport function loadRoutesFromManifest(projectRoot: string): {\r\n routes: LoadedRoute[];\r\n apiRoutes: ApiRoute[];\r\n wssRoutes: WssRoute[];\r\n} {\r\n const manifest = readManifest(projectRoot);\r\n if (!manifest) {\r\n return { routes: [], apiRoutes: [], wssRoutes: [] };\r\n }\r\n\r\n const pageRoutes: LoadedRoute[] = [];\r\n\r\n for (const entry of manifest.routes) {\r\n const { regex, paramNames } = extractRouteRegex(\r\n entry.pattern,\r\n entry.paramNames\r\n );\r\n\r\n const component = loadPageComponent(entry.pageFile, projectRoot);\r\n if (!component) {\r\n continue;\r\n }\r\n\r\n const layouts = loadLayouts(entry.layoutFiles, projectRoot);\r\n const pageFile = path.join(projectRoot, entry.pageFile);\r\n const layoutFiles = entry.layoutFiles.map((f) =>\r\n path.join(projectRoot, f)\r\n );\r\n const pageDir = path.dirname(pageFile);\r\n const { middlewares, loader, dynamic, generateStaticParams } =\r\n loadLoaderForDir(pageDir);\r\n\r\n pageRoutes.push({\r\n pattern: entry.pattern,\r\n regex,\r\n paramNames,\r\n component,\r\n layouts,\r\n pageFile,\r\n layoutFiles,\r\n middlewares,\r\n loader,\r\n dynamic: entry.dynamic ?? dynamic,\r\n generateStaticParams,\r\n });\r\n }\r\n\r\n const apiRoutes: ApiRoute[] = [];\r\n const httpMethods = [\"GET\", \"POST\", \"PUT\", \"PATCH\", \"DELETE\", \"OPTIONS\"];\r\n\r\n for (const entry of manifest.apiRoutes) {\r\n const { regex, paramNames } = extractRouteRegex(\r\n entry.pattern,\r\n entry.paramNames\r\n );\r\n const filePath = path.join(projectRoot, entry.file);\r\n const mod = loadModuleSafely(filePath);\r\n\r\n if (!mod) {\r\n continue;\r\n }\r\n\r\n const handlers = extractApiHandlers(mod, httpMethods);\r\n const { global: globalMiddlewares, methodSpecific: methodMiddlewares } =\r\n extractApiMiddlewares(mod, httpMethods);\r\n\r\n apiRoutes.push({\r\n pattern: entry.pattern,\r\n regex,\r\n paramNames,\r\n handlers,\r\n middlewares: globalMiddlewares,\r\n methodMiddlewares,\r\n filePath,\r\n });\r\n }\r\n\r\n const wssRoutes: WssRoute[] = [];\r\n\r\n for (const entry of manifest.wssRoutes) {\r\n const { regex, paramNames } = extractRouteRegex(\r\n entry.pattern,\r\n entry.paramNames\r\n );\r\n const filePath = path.join(projectRoot, entry.file);\r\n const mod = loadModuleSafely(filePath);\r\n\r\n if (!mod) {\r\n continue;\r\n }\r\n\r\n const handlers = extractWssHandlers(mod, entry.events || []);\r\n const { global: globalMiddlewares, methodSpecific: methodMiddlewares } =\r\n extractApiMiddlewares(mod, []);\r\n\r\n wssRoutes.push({\r\n pattern: entry.pattern,\r\n regex,\r\n paramNames,\r\n handlers,\r\n middlewares: globalMiddlewares,\r\n methodMiddlewares,\r\n filePath,\r\n });\r\n }\r\n\r\n return { routes: pageRoutes, apiRoutes, wssRoutes };\r\n}\r\n\r\n/**\r\n * Loads route chunks mapping from the manifest file.\r\n *\r\n * @param projectRoot - Root directory of the project\r\n * @returns Record mapping route patterns to chunk names\r\n */\r\nexport function loadChunksFromManifest(projectRoot: string): Record<string, string> {\r\n const chunksPath = path.join(\r\n projectRoot,\r\n BUILD_FOLDER_NAME,\r\n \"route-chunks.json\"\r\n );\r\n let routeChunks: Record<string, string> = {};\r\n if (fs.existsSync(chunksPath)) {\r\n try {\r\n routeChunks = JSON.parse(fs.readFileSync(chunksPath, \"utf-8\"));\r\n } catch (err) {\r\n // Silently fail if chunks file is invalid\r\n }\r\n }\r\n\r\n return routeChunks;\r\n}\r\n\r\n/**\r\n * Loads the not-found route from the routes manifest.\r\n *\r\n * @param projectRoot - Root directory of the project\r\n * @returns LoadedRoute for the not-found page, or null if not found\r\n */\r\nexport function loadNotFoundFromManifest(\r\n projectRoot: string\r\n): LoadedRoute | null {\r\n const manifest = readManifest(projectRoot);\r\n if (!manifest) {\r\n return null;\r\n }\r\n\r\n const component = loadPageComponent(manifest.notFound.pageFile, projectRoot);\r\n if (!component) {\r\n return null;\r\n }\r\n\r\n const layouts = loadLayouts(manifest.notFound.layoutFiles, projectRoot);\r\n const pageFile = path.join(projectRoot, manifest.notFound.pageFile);\r\n\r\n return {\r\n pattern: \"\",\r\n regex: new RegExp(\"\"),\r\n paramNames: [],\r\n component,\r\n layouts,\r\n pageFile,\r\n layoutFiles: [],\r\n middlewares: [],\r\n loader: null,\r\n dynamic: \"force-static\",\r\n generateStaticParams: null,\r\n };\r\n}\r\n\r\n/**\r\n * Loads the error route from the routes manifest.\r\n *\r\n * @param projectRoot - Root directory of the project\r\n * @returns LoadedRoute for the error page, or null if not found\r\n */\r\nexport function loadErrorFromManifest(\r\n projectRoot: string\r\n): LoadedRoute | null {\r\n const manifest = readManifest(projectRoot);\r\n if (!manifest) {\r\n return null;\r\n }\r\n\r\n // Check if error page exists in manifest\r\n const errorEntry = (manifest as any).error;\r\n if (!errorEntry) {\r\n return null;\r\n }\r\n\r\n const component = loadPageComponent(errorEntry.pageFile, projectRoot);\r\n if (!component) {\r\n return null;\r\n }\r\n\r\n const layoutFiles = (errorEntry.layoutFiles || []) as string[];\r\n const layouts = loadLayouts(layoutFiles, projectRoot);\r\n const pageFile = path.join(projectRoot, errorEntry.pageFile);\r\n\r\n return {\r\n pattern: ERROR_PATTERN,\r\n regex: new RegExp(`^${ERROR_PATTERN}/?$`),\r\n paramNames: [],\r\n component,\r\n layouts,\r\n pageFile,\r\n layoutFiles: [],\r\n middlewares: [],\r\n loader: null,\r\n dynamic: \"force-static\",\r\n generateStaticParams: null,\r\n };\r\n}\r\n","import fs from \"fs\";\r\nimport path from \"path\";\r\nimport { ApiRoute, LoadedRoute, PageComponent, WssRoute } from \"./index.types\";\r\n\r\nimport { loadLayoutsForDir } from \"./layout\";\r\nimport { loadLoaderForDir } from \"./loader\";\r\nimport {\r\n loadRoutesFromManifest,\r\n loadNotFoundFromManifest,\r\n loadErrorFromManifest,\r\n loadChunksFromManifest,\r\n} from \"./loader-routes\";\r\nimport { loadRoutes } from \"./loader-pages\";\r\nimport { loadApiRoutes } from \"./loader-api\";\r\nimport {\r\n NOT_FOUND_PATTERN,\r\n ERROR_PATTERN,\r\n NOT_FOUND_FILE_PREFIX,\r\n ERROR_FILE_PREFIX,\r\n} from \"@constants/globals\";\r\nimport { loadWssRoutes } from \"./loader-wss\";\r\n\r\n/**\r\n * Unified interface for loading routes from different sources.\r\n * Abstracts the difference between filesystem (dev) and manifest (prod) loading.\r\n */\r\nexport interface RouteLoader {\r\n loadRoutes(): LoadedRoute[];\r\n loadApiRoutes(): ApiRoute[];\r\n loadWssRoutes(): WssRoute[];\r\n loadNotFoundRoute(): LoadedRoute | null;\r\n loadErrorRoute(): LoadedRoute | null;\r\n loadRouteChunks(): Record<string, string>;\r\n}\r\n\r\n/**\r\n * Loads routes directly from the filesystem.\r\n * Used in development mode.\r\n */\r\nexport class FilesystemRouteLoader implements RouteLoader {\r\n constructor(private appDir: string) {}\r\n\r\n loadRoutes(): LoadedRoute[] {\r\n return loadRoutes(this.appDir);\r\n }\r\n\r\n loadApiRoutes(): ApiRoute[] {\r\n return loadApiRoutes(this.appDir);\r\n }\r\n\r\n loadWssRoutes(): WssRoute[] {\r\n return loadWssRoutes(this.appDir);\r\n }\r\n\r\n loadNotFoundRoute(): LoadedRoute | null {\r\n return loadNotFoundRouteFromFilesystem(this.appDir);\r\n }\r\n\r\n loadErrorRoute(): LoadedRoute | null {\r\n return loadErrorRouteFromFilesystem(this.appDir);\r\n }\r\n\r\n loadRouteChunks(): Record<string, string> {\r\n // In dev, route chunks are not critical, return empty\r\n return {};\r\n }\r\n}\r\n\r\n/**\r\n * Loads routes from the compiled manifest file.\r\n * Used in production mode.\r\n */\r\nexport class ManifestRouteLoader implements RouteLoader {\r\n constructor(private projectRoot: string) {}\r\n\r\n loadRoutes(): LoadedRoute[] {\r\n const { routes } = loadRoutesFromManifest(this.projectRoot);\r\n return routes;\r\n }\r\n\r\n loadApiRoutes(): ApiRoute[] {\r\n const { apiRoutes } = loadRoutesFromManifest(this.projectRoot);\r\n return apiRoutes;\r\n }\r\n\r\n loadWssRoutes(): WssRoute[] {\r\n const { wssRoutes } = loadRoutesFromManifest(this.projectRoot);\r\n return wssRoutes;\r\n }\r\n\r\n loadNotFoundRoute(): LoadedRoute | null {\r\n return loadNotFoundFromManifest(this.projectRoot);\r\n }\r\n\r\n loadErrorRoute(): LoadedRoute | null {\r\n return loadErrorFromManifest(this.projectRoot);\r\n }\r\n\r\n loadRouteChunks(): Record<string, string> {\r\n return loadChunksFromManifest(this.projectRoot);\r\n }\r\n}\r\n\r\n/**\r\n * Loads the not-found route from the filesystem.\r\n * Looks for `_not-found.tsx` in the app root (Next.js style).\r\n *\r\n * @param appDir - Root directory of the app\r\n * @returns LoadedRoute for the not-found page, or null if not found\r\n */\r\nexport function loadNotFoundRouteFromFilesystem(\r\n appDir: string\r\n): LoadedRoute | null {\r\n const notFoundCandidates = [\r\n path.join(appDir, `${NOT_FOUND_FILE_PREFIX}.tsx`),\r\n path.join(appDir, `${NOT_FOUND_FILE_PREFIX}.ts`),\r\n path.join(appDir, `${NOT_FOUND_FILE_PREFIX}.jsx`),\r\n path.join(appDir, `${NOT_FOUND_FILE_PREFIX}.js`),\r\n // Fallback to old style for backward compatibility\r\n path.join(appDir, \"not-found\", \"page.tsx\"),\r\n path.join(appDir, \"not-found\", \"page.ts\"),\r\n path.join(appDir, \"not-found\", \"page.jsx\"),\r\n path.join(appDir, \"not-found\", \"page.js\"),\r\n ];\r\n\r\n let notFoundFile: string | null = null;\r\n for (const candidate of notFoundCandidates) {\r\n if (fs.existsSync(candidate)) {\r\n notFoundFile = candidate;\r\n break;\r\n }\r\n }\r\n\r\n if (!notFoundFile) {\r\n return null;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-var-requires\r\n const mod = require(notFoundFile);\r\n const component: PageComponent = mod.default;\r\n\r\n if (!component) {\r\n return null;\r\n }\r\n\r\n // For _not-found.tsx in root, use appDir as the directory\r\n const notFoundDir = notFoundFile.includes(NOT_FOUND_FILE_PREFIX)\r\n ? appDir\r\n : path.dirname(notFoundFile);\r\n\r\n const { components: layouts, files: layoutFiles } = loadLayoutsForDir(\r\n notFoundDir,\r\n appDir\r\n );\r\n\r\n const { middlewares, loader, dynamic, generateStaticParams } =\r\n loadLoaderForDir(notFoundDir);\r\n\r\n return {\r\n pattern: NOT_FOUND_PATTERN,\r\n regex: new RegExp(`^${NOT_FOUND_PATTERN}/?$`),\r\n paramNames: [],\r\n component,\r\n layouts,\r\n pageFile: notFoundFile,\r\n layoutFiles,\r\n middlewares,\r\n loader,\r\n dynamic,\r\n generateStaticParams,\r\n };\r\n}\r\n\r\n/**\r\n * Loads the error route from the filesystem.\r\n * Looks for `_error.tsx` in the app root (Next.js style).\r\n *\r\n * @param appDir - Root directory of the app\r\n * @returns LoadedRoute for the error page, or null if not found\r\n */\r\nexport function loadErrorRouteFromFilesystem(\r\n appDir: string\r\n): LoadedRoute | null {\r\n const errorCandidates = [\r\n path.join(appDir, `${ERROR_FILE_PREFIX}.tsx`),\r\n path.join(appDir, `${ERROR_FILE_PREFIX}.ts`),\r\n path.join(appDir, `${ERROR_FILE_PREFIX}.jsx`),\r\n path.join(appDir, `${ERROR_FILE_PREFIX}.js`),\r\n ];\r\n\r\n let errorFile: string | null = null;\r\n for (const candidate of errorCandidates) {\r\n if (fs.existsSync(candidate)) {\r\n errorFile = candidate;\r\n break;\r\n }\r\n }\r\n\r\n if (!errorFile) {\r\n return null;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-var-requires\r\n const mod = require(errorFile);\r\n const component: PageComponent = mod.default;\r\n\r\n if (!component) {\r\n return null;\r\n }\r\n\r\n const { components: layouts, files: layoutFiles } = loadLayoutsForDir(\r\n appDir,\r\n appDir\r\n );\r\n\r\n const { middlewares, loader, dynamic, generateStaticParams } =\r\n loadLoaderForDir(appDir);\r\n\r\n return {\r\n pattern: ERROR_PATTERN,\r\n regex: new RegExp(`^${ERROR_PATTERN}/?$`),\r\n paramNames: [],\r\n component,\r\n layouts,\r\n pageFile: errorFile,\r\n layoutFiles,\r\n middlewares,\r\n loader,\r\n dynamic,\r\n generateStaticParams,\r\n };\r\n}\r\n","import fs from \"fs\";\r\nimport path from \"path\";\r\nimport { WssRoute } from \"./index.types\";\r\nimport {\r\n extractApiMiddlewares,\r\n extractRouteRegex,\r\n extractWssHandlersFromModule,\r\n loadModuleSafely,\r\n} from \"./helpers/routes\";\r\n\r\nconst ROUTE_FILE_REGEX = /events\\.(ts|tsx|js|jsx)$/;\r\n\r\nexport function loadWssRoutes(appDir: string): WssRoute[] {\r\n const apiRoot = path.join(appDir, \"wss\");\r\n const routes: WssRoute[] = [];\r\n\r\n if (!fs.existsSync(apiRoot)) return routes;\r\n\r\n function walk(currentDir: string) {\r\n const entries = fs.readdirSync(currentDir, { withFileTypes: true });\r\n\r\n for (const entry of entries) {\r\n const fullPath = path.join(currentDir, entry.name);\r\n\r\n if (entry.isDirectory()) {\r\n walk(fullPath);\r\n continue;\r\n }\r\n\r\n // Only process route files\r\n if (!ROUTE_FILE_REGEX.test(entry.name)) continue;\r\n\r\n const relToApp = path.relative(appDir, fullPath).replace(/\\\\/g, \"/\");\r\n const withoutRoute = relToApp.replace(/\\/events\\.(ts|tsx|js|jsx)$/, \"\");\r\n const pattern = \"/\" + withoutRoute;\r\n\r\n const { regex, paramNames } = extractRouteRegex(pattern);\r\n\r\n const mod = loadModuleSafely(fullPath);\r\n if (!mod) {\r\n continue;\r\n }\r\n\r\n const handlers = extractWssHandlersFromModule(mod);\r\n const { global: globalMiddlewares, methodSpecific: methodMiddlewares } =\r\n extractApiMiddlewares(mod, []);\r\n\r\n routes.push({\r\n pattern,\r\n regex,\r\n paramNames,\r\n handlers,\r\n middlewares: globalMiddlewares,\r\n methodMiddlewares,\r\n filePath: fullPath,\r\n });\r\n }\r\n }\r\n\r\n walk(apiRoot);\r\n\r\n return routes;\r\n}\r\n\r\n","import { rspack, type Compiler } from \"@rspack/core\";\r\nimport { createClientConfig } from \"../config/client\";\r\nimport { copyStaticAssets, generateAssetManifest } from \"../utils\";\r\nimport path from \"path\";\r\nimport fs from \"fs\";\r\nimport { BUILD_FOLDER_NAME } from \"@constants/globals\";\r\n\r\nexport interface ClientBundlerResult {\r\n outDir: string;\r\n waitForBuild?: () => Promise<void>;\r\n}\r\n\r\n/**\r\n * Starts the client bundler in watch mode for development.\r\n * \r\n * Automatically rebuilds when files change and copies static assets.\r\n * \r\n * @param projectRoot - Root directory of the project\r\n * @param mode - Build mode ('development' or 'production'), defaults to 'development'\r\n * @returns Output directory path\r\n * \r\n * @example\r\n * const { outDir } = startClientBundler('/path/to/project', 'development');\r\n * // Bundler is now watching for changes\r\n */\r\nexport function startClientBundler(\r\n projectRoot: string,\r\n mode: \"development\" | \"production\" = \"development\"\r\n): ClientBundlerResult {\r\n const { config, outDir } = createClientConfig(projectRoot, mode);\r\n\r\n copyStaticAssets(projectRoot, outDir);\r\n\r\n const compiler = rspack(config);\r\n \r\n // Track build state\r\n let isBuilding = false;\r\n let buildResolve: (() => void) | null = null;\r\n let buildPromise: Promise<void> | null = null;\r\n let lastBuildTime = Date.now();\r\n\r\n // Mark as building when compilation starts\r\n compiler.hooks.compile.tap(\"HotReload\", () => {\r\n isBuilding = true;\r\n // Create new promise for this build\r\n buildPromise = new Promise<void>((resolve) => {\r\n buildResolve = resolve;\r\n });\r\n });\r\n\r\n compiler.watch({}, (err, stats) => {\r\n if (err) {\r\n console.error(\"[framework][client] Rspack error:\", err);\r\n isBuilding = false;\r\n lastBuildTime = Date.now();\r\n // Resolve any waiting promises even on error\r\n if (buildResolve) {\r\n buildResolve();\r\n buildResolve = null;\r\n buildPromise = null;\r\n }\r\n return;\r\n }\r\n if (!stats) {\r\n isBuilding = false;\r\n lastBuildTime = Date.now();\r\n return;\r\n }\r\n\r\n if (stats.hasErrors()) {\r\n console.error(\r\n \"[framework][client] Build with errors:\\n\",\r\n stats.toString(\"errors-only\")\r\n );\r\n } else {\r\n console.log(\"[framework][client] ✓ Client bundle rebuilt successfully\");\r\n }\r\n \r\n isBuilding = false;\r\n lastBuildTime = Date.now();\r\n \r\n // Resolve waiting promise\r\n if (buildResolve) {\r\n buildResolve();\r\n buildResolve = null;\r\n buildPromise = null;\r\n }\r\n });\r\n\r\n return {\r\n outDir,\r\n waitForBuild: async () => {\r\n // If currently building, wait for it to finish\r\n if (isBuilding && buildPromise) {\r\n await buildPromise;\r\n // Give it a small delay to ensure files are written to disk\r\n await new Promise(resolve => setTimeout(resolve, 100));\r\n return;\r\n }\r\n \r\n // If not building, check if a build just finished recently\r\n // (within last 500ms) - this handles the case where the build\r\n // finished just before we checked\r\n const timeSinceLastBuild = Date.now() - lastBuildTime;\r\n if (timeSinceLastBuild < 500) {\r\n // Build just finished, wait a bit for files to be written\r\n await new Promise(resolve => setTimeout(resolve, 200));\r\n return;\r\n }\r\n \r\n // No build in progress and none recently finished, return immediately\r\n return Promise.resolve();\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * Builds the client bundle for production.\r\n * \r\n * Creates an optimized production bundle and copies static assets.\r\n * \r\n * @param projectRoot - Root directory of the project\r\n * @returns Promise that resolves with output directory path\r\n * \r\n * @example\r\n * const { outDir } = await buildClientBundle('/path/to/project');\r\n * // Production bundle created at {BUILD_FOLDER_NAME}/client\r\n */\r\nexport function buildClientBundle(\r\n projectRoot: string\r\n): Promise<ClientBundlerResult> {\r\n const { config, outDir } = createClientConfig(projectRoot, \"production\");\r\n const compiler = rspack(config);\r\n\r\n return new Promise<ClientBundlerResult>((resolve, reject) => {\r\n compiler.run((err, stats) => {\r\n compiler.close(() => {});\r\n\r\n if (err) {\r\n console.error(\"[framework][client] Build error:\", err);\r\n return reject(err);\r\n }\r\n if (!stats) {\r\n const error = new Error(\"No stats from Rspack\");\r\n console.error(\"[framework][client] Build error:\", error);\r\n return reject(error);\r\n }\r\n if (stats.hasErrors()) {\r\n console.error(\r\n \"[framework][client] Build with errors:\\n\",\r\n stats.toString(\"errors-only\")\r\n );\r\n return reject(new Error(\"Client build failed\"));\r\n }\r\n\r\n copyStaticAssets(projectRoot, outDir);\r\n\r\n // Generate asset manifest with hashed filenames\r\n const assetManifest = generateAssetManifest(outDir);\r\n \r\n // Save asset manifest\r\n const manifestPath = path.join(projectRoot, BUILD_FOLDER_NAME, \"asset-manifest.json\");\r\n fs.writeFileSync(manifestPath, JSON.stringify(assetManifest, null, 2), \"utf-8\");\r\n\r\n resolve({ outDir });\r\n });\r\n });\r\n}\r\n\r\n","import path from \"path\";\r\nimport { rspack, type Configuration } from \"@rspack/core\";\r\nimport { loadAliasesFromTsconfig } from \"../utils\";\r\nimport dotenv from 'dotenv';\r\nimport { BUILD_FOLDER_NAME, STATIC_PATH } from \"@constants/globals\";\r\n\r\n/**\r\n * Creates Rspack configuration for client bundle.\r\n *\r\n * @param projectRoot - Root directory of the project\r\n * @param mode - Build mode ('development' or 'production')\r\n * @returns Rspack configuration and output directory\r\n *\r\n * @example\r\n * const { config, outDir } = createClientConfig('/path/to/project', 'production');\r\n */\r\nexport function createClientConfig(\r\n projectRoot: string,\r\n mode: \"development\" | \"production\"\r\n): { config: Configuration; outDir: string } {\r\n const buildDir = path.join(projectRoot, BUILD_FOLDER_NAME);\r\n const clientEntry = path.join(buildDir, \"boostrap.ts\");\r\n const outDir = path.join(buildDir, \"client\");\r\n\r\n dotenv.config({\r\n path: projectRoot,\r\n });\r\n\r\n const publicEnv: Record<string, string> = {};\r\n\r\n for (const [key, value] of Object.entries(process.env)) {\r\n if (key.startsWith(\"PUBLIC_\")) {\r\n publicEnv[`process.env.${key}`] = JSON.stringify(value ?? \"\");\r\n }\r\n }\r\n\r\n const config: Configuration = {\r\n mode,\r\n entry: {\r\n client: clientEntry,\r\n },\r\n output: {\r\n path: outDir,\r\n filename: mode === \"production\" ? \"client.[contenthash].js\" : \"client.js\", // Main entry\r\n chunkFilename: mode === \"production\" ? \"[name].[contenthash].js\" : \"[name].js\", // Code-split chunks (route-..., 0.js, etc.)\r\n publicPath: `${STATIC_PATH}/`,\r\n },\r\n context: projectRoot,\r\n resolve: {\r\n extensions: [\".tsx\", \".ts\", \".jsx\", \".js\"],\r\n alias: loadAliasesFromTsconfig(projectRoot),\r\n },\r\n module: {\r\n rules: [\r\n {\r\n test: /\\.[jt]sx?$/,\r\n loader: \"builtin:swc-loader\",\r\n options: {\r\n jsc: {\r\n parser: { syntax: \"typescript\", tsx: true },\r\n transform: {\r\n react: {\r\n runtime: \"automatic\",\r\n development: mode === \"development\",\r\n refresh: false,\r\n },\r\n },\r\n },\r\n },\r\n },\r\n {\r\n test: /\\.css$/,\r\n use: [\r\n rspack.CssExtractRspackPlugin.loader,\r\n \"css-loader\",\r\n \"postcss-loader\",\r\n ],\r\n },\r\n ],\r\n },\r\n plugins: [\r\n new rspack.DefinePlugin({\r\n \"process.env.NODE_ENV\": JSON.stringify(process.env.NODE_ENV),\r\n ...publicEnv,\r\n }),\r\n new rspack.CssExtractRspackPlugin({\r\n filename: mode === \"production\" ? \"client.[contenthash].css\" : \"client.css\",\r\n }),\r\n ],\r\n infrastructureLogging: {\r\n level: \"error\",\r\n },\r\n stats: \"minimal\",\r\n };\r\n\r\n return { config, outDir };\r\n}\r\n","import fs from \"fs\";\r\nimport path from \"path\";\r\n\r\n/**\r\n * Ensures a directory exists, creating it recursively if needed.\r\n * \r\n * This is a convenience wrapper around `fs.mkdirSync` with `recursive: true`.\r\n * \r\n * @param dir - Directory path to ensure exists\r\n * \r\n * @example\r\n * ensureDir('/path/to/directory');\r\n * // Directory is created if it doesn't exist\r\n */\r\nexport function ensureDir(dir: string): void {\r\n fs.mkdirSync(dir, { recursive: true });\r\n}\r\n\r\n/**\r\n * Loads path aliases from tsconfig.json.\r\n * \r\n * Reads the tsconfig.json file and extracts path mappings from the `paths` option.\r\n * Falls back to a default `@app` alias if tsconfig.json is not found or invalid.\r\n * \r\n * @param projectRoot - Root directory of the project\r\n * @returns Record of alias keys to resolved paths\r\n * \r\n * @example\r\n * // tsconfig.json\r\n * // {\r\n * // \"compilerOptions\": {\r\n * // \"paths\": {\r\n * // \"@components/*\": [\"components/*\"]\r\n * // }\r\n * // }\r\n * // }\r\n * \r\n * loadAliasesFromTsconfig('/project')\r\n * // { '@components': '/project/components', '@app': '/project/app' }\r\n */\r\nexport function loadAliasesFromTsconfig(\r\n projectRoot: string\r\n): Record<string, string> {\r\n const tsconfigPath = path.join(projectRoot, \"tsconfig.json\");\r\n const aliases: Record<string, string> = {};\r\n\r\n if (!fs.existsSync(tsconfigPath)) {\r\n // Fallback: default @app alias\r\n aliases[\"@app\"] = path.resolve(projectRoot, \"app\");\r\n return aliases;\r\n }\r\n\r\n let tsconfig: any;\r\n try {\r\n tsconfig = JSON.parse(fs.readFileSync(tsconfigPath, \"utf-8\"));\r\n } catch (err) {\r\n console.warn(\"[framework] Could not read tsconfig.json:\", err);\r\n aliases[\"@app\"] = path.resolve(projectRoot, \"app\");\r\n return aliases;\r\n }\r\n\r\n const compilerOptions = tsconfig.compilerOptions ?? {};\r\n const paths = compilerOptions.paths ?? {};\r\n const baseUrl = compilerOptions.baseUrl ?? \".\";\r\n\r\n for (const [aliasPattern, targets] of Object.entries(paths) as [\r\n string,\r\n string[]\r\n ][]) {\r\n if (!Array.isArray(targets) || targets.length === 0) continue;\r\n\r\n // aliasPattern like \"@components/*\" -> \"@components\"\r\n const aliasKey = aliasPattern.replace(/\\/\\*$/, \"\");\r\n const firstTarget = targets[0]; // \"components/*\"\r\n const targetPath = firstTarget.replace(/\\/\\*$/, \"\");\r\n\r\n const resolved = path.resolve(projectRoot, baseUrl, targetPath);\r\n aliases[aliasKey] = resolved;\r\n }\r\n\r\n // Fallback: ensure @app alias exists\r\n if (!aliases[\"@app\"]) {\r\n aliases[\"@app\"] = path.resolve(projectRoot, \"app\");\r\n }\r\n\r\n return aliases;\r\n}\r\n\r\n/**\r\n * Recursively copies a directory and all its contents.\r\n * \r\n * @param srcDir - Source directory to copy from\r\n * @param destDir - Destination directory to copy to\r\n */\r\nexport function copyDirRecursive(srcDir: string, destDir: string): void {\r\n if (!fs.existsSync(srcDir)) return;\r\n ensureDir(destDir);\r\n\r\n const entries = fs.readdirSync(srcDir, { withFileTypes: true });\r\n for (const entry of entries) {\r\n const srcPath = path.join(srcDir, entry.name);\r\n const destPath = path.join(destDir, entry.name);\r\n\r\n if (entry.isDirectory()) {\r\n copyDirRecursive(srcPath, destPath);\r\n } else if (entry.isFile()) {\r\n fs.copyFileSync(srcPath, destPath);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Copies static assets to the output directory.\r\n * \r\n * Copies:\r\n * 1. `assets/` directory (if exists) → `outDir/assets/`\r\n * 2. Favicon files (`favicon.ico` or `favicon.png`) from `app/` or project root\r\n * \r\n * @param projectRoot - Root directory of the project\r\n * @param outDir - Output directory to copy assets to\r\n * \r\n * @example\r\n * copyStaticAssets('/project', '/project/{BUILD_FOLDER_NAME}/client');\r\n * // Copies assets/ and favicon.* to {BUILD_FOLDER_NAME}/client/\r\n */\r\nexport function copyStaticAssets(projectRoot: string, outDir: string): void {\r\n // 1) Copy assets/ directory (if exists) → {BUILD_FOLDER_NAME}/client/assets/\r\n const assetsSrc = path.join(projectRoot, \"assets\");\r\n const assetsDest = path.join(outDir, \"assets\");\r\n copyDirRecursive(assetsSrc, assetsDest);\r\n\r\n // 2) Find and copy favicon from app/ or project root\r\n const appDir = path.join(projectRoot, \"app\");\r\n const candidates = [\"favicon.ico\", \"favicon.png\"];\r\n\r\n for (const name of candidates) {\r\n const fromApp = path.join(appDir, name);\r\n const fromRoot = path.join(projectRoot, name);\r\n\r\n let src: string | null = null;\r\n if (fs.existsSync(fromApp)) src = fromApp;\r\n else if (fs.existsSync(fromRoot)) src = fromRoot;\r\n\r\n if (src) {\r\n const dest = path.join(outDir, name); // Will be served as ${STATIC_PATH}/favicon.*\r\n ensureDir(path.dirname(dest));\r\n fs.copyFileSync(src, dest);\r\n break; // Use the first one found\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Asset manifest interface for tracking hashed filenames.\r\n */\r\nexport interface AssetManifest {\r\n client: {\r\n js: string; // e.g., \"client.abc123.js\"\r\n css: string; // e.g., \"client.def456.css\"\r\n };\r\n chunks: Record<string, string>; // chunk name -> hashed filename, e.g., \"route-root\" -> \"route-root.xyz789.js\"\r\n}\r\n\r\n/**\r\n * Generates an asset manifest by scanning the build output directory.\r\n * \r\n * Finds files with content hashes and maps them to their logical names.\r\n * \r\n * @param outDir - Output directory to scan\r\n * @returns Asset manifest with hashed filenames\r\n * \r\n * @example\r\n * const manifest = generateAssetManifest('/project/.loly/client');\r\n * // { client: { js: 'client.abc123.js', css: 'client.def456.css' }, chunks: {...} }\r\n */\r\nexport function generateAssetManifest(outDir: string): AssetManifest {\r\n const manifest: AssetManifest = {\r\n client: {\r\n js: \"client.js\",\r\n css: \"client.css\",\r\n },\r\n chunks: {},\r\n };\r\n\r\n if (!fs.existsSync(outDir)) {\r\n return manifest;\r\n }\r\n\r\n const files = fs.readdirSync(outDir);\r\n \r\n // Find client.js (with or without hash)\r\n const clientJsMatch = files.find((f) => /^client\\.[\\w-]+\\.js$/.test(f) || f === \"client.js\");\r\n if (clientJsMatch) {\r\n manifest.client.js = clientJsMatch;\r\n }\r\n\r\n // Find client.css (with or without hash)\r\n const clientCssMatch = files.find((f) => /^client\\.[\\w-]+\\.css$/.test(f) || f === \"client.css\");\r\n if (clientCssMatch) {\r\n manifest.client.css = clientCssMatch;\r\n }\r\n\r\n // Find all chunk files (route-*.js, 0.js, 1.js, etc. with or without hash)\r\n // Pattern: route-*.js or numeric chunks like 0.js, 1.js, etc.\r\n for (const file of files) {\r\n if (!file.endsWith(\".js\")) continue;\r\n \r\n // Skip the main client.js file\r\n if (file === manifest.client.js) continue;\r\n \r\n // Match route chunks: route-*.js or route-*.[hash].js\r\n const routeMatch = file.match(/^(route-[^.]+)(\\.[\\w-]+)?\\.js$/);\r\n if (routeMatch) {\r\n const chunkName = routeMatch[1]; // e.g., \"route-root\"\r\n manifest.chunks[chunkName] = file;\r\n continue;\r\n }\r\n \r\n // Match numeric chunks: 0.js, 1.js, etc. or 0.[hash].js\r\n const numericMatch = file.match(/^(\\d+)(\\.[\\w-]+)?\\.js$/);\r\n if (numericMatch) {\r\n const chunkName = numericMatch[1]; // e.g., \"0\"\r\n manifest.chunks[chunkName] = file;\r\n }\r\n }\r\n\r\n return manifest;\r\n}\r\n\r\n/**\r\n * Loads the asset manifest from the build directory.\r\n * \r\n * @param projectRoot - Root directory of the project\r\n * @returns Asset manifest or null if not found\r\n */\r\nexport function loadAssetManifest(projectRoot: string): AssetManifest | null {\r\n const { BUILD_FOLDER_NAME } = require(\"@constants/globals\");\r\n const manifestPath = path.join(projectRoot, BUILD_FOLDER_NAME, \"asset-manifest.json\");\r\n \r\n if (!fs.existsSync(manifestPath)) {\r\n return null;\r\n }\r\n\r\n try {\r\n const manifest: AssetManifest = JSON.parse(fs.readFileSync(manifestPath, \"utf-8\"));\r\n return manifest;\r\n } catch (err) {\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Gets the client JS path with hash from the asset manifest.\r\n * Falls back to default path if manifest is not available.\r\n * \r\n * @param projectRoot - Root directory of the project\r\n * @returns Path to client JS file (e.g., \"/static/client.abc123.js\")\r\n */\r\nexport function getClientJsPath(projectRoot: string): string {\r\n const { STATIC_PATH } = require(\"@constants/globals\");\r\n const manifest = loadAssetManifest(projectRoot);\r\n const filename = manifest?.client.js || \"client.js\";\r\n return `${STATIC_PATH}/${filename}`;\r\n}\r\n\r\n/**\r\n * Gets the client CSS path with hash from the asset manifest.\r\n * Falls back to default path if manifest is not available.\r\n * \r\n * @param projectRoot - Root directory of the project\r\n * @returns Path to client CSS file (e.g., \"/static/client.def456.css\")\r\n */\r\nexport function getClientCssPath(projectRoot: string): string {\r\n const { STATIC_PATH } = require(\"@constants/globals\");\r\n const manifest = loadAssetManifest(projectRoot);\r\n const filename = manifest?.client.css || \"client.css\";\r\n return `${STATIC_PATH}/${filename}`;\r\n}","/*! chokidar - MIT License (c) 2012 Paul Miller (paulmillr.com) */\nimport { stat as statcb } from 'fs';\nimport { stat, readdir } from 'fs/promises';\nimport { EventEmitter } from 'events';\nimport * as sysPath from 'path';\nimport { readdirp } from 'readdirp';\nimport { NodeFsHandler, EVENTS as EV, isWindows, isIBMi, EMPTY_FN, STR_CLOSE, STR_END, } from './handler.js';\nconst SLASH = '/';\nconst SLASH_SLASH = '//';\nconst ONE_DOT = '.';\nconst TWO_DOTS = '..';\nconst STRING_TYPE = 'string';\nconst BACK_SLASH_RE = /\\\\/g;\nconst DOUBLE_SLASH_RE = /\\/\\//;\nconst DOT_RE = /\\..*\\.(sw[px])$|~$|\\.subl.*\\.tmp/;\nconst REPLACER_RE = /^\\.[/\\\\]/;\nfunction arrify(item) {\n return Array.isArray(item) ? item : [item];\n}\nconst isMatcherObject = (matcher) => typeof matcher === 'object' && matcher !== null && !(matcher instanceof RegExp);\nfunction createPattern(matcher) {\n if (typeof matcher === 'function')\n return matcher;\n if (typeof matcher === 'string')\n return (string) => matcher === string;\n if (matcher instanceof RegExp)\n return (string) => matcher.test(string);\n if (typeof matcher === 'object' && matcher !== null) {\n return (string) => {\n if (matcher.path === string)\n return true;\n if (matcher.recursive) {\n const relative = sysPath.relative(matcher.path, string);\n if (!relative) {\n return false;\n }\n return !relative.startsWith('..') && !sysPath.isAbsolute(relative);\n }\n return false;\n };\n }\n return () => false;\n}\nfunction normalizePath(path) {\n if (typeof path !== 'string')\n throw new Error('string expected');\n path = sysPath.normalize(path);\n path = path.replace(/\\\\/g, '/');\n let prepend = false;\n if (path.startsWith('//'))\n prepend = true;\n const DOUBLE_SLASH_RE = /\\/\\//;\n while (path.match(DOUBLE_SLASH_RE))\n path = path.replace(DOUBLE_SLASH_RE, '/');\n if (prepend)\n path = '/' + path;\n return path;\n}\nfunction matchPatterns(patterns, testString, stats) {\n const path = normalizePath(testString);\n for (let index = 0; index < patterns.length; index++) {\n const pattern = patterns[index];\n if (pattern(path, stats)) {\n return true;\n }\n }\n return false;\n}\nfunction anymatch(matchers, testString) {\n if (matchers == null) {\n throw new TypeError('anymatch: specify first argument');\n }\n // Early cache for matchers.\n const matchersArray = arrify(matchers);\n const patterns = matchersArray.map((matcher) => createPattern(matcher));\n if (testString == null) {\n return (testString, stats) => {\n return matchPatterns(patterns, testString, stats);\n };\n }\n return matchPatterns(patterns, testString);\n}\nconst unifyPaths = (paths_) => {\n const paths = arrify(paths_).flat();\n if (!paths.every((p) => typeof p === STRING_TYPE)) {\n throw new TypeError(`Non-string provided as watch path: ${paths}`);\n }\n return paths.map(normalizePathToUnix);\n};\n// If SLASH_SLASH occurs at the beginning of path, it is not replaced\n// because \"//StoragePC/DrivePool/Movies\" is a valid network path\nconst toUnix = (string) => {\n let str = string.replace(BACK_SLASH_RE, SLASH);\n let prepend = false;\n if (str.startsWith(SLASH_SLASH)) {\n prepend = true;\n }\n while (str.match(DOUBLE_SLASH_RE)) {\n str = str.replace(DOUBLE_SLASH_RE, SLASH);\n }\n if (prepend) {\n str = SLASH + str;\n }\n return str;\n};\n// Our version of upath.normalize\n// TODO: this is not equal to path-normalize module - investigate why\nconst normalizePathToUnix = (path) => toUnix(sysPath.normalize(toUnix(path)));\n// TODO: refactor\nconst normalizeIgnored = (cwd = '') => (path) => {\n if (typeof path === 'string') {\n return normalizePathToUnix(sysPath.isAbsolute(path) ? path : sysPath.join(cwd, path));\n }\n else {\n return path;\n }\n};\nconst getAbsolutePath = (path, cwd) => {\n if (sysPath.isAbsolute(path)) {\n return path;\n }\n return sysPath.join(cwd, path);\n};\nconst EMPTY_SET = Object.freeze(new Set());\n/**\n * Directory entry.\n */\nclass DirEntry {\n constructor(dir, removeWatcher) {\n this.path = dir;\n this._removeWatcher = removeWatcher;\n this.items = new Set();\n }\n add(item) {\n const { items } = this;\n if (!items)\n return;\n if (item !== ONE_DOT && item !== TWO_DOTS)\n items.add(item);\n }\n async remove(item) {\n const { items } = this;\n if (!items)\n return;\n items.delete(item);\n if (items.size > 0)\n return;\n const dir = this.path;\n try {\n await readdir(dir);\n }\n catch (err) {\n if (this._removeWatcher) {\n this._removeWatcher(sysPath.dirname(dir), sysPath.basename(dir));\n }\n }\n }\n has(item) {\n const { items } = this;\n if (!items)\n return;\n return items.has(item);\n }\n getChildren() {\n const { items } = this;\n if (!items)\n return [];\n return [...items.values()];\n }\n dispose() {\n this.items.clear();\n this.path = '';\n this._removeWatcher = EMPTY_FN;\n this.items = EMPTY_SET;\n Object.freeze(this);\n }\n}\nconst STAT_METHOD_F = 'stat';\nconst STAT_METHOD_L = 'lstat';\nexport class WatchHelper {\n constructor(path, follow, fsw) {\n this.fsw = fsw;\n const watchPath = path;\n this.path = path = path.replace(REPLACER_RE, '');\n this.watchPath = watchPath;\n this.fullWatchPath = sysPath.resolve(watchPath);\n this.dirParts = [];\n this.dirParts.forEach((parts) => {\n if (parts.length > 1)\n parts.pop();\n });\n this.followSymlinks = follow;\n this.statMethod = follow ? STAT_METHOD_F : STAT_METHOD_L;\n }\n entryPath(entry) {\n return sysPath.join(this.watchPath, sysPath.relative(this.watchPath, entry.fullPath));\n }\n filterPath(entry) {\n const { stats } = entry;\n if (stats && stats.isSymbolicLink())\n return this.filterDir(entry);\n const resolvedPath = this.entryPath(entry);\n // TODO: what if stats is undefined? remove !\n return this.fsw._isntIgnored(resolvedPath, stats) && this.fsw._hasReadPermissions(stats);\n }\n filterDir(entry) {\n return this.fsw._isntIgnored(this.entryPath(entry), entry.stats);\n }\n}\n/**\n * Watches files & directories for changes. Emitted events:\n * `add`, `addDir`, `change`, `unlink`, `unlinkDir`, `all`, `error`\n *\n * new FSWatcher()\n * .add(directories)\n * .on('add', path => log('File', path, 'was added'))\n */\nexport class FSWatcher extends EventEmitter {\n // Not indenting methods for history sake; for now.\n constructor(_opts = {}) {\n super();\n this.closed = false;\n this._closers = new Map();\n this._ignoredPaths = new Set();\n this._throttled = new Map();\n this._streams = new Set();\n this._symlinkPaths = new Map();\n this._watched = new Map();\n this._pendingWrites = new Map();\n this._pendingUnlinks = new Map();\n this._readyCount = 0;\n this._readyEmitted = false;\n const awf = _opts.awaitWriteFinish;\n const DEF_AWF = { stabilityThreshold: 2000, pollInterval: 100 };\n const opts = {\n // Defaults\n persistent: true,\n ignoreInitial: false,\n ignorePermissionErrors: false,\n interval: 100,\n binaryInterval: 300,\n followSymlinks: true,\n usePolling: false,\n // useAsync: false,\n atomic: true, // NOTE: overwritten later (depends on usePolling)\n ..._opts,\n // Change format\n ignored: _opts.ignored ? arrify(_opts.ignored) : arrify([]),\n awaitWriteFinish: awf === true ? DEF_AWF : typeof awf === 'object' ? { ...DEF_AWF, ...awf } : false,\n };\n // Always default to polling on IBM i because fs.watch() is not available on IBM i.\n if (isIBMi)\n opts.usePolling = true;\n // Editor atomic write normalization enabled by default with fs.watch\n if (opts.atomic === undefined)\n opts.atomic = !opts.usePolling;\n // opts.atomic = typeof _opts.atomic === 'number' ? _opts.atomic : 100;\n // Global override. Useful for developers, who need to force polling for all\n // instances of chokidar, regardless of usage / dependency depth\n const envPoll = process.env.CHOKIDAR_USEPOLLING;\n if (envPoll !== undefined) {\n const envLower = envPoll.toLowerCase();\n if (envLower === 'false' || envLower === '0')\n opts.usePolling = false;\n else if (envLower === 'true' || envLower === '1')\n opts.usePolling = true;\n else\n opts.usePolling = !!envLower;\n }\n const envInterval = process.env.CHOKIDAR_INTERVAL;\n if (envInterval)\n opts.interval = Number.parseInt(envInterval, 10);\n // This is done to emit ready only once, but each 'add' will increase that?\n let readyCalls = 0;\n this._emitReady = () => {\n readyCalls++;\n if (readyCalls >= this._readyCount) {\n this._emitReady = EMPTY_FN;\n this._readyEmitted = true;\n // use process.nextTick to allow time for listener to be bound\n process.nextTick(() => this.emit(EV.READY));\n }\n };\n this._emitRaw = (...args) => this.emit(EV.RAW, ...args);\n this._boundRemove = this._remove.bind(this);\n this.options = opts;\n this._nodeFsHandler = new NodeFsHandler(this);\n // You’re frozen when your heart’s not open.\n Object.freeze(opts);\n }\n _addIgnoredPath(matcher) {\n if (isMatcherObject(matcher)) {\n // return early if we already have a deeply equal matcher object\n for (const ignored of this._ignoredPaths) {\n if (isMatcherObject(ignored) &&\n ignored.path === matcher.path &&\n ignored.recursive === matcher.recursive) {\n return;\n }\n }\n }\n this._ignoredPaths.add(matcher);\n }\n _removeIgnoredPath(matcher) {\n this._ignoredPaths.delete(matcher);\n // now find any matcher objects with the matcher as path\n if (typeof matcher === 'string') {\n for (const ignored of this._ignoredPaths) {\n // TODO (43081j): make this more efficient.\n // probably just make a `this._ignoredDirectories` or some\n // such thing.\n if (isMatcherObject(ignored) && ignored.path === matcher) {\n this._ignoredPaths.delete(ignored);\n }\n }\n }\n }\n // Public methods\n /**\n * Adds paths to be watched on an existing FSWatcher instance.\n * @param paths_ file or file list. Other arguments are unused\n */\n add(paths_, _origAdd, _internal) {\n const { cwd } = this.options;\n this.closed = false;\n this._closePromise = undefined;\n let paths = unifyPaths(paths_);\n if (cwd) {\n paths = paths.map((path) => {\n const absPath = getAbsolutePath(path, cwd);\n // Check `path` instead of `absPath` because the cwd portion can't be a glob\n return absPath;\n });\n }\n paths.forEach((path) => {\n this._removeIgnoredPath(path);\n });\n this._userIgnored = undefined;\n if (!this._readyCount)\n this._readyCount = 0;\n this._readyCount += paths.length;\n Promise.all(paths.map(async (path) => {\n const res = await this._nodeFsHandler._addToNodeFs(path, !_internal, undefined, 0, _origAdd);\n if (res)\n this._emitReady();\n return res;\n })).then((results) => {\n if (this.closed)\n return;\n results.forEach((item) => {\n if (item)\n this.add(sysPath.dirname(item), sysPath.basename(_origAdd || item));\n });\n });\n return this;\n }\n /**\n * Close watchers or start ignoring events from specified paths.\n */\n unwatch(paths_) {\n if (this.closed)\n return this;\n const paths = unifyPaths(paths_);\n const { cwd } = this.options;\n paths.forEach((path) => {\n // convert to absolute path unless relative path already matches\n if (!sysPath.isAbsolute(path) && !this._closers.has(path)) {\n if (cwd)\n path = sysPath.join(cwd, path);\n path = sysPath.resolve(path);\n }\n this._closePath(path);\n this._addIgnoredPath(path);\n if (this._watched.has(path)) {\n this._addIgnoredPath({\n path,\n recursive: true,\n });\n }\n // reset the cached userIgnored anymatch fn\n // to make ignoredPaths changes effective\n this._userIgnored = undefined;\n });\n return this;\n }\n /**\n * Close watchers and remove all listeners from watched paths.\n */\n close() {\n if (this._closePromise) {\n return this._closePromise;\n }\n this.closed = true;\n // Memory management.\n this.removeAllListeners();\n const closers = [];\n this._closers.forEach((closerList) => closerList.forEach((closer) => {\n const promise = closer();\n if (promise instanceof Promise)\n closers.push(promise);\n }));\n this._streams.forEach((stream) => stream.destroy());\n this._userIgnored = undefined;\n this._readyCount = 0;\n this._readyEmitted = false;\n this._watched.forEach((dirent) => dirent.dispose());\n this._closers.clear();\n this._watched.clear();\n this._streams.clear();\n this._symlinkPaths.clear();\n this._throttled.clear();\n this._closePromise = closers.length\n ? Promise.all(closers).then(() => undefined)\n : Promise.resolve();\n return this._closePromise;\n }\n /**\n * Expose list of watched paths\n * @returns for chaining\n */\n getWatched() {\n const watchList = {};\n this._watched.forEach((entry, dir) => {\n const key = this.options.cwd ? sysPath.relative(this.options.cwd, dir) : dir;\n const index = key || ONE_DOT;\n watchList[index] = entry.getChildren().sort();\n });\n return watchList;\n }\n emitWithAll(event, args) {\n this.emit(event, ...args);\n if (event !== EV.ERROR)\n this.emit(EV.ALL, event, ...args);\n }\n // Common helpers\n // --------------\n /**\n * Normalize and emit events.\n * Calling _emit DOES NOT MEAN emit() would be called!\n * @param event Type of event\n * @param path File or directory path\n * @param stats arguments to be passed with event\n * @returns the error if defined, otherwise the value of the FSWatcher instance's `closed` flag\n */\n async _emit(event, path, stats) {\n if (this.closed)\n return;\n const opts = this.options;\n if (isWindows)\n path = sysPath.normalize(path);\n if (opts.cwd)\n path = sysPath.relative(opts.cwd, path);\n const args = [path];\n if (stats != null)\n args.push(stats);\n const awf = opts.awaitWriteFinish;\n let pw;\n if (awf && (pw = this._pendingWrites.get(path))) {\n pw.lastChange = new Date();\n return this;\n }\n if (opts.atomic) {\n if (event === EV.UNLINK) {\n this._pendingUnlinks.set(path, [event, ...args]);\n setTimeout(() => {\n this._pendingUnlinks.forEach((entry, path) => {\n this.emit(...entry);\n this.emit(EV.ALL, ...entry);\n this._pendingUnlinks.delete(path);\n });\n }, typeof opts.atomic === 'number' ? opts.atomic : 100);\n return this;\n }\n if (event === EV.ADD && this._pendingUnlinks.has(path)) {\n event = EV.CHANGE;\n this._pendingUnlinks.delete(path);\n }\n }\n if (awf && (event === EV.ADD || event === EV.CHANGE) && this._readyEmitted) {\n const awfEmit = (err, stats) => {\n if (err) {\n event = EV.ERROR;\n args[0] = err;\n this.emitWithAll(event, args);\n }\n else if (stats) {\n // if stats doesn't exist the file must have been deleted\n if (args.length > 1) {\n args[1] = stats;\n }\n else {\n args.push(stats);\n }\n this.emitWithAll(event, args);\n }\n };\n this._awaitWriteFinish(path, awf.stabilityThreshold, event, awfEmit);\n return this;\n }\n if (event === EV.CHANGE) {\n const isThrottled = !this._throttle(EV.CHANGE, path, 50);\n if (isThrottled)\n return this;\n }\n if (opts.alwaysStat &&\n stats === undefined &&\n (event === EV.ADD || event === EV.ADD_DIR || event === EV.CHANGE)) {\n const fullPath = opts.cwd ? sysPath.join(opts.cwd, path) : path;\n let stats;\n try {\n stats = await stat(fullPath);\n }\n catch (err) {\n // do nothing\n }\n // Suppress event when fs_stat fails, to avoid sending undefined 'stat'\n if (!stats || this.closed)\n return;\n args.push(stats);\n }\n this.emitWithAll(event, args);\n return this;\n }\n /**\n * Common handler for errors\n * @returns The error if defined, otherwise the value of the FSWatcher instance's `closed` flag\n */\n _handleError(error) {\n const code = error && error.code;\n if (error &&\n code !== 'ENOENT' &&\n code !== 'ENOTDIR' &&\n (!this.options.ignorePermissionErrors || (code !== 'EPERM' && code !== 'EACCES'))) {\n this.emit(EV.ERROR, error);\n }\n return error || this.closed;\n }\n /**\n * Helper utility for throttling\n * @param actionType type being throttled\n * @param path being acted upon\n * @param timeout duration of time to suppress duplicate actions\n * @returns tracking object or false if action should be suppressed\n */\n _throttle(actionType, path, timeout) {\n if (!this._throttled.has(actionType)) {\n this._throttled.set(actionType, new Map());\n }\n const action = this._throttled.get(actionType);\n if (!action)\n throw new Error('invalid throttle');\n const actionPath = action.get(path);\n if (actionPath) {\n actionPath.count++;\n return false;\n }\n // eslint-disable-next-line prefer-const\n let timeoutObject;\n const clear = () => {\n const item = action.get(path);\n const count = item ? item.count : 0;\n action.delete(path);\n clearTimeout(timeoutObject);\n if (item)\n clearTimeout(item.timeoutObject);\n return count;\n };\n timeoutObject = setTimeout(clear, timeout);\n const thr = { timeoutObject, clear, count: 0 };\n action.set(path, thr);\n return thr;\n }\n _incrReadyCount() {\n return this._readyCount++;\n }\n /**\n * Awaits write operation to finish.\n * Polls a newly created file for size variations. When files size does not change for 'threshold' milliseconds calls callback.\n * @param path being acted upon\n * @param threshold Time in milliseconds a file size must be fixed before acknowledging write OP is finished\n * @param event\n * @param awfEmit Callback to be called when ready for event to be emitted.\n */\n _awaitWriteFinish(path, threshold, event, awfEmit) {\n const awf = this.options.awaitWriteFinish;\n if (typeof awf !== 'object')\n return;\n const pollInterval = awf.pollInterval;\n let timeoutHandler;\n let fullPath = path;\n if (this.options.cwd && !sysPath.isAbsolute(path)) {\n fullPath = sysPath.join(this.options.cwd, path);\n }\n const now = new Date();\n const writes = this._pendingWrites;\n function awaitWriteFinishFn(prevStat) {\n statcb(fullPath, (err, curStat) => {\n if (err || !writes.has(path)) {\n if (err && err.code !== 'ENOENT')\n awfEmit(err);\n return;\n }\n const now = Number(new Date());\n if (prevStat && curStat.size !== prevStat.size) {\n writes.get(path).lastChange = now;\n }\n const pw = writes.get(path);\n const df = now - pw.lastChange;\n if (df >= threshold) {\n writes.delete(path);\n awfEmit(undefined, curStat);\n }\n else {\n timeoutHandler = setTimeout(awaitWriteFinishFn, pollInterval, curStat);\n }\n });\n }\n if (!writes.has(path)) {\n writes.set(path, {\n lastChange: now,\n cancelWait: () => {\n writes.delete(path);\n clearTimeout(timeoutHandler);\n return event;\n },\n });\n timeoutHandler = setTimeout(awaitWriteFinishFn, pollInterval);\n }\n }\n /**\n * Determines whether user has asked to ignore this path.\n */\n _isIgnored(path, stats) {\n if (this.options.atomic && DOT_RE.test(path))\n return true;\n if (!this._userIgnored) {\n const { cwd } = this.options;\n const ign = this.options.ignored;\n const ignored = (ign || []).map(normalizeIgnored(cwd));\n const ignoredPaths = [...this._ignoredPaths];\n const list = [...ignoredPaths.map(normalizeIgnored(cwd)), ...ignored];\n this._userIgnored = anymatch(list, undefined);\n }\n return this._userIgnored(path, stats);\n }\n _isntIgnored(path, stat) {\n return !this._isIgnored(path, stat);\n }\n /**\n * Provides a set of common helpers and properties relating to symlink handling.\n * @param path file or directory pattern being watched\n */\n _getWatchHelpers(path) {\n return new WatchHelper(path, this.options.followSymlinks, this);\n }\n // Directory helpers\n // -----------------\n /**\n * Provides directory tracking objects\n * @param directory path of the directory\n */\n _getWatchedDir(directory) {\n const dir = sysPath.resolve(directory);\n if (!this._watched.has(dir))\n this._watched.set(dir, new DirEntry(dir, this._boundRemove));\n return this._watched.get(dir);\n }\n // File helpers\n // ------------\n /**\n * Check for read permissions: https://stackoverflow.com/a/11781404/1358405\n */\n _hasReadPermissions(stats) {\n if (this.options.ignorePermissionErrors)\n return true;\n return Boolean(Number(stats.mode) & 0o400);\n }\n /**\n * Handles emitting unlink events for\n * files and directories, and via recursion, for\n * files and directories within directories that are unlinked\n * @param directory within which the following item is located\n * @param item base path of item/directory\n */\n _remove(directory, item, isDirectory) {\n // if what is being deleted is a directory, get that directory's paths\n // for recursive deleting and cleaning of watched object\n // if it is not a directory, nestedDirectoryChildren will be empty array\n const path = sysPath.join(directory, item);\n const fullPath = sysPath.resolve(path);\n isDirectory =\n isDirectory != null ? isDirectory : this._watched.has(path) || this._watched.has(fullPath);\n // prevent duplicate handling in case of arriving here nearly simultaneously\n // via multiple paths (such as _handleFile and _handleDir)\n if (!this._throttle('remove', path, 100))\n return;\n // if the only watched file is removed, watch for its return\n if (!isDirectory && this._watched.size === 1) {\n this.add(directory, item, true);\n }\n // This will create a new entry in the watched object in either case\n // so we got to do the directory check beforehand\n const wp = this._getWatchedDir(path);\n const nestedDirectoryChildren = wp.getChildren();\n // Recursively remove children directories / files.\n nestedDirectoryChildren.forEach((nested) => this._remove(path, nested));\n // Check if item was on the watched list and remove it\n const parent = this._getWatchedDir(directory);\n const wasTracked = parent.has(item);\n parent.remove(item);\n // Fixes issue #1042 -> Relative paths were detected and added as symlinks\n // (https://github.com/paulmillr/chokidar/blob/e1753ddbc9571bdc33b4a4af172d52cb6e611c10/lib/nodefs-handler.js#L612),\n // but never removed from the map in case the path was deleted.\n // This leads to an incorrect state if the path was recreated:\n // https://github.com/paulmillr/chokidar/blob/e1753ddbc9571bdc33b4a4af172d52cb6e611c10/lib/nodefs-handler.js#L553\n if (this._symlinkPaths.has(fullPath)) {\n this._symlinkPaths.delete(fullPath);\n }\n // If we wait for this file to be fully written, cancel the wait.\n let relPath = path;\n if (this.options.cwd)\n relPath = sysPath.relative(this.options.cwd, path);\n if (this.options.awaitWriteFinish && this._pendingWrites.has(relPath)) {\n const event = this._pendingWrites.get(relPath).cancelWait();\n if (event === EV.ADD)\n return;\n }\n // The Entry will either be a directory that just got removed\n // or a bogus entry to a file, in either case we have to remove it\n this._watched.delete(path);\n this._watched.delete(fullPath);\n const eventName = isDirectory ? EV.UNLINK_DIR : EV.UNLINK;\n if (wasTracked && !this._isIgnored(path))\n this._emit(eventName, path);\n // Avoid conflicts if we later create another file with the same name\n this._closePath(path);\n }\n /**\n * Closes all watchers for a path\n */\n _closePath(path) {\n this._closeFile(path);\n const dir = sysPath.dirname(path);\n this._getWatchedDir(dir).remove(sysPath.basename(path));\n }\n /**\n * Closes only file-specific watchers\n */\n _closeFile(path) {\n const closers = this._closers.get(path);\n if (!closers)\n return;\n closers.forEach((closer) => closer());\n this._closers.delete(path);\n }\n _addPathCloser(path, closer) {\n if (!closer)\n return;\n let list = this._closers.get(path);\n if (!list) {\n list = [];\n this._closers.set(path, list);\n }\n list.push(closer);\n }\n _readdirp(root, opts) {\n if (this.closed)\n return;\n const options = { type: EV.ALL, alwaysStat: true, lstat: true, ...opts, depth: 0 };\n let stream = readdirp(root, options);\n this._streams.add(stream);\n stream.once(STR_CLOSE, () => {\n stream = undefined;\n });\n stream.once(STR_END, () => {\n if (stream) {\n this._streams.delete(stream);\n stream = undefined;\n }\n });\n return stream;\n }\n}\n/**\n * Instantiates watcher with paths to be tracked.\n * @param paths file / directory paths\n * @param options opts, such as `atomic`, `awaitWriteFinish`, `ignored`, and others\n * @returns an instance of FSWatcher for chaining.\n * @example\n * const watcher = watch('.').on('all', (event, path) => { console.log(event, path); });\n * watch('.', { atomic: true, awaitWriteFinish: true, ignored: (f, stats) => stats?.isFile() && !f.endsWith('.js') })\n */\nexport function watch(paths, options = {}) {\n const watcher = new FSWatcher(options);\n watcher.add(paths);\n return watcher;\n}\nexport default { watch, FSWatcher };\n","import { stat, lstat, readdir, realpath } from 'node:fs/promises';\nimport { Readable } from 'node:stream';\nimport { resolve as presolve, relative as prelative, join as pjoin, sep as psep } from 'node:path';\nexport const EntryTypes = {\n FILE_TYPE: 'files',\n DIR_TYPE: 'directories',\n FILE_DIR_TYPE: 'files_directories',\n EVERYTHING_TYPE: 'all',\n};\nconst defaultOptions = {\n root: '.',\n fileFilter: (_entryInfo) => true,\n directoryFilter: (_entryInfo) => true,\n type: EntryTypes.FILE_TYPE,\n lstat: false,\n depth: 2147483648,\n alwaysStat: false,\n highWaterMark: 4096,\n};\nObject.freeze(defaultOptions);\nconst RECURSIVE_ERROR_CODE = 'READDIRP_RECURSIVE_ERROR';\nconst NORMAL_FLOW_ERRORS = new Set(['ENOENT', 'EPERM', 'EACCES', 'ELOOP', RECURSIVE_ERROR_CODE]);\nconst ALL_TYPES = [\n EntryTypes.DIR_TYPE,\n EntryTypes.EVERYTHING_TYPE,\n EntryTypes.FILE_DIR_TYPE,\n EntryTypes.FILE_TYPE,\n];\nconst DIR_TYPES = new Set([\n EntryTypes.DIR_TYPE,\n EntryTypes.EVERYTHING_TYPE,\n EntryTypes.FILE_DIR_TYPE,\n]);\nconst FILE_TYPES = new Set([\n EntryTypes.EVERYTHING_TYPE,\n EntryTypes.FILE_DIR_TYPE,\n EntryTypes.FILE_TYPE,\n]);\nconst isNormalFlowError = (error) => NORMAL_FLOW_ERRORS.has(error.code);\nconst wantBigintFsStats = process.platform === 'win32';\nconst emptyFn = (_entryInfo) => true;\nconst normalizeFilter = (filter) => {\n if (filter === undefined)\n return emptyFn;\n if (typeof filter === 'function')\n return filter;\n if (typeof filter === 'string') {\n const fl = filter.trim();\n return (entry) => entry.basename === fl;\n }\n if (Array.isArray(filter)) {\n const trItems = filter.map((item) => item.trim());\n return (entry) => trItems.some((f) => entry.basename === f);\n }\n return emptyFn;\n};\n/** Readable readdir stream, emitting new files as they're being listed. */\nexport class ReaddirpStream extends Readable {\n constructor(options = {}) {\n super({\n objectMode: true,\n autoDestroy: true,\n highWaterMark: options.highWaterMark,\n });\n const opts = { ...defaultOptions, ...options };\n const { root, type } = opts;\n this._fileFilter = normalizeFilter(opts.fileFilter);\n this._directoryFilter = normalizeFilter(opts.directoryFilter);\n const statMethod = opts.lstat ? lstat : stat;\n // Use bigint stats if it's windows and stat() supports options (node 10+).\n if (wantBigintFsStats) {\n this._stat = (path) => statMethod(path, { bigint: true });\n }\n else {\n this._stat = statMethod;\n }\n this._maxDepth = opts.depth ?? defaultOptions.depth;\n this._wantsDir = type ? DIR_TYPES.has(type) : false;\n this._wantsFile = type ? FILE_TYPES.has(type) : false;\n this._wantsEverything = type === EntryTypes.EVERYTHING_TYPE;\n this._root = presolve(root);\n this._isDirent = !opts.alwaysStat;\n this._statsProp = this._isDirent ? 'dirent' : 'stats';\n this._rdOptions = { encoding: 'utf8', withFileTypes: this._isDirent };\n // Launch stream with one parent, the root dir.\n this.parents = [this._exploreDir(root, 1)];\n this.reading = false;\n this.parent = undefined;\n }\n async _read(batch) {\n if (this.reading)\n return;\n this.reading = true;\n try {\n while (!this.destroyed && batch > 0) {\n const par = this.parent;\n const fil = par && par.files;\n if (fil && fil.length > 0) {\n const { path, depth } = par;\n const slice = fil.splice(0, batch).map((dirent) => this._formatEntry(dirent, path));\n const awaited = await Promise.all(slice);\n for (const entry of awaited) {\n if (!entry)\n continue;\n if (this.destroyed)\n return;\n const entryType = await this._getEntryType(entry);\n if (entryType === 'directory' && this._directoryFilter(entry)) {\n if (depth <= this._maxDepth) {\n this.parents.push(this._exploreDir(entry.fullPath, depth + 1));\n }\n if (this._wantsDir) {\n this.push(entry);\n batch--;\n }\n }\n else if ((entryType === 'file' || this._includeAsFile(entry)) &&\n this._fileFilter(entry)) {\n if (this._wantsFile) {\n this.push(entry);\n batch--;\n }\n }\n }\n }\n else {\n const parent = this.parents.pop();\n if (!parent) {\n this.push(null);\n break;\n }\n this.parent = await parent;\n if (this.destroyed)\n return;\n }\n }\n }\n catch (error) {\n this.destroy(error);\n }\n finally {\n this.reading = false;\n }\n }\n async _exploreDir(path, depth) {\n let files;\n try {\n files = await readdir(path, this._rdOptions);\n }\n catch (error) {\n this._onError(error);\n }\n return { files, depth, path };\n }\n async _formatEntry(dirent, path) {\n let entry;\n const basename = this._isDirent ? dirent.name : dirent;\n try {\n const fullPath = presolve(pjoin(path, basename));\n entry = { path: prelative(this._root, fullPath), fullPath, basename };\n entry[this._statsProp] = this._isDirent ? dirent : await this._stat(fullPath);\n }\n catch (err) {\n this._onError(err);\n return;\n }\n return entry;\n }\n _onError(err) {\n if (isNormalFlowError(err) && !this.destroyed) {\n this.emit('warn', err);\n }\n else {\n this.destroy(err);\n }\n }\n async _getEntryType(entry) {\n // entry may be undefined, because a warning or an error were emitted\n // and the statsProp is undefined\n if (!entry && this._statsProp in entry) {\n return '';\n }\n const stats = entry[this._statsProp];\n if (stats.isFile())\n return 'file';\n if (stats.isDirectory())\n return 'directory';\n if (stats && stats.isSymbolicLink()) {\n const full = entry.fullPath;\n try {\n const entryRealPath = await realpath(full);\n const entryRealPathStats = await lstat(entryRealPath);\n if (entryRealPathStats.isFile()) {\n return 'file';\n }\n if (entryRealPathStats.isDirectory()) {\n const len = entryRealPath.length;\n if (full.startsWith(entryRealPath) && full.substr(len, 1) === psep) {\n const recursiveError = new Error(`Circular symlink detected: \"${full}\" points to \"${entryRealPath}\"`);\n // @ts-ignore\n recursiveError.code = RECURSIVE_ERROR_CODE;\n return this._onError(recursiveError);\n }\n return 'directory';\n }\n }\n catch (error) {\n this._onError(error);\n return '';\n }\n }\n }\n _includeAsFile(entry) {\n const stats = entry && entry[this._statsProp];\n return stats && this._wantsEverything && !stats.isDirectory();\n }\n}\n/**\n * Streaming version: Reads all files and directories in given root recursively.\n * Consumes ~constant small amount of RAM.\n * @param root Root directory\n * @param options Options to specify root (start directory), filters and recursion depth\n */\nexport function readdirp(root, options = {}) {\n // @ts-ignore\n let type = options.entryType || options.type;\n if (type === 'both')\n type = EntryTypes.FILE_DIR_TYPE; // backwards-compatibility\n if (type)\n options.type = type;\n if (!root) {\n throw new Error('readdirp: root argument is required. Usage: readdirp(root, options)');\n }\n else if (typeof root !== 'string') {\n throw new TypeError('readdirp: root argument must be a string. Usage: readdirp(root, options)');\n }\n else if (type && !ALL_TYPES.includes(type)) {\n throw new Error(`readdirp: Invalid type passed. Use one of ${ALL_TYPES.join(', ')}`);\n }\n options.root = root;\n return new ReaddirpStream(options);\n}\n/**\n * Promise version: Reads all files and directories in given root recursively.\n * Compared to streaming version, will consume a lot of RAM e.g. when 1 million files are listed.\n * @returns array of paths and their entry infos\n */\nexport function readdirpPromise(root, options = {}) {\n return new Promise((resolve, reject) => {\n const files = [];\n readdirp(root, options)\n .on('data', (entry) => files.push(entry))\n .on('end', () => resolve(files))\n .on('error', (error) => reject(error));\n });\n}\nexport default readdirp;\n","import { watchFile, unwatchFile, watch as fs_watch } from 'fs';\nimport { open, stat, lstat, realpath as fsrealpath } from 'fs/promises';\nimport * as sysPath from 'path';\nimport { type as osType } from 'os';\nexport const STR_DATA = 'data';\nexport const STR_END = 'end';\nexport const STR_CLOSE = 'close';\nexport const EMPTY_FN = () => { };\nexport const IDENTITY_FN = (val) => val;\nconst pl = process.platform;\nexport const isWindows = pl === 'win32';\nexport const isMacos = pl === 'darwin';\nexport const isLinux = pl === 'linux';\nexport const isFreeBSD = pl === 'freebsd';\nexport const isIBMi = osType() === 'OS400';\nexport const EVENTS = {\n ALL: 'all',\n READY: 'ready',\n ADD: 'add',\n CHANGE: 'change',\n ADD_DIR: 'addDir',\n UNLINK: 'unlink',\n UNLINK_DIR: 'unlinkDir',\n RAW: 'raw',\n ERROR: 'error',\n};\nconst EV = EVENTS;\nconst THROTTLE_MODE_WATCH = 'watch';\nconst statMethods = { lstat, stat };\nconst KEY_LISTENERS = 'listeners';\nconst KEY_ERR = 'errHandlers';\nconst KEY_RAW = 'rawEmitters';\nconst HANDLER_KEYS = [KEY_LISTENERS, KEY_ERR, KEY_RAW];\n// prettier-ignore\nconst binaryExtensions = new Set([\n '3dm', '3ds', '3g2', '3gp', '7z', 'a', 'aac', 'adp', 'afdesign', 'afphoto', 'afpub', 'ai',\n 'aif', 'aiff', 'alz', 'ape', 'apk', 'appimage', 'ar', 'arj', 'asf', 'au', 'avi',\n 'bak', 'baml', 'bh', 'bin', 'bk', 'bmp', 'btif', 'bz2', 'bzip2',\n 'cab', 'caf', 'cgm', 'class', 'cmx', 'cpio', 'cr2', 'cur', 'dat', 'dcm', 'deb', 'dex', 'djvu',\n 'dll', 'dmg', 'dng', 'doc', 'docm', 'docx', 'dot', 'dotm', 'dra', 'DS_Store', 'dsk', 'dts',\n 'dtshd', 'dvb', 'dwg', 'dxf',\n 'ecelp4800', 'ecelp7470', 'ecelp9600', 'egg', 'eol', 'eot', 'epub', 'exe',\n 'f4v', 'fbs', 'fh', 'fla', 'flac', 'flatpak', 'fli', 'flv', 'fpx', 'fst', 'fvt',\n 'g3', 'gh', 'gif', 'graffle', 'gz', 'gzip',\n 'h261', 'h263', 'h264', 'icns', 'ico', 'ief', 'img', 'ipa', 'iso',\n 'jar', 'jpeg', 'jpg', 'jpgv', 'jpm', 'jxr', 'key', 'ktx',\n 'lha', 'lib', 'lvp', 'lz', 'lzh', 'lzma', 'lzo',\n 'm3u', 'm4a', 'm4v', 'mar', 'mdi', 'mht', 'mid', 'midi', 'mj2', 'mka', 'mkv', 'mmr', 'mng',\n 'mobi', 'mov', 'movie', 'mp3',\n 'mp4', 'mp4a', 'mpeg', 'mpg', 'mpga', 'mxu',\n 'nef', 'npx', 'numbers', 'nupkg',\n 'o', 'odp', 'ods', 'odt', 'oga', 'ogg', 'ogv', 'otf', 'ott',\n 'pages', 'pbm', 'pcx', 'pdb', 'pdf', 'pea', 'pgm', 'pic', 'png', 'pnm', 'pot', 'potm',\n 'potx', 'ppa', 'ppam',\n 'ppm', 'pps', 'ppsm', 'ppsx', 'ppt', 'pptm', 'pptx', 'psd', 'pya', 'pyc', 'pyo', 'pyv',\n 'qt',\n 'rar', 'ras', 'raw', 'resources', 'rgb', 'rip', 'rlc', 'rmf', 'rmvb', 'rpm', 'rtf', 'rz',\n 's3m', 's7z', 'scpt', 'sgi', 'shar', 'snap', 'sil', 'sketch', 'slk', 'smv', 'snk', 'so',\n 'stl', 'suo', 'sub', 'swf',\n 'tar', 'tbz', 'tbz2', 'tga', 'tgz', 'thmx', 'tif', 'tiff', 'tlz', 'ttc', 'ttf', 'txz',\n 'udf', 'uvh', 'uvi', 'uvm', 'uvp', 'uvs', 'uvu',\n 'viv', 'vob',\n 'war', 'wav', 'wax', 'wbmp', 'wdp', 'weba', 'webm', 'webp', 'whl', 'wim', 'wm', 'wma',\n 'wmv', 'wmx', 'woff', 'woff2', 'wrm', 'wvx',\n 'xbm', 'xif', 'xla', 'xlam', 'xls', 'xlsb', 'xlsm', 'xlsx', 'xlt', 'xltm', 'xltx', 'xm',\n 'xmind', 'xpi', 'xpm', 'xwd', 'xz',\n 'z', 'zip', 'zipx',\n]);\nconst isBinaryPath = (filePath) => binaryExtensions.has(sysPath.extname(filePath).slice(1).toLowerCase());\n// TODO: emit errors properly. Example: EMFILE on Macos.\nconst foreach = (val, fn) => {\n if (val instanceof Set) {\n val.forEach(fn);\n }\n else {\n fn(val);\n }\n};\nconst addAndConvert = (main, prop, item) => {\n let container = main[prop];\n if (!(container instanceof Set)) {\n main[prop] = container = new Set([container]);\n }\n container.add(item);\n};\nconst clearItem = (cont) => (key) => {\n const set = cont[key];\n if (set instanceof Set) {\n set.clear();\n }\n else {\n delete cont[key];\n }\n};\nconst delFromSet = (main, prop, item) => {\n const container = main[prop];\n if (container instanceof Set) {\n container.delete(item);\n }\n else if (container === item) {\n delete main[prop];\n }\n};\nconst isEmptySet = (val) => (val instanceof Set ? val.size === 0 : !val);\nconst FsWatchInstances = new Map();\n/**\n * Instantiates the fs_watch interface\n * @param path to be watched\n * @param options to be passed to fs_watch\n * @param listener main event handler\n * @param errHandler emits info about errors\n * @param emitRaw emits raw event data\n * @returns {NativeFsWatcher}\n */\nfunction createFsWatchInstance(path, options, listener, errHandler, emitRaw) {\n const handleEvent = (rawEvent, evPath) => {\n listener(path);\n emitRaw(rawEvent, evPath, { watchedPath: path });\n // emit based on events occurring for files from a directory's watcher in\n // case the file's watcher misses it (and rely on throttling to de-dupe)\n if (evPath && path !== evPath) {\n fsWatchBroadcast(sysPath.resolve(path, evPath), KEY_LISTENERS, sysPath.join(path, evPath));\n }\n };\n try {\n return fs_watch(path, {\n persistent: options.persistent,\n }, handleEvent);\n }\n catch (error) {\n errHandler(error);\n return undefined;\n }\n}\n/**\n * Helper for passing fs_watch event data to a collection of listeners\n * @param fullPath absolute path bound to fs_watch instance\n */\nconst fsWatchBroadcast = (fullPath, listenerType, val1, val2, val3) => {\n const cont = FsWatchInstances.get(fullPath);\n if (!cont)\n return;\n foreach(cont[listenerType], (listener) => {\n listener(val1, val2, val3);\n });\n};\n/**\n * Instantiates the fs_watch interface or binds listeners\n * to an existing one covering the same file system entry\n * @param path\n * @param fullPath absolute path\n * @param options to be passed to fs_watch\n * @param handlers container for event listener functions\n */\nconst setFsWatchListener = (path, fullPath, options, handlers) => {\n const { listener, errHandler, rawEmitter } = handlers;\n let cont = FsWatchInstances.get(fullPath);\n let watcher;\n if (!options.persistent) {\n watcher = createFsWatchInstance(path, options, listener, errHandler, rawEmitter);\n if (!watcher)\n return;\n return watcher.close.bind(watcher);\n }\n if (cont) {\n addAndConvert(cont, KEY_LISTENERS, listener);\n addAndConvert(cont, KEY_ERR, errHandler);\n addAndConvert(cont, KEY_RAW, rawEmitter);\n }\n else {\n watcher = createFsWatchInstance(path, options, fsWatchBroadcast.bind(null, fullPath, KEY_LISTENERS), errHandler, // no need to use broadcast here\n fsWatchBroadcast.bind(null, fullPath, KEY_RAW));\n if (!watcher)\n return;\n watcher.on(EV.ERROR, async (error) => {\n const broadcastErr = fsWatchBroadcast.bind(null, fullPath, KEY_ERR);\n if (cont)\n cont.watcherUnusable = true; // documented since Node 10.4.1\n // Workaround for https://github.com/joyent/node/issues/4337\n if (isWindows && error.code === 'EPERM') {\n try {\n const fd = await open(path, 'r');\n await fd.close();\n broadcastErr(error);\n }\n catch (err) {\n // do nothing\n }\n }\n else {\n broadcastErr(error);\n }\n });\n cont = {\n listeners: listener,\n errHandlers: errHandler,\n rawEmitters: rawEmitter,\n watcher,\n };\n FsWatchInstances.set(fullPath, cont);\n }\n // const index = cont.listeners.indexOf(listener);\n // removes this instance's listeners and closes the underlying fs_watch\n // instance if there are no more listeners left\n return () => {\n delFromSet(cont, KEY_LISTENERS, listener);\n delFromSet(cont, KEY_ERR, errHandler);\n delFromSet(cont, KEY_RAW, rawEmitter);\n if (isEmptySet(cont.listeners)) {\n // Check to protect against issue gh-730.\n // if (cont.watcherUnusable) {\n cont.watcher.close();\n // }\n FsWatchInstances.delete(fullPath);\n HANDLER_KEYS.forEach(clearItem(cont));\n // @ts-ignore\n cont.watcher = undefined;\n Object.freeze(cont);\n }\n };\n};\n// fs_watchFile helpers\n// object to hold per-process fs_watchFile instances\n// (may be shared across chokidar FSWatcher instances)\nconst FsWatchFileInstances = new Map();\n/**\n * Instantiates the fs_watchFile interface or binds listeners\n * to an existing one covering the same file system entry\n * @param path to be watched\n * @param fullPath absolute path\n * @param options options to be passed to fs_watchFile\n * @param handlers container for event listener functions\n * @returns closer\n */\nconst setFsWatchFileListener = (path, fullPath, options, handlers) => {\n const { listener, rawEmitter } = handlers;\n let cont = FsWatchFileInstances.get(fullPath);\n // let listeners = new Set();\n // let rawEmitters = new Set();\n const copts = cont && cont.options;\n if (copts && (copts.persistent < options.persistent || copts.interval > options.interval)) {\n // \"Upgrade\" the watcher to persistence or a quicker interval.\n // This creates some unlikely edge case issues if the user mixes\n // settings in a very weird way, but solving for those cases\n // doesn't seem worthwhile for the added complexity.\n // listeners = cont.listeners;\n // rawEmitters = cont.rawEmitters;\n unwatchFile(fullPath);\n cont = undefined;\n }\n if (cont) {\n addAndConvert(cont, KEY_LISTENERS, listener);\n addAndConvert(cont, KEY_RAW, rawEmitter);\n }\n else {\n // TODO\n // listeners.add(listener);\n // rawEmitters.add(rawEmitter);\n cont = {\n listeners: listener,\n rawEmitters: rawEmitter,\n options,\n watcher: watchFile(fullPath, options, (curr, prev) => {\n foreach(cont.rawEmitters, (rawEmitter) => {\n rawEmitter(EV.CHANGE, fullPath, { curr, prev });\n });\n const currmtime = curr.mtimeMs;\n if (curr.size !== prev.size || currmtime > prev.mtimeMs || currmtime === 0) {\n foreach(cont.listeners, (listener) => listener(path, curr));\n }\n }),\n };\n FsWatchFileInstances.set(fullPath, cont);\n }\n // const index = cont.listeners.indexOf(listener);\n // Removes this instance's listeners and closes the underlying fs_watchFile\n // instance if there are no more listeners left.\n return () => {\n delFromSet(cont, KEY_LISTENERS, listener);\n delFromSet(cont, KEY_RAW, rawEmitter);\n if (isEmptySet(cont.listeners)) {\n FsWatchFileInstances.delete(fullPath);\n unwatchFile(fullPath);\n cont.options = cont.watcher = undefined;\n Object.freeze(cont);\n }\n };\n};\n/**\n * @mixin\n */\nexport class NodeFsHandler {\n constructor(fsW) {\n this.fsw = fsW;\n this._boundHandleError = (error) => fsW._handleError(error);\n }\n /**\n * Watch file for changes with fs_watchFile or fs_watch.\n * @param path to file or dir\n * @param listener on fs change\n * @returns closer for the watcher instance\n */\n _watchWithNodeFs(path, listener) {\n const opts = this.fsw.options;\n const directory = sysPath.dirname(path);\n const basename = sysPath.basename(path);\n const parent = this.fsw._getWatchedDir(directory);\n parent.add(basename);\n const absolutePath = sysPath.resolve(path);\n const options = {\n persistent: opts.persistent,\n };\n if (!listener)\n listener = EMPTY_FN;\n let closer;\n if (opts.usePolling) {\n const enableBin = opts.interval !== opts.binaryInterval;\n options.interval = enableBin && isBinaryPath(basename) ? opts.binaryInterval : opts.interval;\n closer = setFsWatchFileListener(path, absolutePath, options, {\n listener,\n rawEmitter: this.fsw._emitRaw,\n });\n }\n else {\n closer = setFsWatchListener(path, absolutePath, options, {\n listener,\n errHandler: this._boundHandleError,\n rawEmitter: this.fsw._emitRaw,\n });\n }\n return closer;\n }\n /**\n * Watch a file and emit add event if warranted.\n * @returns closer for the watcher instance\n */\n _handleFile(file, stats, initialAdd) {\n if (this.fsw.closed) {\n return;\n }\n const dirname = sysPath.dirname(file);\n const basename = sysPath.basename(file);\n const parent = this.fsw._getWatchedDir(dirname);\n // stats is always present\n let prevStats = stats;\n // if the file is already being watched, do nothing\n if (parent.has(basename))\n return;\n const listener = async (path, newStats) => {\n if (!this.fsw._throttle(THROTTLE_MODE_WATCH, file, 5))\n return;\n if (!newStats || newStats.mtimeMs === 0) {\n try {\n const newStats = await stat(file);\n if (this.fsw.closed)\n return;\n // Check that change event was not fired because of changed only accessTime.\n const at = newStats.atimeMs;\n const mt = newStats.mtimeMs;\n if (!at || at <= mt || mt !== prevStats.mtimeMs) {\n this.fsw._emit(EV.CHANGE, file, newStats);\n }\n if ((isMacos || isLinux || isFreeBSD) && prevStats.ino !== newStats.ino) {\n this.fsw._closeFile(path);\n prevStats = newStats;\n const closer = this._watchWithNodeFs(file, listener);\n if (closer)\n this.fsw._addPathCloser(path, closer);\n }\n else {\n prevStats = newStats;\n }\n }\n catch (error) {\n // Fix issues where mtime is null but file is still present\n this.fsw._remove(dirname, basename);\n }\n // add is about to be emitted if file not already tracked in parent\n }\n else if (parent.has(basename)) {\n // Check that change event was not fired because of changed only accessTime.\n const at = newStats.atimeMs;\n const mt = newStats.mtimeMs;\n if (!at || at <= mt || mt !== prevStats.mtimeMs) {\n this.fsw._emit(EV.CHANGE, file, newStats);\n }\n prevStats = newStats;\n }\n };\n // kick off the watcher\n const closer = this._watchWithNodeFs(file, listener);\n // emit an add event if we're supposed to\n if (!(initialAdd && this.fsw.options.ignoreInitial) && this.fsw._isntIgnored(file)) {\n if (!this.fsw._throttle(EV.ADD, file, 0))\n return;\n this.fsw._emit(EV.ADD, file, stats);\n }\n return closer;\n }\n /**\n * Handle symlinks encountered while reading a dir.\n * @param entry returned by readdirp\n * @param directory path of dir being read\n * @param path of this item\n * @param item basename of this item\n * @returns true if no more processing is needed for this entry.\n */\n async _handleSymlink(entry, directory, path, item) {\n if (this.fsw.closed) {\n return;\n }\n const full = entry.fullPath;\n const dir = this.fsw._getWatchedDir(directory);\n if (!this.fsw.options.followSymlinks) {\n // watch symlink directly (don't follow) and detect changes\n this.fsw._incrReadyCount();\n let linkPath;\n try {\n linkPath = await fsrealpath(path);\n }\n catch (e) {\n this.fsw._emitReady();\n return true;\n }\n if (this.fsw.closed)\n return;\n if (dir.has(item)) {\n if (this.fsw._symlinkPaths.get(full) !== linkPath) {\n this.fsw._symlinkPaths.set(full, linkPath);\n this.fsw._emit(EV.CHANGE, path, entry.stats);\n }\n }\n else {\n dir.add(item);\n this.fsw._symlinkPaths.set(full, linkPath);\n this.fsw._emit(EV.ADD, path, entry.stats);\n }\n this.fsw._emitReady();\n return true;\n }\n // don't follow the same symlink more than once\n if (this.fsw._symlinkPaths.has(full)) {\n return true;\n }\n this.fsw._symlinkPaths.set(full, true);\n }\n _handleRead(directory, initialAdd, wh, target, dir, depth, throttler) {\n // Normalize the directory name on Windows\n directory = sysPath.join(directory, '');\n throttler = this.fsw._throttle('readdir', directory, 1000);\n if (!throttler)\n return;\n const previous = this.fsw._getWatchedDir(wh.path);\n const current = new Set();\n let stream = this.fsw._readdirp(directory, {\n fileFilter: (entry) => wh.filterPath(entry),\n directoryFilter: (entry) => wh.filterDir(entry),\n });\n if (!stream)\n return;\n stream\n .on(STR_DATA, async (entry) => {\n if (this.fsw.closed) {\n stream = undefined;\n return;\n }\n const item = entry.path;\n let path = sysPath.join(directory, item);\n current.add(item);\n if (entry.stats.isSymbolicLink() &&\n (await this._handleSymlink(entry, directory, path, item))) {\n return;\n }\n if (this.fsw.closed) {\n stream = undefined;\n return;\n }\n // Files that present in current directory snapshot\n // but absent in previous are added to watch list and\n // emit `add` event.\n if (item === target || (!target && !previous.has(item))) {\n this.fsw._incrReadyCount();\n // ensure relativeness of path is preserved in case of watcher reuse\n path = sysPath.join(dir, sysPath.relative(dir, path));\n this._addToNodeFs(path, initialAdd, wh, depth + 1);\n }\n })\n .on(EV.ERROR, this._boundHandleError);\n return new Promise((resolve, reject) => {\n if (!stream)\n return reject();\n stream.once(STR_END, () => {\n if (this.fsw.closed) {\n stream = undefined;\n return;\n }\n const wasThrottled = throttler ? throttler.clear() : false;\n resolve(undefined);\n // Files that absent in current directory snapshot\n // but present in previous emit `remove` event\n // and are removed from @watched[directory].\n previous\n .getChildren()\n .filter((item) => {\n return item !== directory && !current.has(item);\n })\n .forEach((item) => {\n this.fsw._remove(directory, item);\n });\n stream = undefined;\n // one more time for any missed in case changes came in extremely quickly\n if (wasThrottled)\n this._handleRead(directory, false, wh, target, dir, depth, throttler);\n });\n });\n }\n /**\n * Read directory to add / remove files from `@watched` list and re-read it on change.\n * @param dir fs path\n * @param stats\n * @param initialAdd\n * @param depth relative to user-supplied path\n * @param target child path targeted for watch\n * @param wh Common watch helpers for this path\n * @param realpath\n * @returns closer for the watcher instance.\n */\n async _handleDir(dir, stats, initialAdd, depth, target, wh, realpath) {\n const parentDir = this.fsw._getWatchedDir(sysPath.dirname(dir));\n const tracked = parentDir.has(sysPath.basename(dir));\n if (!(initialAdd && this.fsw.options.ignoreInitial) && !target && !tracked) {\n this.fsw._emit(EV.ADD_DIR, dir, stats);\n }\n // ensure dir is tracked (harmless if redundant)\n parentDir.add(sysPath.basename(dir));\n this.fsw._getWatchedDir(dir);\n let throttler;\n let closer;\n const oDepth = this.fsw.options.depth;\n if ((oDepth == null || depth <= oDepth) && !this.fsw._symlinkPaths.has(realpath)) {\n if (!target) {\n await this._handleRead(dir, initialAdd, wh, target, dir, depth, throttler);\n if (this.fsw.closed)\n return;\n }\n closer = this._watchWithNodeFs(dir, (dirPath, stats) => {\n // if current directory is removed, do nothing\n if (stats && stats.mtimeMs === 0)\n return;\n this._handleRead(dirPath, false, wh, target, dir, depth, throttler);\n });\n }\n return closer;\n }\n /**\n * Handle added file, directory, or glob pattern.\n * Delegates call to _handleFile / _handleDir after checks.\n * @param path to file or ir\n * @param initialAdd was the file added at watch instantiation?\n * @param priorWh depth relative to user-supplied path\n * @param depth Child path actually targeted for watch\n * @param target Child path actually targeted for watch\n */\n async _addToNodeFs(path, initialAdd, priorWh, depth, target) {\n const ready = this.fsw._emitReady;\n if (this.fsw._isIgnored(path) || this.fsw.closed) {\n ready();\n return false;\n }\n const wh = this.fsw._getWatchHelpers(path);\n if (priorWh) {\n wh.filterPath = (entry) => priorWh.filterPath(entry);\n wh.filterDir = (entry) => priorWh.filterDir(entry);\n }\n // evaluate what is at the path we're being asked to watch\n try {\n const stats = await statMethods[wh.statMethod](wh.watchPath);\n if (this.fsw.closed)\n return;\n if (this.fsw._isIgnored(wh.watchPath, stats)) {\n ready();\n return false;\n }\n const follow = this.fsw.options.followSymlinks;\n let closer;\n if (stats.isDirectory()) {\n const absPath = sysPath.resolve(path);\n const targetPath = follow ? await fsrealpath(path) : path;\n if (this.fsw.closed)\n return;\n closer = await this._handleDir(wh.watchPath, stats, initialAdd, depth, target, wh, targetPath);\n if (this.fsw.closed)\n return;\n // preserve this symlink's target path\n if (absPath !== targetPath && targetPath !== undefined) {\n this.fsw._symlinkPaths.set(absPath, targetPath);\n }\n }\n else if (stats.isSymbolicLink()) {\n const targetPath = follow ? await fsrealpath(path) : path;\n if (this.fsw.closed)\n return;\n const parent = sysPath.dirname(wh.watchPath);\n this.fsw._getWatchedDir(parent).add(wh.watchPath);\n this.fsw._emit(EV.ADD, wh.watchPath, stats);\n closer = await this._handleDir(parent, stats, initialAdd, depth, path, wh, targetPath);\n if (this.fsw.closed)\n return;\n // preserve this symlink's target path\n if (targetPath !== undefined) {\n this.fsw._symlinkPaths.set(sysPath.resolve(path), targetPath);\n }\n }\n else {\n closer = this._handleFile(wh.watchPath, stats, initialAdd);\n }\n ready();\n if (closer)\n this.fsw._addPathCloser(path, closer);\n return false;\n }\n catch (error) {\n if (this.fsw._handleError(error)) {\n ready();\n return path;\n }\n }\n }\n}\n","import type { Application, Request, Response } from \"express\";\r\nimport chokidar from \"chokidar\";\r\nimport path from \"path\";\r\nimport { BUILD_FOLDER_NAME } from \"@constants/globals\";\r\n\r\nexport interface HotReloadOptions {\r\n app: Application;\r\n appDir: string; // carpeta de la app (ej: apps/example/app)\r\n route?: string; // endpoint SSE, default: \"/__fw/hot\"\r\n waitForBuild?: () => Promise<void>; // Function to wait for client bundle to finish building\r\n onFileChange?: (filePath: string) => void | Promise<void>; // Callback when file changes\r\n}\r\n\r\n/**\r\n * Sets up an SSE endpoint and file watcher on appDir.\r\n * Each change triggers a reload to connected clients.\r\n *\r\n * @param options - Hot reload options\r\n */\r\nexport function setupHotReload({\r\n app,\r\n appDir,\r\n route = \"/__fw/hot\",\r\n waitForBuild,\r\n onFileChange,\r\n}: HotReloadOptions) {\r\n const clients = new Set<Response>();\r\n\r\n app.get(route, (req: Request, res: Response) => {\r\n res.setHeader(\"Content-Type\", \"text/event-stream\");\r\n res.setHeader(\"Cache-Control\", \"no-cache\");\r\n res.setHeader(\"Connection\", \"keep-alive\");\r\n res.flushHeaders?.();\r\n\r\n res.write(`event: ping\\ndata: connected\\n\\n`);\r\n clients.add(res);\r\n\r\n req.on(\"close\", () => {\r\n clients.delete(res);\r\n });\r\n });\r\n\r\n const watcher = chokidar.watch(appDir, {\r\n ignoreInitial: true,\r\n ignored: [\"**/node_modules/**\", `**/${BUILD_FOLDER_NAME}/**`, \"**/.git/**\"],\r\n });\r\n\r\n async function broadcastReload(reason: string, filePath: string) {\r\n const rel = path.relative(appDir, filePath);\r\n console.log(`[hot-reload] ${reason}: ${rel}`);\r\n\r\n // Call onFileChange callback if provided (e.g., to reload routes manifest)\r\n if (onFileChange) {\r\n try {\r\n await onFileChange(filePath);\r\n } catch (error) {\r\n console.warn(\"[hot-reload] Error in onFileChange callback:\", error);\r\n }\r\n }\r\n\r\n // Wait for client bundle to finish building before sending reload event\r\n if (waitForBuild) {\r\n try {\r\n console.log(\"[hot-reload] Waiting for client bundle to finish...\");\r\n await waitForBuild();\r\n console.log(\"[hot-reload] Client bundle ready, sending reload event\");\r\n } catch (error) {\r\n console.warn(\"[hot-reload] Error waiting for build:\", error);\r\n // Continue anyway, don't block reload\r\n }\r\n }\r\n\r\n for (const res of clients) {\r\n res.write(`event: message\\ndata: reload:${rel}\\n\\n`);\r\n }\r\n }\r\n\r\n watcher\r\n .on(\"add\", (filePath) => broadcastReload(\"add\", filePath))\r\n .on(\"change\", (filePath) => broadcastReload(\"change\", filePath))\r\n .on(\"unlink\", (filePath) => broadcastReload(\"unlink\", filePath));\r\n}\r\n","import path from \"path\";\r\n\r\n/**\r\n * Clears the require cache for files in the app directory.\r\n *\r\n * @param appDir - App directory path\r\n */\r\nexport function clearAppRequireCache(appDir: string) {\r\n const appDirNormalized = path.resolve(appDir);\r\n\r\n for (const id of Object.keys(require.cache)) {\r\n if (id.startsWith(appDirNormalized)) {\r\n delete require.cache[id];\r\n }\r\n }\r\n}\r\n","import path from \"path\";\r\nimport fs from \"fs\";\r\nimport { BUILD_FOLDER_NAME } from \"../constants/globals\";\r\n\r\n/**\r\n * Framework configuration interface.\r\n * \r\n * Allows customization of framework behavior without code changes.\r\n */\r\nexport interface FrameworkConfig {\r\n // Directory structure\r\n directories: {\r\n app: string; // Default: 'app'\r\n build: string; // Default: '.loly'\r\n static: string; // Default: 'public'\r\n };\r\n \r\n // File naming conventions\r\n conventions: {\r\n page: string; // Default: 'page'\r\n layout: string; // Default: 'layout'\r\n notFound: string; // Default: '_not-found'\r\n error: string; // Default: '_error'\r\n api: string; // Default: 'route'\r\n };\r\n \r\n // Routing\r\n routing: {\r\n trailingSlash: 'always' | 'never' | 'ignore';\r\n caseSensitive: boolean;\r\n basePath: string; // Default: ''\r\n };\r\n \r\n // Build\r\n build: {\r\n clientBundler: 'rspack' | 'webpack' | 'vite';\r\n serverBundler: 'esbuild' | 'tsup' | 'swc';\r\n outputFormat: 'cjs' | 'esm';\r\n };\r\n \r\n // Server\r\n server: {\r\n adapter: 'express' | 'fastify' | 'koa';\r\n port: number;\r\n host: string;\r\n };\r\n \r\n // Rendering\r\n rendering: {\r\n framework: 'react' | 'preact' | 'vue' | 'svelte';\r\n streaming: boolean;\r\n ssr: boolean;\r\n ssg: boolean;\r\n };\r\n \r\n // Plugins (to be implemented in Phase 2)\r\n plugins?: any[];\r\n}\r\n\r\n/**\r\n * Default framework configuration.\r\n */\r\nexport const DEFAULT_CONFIG: FrameworkConfig = {\r\n directories: {\r\n app: 'app',\r\n build: BUILD_FOLDER_NAME,\r\n static: 'public',\r\n },\r\n conventions: {\r\n page: 'page',\r\n layout: 'layout',\r\n notFound: '_not-found',\r\n error: '_error',\r\n api: 'route',\r\n },\r\n routing: {\r\n trailingSlash: 'ignore',\r\n caseSensitive: false,\r\n basePath: '',\r\n },\r\n build: {\r\n clientBundler: 'rspack',\r\n serverBundler: 'esbuild',\r\n outputFormat: 'cjs',\r\n },\r\n server: {\r\n adapter: 'express',\r\n port: 3000,\r\n host: 'localhost',\r\n },\r\n rendering: {\r\n framework: 'react',\r\n streaming: true,\r\n ssr: true,\r\n ssg: true,\r\n },\r\n plugins: [],\r\n};\r\n\r\n/**\r\n * Deep merge utility for configuration objects.\r\n */\r\nfunction deepMerge<T extends Record<string, any>>(target: T, source: Partial<T>): T {\r\n const result = { ...target };\r\n \r\n for (const key in source) {\r\n const sourceValue = source[key];\r\n if (sourceValue && typeof sourceValue === 'object' && !Array.isArray(sourceValue)) {\r\n const targetValue = result[key];\r\n if (targetValue && typeof targetValue === 'object' && !Array.isArray(targetValue)) {\r\n result[key] = deepMerge(targetValue, sourceValue as any);\r\n } else {\r\n result[key] = sourceValue as T[Extract<keyof T, string>];\r\n }\r\n } else if (sourceValue !== undefined) {\r\n result[key] = sourceValue as T[Extract<keyof T, string>];\r\n }\r\n }\r\n \r\n return result;\r\n}\r\n\r\n/**\r\n * Loads framework configuration from project root.\r\n * \r\n * Looks for configuration in the following order:\r\n * 1. loly.config.ts (TypeScript)\r\n * 2. loly.config.js (JavaScript)\r\n * 3. loly.config.json (JSON)\r\n * \r\n * Merges user config with defaults and validates.\r\n * \r\n * @param projectRoot - Root directory of the project\r\n * @returns Framework configuration\r\n */\r\nexport function loadConfig(projectRoot: string): FrameworkConfig {\r\n const configFiles = [\r\n path.join(projectRoot, 'loly.config.ts'),\r\n path.join(projectRoot, 'loly.config.js'),\r\n path.join(projectRoot, 'loly.config.json'),\r\n ];\r\n\r\n let userConfig: Partial<FrameworkConfig> = {};\r\n\r\n // Try to load config file\r\n for (const configFile of configFiles) {\r\n if (fs.existsSync(configFile)) {\r\n try {\r\n if (configFile.endsWith('.json')) {\r\n // Load JSON config\r\n const content = fs.readFileSync(configFile, 'utf-8');\r\n userConfig = JSON.parse(content);\r\n } else {\r\n // Load TS/JS config (requires require/import)\r\n // In production, these should be compiled\r\n // For now, we'll use require with tsx in dev\r\n if (process.env.NODE_ENV === 'development') {\r\n require('tsx/cjs');\r\n }\r\n const mod = require(configFile);\r\n userConfig = typeof mod.default === 'function' \r\n ? mod.default(process.env.NODE_ENV)\r\n : (mod.default || mod.config || mod);\r\n }\r\n break;\r\n } catch (error) {\r\n console.warn(`[framework] Failed to load config from ${configFile}:`, error);\r\n }\r\n }\r\n }\r\n\r\n // Merge with defaults\r\n const config = deepMerge(DEFAULT_CONFIG, userConfig);\r\n\r\n // Validate critical paths\r\n const appDir = path.join(projectRoot, config.directories.app);\r\n if (!fs.existsSync(appDir) && process.env.NODE_ENV !== 'test') {\r\n console.warn(`[framework] App directory not found: ${appDir}`);\r\n }\r\n\r\n return config;\r\n}\r\n\r\n/**\r\n * Gets the resolved app directory path.\r\n * \r\n * @param projectRoot - Root directory of the project\r\n * @param config - Framework configuration\r\n * @returns Resolved app directory path\r\n */\r\nexport function getAppDir(projectRoot: string, config: FrameworkConfig): string {\r\n return path.resolve(projectRoot, config.directories.app);\r\n}\r\n\r\n/**\r\n * Gets the resolved build directory path.\r\n * \r\n * @param projectRoot - Root directory of the project\r\n * @param config - Framework configuration\r\n * @returns Resolved build directory path\r\n */\r\nexport function getBuildDir(projectRoot: string, config: FrameworkConfig): string {\r\n return path.join(projectRoot, config.directories.build);\r\n}\r\n\r\n/**\r\n * Gets the resolved static directory path.\r\n * \r\n * @param projectRoot - Root directory of the project\r\n * @param config - Framework configuration\r\n * @returns Resolved static directory path\r\n */\r\nexport function getStaticDir(projectRoot: string, config: FrameworkConfig): string {\r\n return path.resolve(projectRoot, config.directories.static);\r\n}\r\n\r\n","/**\r\n * Security utilities for input sanitization.\r\n */\r\n\r\n/**\r\n * Sanitizes a string by removing potentially dangerous characters.\r\n * Basic sanitization - for production, consider using a library like DOMPurify.\r\n * \r\n * @param input - String to sanitize\r\n * @returns Sanitized string\r\n */\r\nexport function sanitizeString(input: string): string {\r\n if (typeof input !== \"string\") {\r\n return String(input);\r\n }\r\n\r\n // Remove null bytes\r\n let sanitized = input.replace(/\\0/g, \"\");\r\n\r\n // Remove control characters except newlines and tabs\r\n sanitized = sanitized.replace(/[\\x00-\\x08\\x0B-\\x0C\\x0E-\\x1F\\x7F]/g, \"\");\r\n\r\n return sanitized;\r\n}\r\n\r\n/**\r\n * Sanitizes an object by recursively sanitizing all string values.\r\n * \r\n * @param obj - Object to sanitize\r\n * @returns Sanitized object\r\n */\r\nexport function sanitizeObject<T extends Record<string, any>>(obj: T): T {\r\n if (obj === null || obj === undefined) {\r\n return obj;\r\n }\r\n\r\n if (typeof obj !== \"object\") {\r\n return typeof obj === \"string\" ? (sanitizeString(obj) as any) : obj;\r\n }\r\n\r\n if (Array.isArray(obj)) {\r\n return obj.map((item) => sanitizeObject(item)) as any;\r\n }\r\n\r\n const sanitized: any = {};\r\n for (const key in obj) {\r\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\r\n const value = obj[key];\r\n if (typeof value === \"string\") {\r\n sanitized[key] = sanitizeString(value);\r\n } else if (typeof value === \"object\" && value !== null) {\r\n sanitized[key] = sanitizeObject(value);\r\n } else {\r\n sanitized[key] = value;\r\n }\r\n }\r\n }\r\n\r\n return sanitized;\r\n}\r\n\r\n/**\r\n * Sanitizes route parameters.\r\n * \r\n * @param params - Route parameters object\r\n * @returns Sanitized parameters\r\n */\r\nexport function sanitizeParams<T extends Record<string, string | string[]>>(\r\n params: T\r\n): T {\r\n const sanitized: any = {};\r\n for (const key in params) {\r\n if (Object.prototype.hasOwnProperty.call(params, key)) {\r\n const value = params[key];\r\n if (Array.isArray(value)) {\r\n sanitized[key] = value.map((v) => sanitizeString(String(v)));\r\n } else {\r\n sanitized[key] = sanitizeString(String(value));\r\n }\r\n }\r\n }\r\n return sanitized;\r\n}\r\n\r\n/**\r\n * Sanitizes query parameters.\r\n * \r\n * @param query - Query parameters object\r\n * @returns Sanitized query parameters\r\n */\r\nexport function sanitizeQuery<T extends Record<string, any>>(query: T): T {\r\n return sanitizeObject(query);\r\n}\r\n\r\n","import rateLimit from \"express-rate-limit\";\r\n\r\nexport interface RateLimitConfig {\r\n windowMs?: number;\r\n max?: number;\r\n message?: string;\r\n standardHeaders?: boolean;\r\n legacyHeaders?: boolean;\r\n skipSuccessfulRequests?: boolean;\r\n skipFailedRequests?: boolean;\r\n}\r\n\r\n/**\r\n * Creates a rate limiter middleware with configurable options.\r\n * \r\n * @param config - Rate limiting configuration\r\n * @returns Express rate limit middleware\r\n */\r\nexport function createRateLimiter(config: RateLimitConfig = {}) {\r\n const {\r\n windowMs = 15 * 60 * 1000, // 15 minutes\r\n max = 100, // limit each IP to 100 requests per windowMs\r\n message = \"Too many requests from this IP, please try again later.\",\r\n standardHeaders = true,\r\n legacyHeaders = false,\r\n skipSuccessfulRequests = false,\r\n skipFailedRequests = false,\r\n } = config;\r\n\r\n return rateLimit({\r\n windowMs,\r\n max,\r\n message: {\r\n error: message,\r\n },\r\n standardHeaders,\r\n legacyHeaders,\r\n skipSuccessfulRequests,\r\n skipFailedRequests,\r\n });\r\n}\r\n\r\n/**\r\n * Default rate limiter for general API routes.\r\n * Limits: 100 requests per 15 minutes per IP\r\n */\r\nexport const defaultRateLimiter = createRateLimiter({\r\n windowMs: 15 * 60 * 1000, // 15 minutes\r\n max: 100,\r\n message: \"Too many requests from this IP, please try again later.\",\r\n});\r\n\r\n/**\r\n * Strict rate limiter for authentication and sensitive endpoints.\r\n * Limits: 5 requests per 15 minutes per IP\r\n */\r\nexport const strictRateLimiter = createRateLimiter({\r\n windowMs: 15 * 60 * 1000, // 15 minutes\r\n max: 5,\r\n message: \"Too many authentication attempts, please try again later.\",\r\n});\r\n\r\n/**\r\n * Lenient rate limiter for public pages.\r\n * Limits: 200 requests per 15 minutes per IP\r\n */\r\nexport const lenientRateLimiter = createRateLimiter({\r\n windowMs: 15 * 60 * 1000, // 15 minutes\r\n max: 200,\r\n message: \"Too many requests from this IP, please try again later.\",\r\n});\r\n\r\n","import { ApiRoute } from \"@router/index.types\";\nimport { strictRateLimiter, defaultRateLimiter, lenientRateLimiter } from \"./rate-limit\";\n\n/**\n * Determines if a route path matches any of the strict patterns.\n * \n * @param path - Route path to check\n * @param patterns - Array of patterns to match against\n * @returns True if path matches any pattern\n */\nexport function matchesStrictPattern(\n path: string,\n patterns: string[]\n): boolean {\n for (const pattern of patterns) {\n // Convert pattern to regex\n // ** matches any path segment\n // * matches single path segment\n const regexPattern = pattern\n .replace(/\\*\\*/g, \".*\") // ** -> .*\n .replace(/\\*/g, \"[^/]*\") // * -> [^/]*\n .replace(/\\//g, \"\\\\/\"); // / -> \\/\n\n const regex = new RegExp(`^${regexPattern}$`);\n if (regex.test(path)) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Checks if a middleware is a rate limiter.\n * \n * @param mw - Middleware to check\n * @returns True if middleware is a rate limiter\n */\nfunction isRateLimiter(mw: any): boolean {\n if (!mw) return false;\n \n // Check if it's one of our known rate limiters\n if (mw === strictRateLimiter || mw === defaultRateLimiter || mw === lenientRateLimiter) {\n return true;\n }\n \n // Check for express-rate-limit signature\n // Rate limiters from express-rate-limit have specific properties\n if (typeof mw === 'function' && mw.name && mw.name.includes('rateLimit')) {\n return true;\n }\n \n // Check if middleware function has rate limit properties\n if (mw && typeof mw === 'function' && (mw as any).skip || (mw as any).resetKey) {\n return true;\n }\n \n return false;\n}\n\n/**\n * Gets the appropriate rate limiter for a route based on configuration.\n * \n * @param route - API route\n * @param strictPatterns - Patterns that should use strict rate limiting\n * @returns Rate limiter middleware or null if route already has rate limiting\n */\nexport function getAutoRateLimiter(\n route: ApiRoute,\n strictPatterns: string[] = []\n): any | null {\n // If route already has rate limiting middleware, don't add another\n const hasRateLimiter = route.middlewares?.some(isRateLimiter) ||\n Object.values(route.methodMiddlewares || {}).some((mws: any[]) => \n mws?.some(isRateLimiter)\n );\n\n if (hasRateLimiter) {\n return null; // Route already has rate limiting\n }\n\n // Check if route matches strict patterns\n if (strictPatterns.length > 0 && matchesStrictPattern(route.pattern, strictPatterns)) {\n console.log(`[rate-limit] Applying strict rate limiter to route: ${route.pattern}`);\n return strictRateLimiter;\n }\n\n // Default: no auto rate limiting (global rate limiter already applied)\n return null;\n}\n\n","import pino from \"pino\";\r\nimport type { Logger as PinoLogger } from \"pino\";\r\nimport type { Request, Response } from \"express\";\r\n\r\nexport type LogLevel = \"fatal\" | \"error\" | \"warn\" | \"info\" | \"debug\" | \"trace\";\r\n\r\nexport interface LoggerContext {\r\n [key: string]: unknown;\r\n}\r\n\r\nexport interface LoggerOptions {\r\n level?: LogLevel;\r\n enabled?: boolean;\r\n pretty?: boolean;\r\n destination?: pino.DestinationStream;\r\n}\r\n\r\n/**\r\n * Creates a Pino logger instance with appropriate configuration for dev/prod.\r\n * \r\n * - Development: Pretty printed with colors via pino-pretty\r\n * - Production: JSON structured output for log aggregation\r\n */\r\nfunction createLogger(options: LoggerOptions = {}): PinoLogger {\r\n const {\r\n level = (process.env.LOG_LEVEL as LogLevel) || (process.env.NODE_ENV === \"development\" ? \"debug\" : \"info\"),\r\n enabled = process.env.LOG_ENABLED !== \"false\",\r\n pretty = process.env.NODE_ENV === \"development\",\r\n destination,\r\n } = options;\r\n\r\n if (!enabled) {\r\n // Return a no-op logger\r\n return pino({ enabled: false });\r\n }\r\n\r\n const baseConfig: pino.LoggerOptions = {\r\n level,\r\n base: {\r\n name: \"@lolyjs/core\",\r\n env: process.env.NODE_ENV || \"development\",\r\n },\r\n timestamp: pino.stdTimeFunctions.isoTime,\r\n formatters: {\r\n level: (label) => {\r\n return { level: label };\r\n },\r\n },\r\n };\r\n\r\n // In development, use pino-pretty for colored, human-readable output\r\n if (pretty && !destination) {\r\n try {\r\n // Dynamic import to avoid bundling pino-pretty in production\r\n const pinoPretty = require(\"pino-pretty\");\r\n return pino(\r\n baseConfig,\r\n pinoPretty({\r\n colorize: true,\r\n translateTime: \"HH:MM:ss Z\",\r\n ignore: \"pid,hostname\",\r\n singleLine: false,\r\n messageFormat: \"[{module}] {msg}\",\r\n })\r\n );\r\n } catch (e) {\r\n // Fallback if pino-pretty is not available\r\n console.warn(\"[logger] pino-pretty not available, using default formatter\");\r\n }\r\n }\r\n\r\n // Production: structured JSON logging\r\n return destination ? pino(baseConfig, destination) : pino(baseConfig);\r\n}\r\n\r\n// Singleton logger instance\r\nlet loggerInstance: PinoLogger | null = null;\r\n\r\n/**\r\n * Gets or creates the singleton logger instance.\r\n */\r\nexport function getLogger(options?: LoggerOptions): PinoLogger {\r\n if (!loggerInstance) {\r\n loggerInstance = createLogger(options);\r\n }\r\n return loggerInstance;\r\n}\r\n\r\n/**\r\n * Sets a custom logger instance (useful for testing or custom configuration).\r\n */\r\nexport function setLogger(customLogger: PinoLogger): void {\r\n loggerInstance = customLogger;\r\n}\r\n\r\n/**\r\n * Resets the logger instance (useful for testing).\r\n */\r\nexport function resetLogger(): void {\r\n loggerInstance = null;\r\n}\r\n\r\n/**\r\n * Logger class wrapper for easier usage with context.\r\n */\r\nexport class Logger {\r\n private pino: PinoLogger;\r\n private context: LoggerContext;\r\n\r\n constructor(logger?: PinoLogger, context: LoggerContext = {}) {\r\n this.pino = logger || getLogger();\r\n this.context = context;\r\n }\r\n\r\n /**\r\n * Creates a child logger with additional context.\r\n */\r\n child(context: LoggerContext): Logger {\r\n return new Logger(this.pino.child(context), { ...this.context, ...context });\r\n }\r\n\r\n /**\r\n * Logs a fatal error (application should terminate).\r\n */\r\n fatal(message: string, context?: LoggerContext): void {\r\n this.pino.fatal({ ...this.context, ...context }, message);\r\n }\r\n\r\n /**\r\n * Logs an error.\r\n */\r\n error(message: string, error?: Error | unknown, context?: LoggerContext): void {\r\n const errorContext: LoggerContext = { ...this.context, ...context };\r\n \r\n if (error instanceof Error) {\r\n errorContext.error = {\r\n name: error.name,\r\n message: error.message,\r\n stack: error.stack,\r\n };\r\n } else if (error) {\r\n errorContext.error = error;\r\n }\r\n\r\n this.pino.error(errorContext, message);\r\n }\r\n\r\n /**\r\n * Logs a warning.\r\n */\r\n warn(message: string, context?: LoggerContext): void {\r\n this.pino.warn({ ...this.context, ...context }, message);\r\n }\r\n\r\n /**\r\n * Logs informational message.\r\n */\r\n info(message: string, context?: LoggerContext): void {\r\n this.pino.info({ ...this.context, ...context }, message);\r\n }\r\n\r\n /**\r\n * Logs a debug message (only in development or when level is debug).\r\n */\r\n debug(message: string, context?: LoggerContext): void {\r\n this.pino.debug({ ...this.context, ...context }, message);\r\n }\r\n\r\n /**\r\n * Logs a trace message (most verbose).\r\n */\r\n trace(message: string, context?: LoggerContext): void {\r\n this.pino.trace({ ...this.context, ...context }, message);\r\n }\r\n}\r\n\r\n/**\r\n * Default logger instance.\r\n */\r\nexport const logger = new Logger();\r\n\r\n/**\r\n * Creates a logger for a specific module/component.\r\n */\r\nexport function createModuleLogger(module: string, context?: LoggerContext): Logger {\r\n return logger.child({ module, ...context });\r\n}\r\n\r\n/**\r\n * Generates a unique request ID for request tracking.\r\n */\r\nexport function generateRequestId(): string {\r\n return `${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;\r\n}\r\n\r\n/**\r\n * Default paths to ignore from request logging (static assets, favicon, etc.)\r\n */\r\nconst DEFAULT_IGNORED_PATHS = [\r\n /^\\/static\\//, // Static assets\r\n /^\\/favicon\\.ico$/i, // Favicon\r\n /^\\/_next\\//, // Next.js internals (if used)\r\n /^\\/\\.well-known\\//, // Well-known paths\r\n /^\\/__webpack/, // Webpack dev server\r\n /^\\/sockjs-node/, // Hot reload websocket\r\n];\r\n\r\n/**\r\n * Checks if a path should be ignored from logging.\r\n */\r\nfunction shouldIgnorePath(path: string, ignoredPaths: (string | RegExp)[]): boolean {\r\n return ignoredPaths.some(pattern => {\r\n if (typeof pattern === \"string\") {\r\n return path === pattern || path.startsWith(pattern);\r\n }\r\n return pattern.test(path);\r\n });\r\n}\r\n\r\n/**\r\n * Express middleware for request logging.\r\n * Adds request ID to res.locals and logs incoming requests.\r\n */\r\nexport function requestLoggerMiddleware(options: {\r\n logger?: Logger;\r\n logRequests?: boolean;\r\n logResponses?: boolean;\r\n ignorePaths?: (string | RegExp)[];\r\n logStaticAssets?: boolean;\r\n} = {}) {\r\n const {\r\n logger: customLogger = logger,\r\n logRequests = true,\r\n logResponses = true,\r\n ignorePaths = DEFAULT_IGNORED_PATHS,\r\n logStaticAssets = false,\r\n } = options;\r\n\r\n return (req: Request, res: Response, next: () => void): void => {\r\n // Generate or use existing request ID\r\n const requestId = (req.headers[\"x-request-id\"] as string) || generateRequestId();\r\n (res.locals as any).requestId = requestId;\r\n\r\n // Add request ID to response headers\r\n res.setHeader(\"X-Request-ID\", requestId);\r\n\r\n // Check if we should ignore this path\r\n const shouldIgnore = !logStaticAssets && shouldIgnorePath(req.path, ignorePaths);\r\n\r\n // Create request-scoped logger (always available for handlers, minimal context to avoid duplication)\r\n const reqLogger = customLogger.child({\r\n requestId,\r\n method: req.method,\r\n path: req.path,\r\n });\r\n\r\n // Store logger in request for use in handlers (always available)\r\n (req as any).logger = reqLogger;\r\n\r\n // Log incoming request (only if not ignored and enabled)\r\n if (logRequests && !shouldIgnore) {\r\n reqLogger.debug(`${req.method} ${req.path}`, {\r\n query: Object.keys(req.query).length > 0 ? req.query : undefined,\r\n });\r\n }\r\n\r\n // Log response when finished (only if not ignored)\r\n if (logResponses && !shouldIgnore) {\r\n const startTime = Date.now();\r\n \r\n res.on(\"finish\", () => {\r\n const duration = Date.now() - startTime;\r\n // Only log errors and warnings by default, or successful requests if explicitly enabled\r\n const shouldLogSuccess = logRequests === true; // Only if logRequests is explicitly true\r\n \r\n if (res.statusCode >= 500) {\r\n reqLogger.error(`${req.method} ${req.path} ${res.statusCode}`, {\r\n statusCode: res.statusCode,\r\n duration: `${duration}ms`,\r\n });\r\n } else if (res.statusCode >= 400) {\r\n reqLogger.warn(`${req.method} ${req.path} ${res.statusCode}`, {\r\n statusCode: res.statusCode,\r\n duration: `${duration}ms`,\r\n });\r\n } else if (shouldLogSuccess) {\r\n // Only log successful requests if explicitly enabled\r\n reqLogger.debug(`${req.method} ${req.path} ${res.statusCode}`, {\r\n statusCode: res.statusCode,\r\n duration: `${duration}ms`,\r\n });\r\n }\r\n });\r\n }\r\n\r\n next();\r\n };\r\n}\r\n\r\n/**\r\n * Gets the logger from the request object (set by requestLoggerMiddleware).\r\n */\r\nexport function getRequestLogger(req: Request): Logger {\r\n return (req as any).logger || logger.child({ requestId: \"unknown\" });\r\n}\r\n\r\n","import { Request, Response } from \"express\";\r\nimport { ApiContext, ApiRoute, matchApiRoute } from \"@router/index\";\r\nimport { sanitizeParams, sanitizeQuery } from \"@security/sanitize\";\r\nimport { getAutoRateLimiter } from \"@server/middleware/auto-rate-limit\";\r\nimport { getRequestLogger, createModuleLogger } from \"@logger/index\";\r\n\r\nexport interface HandleApiRequestOptions {\r\n apiRoutes: ApiRoute[];\r\n urlPath: string;\r\n req: Request;\r\n res: Response;\r\n env?: \"dev\" | \"prod\";\r\n strictRateLimitPatterns?: string[];\r\n}\r\n\r\n/**\r\n * Handles an API route request.\r\n * Unifies logic between dev and prod.\r\n *\r\n * @param options - Request handling options\r\n */\r\nexport async function handleApiRequest(\r\n options: HandleApiRequestOptions\r\n): Promise<void> {\r\n const { apiRoutes, urlPath, req, res, env = \"dev\" } = options;\r\n\r\n const matched = matchApiRoute(apiRoutes, urlPath);\r\n\r\n if (!matched) {\r\n res.status(404).json({ error: \"Not Found\" });\r\n return;\r\n }\r\n\r\n const { route, params } = matched;\r\n const method = req.method.toUpperCase();\r\n const handler = route.handlers[method];\r\n\r\n if (!handler) {\r\n res.setHeader(\"Allow\", Object.keys(route.handlers).join(\", \"));\r\n res.status(405).json({ error: \"Method Not Allowed\" });\r\n return;\r\n }\r\n\r\n // Security: Sanitize route parameters and query parameters\r\n const sanitizedParams = sanitizeParams(params);\r\n const sanitizedQuery = sanitizeQuery(req.query as Record<string, any>);\r\n\r\n const ctx: ApiContext = {\r\n req,\r\n res,\r\n Response: (body: any = {}, status = 200) => res.status(status).json(body),\r\n NotFound: (body: any = {}) => res.status(404).json(body),\r\n params: sanitizedParams,\r\n pathname: urlPath,\r\n locals: {},\r\n };\r\n\r\n // Update req.query with sanitized values\r\n req.query = sanitizedQuery as any;\r\n\r\n try {\r\n // Auto-apply rate limiting if route matches strict patterns and doesn't already have one\r\n const autoRateLimiter = getAutoRateLimiter(\r\n route,\r\n options.strictRateLimitPatterns\r\n );\r\n \r\n const reqLogger = getRequestLogger(req);\r\n \r\n if (autoRateLimiter) {\r\n reqLogger.debug(\"Auto rate limiter applied\", {\r\n route: route.pattern,\r\n patterns: options.strictRateLimitPatterns,\r\n });\r\n }\r\n\r\n const globalMws = route.middlewares ?? [];\r\n const perMethodMws = route.methodMiddlewares?.[method] ?? [];\r\n \r\n // Prepend auto rate limiter if applicable\r\n const chain = autoRateLimiter \r\n ? [autoRateLimiter, ...globalMws, ...perMethodMws]\r\n : [...globalMws, ...perMethodMws];\r\n\r\n for (const mw of chain) {\r\n // Check if this is an express-rate-limit middleware (expects req, res, next)\r\n // express-rate-limit middlewares have specific properties\r\n const isExpressRateLimit = mw && typeof mw === 'function' && \r\n ((mw as any).skip || (mw as any).resetKey || mw.name?.includes('rateLimit'));\r\n \r\n if (isExpressRateLimit) {\r\n // Call express-rate-limit middleware with (req, res, next)\r\n await new Promise<void>((resolve, reject) => {\r\n const next = (err?: any) => {\r\n if (err) reject(err);\r\n else resolve();\r\n };\r\n try {\r\n const result = mw(req, res, next);\r\n // If it returns a promise, wait for it\r\n if (result && typeof result.then === 'function') {\r\n result.then(() => resolve()).catch(reject);\r\n }\r\n } catch (err) {\r\n reject(err);\r\n }\r\n });\r\n } else {\r\n // Call framework middleware with (ctx, next)\r\n await Promise.resolve(mw(ctx, async () => {}));\r\n }\r\n \r\n if (res.headersSent) {\r\n return;\r\n }\r\n }\r\n\r\n await handler(ctx);\r\n } catch (err) {\r\n const reqLogger = getRequestLogger(req);\r\n reqLogger.error(\"API handler error\", err, {\r\n route: route.pattern,\r\n method,\r\n env,\r\n });\r\n if (!res.headersSent) {\r\n res.status(500).json({ error: \"Internal Server Error\" });\r\n }\r\n }\r\n}\r\n","import { Request, Response } from \"express\";\r\nimport { renderToPipeableStream } from \"react-dom/server\";\r\nimport {\r\n ServerContext,\r\n LoadedRoute,\r\n LoaderResult,\r\n matchRoute,\r\n} from \"@router/index\";\r\nimport {\r\n buildAppTree,\r\n buildInitialData,\r\n createDocumentTree,\r\n} from \"@rendering/index\";\r\nimport { runRouteMiddlewares } from \"./middleware\";\r\nimport { runRouteLoader } from \"./loader\";\r\nimport { handleDataResponse, handleRedirect, handleNotFound } from \"./response\";\r\nimport { tryServeSsgHtml, tryServeSsgData } from \"./ssg\";\r\nimport { ERROR_CHUNK_KEY, STATIC_PATH } from \"@constants/globals\";\r\nimport { getClientJsPath, getClientCssPath, loadAssetManifest } from \"@build/utils\";\r\nimport { sanitizeParams } from \"@security/sanitize\";\r\nimport { getRequestLogger, createModuleLogger } from \"@logger/index\";\r\n\r\nexport interface HandlePageRequestOptions {\r\n routes: LoadedRoute[];\r\n notFoundPage: LoadedRoute | null;\r\n errorPage: LoadedRoute | null;\r\n routeChunks: Record<string, string>;\r\n urlPath: string;\r\n req: Request;\r\n res: Response;\r\n env?: \"dev\" | \"prod\";\r\n ssgOutDir?: string;\r\n theme?: string;\r\n projectRoot?: string;\r\n}\r\n\r\n/**\r\n * Determines if a request is a data request (JSON).\r\n *\r\n * @param req - Express request object\r\n * @returns True if the request is a data request\r\n */\r\nexport function isDataRequest(req: Request): boolean {\r\n return (\r\n (req.query && (req.query as any).__fw_data === \"1\") ||\r\n req.headers[\"x-fw-data\"] === \"1\"\r\n );\r\n}\r\n\r\n/**\r\n * Handles a page route request.\r\n * Unifies logic between dev and prod (with SSG support in prod).\r\n *\r\n * @param options - Request handling options\r\n */\r\nexport async function handlePageRequest(\r\n options: HandlePageRequestOptions\r\n): Promise<void> {\r\n try {\r\n await handlePageRequestInternal(options);\r\n } catch (error) {\r\n const { errorPage, req, res, routeChunks, theme, projectRoot } = options;\r\n const reqLogger = getRequestLogger(req);\r\n \r\n if (errorPage) {\r\n await renderErrorPageWithStream(errorPage, req, res, error, routeChunks || {}, theme, projectRoot, options.env);\r\n } else {\r\n reqLogger.error(\"Unhandled error in page request\", error, {\r\n urlPath: options.urlPath,\r\n hasErrorPage: !!errorPage,\r\n });\r\n if (!res.headersSent) {\r\n res.statusCode = 500;\r\n res.setHeader(\"Content-Type\", \"text/html; charset=utf-8\");\r\n res.end(\"<!doctype html><h1>Internal Server Error</h1>\");\r\n }\r\n }\r\n }\r\n}\r\n\r\nasync function handlePageRequestInternal(\r\n options: HandlePageRequestOptions\r\n): Promise<void> {\r\n const {\r\n routes,\r\n notFoundPage,\r\n errorPage,\r\n routeChunks,\r\n urlPath,\r\n req,\r\n res,\r\n env = \"dev\",\r\n ssgOutDir,\r\n theme,\r\n projectRoot,\r\n } = options;\r\n\r\n // Get asset paths - in dev, always use non-hashed names; in prod, use manifest if available\r\n const clientJsPath = env === \"dev\" \r\n ? \"/static/client.js\" \r\n : (projectRoot ? getClientJsPath(projectRoot) : \"/static/client.js\");\r\n const clientCssPath = env === \"dev\"\r\n ? \"/static/client.css\"\r\n : (projectRoot ? getClientCssPath(projectRoot) : \"/static/client.css\");\r\n const assetManifest = env === \"prod\" && projectRoot ? loadAssetManifest(projectRoot) : null;\r\n\r\n const isDataReq = isDataRequest(req);\r\n\r\n if (env === \"prod\" && ssgOutDir) {\r\n if (isDataReq) {\r\n if (tryServeSsgData(res, ssgOutDir, urlPath)) {\r\n return;\r\n }\r\n } else {\r\n if (tryServeSsgHtml(res, ssgOutDir, urlPath)) {\r\n return;\r\n }\r\n }\r\n }\r\n\r\n const matched = matchRoute(routes, urlPath);\r\n\r\n if (!matched) {\r\n if (notFoundPage) {\r\n const ctx: ServerContext & { theme?: string } = {\r\n req,\r\n res,\r\n params: {},\r\n pathname: urlPath,\r\n locals: {},\r\n };\r\n\r\n let loaderResult = await runRouteLoader(notFoundPage, ctx);\r\n // Automatically inject theme from server into loaderResult if not already set\r\n if (!loaderResult.theme) {\r\n loaderResult.theme = theme;\r\n }\r\n \r\n const initialData = buildInitialData(urlPath, {}, loaderResult);\r\n const appTree = buildAppTree(notFoundPage, {}, initialData.props);\r\n initialData.notFound = true;\r\n \r\n // Get nonce from res.locals (set by Helmet for CSP)\r\n const nonce = (res.locals as any).nonce || undefined;\r\n\r\n const documentTree = createDocumentTree({\r\n appTree,\r\n initialData,\r\n meta: loaderResult.metadata ?? null,\r\n titleFallback: \"Not found\",\r\n descriptionFallback: \"Loly demo\",\r\n chunkHref: null,\r\n theme,\r\n clientJsPath,\r\n clientCssPath,\r\n nonce,\r\n });\r\n \r\n let didError = false;\r\n \r\n const { pipe, abort } = renderToPipeableStream(documentTree, {\r\n onShellReady() {\r\n if (didError || res.headersSent) return;\r\n \r\n res.statusCode = 404;\r\n res.setHeader(\"Content-Type\", \"text/html; charset=utf-8\");\r\n pipe(res);\r\n },\r\n onShellError(err) {\r\n didError = true;\r\n const reqLogger = getRequestLogger(req);\r\n reqLogger.error(\"SSR shell error\", err, { route: \"not-found\" });\r\n if (!res.headersSent && errorPage) {\r\n renderErrorPageWithStream(errorPage, req, res, err, routeChunks, theme, projectRoot, env);\r\n } else if (!res.headersSent) {\r\n res.statusCode = 500;\r\n res.setHeader(\"Content-Type\", \"text/html; charset=utf-8\");\r\n res.end(\"<!doctype html><h1>Internal Server Error</h1>\");\r\n }\r\n abort();\r\n },\r\n onError(err) {\r\n didError = true;\r\n const reqLogger = getRequestLogger(req);\r\n reqLogger.error(\"SSR error\", err, { route: \"not-found\" });\r\n },\r\n });\r\n \r\n req.on(\"close\", () => abort());\r\n return;\r\n }\r\n\r\n handleNotFound(res, urlPath);\r\n return;\r\n }\r\n\r\n const { route, params } = matched;\r\n\r\n // Security: Sanitize route parameters\r\n const sanitizedParams = sanitizeParams(params);\r\n\r\n const ctx: ServerContext = {\r\n req,\r\n res,\r\n params: sanitizedParams,\r\n pathname: urlPath,\r\n locals: {},\r\n };\r\n\r\n await runRouteMiddlewares(route, ctx);\r\n if (res.headersSent) {\r\n return;\r\n }\r\n\r\n let loaderResult: LoaderResult;\r\n try {\r\n loaderResult = await runRouteLoader(route, ctx);\r\n // Automatically inject theme from server into loaderResult if not already set\r\n if (!loaderResult.theme) {\r\n loaderResult.theme = theme;\r\n }\r\n } catch (error) {\r\n // If loader throws, handle error appropriately\r\n if (isDataReq) {\r\n // For data requests, return error JSON\r\n res.statusCode = 500;\r\n res.setHeader(\"Content-Type\", \"application/json; charset=utf-8\");\r\n res.end(JSON.stringify({ error: true, message: String(error) }));\r\n return;\r\n } else {\r\n // For HTML requests, render error page\r\n if (errorPage) {\r\n await renderErrorPageWithStream(errorPage, req, res, error, routeChunks, theme, projectRoot, env);\r\n return;\r\n } else {\r\n throw error; // Re-throw to be caught by outer try-catch\r\n }\r\n }\r\n }\r\n\r\n if (isDataReq) {\r\n handleDataResponse(res, loaderResult, theme);\r\n return;\r\n }\r\n\r\n if (loaderResult.redirect) {\r\n handleRedirect(res, loaderResult.redirect);\r\n return;\r\n }\r\n\r\n if (loaderResult.notFound) {\r\n if (isDataReq) {\r\n res.status(200).json({ notFound: true });\r\n } else {\r\n handleNotFound(res, urlPath);\r\n }\r\n return;\r\n }\r\n\r\n const initialData = buildInitialData(urlPath, params, loaderResult);\r\n const appTree = buildAppTree(route, params, initialData.props);\r\n\r\n // Get chunk href with hash if available\r\n const chunkName = routeChunks[route.pattern];\r\n let chunkHref: string | null = null;\r\n if (chunkName != null) {\r\n if (assetManifest && assetManifest.chunks[chunkName]) {\r\n // Use hashed filename from manifest\r\n chunkHref = `${STATIC_PATH}/${assetManifest.chunks[chunkName]}`;\r\n } else {\r\n // Fallback to non-hashed filename\r\n chunkHref = `${STATIC_PATH}/${chunkName}.js`;\r\n }\r\n }\r\n\r\n // Get nonce from res.locals (set by Helmet for CSP)\r\n const nonce = (res.locals as any).nonce || undefined;\r\n\r\n const documentTree = createDocumentTree({\r\n appTree,\r\n initialData,\r\n meta: loaderResult.metadata,\r\n titleFallback: \"Loly framework\",\r\n descriptionFallback: \"Loly demo\",\r\n chunkHref,\r\n theme,\r\n clientJsPath,\r\n clientCssPath,\r\n nonce,\r\n });\r\n\r\n let didError = false;\r\n\r\n const { pipe, abort } = renderToPipeableStream(documentTree, {\r\n onShellReady() {\r\n if (didError || res.headersSent) {\r\n return;\r\n }\r\n\r\n res.statusCode = 200;\r\n res.setHeader(\"Content-Type\", \"text/html; charset=utf-8\");\r\n pipe(res);\r\n },\r\n\r\n onShellError(err) {\r\n didError = true;\r\n const reqLogger = getRequestLogger(req);\r\n reqLogger.error(\"SSR shell error\", err, { route: matched?.route?.pattern || \"unknown\" });\r\n\r\n if (!res.headersSent && errorPage) {\r\n renderErrorPageWithStream(errorPage, req, res, err, routeChunks, theme, projectRoot, env);\r\n } else if (!res.headersSent) {\r\n res.statusCode = 500;\r\n res.setHeader(\"Content-Type\", \"text/html; charset=utf-8\");\r\n res.end(\"<!doctype html><h1>Internal Server Error</h1>\");\r\n }\r\n\r\n abort();\r\n },\r\n\r\n onError(err) {\r\n didError = true;\r\n const reqLogger = getRequestLogger(req);\r\n reqLogger.error(\"SSR error\", err, { route: matched?.route?.pattern || \"unknown\" });\r\n },\r\n });\r\n\r\n req.on(\"close\", () => {\r\n abort();\r\n });\r\n}\r\n\r\n/**\r\n * Renders the error page when an error occurs using streaming.\r\n *\r\n * @param errorPage - Error page route\r\n * @param req - Express request\r\n * @param res - Express response\r\n * @param error - Error that occurred\r\n * @param routeChunks - Route chunks mapping\r\n */\r\nasync function renderErrorPageWithStream(\r\n errorPage: LoadedRoute,\r\n req: Request,\r\n res: Response,\r\n error: unknown,\r\n routeChunks: Record<string, string>,\r\n theme?: string,\r\n projectRoot?: string,\r\n env: \"dev\" | \"prod\" = \"dev\",\r\n): Promise<void> {\r\n try {\r\n const isDataReq = isDataRequest(req);\r\n \r\n const ctx: ServerContext = {\r\n req,\r\n res,\r\n params: { error: String(error) },\r\n pathname: req.path,\r\n locals: { error },\r\n };\r\n\r\n let loaderResult = await runRouteLoader(errorPage, ctx);\r\n // Automatically inject theme from server into loaderResult if not already set\r\n if (!loaderResult.theme && theme) {\r\n loaderResult.theme = theme;\r\n }\r\n\r\n const initialData = buildInitialData(req.path, { error: String(error) }, loaderResult);\r\n initialData.error = true;\r\n \r\n // If this is a data request, return JSON instead of HTML\r\n if (isDataReq) {\r\n res.statusCode = 500;\r\n res.setHeader(\"Content-Type\", \"application/json; charset=utf-8\");\r\n res.end(JSON.stringify({\r\n error: true,\r\n message: String(error),\r\n props: initialData.props,\r\n metadata: loaderResult.metadata ?? null,\r\n theme: loaderResult.theme ?? theme ?? null,\r\n }));\r\n return;\r\n }\r\n const appTree = buildAppTree(errorPage, { error: String(error) }, initialData.props);\r\n\r\n // Get asset paths with hashes (if in production and manifest exists)\r\n // In dev, always use non-hashed names; in prod, use manifest if available\r\n const clientJsPath = env === \"dev\"\r\n ? \"/static/client.js\"\r\n : (projectRoot ? getClientJsPath(projectRoot) : \"/static/client.js\");\r\n const clientCssPath = env === \"dev\"\r\n ? \"/static/client.css\"\r\n : (projectRoot ? getClientCssPath(projectRoot) : \"/static/client.css\");\r\n const assetManifest = env === \"prod\" && projectRoot ? loadAssetManifest(projectRoot) : null;\r\n\r\n const chunkName = routeChunks[ERROR_CHUNK_KEY];\r\n let chunkHref: string | null = null;\r\n if (chunkName != null) {\r\n if (assetManifest && assetManifest.chunks[chunkName]) {\r\n chunkHref = `${STATIC_PATH}/${assetManifest.chunks[chunkName]}`;\r\n } else {\r\n chunkHref = `${STATIC_PATH}/${chunkName}.js`;\r\n }\r\n }\r\n\r\n // Get nonce from res.locals (set by Helmet for CSP)\r\n const nonce = (res.locals as any).nonce || undefined;\r\n\r\n const documentTree = createDocumentTree({\r\n appTree,\r\n initialData,\r\n meta: loaderResult.metadata ?? null,\r\n titleFallback: \"Error\",\r\n descriptionFallback: \"An error occurred\",\r\n chunkHref,\r\n theme,\r\n clientJsPath,\r\n clientCssPath,\r\n nonce,\r\n });\r\n\r\n let didError = false;\r\n\r\n const { pipe, abort } = renderToPipeableStream(documentTree, {\r\n onShellReady() {\r\n if (didError || res.headersSent) {\r\n return;\r\n }\r\n\r\n res.statusCode = 500;\r\n res.setHeader(\"Content-Type\", \"text/html; charset=utf-8\");\r\n pipe(res);\r\n },\r\n onShellError(err) {\r\n didError = true;\r\n const reqLogger = getRequestLogger(req);\r\n reqLogger.error(\"Error rendering error page\", err, { type: \"shellError\" });\r\n if (!res.headersSent) {\r\n res.statusCode = 500;\r\n res.setHeader(\"Content-Type\", \"text/html; charset=utf-8\");\r\n res.end(\"<!doctype html><h1>Internal Server Error</h1>\");\r\n }\r\n abort();\r\n },\r\n onError(err) {\r\n didError = true;\r\n const reqLogger = getRequestLogger(req);\r\n reqLogger.error(\"Error in error page\", err);\r\n },\r\n });\r\n\r\n req.on(\"close\", () => {\r\n abort();\r\n });\r\n } catch (renderErr) {\r\n const reqLogger = getRequestLogger(req);\r\n reqLogger.error(\"Error rendering error page (catch)\", renderErr, { type: \"renderException\" });\r\n if (!res.headersSent) {\r\n res.statusCode = 500;\r\n res.setHeader(\"Content-Type\", \"text/html; charset=utf-8\");\r\n res.end(\"<!doctype html><h1>Internal Server Error</h1>\");\r\n }\r\n }\r\n}\r\n\r\n","import React, { ReactElement } from \"react\";\r\nimport type { LoaderResult, PageComponent, LoadedRoute } from \"@router/index\";\r\nimport { InitialData } from \"../index.types\";\r\nimport {\r\n WINDOW_DATA_KEY,\r\n APP_CONTAINER_ID,\r\n FAVICON_PATH,\r\n} from \"@constants/globals\";\r\n\r\n/**\r\n * Builds the app tree (Page + layouts) in the same way for SSR and SSG.\r\n *\r\n * @param route - Route definition\r\n * @param params - Route parameters\r\n * @param props - Props from loader\r\n * @returns React element tree\r\n */\r\nexport function buildAppTree(\r\n route: LoadedRoute,\r\n params: Record<string, string>,\r\n props: any\r\n): ReactElement {\r\n const Page = route.component as PageComponent;\r\n\r\n let appTree: ReactElement = React.createElement(Page, {\r\n params,\r\n ...props,\r\n });\r\n\r\n const layoutChain = route.layouts.slice().reverse();\r\n\r\n for (const Layout of layoutChain) {\r\n appTree = React.createElement(Layout as PageComponent, {\r\n params,\r\n ...props,\r\n children: appTree,\r\n });\r\n }\r\n\r\n return appTree;\r\n}\r\n\r\n/**\r\n * Builds the complete HTML document tree. Used by both SSR and SSG.\r\n *\r\n * @param options - Document tree options\r\n * @returns React element representing the HTML document\r\n */\r\nexport function createDocumentTree(options: {\r\n appTree: ReactElement;\r\n initialData: InitialData;\r\n meta: LoaderResult[\"metadata\"];\r\n titleFallback?: string;\r\n descriptionFallback?: string;\r\n chunkHref?: string | null;\r\n theme?: string;\r\n clientJsPath?: string;\r\n clientCssPath?: string;\r\n nonce?: string;\r\n}): ReactElement {\r\n const {\r\n appTree,\r\n initialData,\r\n meta,\r\n titleFallback,\r\n descriptionFallback,\r\n chunkHref,\r\n theme,\r\n clientJsPath = \"/static/client.js\",\r\n clientCssPath = \"/static/client.css\",\r\n nonce,\r\n } = options;\r\n\r\n const metaObj = meta ?? {};\r\n const title = (metaObj as any).title ?? titleFallback ?? \"My Framework Dev\";\r\n const lang = (metaObj as any).lang ?? \"en\";\r\n const description =\r\n (metaObj as any).description ??\r\n descriptionFallback ??\r\n \"Demo Loly framework\";\r\n\r\n const extraMetaTags: ReactElement[] = [];\r\n\r\n if (description) {\r\n extraMetaTags.push(\r\n React.createElement(\"meta\", {\r\n name: \"description\",\r\n content: description,\r\n })\r\n );\r\n }\r\n\r\n if (Array.isArray((metaObj as any).metaTags)) {\r\n for (const tag of (metaObj as any).metaTags) {\r\n extraMetaTags.push(\r\n React.createElement(\"meta\", {\r\n name: tag.name,\r\n property: tag.property,\r\n content: tag.content,\r\n })\r\n );\r\n }\r\n }\r\n\r\n const serialized = JSON.stringify({\r\n ...initialData,\r\n theme,\r\n });\r\n\r\n const documentTree = React.createElement(\r\n \"html\",\r\n { lang },\r\n React.createElement(\r\n \"head\",\r\n null,\r\n React.createElement(\"meta\", { charSet: \"utf-8\" }),\r\n React.createElement(\"title\", null, title),\r\n React.createElement(\"meta\", {\r\n name: \"viewport\",\r\n content: \"width=device-width, initial-scale=1\",\r\n }),\r\n ...extraMetaTags,\r\n chunkHref &&\r\n React.createElement(\"link\", {\r\n rel: \"modulepreload\",\r\n href: chunkHref,\r\n as: \"script\",\r\n }),\r\n React.createElement(\"link\", {\r\n rel: \"icon\",\r\n href: FAVICON_PATH,\r\n type: \"image/png\",\r\n }),\r\n React.createElement(\"link\", {\r\n rel: \"stylesheet\",\r\n href: clientCssPath,\r\n }),\r\n React.createElement(\"script\", {\r\n src: clientJsPath,\r\n defer: true,\r\n })\r\n ),\r\n React.createElement(\r\n \"body\",\r\n { \r\n style: { margin: 0 }, \r\n className: [initialData.className, theme].filter(Boolean).join(\" \"),\r\n suppressHydrationWarning: true // Allow theme class to differ between server and client initially\r\n },\r\n React.createElement(\"div\", { id: APP_CONTAINER_ID }, appTree)\r\n ),\r\n React.createElement(\"script\", {\r\n nonce: nonce,\r\n dangerouslySetInnerHTML: {\r\n __html: `window.${WINDOW_DATA_KEY} = ${serialized};`,\r\n },\r\n })\r\n );\r\n\r\n return documentTree;\r\n}\r\n","import { InitialData } from \"../index.types\";\nimport type { LoaderResult } from \"@router/index\";\n\n/**\n * Builds InitialData in a consistent way.\n *\n * @param urlPath - URL path\n * @param params - Route parameters\n * @param loaderResult - Loader result\n * @returns Initial data object\n */\nexport function buildInitialData(\n urlPath: string,\n params: Record<string, string>,\n loaderResult: LoaderResult,\n): InitialData {\n // Include theme in props so it's available to layouts and pages\n const props = {\n ...(loaderResult.props ?? {}),\n ...(loaderResult.theme ? { theme: loaderResult.theme } : {}),\n };\n \n return {\n pathname: urlPath,\n params,\n props,\n metadata: loaderResult.metadata ?? null,\n className: loaderResult.className ?? \"\",\n error: false,\n notFound: false,\n };\n}\n","import { ServerContext, LoadedRoute } from \"@router/index\";\r\n\r\n/**\r\n * Executes route middlewares in chain.\r\n *\r\n * @param route - Route definition\r\n * @param ctx - Server context\r\n */\r\nexport async function runRouteMiddlewares(\r\n route: LoadedRoute,\r\n ctx: ServerContext\r\n): Promise<void> {\r\n for (const mw of route.middlewares) {\r\n await Promise.resolve(\r\n mw(ctx, async () => {\r\n /* no-op */\r\n })\r\n );\r\n if (ctx.res.headersSent) {\r\n return;\r\n }\r\n }\r\n}\r\n\r\n","import { ServerContext, LoadedRoute, LoaderResult } from \"@router/index\";\r\n\r\n/**\r\n * Executes the route loader if it exists.\r\n *\r\n * @param route - Route definition\r\n * @param ctx - Server context\r\n * @returns Loader result\r\n */\r\nexport async function runRouteLoader(\r\n route: LoadedRoute,\r\n ctx: ServerContext\r\n): Promise<LoaderResult> {\r\n if (!route.loader) {\r\n return { props: {} };\r\n }\r\n\r\n return await route.loader(ctx);\r\n}\r\n\r\n","import { Response } from \"express\";\r\nimport { LoaderResult } from \"@router/index\";\r\n\r\n/**\r\n * Handles data request responses (JSON).\r\n *\r\n * @param res - Express response object\r\n * @param loaderResult - Loader result\r\n * @param theme - Optional theme value to include in response\r\n */\r\nexport function handleDataResponse(\r\n res: Response,\r\n loaderResult: LoaderResult,\r\n theme?: string\r\n): void {\r\n res.setHeader(\"Content-Type\", \"application/json; charset=utf-8\");\r\n\r\n if (loaderResult.redirect) {\r\n res.statusCode = 200;\r\n res.end(JSON.stringify({ redirect: loaderResult.redirect }));\r\n return;\r\n }\r\n\r\n if (loaderResult.notFound) {\r\n res.statusCode = 404;\r\n res.end(JSON.stringify({ notFound: true }));\r\n return;\r\n }\r\n\r\n res.statusCode = 200;\r\n res.end(\r\n JSON.stringify({\r\n props: loaderResult.props ?? {},\r\n metadata: loaderResult.metadata ?? null,\r\n theme: loaderResult.theme ?? theme ?? null,\r\n })\r\n );\r\n}\r\n\r\n/**\r\n * Handles redirects for HTML responses.\r\n *\r\n * @param res - Express response object\r\n * @param redirect - Redirect configuration\r\n */\r\nexport function handleRedirect(\r\n res: Response,\r\n redirect: { destination: string; permanent?: boolean }\r\n): void {\r\n const { destination, permanent } = redirect;\r\n res.redirect(permanent ? 301 : 302, destination);\r\n}\r\n\r\n/**\r\n * Handles not found responses for HTML.\r\n *\r\n * @param res - Express response object\r\n * @param urlPath - Optional URL path for error message\r\n */\r\nexport function handleNotFound(res: Response, urlPath?: string): void {\r\n res.statusCode = 200;\r\n res.setHeader(\"Content-Type\", \"text/html; charset=utf-8\");\r\n if (urlPath) {\r\n res.end(`<h1>404 - Not Found</h1><p>Route not found: ${urlPath}</p>`);\r\n } else {\r\n res.end(\"<h1>404 - Not Found</h1>\");\r\n }\r\n}\r\n\r\n","import fs from \"fs\";\r\nimport path from \"path\";\r\nimport { Response } from \"express\";\r\nimport { createModuleLogger } from \"@logger/index\";\r\n\r\nconst logger = createModuleLogger(\"ssg\");\r\n\r\n/**\r\n * Gets the SSG directory path for a route.\r\n *\r\n * @param baseDir - Base SSG output directory\r\n * @param urlPath - URL path\r\n * @returns Directory path for the route\r\n */\r\nexport function getSsgDirForPath(baseDir: string, urlPath: string): string {\r\n const clean = urlPath === \"/\" ? \"\" : urlPath.replace(/^\\/+/, \"\");\r\n return path.join(baseDir, clean);\r\n}\r\n\r\n/**\r\n * Gets the SSG HTML file path for a URL.\r\n *\r\n * @param baseDir - Base SSG output directory\r\n * @param urlPath - URL path\r\n * @returns HTML file path\r\n */\r\nexport function getSsgHtmlPath(baseDir: string, urlPath: string): string {\r\n const dir = getSsgDirForPath(baseDir, urlPath);\r\n return path.join(dir, \"index.html\");\r\n}\r\n\r\n/**\r\n * Gets the SSG data.json file path for a URL.\r\n *\r\n * @param baseDir - Base SSG output directory\r\n * @param urlPath - URL path\r\n * @returns Data JSON file path\r\n */\r\nexport function getSsgDataPath(baseDir: string, urlPath: string): string {\r\n const dir = getSsgDirForPath(baseDir, urlPath);\r\n return path.join(dir, \"data.json\");\r\n}\r\n\r\n/**\r\n * Attempts to serve SSG HTML if it exists.\r\n *\r\n * @param res - Express response object\r\n * @param ssgOutDir - SSG output directory\r\n * @param urlPath - URL path\r\n * @returns True if served, false if not found\r\n */\r\nexport function tryServeSsgHtml(\r\n res: Response,\r\n ssgOutDir: string,\r\n urlPath: string\r\n): boolean {\r\n const ssgHtmlPath = getSsgHtmlPath(ssgOutDir, urlPath);\r\n\r\n if (!fs.existsSync(ssgHtmlPath)) {\r\n return false;\r\n }\r\n\r\n logger.info(\"Serving SSG HTML\", { urlPath, ssgHtmlPath });\r\n\r\n // For SSG files, we need to allow 'unsafe-inline' since we can't generate nonces\r\n // for static HTML files. Override the CSP header set by Helmet.\r\n // Note: setHeader will override any existing header with the same name\r\n res.setHeader(\r\n \"Content-Security-Policy\",\r\n \"default-src 'self'; \" +\r\n \"style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; \" +\r\n \"script-src 'self' 'unsafe-inline'; \" +\r\n \"img-src 'self' data: https:; \" +\r\n \"connect-src 'self' https:; \" +\r\n \"font-src 'self' data: https://fonts.gstatic.com; \" +\r\n \"object-src 'none'; \" +\r\n \"media-src 'self' https:; \" +\r\n \"frame-src 'none';\"\r\n );\r\n\r\n res.statusCode = 200;\r\n res.setHeader(\"Content-Type\", \"text/html; charset=utf-8\");\r\n const stream = fs.createReadStream(ssgHtmlPath, { encoding: \"utf-8\" });\r\n stream.pipe(res);\r\n return true;\r\n}\r\n\r\n/**\r\n * Attempts to serve SSG data.json if it exists.\r\n *\r\n * @param res - Express response object\r\n * @param ssgOutDir - SSG output directory\r\n * @param urlPath - URL path\r\n * @returns True if served, false if not found\r\n */\r\nexport function tryServeSsgData(\r\n res: Response,\r\n ssgOutDir: string,\r\n urlPath: string\r\n): boolean {\r\n const ssgDataPath = getSsgDataPath(ssgOutDir, urlPath);\r\n\r\n if (!fs.existsSync(ssgDataPath)) {\r\n return false;\r\n }\r\n\r\n try {\r\n const raw = fs.readFileSync(ssgDataPath, \"utf-8\");\r\n res.setHeader(\"Content-Type\", \"application/json; charset=utf-8\");\r\n res.status(200).end(raw);\r\n return true;\r\n } catch (err) {\r\n logger.error(\"Error reading SSG data\", err, { urlPath, ssgDataPath });\r\n return false;\r\n }\r\n}\r\n\r\n","import express from \"express\";\r\nimport { LoadedRoute, ApiRoute, WssRoute } from \"@router/index.types\";\r\nimport { handleApiRequest, handlePageRequest } from \"./handlers\";\r\nimport { RouteLoader } from \"@router/index\";\r\nimport { BUILD_FOLDER_NAME } from \"@constants/globals\";\r\nimport { getBuildDir, type FrameworkConfig } from \"@src/config\";\r\nimport { getServerConfig } from \"@server/config\";\r\nimport path from \"path\";\r\n\r\nexport interface SetupRoutesOptions {\r\n app: express.Application;\r\n routes: LoadedRoute[];\r\n apiRoutes: ApiRoute[];\r\n notFoundPage: LoadedRoute | null;\r\n errorPage: LoadedRoute | null;\r\n isDev: boolean;\r\n projectRoot: string;\r\n routeLoader: RouteLoader;\r\n getRoutes?: () => {\r\n routes: LoadedRoute[];\r\n apiRoutes: ApiRoute[];\r\n };\r\n config?: FrameworkConfig;\r\n}\r\n\r\n/**\r\n * Sets up route handlers for the Express application.\r\n * Unifies logic between dev and prod environments.\r\n *\r\n * @param options - Route setup options\r\n */\r\nexport function setupRoutes(options: SetupRoutesOptions): void {\r\n const {\r\n app,\r\n routes: initialRoutes,\r\n apiRoutes: initialApiRoutes,\r\n notFoundPage,\r\n errorPage,\r\n isDev,\r\n projectRoot,\r\n routeLoader,\r\n getRoutes,\r\n config,\r\n } = options;\r\n\r\n // Cache route chunks - they don't change during runtime\r\n const routeChunks = routeLoader.loadRouteChunks();\r\n\r\n // SSG directory - available in both dev and prod if files exist\r\n const ssgOutDir = path.join(\r\n config ? getBuildDir(projectRoot, config) : path.join(projectRoot, BUILD_FOLDER_NAME),\r\n \"ssg\"\r\n );\r\n\r\n app.all(\"/api/*\", async (req, res) => {\r\n const apiRoutes = isDev && getRoutes\r\n ? getRoutes().apiRoutes\r\n : initialApiRoutes;\r\n\r\n // Get rate limit configuration for auto-application\r\n const serverConfig = await getServerConfig(projectRoot);\r\n const strictPatterns = serverConfig.rateLimit?.strictPatterns || [];\r\n\r\n await handleApiRequest({\r\n apiRoutes,\r\n urlPath: req.path,\r\n req,\r\n res,\r\n env: isDev ? \"dev\" : \"prod\",\r\n strictRateLimitPatterns: strictPatterns,\r\n });\r\n });\r\n\r\n app.get(\"*\", async (req, res) => {\r\n let routes = initialRoutes;\r\n let currentNotFoundPage = notFoundPage;\r\n\r\n if (isDev && getRoutes) {\r\n routes = getRoutes().routes;\r\n // In dev, reload not-found on each request to support hot-reload\r\n currentNotFoundPage = routeLoader.loadNotFoundRoute();\r\n }\r\n\r\n const currentErrorPage = isDev && getRoutes\r\n ? routeLoader.loadErrorRoute()\r\n : errorPage;\r\n\r\n await handlePageRequest({\r\n routes,\r\n notFoundPage: currentNotFoundPage,\r\n errorPage: currentErrorPage,\r\n routeChunks,\r\n urlPath: req.path,\r\n req,\r\n res,\r\n env: isDev ? \"dev\" : \"prod\",\r\n ssgOutDir,\r\n theme: req.cookies?.theme || \"light\",\r\n projectRoot,\r\n });\r\n });\r\n}\r\n\r\n","import { getServerFile } from \"./utils/server-dir\";\r\n\r\nexport const CONFIG_FILE_NAME = \"loly.config\";\r\n\r\nexport interface ServerConfig {\r\n bodyLimit?: string;\r\n corsOrigin?: string | string[] | boolean | ((origin: string | undefined, callback: (err: Error | null, allow?: boolean) => void) => void);\r\n rateLimit?: {\r\n windowMs?: number;\r\n max?: number;\r\n apiMax?: number;\r\n strictMax?: number;\r\n // Auto-apply strict rate limiting to routes matching these patterns\r\n strictPatterns?: string[];\r\n };\r\n security?: {\r\n contentSecurityPolicy?: boolean | Record<string, any>;\r\n hsts?: boolean | { maxAge?: number; includeSubDomains?: boolean };\r\n };\r\n}\r\n\r\nconst DEFAULT_CONFIG: ServerConfig = {\r\n bodyLimit: '1mb',\r\n corsOrigin: process.env.CORS_ORIGIN \r\n ? (process.env.CORS_ORIGIN.includes(',') \r\n ? process.env.CORS_ORIGIN.split(',').map(s => s.trim())\r\n : process.env.CORS_ORIGIN)\r\n : (process.env.NODE_ENV === 'production' ? [] : true),\r\n rateLimit: {\r\n windowMs: 15 * 60 * 1000, // 15 minutes\r\n max: 100, // General requests\r\n apiMax: 100, // API requests\r\n strictMax: 5, // Strict endpoints (auth, etc.)\r\n // Auto-apply strict rate limiting to these route patterns\r\n strictPatterns: [\r\n '/api/auth/**',\r\n '/api/login/**',\r\n '/api/register/**',\r\n '/api/password/**',\r\n '/api/reset/**',\r\n '/api/verify/**',\r\n ],\r\n },\r\n security: {\r\n contentSecurityPolicy: {\r\n directives: {\r\n defaultSrc: [\"'self'\"],\r\n styleSrc: [\"'self'\", \"'unsafe-inline'\"],\r\n scriptSrc: [\"'self'\", \"'unsafe-inline'\", \"'unsafe-eval'\"], // Needed for dev\r\n imgSrc: [\"'self'\", \"data:\", \"https:\"],\r\n connectSrc: [\"'self'\"],\r\n fontSrc: [\"'self'\", \"data:\"],\r\n objectSrc: [\"'none'\"],\r\n mediaSrc: [\"'self'\"],\r\n frameSrc: [\"'none'\"],\r\n },\r\n },\r\n hsts: {\r\n maxAge: 31536000, // 1 year\r\n includeSubDomains: true,\r\n },\r\n },\r\n}\r\n\r\nexport async function getServerConfig(\r\n projectRoot: string,\r\n): Promise<ServerConfig> {\r\n let mod: any = await getServerFile(projectRoot, CONFIG_FILE_NAME);\r\n\r\n if (typeof mod?.config === \"function\") {\r\n const options = mod?.config(process.env.NODE_ENV) as ServerConfig;\r\n\r\n // Deep merge for nested objects\r\n const merged: ServerConfig = {\r\n ...DEFAULT_CONFIG,\r\n ...options,\r\n rateLimit: {\r\n ...DEFAULT_CONFIG.rateLimit,\r\n ...options.rateLimit,\r\n },\r\n security: {\r\n ...DEFAULT_CONFIG.security,\r\n ...options.security,\r\n },\r\n };\r\n\r\n return merged;\r\n }\r\n\r\n return DEFAULT_CONFIG;\r\n}\r\n","import { Server as HttpServer } from \"http\";\r\nimport { Server, Socket } from \"socket.io\";\r\nimport { WssRoute, WssContext } from \"@router/index.types\";\r\n\r\nexport interface SetupWssEventsOptions {\r\n httpServer: HttpServer;\r\n wssRoutes: WssRoute[];\r\n}\r\n\r\n/**\r\n * Generates helper actions for WebSocket context.\r\n * \r\n * Wraps Socket.IO methods in arrow functions to preserve the correct context\r\n * when used later in event handlers.\r\n * \r\n * @param socket - The Socket.IO socket instance\r\n * @param namespace - The Socket.IO namespace instance\r\n * @returns Actions object with helper methods for the namespace\r\n */\r\nconst generateActions = (socket: Socket, namespace: any): WssContext['actions'] => {\r\n return {\r\n // Emit to all clients in the namespace\r\n emit: (event: string, ...args: any[]) => {\r\n socket.nsp.emit(event, ...args);\r\n },\r\n \r\n // Emit to a specific socket by Socket.IO socket ID\r\n emitTo: (socketId: string, event: string, ...args: any[]) => {\r\n const targetSocket = namespace.sockets.get(socketId);\r\n if (targetSocket) {\r\n targetSocket.emit(event, ...args);\r\n }\r\n },\r\n \r\n // Emit to a specific client by custom clientId\r\n // Requires clientId to be stored in socket.data.clientId during connection\r\n emitToClient: (clientId: string, event: string, ...args: any[]) => {\r\n // Find socket by clientId stored in socket.data\r\n namespace.sockets.forEach((s: Socket) => {\r\n if (s.data?.clientId === clientId) {\r\n s.emit(event, ...args);\r\n }\r\n });\r\n },\r\n \r\n // Broadcast to all clients except the sender\r\n broadcast: (event: string, ...args: any[]) => {\r\n socket.broadcast.emit(event, ...args);\r\n },\r\n };\r\n};\r\n\r\n/**\r\n * Sets up Socket.IO server and registers WebSocket event handlers for each route.\r\n * \r\n * This function:\r\n * - Creates a Socket.IO server instance with the '/wss' path\r\n * - Extracts namespaces from route patterns (removes '/wss' prefix)\r\n * - Registers connection handlers for each namespace\r\n * - Maps event handlers from route definitions to Socket.IO events\r\n * \r\n * @param options - WebSocket setup options\r\n * \r\n * @example\r\n * ```ts\r\n * setupWssEvents({\r\n * httpServer,\r\n * wssRoutes: [{ pattern: '/wss/chat', handlers: { ... } }]\r\n * });\r\n * ```\r\n */\r\nexport function setupWssEvents(options: SetupWssEventsOptions): void {\r\n const { httpServer, wssRoutes } = options;\r\n\r\n if (wssRoutes.length === 0) {\r\n return;\r\n }\r\n\r\n const io = new Server(httpServer, {\r\n path: '/wss'\r\n });\r\n\r\n for (const wssRoute of wssRoutes) {\r\n // Extract namespace from route pattern by removing the '/wss' prefix\r\n // Example: Pattern '/wss/chat' -> Namespace '/chat'\r\n // Example: Pattern '/wss' -> Namespace '/'\r\n let namespacePath = wssRoute.pattern.replace(/^\\/wss/, '');\r\n \r\n // Ensure namespace always starts with '/'\r\n if (!namespacePath.startsWith('/')) {\r\n namespacePath = '/' + namespacePath;\r\n }\r\n \r\n // If empty after removal, use root namespace\r\n if (namespacePath === '') {\r\n namespacePath = '/';\r\n }\r\n \r\n const namespace = io.of(namespacePath);\r\n\r\n // Set up connection handler for this namespace\r\n namespace.on('connection', (socket: Socket) => {\r\n // Register all event handlers defined in the route\r\n Object.entries(wssRoute.handlers).forEach(([event, handler]) => {\r\n if (event.toLowerCase() === 'connection') {\r\n // Connection handler is executed immediately upon connection\r\n const ctx: WssContext = {\r\n socket,\r\n io: namespace.server,\r\n params: {},\r\n pathname: wssRoute.pattern,\r\n actions: generateActions(socket, namespace),\r\n };\r\n handler(ctx as any);\r\n } else {\r\n // For other events, register them on the socket instance\r\n socket.on(event, (data) => {\r\n const ctx: WssContext = {\r\n socket,\r\n io: namespace.server,\r\n actions: generateActions(socket, namespace),\r\n params: {},\r\n pathname: wssRoute.pattern,\r\n data,\r\n };\r\n handler(ctx as any);\r\n });\r\n }\r\n });\r\n });\r\n }\r\n}\r\n","import http from \"http\";\r\nimport express from \"express\";\r\nimport cors from \"cors\";\r\nimport helmet from \"helmet\";\r\nimport cookieParser from \"cookie-parser\";\r\nimport compression from \"compression\";\r\nimport crypto from \"crypto\";\r\nimport { getServerConfig } from \"@server/config\";\r\nimport { createRateLimiter } from \"@server/middleware/rate-limit\";\r\nimport { requestLoggerMiddleware, createModuleLogger } from \"@logger/index\";\r\n\r\ninterface SetupAppOptions {\r\n projectRoot: string;\r\n}\r\n\r\nexport const setupApplication = async ({\r\n projectRoot,\r\n}: SetupAppOptions): Promise<{\r\n app: express.Express;\r\n httpServer: http.Server<\r\n typeof http.IncomingMessage,\r\n typeof http.ServerResponse\r\n >;\r\n}> => {\r\n const app = express();\r\n\r\n const serverConfig = await getServerConfig(projectRoot);\r\n\r\n const { bodyLimit, corsOrigin, rateLimit, security } = serverConfig;\r\n\r\n // Security: Helmet with configurable CSP\r\n const helmetConfig: any = {};\r\n \r\n if (security?.contentSecurityPolicy !== false) {\r\n // In development, allow unsafe-inline and unsafe-eval for hot reload\r\n if (process.env.NODE_ENV === \"development\") {\r\n helmetConfig.contentSecurityPolicy = {\r\n directives: {\r\n defaultSrc: [\"'self'\"],\r\n styleSrc: [\"'self'\", \"'unsafe-inline'\", \"https://fonts.googleapis.com\"],\r\n scriptSrc: [\"'self'\", \"'unsafe-inline'\", \"'unsafe-eval'\"],\r\n imgSrc: [\"'self'\", \"data:\", \"https:\"],\r\n // Allow fetch/XHR to any HTTPS endpoint - users can restrict in their config if needed\r\n connectSrc: [\"'self'\", \"ws:\", \"wss:\", \"https:\"],\r\n fontSrc: [\"'self'\", \"data:\", \"https://fonts.gstatic.com\"],\r\n },\r\n };\r\n } else {\r\n // Use function-based CSP to enable nonce support in production\r\n const userCSP = security?.contentSecurityPolicy;\r\n const nonceFunction = (req: express.Request, res: express.Response) => {\r\n // Nonce is generated by middleware and stored in res.locals.nonce\r\n // This allows inline scripts with the nonce attribute\r\n const nonce = (res as any).locals?.nonce || \"\";\r\n return nonce ? `'nonce-${nonce}'` : \"'self'\";\r\n };\r\n \r\n const defaultCSP = {\r\n directives: {\r\n defaultSrc: [\"'self'\"],\r\n styleSrc: [\"'self'\", \"'unsafe-inline'\", \"https://fonts.googleapis.com\"],\r\n scriptSrc: [\"'self'\", nonceFunction],\r\n imgSrc: [\"'self'\", \"data:\", \"https:\"],\r\n // Allow fetch/XHR to any HTTPS endpoint - users can restrict in their config if needed\r\n connectSrc: [\"'self'\", \"https:\"],\r\n fontSrc: [\"'self'\", \"data:\", \"https://fonts.gstatic.com\"],\r\n objectSrc: [\"'none'\"],\r\n mediaSrc: [\"'self'\", \"https:\"],\r\n frameSrc: [\"'none'\"],\r\n },\r\n };\r\n\r\n if (userCSP && typeof userCSP === \"object\" && !Array.isArray(userCSP)) {\r\n // Merge user CSP with default, but ensure scriptSrc includes nonce support\r\n const userDirectives = userCSP.directives || {};\r\n const mergedDirectives: any = {\r\n ...defaultCSP.directives,\r\n ...userDirectives,\r\n };\r\n \r\n // Ensure scriptSrc includes nonce support even if user provided custom scriptSrc\r\n const userScriptSrc = userDirectives.scriptSrc;\r\n if (userScriptSrc && Array.isArray(userScriptSrc)) {\r\n // Check if nonce function is already included\r\n const hasNonceSupport = userScriptSrc.some((src) => \r\n typeof src === \"function\"\r\n );\r\n \r\n if (!hasNonceSupport) {\r\n // Add nonce function to user's scriptSrc\r\n mergedDirectives.scriptSrc = [\r\n ...userScriptSrc,\r\n nonceFunction,\r\n ];\r\n } else {\r\n mergedDirectives.scriptSrc = userScriptSrc;\r\n }\r\n }\r\n \r\n // Ensure connectSrc includes https: for flexibility - merge arrays instead of replacing\r\n const userConnectSrc = userDirectives.connectSrc;\r\n if (userConnectSrc && Array.isArray(userConnectSrc)) {\r\n // If user provided connectSrc, merge with defaults to ensure https: is included\r\n const defaultConnectSrc = defaultCSP.directives.connectSrc || [];\r\n const mergedConnectSrc = [...new Set([...defaultConnectSrc, ...userConnectSrc])];\r\n mergedDirectives.connectSrc = mergedConnectSrc;\r\n }\r\n \r\n // Ensure styleSrc includes Google Fonts\r\n const userStyleSrc = userDirectives.styleSrc;\r\n if (userStyleSrc && Array.isArray(userStyleSrc)) {\r\n const defaultStyleSrc = defaultCSP.directives.styleSrc || [];\r\n const mergedStyleSrc = [...new Set([...defaultStyleSrc, ...userStyleSrc])];\r\n mergedDirectives.styleSrc = mergedStyleSrc;\r\n }\r\n \r\n // Ensure fontSrc includes Google Fonts\r\n const userFontSrc = userDirectives.fontSrc;\r\n if (userFontSrc && Array.isArray(userFontSrc)) {\r\n const defaultFontSrc = defaultCSP.directives.fontSrc || [];\r\n const mergedFontSrc = [...new Set([...defaultFontSrc, ...userFontSrc])];\r\n mergedDirectives.fontSrc = mergedFontSrc;\r\n }\r\n \r\n helmetConfig.contentSecurityPolicy = {\r\n ...userCSP,\r\n directives: mergedDirectives,\r\n };\r\n } else {\r\n helmetConfig.contentSecurityPolicy = defaultCSP;\r\n }\r\n }\r\n } else {\r\n helmetConfig.contentSecurityPolicy = false;\r\n }\r\n\r\n // HSTS configuration\r\n if (security?.hsts !== false) {\r\n helmetConfig.hsts = security?.hsts === true \r\n ? { maxAge: 31536000, includeSubDomains: true }\r\n : security?.hsts;\r\n } else {\r\n helmetConfig.hsts = false;\r\n }\r\n\r\n // Generate nonce for CSP inline scripts (only in production)\r\n // In development, unsafe-inline is allowed\r\n // IMPORTANT: This must run BEFORE helmet so the nonce is available when CSP is evaluated\r\n if (process.env.NODE_ENV !== \"development\" && security?.contentSecurityPolicy !== false) {\r\n app.use((req: express.Request, res: express.Response, next: express.NextFunction) => {\r\n // Generate a unique nonce for this request\r\n const nonce = crypto.randomBytes(16).toString(\"base64\");\r\n (res.locals as any).nonce = nonce;\r\n next();\r\n });\r\n }\r\n\r\n app.use(helmet(helmetConfig));\r\n\r\n // Logging: Request logger middleware (adds request ID and logs requests/responses)\r\n // Must be early in the middleware chain to capture all requests\r\n // Filters out static assets and other noisy paths by default\r\n const appLogger = createModuleLogger(\"framework\");\r\n app.use(requestLoggerMiddleware({ \r\n logger: appLogger.child({ component: \"server\" }),\r\n logRequests: process.env.LOG_REQUESTS === \"true\", // Default to false (only errors/warnings)\r\n logResponses: process.env.LOG_RESPONSES !== \"false\", // Default to true (but filtered)\r\n logStaticAssets: process.env.LOG_STATIC_ASSETS === \"true\", // Default to false\r\n }));\r\n\r\n // Security: CORS with proper origin validation\r\n const corsOptions: cors.CorsOptions = {\r\n credentials: true,\r\n };\r\n\r\n if (typeof corsOrigin === \"function\") {\r\n corsOptions.origin = corsOrigin;\r\n } else if (Array.isArray(corsOrigin)) {\r\n corsOptions.origin = corsOrigin.length > 0 ? corsOrigin : false;\r\n } else if (corsOrigin === true) {\r\n // Allow all origins (development only)\r\n corsOptions.origin = true;\r\n } else if (typeof corsOrigin === \"string\") {\r\n corsOptions.origin = corsOrigin === \"*\" \r\n ? (process.env.NODE_ENV === \"development\" ? true : false)\r\n : [corsOrigin];\r\n } else {\r\n // Default: no CORS in production, allow all in development\r\n corsOptions.origin = process.env.NODE_ENV === \"development\";\r\n }\r\n\r\n app.use(cors(corsOptions));\r\n\r\n // Security: Rate limiting\r\n if (rateLimit) {\r\n const generalLimiter = createRateLimiter({\r\n windowMs: rateLimit.windowMs,\r\n max: rateLimit.max,\r\n });\r\n \r\n // Apply general rate limiting to all routes\r\n app.use(generalLimiter);\r\n }\r\n\r\n app.use(cookieParser());\r\n\r\n app.use(express.json({ limit: bodyLimit }));\r\n app.use(express.urlencoded({ extended: true, limit: bodyLimit }));\r\n\r\n app.use(compression());\r\n\r\n // Create http server\r\n const httpServer = http.createServer(app);\r\n\r\n return {\r\n app,\r\n httpServer,\r\n };\r\n};\r\n","import path from \"path\";\r\nimport type { LoadedRoute } from \"@router/index\";\r\nimport { buildPathFromPattern } from \"./path\";\r\nimport { renderStaticRoute } from \"./renderer\";\r\nimport { ensureDir } from \"../utils\";\r\nimport { BUILD_FOLDER_NAME } from \"@constants/globals\";\r\n\r\n/**\r\n * Builds static pages for routes marked with `dynamic: \"force-static\"`.\r\n * \r\n * For each static route:\r\n * 1. Calls `generateStaticParams()` to get all parameter combinations\r\n * 2. Renders each combination to HTML and data.json\r\n * 3. Writes files to `{BUILD_FOLDER_NAME}/ssg/{path}/index.html` and `data.json`\r\n * \r\n * @param projectRoot - Root directory of the project\r\n * @param routes - Array of loaded routes\r\n * \r\n * @example\r\n * await buildStaticPages('/path/to/project', routes);\r\n *\r\n */\r\nexport async function buildStaticPages(\r\n projectRoot: string,\r\n routes: LoadedRoute[]\r\n): Promise<void> {\r\n const ssgOutDir = path.join(projectRoot, BUILD_FOLDER_NAME, \"ssg\");\r\n ensureDir(ssgOutDir);\r\n\r\n for (const route of routes) {\r\n // Only process routes marked as static\r\n if (route.dynamic !== \"force-static\") continue;\r\n\r\n let allParams: Array<Record<string, string>> = [];\r\n\r\n if (route.paramNames.length === 0) {\r\n allParams = [{}];\r\n } else {\r\n if (!route.generateStaticParams) {\r\n console.warn(\r\n `[framework][ssg] Route ${route.pattern} is marked as force-static but has no generateStaticParams function. Skipping.`\r\n );\r\n continue;\r\n }\r\n \r\n try {\r\n console.log(`[framework][ssg] Generating static params for route: ${route.pattern}`);\r\n \r\n // Add timeout to detect hanging\r\n let timeoutId: NodeJS.Timeout | null = null;\r\n const timeoutPromise = new Promise((_, reject) => {\r\n timeoutId = setTimeout(() => {\r\n reject(new Error(`generateStaticParams for route ${route.pattern} timed out after 30 seconds`));\r\n }, 30000);\r\n });\r\n \r\n const sp = await Promise.race([\r\n route.generateStaticParams(),\r\n timeoutPromise\r\n ]) as Array<Record<string, string>>;\r\n \r\n // Clear timeout if it's still pending\r\n if (timeoutId) {\r\n clearTimeout(timeoutId);\r\n }\r\n \r\n allParams = sp;\r\n console.log(`[framework][ssg] Generated ${sp.length} static params for route: ${route.pattern}`);\r\n } catch (error) {\r\n console.error(\r\n `[framework][ssg] Error generating static params for route ${route.pattern}:`,\r\n error\r\n );\r\n throw error;\r\n }\r\n }\r\n for (const params of allParams) {\r\n const urlPath = buildPathFromPattern(route.pattern, params);\r\n await renderStaticRoute(projectRoot, ssgOutDir, route, urlPath, params);\r\n }\r\n }\r\n \r\n console.log(`[framework][ssg] Finished building all static pages`);\r\n}\r\n\r\n","import path from \"path\";\r\n\r\n/**\r\n * Builds a URL path from a route pattern and parameters.\r\n * \r\n * Replaces dynamic segments ([slug], [...path]) with actual parameter values.\r\n * \r\n * @param pattern - Route pattern (e.g., '/blog/[slug]', '/post/[...path]')\r\n * @param params - Parameter values to substitute\r\n * @returns Actual URL path\r\n * \r\n * @example\r\n * buildPathFromPattern('/blog/[slug]', { slug: 'my-post' })\r\n * // '/blog/my-post'\r\n * \r\n * buildPathFromPattern('/post/[...path]', { path: 'a/b/c' })\r\n * // '/post/a/b/c'\r\n * \r\n * @throws Error if required parameters are missing\r\n */\r\nexport function buildPathFromPattern(\r\n pattern: string,\r\n params: Record<string, string>\r\n): string {\r\n const segments = pattern.split(\"/\").filter(Boolean);\r\n const parts: string[] = [];\r\n\r\n for (const seg of segments) {\r\n // Catch-all parameter: [...path]\r\n if (seg.startsWith(\"[...\") && seg.endsWith(\"]\")) {\r\n const name = seg.slice(4, -1);\r\n const value = params[name];\r\n if (!value) {\r\n throw new Error(\r\n `Missing parameter \"${name}\" for catch-all pattern \"${pattern}\"`\r\n );\r\n }\r\n parts.push(value);\r\n }\r\n // Normal parameter: [slug]\r\n else if (seg.startsWith(\"[\") && seg.endsWith(\"]\")) {\r\n const name = seg.slice(1, -1);\r\n const value = params[name];\r\n if (!value) {\r\n throw new Error(`Missing parameter \"${name}\" for pattern \"${pattern}\"`);\r\n }\r\n parts.push(encodeURIComponent(value));\r\n }\r\n // Static segment\r\n else {\r\n parts.push(seg);\r\n }\r\n }\r\n\r\n return \"/\" + parts.join(\"/\");\r\n}\r\n\r\n/**\r\n * Converts a URL path to an output directory path.\r\n * \r\n * @param baseDir - Base output directory\r\n * @param urlPath - URL path (e.g., '/blog/my-post' or '/')\r\n * @returns Directory path relative to baseDir\r\n * \r\n * @example\r\n * pathToOutDir('/output/ssg', '/blog/my-post')\r\n * // '/output/ssg/blog/my-post'\r\n * \r\n * pathToOutDir('/output/ssg', '/')\r\n * // '/output/ssg'\r\n */\r\nexport function pathToOutDir(baseDir: string, urlPath: string): string {\r\n const clean = urlPath === \"/\" ? \"\" : urlPath.replace(/^\\/+/, \"\");\r\n return path.join(baseDir, clean);\r\n}\r\n\r\n","import fs from \"fs\";\r\nimport path from \"path\";\r\nimport { renderToString } from \"react-dom/server\";\r\nimport { loadChunksFromManifest, type LoadedRoute, type LoaderResult, type ServerContext } from \"@router/index\";\r\nimport {\r\n buildAppTree,\r\n buildInitialData,\r\n createDocumentTree,\r\n} from \"@rendering/index\";\r\nimport { pathToOutDir } from \"./path\";\r\nimport { ensureDir, getClientJsPath, getClientCssPath, loadAssetManifest } from \"../utils\";\r\nimport { STATIC_PATH } from \"@constants/globals\";\r\n\r\n/**\r\n * Renders a static page for SSG.\r\n * \r\n * Executes middlewares and loader, then renders the React component tree\r\n * to HTML. Writes both the HTML file and the data JSON file.\r\n * \r\n * @param projectRoot - Root directory of the project\r\n * @param ssgOutDir - SSG output directory\r\n * @param route - Route definition\r\n * @param urlPath - URL path for this page\r\n * @param params - Route parameters\r\n * \r\n * @example\r\n * await renderStaticRoute(\r\n * '/project',\r\n * '/project/{BUILD_FOLDER_NAME}/ssg',\r\n * route,\r\n * '/blog/my-post',\r\n * { slug: 'my-post' }\r\n * );\r\n */\r\nexport async function renderStaticRoute(\r\n projectRoot: string,\r\n ssgOutDir: string,\r\n route: LoadedRoute,\r\n urlPath: string,\r\n params: Record<string, string>\r\n): Promise<void> {\r\n const routeChunks = loadChunksFromManifest(projectRoot);\r\n const assetManifest = loadAssetManifest(projectRoot);\r\n const clientJsPath = getClientJsPath(projectRoot);\r\n const clientCssPath = getClientCssPath(projectRoot);\r\n \r\n // Get chunk href with hash if available\r\n const chunkName = routeChunks[route.pattern];\r\n let chunkHref: string | null = null;\r\n if (chunkName != null) {\r\n if (assetManifest && assetManifest.chunks[chunkName]) {\r\n chunkHref = `${STATIC_PATH}/${assetManifest.chunks[chunkName]}`;\r\n } else {\r\n chunkHref = `${STATIC_PATH}/${chunkName}.js`;\r\n }\r\n }\r\n\r\n // Mock request/response objects for SSG\r\n const req: any = {\r\n method: \"GET\",\r\n headers: {},\r\n query: {},\r\n path: urlPath,\r\n };\r\n\r\n const res: any = {\r\n statusCode: 200,\r\n headers: {} as Record<string, string>,\r\n setHeader(name: string, value: string) {\r\n this.headers[name.toLowerCase()] = value;\r\n },\r\n get headersSent() {\r\n return false;\r\n },\r\n };\r\n\r\n const ctx: ServerContext = {\r\n req,\r\n res,\r\n params,\r\n pathname: urlPath,\r\n locals: {},\r\n };\r\n\r\n // Execute middlewares\r\n for (const mw of route.middlewares) {\r\n await Promise.resolve(\r\n mw(ctx, async () => {\r\n /* no-op */\r\n })\r\n );\r\n }\r\n\r\n // Execute loader\r\n let loaderResult: LoaderResult = { props: {} };\r\n\r\n if (route.loader) {\r\n loaderResult = await route.loader(ctx);\r\n }\r\n\r\n if (loaderResult.redirect || loaderResult.notFound) {\r\n return;\r\n }\r\n\r\n // Build React component tree\r\n const initialData = buildInitialData(urlPath, params, loaderResult);\r\n const appTree = buildAppTree(route, params, initialData.props);\r\n const documentTree = createDocumentTree({\r\n appTree,\r\n initialData,\r\n meta: loaderResult.metadata,\r\n titleFallback: \"My Framework Dev\",\r\n descriptionFallback: \"Static page generated by @lolyjs/core.\",\r\n chunkHref,\r\n clientJsPath,\r\n clientCssPath,\r\n });\r\n\r\n // Render to HTML (hydratable, same as SSR)\r\n const html = \"<!DOCTYPE html>\" + renderToString(documentTree);\r\n\r\n // Write files\r\n const dir = pathToOutDir(ssgOutDir, urlPath);\r\n ensureDir(dir);\r\n\r\n const htmlFile = path.join(dir, \"index.html\");\r\n const dataFile = path.join(dir, \"data.json\");\r\n\r\n fs.writeFileSync(htmlFile, html, \"utf-8\");\r\n fs.writeFileSync(dataFile, JSON.stringify(initialData, null, 2), \"utf-8\");\r\n}\r\n\r\n","import path from \"path\";\r\nimport fs from \"fs\";\r\nimport esbuild from \"esbuild\";\r\nimport { ensureDir } from \"../utils\";\r\nimport { INIT_FILE_NAME } from \"@server/init\";\r\nimport { CONFIG_FILE_NAME } from \"@server/config\";\r\nimport { BUILD_FOLDER_NAME } from \"@constants/globals\";\r\n\r\nconst SERVER_FILES = [INIT_FILE_NAME, CONFIG_FILE_NAME];\r\n\r\nexport interface BuildServerResult {\r\n outDir: string;\r\n}\r\n\r\nfunction collectAppSources(appDir: string): string[] {\r\n const entries: string[] = [];\r\n\r\n function walk(dir: string) {\r\n const items = fs.readdirSync(dir, { withFileTypes: true });\r\n\r\n for (const item of items) {\r\n const full = path.join(dir, item.name);\r\n\r\n if (item.isDirectory()) {\r\n walk(full);\r\n continue;\r\n }\r\n\r\n if (item.isFile()) {\r\n if (full.endsWith(\".d.ts\")) continue;\r\n\r\n if (\r\n full.endsWith(\".ts\") ||\r\n full.endsWith(\".tsx\") ||\r\n full.endsWith(\".js\") ||\r\n full.endsWith(\".jsx\")\r\n ) {\r\n entries.push(full);\r\n }\r\n }\r\n }\r\n }\r\n\r\n walk(appDir);\r\n return entries;\r\n}\r\n\r\n/**\r\n * Builds the server application.\r\n *\r\n * Compiles app directory with bundling enabled, and server files (init/config)\r\n * without bundling for direct require access.\r\n *\r\n * @param projectRoot - Root directory of the project\r\n * @param appDir - App directory to build\r\n * @returns Promise resolving to build result with output directory\r\n */\r\nexport async function buildServerApp(\r\n projectRoot: string,\r\n appDir: string\r\n): Promise<BuildServerResult> {\r\n const outDir = path.join(projectRoot, BUILD_FOLDER_NAME, \"server\");\r\n\r\n const entryPoints = collectAppSources(appDir);\r\n ensureDir(outDir);\r\n\r\n if (entryPoints.length === 0) {\r\n return { outDir };\r\n }\r\n\r\n await esbuild.build({\r\n entryPoints,\r\n outdir: outDir,\r\n outbase: appDir,\r\n platform: \"node\",\r\n format: \"cjs\",\r\n target: \"node18\",\r\n jsx: \"automatic\",\r\n sourcemap: true,\r\n bundle: true,\r\n splitting: false,\r\n logLevel: \"info\",\r\n tsconfig: path.join(projectRoot, \"tsconfig.json\"),\r\n packages: \"external\",\r\n });\r\n\r\n for (const fileName of SERVER_FILES) {\r\n const initTS = path.join(projectRoot, `${fileName}.ts`);\r\n const initJS = path.join(outDir, `${fileName}.js`);\r\n\r\n if (fs.existsSync(initTS)) {\r\n await esbuild.build({\r\n entryPoints: [initTS],\r\n outfile: initJS,\r\n platform: \"node\",\r\n format: \"cjs\",\r\n target: \"node18\",\r\n jsx: \"automatic\",\r\n sourcemap: true,\r\n bundle: false,\r\n logLevel: \"info\",\r\n tsconfig: path.join(projectRoot, \"tsconfig.json\"),\r\n });\r\n }\r\n }\r\n\r\n return { outDir };\r\n}\r\n","import path from \"path\";\r\nimport {\r\n loadApiRoutes,\r\n LoadedRoute,\r\n loadRoutes,\r\n writeClientBoostrapManifest,\r\n writeClientRoutesManifest,\r\n writeRoutesManifest,\r\n loadNotFoundRouteFromFilesystem,\r\n loadErrorRouteFromFilesystem,\r\n} from \"@router/index\";\r\nimport { buildClientBundle } from \"./bundler/client\";\r\nimport { buildStaticPages } from \"./ssg\";\r\nimport { buildServerApp } from \"./bundler/server\";\r\nimport { NOT_FOUND_PATTERN } from \"@constants/globals\";\r\nimport { loadConfig, getAppDir, type FrameworkConfig } from \"@src/config\";\r\nimport { loadWssRoutes } from \"@router/loader-wss\";\r\n\r\nexport interface BuildAppOptions {\r\n rootDir?: string;\r\n appDir?: string;\r\n config?: FrameworkConfig;\r\n}\r\n\r\nexport async function buildApp(options: BuildAppOptions = {}): Promise<void> {\r\n const projectRoot = options.rootDir ?? process.cwd();\r\n const config = options.config ?? loadConfig(projectRoot);\r\n const appDir = options.appDir ?? getAppDir(projectRoot, config);\r\n\r\n process.env.LOLY_BUILD = \"1\";\r\n\r\n const routes = loadRoutes(appDir);\r\n const apiRoutes = loadApiRoutes(appDir);\r\n const wssRoutes = loadWssRoutes(appDir);\r\n\r\n const { outDir: serverOutDir } = await buildServerApp(projectRoot, appDir);\r\n\r\n // Load special error pages (_not-found.tsx, _error.tsx)\r\n const notFoundRoute = loadNotFoundRouteFromFilesystem(appDir);\r\n const errorRoute = loadErrorRouteFromFilesystem(appDir);\r\n\r\n if (!notFoundRoute) {\r\n console.warn(\r\n `[framework][build] No not-found route found. Consider creating ${config.directories.app}/${config.conventions.notFound}.tsx`\r\n );\r\n }\r\n\r\n // Create a minimal not-found route if none exists\r\n const fallbackNotFound: LoadedRoute = notFoundRoute || {\r\n pattern: NOT_FOUND_PATTERN,\r\n regex: new RegExp(`^${NOT_FOUND_PATTERN}/?$`),\r\n paramNames: [],\r\n component: () => null,\r\n layouts: [],\r\n pageFile: \"\",\r\n layoutFiles: [],\r\n middlewares: [],\r\n loader: null,\r\n dynamic: \"force-static\",\r\n generateStaticParams: null,\r\n };\r\n\r\n writeRoutesManifest({\r\n routes,\r\n apiRoutes,\r\n wssRoutes,\r\n notFoundRoute: fallbackNotFound,\r\n errorRoute,\r\n projectRoot,\r\n serverOutDir,\r\n appDir,\r\n });\r\n\r\n writeClientBoostrapManifest(projectRoot);\r\n\r\n writeClientRoutesManifest(routes, projectRoot);\r\n\r\n await buildClientBundle(projectRoot);\r\n\r\n await buildStaticPages(projectRoot, routes);\r\n\r\n delete process.env.LOLY_BUILD;\r\n\r\n console.log(`[framework][build] Build completed successfully`);\r\n}\r\n\r\nexport { startClientBundler, buildClientBundle } from \"./bundler/client\";\r\nexport { buildServerApp } from \"./bundler/server\";\r\nexport { buildStaticPages } from \"./ssg\";\r\n","import { hydrateRoot } from \"react-dom/client\";\r\nimport { APP_CONTAINER_ID } from \"./constants\";\r\nimport { getWindowData } from \"./window-data\";\r\nimport { matchRouteClient } from \"./route-matcher\";\r\nimport { applyMetadata } from \"./metadata\";\r\nimport { AppShell } from \"./AppShell\";\r\nimport type {\r\n InitialData,\r\n ClientRouteLoaded,\r\n RouteViewState,\r\n} from \"./types\";\r\n\r\nexport async function loadInitialRoute(\r\n initialUrl: string,\r\n initialData: InitialData | null,\r\n routes: ClientRouteLoaded[],\r\n notFoundRoute: ClientRouteLoaded | null,\r\n errorRoute: ClientRouteLoaded | null\r\n): Promise<RouteViewState> {\r\n const isInitialNotFound = initialData?.notFound === true;\r\n const isInitialError = initialData?.error === true;\r\n\r\n let initialRoute: ClientRouteLoaded | null = null;\r\n let initialParams: Record<string, string> = {};\r\n let initialComponents = null;\r\n\r\n if (isInitialError && errorRoute) {\r\n initialRoute = errorRoute;\r\n initialParams = initialData?.params ?? {};\r\n initialComponents = await errorRoute.load();\r\n } else if (isInitialNotFound && notFoundRoute) {\r\n initialRoute = notFoundRoute;\r\n initialParams = {};\r\n initialComponents = await notFoundRoute.load();\r\n } else {\r\n const match = matchRouteClient(initialUrl, routes);\r\n if (match) {\r\n initialRoute = match.route;\r\n initialParams = match.params;\r\n initialComponents = await match.route.load();\r\n } else if (notFoundRoute) {\r\n initialRoute = notFoundRoute;\r\n initialParams = {};\r\n initialComponents = await notFoundRoute.load();\r\n } else {\r\n console.warn(\r\n `[client] No route match found for ${initialUrl}. Available routes:`,\r\n routes.map((r) => r.pattern)\r\n );\r\n }\r\n }\r\n\r\n return {\r\n url: initialUrl,\r\n route: initialRoute,\r\n params: initialParams,\r\n components: initialComponents,\r\n props: initialData?.props ?? {},\r\n };\r\n}\r\n\r\n/**\r\n * Sets up hot reload via Server-Sent Events (SSE) in development mode.\r\n * Listens for file changes and reloads the page when needed.\r\n */\r\nfunction setupHotReload(): void {\r\n // Only enable hot reload in development mode\r\n // In production, process.env.NODE_ENV is replaced by DefinePlugin with \"production\"\r\n // @ts-ignore - process.env.NODE_ENV is replaced by DefinePlugin at build time\r\n const nodeEnv: string = (typeof process !== \"undefined\" && process?.env?.NODE_ENV) || \"production\";\r\n const isDev = nodeEnv !== \"production\";\r\n \r\n if (!isDev) {\r\n return; // Skip hot reload in production\r\n }\r\n\r\n try {\r\n console.log(\"[hot-reload] Attempting to connect to /__fw/hot...\");\r\n const eventSource = new EventSource(\"/__fw/hot\");\r\n let reloadTimeout: ReturnType<typeof setTimeout> | null = null;\r\n\r\n eventSource.addEventListener(\"message\", (event) => {\r\n const data = event.data;\r\n if (data && data.startsWith(\"reload:\")) {\r\n const filePath = data.slice(7);\r\n console.log(`[hot-reload] File changed: ${filePath}`);\r\n\r\n // Clear any pending reload\r\n if (reloadTimeout) {\r\n clearTimeout(reloadTimeout);\r\n }\r\n\r\n // Wait a bit for the bundler to finish compiling and files to be written\r\n // Increased timeout to ensure everything is ready\r\n reloadTimeout = setTimeout(() => {\r\n console.log(\"[hot-reload] Reloading page...\");\r\n // Force reload without cache to ensure we get the latest files\r\n window.location.reload();\r\n }, 500);\r\n }\r\n });\r\n\r\n eventSource.addEventListener(\"ping\", () => {\r\n console.log(\"[hot-reload] ✓ Connected to hot reload server\");\r\n });\r\n\r\n eventSource.onopen = () => {\r\n console.log(\"[hot-reload] ✓ SSE connection opened\");\r\n };\r\n\r\n eventSource.onerror = (error) => {\r\n // Log connection state for debugging\r\n const states = [\"CONNECTING\", \"OPEN\", \"CLOSED\"];\r\n const state = states[eventSource.readyState] || \"UNKNOWN\";\r\n \r\n if (eventSource.readyState === EventSource.CONNECTING) {\r\n // Still connecting, might be normal\r\n console.log(\"[hot-reload] Connecting...\");\r\n } else if (eventSource.readyState === EventSource.OPEN) {\r\n console.warn(\"[hot-reload] Connection error (but connection is open):\", error);\r\n } else {\r\n // Connection closed - might be production mode or server not running\r\n console.log(\"[hot-reload] Connection closed (readyState:\", state, \")\");\r\n }\r\n // EventSource automatically reconnects, so we don't need to do anything\r\n };\r\n } catch (error) {\r\n // Fail silently if EventSource is not supported\r\n console.log(\"[hot-reload] EventSource not supported or error:\", error);\r\n }\r\n}\r\n\r\n/**\r\n * Bootstraps the client-side application.\r\n *\r\n * @param routes - Array of client routes\r\n * @param notFoundRoute - Not-found route definition\r\n * @param errorRoute - Error route definition\r\n */\r\nexport function bootstrapClient(\r\n routes: ClientRouteLoaded[],\r\n notFoundRoute: ClientRouteLoaded | null,\r\n errorRoute: ClientRouteLoaded | null = null\r\n): void {\r\n // Set up hot reload in development mode\r\n console.log(\"[client] Bootstrap starting, setting up hot reload...\");\r\n setupHotReload();\r\n\r\n (async function bootstrap() {\r\n const container = document.getElementById(APP_CONTAINER_ID);\r\n const initialData = getWindowData();\r\n\r\n if (!container) {\r\n console.error(`Container #${APP_CONTAINER_ID} not found for hydration`);\r\n return;\r\n }\r\n\r\n const initialUrl = window.location.pathname + window.location.search;\r\n\r\n try {\r\n const initialState = await loadInitialRoute(\r\n initialUrl,\r\n initialData,\r\n routes,\r\n notFoundRoute,\r\n errorRoute\r\n );\r\n\r\n if (initialData?.metadata) {\r\n applyMetadata(initialData.metadata);\r\n }\r\n\r\n hydrateRoot(\r\n container,\r\n <AppShell\r\n initialState={initialState}\r\n routes={routes}\r\n notFoundRoute={notFoundRoute}\r\n errorRoute={errorRoute}\r\n />\r\n );\r\n } catch (error) {\r\n console.error(\r\n \"[client] Error loading initial route components for\",\r\n initialUrl,\r\n error\r\n );\r\n\r\n window.location.reload();\r\n }\r\n })();\r\n}\r\n\r\n","// Client-side constants (hardcoded to avoid alias resolution issues in Rspack)\r\nexport const WINDOW_DATA_KEY = \"__FW_DATA__\";\r\nexport const APP_CONTAINER_ID = \"__app\";\r\n\r\n","import { WINDOW_DATA_KEY } from \"./constants\";\r\nimport type { InitialData } from \"./types\";\r\n\r\nexport function getWindowData(): InitialData | null {\r\n return ((window as any)[WINDOW_DATA_KEY] as InitialData | undefined) ?? null;\r\n}\r\n\r\nexport function setWindowData(data: InitialData): void {\r\n (window as any)[WINDOW_DATA_KEY] = data;\r\n \r\n // Dispatch event for components to listen to (e.g., usePageProps, ThemeProvider)\r\n // This ensures components update when navigating in SPA mode\r\n if (typeof window !== \"undefined\") {\r\n window.dispatchEvent(\r\n new CustomEvent(\"fw-data-refresh\", {\r\n detail: { data },\r\n })\r\n );\r\n }\r\n}\r\n\r\nexport function getCurrentTheme(): string | null {\r\n return getWindowData()?.theme ?? null;\r\n}\r\n\r\n","import type { ClientRouteLoaded, ClientRouteMatch } from \"./types\";\r\n\r\nexport function buildClientRegexFromPattern(pattern: string): RegExp {\r\n const segments = pattern.split(\"/\").filter(Boolean);\r\n const regexParts: string[] = [];\r\n\r\n for (let i = 0; i < segments.length; i++) {\r\n const seg = segments[i];\r\n\r\n // catch-all [...slug]\r\n if (seg.startsWith(\"[...\") && seg.endsWith(\"]\")) {\r\n if (i !== segments.length - 1) {\r\n throw new Error(\r\n `Catch-all segment \"${seg}\" in \"${pattern}\" must be the last segment.`\r\n );\r\n }\r\n regexParts.push(\"(.+)\");\r\n continue;\r\n }\r\n\r\n // dynamic [id]\r\n if (seg.startsWith(\"[\") && seg.endsWith(\"]\")) {\r\n regexParts.push(\"([^/]+)\");\r\n continue;\r\n }\r\n\r\n // static segment\r\n const escaped = seg.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\r\n regexParts.push(escaped);\r\n }\r\n\r\n const regexSource = \"^/\" + regexParts.join(\"/\") + \"/?$\";\r\n return new RegExp(regexSource);\r\n}\r\n\r\nexport function matchRouteClient(\r\n pathWithSearch: string,\r\n routes: ClientRouteLoaded[]\r\n): ClientRouteMatch | null {\r\n const [pathname] = pathWithSearch.split(\"?\");\r\n for (const r of routes) {\r\n const regex = buildClientRegexFromPattern(r.pattern);\r\n const match = regex.exec(pathname);\r\n if (!match) continue;\r\n\r\n const params: Record<string, string> = {};\r\n r.paramNames.forEach((name, idx) => {\r\n params[name] = decodeURIComponent(match[idx + 1] || \"\");\r\n });\r\n\r\n return { route: r, params };\r\n }\r\n return null;\r\n}\r\n\r\n","export function applyMetadata(\r\n md?: { title?: string; description?: string } | null\r\n) {\r\n if (!md) return;\r\n\r\n if (md.title) {\r\n document.title = md.title;\r\n }\r\n\r\n if (md.description) {\r\n let meta = document.querySelector(\r\n 'meta[name=\"description\"]'\r\n ) as HTMLMetaElement | null;\r\n\r\n if (!meta) {\r\n meta = document.createElement(\"meta\");\r\n meta.name = \"description\";\r\n document.head.appendChild(meta);\r\n }\r\n\r\n meta.content = md.description;\r\n }\r\n}\r\n\r\n","import { useEffect, useState, useRef } from \"react\";\r\nimport { RouterView } from \"./RouterView\";\r\nimport {\r\n navigate,\r\n createClickHandler,\r\n createPopStateHandler,\r\n type NavigationHandlers,\r\n} from \"./navigation\";\r\nimport type {\r\n RouteViewState,\r\n ClientRouteLoaded,\r\n} from \"./types\";\r\n\r\nexport interface AppShellProps {\r\n initialState: RouteViewState;\r\n routes: ClientRouteLoaded[];\r\n notFoundRoute: ClientRouteLoaded | null;\r\n errorRoute: ClientRouteLoaded | null;\r\n}\r\n\r\nexport function AppShell({\r\n initialState,\r\n routes,\r\n notFoundRoute,\r\n errorRoute,\r\n}: AppShellProps) {\r\n const [state, setState] = useState<RouteViewState>(initialState);\r\n const handlersRef = useRef<NavigationHandlers>({\r\n setState,\r\n routes,\r\n notFoundRoute,\r\n errorRoute,\r\n });\r\n\r\n // Mantener handlersRef actualizado\r\n useEffect(() => {\r\n handlersRef.current = {\r\n setState,\r\n routes,\r\n notFoundRoute,\r\n errorRoute,\r\n };\r\n }, [routes, notFoundRoute, errorRoute]);\r\n\r\n useEffect(() => {\r\n // Flag para evitar múltiples listeners (por si React Strict Mode ejecuta dos veces)\r\n let isMounted = true;\r\n\r\n async function handleNavigate(\r\n nextUrl: string,\r\n options?: { revalidate?: boolean }\r\n ) {\r\n if (!isMounted) return;\r\n await navigate(nextUrl, handlersRef.current, options);\r\n }\r\n\r\n const handleClick = createClickHandler(handleNavigate);\r\n const handlePopState = createPopStateHandler(handleNavigate);\r\n\r\n // Usar capture: false (burbujeo) para que los eventos del input se manejen primero\r\n window.addEventListener(\"click\", handleClick, false);\r\n window.addEventListener(\"popstate\", handlePopState, false);\r\n\r\n return () => {\r\n isMounted = false;\r\n window.removeEventListener(\"click\", handleClick, false);\r\n window.removeEventListener(\"popstate\", handlePopState, false);\r\n };\r\n }, []); // Solo ejecutar una vez al montar\r\n\r\n const isError = state.route === errorRoute;\r\n const isNotFound = state.route === notFoundRoute;\r\n const routeType = isError ? \"error\" : isNotFound ? \"notfound\" : \"normal\";\r\n const routeKey = `${state.url}:${routeType}`;\r\n\r\n return <RouterView key={routeKey} state={state} />;\r\n}\r\n\r\n","import type { RouteViewState } from \"./types\";\r\n\r\nexport function RouterView({ state }: { state: RouteViewState }) {\r\n if (!state.route) {\r\n // Don't show 404 if we're waiting for components to load\r\n if (state.components === null) {\r\n return null;\r\n }\r\n return <h1>404 - Route not found</h1>;\r\n }\r\n\r\n if (!state.components) {\r\n return null;\r\n }\r\n\r\n const { Page, layouts } = state.components;\r\n const { params, props } = state;\r\n\r\n let element = <Page params={params} {...props} />;\r\n\r\n const layoutChain = layouts.slice().reverse();\r\n for (const Layout of layoutChain) {\r\n element = (\r\n <Layout params={params} {...props}>\r\n {element}\r\n </Layout>\r\n );\r\n }\r\n\r\n return element;\r\n}\r\n\r\n","type RouteData = {\n ok: boolean;\n status: number;\n json: any;\n};\n\ntype CacheEntry =\n | { status: \"pending\"; promise: Promise<RouteData> }\n | { status: \"fulfilled\"; value: RouteData }\n | { status: \"rejected\"; error: any };\n\n// Use window to guarantee a single shared cache instance\n// across all bundles/modules\nconst CACHE_KEY = \"__FW_DATA_CACHE__\";\n\n// Maximum number of entries in the cache (LRU)\nconst MAX_CACHE_SIZE = 100;\n\ntype CacheStore = {\n data: Map<string, CacheEntry>;\n index: Map<string, Set<string>>; // pathBase -> Set of keys\n lru: string[]; // Ordered list: most recent at end, oldest at start\n};\n\nfunction getCacheStore(): CacheStore {\n if (typeof window !== \"undefined\") {\n if (!(window as any)[CACHE_KEY]) {\n (window as any)[CACHE_KEY] = {\n data: new Map<string, CacheEntry>(),\n index: new Map<string, Set<string>>(),\n lru: [],\n };\n }\n return (window as any)[CACHE_KEY];\n }\n // Fallback for SSR (though this shouldn't be used on the client)\n return {\n data: new Map<string, CacheEntry>(),\n index: new Map<string, Set<string>>(),\n lru: [],\n };\n}\n\nconst cacheStore = getCacheStore();\nconst dataCache = cacheStore.data;\nconst pathIndex = cacheStore.index;\nconst lru = cacheStore.lru;\n\n// Helper functions for cache management\n\n/**\n * Extract base path from a cache key (removes query params)\n */\nfunction extractPathBase(key: string): string {\n return key.split(\"?\")[0];\n}\n\n/**\n * Add key to path index\n */\nfunction addToIndex(key: string): void {\n const pathBase = extractPathBase(key);\n if (!pathIndex.has(pathBase)) {\n pathIndex.set(pathBase, new Set());\n }\n pathIndex.get(pathBase)!.add(key);\n}\n\n/**\n * Remove key from path index\n */\nfunction removeFromIndex(key: string): void {\n const pathBase = extractPathBase(key);\n const keys = pathIndex.get(pathBase);\n if (keys) {\n keys.delete(key);\n if (keys.size === 0) {\n pathIndex.delete(pathBase);\n }\n }\n}\n\n/**\n * Update LRU order - move key to end (most recent)\n */\nfunction updateLRU(key: string): void {\n const index = lru.indexOf(key);\n if (index !== -1) {\n lru.splice(index, 1);\n }\n lru.push(key);\n}\n\n/**\n * Remove oldest entries if cache exceeds MAX_CACHE_SIZE\n */\nfunction evictOldest(): void {\n while (lru.length >= MAX_CACHE_SIZE && lru.length > 0) {\n const oldestKey = lru.shift()!;\n dataCache.delete(oldestKey);\n removeFromIndex(oldestKey);\n }\n}\n\n/**\n * Set cache entry and maintain indexes\n */\nfunction setCacheEntry(key: string, entry: CacheEntry): void {\n const existingEntry = dataCache.get(key);\n const wasFulfilled = existingEntry?.status === \"fulfilled\";\n \n dataCache.set(key, entry);\n \n // Only track fulfilled entries in LRU and index (not pending/rejected)\n if (entry.status === \"fulfilled\") {\n // Add to index if it wasn't already fulfilled (new entry or transition from pending/rejected)\n if (!wasFulfilled) {\n addToIndex(key);\n }\n updateLRU(key);\n evictOldest();\n } else if (wasFulfilled) {\n // If entry was fulfilled and now isn't (transitioning to pending/rejected), remove from index\n removeFromIndex(key);\n }\n}\n\n/**\n * Delete cache entry and clean up indexes\n */\nfunction deleteCacheEntry(key: string): void {\n if (dataCache.has(key)) {\n dataCache.delete(key);\n removeFromIndex(key);\n const lruIndex = lru.indexOf(key);\n if (lruIndex !== -1) {\n lru.splice(lruIndex, 1);\n }\n }\n}\n\nfunction buildDataUrl(url: string): string {\n return url + (url.includes(\"?\") ? \"&\" : \"?\") + \"__fw_data=1\";\n}\n\nasync function fetchRouteDataOnce(url: string): Promise<RouteData> {\n const dataUrl = buildDataUrl(url);\n\n const res = await fetch(dataUrl, {\n headers: {\n \"x-fw-data\": \"1\",\n Accept: \"application/json\",\n },\n });\n\n let json: any = {};\n\n try {\n const text = await res.text();\n if (text) {\n json = JSON.parse(text);\n }\n } catch (parseError) {\n console.error(\n \"[client][cache] Failed to parse response as JSON:\",\n parseError\n );\n }\n\n const result: RouteData = {\n ok: res.ok,\n status: res.status,\n json,\n };\n\n return result;\n}\n\n/**\n * Revalidates route data by removing it from the cache.\n * The next time you navigate to this route, fresh data will be fetched from the server.\n * This is a client-side function and does not require a server-side revalidation.\n *\n * @param path - The route path to revalidate (e.g., '/posts/1' or '/posts/1?page=2')\n * If query params are not included, revalidates all variants of that route.\n *\n * @example\n * ```ts\n * // After saving something to the DB, revalidate the route\n * await saveToDatabase(data);\n * revalidatePath('/posts');\n * \n * // Revalidate a specific route with query params\n * revalidatePath('/posts?page=2');\n * ```\n */\nexport function revalidatePath(path: string): void {\n // Normalize the base path (without query params)\n const normalizedPath = path.split(\"?\")[0];\n const hasQueryParams = path.includes(\"?\");\n \n // Get all keys for this path base from index (O(1) lookup)\n const keysForPath = pathIndex.get(normalizedPath);\n \n if (!keysForPath || keysForPath.size === 0) {\n return; // No entries to revalidate\n }\n \n // If the path includes specific query params, extract them\n let specificQueryParams: string | undefined;\n if (hasQueryParams) {\n const queryPart = path.split(\"?\")[1];\n // Sort query params for consistent comparison\n specificQueryParams = queryPart\n .split(\"&\")\n .filter((p) => !p.startsWith(\"__fw_data=\"))\n .sort()\n .join(\"&\");\n }\n \n // Iterate only over keys for this path (much smaller set)\n const keysToDelete: string[] = [];\n for (const key of keysForPath) {\n // If specific query params were specified, check if they match\n if (hasQueryParams && specificQueryParams) {\n const [, keyQuery = \"\"] = key.split(\"?\");\n const keyQueryParams = keyQuery\n .split(\"&\")\n .filter((p) => !p.startsWith(\"__fw_data=\"))\n .sort()\n .join(\"&\");\n \n if (keyQueryParams === specificQueryParams) {\n keysToDelete.push(key);\n }\n } else {\n // If no specific query params, revalidate all variants\n keysToDelete.push(key);\n }\n }\n \n // Delete matching entries\n keysToDelete.forEach((key) => {\n deleteCacheEntry(key);\n });\n}\n\n/**\n * Revalidates and refreshes the current page data.\n * Similar to Next.js's `router.refresh()`.\n * \n * This function:\n * 1. Removes the current route from cache\n * 2. Fetches fresh data from the server\n * 3. Updates window.__FW_DATA__ with the new data\n * 4. Dispatches a 'fw-data-refresh' event for components to listen to\n * \n * @returns Promise that resolves with the fresh route data\n * \n * @example\n * ```ts\n * // Refresh current page data after a mutation\n * await revalidate();\n * ```\n */\nexport async function revalidate(): Promise<RouteData> {\n if (typeof window === \"undefined\") {\n throw new Error(\"revalidate() can only be called on the client\");\n }\n\n const pathname = window.location.pathname + window.location.search;\n \n // Revalidate the path (remove from cache)\n revalidatePath(pathname);\n \n // Fetch fresh data\n const freshData = await getRouteData(pathname, { revalidate: true });\n \n // Update window.__FW_DATA__ if it exists\n if ((window as any).__FW_DATA__ && freshData.ok && freshData.json) {\n const currentData = (window as any).__FW_DATA__;\n (window as any).__FW_DATA__ = {\n ...currentData,\n pathname: pathname.split(\"?\")[0],\n params: freshData.json.params || currentData.params || {},\n props: freshData.json.props || currentData.props || {},\n metadata: freshData.json.metadata ?? currentData.metadata ?? null,\n notFound: freshData.json.notFound ?? false,\n error: freshData.json.error ?? false,\n };\n \n // Dispatch event for components to listen to\n window.dispatchEvent(new CustomEvent(\"fw-data-refresh\", {\n detail: { data: freshData },\n }));\n }\n \n return freshData;\n}\n\n/**\n * @deprecated Use `revalidatePath()` instead. This function is kept for backwards compatibility.\n */\nexport function revalidateRouteData(url: string): void {\n revalidatePath(url);\n}\n\nexport function prefetchRouteData(url: string): void {\n const key = buildDataUrl(url);\n\n const cached = dataCache.get(key);\n\n if (cached && cached.status !== \"rejected\") {\n // Update LRU if it exists and is fulfilled\n if (cached.status === \"fulfilled\") {\n updateLRU(key);\n }\n return;\n }\n\n const promise = fetchRouteDataOnce(url)\n .then((value) => {\n setCacheEntry(key, { status: \"fulfilled\", value });\n return value;\n })\n .catch((error) => {\n console.error(\"[client][cache] Error prefetching route data:\", error);\n dataCache.set(key, { status: \"rejected\", error });\n throw error;\n });\n\n dataCache.set(key, { status: \"pending\", promise });\n}\n\nexport type GetRouteDataOptions = {\n /**\n * If true, forces revalidation of route data,\n * ignoring the cache and fetching fresh data from the server.\n * Similar to Next.js's `router.refresh()` behavior.\n */\n revalidate?: boolean;\n};\n\nexport async function getRouteData(\n url: string,\n options?: GetRouteDataOptions\n): Promise<RouteData> {\n const key = buildDataUrl(url);\n\n // If revalidation is requested, remove the entry from cache\n if (options?.revalidate) {\n deleteCacheEntry(key);\n }\n\n const entry = dataCache.get(key);\n\n if (entry) {\n if (entry.status === \"fulfilled\") {\n // Update LRU: mark as recently used\n updateLRU(key);\n return entry.value;\n }\n if (entry.status === \"pending\") {\n return entry.promise;\n }\n }\n\n // No entry in cache, fetch it\n const promise = fetchRouteDataOnce(url)\n .then((value) => {\n setCacheEntry(key, { status: \"fulfilled\", value });\n return value;\n })\n .catch((error) => {\n console.error(\"[client][cache] Error fetching route data:\", error);\n dataCache.set(key, { status: \"rejected\", error });\n throw error;\n });\n\n dataCache.set(key, { status: \"pending\", promise });\n return promise;\n}\n","import { getRouteData } from \"../../react/cache/index\";\r\nimport { matchRouteClient } from \"./route-matcher\";\r\nimport { applyMetadata } from \"./metadata\";\r\nimport { setWindowData, getCurrentTheme } from \"./window-data\";\r\nimport type {\r\n ClientRouteLoaded,\r\n RouteViewState,\r\n InitialData,\r\n} from \"./types\";\r\n\r\nexport type NavigationHandlers = {\r\n setState: (state: RouteViewState) => void;\r\n routes: ClientRouteLoaded[];\r\n notFoundRoute: ClientRouteLoaded | null;\r\n errorRoute: ClientRouteLoaded | null;\r\n};\r\n\r\nasync function handleErrorRoute(\r\n nextUrl: string,\r\n json: any,\r\n errorRoute: ClientRouteLoaded,\r\n setState: (state: RouteViewState) => void\r\n): Promise<boolean> {\r\n try {\r\n const components = await errorRoute.load();\r\n \r\n // Get theme: prioritize cookie, then server, then window data, then default\r\n let theme: string = \"light\";\r\n if (typeof document !== \"undefined\") {\r\n const cookieMatch = document.cookie.match(/theme=([^;]+)/);\r\n if (cookieMatch) {\r\n theme = cookieMatch[1];\r\n } else if (json.theme) {\r\n theme = json.theme;\r\n } else {\r\n const currentTheme = getCurrentTheme();\r\n if (currentTheme) theme = currentTheme;\r\n }\r\n } else if (json.theme) {\r\n theme = json.theme;\r\n }\r\n \r\n const errorProps = {\r\n ...(json.props || {\r\n error: json.message || \"An error occurred\",\r\n }),\r\n theme,\r\n };\r\n\r\n const windowData: InitialData = {\r\n pathname: nextUrl,\r\n params: json.params || {},\r\n props: errorProps,\r\n metadata: json.metadata ?? null,\r\n theme,\r\n notFound: false,\r\n error: true,\r\n };\r\n\r\n setWindowData(windowData);\r\n\r\n setState({\r\n url: nextUrl,\r\n route: errorRoute,\r\n params: json.params || {},\r\n components,\r\n props: errorProps,\r\n });\r\n return true;\r\n } catch (loadError) {\r\n console.error(\r\n \"[client] Error loading error route components:\",\r\n loadError\r\n );\r\n window.location.href = nextUrl;\r\n return false;\r\n }\r\n}\r\n\r\nasync function handleNotFoundRoute(\r\n nextUrl: string,\r\n json: any,\r\n notFoundRoute: ClientRouteLoaded | null,\r\n setState: (state: RouteViewState) => void\r\n): Promise<void> {\r\n // Get theme: prioritize cookie, then server, then window data, then default\r\n let theme: string = \"light\";\r\n if (typeof document !== \"undefined\") {\r\n const cookieMatch = document.cookie.match(/theme=([^;]+)/);\r\n if (cookieMatch) {\r\n theme = cookieMatch[1];\r\n } else if (json.theme) {\r\n theme = json.theme;\r\n } else {\r\n const currentTheme = getCurrentTheme();\r\n if (currentTheme) theme = currentTheme;\r\n }\r\n } else if (json.theme) {\r\n theme = json.theme;\r\n }\r\n \r\n const notFoundProps = {\r\n ...(json.props ?? {}),\r\n theme,\r\n };\r\n\r\n const windowData: InitialData = {\r\n pathname: nextUrl,\r\n params: {},\r\n props: notFoundProps,\r\n metadata: json.metadata ?? null,\r\n theme,\r\n notFound: true,\r\n error: false,\r\n };\r\n\r\n setWindowData(windowData);\r\n\r\n if (notFoundRoute) {\r\n const components = await notFoundRoute.load();\r\n setState({\r\n url: nextUrl,\r\n route: notFoundRoute,\r\n params: {},\r\n components,\r\n props: notFoundProps,\r\n });\r\n } else {\r\n setState({\r\n url: nextUrl,\r\n route: null,\r\n params: {},\r\n components: null,\r\n props: {},\r\n });\r\n }\r\n}\r\n\r\nasync function handleNormalRoute(\r\n nextUrl: string,\r\n json: any,\r\n routes: ClientRouteLoaded[],\r\n setState: (state: RouteViewState) => void\r\n): Promise<boolean> {\r\n applyMetadata(json.metadata ?? null);\r\n \r\n // Get theme: prioritize cookie (source of truth), then server response, then window data, then default\r\n // Cookie is the source of truth because it persists across navigation\r\n let theme: string = \"light\"; // Default\r\n if (typeof document !== \"undefined\") {\r\n const cookieMatch = document.cookie.match(/theme=([^;]+)/);\r\n if (cookieMatch) {\r\n theme = cookieMatch[1];\r\n } else if (json.theme) {\r\n theme = json.theme;\r\n } else {\r\n const currentTheme = getCurrentTheme();\r\n if (currentTheme) {\r\n theme = currentTheme;\r\n }\r\n }\r\n } else if (json.theme) {\r\n theme = json.theme;\r\n }\r\n \r\n // Include theme in props so layouts receive it during SPA navigation\r\n const newProps = {\r\n ...(json.props ?? {}),\r\n theme, // Always include theme\r\n };\r\n\r\n const matched = matchRouteClient(nextUrl, routes);\r\n\r\n if (!matched) {\r\n window.location.href = nextUrl;\r\n return false;\r\n }\r\n\r\n const windowData: InitialData = {\r\n pathname: nextUrl,\r\n params: matched.params,\r\n props: newProps,\r\n metadata: json.metadata ?? null,\r\n theme,\r\n notFound: false,\r\n error: false,\r\n };\r\n\r\n setWindowData(windowData);\r\n\r\n const components = await matched.route.load();\r\n\r\n window.scrollTo({\r\n top: 0,\r\n behavior: \"smooth\",\r\n });\r\n\r\n setState({\r\n url: nextUrl,\r\n route: matched.route,\r\n params: matched.params,\r\n components,\r\n props: newProps,\r\n });\r\n\r\n return true;\r\n}\r\n\r\nexport type NavigateOptions = {\r\n /**\r\n * If true, forces revalidation of route data,\r\n * ignoring the cache and fetching fresh data from the server.\r\n * Similar to Next.js's `router.refresh()` behavior.\r\n */\r\n revalidate?: boolean;\r\n};\r\n\r\nexport async function navigate(\r\n nextUrl: string,\r\n handlers: NavigationHandlers,\r\n options?: NavigateOptions\r\n): Promise<void> {\r\n const { setState, routes, notFoundRoute, errorRoute } = handlers;\r\n\r\n try {\r\n const { ok, json } = await getRouteData(nextUrl, {\r\n revalidate: options?.revalidate,\r\n });\r\n\r\n if (json && json.error) {\r\n if (errorRoute) {\r\n const handled = await handleErrorRoute(\r\n nextUrl,\r\n json,\r\n errorRoute,\r\n setState\r\n );\r\n if (handled) return;\r\n } else {\r\n console.warn(\r\n \"[client] Error route not available, reloading page.\",\r\n errorRoute\r\n );\r\n window.location.href = nextUrl;\r\n return;\r\n }\r\n }\r\n\r\n // 🔴 HTTP error (404/500/etc)\r\n if (!ok) {\r\n if (json && (json as any).redirect) {\r\n window.location.href = (json as any).redirect.destination;\r\n return;\r\n }\r\n window.location.href = nextUrl;\r\n return;\r\n }\r\n\r\n // Redirección vía JSON\r\n if (json.redirect) {\r\n window.location.href = json.redirect.destination;\r\n return;\r\n }\r\n\r\n // Manejo de notFound\r\n if (json.notFound) {\r\n await handleNotFoundRoute(nextUrl, json, notFoundRoute, setState);\r\n return;\r\n }\r\n\r\n // Ruta normal\r\n await handleNormalRoute(nextUrl, json, routes, setState);\r\n } catch (err) {\r\n console.error(\"[client] Error fetching FW data:\", err);\r\n window.location.href = nextUrl;\r\n }\r\n}\r\n\r\nexport function createClickHandler(\r\n navigate: (url: string, options?: NavigateOptions) => void\r\n): (ev: MouseEvent) => void {\r\n return function handleClick(ev: MouseEvent) {\r\n try {\r\n // Salir temprano si el evento ya fue prevenido\r\n if (ev.defaultPrevented) return;\r\n \r\n // Verificar que sea un evento de mouse real (no sintético o de teclado)\r\n if (ev.type !== \"click\") return;\r\n if (ev.button !== 0) return;\r\n if (ev.metaKey || ev.ctrlKey || ev.shiftKey || ev.altKey) return;\r\n \r\n // Verificar que el evento tenga coordenadas válidas (eventos de mouse reales las tienen)\r\n const target = ev.target as HTMLElement | null;\r\n if (ev.clientX === 0 && ev.clientY === 0 && ev.detail === 0) {\r\n // Podría ser un evento sintético, ser más cauteloso\r\n if (target) {\r\n const tagName = target.tagName.toLowerCase();\r\n if (tagName === \"input\" || tagName === \"textarea\" || tagName === \"button\" || tagName === \"select\") {\r\n return; // Es un input, no procesar eventos sintéticos\r\n }\r\n }\r\n }\r\n\r\n if (!target) return;\r\n\r\n // Verificar PRIMERO si el target es un elemento interactivo (más rápido)\r\n const tagName = target.tagName.toLowerCase();\r\n if (\r\n tagName === \"input\" ||\r\n tagName === \"textarea\" ||\r\n tagName === \"button\" ||\r\n tagName === \"select\" ||\r\n target.isContentEditable ||\r\n target.getAttribute(\"contenteditable\") === \"true\"\r\n ) {\r\n return; // Es un elemento interactivo, no procesar\r\n }\r\n\r\n // Verificar si está dentro de un elemento interactivo usando closest (más eficiente que composedPath)\r\n const interactiveParent = target.closest(\"input, textarea, button, select, [contenteditable], label\");\r\n if (interactiveParent) {\r\n // Si el parent es un label, verificar si tiene un control asociado\r\n if (interactiveParent.tagName.toLowerCase() === \"label\") {\r\n const label = interactiveParent as HTMLLabelElement;\r\n if (label.control) {\r\n return; // El label tiene un control asociado (input, etc)\r\n }\r\n } else {\r\n return; // Está dentro de un elemento interactivo\r\n }\r\n }\r\n\r\n // Solo buscar anchor si no es un elemento interactivo\r\n const anchor = target.closest(\"a[href]\") as HTMLAnchorElement | null;\r\n if (!anchor) return;\r\n\r\n const href = anchor.getAttribute(\"href\");\r\n if (!href) return;\r\n if (href.startsWith(\"#\")) return;\r\n\r\n const url = new URL(href, window.location.href);\r\n if (url.origin !== window.location.origin) return;\r\n if (anchor.target && anchor.target !== \"_self\") return;\r\n\r\n ev.preventDefault();\r\n\r\n const nextUrl = url.pathname + url.search;\r\n const currentUrl = window.location.pathname + window.location.search;\r\n if (nextUrl === currentUrl) return;\r\n\r\n // Detectar si el link tiene data-revalidate para forzar revalidación\r\n const shouldRevalidate =\r\n anchor.hasAttribute(\"data-revalidate\") &&\r\n anchor.getAttribute(\"data-revalidate\") !== \"false\";\r\n\r\n window.history.pushState({}, \"\", nextUrl);\r\n navigate(nextUrl, shouldRevalidate ? { revalidate: true } : undefined);\r\n } catch (error) {\r\n // Silenciar errores para evitar bloquear el navegador\r\n console.error(\"[navigation] Error in click handler:\", error);\r\n }\r\n };\r\n}\r\n\r\nexport function createPopStateHandler(\r\n navigate: (url: string, options?: NavigateOptions) => void\r\n): () => void {\r\n return function handlePopState() {\r\n const nextUrl = window.location.pathname + window.location.search;\r\n navigate(nextUrl);\r\n };\r\n}\r\n\r\n","export function withCache(fn: any, options: any): any {\r\n const ttl = options.ttl ?? 60;\r\n\r\n return async function cachedGssp(ctx: any): Promise<any> {\r\n console.log(\"TTL\", ttl);\r\n return await fn(ctx);\r\n };\r\n}\r\n","import { z, ZodSchema, ZodError } from \"zod\";\r\n\r\n/**\r\n * Validation error with detailed information.\r\n */\r\nexport class ValidationError extends Error {\r\n constructor(\r\n public errors: z.ZodIssue[],\r\n message = \"Validation failed\"\r\n ) {\r\n super(message);\r\n this.name = \"ValidationError\";\r\n }\r\n\r\n /**\r\n * Formats validation errors into a user-friendly format.\r\n */\r\n format(): Record<string, string[]> {\r\n const formatted: Record<string, string[]> = {};\r\n for (const error of this.errors) {\r\n const path = error.path.join(\".\");\r\n if (!formatted[path]) {\r\n formatted[path] = [];\r\n }\r\n formatted[path].push(error.message);\r\n }\r\n return formatted;\r\n }\r\n}\r\n\r\n/**\r\n * Validates data against a Zod schema.\r\n * \r\n * @param schema - Zod schema to validate against\r\n * @param data - Data to validate\r\n * @returns Validated data\r\n * @throws ValidationError if validation fails\r\n */\r\nexport function validate<T>(\r\n schema: ZodSchema<T>,\r\n data: unknown\r\n): T {\r\n try {\r\n return schema.parse(data);\r\n } catch (error) {\r\n if (error instanceof ZodError) {\r\n throw new ValidationError(error.errors);\r\n }\r\n throw error;\r\n }\r\n}\r\n\r\n/**\r\n * Safely validates data and returns a result object.\r\n * \r\n * @param schema - Zod schema to validate against\r\n * @param data - Data to validate\r\n * @returns Result object with success flag and data/error\r\n */\r\nexport function safeValidate<T>(\r\n schema: ZodSchema<T>,\r\n data: unknown\r\n): { success: true; data: T } | { success: false; error: ValidationError } {\r\n try {\r\n const validated = schema.parse(data);\r\n return { success: true, data: validated };\r\n } catch (error) {\r\n if (error instanceof ZodError) {\r\n return {\r\n success: false,\r\n error: new ValidationError(error.errors),\r\n };\r\n }\r\n throw error;\r\n }\r\n}\r\n\r\n/**\r\n * Common validation schemas for reuse.\r\n */\r\nexport const commonSchemas = {\r\n /**\r\n * Validates a string parameter (e.g., route params).\r\n */\r\n stringParam: z.string().min(1).max(255),\r\n\r\n /**\r\n * Validates an optional string parameter.\r\n */\r\n optionalStringParam: z.string().max(255).optional(),\r\n\r\n /**\r\n * Validates a numeric ID parameter.\r\n */\r\n idParam: z.string().regex(/^\\d+$/, \"ID must be numeric\").transform(Number),\r\n\r\n /**\r\n * Validates a UUID parameter.\r\n */\r\n uuidParam: z.string().uuid(\"Invalid UUID format\"),\r\n\r\n /**\r\n * Validates pagination parameters.\r\n */\r\n pagination: z.object({\r\n page: z.string().regex(/^\\d+$/).transform(Number).default(\"1\"),\r\n limit: z.string().regex(/^\\d+$/).transform(Number).default(\"10\"),\r\n }),\r\n\r\n /**\r\n * Validates a search query parameter.\r\n */\r\n searchQuery: z.string().min(1).max(100).optional(),\r\n};\r\n\r\n"],"mappings":"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","names":["import_fs","import_path","path","fs","import_path","import_fs","import_path","import_fs","import_path","path","fs","import_fs","import_path","path","fs","fs","path","import_fs","import_path","import_fs","import_path","path","fs","path","fs","import_fs","import_path","path","fs","import_fs","import_path","path","fs","import_fs","import_path","import_fs","import_path","ROUTE_FILE_REGEX","path","fs","path","fs","import_core","import_path","import_fs","import_path","fs","path","BUILD_FOLDER_NAME","STATIC_PATH","path","dotenv","import_path","import_fs","resolve","path","fs","import_fs","import_promises","sysPath","path","presolve","basename","pjoin","prelative","psep","import_fs","import_promises","osType","path","fs_watch","rawEmitter","listener","basename","dirname","newStats","closer","fsrealpath","resolve","realpath","stats","relative","path","DOUBLE_SLASH_RE","testString","stats","statcb","now","stat","import_path","path","import_path","path","import_path","import_fs","path","fs","getRoutes","path","express","rateLimit","path","pino","logger","module","path","resolve","React","import_fs","import_path","logger","path","fs","ctx","loaderResult","initialData","appTree","nonce","documentTree","didError","pipe","abort","DEFAULT_CONFIG","import_path","path","import_express","express","rateLimit","crypto","helmet","cors","cookieParser","compression","http","import_dotenv","dotenv","logger","path","fs","import_path","import_path","path","import_fs","import_path","import_server","path","fs","path","import_path","import_fs","fs","path","esbuild","import_client","WINDOW_DATA_KEY","APP_CONTAINER_ID","WINDOW_DATA_KEY","import_react","navigate","tagName","import_jsx_runtime","import_jsx_runtime","setupHotReload","APP_CONTAINER_ID","path"]}
1
+ {"version":3,"sources":["../constants/globals.ts","../../../node_modules/.pnpm/@ioredis+commands@1.4.0/node_modules/@ioredis/commands/built/commands.json","../../../node_modules/.pnpm/@ioredis+commands@1.4.0/node_modules/@ioredis/commands/built/index.js","../../../node_modules/.pnpm/standard-as-callback@2.1.0/node_modules/standard-as-callback/built/utils.js","../../../node_modules/.pnpm/standard-as-callback@2.1.0/node_modules/standard-as-callback/built/index.js","../../../node_modules/.pnpm/redis-errors@1.2.0/node_modules/redis-errors/lib/old.js","../../../node_modules/.pnpm/redis-errors@1.2.0/node_modules/redis-errors/lib/modern.js","../../../node_modules/.pnpm/redis-errors@1.2.0/node_modules/redis-errors/index.js","../../../node_modules/.pnpm/cluster-key-slot@1.1.2/node_modules/cluster-key-slot/lib/index.js","../../../node_modules/.pnpm/lodash.defaults@4.2.0/node_modules/lodash.defaults/index.js","../../../node_modules/.pnpm/lodash.isarguments@3.1.0/node_modules/lodash.isarguments/index.js","../../../node_modules/.pnpm/ioredis@5.8.2/node_modules/ioredis/built/utils/lodash.js","../../../node_modules/.pnpm/ms@2.1.3/node_modules/ms/index.js","../../../node_modules/.pnpm/debug@4.4.3/node_modules/debug/src/common.js","../../../node_modules/.pnpm/debug@4.4.3/node_modules/debug/src/browser.js","../../../node_modules/.pnpm/has-flag@4.0.0/node_modules/has-flag/index.js","../../../node_modules/.pnpm/supports-color@8.1.1/node_modules/supports-color/index.js","../../../node_modules/.pnpm/debug@4.4.3/node_modules/debug/src/node.js","../../../node_modules/.pnpm/debug@4.4.3/node_modules/debug/src/index.js","../../../node_modules/.pnpm/ioredis@5.8.2/node_modules/ioredis/built/utils/debug.js","../../../node_modules/.pnpm/ioredis@5.8.2/node_modules/ioredis/built/constants/TLSProfiles.js","../../../node_modules/.pnpm/ioredis@5.8.2/node_modules/ioredis/built/utils/index.js","../../../node_modules/.pnpm/ioredis@5.8.2/node_modules/ioredis/built/Command.js","../../../node_modules/.pnpm/ioredis@5.8.2/node_modules/ioredis/built/errors/ClusterAllFailedError.js","../../../node_modules/.pnpm/ioredis@5.8.2/node_modules/ioredis/built/ScanStream.js","../../../node_modules/.pnpm/ioredis@5.8.2/node_modules/ioredis/built/autoPipelining.js","../../../node_modules/.pnpm/ioredis@5.8.2/node_modules/ioredis/built/Script.js","../../../node_modules/.pnpm/ioredis@5.8.2/node_modules/ioredis/built/utils/Commander.js","../../../node_modules/.pnpm/ioredis@5.8.2/node_modules/ioredis/built/Pipeline.js","../../../node_modules/.pnpm/ioredis@5.8.2/node_modules/ioredis/built/transaction.js","../../../node_modules/.pnpm/ioredis@5.8.2/node_modules/ioredis/built/utils/applyMixin.js","../../../node_modules/.pnpm/ioredis@5.8.2/node_modules/ioredis/built/cluster/ClusterOptions.js","../../../node_modules/.pnpm/ioredis@5.8.2/node_modules/ioredis/built/cluster/util.js","../../../node_modules/.pnpm/ioredis@5.8.2/node_modules/ioredis/built/cluster/ClusterSubscriber.js","../../../node_modules/.pnpm/ioredis@5.8.2/node_modules/ioredis/built/cluster/ConnectionPool.js","../../../node_modules/.pnpm/denque@2.1.0/node_modules/denque/index.js","../../../node_modules/.pnpm/ioredis@5.8.2/node_modules/ioredis/built/cluster/DelayQueue.js","../../../node_modules/.pnpm/ioredis@5.8.2/node_modules/ioredis/built/cluster/ClusterSubscriberGroup.js","../../../node_modules/.pnpm/ioredis@5.8.2/node_modules/ioredis/built/cluster/index.js","../../../node_modules/.pnpm/ioredis@5.8.2/node_modules/ioredis/built/connectors/AbstractConnector.js","../../../node_modules/.pnpm/ioredis@5.8.2/node_modules/ioredis/built/connectors/StandaloneConnector.js","../../../node_modules/.pnpm/ioredis@5.8.2/node_modules/ioredis/built/connectors/SentinelConnector/SentinelIterator.js","../../../node_modules/.pnpm/ioredis@5.8.2/node_modules/ioredis/built/connectors/SentinelConnector/FailoverDetector.js","../../../node_modules/.pnpm/ioredis@5.8.2/node_modules/ioredis/built/connectors/SentinelConnector/index.js","../../../node_modules/.pnpm/ioredis@5.8.2/node_modules/ioredis/built/connectors/index.js","../../../node_modules/.pnpm/ioredis@5.8.2/node_modules/ioredis/built/errors/MaxRetriesPerRequestError.js","../../../node_modules/.pnpm/ioredis@5.8.2/node_modules/ioredis/built/errors/index.js","../../../node_modules/.pnpm/redis-parser@3.0.0/node_modules/redis-parser/lib/parser.js","../../../node_modules/.pnpm/redis-parser@3.0.0/node_modules/redis-parser/index.js","../../../node_modules/.pnpm/ioredis@5.8.2/node_modules/ioredis/built/SubscriptionSet.js","../../../node_modules/.pnpm/ioredis@5.8.2/node_modules/ioredis/built/DataHandler.js","../../../node_modules/.pnpm/ioredis@5.8.2/node_modules/ioredis/built/redis/event_handler.js","../../../node_modules/.pnpm/ioredis@5.8.2/node_modules/ioredis/built/redis/RedisOptions.js","../../../node_modules/.pnpm/ioredis@5.8.2/node_modules/ioredis/built/Redis.js","../../../node_modules/.pnpm/ioredis@5.8.2/node_modules/ioredis/built/index.js","../src/index.ts","../src/server.ts","../modules/server/utils/server-dir.ts","../modules/server/init.ts","../modules/server/setup.ts","../modules/router/loader-pages.ts","../modules/router/constants/index.ts","../modules/router/path.ts","../modules/router/layout.ts","../modules/router/server-hook.ts","../modules/router/loader-api.ts","../modules/router/helpers/routes/index.ts","../modules/router/helpers/routes/extract-wss-route.ts","../modules/router/matcher.ts","../modules/router/manifest.ts","../modules/router/loader-routes.ts","../modules/router/route-loader.ts","../modules/router/loader-wss.ts","../modules/build/bundler/client.ts","../modules/build/config/client.ts","../modules/build/utils/index.ts","../../../node_modules/.pnpm/chokidar@4.0.3/node_modules/chokidar/esm/index.js","../../../node_modules/.pnpm/readdirp@4.1.2/node_modules/readdirp/esm/index.js","../../../node_modules/.pnpm/chokidar@4.0.3/node_modules/chokidar/esm/handler.js","../modules/dev/hot-reload-client/index.ts","../modules/dev/hot-reload-server/index.ts","../src/config.ts","../modules/security/sanitize.ts","../modules/server/middleware/rate-limit.ts","../modules/logger/index.ts","../modules/server/middleware/auto-rate-limit.ts","../modules/server/handlers/api.ts","../modules/server/handlers/pages.ts","../modules/rendering/createDocumentTree/index.ts","../modules/rendering/initialData/index.ts","../modules/rendering/routerData/index.ts","../modules/server/handlers/middleware.ts","../modules/server/handlers/server-hook.ts","../modules/server/handlers/response.ts","../modules/server/handlers/ssg.ts","../modules/server/routes.ts","../modules/server/config.ts","../modules/server/wss.ts","../modules/realtime/state/memory-store.ts","../modules/realtime/state/redis-store.ts","../modules/realtime/state/index.ts","../modules/realtime/presence/index.ts","../modules/realtime/rate-limit/token-bucket.ts","../modules/realtime/rate-limit/index.ts","../modules/realtime/auth/index.ts","../modules/realtime/guards/index.ts","../modules/realtime/validation/index.ts","../modules/realtime/logging/index.ts","../modules/server/application.ts","../modules/build/ssg/builder.ts","../modules/build/ssg/path.ts","../modules/build/ssg/renderer.ts","../modules/build/bundler/server.ts","../modules/build/index.ts","../modules/realtime/define-wss-route.ts","../modules/runtime/client/bootstrap.tsx","../modules/runtime/client/constants.ts","../modules/runtime/client/window-data.ts","../modules/runtime/client/route-matcher.ts","../modules/runtime/client/metadata.ts","../modules/runtime/client/AppShell.tsx","../modules/runtime/client/RouterView.tsx","../modules/react/cache/client-data-cache/index.ts","../modules/runtime/client/navigation.ts","../modules/runtime/client/RouterContext.tsx","../modules/runtime/client/hot-reload.ts","../modules/cache/index.ts","../modules/validation/index.ts"],"sourcesContent":["export const BUILD_FOLDER_NAME = '.loly';\r\nexport const STYLE_FILE_NAME = 'styles.css';\r\n\r\n// Framework runtime constants\r\nexport const WINDOW_DATA_KEY = '__FW_DATA__';\r\nexport const ROUTER_DATA_KEY = '__LOLY_ROUTER_DATA__';\r\nexport const APP_CONTAINER_ID = '__app';\r\nexport const STATIC_PATH = '/static';\r\nexport const NOT_FOUND_PATTERN = '/not-found';\r\nexport const ERROR_PATTERN = '/error';\r\nexport const NOT_FOUND_CHUNK_KEY = '__fw_not_found__';\r\nexport const ERROR_CHUNK_KEY = '__fw_error__';\r\n\r\n// Special page file names\r\nexport const NOT_FOUND_FILE_PREFIX = '_not-found';\r\nexport const ERROR_FILE_PREFIX = '_error';\r\nexport const PAGE_FILE_NAME = 'page';\r\nexport const LAYOUT_FILE_NAME = 'layout';\r\n\r\n// Static asset paths\r\nexport const FAVICON_PATH = '/static/favicon.png';\r\nexport const CLIENT_CSS_PATH = '/static/client.css';\r\nexport const CLIENT_JS_PATH = '/static/client.js';\r\nexport const ASSETS_BASE_DIR = '/static/assets';","{\n \"acl\": {\n \"arity\": -2,\n \"flags\": [],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"append\": {\n \"arity\": 3,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"asking\": {\n \"arity\": 1,\n \"flags\": [\n \"fast\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"auth\": {\n \"arity\": -2,\n \"flags\": [\n \"noscript\",\n \"loading\",\n \"stale\",\n \"fast\",\n \"no_auth\",\n \"allow_busy\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"bgrewriteaof\": {\n \"arity\": 1,\n \"flags\": [\n \"admin\",\n \"noscript\",\n \"no_async_loading\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"bgsave\": {\n \"arity\": -1,\n \"flags\": [\n \"admin\",\n \"noscript\",\n \"no_async_loading\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"bitcount\": {\n \"arity\": -2,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"bitfield\": {\n \"arity\": -2,\n \"flags\": [\n \"write\",\n \"denyoom\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"bitfield_ro\": {\n \"arity\": -2,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"bitop\": {\n \"arity\": -4,\n \"flags\": [\n \"write\",\n \"denyoom\"\n ],\n \"keyStart\": 2,\n \"keyStop\": -1,\n \"step\": 1\n },\n \"bitpos\": {\n \"arity\": -3,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"blmove\": {\n \"arity\": 6,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"noscript\",\n \"blocking\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 2,\n \"step\": 1\n },\n \"blmpop\": {\n \"arity\": -5,\n \"flags\": [\n \"write\",\n \"blocking\",\n \"movablekeys\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"blpop\": {\n \"arity\": -3,\n \"flags\": [\n \"write\",\n \"noscript\",\n \"blocking\"\n ],\n \"keyStart\": 1,\n \"keyStop\": -2,\n \"step\": 1\n },\n \"brpop\": {\n \"arity\": -3,\n \"flags\": [\n \"write\",\n \"noscript\",\n \"blocking\"\n ],\n \"keyStart\": 1,\n \"keyStop\": -2,\n \"step\": 1\n },\n \"brpoplpush\": {\n \"arity\": 4,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"noscript\",\n \"blocking\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 2,\n \"step\": 1\n },\n \"bzmpop\": {\n \"arity\": -5,\n \"flags\": [\n \"write\",\n \"blocking\",\n \"movablekeys\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"bzpopmax\": {\n \"arity\": -3,\n \"flags\": [\n \"write\",\n \"noscript\",\n \"blocking\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": -2,\n \"step\": 1\n },\n \"bzpopmin\": {\n \"arity\": -3,\n \"flags\": [\n \"write\",\n \"noscript\",\n \"blocking\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": -2,\n \"step\": 1\n },\n \"client\": {\n \"arity\": -2,\n \"flags\": [],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"cluster\": {\n \"arity\": -2,\n \"flags\": [],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"command\": {\n \"arity\": -1,\n \"flags\": [\n \"loading\",\n \"stale\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"config\": {\n \"arity\": -2,\n \"flags\": [],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"copy\": {\n \"arity\": -3,\n \"flags\": [\n \"write\",\n \"denyoom\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 2,\n \"step\": 1\n },\n \"dbsize\": {\n \"arity\": 1,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"debug\": {\n \"arity\": -2,\n \"flags\": [\n \"admin\",\n \"noscript\",\n \"loading\",\n \"stale\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"decr\": {\n \"arity\": 2,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"decrby\": {\n \"arity\": 3,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"del\": {\n \"arity\": -2,\n \"flags\": [\n \"write\"\n ],\n \"keyStart\": 1,\n \"keyStop\": -1,\n \"step\": 1\n },\n \"discard\": {\n \"arity\": 1,\n \"flags\": [\n \"noscript\",\n \"loading\",\n \"stale\",\n \"fast\",\n \"allow_busy\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"dump\": {\n \"arity\": 2,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"echo\": {\n \"arity\": 2,\n \"flags\": [\n \"fast\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"eval\": {\n \"arity\": -3,\n \"flags\": [\n \"noscript\",\n \"stale\",\n \"skip_monitor\",\n \"no_mandatory_keys\",\n \"movablekeys\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"eval_ro\": {\n \"arity\": -3,\n \"flags\": [\n \"readonly\",\n \"noscript\",\n \"stale\",\n \"skip_monitor\",\n \"no_mandatory_keys\",\n \"movablekeys\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"evalsha\": {\n \"arity\": -3,\n \"flags\": [\n \"noscript\",\n \"stale\",\n \"skip_monitor\",\n \"no_mandatory_keys\",\n \"movablekeys\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"evalsha_ro\": {\n \"arity\": -3,\n \"flags\": [\n \"readonly\",\n \"noscript\",\n \"stale\",\n \"skip_monitor\",\n \"no_mandatory_keys\",\n \"movablekeys\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"exec\": {\n \"arity\": 1,\n \"flags\": [\n \"noscript\",\n \"loading\",\n \"stale\",\n \"skip_slowlog\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"exists\": {\n \"arity\": -2,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": -1,\n \"step\": 1\n },\n \"expire\": {\n \"arity\": -3,\n \"flags\": [\n \"write\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"expireat\": {\n \"arity\": -3,\n \"flags\": [\n \"write\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"expiretime\": {\n \"arity\": 2,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"failover\": {\n \"arity\": -1,\n \"flags\": [\n \"admin\",\n \"noscript\",\n \"stale\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"fcall\": {\n \"arity\": -3,\n \"flags\": [\n \"noscript\",\n \"stale\",\n \"skip_monitor\",\n \"no_mandatory_keys\",\n \"movablekeys\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"fcall_ro\": {\n \"arity\": -3,\n \"flags\": [\n \"readonly\",\n \"noscript\",\n \"stale\",\n \"skip_monitor\",\n \"no_mandatory_keys\",\n \"movablekeys\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"flushall\": {\n \"arity\": -1,\n \"flags\": [\n \"write\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"flushdb\": {\n \"arity\": -1,\n \"flags\": [\n \"write\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"function\": {\n \"arity\": -2,\n \"flags\": [],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"geoadd\": {\n \"arity\": -5,\n \"flags\": [\n \"write\",\n \"denyoom\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"geodist\": {\n \"arity\": -4,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"geohash\": {\n \"arity\": -2,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"geopos\": {\n \"arity\": -2,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"georadius\": {\n \"arity\": -6,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"movablekeys\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"georadius_ro\": {\n \"arity\": -6,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"georadiusbymember\": {\n \"arity\": -5,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"movablekeys\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"georadiusbymember_ro\": {\n \"arity\": -5,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"geosearch\": {\n \"arity\": -7,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"geosearchstore\": {\n \"arity\": -8,\n \"flags\": [\n \"write\",\n \"denyoom\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 2,\n \"step\": 1\n },\n \"get\": {\n \"arity\": 2,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"getbit\": {\n \"arity\": 3,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"getdel\": {\n \"arity\": 2,\n \"flags\": [\n \"write\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"getex\": {\n \"arity\": -2,\n \"flags\": [\n \"write\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"getrange\": {\n \"arity\": 4,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"getset\": {\n \"arity\": 3,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"hdel\": {\n \"arity\": -3,\n \"flags\": [\n \"write\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"hello\": {\n \"arity\": -1,\n \"flags\": [\n \"noscript\",\n \"loading\",\n \"stale\",\n \"fast\",\n \"no_auth\",\n \"allow_busy\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"hexists\": {\n \"arity\": 3,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"hexpire\": {\n \"arity\": -6,\n \"flags\": [\n \"write\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"hpexpire\": {\n \"arity\": -6,\n \"flags\": [\n \"write\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"hget\": {\n \"arity\": 3,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"hgetall\": {\n \"arity\": 2,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"hincrby\": {\n \"arity\": 4,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"hincrbyfloat\": {\n \"arity\": 4,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"hkeys\": {\n \"arity\": 2,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"hlen\": {\n \"arity\": 2,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"hmget\": {\n \"arity\": -3,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"hmset\": {\n \"arity\": -4,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"hrandfield\": {\n \"arity\": -2,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"hscan\": {\n \"arity\": -3,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"hset\": {\n \"arity\": -4,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"hsetnx\": {\n \"arity\": 4,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"hstrlen\": {\n \"arity\": 3,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"hvals\": {\n \"arity\": 2,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"incr\": {\n \"arity\": 2,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"incrby\": {\n \"arity\": 3,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"incrbyfloat\": {\n \"arity\": 3,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"info\": {\n \"arity\": -1,\n \"flags\": [\n \"loading\",\n \"stale\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"keys\": {\n \"arity\": 2,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"lastsave\": {\n \"arity\": 1,\n \"flags\": [\n \"loading\",\n \"stale\",\n \"fast\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"latency\": {\n \"arity\": -2,\n \"flags\": [],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"lcs\": {\n \"arity\": -3,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 2,\n \"step\": 1\n },\n \"lindex\": {\n \"arity\": 3,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"linsert\": {\n \"arity\": 5,\n \"flags\": [\n \"write\",\n \"denyoom\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"llen\": {\n \"arity\": 2,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"lmove\": {\n \"arity\": 5,\n \"flags\": [\n \"write\",\n \"denyoom\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 2,\n \"step\": 1\n },\n \"lmpop\": {\n \"arity\": -4,\n \"flags\": [\n \"write\",\n \"movablekeys\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"lolwut\": {\n \"arity\": -1,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"lpop\": {\n \"arity\": -2,\n \"flags\": [\n \"write\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"lpos\": {\n \"arity\": -3,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"lpush\": {\n \"arity\": -3,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"lpushx\": {\n \"arity\": -3,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"lrange\": {\n \"arity\": 4,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"lrem\": {\n \"arity\": 4,\n \"flags\": [\n \"write\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"lset\": {\n \"arity\": 4,\n \"flags\": [\n \"write\",\n \"denyoom\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"ltrim\": {\n \"arity\": 4,\n \"flags\": [\n \"write\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"memory\": {\n \"arity\": -2,\n \"flags\": [],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"mget\": {\n \"arity\": -2,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": -1,\n \"step\": 1\n },\n \"migrate\": {\n \"arity\": -6,\n \"flags\": [\n \"write\",\n \"movablekeys\"\n ],\n \"keyStart\": 3,\n \"keyStop\": 3,\n \"step\": 1\n },\n \"module\": {\n \"arity\": -2,\n \"flags\": [],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"monitor\": {\n \"arity\": 1,\n \"flags\": [\n \"admin\",\n \"noscript\",\n \"loading\",\n \"stale\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"move\": {\n \"arity\": 3,\n \"flags\": [\n \"write\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"mset\": {\n \"arity\": -3,\n \"flags\": [\n \"write\",\n \"denyoom\"\n ],\n \"keyStart\": 1,\n \"keyStop\": -1,\n \"step\": 2\n },\n \"msetnx\": {\n \"arity\": -3,\n \"flags\": [\n \"write\",\n \"denyoom\"\n ],\n \"keyStart\": 1,\n \"keyStop\": -1,\n \"step\": 2\n },\n \"multi\": {\n \"arity\": 1,\n \"flags\": [\n \"noscript\",\n \"loading\",\n \"stale\",\n \"fast\",\n \"allow_busy\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"object\": {\n \"arity\": -2,\n \"flags\": [],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"persist\": {\n \"arity\": 2,\n \"flags\": [\n \"write\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"pexpire\": {\n \"arity\": -3,\n \"flags\": [\n \"write\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"pexpireat\": {\n \"arity\": -3,\n \"flags\": [\n \"write\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"pexpiretime\": {\n \"arity\": 2,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"pfadd\": {\n \"arity\": -2,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"pfcount\": {\n \"arity\": -2,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": -1,\n \"step\": 1\n },\n \"pfdebug\": {\n \"arity\": 3,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"admin\"\n ],\n \"keyStart\": 2,\n \"keyStop\": 2,\n \"step\": 1\n },\n \"pfmerge\": {\n \"arity\": -2,\n \"flags\": [\n \"write\",\n \"denyoom\"\n ],\n \"keyStart\": 1,\n \"keyStop\": -1,\n \"step\": 1\n },\n \"pfselftest\": {\n \"arity\": 1,\n \"flags\": [\n \"admin\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"ping\": {\n \"arity\": -1,\n \"flags\": [\n \"fast\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"psetex\": {\n \"arity\": 4,\n \"flags\": [\n \"write\",\n \"denyoom\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"psubscribe\": {\n \"arity\": -2,\n \"flags\": [\n \"pubsub\",\n \"noscript\",\n \"loading\",\n \"stale\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"psync\": {\n \"arity\": -3,\n \"flags\": [\n \"admin\",\n \"noscript\",\n \"no_async_loading\",\n \"no_multi\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"pttl\": {\n \"arity\": 2,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"publish\": {\n \"arity\": 3,\n \"flags\": [\n \"pubsub\",\n \"loading\",\n \"stale\",\n \"fast\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"pubsub\": {\n \"arity\": -2,\n \"flags\": [],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"punsubscribe\": {\n \"arity\": -1,\n \"flags\": [\n \"pubsub\",\n \"noscript\",\n \"loading\",\n \"stale\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"quit\": {\n \"arity\": -1,\n \"flags\": [\n \"noscript\",\n \"loading\",\n \"stale\",\n \"fast\",\n \"no_auth\",\n \"allow_busy\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"randomkey\": {\n \"arity\": 1,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"readonly\": {\n \"arity\": 1,\n \"flags\": [\n \"loading\",\n \"stale\",\n \"fast\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"readwrite\": {\n \"arity\": 1,\n \"flags\": [\n \"loading\",\n \"stale\",\n \"fast\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"rename\": {\n \"arity\": 3,\n \"flags\": [\n \"write\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 2,\n \"step\": 1\n },\n \"renamenx\": {\n \"arity\": 3,\n \"flags\": [\n \"write\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 2,\n \"step\": 1\n },\n \"replconf\": {\n \"arity\": -1,\n \"flags\": [\n \"admin\",\n \"noscript\",\n \"loading\",\n \"stale\",\n \"allow_busy\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"replicaof\": {\n \"arity\": 3,\n \"flags\": [\n \"admin\",\n \"noscript\",\n \"stale\",\n \"no_async_loading\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"reset\": {\n \"arity\": 1,\n \"flags\": [\n \"noscript\",\n \"loading\",\n \"stale\",\n \"fast\",\n \"no_auth\",\n \"allow_busy\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"restore\": {\n \"arity\": -4,\n \"flags\": [\n \"write\",\n \"denyoom\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"restore-asking\": {\n \"arity\": -4,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"asking\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"role\": {\n \"arity\": 1,\n \"flags\": [\n \"noscript\",\n \"loading\",\n \"stale\",\n \"fast\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"rpop\": {\n \"arity\": -2,\n \"flags\": [\n \"write\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"rpoplpush\": {\n \"arity\": 3,\n \"flags\": [\n \"write\",\n \"denyoom\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 2,\n \"step\": 1\n },\n \"rpush\": {\n \"arity\": -3,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"rpushx\": {\n \"arity\": -3,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"sadd\": {\n \"arity\": -3,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"save\": {\n \"arity\": 1,\n \"flags\": [\n \"admin\",\n \"noscript\",\n \"no_async_loading\",\n \"no_multi\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"scan\": {\n \"arity\": -2,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"scard\": {\n \"arity\": 2,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"script\": {\n \"arity\": -2,\n \"flags\": [],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"sdiff\": {\n \"arity\": -2,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": -1,\n \"step\": 1\n },\n \"sdiffstore\": {\n \"arity\": -3,\n \"flags\": [\n \"write\",\n \"denyoom\"\n ],\n \"keyStart\": 1,\n \"keyStop\": -1,\n \"step\": 1\n },\n \"select\": {\n \"arity\": 2,\n \"flags\": [\n \"loading\",\n \"stale\",\n \"fast\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"set\": {\n \"arity\": -3,\n \"flags\": [\n \"write\",\n \"denyoom\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"setbit\": {\n \"arity\": 4,\n \"flags\": [\n \"write\",\n \"denyoom\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"setex\": {\n \"arity\": 4,\n \"flags\": [\n \"write\",\n \"denyoom\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"setnx\": {\n \"arity\": 3,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"setrange\": {\n \"arity\": 4,\n \"flags\": [\n \"write\",\n \"denyoom\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"shutdown\": {\n \"arity\": -1,\n \"flags\": [\n \"admin\",\n \"noscript\",\n \"loading\",\n \"stale\",\n \"no_multi\",\n \"allow_busy\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"sinter\": {\n \"arity\": -2,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": -1,\n \"step\": 1\n },\n \"sintercard\": {\n \"arity\": -3,\n \"flags\": [\n \"readonly\",\n \"movablekeys\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"sinterstore\": {\n \"arity\": -3,\n \"flags\": [\n \"write\",\n \"denyoom\"\n ],\n \"keyStart\": 1,\n \"keyStop\": -1,\n \"step\": 1\n },\n \"sismember\": {\n \"arity\": 3,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"slaveof\": {\n \"arity\": 3,\n \"flags\": [\n \"admin\",\n \"noscript\",\n \"stale\",\n \"no_async_loading\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"slowlog\": {\n \"arity\": -2,\n \"flags\": [],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"smembers\": {\n \"arity\": 2,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"smismember\": {\n \"arity\": -3,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"smove\": {\n \"arity\": 4,\n \"flags\": [\n \"write\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 2,\n \"step\": 1\n },\n \"sort\": {\n \"arity\": -2,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"movablekeys\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"sort_ro\": {\n \"arity\": -2,\n \"flags\": [\n \"readonly\",\n \"movablekeys\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"spop\": {\n \"arity\": -2,\n \"flags\": [\n \"write\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"spublish\": {\n \"arity\": 3,\n \"flags\": [\n \"pubsub\",\n \"loading\",\n \"stale\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"srandmember\": {\n \"arity\": -2,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"srem\": {\n \"arity\": -3,\n \"flags\": [\n \"write\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"sscan\": {\n \"arity\": -3,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"ssubscribe\": {\n \"arity\": -2,\n \"flags\": [\n \"pubsub\",\n \"noscript\",\n \"loading\",\n \"stale\"\n ],\n \"keyStart\": 1,\n \"keyStop\": -1,\n \"step\": 1\n },\n \"strlen\": {\n \"arity\": 2,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"subscribe\": {\n \"arity\": -2,\n \"flags\": [\n \"pubsub\",\n \"noscript\",\n \"loading\",\n \"stale\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"substr\": {\n \"arity\": 4,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"sunion\": {\n \"arity\": -2,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": -1,\n \"step\": 1\n },\n \"sunionstore\": {\n \"arity\": -3,\n \"flags\": [\n \"write\",\n \"denyoom\"\n ],\n \"keyStart\": 1,\n \"keyStop\": -1,\n \"step\": 1\n },\n \"sunsubscribe\": {\n \"arity\": -1,\n \"flags\": [\n \"pubsub\",\n \"noscript\",\n \"loading\",\n \"stale\"\n ],\n \"keyStart\": 1,\n \"keyStop\": -1,\n \"step\": 1\n },\n \"swapdb\": {\n \"arity\": 3,\n \"flags\": [\n \"write\",\n \"fast\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"sync\": {\n \"arity\": 1,\n \"flags\": [\n \"admin\",\n \"noscript\",\n \"no_async_loading\",\n \"no_multi\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"time\": {\n \"arity\": 1,\n \"flags\": [\n \"loading\",\n \"stale\",\n \"fast\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"touch\": {\n \"arity\": -2,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": -1,\n \"step\": 1\n },\n \"ttl\": {\n \"arity\": 2,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"type\": {\n \"arity\": 2,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"unlink\": {\n \"arity\": -2,\n \"flags\": [\n \"write\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": -1,\n \"step\": 1\n },\n \"unsubscribe\": {\n \"arity\": -1,\n \"flags\": [\n \"pubsub\",\n \"noscript\",\n \"loading\",\n \"stale\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"unwatch\": {\n \"arity\": 1,\n \"flags\": [\n \"noscript\",\n \"loading\",\n \"stale\",\n \"fast\",\n \"allow_busy\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"wait\": {\n \"arity\": 3,\n \"flags\": [\n \"noscript\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"watch\": {\n \"arity\": -2,\n \"flags\": [\n \"noscript\",\n \"loading\",\n \"stale\",\n \"fast\",\n \"allow_busy\"\n ],\n \"keyStart\": 1,\n \"keyStop\": -1,\n \"step\": 1\n },\n \"xack\": {\n \"arity\": -4,\n \"flags\": [\n \"write\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"xadd\": {\n \"arity\": -5,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"xautoclaim\": {\n \"arity\": -6,\n \"flags\": [\n \"write\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"xclaim\": {\n \"arity\": -6,\n \"flags\": [\n \"write\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"xdel\": {\n \"arity\": -3,\n \"flags\": [\n \"write\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"xdelex\": {\n \"arity\": -5,\n \"flags\": [\n \"write\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"xgroup\": {\n \"arity\": -2,\n \"flags\": [],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"xinfo\": {\n \"arity\": -2,\n \"flags\": [],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"xlen\": {\n \"arity\": 2,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"xpending\": {\n \"arity\": -3,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"xrange\": {\n \"arity\": -4,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"xread\": {\n \"arity\": -4,\n \"flags\": [\n \"readonly\",\n \"blocking\",\n \"movablekeys\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"xreadgroup\": {\n \"arity\": -7,\n \"flags\": [\n \"write\",\n \"blocking\",\n \"movablekeys\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"xrevrange\": {\n \"arity\": -4,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"xsetid\": {\n \"arity\": -3,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"xtrim\": {\n \"arity\": -4,\n \"flags\": [\n \"write\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"zadd\": {\n \"arity\": -4,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"zcard\": {\n \"arity\": 2,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"zcount\": {\n \"arity\": 4,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"zdiff\": {\n \"arity\": -3,\n \"flags\": [\n \"readonly\",\n \"movablekeys\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"zdiffstore\": {\n \"arity\": -4,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"movablekeys\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"zincrby\": {\n \"arity\": 4,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"zinter\": {\n \"arity\": -3,\n \"flags\": [\n \"readonly\",\n \"movablekeys\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"zintercard\": {\n \"arity\": -3,\n \"flags\": [\n \"readonly\",\n \"movablekeys\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"zinterstore\": {\n \"arity\": -4,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"movablekeys\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"zlexcount\": {\n \"arity\": 4,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"zmpop\": {\n \"arity\": -4,\n \"flags\": [\n \"write\",\n \"movablekeys\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"zmscore\": {\n \"arity\": -3,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"zpopmax\": {\n \"arity\": -2,\n \"flags\": [\n \"write\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"zpopmin\": {\n \"arity\": -2,\n \"flags\": [\n \"write\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"zrandmember\": {\n \"arity\": -2,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"zrange\": {\n \"arity\": -4,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"zrangebylex\": {\n \"arity\": -4,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"zrangebyscore\": {\n \"arity\": -4,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"zrangestore\": {\n \"arity\": -5,\n \"flags\": [\n \"write\",\n \"denyoom\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 2,\n \"step\": 1\n },\n \"zrank\": {\n \"arity\": 3,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"zrem\": {\n \"arity\": -3,\n \"flags\": [\n \"write\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"zremrangebylex\": {\n \"arity\": 4,\n \"flags\": [\n \"write\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"zremrangebyrank\": {\n \"arity\": 4,\n \"flags\": [\n \"write\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"zremrangebyscore\": {\n \"arity\": 4,\n \"flags\": [\n \"write\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"zrevrange\": {\n \"arity\": -4,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"zrevrangebylex\": {\n \"arity\": -4,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"zrevrangebyscore\": {\n \"arity\": -4,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"zrevrank\": {\n \"arity\": 3,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"zscan\": {\n \"arity\": -3,\n \"flags\": [\n \"readonly\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"zscore\": {\n \"arity\": 3,\n \"flags\": [\n \"readonly\",\n \"fast\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n },\n \"zunion\": {\n \"arity\": -3,\n \"flags\": [\n \"readonly\",\n \"movablekeys\"\n ],\n \"keyStart\": 0,\n \"keyStop\": 0,\n \"step\": 0\n },\n \"zunionstore\": {\n \"arity\": -4,\n \"flags\": [\n \"write\",\n \"denyoom\",\n \"movablekeys\"\n ],\n \"keyStart\": 1,\n \"keyStop\": 1,\n \"step\": 1\n }\n}\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getKeyIndexes = exports.hasFlag = exports.exists = exports.list = void 0;\nconst commands_json_1 = __importDefault(require(\"./commands.json\"));\n/**\n * Redis command list\n *\n * All commands are lowercased.\n */\nexports.list = Object.keys(commands_json_1.default);\nconst flags = {};\nexports.list.forEach((commandName) => {\n flags[commandName] = commands_json_1.default[commandName].flags.reduce(function (flags, flag) {\n flags[flag] = true;\n return flags;\n }, {});\n});\n/**\n * Check if the command exists\n */\nfunction exists(commandName) {\n return Boolean(commands_json_1.default[commandName]);\n}\nexports.exists = exists;\n/**\n * Check if the command has the flag\n *\n * Some of possible flags: readonly, noscript, loading\n */\nfunction hasFlag(commandName, flag) {\n if (!flags[commandName]) {\n throw new Error(\"Unknown command \" + commandName);\n }\n return Boolean(flags[commandName][flag]);\n}\nexports.hasFlag = hasFlag;\n/**\n * Get indexes of keys in the command arguments\n *\n * @example\n * ```javascript\n * getKeyIndexes('set', ['key', 'value']) // [0]\n * getKeyIndexes('mget', ['key1', 'key2']) // [0, 1]\n * ```\n */\nfunction getKeyIndexes(commandName, args, options) {\n const command = commands_json_1.default[commandName];\n if (!command) {\n throw new Error(\"Unknown command \" + commandName);\n }\n if (!Array.isArray(args)) {\n throw new Error(\"Expect args to be an array\");\n }\n const keys = [];\n const parseExternalKey = Boolean(options && options.parseExternalKey);\n const takeDynamicKeys = (args, startIndex) => {\n const keys = [];\n const keyStop = Number(args[startIndex]);\n for (let i = 0; i < keyStop; i++) {\n keys.push(i + startIndex + 1);\n }\n return keys;\n };\n const takeKeyAfterToken = (args, startIndex, token) => {\n for (let i = startIndex; i < args.length - 1; i += 1) {\n if (String(args[i]).toLowerCase() === token.toLowerCase()) {\n return i + 1;\n }\n }\n return null;\n };\n switch (commandName) {\n case \"zunionstore\":\n case \"zinterstore\":\n case \"zdiffstore\":\n keys.push(0, ...takeDynamicKeys(args, 1));\n break;\n case \"eval\":\n case \"evalsha\":\n case \"eval_ro\":\n case \"evalsha_ro\":\n case \"fcall\":\n case \"fcall_ro\":\n case \"blmpop\":\n case \"bzmpop\":\n keys.push(...takeDynamicKeys(args, 1));\n break;\n case \"sintercard\":\n case \"lmpop\":\n case \"zunion\":\n case \"zinter\":\n case \"zmpop\":\n case \"zintercard\":\n case \"zdiff\": {\n keys.push(...takeDynamicKeys(args, 0));\n break;\n }\n case \"georadius\": {\n keys.push(0);\n const storeKey = takeKeyAfterToken(args, 5, \"STORE\");\n if (storeKey)\n keys.push(storeKey);\n const distKey = takeKeyAfterToken(args, 5, \"STOREDIST\");\n if (distKey)\n keys.push(distKey);\n break;\n }\n case \"georadiusbymember\": {\n keys.push(0);\n const storeKey = takeKeyAfterToken(args, 4, \"STORE\");\n if (storeKey)\n keys.push(storeKey);\n const distKey = takeKeyAfterToken(args, 4, \"STOREDIST\");\n if (distKey)\n keys.push(distKey);\n break;\n }\n case \"sort\":\n case \"sort_ro\":\n keys.push(0);\n for (let i = 1; i < args.length - 1; i++) {\n let arg = args[i];\n if (typeof arg !== \"string\") {\n continue;\n }\n const directive = arg.toUpperCase();\n if (directive === \"GET\") {\n i += 1;\n arg = args[i];\n if (arg !== \"#\") {\n if (parseExternalKey) {\n keys.push([i, getExternalKeyNameLength(arg)]);\n }\n else {\n keys.push(i);\n }\n }\n }\n else if (directive === \"BY\") {\n i += 1;\n if (parseExternalKey) {\n keys.push([i, getExternalKeyNameLength(args[i])]);\n }\n else {\n keys.push(i);\n }\n }\n else if (directive === \"STORE\") {\n i += 1;\n keys.push(i);\n }\n }\n break;\n case \"migrate\":\n if (args[2] === \"\") {\n for (let i = 5; i < args.length - 1; i++) {\n const arg = args[i];\n if (typeof arg === \"string\" && arg.toUpperCase() === \"KEYS\") {\n for (let j = i + 1; j < args.length; j++) {\n keys.push(j);\n }\n break;\n }\n }\n }\n else {\n keys.push(2);\n }\n break;\n case \"xreadgroup\":\n case \"xread\":\n // Keys are 1st half of the args after STREAMS argument.\n for (let i = commandName === \"xread\" ? 0 : 3; i < args.length - 1; i++) {\n if (String(args[i]).toUpperCase() === \"STREAMS\") {\n for (let j = i + 1; j <= i + (args.length - 1 - i) / 2; j++) {\n keys.push(j);\n }\n break;\n }\n }\n break;\n default:\n // Step has to be at least one in this case, otherwise the command does\n // not contain a key.\n if (command.step > 0) {\n const keyStart = command.keyStart - 1;\n const keyStop = command.keyStop > 0\n ? command.keyStop\n : args.length + command.keyStop + 1;\n for (let i = keyStart; i < keyStop; i += command.step) {\n keys.push(i);\n }\n }\n break;\n }\n return keys;\n}\nexports.getKeyIndexes = getKeyIndexes;\nfunction getExternalKeyNameLength(key) {\n if (typeof key !== \"string\") {\n key = String(key);\n }\n const hashPos = key.indexOf(\"->\");\n return hashPos === -1 ? key.length : hashPos;\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.tryCatch = exports.errorObj = void 0;\n//Try catch is not supported in optimizing\n//compiler, so it is isolated\nexports.errorObj = { e: {} };\nlet tryCatchTarget;\nfunction tryCatcher(err, val) {\n try {\n const target = tryCatchTarget;\n tryCatchTarget = null;\n return target.apply(this, arguments);\n }\n catch (e) {\n exports.errorObj.e = e;\n return exports.errorObj;\n }\n}\nfunction tryCatch(fn) {\n tryCatchTarget = fn;\n return tryCatcher;\n}\nexports.tryCatch = tryCatch;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst utils_1 = require(\"./utils\");\nfunction throwLater(e) {\n setTimeout(function () {\n throw e;\n }, 0);\n}\nfunction asCallback(promise, nodeback, options) {\n if (typeof nodeback === \"function\") {\n promise.then((val) => {\n let ret;\n if (options !== undefined &&\n Object(options).spread &&\n Array.isArray(val)) {\n ret = utils_1.tryCatch(nodeback).apply(undefined, [null].concat(val));\n }\n else {\n ret =\n val === undefined\n ? utils_1.tryCatch(nodeback)(null)\n : utils_1.tryCatch(nodeback)(null, val);\n }\n if (ret === utils_1.errorObj) {\n throwLater(ret.e);\n }\n }, (cause) => {\n if (!cause) {\n const newReason = new Error(cause + \"\");\n Object.assign(newReason, { cause });\n cause = newReason;\n }\n const ret = utils_1.tryCatch(nodeback)(cause);\n if (ret === utils_1.errorObj) {\n throwLater(ret.e);\n }\n });\n }\n return promise;\n}\nexports.default = asCallback;\n","'use strict'\n\nconst assert = require('assert')\nconst util = require('util')\n\n// RedisError\n\nfunction RedisError (message) {\n Object.defineProperty(this, 'message', {\n value: message || '',\n configurable: true,\n writable: true\n })\n Error.captureStackTrace(this, this.constructor)\n}\n\nutil.inherits(RedisError, Error)\n\nObject.defineProperty(RedisError.prototype, 'name', {\n value: 'RedisError',\n configurable: true,\n writable: true\n})\n\n// ParserError\n\nfunction ParserError (message, buffer, offset) {\n assert(buffer)\n assert.strictEqual(typeof offset, 'number')\n\n Object.defineProperty(this, 'message', {\n value: message || '',\n configurable: true,\n writable: true\n })\n\n const tmp = Error.stackTraceLimit\n Error.stackTraceLimit = 2\n Error.captureStackTrace(this, this.constructor)\n Error.stackTraceLimit = tmp\n this.offset = offset\n this.buffer = buffer\n}\n\nutil.inherits(ParserError, RedisError)\n\nObject.defineProperty(ParserError.prototype, 'name', {\n value: 'ParserError',\n configurable: true,\n writable: true\n})\n\n// ReplyError\n\nfunction ReplyError (message) {\n Object.defineProperty(this, 'message', {\n value: message || '',\n configurable: true,\n writable: true\n })\n const tmp = Error.stackTraceLimit\n Error.stackTraceLimit = 2\n Error.captureStackTrace(this, this.constructor)\n Error.stackTraceLimit = tmp\n}\n\nutil.inherits(ReplyError, RedisError)\n\nObject.defineProperty(ReplyError.prototype, 'name', {\n value: 'ReplyError',\n configurable: true,\n writable: true\n})\n\n// AbortError\n\nfunction AbortError (message) {\n Object.defineProperty(this, 'message', {\n value: message || '',\n configurable: true,\n writable: true\n })\n Error.captureStackTrace(this, this.constructor)\n}\n\nutil.inherits(AbortError, RedisError)\n\nObject.defineProperty(AbortError.prototype, 'name', {\n value: 'AbortError',\n configurable: true,\n writable: true\n})\n\n// InterruptError\n\nfunction InterruptError (message) {\n Object.defineProperty(this, 'message', {\n value: message || '',\n configurable: true,\n writable: true\n })\n Error.captureStackTrace(this, this.constructor)\n}\n\nutil.inherits(InterruptError, AbortError)\n\nObject.defineProperty(InterruptError.prototype, 'name', {\n value: 'InterruptError',\n configurable: true,\n writable: true\n})\n\nmodule.exports = {\n RedisError,\n ParserError,\n ReplyError,\n AbortError,\n InterruptError\n}\n","'use strict'\n\nconst assert = require('assert')\n\nclass RedisError extends Error {\n get name () {\n return this.constructor.name\n }\n}\n\nclass ParserError extends RedisError {\n constructor (message, buffer, offset) {\n assert(buffer)\n assert.strictEqual(typeof offset, 'number')\n\n const tmp = Error.stackTraceLimit\n Error.stackTraceLimit = 2\n super(message)\n Error.stackTraceLimit = tmp\n this.offset = offset\n this.buffer = buffer\n }\n\n get name () {\n return this.constructor.name\n }\n}\n\nclass ReplyError extends RedisError {\n constructor (message) {\n const tmp = Error.stackTraceLimit\n Error.stackTraceLimit = 2\n super(message)\n Error.stackTraceLimit = tmp\n }\n get name () {\n return this.constructor.name\n }\n}\n\nclass AbortError extends RedisError {\n get name () {\n return this.constructor.name\n }\n}\n\nclass InterruptError extends AbortError {\n get name () {\n return this.constructor.name\n }\n}\n\nmodule.exports = {\n RedisError,\n ParserError,\n ReplyError,\n AbortError,\n InterruptError\n}\n","'use strict'\n\nconst Errors = process.version.charCodeAt(1) < 55 && process.version.charCodeAt(2) === 46\n ? require('./lib/old') // Node.js < 7\n : require('./lib/modern')\n\nmodule.exports = Errors\n","/*\n * Copyright 2001-2010 Georges Menie (www.menie.org)\n * Copyright 2010 Salvatore Sanfilippo (adapted to Redis coding style)\n * Copyright 2015 Zihua Li (http://zihua.li) (ported to JavaScript)\n * Copyright 2016 Mike Diarmid (http://github.com/salakar) (re-write for performance, ~700% perf inc)\n * All rights reserved.\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * * Redistributions of source code must retain the above copyright\n * notice, this list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * * Neither the name of the University of California, Berkeley nor the\n * names of its contributors may be used to endorse or promote products\n * derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n/* CRC16 implementation according to CCITT standards.\n *\n * Note by @antirez: this is actually the XMODEM CRC 16 algorithm, using the\n * following parameters:\n *\n * Name : \"XMODEM\", also known as \"ZMODEM\", \"CRC-16/ACORN\"\n * Width : 16 bit\n * Poly : 1021 (That is actually x^16 + x^12 + x^5 + 1)\n * Initialization : 0000\n * Reflect Input byte : False\n * Reflect Output CRC : False\n * Xor constant to output CRC : 0000\n * Output for \"123456789\" : 31C3\n */\n\nvar lookup = [\n 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,\n 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,\n 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\n 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,\n 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,\n 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\n 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,\n 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,\n 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\n 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,\n 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,\n 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\n 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,\n 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,\n 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\n 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,\n 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,\n 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\n 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,\n 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,\n 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\n 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,\n 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,\n 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\n 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,\n 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,\n 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\n 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,\n 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,\n 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\n 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,\n 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0\n];\n\n/**\n * Convert a string to a UTF8 array - faster than via buffer\n * @param str\n * @returns {Array}\n */\nvar toUTF8Array = function toUTF8Array(str) {\n var char;\n var i = 0;\n var p = 0;\n var utf8 = [];\n var len = str.length;\n\n for (; i < len; i++) {\n char = str.charCodeAt(i);\n if (char < 128) {\n utf8[p++] = char;\n } else if (char < 2048) {\n utf8[p++] = (char >> 6) | 192;\n utf8[p++] = (char & 63) | 128;\n } else if (\n ((char & 0xFC00) === 0xD800) && (i + 1) < str.length &&\n ((str.charCodeAt(i + 1) & 0xFC00) === 0xDC00)) {\n char = 0x10000 + ((char & 0x03FF) << 10) + (str.charCodeAt(++i) & 0x03FF);\n utf8[p++] = (char >> 18) | 240;\n utf8[p++] = ((char >> 12) & 63) | 128;\n utf8[p++] = ((char >> 6) & 63) | 128;\n utf8[p++] = (char & 63) | 128;\n } else {\n utf8[p++] = (char >> 12) | 224;\n utf8[p++] = ((char >> 6) & 63) | 128;\n utf8[p++] = (char & 63) | 128;\n }\n }\n\n return utf8;\n};\n\n/**\n * Convert a string into a redis slot hash.\n * @param str\n * @returns {number}\n */\nvar generate = module.exports = function generate(str) {\n var char;\n var i = 0;\n var start = -1;\n var result = 0;\n var resultHash = 0;\n var utf8 = typeof str === 'string' ? toUTF8Array(str) : str;\n var len = utf8.length;\n\n while (i < len) {\n char = utf8[i++];\n if (start === -1) {\n if (char === 0x7B) {\n start = i;\n }\n } else if (char !== 0x7D) {\n resultHash = lookup[(char ^ (resultHash >> 8)) & 0xFF] ^ (resultHash << 8);\n } else if (i - 1 !== start) {\n return resultHash & 0x3FFF;\n }\n\n result = lookup[(char ^ (result >> 8)) & 0xFF] ^ (result << 8);\n }\n\n return result & 0x3FFF;\n};\n\n/**\n * Convert an array of multiple strings into a redis slot hash.\n * Returns -1 if one of the keys is not for the same slot as the others\n * @param keys\n * @returns {number}\n */\nmodule.exports.generateMulti = function generateMulti(keys) {\n var i = 1;\n var len = keys.length;\n var base = generate(keys[0]);\n\n while (i < len) {\n if (generate(keys[i++]) !== base) return -1;\n }\n\n return base;\n};\n","/**\n * lodash (Custom Build) <https://lodash.com/>\n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright jQuery Foundation and other contributors <https://jquery.org/>\n * Released under MIT license <https://lodash.com/license>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]';\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/**\n * A faster alternative to `Function#apply`, this function invokes `func`\n * with the `this` binding of `thisArg` and the arguments of `args`.\n *\n * @private\n * @param {Function} func The function to invoke.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {Array} args The arguments to invoke `func` with.\n * @returns {*} Returns the result of `func`.\n */\nfunction apply(func, thisArg, args) {\n switch (args.length) {\n case 0: return func.call(thisArg);\n case 1: return func.call(thisArg, args[0]);\n case 2: return func.call(thisArg, args[0], args[1]);\n case 3: return func.call(thisArg, args[0], args[1], args[2]);\n }\n return func.apply(thisArg, args);\n}\n\n/**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n var index = -1,\n result = Array(n);\n\n while (++index < n) {\n result[index] = iteratee(index);\n }\n return result;\n}\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * Creates an array of the enumerable property names of the array-like `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @param {boolean} inherited Specify returning inherited property names.\n * @returns {Array} Returns the array of property names.\n */\nfunction arrayLikeKeys(value, inherited) {\n // Safari 8.1 makes `arguments.callee` enumerable in strict mode.\n // Safari 9 makes `arguments.length` enumerable in strict mode.\n var result = (isArray(value) || isArguments(value))\n ? baseTimes(value.length, String)\n : [];\n\n var length = result.length,\n skipIndexes = !!length;\n\n for (var key in value) {\n if ((inherited || hasOwnProperty.call(value, key)) &&\n !(skipIndexes && (key == 'length' || isIndex(key, length)))) {\n result.push(key);\n }\n }\n return result;\n}\n\n/**\n * Used by `_.defaults` to customize its `_.assignIn` use.\n *\n * @private\n * @param {*} objValue The destination value.\n * @param {*} srcValue The source value.\n * @param {string} key The key of the property to assign.\n * @param {Object} object The parent object of `objValue`.\n * @returns {*} Returns the value to assign.\n */\nfunction assignInDefaults(objValue, srcValue, key, object) {\n if (objValue === undefined ||\n (eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key))) {\n return srcValue;\n }\n return objValue;\n}\n\n/**\n * Assigns `value` to `key` of `object` if the existing value is not equivalent\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction assignValue(object, key, value) {\n var objValue = object[key];\n if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\n (value === undefined && !(key in object))) {\n object[key] = value;\n }\n}\n\n/**\n * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeysIn(object) {\n if (!isObject(object)) {\n return nativeKeysIn(object);\n }\n var isProto = isPrototype(object),\n result = [];\n\n for (var key in object) {\n if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\n result.push(key);\n }\n }\n return result;\n}\n\n/**\n * The base implementation of `_.rest` which doesn't validate or coerce arguments.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n */\nfunction baseRest(func, start) {\n start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\n return function() {\n var args = arguments,\n index = -1,\n length = nativeMax(args.length - start, 0),\n array = Array(length);\n\n while (++index < length) {\n array[index] = args[start + index];\n }\n index = -1;\n var otherArgs = Array(start + 1);\n while (++index < start) {\n otherArgs[index] = args[index];\n }\n otherArgs[start] = array;\n return apply(func, this, otherArgs);\n };\n}\n\n/**\n * Copies properties of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy properties from.\n * @param {Array} props The property identifiers to copy.\n * @param {Object} [object={}] The object to copy properties to.\n * @param {Function} [customizer] The function to customize copied values.\n * @returns {Object} Returns `object`.\n */\nfunction copyObject(source, props, object, customizer) {\n object || (object = {});\n\n var index = -1,\n length = props.length;\n\n while (++index < length) {\n var key = props[index];\n\n var newValue = customizer\n ? customizer(object[key], source[key], key, object, source)\n : undefined;\n\n assignValue(object, key, newValue === undefined ? source[key] : newValue);\n }\n return object;\n}\n\n/**\n * Creates a function like `_.assign`.\n *\n * @private\n * @param {Function} assigner The function to assign values.\n * @returns {Function} Returns the new assigner function.\n */\nfunction createAssigner(assigner) {\n return baseRest(function(object, sources) {\n var index = -1,\n length = sources.length,\n customizer = length > 1 ? sources[length - 1] : undefined,\n guard = length > 2 ? sources[2] : undefined;\n\n customizer = (assigner.length > 3 && typeof customizer == 'function')\n ? (length--, customizer)\n : undefined;\n\n if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n customizer = length < 3 ? undefined : customizer;\n length = 1;\n }\n object = Object(object);\n while (++index < length) {\n var source = sources[index];\n if (source) {\n assigner(object, source, index, customizer);\n }\n }\n return object;\n });\n}\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n length = length == null ? MAX_SAFE_INTEGER : length;\n return !!length &&\n (typeof value == 'number' || reIsUint.test(value)) &&\n (value > -1 && value % 1 == 0 && value < length);\n}\n\n/**\n * Checks if the given arguments are from an iteratee call.\n *\n * @private\n * @param {*} value The potential iteratee value argument.\n * @param {*} index The potential iteratee index or key argument.\n * @param {*} object The potential iteratee object argument.\n * @returns {boolean} Returns `true` if the arguments are from an iteratee call,\n * else `false`.\n */\nfunction isIterateeCall(value, index, object) {\n if (!isObject(object)) {\n return false;\n }\n var type = typeof index;\n if (type == 'number'\n ? (isArrayLike(object) && isIndex(index, object.length))\n : (type == 'string' && index in object)\n ) {\n return eq(object[index], value);\n }\n return false;\n}\n\n/**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\nfunction isPrototype(value) {\n var Ctor = value && value.constructor,\n proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n return value === proto;\n}\n\n/**\n * This function is like\n * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * except that it includes inherited enumerable properties.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction nativeKeysIn(object) {\n var result = [];\n if (object != null) {\n for (var key in Object(object)) {\n result.push(key);\n }\n }\n return result;\n}\n\n/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n return value === other || (value !== value && other !== other);\n}\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n * else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nfunction isArguments(value) {\n // Safari 8.1 makes `arguments.callee` enumerable in strict mode.\n return isArrayLikeObject(value) && hasOwnProperty.call(value, 'callee') &&\n (!propertyIsEnumerable.call(value, 'callee') || objectToString.call(value) == argsTag);\n}\n\n/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n return value != null && isLength(value.length) && !isFunction(value);\n}\n\n/**\n * This method is like `_.isArrayLike` except that it also checks if `value`\n * is an object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array-like object,\n * else `false`.\n * @example\n *\n * _.isArrayLikeObject([1, 2, 3]);\n * // => true\n *\n * _.isArrayLikeObject(document.body.children);\n * // => true\n *\n * _.isArrayLikeObject('abc');\n * // => false\n *\n * _.isArrayLikeObject(_.noop);\n * // => false\n */\nfunction isArrayLikeObject(value) {\n return isObjectLike(value) && isArrayLike(value);\n}\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 8-9 which returns 'object' for typed array and other constructors.\n var tag = isObject(value) ? objectToString.call(value) : '';\n return tag == funcTag || tag == genTag;\n}\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n return typeof value == 'number' &&\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return !!value && typeof value == 'object';\n}\n\n/**\n * This method is like `_.assignIn` except that it accepts `customizer`\n * which is invoked to produce the assigned values. If `customizer` returns\n * `undefined`, assignment is handled by the method instead. The `customizer`\n * is invoked with five arguments: (objValue, srcValue, key, object, source).\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @alias extendWith\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} sources The source objects.\n * @param {Function} [customizer] The function to customize assigned values.\n * @returns {Object} Returns `object`.\n * @see _.assignWith\n * @example\n *\n * function customizer(objValue, srcValue) {\n * return _.isUndefined(objValue) ? srcValue : objValue;\n * }\n *\n * var defaults = _.partialRight(_.assignInWith, customizer);\n *\n * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n * // => { 'a': 1, 'b': 2 }\n */\nvar assignInWith = createAssigner(function(object, source, srcIndex, customizer) {\n copyObject(source, keysIn(source), object, customizer);\n});\n\n/**\n * Assigns own and inherited enumerable string keyed properties of source\n * objects to the destination object for all destination properties that\n * resolve to `undefined`. Source objects are applied from left to right.\n * Once a property is set, additional values of the same property are ignored.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @see _.defaultsDeep\n * @example\n *\n * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n * // => { 'a': 1, 'b': 2 }\n */\nvar defaults = baseRest(function(args) {\n args.push(undefined, assignInDefaults);\n return apply(assignInWith, undefined, args);\n});\n\n/**\n * Creates an array of the own and inherited enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keysIn(new Foo);\n * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n */\nfunction keysIn(object) {\n return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);\n}\n\nmodule.exports = defaults;\n","/**\n * lodash (Custom Build) <https://lodash.com/>\n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright jQuery Foundation and other contributors <https://jquery.org/>\n * Released under MIT license <https://lodash.com/license>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n * else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nfunction isArguments(value) {\n // Safari 8.1 makes `arguments.callee` enumerable in strict mode.\n return isArrayLikeObject(value) && hasOwnProperty.call(value, 'callee') &&\n (!propertyIsEnumerable.call(value, 'callee') || objectToString.call(value) == argsTag);\n}\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n return value != null && isLength(value.length) && !isFunction(value);\n}\n\n/**\n * This method is like `_.isArrayLike` except that it also checks if `value`\n * is an object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array-like object,\n * else `false`.\n * @example\n *\n * _.isArrayLikeObject([1, 2, 3]);\n * // => true\n *\n * _.isArrayLikeObject(document.body.children);\n * // => true\n *\n * _.isArrayLikeObject('abc');\n * // => false\n *\n * _.isArrayLikeObject(_.noop);\n * // => false\n */\nfunction isArrayLikeObject(value) {\n return isObjectLike(value) && isArrayLike(value);\n}\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 8-9 which returns 'object' for typed array and other constructors.\n var tag = isObject(value) ? objectToString.call(value) : '';\n return tag == funcTag || tag == genTag;\n}\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n return typeof value == 'number' &&\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return !!value && typeof value == 'object';\n}\n\nmodule.exports = isArguments;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isArguments = exports.defaults = exports.noop = void 0;\nconst defaults = require(\"lodash.defaults\");\nexports.defaults = defaults;\nconst isArguments = require(\"lodash.isarguments\");\nexports.isArguments = isArguments;\nfunction noop() { }\nexports.noop = noop;\n","/**\n * Helpers.\n */\n\nvar s = 1000;\nvar m = s * 60;\nvar h = m * 60;\nvar d = h * 24;\nvar w = d * 7;\nvar y = d * 365.25;\n\n/**\n * Parse or format the given `val`.\n *\n * Options:\n *\n * - `long` verbose formatting [false]\n *\n * @param {String|Number} val\n * @param {Object} [options]\n * @throws {Error} throw an error if val is not a non-empty string or a number\n * @return {String|Number}\n * @api public\n */\n\nmodule.exports = function (val, options) {\n options = options || {};\n var type = typeof val;\n if (type === 'string' && val.length > 0) {\n return parse(val);\n } else if (type === 'number' && isFinite(val)) {\n return options.long ? fmtLong(val) : fmtShort(val);\n }\n throw new Error(\n 'val is not a non-empty string or a valid number. val=' +\n JSON.stringify(val)\n );\n};\n\n/**\n * Parse the given `str` and return milliseconds.\n *\n * @param {String} str\n * @return {Number}\n * @api private\n */\n\nfunction parse(str) {\n str = String(str);\n if (str.length > 100) {\n return;\n }\n var match = /^(-?(?:\\d+)?\\.?\\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(\n str\n );\n if (!match) {\n return;\n }\n var n = parseFloat(match[1]);\n var type = (match[2] || 'ms').toLowerCase();\n switch (type) {\n case 'years':\n case 'year':\n case 'yrs':\n case 'yr':\n case 'y':\n return n * y;\n case 'weeks':\n case 'week':\n case 'w':\n return n * w;\n case 'days':\n case 'day':\n case 'd':\n return n * d;\n case 'hours':\n case 'hour':\n case 'hrs':\n case 'hr':\n case 'h':\n return n * h;\n case 'minutes':\n case 'minute':\n case 'mins':\n case 'min':\n case 'm':\n return n * m;\n case 'seconds':\n case 'second':\n case 'secs':\n case 'sec':\n case 's':\n return n * s;\n case 'milliseconds':\n case 'millisecond':\n case 'msecs':\n case 'msec':\n case 'ms':\n return n;\n default:\n return undefined;\n }\n}\n\n/**\n * Short format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtShort(ms) {\n var msAbs = Math.abs(ms);\n if (msAbs >= d) {\n return Math.round(ms / d) + 'd';\n }\n if (msAbs >= h) {\n return Math.round(ms / h) + 'h';\n }\n if (msAbs >= m) {\n return Math.round(ms / m) + 'm';\n }\n if (msAbs >= s) {\n return Math.round(ms / s) + 's';\n }\n return ms + 'ms';\n}\n\n/**\n * Long format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtLong(ms) {\n var msAbs = Math.abs(ms);\n if (msAbs >= d) {\n return plural(ms, msAbs, d, 'day');\n }\n if (msAbs >= h) {\n return plural(ms, msAbs, h, 'hour');\n }\n if (msAbs >= m) {\n return plural(ms, msAbs, m, 'minute');\n }\n if (msAbs >= s) {\n return plural(ms, msAbs, s, 'second');\n }\n return ms + ' ms';\n}\n\n/**\n * Pluralization helper.\n */\n\nfunction plural(ms, msAbs, n, name) {\n var isPlural = msAbs >= n * 1.5;\n return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : '');\n}\n","\n/**\n * This is the common logic for both the Node.js and web browser\n * implementations of `debug()`.\n */\n\nfunction setup(env) {\n\tcreateDebug.debug = createDebug;\n\tcreateDebug.default = createDebug;\n\tcreateDebug.coerce = coerce;\n\tcreateDebug.disable = disable;\n\tcreateDebug.enable = enable;\n\tcreateDebug.enabled = enabled;\n\tcreateDebug.humanize = require('ms');\n\tcreateDebug.destroy = destroy;\n\n\tObject.keys(env).forEach(key => {\n\t\tcreateDebug[key] = env[key];\n\t});\n\n\t/**\n\t* The currently active debug mode names, and names to skip.\n\t*/\n\n\tcreateDebug.names = [];\n\tcreateDebug.skips = [];\n\n\t/**\n\t* Map of special \"%n\" handling functions, for the debug \"format\" argument.\n\t*\n\t* Valid key names are a single, lower or upper-case letter, i.e. \"n\" and \"N\".\n\t*/\n\tcreateDebug.formatters = {};\n\n\t/**\n\t* Selects a color for a debug namespace\n\t* @param {String} namespace The namespace string for the debug instance to be colored\n\t* @return {Number|String} An ANSI color code for the given namespace\n\t* @api private\n\t*/\n\tfunction selectColor(namespace) {\n\t\tlet hash = 0;\n\n\t\tfor (let i = 0; i < namespace.length; i++) {\n\t\t\thash = ((hash << 5) - hash) + namespace.charCodeAt(i);\n\t\t\thash |= 0; // Convert to 32bit integer\n\t\t}\n\n\t\treturn createDebug.colors[Math.abs(hash) % createDebug.colors.length];\n\t}\n\tcreateDebug.selectColor = selectColor;\n\n\t/**\n\t* Create a debugger with the given `namespace`.\n\t*\n\t* @param {String} namespace\n\t* @return {Function}\n\t* @api public\n\t*/\n\tfunction createDebug(namespace) {\n\t\tlet prevTime;\n\t\tlet enableOverride = null;\n\t\tlet namespacesCache;\n\t\tlet enabledCache;\n\n\t\tfunction debug(...args) {\n\t\t\t// Disabled?\n\t\t\tif (!debug.enabled) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst self = debug;\n\n\t\t\t// Set `diff` timestamp\n\t\t\tconst curr = Number(new Date());\n\t\t\tconst ms = curr - (prevTime || curr);\n\t\t\tself.diff = ms;\n\t\t\tself.prev = prevTime;\n\t\t\tself.curr = curr;\n\t\t\tprevTime = curr;\n\n\t\t\targs[0] = createDebug.coerce(args[0]);\n\n\t\t\tif (typeof args[0] !== 'string') {\n\t\t\t\t// Anything else let's inspect with %O\n\t\t\t\targs.unshift('%O');\n\t\t\t}\n\n\t\t\t// Apply any `formatters` transformations\n\t\t\tlet index = 0;\n\t\t\targs[0] = args[0].replace(/%([a-zA-Z%])/g, (match, format) => {\n\t\t\t\t// If we encounter an escaped % then don't increase the array index\n\t\t\t\tif (match === '%%') {\n\t\t\t\t\treturn '%';\n\t\t\t\t}\n\t\t\t\tindex++;\n\t\t\t\tconst formatter = createDebug.formatters[format];\n\t\t\t\tif (typeof formatter === 'function') {\n\t\t\t\t\tconst val = args[index];\n\t\t\t\t\tmatch = formatter.call(self, val);\n\n\t\t\t\t\t// Now we need to remove `args[index]` since it's inlined in the `format`\n\t\t\t\t\targs.splice(index, 1);\n\t\t\t\t\tindex--;\n\t\t\t\t}\n\t\t\t\treturn match;\n\t\t\t});\n\n\t\t\t// Apply env-specific formatting (colors, etc.)\n\t\t\tcreateDebug.formatArgs.call(self, args);\n\n\t\t\tconst logFn = self.log || createDebug.log;\n\t\t\tlogFn.apply(self, args);\n\t\t}\n\n\t\tdebug.namespace = namespace;\n\t\tdebug.useColors = createDebug.useColors();\n\t\tdebug.color = createDebug.selectColor(namespace);\n\t\tdebug.extend = extend;\n\t\tdebug.destroy = createDebug.destroy; // XXX Temporary. Will be removed in the next major release.\n\n\t\tObject.defineProperty(debug, 'enabled', {\n\t\t\tenumerable: true,\n\t\t\tconfigurable: false,\n\t\t\tget: () => {\n\t\t\t\tif (enableOverride !== null) {\n\t\t\t\t\treturn enableOverride;\n\t\t\t\t}\n\t\t\t\tif (namespacesCache !== createDebug.namespaces) {\n\t\t\t\t\tnamespacesCache = createDebug.namespaces;\n\t\t\t\t\tenabledCache = createDebug.enabled(namespace);\n\t\t\t\t}\n\n\t\t\t\treturn enabledCache;\n\t\t\t},\n\t\t\tset: v => {\n\t\t\t\tenableOverride = v;\n\t\t\t}\n\t\t});\n\n\t\t// Env-specific initialization logic for debug instances\n\t\tif (typeof createDebug.init === 'function') {\n\t\t\tcreateDebug.init(debug);\n\t\t}\n\n\t\treturn debug;\n\t}\n\n\tfunction extend(namespace, delimiter) {\n\t\tconst newDebug = createDebug(this.namespace + (typeof delimiter === 'undefined' ? ':' : delimiter) + namespace);\n\t\tnewDebug.log = this.log;\n\t\treturn newDebug;\n\t}\n\n\t/**\n\t* Enables a debug mode by namespaces. This can include modes\n\t* separated by a colon and wildcards.\n\t*\n\t* @param {String} namespaces\n\t* @api public\n\t*/\n\tfunction enable(namespaces) {\n\t\tcreateDebug.save(namespaces);\n\t\tcreateDebug.namespaces = namespaces;\n\n\t\tcreateDebug.names = [];\n\t\tcreateDebug.skips = [];\n\n\t\tconst split = (typeof namespaces === 'string' ? namespaces : '')\n\t\t\t.trim()\n\t\t\t.replace(/\\s+/g, ',')\n\t\t\t.split(',')\n\t\t\t.filter(Boolean);\n\n\t\tfor (const ns of split) {\n\t\t\tif (ns[0] === '-') {\n\t\t\t\tcreateDebug.skips.push(ns.slice(1));\n\t\t\t} else {\n\t\t\t\tcreateDebug.names.push(ns);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Checks if the given string matches a namespace template, honoring\n\t * asterisks as wildcards.\n\t *\n\t * @param {String} search\n\t * @param {String} template\n\t * @return {Boolean}\n\t */\n\tfunction matchesTemplate(search, template) {\n\t\tlet searchIndex = 0;\n\t\tlet templateIndex = 0;\n\t\tlet starIndex = -1;\n\t\tlet matchIndex = 0;\n\n\t\twhile (searchIndex < search.length) {\n\t\t\tif (templateIndex < template.length && (template[templateIndex] === search[searchIndex] || template[templateIndex] === '*')) {\n\t\t\t\t// Match character or proceed with wildcard\n\t\t\t\tif (template[templateIndex] === '*') {\n\t\t\t\t\tstarIndex = templateIndex;\n\t\t\t\t\tmatchIndex = searchIndex;\n\t\t\t\t\ttemplateIndex++; // Skip the '*'\n\t\t\t\t} else {\n\t\t\t\t\tsearchIndex++;\n\t\t\t\t\ttemplateIndex++;\n\t\t\t\t}\n\t\t\t} else if (starIndex !== -1) { // eslint-disable-line no-negated-condition\n\t\t\t\t// Backtrack to the last '*' and try to match more characters\n\t\t\t\ttemplateIndex = starIndex + 1;\n\t\t\t\tmatchIndex++;\n\t\t\t\tsearchIndex = matchIndex;\n\t\t\t} else {\n\t\t\t\treturn false; // No match\n\t\t\t}\n\t\t}\n\n\t\t// Handle trailing '*' in template\n\t\twhile (templateIndex < template.length && template[templateIndex] === '*') {\n\t\t\ttemplateIndex++;\n\t\t}\n\n\t\treturn templateIndex === template.length;\n\t}\n\n\t/**\n\t* Disable debug output.\n\t*\n\t* @return {String} namespaces\n\t* @api public\n\t*/\n\tfunction disable() {\n\t\tconst namespaces = [\n\t\t\t...createDebug.names,\n\t\t\t...createDebug.skips.map(namespace => '-' + namespace)\n\t\t].join(',');\n\t\tcreateDebug.enable('');\n\t\treturn namespaces;\n\t}\n\n\t/**\n\t* Returns true if the given mode name is enabled, false otherwise.\n\t*\n\t* @param {String} name\n\t* @return {Boolean}\n\t* @api public\n\t*/\n\tfunction enabled(name) {\n\t\tfor (const skip of createDebug.skips) {\n\t\t\tif (matchesTemplate(name, skip)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tfor (const ns of createDebug.names) {\n\t\t\tif (matchesTemplate(name, ns)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t* Coerce `val`.\n\t*\n\t* @param {Mixed} val\n\t* @return {Mixed}\n\t* @api private\n\t*/\n\tfunction coerce(val) {\n\t\tif (val instanceof Error) {\n\t\t\treturn val.stack || val.message;\n\t\t}\n\t\treturn val;\n\t}\n\n\t/**\n\t* XXX DO NOT USE. This is a temporary stub function.\n\t* XXX It WILL be removed in the next major release.\n\t*/\n\tfunction destroy() {\n\t\tconsole.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');\n\t}\n\n\tcreateDebug.enable(createDebug.load());\n\n\treturn createDebug;\n}\n\nmodule.exports = setup;\n","/* eslint-env browser */\n\n/**\n * This is the web browser implementation of `debug()`.\n */\n\nexports.formatArgs = formatArgs;\nexports.save = save;\nexports.load = load;\nexports.useColors = useColors;\nexports.storage = localstorage();\nexports.destroy = (() => {\n\tlet warned = false;\n\n\treturn () => {\n\t\tif (!warned) {\n\t\t\twarned = true;\n\t\t\tconsole.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');\n\t\t}\n\t};\n})();\n\n/**\n * Colors.\n */\n\nexports.colors = [\n\t'#0000CC',\n\t'#0000FF',\n\t'#0033CC',\n\t'#0033FF',\n\t'#0066CC',\n\t'#0066FF',\n\t'#0099CC',\n\t'#0099FF',\n\t'#00CC00',\n\t'#00CC33',\n\t'#00CC66',\n\t'#00CC99',\n\t'#00CCCC',\n\t'#00CCFF',\n\t'#3300CC',\n\t'#3300FF',\n\t'#3333CC',\n\t'#3333FF',\n\t'#3366CC',\n\t'#3366FF',\n\t'#3399CC',\n\t'#3399FF',\n\t'#33CC00',\n\t'#33CC33',\n\t'#33CC66',\n\t'#33CC99',\n\t'#33CCCC',\n\t'#33CCFF',\n\t'#6600CC',\n\t'#6600FF',\n\t'#6633CC',\n\t'#6633FF',\n\t'#66CC00',\n\t'#66CC33',\n\t'#9900CC',\n\t'#9900FF',\n\t'#9933CC',\n\t'#9933FF',\n\t'#99CC00',\n\t'#99CC33',\n\t'#CC0000',\n\t'#CC0033',\n\t'#CC0066',\n\t'#CC0099',\n\t'#CC00CC',\n\t'#CC00FF',\n\t'#CC3300',\n\t'#CC3333',\n\t'#CC3366',\n\t'#CC3399',\n\t'#CC33CC',\n\t'#CC33FF',\n\t'#CC6600',\n\t'#CC6633',\n\t'#CC9900',\n\t'#CC9933',\n\t'#CCCC00',\n\t'#CCCC33',\n\t'#FF0000',\n\t'#FF0033',\n\t'#FF0066',\n\t'#FF0099',\n\t'#FF00CC',\n\t'#FF00FF',\n\t'#FF3300',\n\t'#FF3333',\n\t'#FF3366',\n\t'#FF3399',\n\t'#FF33CC',\n\t'#FF33FF',\n\t'#FF6600',\n\t'#FF6633',\n\t'#FF9900',\n\t'#FF9933',\n\t'#FFCC00',\n\t'#FFCC33'\n];\n\n/**\n * Currently only WebKit-based Web Inspectors, Firefox >= v31,\n * and the Firebug extension (any Firefox version) are known\n * to support \"%c\" CSS customizations.\n *\n * TODO: add a `localStorage` variable to explicitly enable/disable colors\n */\n\n// eslint-disable-next-line complexity\nfunction useColors() {\n\t// NB: In an Electron preload script, document will be defined but not fully\n\t// initialized. Since we know we're in Chrome, we'll just detect this case\n\t// explicitly\n\tif (typeof window !== 'undefined' && window.process && (window.process.type === 'renderer' || window.process.__nwjs)) {\n\t\treturn true;\n\t}\n\n\t// Internet Explorer and Edge do not support colors.\n\tif (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\\/(\\d+)/)) {\n\t\treturn false;\n\t}\n\n\tlet m;\n\n\t// Is webkit? http://stackoverflow.com/a/16459606/376773\n\t// document is undefined in react-native: https://github.com/facebook/react-native/pull/1632\n\t// eslint-disable-next-line no-return-assign\n\treturn (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||\n\t\t// Is firebug? http://stackoverflow.com/a/398120/376773\n\t\t(typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||\n\t\t// Is firefox >= v31?\n\t\t// https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages\n\t\t(typeof navigator !== 'undefined' && navigator.userAgent && (m = navigator.userAgent.toLowerCase().match(/firefox\\/(\\d+)/)) && parseInt(m[1], 10) >= 31) ||\n\t\t// Double check webkit in userAgent just in case we are in a worker\n\t\t(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\\/(\\d+)/));\n}\n\n/**\n * Colorize log arguments if enabled.\n *\n * @api public\n */\n\nfunction formatArgs(args) {\n\targs[0] = (this.useColors ? '%c' : '') +\n\t\tthis.namespace +\n\t\t(this.useColors ? ' %c' : ' ') +\n\t\targs[0] +\n\t\t(this.useColors ? '%c ' : ' ') +\n\t\t'+' + module.exports.humanize(this.diff);\n\n\tif (!this.useColors) {\n\t\treturn;\n\t}\n\n\tconst c = 'color: ' + this.color;\n\targs.splice(1, 0, c, 'color: inherit');\n\n\t// The final \"%c\" is somewhat tricky, because there could be other\n\t// arguments passed either before or after the %c, so we need to\n\t// figure out the correct index to insert the CSS into\n\tlet index = 0;\n\tlet lastC = 0;\n\targs[0].replace(/%[a-zA-Z%]/g, match => {\n\t\tif (match === '%%') {\n\t\t\treturn;\n\t\t}\n\t\tindex++;\n\t\tif (match === '%c') {\n\t\t\t// We only are interested in the *last* %c\n\t\t\t// (the user may have provided their own)\n\t\t\tlastC = index;\n\t\t}\n\t});\n\n\targs.splice(lastC, 0, c);\n}\n\n/**\n * Invokes `console.debug()` when available.\n * No-op when `console.debug` is not a \"function\".\n * If `console.debug` is not available, falls back\n * to `console.log`.\n *\n * @api public\n */\nexports.log = console.debug || console.log || (() => {});\n\n/**\n * Save `namespaces`.\n *\n * @param {String} namespaces\n * @api private\n */\nfunction save(namespaces) {\n\ttry {\n\t\tif (namespaces) {\n\t\t\texports.storage.setItem('debug', namespaces);\n\t\t} else {\n\t\t\texports.storage.removeItem('debug');\n\t\t}\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n}\n\n/**\n * Load `namespaces`.\n *\n * @return {String} returns the previously persisted debug modes\n * @api private\n */\nfunction load() {\n\tlet r;\n\ttry {\n\t\tr = exports.storage.getItem('debug') || exports.storage.getItem('DEBUG') ;\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n\n\t// If debug isn't set in LS, and we're in Electron, try to load $DEBUG\n\tif (!r && typeof process !== 'undefined' && 'env' in process) {\n\t\tr = process.env.DEBUG;\n\t}\n\n\treturn r;\n}\n\n/**\n * Localstorage attempts to return the localstorage.\n *\n * This is necessary because safari throws\n * when a user disables cookies/localstorage\n * and you attempt to access it.\n *\n * @return {LocalStorage}\n * @api private\n */\n\nfunction localstorage() {\n\ttry {\n\t\t// TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context\n\t\t// The Browser also has localStorage in the global context.\n\t\treturn localStorage;\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n}\n\nmodule.exports = require('./common')(exports);\n\nconst {formatters} = module.exports;\n\n/**\n * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.\n */\n\nformatters.j = function (v) {\n\ttry {\n\t\treturn JSON.stringify(v);\n\t} catch (error) {\n\t\treturn '[UnexpectedJSONParseError]: ' + error.message;\n\t}\n};\n","'use strict';\n\nmodule.exports = (flag, argv = process.argv) => {\n\tconst prefix = flag.startsWith('-') ? '' : (flag.length === 1 ? '-' : '--');\n\tconst position = argv.indexOf(prefix + flag);\n\tconst terminatorPosition = argv.indexOf('--');\n\treturn position !== -1 && (terminatorPosition === -1 || position < terminatorPosition);\n};\n","'use strict';\nconst os = require('os');\nconst tty = require('tty');\nconst hasFlag = require('has-flag');\n\nconst {env} = process;\n\nlet flagForceColor;\nif (hasFlag('no-color') ||\n\thasFlag('no-colors') ||\n\thasFlag('color=false') ||\n\thasFlag('color=never')) {\n\tflagForceColor = 0;\n} else if (hasFlag('color') ||\n\thasFlag('colors') ||\n\thasFlag('color=true') ||\n\thasFlag('color=always')) {\n\tflagForceColor = 1;\n}\n\nfunction envForceColor() {\n\tif ('FORCE_COLOR' in env) {\n\t\tif (env.FORCE_COLOR === 'true') {\n\t\t\treturn 1;\n\t\t}\n\n\t\tif (env.FORCE_COLOR === 'false') {\n\t\t\treturn 0;\n\t\t}\n\n\t\treturn env.FORCE_COLOR.length === 0 ? 1 : Math.min(Number.parseInt(env.FORCE_COLOR, 10), 3);\n\t}\n}\n\nfunction translateLevel(level) {\n\tif (level === 0) {\n\t\treturn false;\n\t}\n\n\treturn {\n\t\tlevel,\n\t\thasBasic: true,\n\t\thas256: level >= 2,\n\t\thas16m: level >= 3\n\t};\n}\n\nfunction supportsColor(haveStream, {streamIsTTY, sniffFlags = true} = {}) {\n\tconst noFlagForceColor = envForceColor();\n\tif (noFlagForceColor !== undefined) {\n\t\tflagForceColor = noFlagForceColor;\n\t}\n\n\tconst forceColor = sniffFlags ? flagForceColor : noFlagForceColor;\n\n\tif (forceColor === 0) {\n\t\treturn 0;\n\t}\n\n\tif (sniffFlags) {\n\t\tif (hasFlag('color=16m') ||\n\t\t\thasFlag('color=full') ||\n\t\t\thasFlag('color=truecolor')) {\n\t\t\treturn 3;\n\t\t}\n\n\t\tif (hasFlag('color=256')) {\n\t\t\treturn 2;\n\t\t}\n\t}\n\n\tif (haveStream && !streamIsTTY && forceColor === undefined) {\n\t\treturn 0;\n\t}\n\n\tconst min = forceColor || 0;\n\n\tif (env.TERM === 'dumb') {\n\t\treturn min;\n\t}\n\n\tif (process.platform === 'win32') {\n\t\t// Windows 10 build 10586 is the first Windows release that supports 256 colors.\n\t\t// Windows 10 build 14931 is the first release that supports 16m/TrueColor.\n\t\tconst osRelease = os.release().split('.');\n\t\tif (\n\t\t\tNumber(osRelease[0]) >= 10 &&\n\t\t\tNumber(osRelease[2]) >= 10586\n\t\t) {\n\t\t\treturn Number(osRelease[2]) >= 14931 ? 3 : 2;\n\t\t}\n\n\t\treturn 1;\n\t}\n\n\tif ('CI' in env) {\n\t\tif (['TRAVIS', 'CIRCLECI', 'APPVEYOR', 'GITLAB_CI', 'GITHUB_ACTIONS', 'BUILDKITE', 'DRONE'].some(sign => sign in env) || env.CI_NAME === 'codeship') {\n\t\t\treturn 1;\n\t\t}\n\n\t\treturn min;\n\t}\n\n\tif ('TEAMCITY_VERSION' in env) {\n\t\treturn /^(9\\.(0*[1-9]\\d*)\\.|\\d{2,}\\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0;\n\t}\n\n\tif (env.COLORTERM === 'truecolor') {\n\t\treturn 3;\n\t}\n\n\tif ('TERM_PROGRAM' in env) {\n\t\tconst version = Number.parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10);\n\n\t\tswitch (env.TERM_PROGRAM) {\n\t\t\tcase 'iTerm.app':\n\t\t\t\treturn version >= 3 ? 3 : 2;\n\t\t\tcase 'Apple_Terminal':\n\t\t\t\treturn 2;\n\t\t\t// No default\n\t\t}\n\t}\n\n\tif (/-256(color)?$/i.test(env.TERM)) {\n\t\treturn 2;\n\t}\n\n\tif (/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) {\n\t\treturn 1;\n\t}\n\n\tif ('COLORTERM' in env) {\n\t\treturn 1;\n\t}\n\n\treturn min;\n}\n\nfunction getSupportLevel(stream, options = {}) {\n\tconst level = supportsColor(stream, {\n\t\tstreamIsTTY: stream && stream.isTTY,\n\t\t...options\n\t});\n\n\treturn translateLevel(level);\n}\n\nmodule.exports = {\n\tsupportsColor: getSupportLevel,\n\tstdout: getSupportLevel({isTTY: tty.isatty(1)}),\n\tstderr: getSupportLevel({isTTY: tty.isatty(2)})\n};\n","/**\n * Module dependencies.\n */\n\nconst tty = require('tty');\nconst util = require('util');\n\n/**\n * This is the Node.js implementation of `debug()`.\n */\n\nexports.init = init;\nexports.log = log;\nexports.formatArgs = formatArgs;\nexports.save = save;\nexports.load = load;\nexports.useColors = useColors;\nexports.destroy = util.deprecate(\n\t() => {},\n\t'Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.'\n);\n\n/**\n * Colors.\n */\n\nexports.colors = [6, 2, 3, 4, 5, 1];\n\ntry {\n\t// Optional dependency (as in, doesn't need to be installed, NOT like optionalDependencies in package.json)\n\t// eslint-disable-next-line import/no-extraneous-dependencies\n\tconst supportsColor = require('supports-color');\n\n\tif (supportsColor && (supportsColor.stderr || supportsColor).level >= 2) {\n\t\texports.colors = [\n\t\t\t20,\n\t\t\t21,\n\t\t\t26,\n\t\t\t27,\n\t\t\t32,\n\t\t\t33,\n\t\t\t38,\n\t\t\t39,\n\t\t\t40,\n\t\t\t41,\n\t\t\t42,\n\t\t\t43,\n\t\t\t44,\n\t\t\t45,\n\t\t\t56,\n\t\t\t57,\n\t\t\t62,\n\t\t\t63,\n\t\t\t68,\n\t\t\t69,\n\t\t\t74,\n\t\t\t75,\n\t\t\t76,\n\t\t\t77,\n\t\t\t78,\n\t\t\t79,\n\t\t\t80,\n\t\t\t81,\n\t\t\t92,\n\t\t\t93,\n\t\t\t98,\n\t\t\t99,\n\t\t\t112,\n\t\t\t113,\n\t\t\t128,\n\t\t\t129,\n\t\t\t134,\n\t\t\t135,\n\t\t\t148,\n\t\t\t149,\n\t\t\t160,\n\t\t\t161,\n\t\t\t162,\n\t\t\t163,\n\t\t\t164,\n\t\t\t165,\n\t\t\t166,\n\t\t\t167,\n\t\t\t168,\n\t\t\t169,\n\t\t\t170,\n\t\t\t171,\n\t\t\t172,\n\t\t\t173,\n\t\t\t178,\n\t\t\t179,\n\t\t\t184,\n\t\t\t185,\n\t\t\t196,\n\t\t\t197,\n\t\t\t198,\n\t\t\t199,\n\t\t\t200,\n\t\t\t201,\n\t\t\t202,\n\t\t\t203,\n\t\t\t204,\n\t\t\t205,\n\t\t\t206,\n\t\t\t207,\n\t\t\t208,\n\t\t\t209,\n\t\t\t214,\n\t\t\t215,\n\t\t\t220,\n\t\t\t221\n\t\t];\n\t}\n} catch (error) {\n\t// Swallow - we only care if `supports-color` is available; it doesn't have to be.\n}\n\n/**\n * Build up the default `inspectOpts` object from the environment variables.\n *\n * $ DEBUG_COLORS=no DEBUG_DEPTH=10 DEBUG_SHOW_HIDDEN=enabled node script.js\n */\n\nexports.inspectOpts = Object.keys(process.env).filter(key => {\n\treturn /^debug_/i.test(key);\n}).reduce((obj, key) => {\n\t// Camel-case\n\tconst prop = key\n\t\t.substring(6)\n\t\t.toLowerCase()\n\t\t.replace(/_([a-z])/g, (_, k) => {\n\t\t\treturn k.toUpperCase();\n\t\t});\n\n\t// Coerce string value into JS value\n\tlet val = process.env[key];\n\tif (/^(yes|on|true|enabled)$/i.test(val)) {\n\t\tval = true;\n\t} else if (/^(no|off|false|disabled)$/i.test(val)) {\n\t\tval = false;\n\t} else if (val === 'null') {\n\t\tval = null;\n\t} else {\n\t\tval = Number(val);\n\t}\n\n\tobj[prop] = val;\n\treturn obj;\n}, {});\n\n/**\n * Is stdout a TTY? Colored output is enabled when `true`.\n */\n\nfunction useColors() {\n\treturn 'colors' in exports.inspectOpts ?\n\t\tBoolean(exports.inspectOpts.colors) :\n\t\ttty.isatty(process.stderr.fd);\n}\n\n/**\n * Adds ANSI color escape codes if enabled.\n *\n * @api public\n */\n\nfunction formatArgs(args) {\n\tconst {namespace: name, useColors} = this;\n\n\tif (useColors) {\n\t\tconst c = this.color;\n\t\tconst colorCode = '\\u001B[3' + (c < 8 ? c : '8;5;' + c);\n\t\tconst prefix = ` ${colorCode};1m${name} \\u001B[0m`;\n\n\t\targs[0] = prefix + args[0].split('\\n').join('\\n' + prefix);\n\t\targs.push(colorCode + 'm+' + module.exports.humanize(this.diff) + '\\u001B[0m');\n\t} else {\n\t\targs[0] = getDate() + name + ' ' + args[0];\n\t}\n}\n\nfunction getDate() {\n\tif (exports.inspectOpts.hideDate) {\n\t\treturn '';\n\t}\n\treturn new Date().toISOString() + ' ';\n}\n\n/**\n * Invokes `util.formatWithOptions()` with the specified arguments and writes to stderr.\n */\n\nfunction log(...args) {\n\treturn process.stderr.write(util.formatWithOptions(exports.inspectOpts, ...args) + '\\n');\n}\n\n/**\n * Save `namespaces`.\n *\n * @param {String} namespaces\n * @api private\n */\nfunction save(namespaces) {\n\tif (namespaces) {\n\t\tprocess.env.DEBUG = namespaces;\n\t} else {\n\t\t// If you set a process.env field to null or undefined, it gets cast to the\n\t\t// string 'null' or 'undefined'. Just delete instead.\n\t\tdelete process.env.DEBUG;\n\t}\n}\n\n/**\n * Load `namespaces`.\n *\n * @return {String} returns the previously persisted debug modes\n * @api private\n */\n\nfunction load() {\n\treturn process.env.DEBUG;\n}\n\n/**\n * Init logic for `debug` instances.\n *\n * Create a new `inspectOpts` object in case `useColors` is set\n * differently for a particular `debug` instance.\n */\n\nfunction init(debug) {\n\tdebug.inspectOpts = {};\n\n\tconst keys = Object.keys(exports.inspectOpts);\n\tfor (let i = 0; i < keys.length; i++) {\n\t\tdebug.inspectOpts[keys[i]] = exports.inspectOpts[keys[i]];\n\t}\n}\n\nmodule.exports = require('./common')(exports);\n\nconst {formatters} = module.exports;\n\n/**\n * Map %o to `util.inspect()`, all on a single line.\n */\n\nformatters.o = function (v) {\n\tthis.inspectOpts.colors = this.useColors;\n\treturn util.inspect(v, this.inspectOpts)\n\t\t.split('\\n')\n\t\t.map(str => str.trim())\n\t\t.join(' ');\n};\n\n/**\n * Map %O to `util.inspect()`, allowing multiple lines if needed.\n */\n\nformatters.O = function (v) {\n\tthis.inspectOpts.colors = this.useColors;\n\treturn util.inspect(v, this.inspectOpts);\n};\n","/**\n * Detect Electron renderer / nwjs process, which is node, but we should\n * treat as a browser.\n */\n\nif (typeof process === 'undefined' || process.type === 'renderer' || process.browser === true || process.__nwjs) {\n\tmodule.exports = require('./browser.js');\n} else {\n\tmodule.exports = require('./node.js');\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.genRedactedString = exports.getStringValue = exports.MAX_ARGUMENT_LENGTH = void 0;\nconst debug_1 = require(\"debug\");\nconst MAX_ARGUMENT_LENGTH = 200;\nexports.MAX_ARGUMENT_LENGTH = MAX_ARGUMENT_LENGTH;\nconst NAMESPACE_PREFIX = \"ioredis\";\n/**\n * helper function that tried to get a string value for\n * arbitrary \"debug\" arg\n */\nfunction getStringValue(v) {\n if (v === null) {\n return;\n }\n switch (typeof v) {\n case \"boolean\":\n return;\n case \"number\":\n return;\n case \"object\":\n if (Buffer.isBuffer(v)) {\n return v.toString(\"hex\");\n }\n if (Array.isArray(v)) {\n return v.join(\",\");\n }\n try {\n return JSON.stringify(v);\n }\n catch (e) {\n return;\n }\n case \"string\":\n return v;\n }\n}\nexports.getStringValue = getStringValue;\n/**\n * helper function that redacts a string representation of a \"debug\" arg\n */\nfunction genRedactedString(str, maxLen) {\n const { length } = str;\n return length <= maxLen\n ? str\n : str.slice(0, maxLen) + ' ... <REDACTED full-length=\"' + length + '\">';\n}\nexports.genRedactedString = genRedactedString;\n/**\n * a wrapper for the `debug` module, used to generate\n * \"debug functions\" that trim the values in their output\n */\nfunction genDebugFunction(namespace) {\n const fn = (0, debug_1.default)(`${NAMESPACE_PREFIX}:${namespace}`);\n function wrappedDebug(...args) {\n if (!fn.enabled) {\n return; // no-op\n }\n // we skip the first arg because that is the message\n for (let i = 1; i < args.length; i++) {\n const str = getStringValue(args[i]);\n if (typeof str === \"string\" && str.length > MAX_ARGUMENT_LENGTH) {\n args[i] = genRedactedString(str, MAX_ARGUMENT_LENGTH);\n }\n }\n return fn.apply(null, args);\n }\n Object.defineProperties(wrappedDebug, {\n namespace: {\n get() {\n return fn.namespace;\n },\n },\n enabled: {\n get() {\n return fn.enabled;\n },\n },\n destroy: {\n get() {\n return fn.destroy;\n },\n },\n log: {\n get() {\n return fn.log;\n },\n set(l) {\n fn.log = l;\n },\n },\n });\n return wrappedDebug;\n}\nexports.default = genDebugFunction;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/**\n * TLS settings for Redis Cloud. Updated on 2022-08-19.\n */\nconst RedisCloudCA = `-----BEGIN CERTIFICATE-----\nMIIDTzCCAjegAwIBAgIJAKSVpiDswLcwMA0GCSqGSIb3DQEBBQUAMD4xFjAUBgNV\nBAoMDUdhcmFudGlhIERhdGExJDAiBgNVBAMMG1NTTCBDZXJ0aWZpY2F0aW9uIEF1\ndGhvcml0eTAeFw0xMzEwMDExMjE0NTVaFw0yMzA5MjkxMjE0NTVaMD4xFjAUBgNV\nBAoMDUdhcmFudGlhIERhdGExJDAiBgNVBAMMG1NTTCBDZXJ0aWZpY2F0aW9uIEF1\ndGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALZqkh/DczWP\nJnxnHLQ7QL0T4B4CDKWBKCcisriGbA6ZePWVNo4hfKQC6JrzfR+081NeD6VcWUiz\nrmd+jtPhIY4c+WVQYm5PKaN6DT1imYdxQw7aqO5j2KUCEh/cznpLxeSHoTxlR34E\nQwF28Wl3eg2vc5ct8LjU3eozWVk3gb7alx9mSA2SgmuX5lEQawl++rSjsBStemY2\nBDwOpAMXIrdEyP/cVn8mkvi/BDs5M5G+09j0gfhyCzRWMQ7Hn71u1eolRxwVxgi3\nTMn+/vTaFSqxKjgck6zuAYjBRPaHe7qLxHNr1So/Mc9nPy+3wHebFwbIcnUojwbp\n4nctkWbjb2cCAwEAAaNQME4wHQYDVR0OBBYEFP1whtcrydmW3ZJeuSoKZIKjze3w\nMB8GA1UdIwQYMBaAFP1whtcrydmW3ZJeuSoKZIKjze3wMAwGA1UdEwQFMAMBAf8w\nDQYJKoZIhvcNAQEFBQADggEBAG2erXhwRAa7+ZOBs0B6X57Hwyd1R4kfmXcs0rta\nlbPpvgULSiB+TCbf3EbhJnHGyvdCY1tvlffLjdA7HJ0PCOn+YYLBA0pTU/dyvrN6\nSu8NuS5yubnt9mb13nDGYo1rnt0YRfxN+8DM3fXIVr038A30UlPX2Ou1ExFJT0MZ\nuFKY6ZvLdI6/1cbgmguMlAhM+DhKyV6Sr5699LM3zqeI816pZmlREETYkGr91q7k\nBpXJu/dtHaGxg1ZGu6w/PCsYGUcECWENYD4VQPd8N32JjOfu6vEgoEAwfPP+3oGp\nZ4m3ewACcWOAenqflb+cQYC4PsF7qbXDmRaWrbKntOlZ3n0=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIGMTCCBBmgAwIBAgICEAAwDQYJKoZIhvcNAQELBQAwajELMAkGA1UEBhMCVVMx\nCzAJBgNVBAgMAkNBMQswCQYDVQQHDAJDQTESMBAGA1UECgwJUmVkaXNMYWJzMS0w\nKwYDVQQDDCRSZWRpc0xhYnMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN\nMTgwMjI1MTUzNzM3WhcNMjgwMjIzMTUzNzM3WjBfMQswCQYDVQQGEwJVUzELMAkG\nA1UECAwCQ0ExEjAQBgNVBAoMCVJlZGlzTGFiczEvMC0GA1UEAwwmUkNQIEludGVy\nbWVkaWF0ZSBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUA\nA4ICDwAwggIKAoICAQDf9dqbxc8Bq7Ctq9rWcxrGNKKHivqLAFpPq02yLPx6fsOv\nTq7GsDChAYBBc4v7Y2Ap9RD5Vs3dIhEANcnolf27QwrG9RMnnvzk8pCvp1o6zSU4\nVuOE1W66/O1/7e2rVxyrnTcP7UgK43zNIXu7+tiAqWsO92uSnuMoGPGpeaUm1jym\nhjWKtkAwDFSqvHY+XL5qDVBEjeUe+WHkYUg40cAXjusAqgm2hZt29c2wnVrxW25W\nP0meNlzHGFdA2AC5z54iRiqj57dTfBTkHoBczQxcyw6hhzxZQ4e5I5zOKjXXEhZN\nr0tA3YC14CTabKRus/JmZieyZzRgEy2oti64tmLYTqSlAD78pRL40VNoaSYetXLw\nhhNsXCHgWaY6d5bLOc/aIQMAV5oLvZQKvuXAF1IDmhPA+bZbpWipp0zagf1P1H3s\nUzsMdn2KM0ejzgotbtNlj5TcrVwpmvE3ktvUAuA+hi3FkVx1US+2Gsp5x4YOzJ7u\nP1WPk6ShF0JgnJH2ILdj6kttTWwFzH17keSFICWDfH/+kM+k7Y1v3EXMQXE7y0T9\nMjvJskz6d/nv+sQhY04xt64xFMGTnZjlJMzfQNi7zWFLTZnDD0lPowq7l3YiPoTT\nt5Xky83lu0KZsZBo0WlWaDG00gLVdtRgVbcuSWxpi5BdLb1kRab66JptWjxwXQID\nAQABo4HrMIHoMDoGA1UdHwQzMDEwL6AtoCuGKWh0dHBzOi8vcmwtY2Etc2VydmVy\nLnJlZGlzbGFicy5jb20vdjEvY3JsMEYGCCsGAQUFBwEBBDowODA2BggrBgEFBQcw\nAYYqaHR0cHM6Ly9ybC1jYS1zZXJ2ZXIucmVkaXNsYWJzLmNvbS92MS9vY3NwMB0G\nA1UdDgQWBBQHar5OKvQUpP2qWt6mckzToeCOHDAfBgNVHSMEGDAWgBQi42wH6hM4\nL2sujEvLM0/u8lRXTzASBgNVHRMBAf8ECDAGAQH/AgEAMA4GA1UdDwEB/wQEAwIB\nhjANBgkqhkiG9w0BAQsFAAOCAgEAirEn/iTsAKyhd+pu2W3Z5NjCko4NPU0EYUbr\nAP7+POK2rzjIrJO3nFYQ/LLuC7KCXG+2qwan2SAOGmqWst13Y+WHp44Kae0kaChW\nvcYLXXSoGQGC8QuFSNUdaeg3RbMDYFT04dOkqufeWVccoHVxyTSg9eD8LZuHn5jw\n7QDLiEECBmIJHk5Eeo2TAZrx4Yx6ufSUX5HeVjlAzqwtAqdt99uCJ/EL8bgpWbe+\nXoSpvUv0SEC1I1dCAhCKAvRlIOA6VBcmzg5Am12KzkqTul12/VEFIgzqu0Zy2Jbc\nAUPrYVu/+tOGXQaijy7YgwH8P8n3s7ZeUa1VABJHcxrxYduDDJBLZi+MjheUDaZ1\njQRHYevI2tlqeSBqdPKG4zBY5lS0GiAlmuze5oENt0P3XboHoZPHiqcK3VECgTVh\n/BkJcuudETSJcZDmQ8YfoKfBzRQNg2sv/hwvUv73Ss51Sco8GEt2lD8uEdib1Q6z\nzDT5lXJowSzOD5ZA9OGDjnSRL+2riNtKWKEqvtEG3VBJoBzu9GoxbAc7wIZLxmli\niF5a/Zf5X+UXD3s4TMmy6C4QZJpAA2egsSQCnraWO2ULhh7iXMysSkF/nzVfZn43\niqpaB8++9a37hWq14ZmOv0TJIDz//b2+KC4VFXWQ5W5QC6whsjT+OlG4p5ZYG0jo\n616pxqo=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\n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\n-----END CERTIFICATE-----\n\n-----BEGIN CERTIFICATE-----\nMIIEjzCCA3egAwIBAgIQe55B/ALCKJDZtdNT8kD6hTANBgkqhkiG9w0BAQsFADBM\nMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xv\nYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjAeFw0yMjAxMjYxMjAwMDBaFw0y\nNTAxMjYwMDAwMDBaMFgxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWdu\nIG52LXNhMS4wLAYDVQQDEyVHbG9iYWxTaWduIEF0bGFzIFIzIE9WIFRMUyBDQSAy\nMDIyIFEyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmGmg1LW9b7Lf\n8zDD83yBDTEkt+FOxKJZqF4veWc5KZsQj9HfnUS2e5nj/E+JImlGPsQuoiosLuXD\nBVBNAMcUFa11buFMGMeEMwiTmCXoXRrXQmH0qjpOfKgYc5gHG3BsRGaRrf7VR4eg\nofNMG9wUBw4/g/TT7+bQJdA4NfE7Y4d5gEryZiBGB/swaX6Jp/8MF4TgUmOWmalK\ndZCKyb4sPGQFRTtElk67F7vU+wdGcrcOx1tDcIB0ncjLPMnaFicagl+daWGsKqTh\ncounQb6QJtYHa91KvCfKWocMxQ7OIbB5UARLPmC4CJ1/f8YFm35ebfzAeULYdGXu\njE9CLor0OwIDAQABo4IBXzCCAVswDgYDVR0PAQH/BAQDAgGGMB0GA1UdJQQWMBQG\nCCsGAQUFBwMBBggrBgEFBQcDAjASBgNVHRMBAf8ECDAGAQH/AgEAMB0GA1UdDgQW\nBBSH5Zq7a7B/t95GfJWkDBpA8HHqdjAfBgNVHSMEGDAWgBSP8Et/qC5FJK5NUPpj\nmove4t0bvDB7BggrBgEFBQcBAQRvMG0wLgYIKwYBBQUHMAGGImh0dHA6Ly9vY3Nw\nMi5nbG9iYWxzaWduLmNvbS9yb290cjMwOwYIKwYBBQUHMAKGL2h0dHA6Ly9zZWN1\ncmUuZ2xvYmFsc2lnbi5jb20vY2FjZXJ0L3Jvb3QtcjMuY3J0MDYGA1UdHwQvMC0w\nK6ApoCeGJWh0dHA6Ly9jcmwuZ2xvYmFsc2lnbi5jb20vcm9vdC1yMy5jcmwwIQYD\nVR0gBBowGDAIBgZngQwBAgIwDAYKKwYBBAGgMgoBAjANBgkqhkiG9w0BAQsFAAOC\nAQEAKRic9/f+nmhQU/wz04APZLjgG5OgsuUOyUEZjKVhNGDwxGTvKhyXGGAMW2B/\n3bRi+aElpXwoxu3pL6fkElbX3B0BeS5LoDtxkyiVEBMZ8m+sXbocwlPyxrPbX6mY\n0rVIvnuUeBH8X0L5IwfpNVvKnBIilTbcebfHyXkPezGwz7E1yhUULjJFm2bt0SdX\ny+4X/WeiiYIv+fTVgZZgl+/2MKIsu/qdBJc3f3TvJ8nz+Eax1zgZmww+RSQWeOj3\n15Iw6Z5FX+NwzY/Ab+9PosR5UosSeq+9HhtaxZttXG1nVh+avYPGYddWmiMT90J5\nZgKnO/Fx2hBgTxhOTMYaD312kg==\n-----END CERTIFICATE-----\n\n-----BEGIN CERTIFICATE-----\nMIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G\nA1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp\nZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4\nMTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG\nA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI\nhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8\nRgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT\ngHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm\nKPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd\nQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ\nXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw\nDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o\nLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU\nRUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp\njjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK\n6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX\nmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs\nMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH\nWD9f\n-----END CERTIFICATE-----`;\nconst TLSProfiles = {\n RedisCloudFixed: { ca: RedisCloudCA },\n RedisCloudFlexible: { ca: RedisCloudCA },\n};\nexports.default = TLSProfiles;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.noop = exports.defaults = exports.Debug = exports.getPackageMeta = exports.zipMap = exports.CONNECTION_CLOSED_ERROR_MSG = exports.shuffle = exports.sample = exports.resolveTLSProfile = exports.parseURL = exports.optimizeErrorStack = exports.toArg = exports.convertMapToArray = exports.convertObjectToArray = exports.timeout = exports.packObject = exports.isInt = exports.wrapMultiResult = exports.convertBufferToString = void 0;\nconst fs_1 = require(\"fs\");\nconst path_1 = require(\"path\");\nconst url_1 = require(\"url\");\nconst lodash_1 = require(\"./lodash\");\nObject.defineProperty(exports, \"defaults\", { enumerable: true, get: function () { return lodash_1.defaults; } });\nObject.defineProperty(exports, \"noop\", { enumerable: true, get: function () { return lodash_1.noop; } });\nconst debug_1 = require(\"./debug\");\nexports.Debug = debug_1.default;\nconst TLSProfiles_1 = require(\"../constants/TLSProfiles\");\n/**\n * Convert a buffer to string, supports buffer array\n *\n * @example\n * ```js\n * const input = [Buffer.from('foo'), [Buffer.from('bar')]]\n * const res = convertBufferToString(input, 'utf8')\n * expect(res).to.eql(['foo', ['bar']])\n * ```\n */\nfunction convertBufferToString(value, encoding) {\n if (value instanceof Buffer) {\n return value.toString(encoding);\n }\n if (Array.isArray(value)) {\n const length = value.length;\n const res = Array(length);\n for (let i = 0; i < length; ++i) {\n res[i] =\n value[i] instanceof Buffer && encoding === \"utf8\"\n ? value[i].toString()\n : convertBufferToString(value[i], encoding);\n }\n return res;\n }\n return value;\n}\nexports.convertBufferToString = convertBufferToString;\n/**\n * Convert a list of results to node-style\n *\n * @example\n * ```js\n * const input = ['a', 'b', new Error('c'), 'd']\n * const output = exports.wrapMultiResult(input)\n * expect(output).to.eql([[null, 'a'], [null, 'b'], [new Error('c')], [null, 'd'])\n * ```\n */\nfunction wrapMultiResult(arr) {\n // When using WATCH/EXEC transactions, the EXEC will return\n // a null instead of an array\n if (!arr) {\n return null;\n }\n const result = [];\n const length = arr.length;\n for (let i = 0; i < length; ++i) {\n const item = arr[i];\n if (item instanceof Error) {\n result.push([item]);\n }\n else {\n result.push([null, item]);\n }\n }\n return result;\n}\nexports.wrapMultiResult = wrapMultiResult;\n/**\n * Detect if the argument is a int\n * @example\n * ```js\n * > isInt('123')\n * true\n * > isInt('123.3')\n * false\n * > isInt('1x')\n * false\n * > isInt(123)\n * true\n * > isInt(true)\n * false\n * ```\n */\nfunction isInt(value) {\n const x = parseFloat(value);\n return !isNaN(value) && (x | 0) === x;\n}\nexports.isInt = isInt;\n/**\n * Pack an array to an Object\n *\n * @example\n * ```js\n * > packObject(['a', 'b', 'c', 'd'])\n * { a: 'b', c: 'd' }\n * ```\n */\nfunction packObject(array) {\n const result = {};\n const length = array.length;\n for (let i = 1; i < length; i += 2) {\n result[array[i - 1]] = array[i];\n }\n return result;\n}\nexports.packObject = packObject;\n/**\n * Return a callback with timeout\n */\nfunction timeout(callback, timeout) {\n let timer = null;\n const run = function () {\n if (timer) {\n clearTimeout(timer);\n timer = null;\n callback.apply(this, arguments);\n }\n };\n timer = setTimeout(run, timeout, new Error(\"timeout\"));\n return run;\n}\nexports.timeout = timeout;\n/**\n * Convert an object to an array\n * @example\n * ```js\n * > convertObjectToArray({ a: '1' })\n * ['a', '1']\n * ```\n */\nfunction convertObjectToArray(obj) {\n const result = [];\n const keys = Object.keys(obj); // Object.entries requires node 7+\n for (let i = 0, l = keys.length; i < l; i++) {\n result.push(keys[i], obj[keys[i]]);\n }\n return result;\n}\nexports.convertObjectToArray = convertObjectToArray;\n/**\n * Convert a map to an array\n * @example\n * ```js\n * > convertMapToArray(new Map([[1, '2']]))\n * [1, '2']\n * ```\n */\nfunction convertMapToArray(map) {\n const result = [];\n let pos = 0;\n map.forEach(function (value, key) {\n result[pos] = key;\n result[pos + 1] = value;\n pos += 2;\n });\n return result;\n}\nexports.convertMapToArray = convertMapToArray;\n/**\n * Convert a non-string arg to a string\n */\nfunction toArg(arg) {\n if (arg === null || typeof arg === \"undefined\") {\n return \"\";\n }\n return String(arg);\n}\nexports.toArg = toArg;\n/**\n * Optimize error stack\n *\n * @param error actually error\n * @param friendlyStack the stack that more meaningful\n * @param filterPath only show stacks with the specified path\n */\nfunction optimizeErrorStack(error, friendlyStack, filterPath) {\n const stacks = friendlyStack.split(\"\\n\");\n let lines = \"\";\n let i;\n for (i = 1; i < stacks.length; ++i) {\n if (stacks[i].indexOf(filterPath) === -1) {\n break;\n }\n }\n for (let j = i; j < stacks.length; ++j) {\n lines += \"\\n\" + stacks[j];\n }\n if (error.stack) {\n const pos = error.stack.indexOf(\"\\n\");\n error.stack = error.stack.slice(0, pos) + lines;\n }\n return error;\n}\nexports.optimizeErrorStack = optimizeErrorStack;\n/**\n * Parse the redis protocol url\n */\nfunction parseURL(url) {\n if (isInt(url)) {\n return { port: url };\n }\n let parsed = (0, url_1.parse)(url, true, true);\n if (!parsed.slashes && url[0] !== \"/\") {\n url = \"//\" + url;\n parsed = (0, url_1.parse)(url, true, true);\n }\n const options = parsed.query || {};\n const result = {};\n if (parsed.auth) {\n const index = parsed.auth.indexOf(\":\");\n result.username = index === -1 ? parsed.auth : parsed.auth.slice(0, index);\n result.password = index === -1 ? \"\" : parsed.auth.slice(index + 1);\n }\n if (parsed.pathname) {\n if (parsed.protocol === \"redis:\" || parsed.protocol === \"rediss:\") {\n if (parsed.pathname.length > 1) {\n result.db = parsed.pathname.slice(1);\n }\n }\n else {\n result.path = parsed.pathname;\n }\n }\n if (parsed.host) {\n result.host = parsed.hostname;\n }\n if (parsed.port) {\n result.port = parsed.port;\n }\n if (typeof options.family === \"string\") {\n const intFamily = Number.parseInt(options.family, 10);\n if (!Number.isNaN(intFamily)) {\n result.family = intFamily;\n }\n }\n (0, lodash_1.defaults)(result, options);\n return result;\n}\nexports.parseURL = parseURL;\n/**\n * Resolve TLS profile shortcut in connection options\n */\nfunction resolveTLSProfile(options) {\n let tls = options === null || options === void 0 ? void 0 : options.tls;\n if (typeof tls === \"string\")\n tls = { profile: tls };\n const profile = TLSProfiles_1.default[tls === null || tls === void 0 ? void 0 : tls.profile];\n if (profile) {\n tls = Object.assign({}, profile, tls);\n delete tls.profile;\n options = Object.assign({}, options, { tls });\n }\n return options;\n}\nexports.resolveTLSProfile = resolveTLSProfile;\n/**\n * Get a random element from `array`\n */\nfunction sample(array, from = 0) {\n const length = array.length;\n if (from >= length) {\n return null;\n }\n return array[from + Math.floor(Math.random() * (length - from))];\n}\nexports.sample = sample;\n/**\n * Shuffle the array using the Fisher-Yates Shuffle.\n * This method will mutate the original array.\n */\nfunction shuffle(array) {\n let counter = array.length;\n // While there are elements in the array\n while (counter > 0) {\n // Pick a random index\n const index = Math.floor(Math.random() * counter);\n // Decrease counter by 1\n counter--;\n // And swap the last element with it\n [array[counter], array[index]] = [array[index], array[counter]];\n }\n return array;\n}\nexports.shuffle = shuffle;\n/**\n * Error message for connection being disconnected\n */\nexports.CONNECTION_CLOSED_ERROR_MSG = \"Connection is closed.\";\nfunction zipMap(keys, values) {\n const map = new Map();\n keys.forEach((key, index) => {\n map.set(key, values[index]);\n });\n return map;\n}\nexports.zipMap = zipMap;\n/**\n * Memoized package metadata to avoid repeated file system reads.\n *\n * @internal\n */\nlet cachedPackageMeta = null;\n/**\n * Retrieves cached package metadata from package.json.\n *\n * @internal\n * @returns {Promise<{version: string} | null>} Package metadata or null if unavailable\n */\nasync function getPackageMeta() {\n if (cachedPackageMeta) {\n return cachedPackageMeta;\n }\n try {\n const filePath = (0, path_1.resolve)(__dirname, \"..\", \"..\", \"package.json\");\n const data = await fs_1.promises.readFile(filePath, \"utf8\");\n const parsed = JSON.parse(data);\n cachedPackageMeta = {\n version: parsed.version,\n };\n return cachedPackageMeta;\n }\n catch (err) {\n cachedPackageMeta = {\n version: \"error-fetching-version\",\n };\n return cachedPackageMeta;\n }\n}\nexports.getPackageMeta = getPackageMeta;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst commands_1 = require(\"@ioredis/commands\");\nconst calculateSlot = require(\"cluster-key-slot\");\nconst standard_as_callback_1 = require(\"standard-as-callback\");\nconst utils_1 = require(\"./utils\");\n/**\n * Command instance\n *\n * It's rare that you need to create a Command instance yourself.\n *\n * ```js\n * var infoCommand = new Command('info', null, function (err, result) {\n * console.log('result', result);\n * });\n *\n * redis.sendCommand(infoCommand);\n *\n * // When no callback provided, Command instance will have a `promise` property,\n * // which will resolve/reject with the result of the command.\n * var getCommand = new Command('get', ['foo']);\n * getCommand.promise.then(function (result) {\n * console.log('result', result);\n * });\n * ```\n */\nclass Command {\n /**\n * Creates an instance of Command.\n * @param name Command name\n * @param args An array of command arguments\n * @param options\n * @param callback The callback that handles the response.\n * If omit, the response will be handled via Promise\n */\n constructor(name, args = [], options = {}, callback) {\n this.name = name;\n this.inTransaction = false;\n this.isResolved = false;\n this.transformed = false;\n this.replyEncoding = options.replyEncoding;\n this.errorStack = options.errorStack;\n this.args = args.flat();\n this.callback = callback;\n this.initPromise();\n if (options.keyPrefix) {\n // @ts-expect-error\n const isBufferKeyPrefix = options.keyPrefix instanceof Buffer;\n // @ts-expect-error\n let keyPrefixBuffer = isBufferKeyPrefix\n ? options.keyPrefix\n : null;\n this._iterateKeys((key) => {\n if (key instanceof Buffer) {\n if (keyPrefixBuffer === null) {\n keyPrefixBuffer = Buffer.from(options.keyPrefix);\n }\n return Buffer.concat([keyPrefixBuffer, key]);\n }\n else if (isBufferKeyPrefix) {\n // @ts-expect-error\n return Buffer.concat([options.keyPrefix, Buffer.from(String(key))]);\n }\n return options.keyPrefix + key;\n });\n }\n if (options.readOnly) {\n this.isReadOnly = true;\n }\n }\n /**\n * Check whether the command has the flag\n */\n static checkFlag(flagName, commandName) {\n return !!this.getFlagMap()[flagName][commandName];\n }\n static setArgumentTransformer(name, func) {\n this._transformer.argument[name] = func;\n }\n static setReplyTransformer(name, func) {\n this._transformer.reply[name] = func;\n }\n static getFlagMap() {\n if (!this.flagMap) {\n this.flagMap = Object.keys(Command.FLAGS).reduce((map, flagName) => {\n map[flagName] = {};\n Command.FLAGS[flagName].forEach((commandName) => {\n map[flagName][commandName] = true;\n });\n return map;\n }, {});\n }\n return this.flagMap;\n }\n getSlot() {\n if (typeof this.slot === \"undefined\") {\n const key = this.getKeys()[0];\n this.slot = key == null ? null : calculateSlot(key);\n }\n return this.slot;\n }\n getKeys() {\n return this._iterateKeys();\n }\n /**\n * Convert command to writable buffer or string\n */\n toWritable(_socket) {\n let result;\n const commandStr = \"*\" +\n (this.args.length + 1) +\n \"\\r\\n$\" +\n Buffer.byteLength(this.name) +\n \"\\r\\n\" +\n this.name +\n \"\\r\\n\";\n if (this.bufferMode) {\n const buffers = new MixedBuffers();\n buffers.push(commandStr);\n for (let i = 0; i < this.args.length; ++i) {\n const arg = this.args[i];\n if (arg instanceof Buffer) {\n if (arg.length === 0) {\n buffers.push(\"$0\\r\\n\\r\\n\");\n }\n else {\n buffers.push(\"$\" + arg.length + \"\\r\\n\");\n buffers.push(arg);\n buffers.push(\"\\r\\n\");\n }\n }\n else {\n buffers.push(\"$\" +\n Buffer.byteLength(arg) +\n \"\\r\\n\" +\n arg +\n \"\\r\\n\");\n }\n }\n result = buffers.toBuffer();\n }\n else {\n result = commandStr;\n for (let i = 0; i < this.args.length; ++i) {\n const arg = this.args[i];\n result +=\n \"$\" +\n Buffer.byteLength(arg) +\n \"\\r\\n\" +\n arg +\n \"\\r\\n\";\n }\n }\n return result;\n }\n stringifyArguments() {\n for (let i = 0; i < this.args.length; ++i) {\n const arg = this.args[i];\n if (typeof arg === \"string\") {\n // buffers and strings don't need any transformation\n }\n else if (arg instanceof Buffer) {\n this.bufferMode = true;\n }\n else {\n this.args[i] = (0, utils_1.toArg)(arg);\n }\n }\n }\n /**\n * Convert buffer/buffer[] to string/string[],\n * and apply reply transformer.\n */\n transformReply(result) {\n if (this.replyEncoding) {\n result = (0, utils_1.convertBufferToString)(result, this.replyEncoding);\n }\n const transformer = Command._transformer.reply[this.name];\n if (transformer) {\n result = transformer(result);\n }\n return result;\n }\n /**\n * Set the wait time before terminating the attempt to execute a command\n * and generating an error.\n */\n setTimeout(ms) {\n if (!this._commandTimeoutTimer) {\n this._commandTimeoutTimer = setTimeout(() => {\n if (!this.isResolved) {\n this.reject(new Error(\"Command timed out\"));\n }\n }, ms);\n }\n }\n initPromise() {\n const promise = new Promise((resolve, reject) => {\n if (!this.transformed) {\n this.transformed = true;\n const transformer = Command._transformer.argument[this.name];\n if (transformer) {\n this.args = transformer(this.args);\n }\n this.stringifyArguments();\n }\n this.resolve = this._convertValue(resolve);\n if (this.errorStack) {\n this.reject = (err) => {\n reject((0, utils_1.optimizeErrorStack)(err, this.errorStack.stack, __dirname));\n };\n }\n else {\n this.reject = reject;\n }\n });\n this.promise = (0, standard_as_callback_1.default)(promise, this.callback);\n }\n /**\n * Iterate through the command arguments that are considered keys.\n */\n _iterateKeys(transform = (key) => key) {\n if (typeof this.keys === \"undefined\") {\n this.keys = [];\n if ((0, commands_1.exists)(this.name)) {\n // @ts-expect-error\n const keyIndexes = (0, commands_1.getKeyIndexes)(this.name, this.args);\n for (const index of keyIndexes) {\n this.args[index] = transform(this.args[index]);\n this.keys.push(this.args[index]);\n }\n }\n }\n return this.keys;\n }\n /**\n * Convert the value from buffer to the target encoding.\n */\n _convertValue(resolve) {\n return (value) => {\n try {\n const existingTimer = this._commandTimeoutTimer;\n if (existingTimer) {\n clearTimeout(existingTimer);\n delete this._commandTimeoutTimer;\n }\n resolve(this.transformReply(value));\n this.isResolved = true;\n }\n catch (err) {\n this.reject(err);\n }\n return this.promise;\n };\n }\n}\nexports.default = Command;\nCommand.FLAGS = {\n VALID_IN_SUBSCRIBER_MODE: [\n \"subscribe\",\n \"psubscribe\",\n \"unsubscribe\",\n \"punsubscribe\",\n \"ssubscribe\",\n \"sunsubscribe\",\n \"ping\",\n \"quit\",\n ],\n VALID_IN_MONITOR_MODE: [\"monitor\", \"auth\"],\n ENTER_SUBSCRIBER_MODE: [\"subscribe\", \"psubscribe\", \"ssubscribe\"],\n EXIT_SUBSCRIBER_MODE: [\"unsubscribe\", \"punsubscribe\", \"sunsubscribe\"],\n WILL_DISCONNECT: [\"quit\"],\n HANDSHAKE_COMMANDS: [\"auth\", \"select\", \"client\", \"readonly\", \"info\"],\n IGNORE_RECONNECT_ON_ERROR: [\"client\"],\n};\nCommand._transformer = {\n argument: {},\n reply: {},\n};\nconst msetArgumentTransformer = function (args) {\n if (args.length === 1) {\n if (args[0] instanceof Map) {\n return (0, utils_1.convertMapToArray)(args[0]);\n }\n if (typeof args[0] === \"object\" && args[0] !== null) {\n return (0, utils_1.convertObjectToArray)(args[0]);\n }\n }\n return args;\n};\nconst hsetArgumentTransformer = function (args) {\n if (args.length === 2) {\n if (args[1] instanceof Map) {\n return [args[0]].concat((0, utils_1.convertMapToArray)(args[1]));\n }\n if (typeof args[1] === \"object\" && args[1] !== null) {\n return [args[0]].concat((0, utils_1.convertObjectToArray)(args[1]));\n }\n }\n return args;\n};\nCommand.setArgumentTransformer(\"mset\", msetArgumentTransformer);\nCommand.setArgumentTransformer(\"msetnx\", msetArgumentTransformer);\nCommand.setArgumentTransformer(\"hset\", hsetArgumentTransformer);\nCommand.setArgumentTransformer(\"hmset\", hsetArgumentTransformer);\nCommand.setReplyTransformer(\"hgetall\", function (result) {\n if (Array.isArray(result)) {\n const obj = {};\n for (let i = 0; i < result.length; i += 2) {\n const key = result[i];\n const value = result[i + 1];\n if (key in obj) {\n // can only be truthy if the property is special somehow, like '__proto__' or 'constructor'\n // https://github.com/luin/ioredis/issues/1267\n Object.defineProperty(obj, key, {\n value,\n configurable: true,\n enumerable: true,\n writable: true,\n });\n }\n else {\n obj[key] = value;\n }\n }\n return obj;\n }\n return result;\n});\nclass MixedBuffers {\n constructor() {\n this.length = 0;\n this.items = [];\n }\n push(x) {\n this.length += Buffer.byteLength(x);\n this.items.push(x);\n }\n toBuffer() {\n const result = Buffer.allocUnsafe(this.length);\n let offset = 0;\n for (const item of this.items) {\n const length = Buffer.byteLength(item);\n Buffer.isBuffer(item)\n ? item.copy(result, offset)\n : result.write(item, offset, length);\n offset += length;\n }\n return result;\n }\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst redis_errors_1 = require(\"redis-errors\");\nclass ClusterAllFailedError extends redis_errors_1.RedisError {\n constructor(message, lastNodeError) {\n super(message);\n this.lastNodeError = lastNodeError;\n Error.captureStackTrace(this, this.constructor);\n }\n get name() {\n return this.constructor.name;\n }\n}\nexports.default = ClusterAllFailedError;\nClusterAllFailedError.defaultMessage = \"Failed to refresh slots cache.\";\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst stream_1 = require(\"stream\");\n/**\n * Convenient class to convert the process of scanning keys to a readable stream.\n */\nclass ScanStream extends stream_1.Readable {\n constructor(opt) {\n super(opt);\n this.opt = opt;\n this._redisCursor = \"0\";\n this._redisDrained = false;\n }\n _read() {\n if (this._redisDrained) {\n this.push(null);\n return;\n }\n const args = [this._redisCursor];\n if (this.opt.key) {\n args.unshift(this.opt.key);\n }\n if (this.opt.match) {\n args.push(\"MATCH\", this.opt.match);\n }\n if (this.opt.type) {\n args.push(\"TYPE\", this.opt.type);\n }\n if (this.opt.count) {\n args.push(\"COUNT\", String(this.opt.count));\n }\n if (this.opt.noValues) {\n args.push(\"NOVALUES\");\n }\n this.opt.redis[this.opt.command](args, (err, res) => {\n if (err) {\n this.emit(\"error\", err);\n return;\n }\n this._redisCursor = res[0] instanceof Buffer ? res[0].toString() : res[0];\n if (this._redisCursor === \"0\") {\n this._redisDrained = true;\n }\n this.push(res[1]);\n });\n }\n close() {\n this._redisDrained = true;\n }\n}\nexports.default = ScanStream;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.executeWithAutoPipelining = exports.getFirstValueInFlattenedArray = exports.shouldUseAutoPipelining = exports.notAllowedAutoPipelineCommands = exports.kCallbacks = exports.kExec = void 0;\nconst lodash_1 = require(\"./utils/lodash\");\nconst calculateSlot = require(\"cluster-key-slot\");\nconst standard_as_callback_1 = require(\"standard-as-callback\");\nexports.kExec = Symbol(\"exec\");\nexports.kCallbacks = Symbol(\"callbacks\");\nexports.notAllowedAutoPipelineCommands = [\n \"auth\",\n \"info\",\n \"script\",\n \"quit\",\n \"cluster\",\n \"pipeline\",\n \"multi\",\n \"subscribe\",\n \"psubscribe\",\n \"unsubscribe\",\n \"unpsubscribe\",\n \"select\",\n \"client\",\n];\nfunction executeAutoPipeline(client, slotKey) {\n /*\n If a pipeline is already executing, keep queueing up commands\n since ioredis won't serve two pipelines at the same time\n */\n if (client._runningAutoPipelines.has(slotKey)) {\n return;\n }\n if (!client._autoPipelines.has(slotKey)) {\n /*\n Rare edge case. Somehow, something has deleted this running autopipeline in an immediate\n call to executeAutoPipeline.\n \n Maybe the callback in the pipeline.exec is sometimes called in the same tick,\n e.g. if redis is disconnected?\n */\n return;\n }\n client._runningAutoPipelines.add(slotKey);\n // Get the pipeline and immediately delete it so that new commands are queued on a new pipeline\n const pipeline = client._autoPipelines.get(slotKey);\n client._autoPipelines.delete(slotKey);\n const callbacks = pipeline[exports.kCallbacks];\n // Stop keeping a reference to callbacks immediately after the callbacks stop being used.\n // This allows the GC to reclaim objects referenced by callbacks, especially with 16384 slots\n // in Redis.Cluster\n pipeline[exports.kCallbacks] = null;\n // Perform the call\n pipeline.exec(function (err, results) {\n client._runningAutoPipelines.delete(slotKey);\n /*\n Invoke all callback in nextTick so the stack is cleared\n and callbacks can throw errors without affecting other callbacks.\n */\n if (err) {\n for (let i = 0; i < callbacks.length; i++) {\n process.nextTick(callbacks[i], err);\n }\n }\n else {\n for (let i = 0; i < callbacks.length; i++) {\n process.nextTick(callbacks[i], ...results[i]);\n }\n }\n // If there is another pipeline on the same node, immediately execute it without waiting for nextTick\n if (client._autoPipelines.has(slotKey)) {\n executeAutoPipeline(client, slotKey);\n }\n });\n}\nfunction shouldUseAutoPipelining(client, functionName, commandName) {\n return (functionName &&\n client.options.enableAutoPipelining &&\n !client.isPipeline &&\n !exports.notAllowedAutoPipelineCommands.includes(commandName) &&\n !client.options.autoPipeliningIgnoredCommands.includes(commandName));\n}\nexports.shouldUseAutoPipelining = shouldUseAutoPipelining;\nfunction getFirstValueInFlattenedArray(args) {\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (typeof arg === \"string\") {\n return arg;\n }\n else if (Array.isArray(arg) || (0, lodash_1.isArguments)(arg)) {\n if (arg.length === 0) {\n continue;\n }\n return arg[0];\n }\n const flattened = [arg].flat();\n if (flattened.length > 0) {\n return flattened[0];\n }\n }\n return undefined;\n}\nexports.getFirstValueInFlattenedArray = getFirstValueInFlattenedArray;\nfunction executeWithAutoPipelining(client, functionName, commandName, args, callback) {\n // On cluster mode let's wait for slots to be available\n if (client.isCluster && !client.slots.length) {\n if (client.status === \"wait\")\n client.connect().catch(lodash_1.noop);\n return (0, standard_as_callback_1.default)(new Promise(function (resolve, reject) {\n client.delayUntilReady((err) => {\n if (err) {\n reject(err);\n return;\n }\n executeWithAutoPipelining(client, functionName, commandName, args, null).then(resolve, reject);\n });\n }), callback);\n }\n // If we have slot information, we can improve routing by grouping slots served by the same subset of nodes\n // Note that the first value in args may be a (possibly empty) array.\n // ioredis will only flatten one level of the array, in the Command constructor.\n const prefix = client.options.keyPrefix || \"\";\n const slotKey = client.isCluster\n ? client.slots[calculateSlot(`${prefix}${getFirstValueInFlattenedArray(args)}`)].join(\",\")\n : \"main\";\n if (!client._autoPipelines.has(slotKey)) {\n const pipeline = client.pipeline();\n pipeline[exports.kExec] = false;\n pipeline[exports.kCallbacks] = [];\n client._autoPipelines.set(slotKey, pipeline);\n }\n const pipeline = client._autoPipelines.get(slotKey);\n /*\n Mark the pipeline as scheduled.\n The symbol will make sure that the pipeline is only scheduled once per tick.\n New commands are appended to an already scheduled pipeline.\n */\n if (!pipeline[exports.kExec]) {\n pipeline[exports.kExec] = true;\n /*\n Deferring with setImmediate so we have a chance to capture multiple\n commands that can be scheduled by I/O events already in the event loop queue.\n */\n setImmediate(executeAutoPipeline, client, slotKey);\n }\n // Create the promise which will execute the command in the pipeline.\n const autoPipelinePromise = new Promise(function (resolve, reject) {\n pipeline[exports.kCallbacks].push(function (err, value) {\n if (err) {\n reject(err);\n return;\n }\n resolve(value);\n });\n if (functionName === \"call\") {\n args.unshift(commandName);\n }\n pipeline[functionName](...args);\n });\n return (0, standard_as_callback_1.default)(autoPipelinePromise, callback);\n}\nexports.executeWithAutoPipelining = executeWithAutoPipelining;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst crypto_1 = require(\"crypto\");\nconst Command_1 = require(\"./Command\");\nconst standard_as_callback_1 = require(\"standard-as-callback\");\nclass Script {\n constructor(lua, numberOfKeys = null, keyPrefix = \"\", readOnly = false) {\n this.lua = lua;\n this.numberOfKeys = numberOfKeys;\n this.keyPrefix = keyPrefix;\n this.readOnly = readOnly;\n this.sha = (0, crypto_1.createHash)(\"sha1\").update(lua).digest(\"hex\");\n const sha = this.sha;\n const socketHasScriptLoaded = new WeakSet();\n this.Command = class CustomScriptCommand extends Command_1.default {\n toWritable(socket) {\n const origReject = this.reject;\n this.reject = (err) => {\n if (err.message.indexOf(\"NOSCRIPT\") !== -1) {\n socketHasScriptLoaded.delete(socket);\n }\n origReject.call(this, err);\n };\n if (!socketHasScriptLoaded.has(socket)) {\n socketHasScriptLoaded.add(socket);\n this.name = \"eval\";\n this.args[0] = lua;\n }\n else if (this.name === \"eval\") {\n this.name = \"evalsha\";\n this.args[0] = sha;\n }\n return super.toWritable(socket);\n }\n };\n }\n execute(container, args, options, callback) {\n if (typeof this.numberOfKeys === \"number\") {\n args.unshift(this.numberOfKeys);\n }\n if (this.keyPrefix) {\n options.keyPrefix = this.keyPrefix;\n }\n if (this.readOnly) {\n options.readOnly = true;\n }\n const evalsha = new this.Command(\"evalsha\", [this.sha, ...args], options);\n evalsha.promise = evalsha.promise.catch((err) => {\n if (err.message.indexOf(\"NOSCRIPT\") === -1) {\n throw err;\n }\n // Resend the same custom evalsha command that gets transformed\n // to an eval in case it's not loaded yet on the connection.\n const resend = new this.Command(\"evalsha\", [this.sha, ...args], options);\n const client = container.isPipeline ? container.redis : container;\n return client.sendCommand(resend);\n });\n (0, standard_as_callback_1.default)(evalsha.promise, callback);\n return container.sendCommand(evalsha);\n }\n}\nexports.default = Script;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst commands_1 = require(\"@ioredis/commands\");\nconst autoPipelining_1 = require(\"../autoPipelining\");\nconst Command_1 = require(\"../Command\");\nconst Script_1 = require(\"../Script\");\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nclass Commander {\n constructor() {\n this.options = {};\n /**\n * @ignore\n */\n this.scriptsSet = {};\n /**\n * @ignore\n */\n this.addedBuiltinSet = new Set();\n }\n /**\n * Return supported builtin commands\n */\n getBuiltinCommands() {\n return commands.slice(0);\n }\n /**\n * Create a builtin command\n */\n createBuiltinCommand(commandName) {\n return {\n string: generateFunction(null, commandName, \"utf8\"),\n buffer: generateFunction(null, commandName, null),\n };\n }\n /**\n * Create add builtin command\n */\n addBuiltinCommand(commandName) {\n this.addedBuiltinSet.add(commandName);\n this[commandName] = generateFunction(commandName, commandName, \"utf8\");\n this[commandName + \"Buffer\"] = generateFunction(commandName + \"Buffer\", commandName, null);\n }\n /**\n * Define a custom command using lua script\n */\n defineCommand(name, definition) {\n const script = new Script_1.default(definition.lua, definition.numberOfKeys, this.options.keyPrefix, definition.readOnly);\n this.scriptsSet[name] = script;\n this[name] = generateScriptingFunction(name, name, script, \"utf8\");\n this[name + \"Buffer\"] = generateScriptingFunction(name + \"Buffer\", name, script, null);\n }\n /**\n * @ignore\n */\n sendCommand(command, stream, node) {\n throw new Error('\"sendCommand\" is not implemented');\n }\n}\nconst commands = commands_1.list.filter((command) => command !== \"monitor\");\ncommands.push(\"sentinel\");\ncommands.forEach(function (commandName) {\n Commander.prototype[commandName] = generateFunction(commandName, commandName, \"utf8\");\n Commander.prototype[commandName + \"Buffer\"] = generateFunction(commandName + \"Buffer\", commandName, null);\n});\nCommander.prototype.call = generateFunction(\"call\", \"utf8\");\nCommander.prototype.callBuffer = generateFunction(\"callBuffer\", null);\n// @ts-expect-error\nCommander.prototype.send_command = Commander.prototype.call;\nfunction generateFunction(functionName, _commandName, _encoding) {\n if (typeof _encoding === \"undefined\") {\n _encoding = _commandName;\n _commandName = null;\n }\n return function (...args) {\n const commandName = (_commandName || args.shift());\n let callback = args[args.length - 1];\n if (typeof callback === \"function\") {\n args.pop();\n }\n else {\n callback = undefined;\n }\n const options = {\n errorStack: this.options.showFriendlyErrorStack ? new Error() : undefined,\n keyPrefix: this.options.keyPrefix,\n replyEncoding: _encoding,\n };\n // No auto pipeline, use regular command sending\n if (!(0, autoPipelining_1.shouldUseAutoPipelining)(this, functionName, commandName)) {\n return this.sendCommand(\n // @ts-expect-error\n new Command_1.default(commandName, args, options, callback));\n }\n // Create a new pipeline and make sure it's scheduled\n return (0, autoPipelining_1.executeWithAutoPipelining)(this, functionName, commandName, \n // @ts-expect-error\n args, callback);\n };\n}\nfunction generateScriptingFunction(functionName, commandName, script, encoding) {\n return function (...args) {\n const callback = typeof args[args.length - 1] === \"function\" ? args.pop() : undefined;\n const options = {\n replyEncoding: encoding,\n };\n if (this.options.showFriendlyErrorStack) {\n options.errorStack = new Error();\n }\n // No auto pipeline, use regular command sending\n if (!(0, autoPipelining_1.shouldUseAutoPipelining)(this, functionName, commandName)) {\n return script.execute(this, args, options, callback);\n }\n // Create a new pipeline and make sure it's scheduled\n return (0, autoPipelining_1.executeWithAutoPipelining)(this, functionName, commandName, args, callback);\n };\n}\nexports.default = Commander;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst calculateSlot = require(\"cluster-key-slot\");\nconst commands_1 = require(\"@ioredis/commands\");\nconst standard_as_callback_1 = require(\"standard-as-callback\");\nconst util_1 = require(\"util\");\nconst Command_1 = require(\"./Command\");\nconst utils_1 = require(\"./utils\");\nconst Commander_1 = require(\"./utils/Commander\");\n/*\n This function derives from the cluster-key-slot implementation.\n Instead of checking that all keys have the same slot, it checks that all slots are served by the same set of nodes.\n If this is satisfied, it returns the first key's slot.\n*/\nfunction generateMultiWithNodes(redis, keys) {\n const slot = calculateSlot(keys[0]);\n const target = redis._groupsBySlot[slot];\n for (let i = 1; i < keys.length; i++) {\n if (redis._groupsBySlot[calculateSlot(keys[i])] !== target) {\n return -1;\n }\n }\n return slot;\n}\nclass Pipeline extends Commander_1.default {\n constructor(redis) {\n super();\n this.redis = redis;\n this.isPipeline = true;\n this.replyPending = 0;\n this._queue = [];\n this._result = [];\n this._transactions = 0;\n this._shaToScript = {};\n this.isCluster =\n this.redis.constructor.name === \"Cluster\" || this.redis.isCluster;\n this.options = redis.options;\n Object.keys(redis.scriptsSet).forEach((name) => {\n const script = redis.scriptsSet[name];\n this._shaToScript[script.sha] = script;\n this[name] = redis[name];\n this[name + \"Buffer\"] = redis[name + \"Buffer\"];\n });\n redis.addedBuiltinSet.forEach((name) => {\n this[name] = redis[name];\n this[name + \"Buffer\"] = redis[name + \"Buffer\"];\n });\n this.promise = new Promise((resolve, reject) => {\n this.resolve = resolve;\n this.reject = reject;\n });\n const _this = this;\n Object.defineProperty(this, \"length\", {\n get: function () {\n return _this._queue.length;\n },\n });\n }\n fillResult(value, position) {\n if (this._queue[position].name === \"exec\" && Array.isArray(value[1])) {\n const execLength = value[1].length;\n for (let i = 0; i < execLength; i++) {\n if (value[1][i] instanceof Error) {\n continue;\n }\n const cmd = this._queue[position - (execLength - i)];\n try {\n value[1][i] = cmd.transformReply(value[1][i]);\n }\n catch (err) {\n value[1][i] = err;\n }\n }\n }\n this._result[position] = value;\n if (--this.replyPending) {\n return;\n }\n if (this.isCluster) {\n let retriable = true;\n let commonError;\n for (let i = 0; i < this._result.length; ++i) {\n const error = this._result[i][0];\n const command = this._queue[i];\n if (error) {\n if (command.name === \"exec\" &&\n error.message ===\n \"EXECABORT Transaction discarded because of previous errors.\") {\n continue;\n }\n if (!commonError) {\n commonError = {\n name: error.name,\n message: error.message,\n };\n }\n else if (commonError.name !== error.name ||\n commonError.message !== error.message) {\n retriable = false;\n break;\n }\n }\n else if (!command.inTransaction) {\n const isReadOnly = (0, commands_1.exists)(command.name) && (0, commands_1.hasFlag)(command.name, \"readonly\");\n if (!isReadOnly) {\n retriable = false;\n break;\n }\n }\n }\n if (commonError && retriable) {\n const _this = this;\n const errv = commonError.message.split(\" \");\n const queue = this._queue;\n let inTransaction = false;\n this._queue = [];\n for (let i = 0; i < queue.length; ++i) {\n if (errv[0] === \"ASK\" &&\n !inTransaction &&\n queue[i].name !== \"asking\" &&\n (!queue[i - 1] || queue[i - 1].name !== \"asking\")) {\n const asking = new Command_1.default(\"asking\");\n asking.ignore = true;\n this.sendCommand(asking);\n }\n queue[i].initPromise();\n this.sendCommand(queue[i]);\n inTransaction = queue[i].inTransaction;\n }\n let matched = true;\n if (typeof this.leftRedirections === \"undefined\") {\n this.leftRedirections = {};\n }\n const exec = function () {\n _this.exec();\n };\n const cluster = this.redis;\n cluster.handleError(commonError, this.leftRedirections, {\n moved: function (_slot, key) {\n _this.preferKey = key;\n cluster.slots[errv[1]] = [key];\n cluster._groupsBySlot[errv[1]] =\n cluster._groupsIds[cluster.slots[errv[1]].join(\";\")];\n cluster.refreshSlotsCache();\n _this.exec();\n },\n ask: function (_slot, key) {\n _this.preferKey = key;\n _this.exec();\n },\n tryagain: exec,\n clusterDown: exec,\n connectionClosed: exec,\n maxRedirections: () => {\n matched = false;\n },\n defaults: () => {\n matched = false;\n },\n });\n if (matched) {\n return;\n }\n }\n }\n let ignoredCount = 0;\n for (let i = 0; i < this._queue.length - ignoredCount; ++i) {\n if (this._queue[i + ignoredCount].ignore) {\n ignoredCount += 1;\n }\n this._result[i] = this._result[i + ignoredCount];\n }\n this.resolve(this._result.slice(0, this._result.length - ignoredCount));\n }\n sendCommand(command) {\n if (this._transactions > 0) {\n command.inTransaction = true;\n }\n const position = this._queue.length;\n command.pipelineIndex = position;\n command.promise\n .then((result) => {\n this.fillResult([null, result], position);\n })\n .catch((error) => {\n this.fillResult([error], position);\n });\n this._queue.push(command);\n return this;\n }\n addBatch(commands) {\n let command, commandName, args;\n for (let i = 0; i < commands.length; ++i) {\n command = commands[i];\n commandName = command[0];\n args = command.slice(1);\n this[commandName].apply(this, args);\n }\n return this;\n }\n}\nexports.default = Pipeline;\n// @ts-expect-error\nconst multi = Pipeline.prototype.multi;\n// @ts-expect-error\nPipeline.prototype.multi = function () {\n this._transactions += 1;\n return multi.apply(this, arguments);\n};\n// @ts-expect-error\nconst execBuffer = Pipeline.prototype.execBuffer;\n// @ts-expect-error\nPipeline.prototype.execBuffer = (0, util_1.deprecate)(function () {\n if (this._transactions > 0) {\n this._transactions -= 1;\n }\n return execBuffer.apply(this, arguments);\n}, \"Pipeline#execBuffer: Use Pipeline#exec instead\");\n// NOTE: To avoid an unhandled promise rejection, this will unconditionally always return this.promise,\n// which always has the rejection handled by standard-as-callback\n// adding the provided rejection callback.\n//\n// If a different promise instance were returned, that promise would cause its own unhandled promise rejection\n// errors, even if that promise unconditionally resolved to **the resolved value of** this.promise.\nPipeline.prototype.exec = function (callback) {\n // Wait for the cluster to be connected, since we need nodes information before continuing\n if (this.isCluster && !this.redis.slots.length) {\n if (this.redis.status === \"wait\")\n this.redis.connect().catch(utils_1.noop);\n if (callback && !this.nodeifiedPromise) {\n this.nodeifiedPromise = true;\n (0, standard_as_callback_1.default)(this.promise, callback);\n }\n this.redis.delayUntilReady((err) => {\n if (err) {\n this.reject(err);\n return;\n }\n this.exec(callback);\n });\n return this.promise;\n }\n if (this._transactions > 0) {\n this._transactions -= 1;\n return execBuffer.apply(this, arguments);\n }\n if (!this.nodeifiedPromise) {\n this.nodeifiedPromise = true;\n (0, standard_as_callback_1.default)(this.promise, callback);\n }\n if (!this._queue.length) {\n this.resolve([]);\n }\n let pipelineSlot;\n if (this.isCluster) {\n // List of the first key for each command\n const sampleKeys = [];\n for (let i = 0; i < this._queue.length; i++) {\n const keys = this._queue[i].getKeys();\n if (keys.length) {\n sampleKeys.push(keys[0]);\n }\n // For each command, check that the keys belong to the same slot\n if (keys.length && calculateSlot.generateMulti(keys) < 0) {\n this.reject(new Error(\"All the keys in a pipeline command should belong to the same slot\"));\n return this.promise;\n }\n }\n if (sampleKeys.length) {\n pipelineSlot = generateMultiWithNodes(this.redis, sampleKeys);\n if (pipelineSlot < 0) {\n this.reject(new Error(\"All keys in the pipeline should belong to the same slots allocation group\"));\n return this.promise;\n }\n }\n else {\n // Send the pipeline to a random node\n pipelineSlot = (Math.random() * 16384) | 0;\n }\n }\n const _this = this;\n execPipeline();\n return this.promise;\n function execPipeline() {\n let writePending = (_this.replyPending = _this._queue.length);\n let node;\n if (_this.isCluster) {\n node = {\n slot: pipelineSlot,\n redis: _this.redis.connectionPool.nodes.all[_this.preferKey],\n };\n }\n let data = \"\";\n let buffers;\n const stream = {\n isPipeline: true,\n destination: _this.isCluster ? node : { redis: _this.redis },\n write(writable) {\n if (typeof writable !== \"string\") {\n if (!buffers) {\n buffers = [];\n }\n if (data) {\n buffers.push(Buffer.from(data, \"utf8\"));\n data = \"\";\n }\n buffers.push(writable);\n }\n else {\n data += writable;\n }\n if (!--writePending) {\n if (buffers) {\n if (data) {\n buffers.push(Buffer.from(data, \"utf8\"));\n }\n stream.destination.redis.stream.write(Buffer.concat(buffers));\n }\n else {\n stream.destination.redis.stream.write(data);\n }\n // Reset writePending for resending\n writePending = _this._queue.length;\n data = \"\";\n buffers = undefined;\n }\n },\n };\n for (let i = 0; i < _this._queue.length; ++i) {\n _this.redis.sendCommand(_this._queue[i], stream, node);\n }\n return _this.promise;\n }\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.addTransactionSupport = void 0;\nconst utils_1 = require(\"./utils\");\nconst standard_as_callback_1 = require(\"standard-as-callback\");\nconst Pipeline_1 = require(\"./Pipeline\");\nfunction addTransactionSupport(redis) {\n redis.pipeline = function (commands) {\n const pipeline = new Pipeline_1.default(this);\n if (Array.isArray(commands)) {\n pipeline.addBatch(commands);\n }\n return pipeline;\n };\n const { multi } = redis;\n redis.multi = function (commands, options) {\n if (typeof options === \"undefined\" && !Array.isArray(commands)) {\n options = commands;\n commands = null;\n }\n if (options && options.pipeline === false) {\n return multi.call(this);\n }\n const pipeline = new Pipeline_1.default(this);\n // @ts-expect-error\n pipeline.multi();\n if (Array.isArray(commands)) {\n pipeline.addBatch(commands);\n }\n const exec = pipeline.exec;\n pipeline.exec = function (callback) {\n // Wait for the cluster to be connected, since we need nodes information before continuing\n if (this.isCluster && !this.redis.slots.length) {\n if (this.redis.status === \"wait\")\n this.redis.connect().catch(utils_1.noop);\n return (0, standard_as_callback_1.default)(new Promise((resolve, reject) => {\n this.redis.delayUntilReady((err) => {\n if (err) {\n reject(err);\n return;\n }\n this.exec(pipeline).then(resolve, reject);\n });\n }), callback);\n }\n if (this._transactions > 0) {\n exec.call(pipeline);\n }\n // Returns directly when the pipeline\n // has been called multiple times (retries).\n if (this.nodeifiedPromise) {\n return exec.call(pipeline);\n }\n const promise = exec.call(pipeline);\n return (0, standard_as_callback_1.default)(promise.then(function (result) {\n const execResult = result[result.length - 1];\n if (typeof execResult === \"undefined\") {\n throw new Error(\"Pipeline cannot be used to send any commands when the `exec()` has been called on it.\");\n }\n if (execResult[0]) {\n execResult[0].previousErrors = [];\n for (let i = 0; i < result.length - 1; ++i) {\n if (result[i][0]) {\n execResult[0].previousErrors.push(result[i][0]);\n }\n }\n throw execResult[0];\n }\n return (0, utils_1.wrapMultiResult)(execResult[1]);\n }), callback);\n };\n // @ts-expect-error\n const { execBuffer } = pipeline;\n // @ts-expect-error\n pipeline.execBuffer = function (callback) {\n if (this._transactions > 0) {\n execBuffer.call(pipeline);\n }\n return pipeline.exec(callback);\n };\n return pipeline;\n };\n const { exec } = redis;\n redis.exec = function (callback) {\n return (0, standard_as_callback_1.default)(exec.call(this).then(function (results) {\n if (Array.isArray(results)) {\n results = (0, utils_1.wrapMultiResult)(results);\n }\n return results;\n }), callback);\n };\n}\nexports.addTransactionSupport = addTransactionSupport;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nfunction applyMixin(derivedConstructor, mixinConstructor) {\n Object.getOwnPropertyNames(mixinConstructor.prototype).forEach((name) => {\n Object.defineProperty(derivedConstructor.prototype, name, Object.getOwnPropertyDescriptor(mixinConstructor.prototype, name));\n });\n}\nexports.default = applyMixin;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DEFAULT_CLUSTER_OPTIONS = void 0;\nconst dns_1 = require(\"dns\");\nexports.DEFAULT_CLUSTER_OPTIONS = {\n clusterRetryStrategy: (times) => Math.min(100 + times * 2, 2000),\n enableOfflineQueue: true,\n enableReadyCheck: true,\n scaleReads: \"master\",\n maxRedirections: 16,\n retryDelayOnMoved: 0,\n retryDelayOnFailover: 100,\n retryDelayOnClusterDown: 100,\n retryDelayOnTryAgain: 100,\n slotsRefreshTimeout: 1000,\n useSRVRecords: false,\n resolveSrv: dns_1.resolveSrv,\n dnsLookup: dns_1.lookup,\n enableAutoPipelining: false,\n autoPipeliningIgnoredCommands: [],\n shardedSubscribers: false,\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getConnectionName = exports.weightSrvRecords = exports.groupSrvRecords = exports.getUniqueHostnamesFromOptions = exports.normalizeNodeOptions = exports.nodeKeyToRedisOptions = exports.getNodeKey = void 0;\nconst utils_1 = require(\"../utils\");\nconst net_1 = require(\"net\");\nfunction getNodeKey(node) {\n node.port = node.port || 6379;\n node.host = node.host || \"127.0.0.1\";\n return node.host + \":\" + node.port;\n}\nexports.getNodeKey = getNodeKey;\nfunction nodeKeyToRedisOptions(nodeKey) {\n const portIndex = nodeKey.lastIndexOf(\":\");\n if (portIndex === -1) {\n throw new Error(`Invalid node key ${nodeKey}`);\n }\n return {\n host: nodeKey.slice(0, portIndex),\n port: Number(nodeKey.slice(portIndex + 1)),\n };\n}\nexports.nodeKeyToRedisOptions = nodeKeyToRedisOptions;\nfunction normalizeNodeOptions(nodes) {\n return nodes.map((node) => {\n const options = {};\n if (typeof node === \"object\") {\n Object.assign(options, node);\n }\n else if (typeof node === \"string\") {\n Object.assign(options, (0, utils_1.parseURL)(node));\n }\n else if (typeof node === \"number\") {\n options.port = node;\n }\n else {\n throw new Error(\"Invalid argument \" + node);\n }\n if (typeof options.port === \"string\") {\n options.port = parseInt(options.port, 10);\n }\n // Cluster mode only support db 0\n delete options.db;\n if (!options.port) {\n options.port = 6379;\n }\n if (!options.host) {\n options.host = \"127.0.0.1\";\n }\n return (0, utils_1.resolveTLSProfile)(options);\n });\n}\nexports.normalizeNodeOptions = normalizeNodeOptions;\nfunction getUniqueHostnamesFromOptions(nodes) {\n const uniqueHostsMap = {};\n nodes.forEach((node) => {\n uniqueHostsMap[node.host] = true;\n });\n return Object.keys(uniqueHostsMap).filter((host) => !(0, net_1.isIP)(host));\n}\nexports.getUniqueHostnamesFromOptions = getUniqueHostnamesFromOptions;\nfunction groupSrvRecords(records) {\n const recordsByPriority = {};\n for (const record of records) {\n if (!recordsByPriority.hasOwnProperty(record.priority)) {\n recordsByPriority[record.priority] = {\n totalWeight: record.weight,\n records: [record],\n };\n }\n else {\n recordsByPriority[record.priority].totalWeight += record.weight;\n recordsByPriority[record.priority].records.push(record);\n }\n }\n return recordsByPriority;\n}\nexports.groupSrvRecords = groupSrvRecords;\nfunction weightSrvRecords(recordsGroup) {\n if (recordsGroup.records.length === 1) {\n recordsGroup.totalWeight = 0;\n return recordsGroup.records.shift();\n }\n // + `recordsGroup.records.length` to support `weight` 0\n const random = Math.floor(Math.random() * (recordsGroup.totalWeight + recordsGroup.records.length));\n let total = 0;\n for (const [i, record] of recordsGroup.records.entries()) {\n total += 1 + record.weight;\n if (total > random) {\n recordsGroup.totalWeight -= record.weight;\n recordsGroup.records.splice(i, 1);\n return record;\n }\n }\n}\nexports.weightSrvRecords = weightSrvRecords;\nfunction getConnectionName(component, nodeConnectionName) {\n const prefix = `ioredis-cluster(${component})`;\n return nodeConnectionName ? `${prefix}:${nodeConnectionName}` : prefix;\n}\nexports.getConnectionName = getConnectionName;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst util_1 = require(\"./util\");\nconst utils_1 = require(\"../utils\");\nconst Redis_1 = require(\"../Redis\");\nconst debug = (0, utils_1.Debug)(\"cluster:subscriber\");\nclass ClusterSubscriber {\n constructor(connectionPool, emitter, isSharded = false) {\n this.connectionPool = connectionPool;\n this.emitter = emitter;\n this.isSharded = isSharded;\n this.started = false;\n //There is only one connection for the entire pool\n this.subscriber = null;\n //The slot range for which this subscriber is responsible\n this.slotRange = [];\n this.onSubscriberEnd = () => {\n if (!this.started) {\n debug(\"subscriber has disconnected, but ClusterSubscriber is not started, so not reconnecting.\");\n return;\n }\n // If the subscriber closes whilst it's still the active connection,\n // we might as well try to connecting to a new node if possible to\n // minimise the number of missed publishes.\n debug(\"subscriber has disconnected, selecting a new one...\");\n this.selectSubscriber();\n };\n // If the current node we're using as the subscriber disappears\n // from the node pool for some reason, we will select a new one\n // to connect to.\n // Note that this event is only triggered if the connection to\n // the node has been used; cluster subscriptions are setup with\n // lazyConnect = true. It's possible for the subscriber node to\n // disappear without this method being called!\n // See https://github.com/luin/ioredis/pull/1589\n this.connectionPool.on(\"-node\", (_, key) => {\n if (!this.started || !this.subscriber) {\n return;\n }\n if ((0, util_1.getNodeKey)(this.subscriber.options) === key) {\n debug(\"subscriber has left, selecting a new one...\");\n this.selectSubscriber();\n }\n });\n this.connectionPool.on(\"+node\", () => {\n if (!this.started || this.subscriber) {\n return;\n }\n debug(\"a new node is discovered and there is no subscriber, selecting a new one...\");\n this.selectSubscriber();\n });\n }\n getInstance() {\n return this.subscriber;\n }\n /**\n * Associate this subscriber to a specific slot range.\n *\n * Returns the range or an empty array if the slot range couldn't be associated.\n *\n * BTW: This is more for debugging and testing purposes.\n *\n * @param range\n */\n associateSlotRange(range) {\n if (this.isSharded) {\n this.slotRange = range;\n }\n return this.slotRange;\n }\n start() {\n this.started = true;\n this.selectSubscriber();\n debug(\"started\");\n }\n stop() {\n this.started = false;\n if (this.subscriber) {\n this.subscriber.disconnect();\n this.subscriber = null;\n }\n }\n isStarted() {\n return this.started;\n }\n selectSubscriber() {\n const lastActiveSubscriber = this.lastActiveSubscriber;\n // Disconnect the previous subscriber even if there\n // will not be a new one.\n if (lastActiveSubscriber) {\n lastActiveSubscriber.off(\"end\", this.onSubscriberEnd);\n lastActiveSubscriber.disconnect();\n }\n if (this.subscriber) {\n this.subscriber.off(\"end\", this.onSubscriberEnd);\n this.subscriber.disconnect();\n }\n const sampleNode = (0, utils_1.sample)(this.connectionPool.getNodes());\n if (!sampleNode) {\n debug(\"selecting subscriber failed since there is no node discovered in the cluster yet\");\n this.subscriber = null;\n return;\n }\n const { options } = sampleNode;\n debug(\"selected a subscriber %s:%s\", options.host, options.port);\n /*\n * Create a specialized Redis connection for the subscription.\n * Note that auto reconnection is enabled here.\n *\n * `enableReadyCheck` is also enabled because although subscription is allowed\n * while redis is loading data from the disk, we can check if the password\n * provided for the subscriber is correct, and if not, the current subscriber\n * will be disconnected and a new subscriber will be selected.\n */\n let connectionPrefix = \"subscriber\";\n if (this.isSharded)\n connectionPrefix = \"ssubscriber\";\n this.subscriber = new Redis_1.default({\n port: options.port,\n host: options.host,\n username: options.username,\n password: options.password,\n enableReadyCheck: true,\n connectionName: (0, util_1.getConnectionName)(connectionPrefix, options.connectionName),\n lazyConnect: true,\n tls: options.tls,\n // Don't try to reconnect the subscriber connection. If the connection fails\n // we will get an end event (handled below), at which point we'll pick a new\n // node from the pool and try to connect to that as the subscriber connection.\n retryStrategy: null,\n });\n // Ignore the errors since they're handled in the connection pool.\n this.subscriber.on(\"error\", utils_1.noop);\n this.subscriber.on(\"moved\", () => {\n this.emitter.emit(\"forceRefresh\");\n });\n // The node we lost connection to may not come back up in a\n // reasonable amount of time (e.g. a slave that's taken down\n // for maintainence), we could potentially miss many published\n // messages so we should reconnect as quickly as possible, to\n // a different node if needed.\n this.subscriber.once(\"end\", this.onSubscriberEnd);\n // Re-subscribe previous channels\n const previousChannels = { subscribe: [], psubscribe: [], ssubscribe: [] };\n if (lastActiveSubscriber) {\n const condition = lastActiveSubscriber.condition || lastActiveSubscriber.prevCondition;\n if (condition && condition.subscriber) {\n previousChannels.subscribe = condition.subscriber.channels(\"subscribe\");\n previousChannels.psubscribe =\n condition.subscriber.channels(\"psubscribe\");\n previousChannels.ssubscribe =\n condition.subscriber.channels(\"ssubscribe\");\n }\n }\n if (previousChannels.subscribe.length ||\n previousChannels.psubscribe.length ||\n previousChannels.ssubscribe.length) {\n let pending = 0;\n for (const type of [\"subscribe\", \"psubscribe\", \"ssubscribe\"]) {\n const channels = previousChannels[type];\n if (channels.length == 0) {\n continue;\n }\n debug(\"%s %d channels\", type, channels.length);\n if (type === \"ssubscribe\") {\n for (const channel of channels) {\n pending += 1;\n this.subscriber[type](channel)\n .then(() => {\n if (!--pending) {\n this.lastActiveSubscriber = this.subscriber;\n }\n })\n .catch(() => {\n // TODO: should probably disconnect the subscriber and try again.\n debug(\"failed to ssubscribe to channel: %s\", channel);\n });\n }\n }\n else {\n pending += 1;\n this.subscriber[type](channels)\n .then(() => {\n if (!--pending) {\n this.lastActiveSubscriber = this.subscriber;\n }\n })\n .catch(() => {\n // TODO: should probably disconnect the subscriber and try again.\n debug(\"failed to %s %d channels\", type, channels.length);\n });\n }\n }\n }\n else {\n this.lastActiveSubscriber = this.subscriber;\n }\n for (const event of [\n \"message\",\n \"messageBuffer\",\n ]) {\n this.subscriber.on(event, (arg1, arg2) => {\n this.emitter.emit(event, arg1, arg2);\n });\n }\n for (const event of [\"pmessage\", \"pmessageBuffer\"]) {\n this.subscriber.on(event, (arg1, arg2, arg3) => {\n this.emitter.emit(event, arg1, arg2, arg3);\n });\n }\n if (this.isSharded == true) {\n for (const event of [\n \"smessage\",\n \"smessageBuffer\",\n ]) {\n this.subscriber.on(event, (arg1, arg2) => {\n this.emitter.emit(event, arg1, arg2);\n });\n }\n }\n }\n}\nexports.default = ClusterSubscriber;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst events_1 = require(\"events\");\nconst utils_1 = require(\"../utils\");\nconst util_1 = require(\"./util\");\nconst Redis_1 = require(\"../Redis\");\nconst debug = (0, utils_1.Debug)(\"cluster:connectionPool\");\nclass ConnectionPool extends events_1.EventEmitter {\n constructor(redisOptions) {\n super();\n this.redisOptions = redisOptions;\n // master + slave = all\n this.nodes = {\n all: {},\n master: {},\n slave: {},\n };\n this.specifiedOptions = {};\n }\n getNodes(role = \"all\") {\n const nodes = this.nodes[role];\n return Object.keys(nodes).map((key) => nodes[key]);\n }\n getInstanceByKey(key) {\n return this.nodes.all[key];\n }\n getSampleInstance(role) {\n const keys = Object.keys(this.nodes[role]);\n const sampleKey = (0, utils_1.sample)(keys);\n return this.nodes[role][sampleKey];\n }\n /**\n * Add a master node to the pool\n * @param node\n */\n addMasterNode(node) {\n const key = (0, util_1.getNodeKey)(node.options);\n const redis = this.createRedisFromOptions(node, node.options.readOnly);\n //Master nodes aren't read-only\n if (!node.options.readOnly) {\n this.nodes.all[key] = redis;\n this.nodes.master[key] = redis;\n return true;\n }\n return false;\n }\n /**\n * Creates a Redis connection instance from the node options\n * @param node\n * @param readOnly\n */\n createRedisFromOptions(node, readOnly) {\n const redis = new Redis_1.default((0, utils_1.defaults)({\n // Never try to reconnect when a node is lose,\n // instead, waiting for a `MOVED` error and\n // fetch the slots again.\n retryStrategy: null,\n // Offline queue should be enabled so that\n // we don't need to wait for the `ready` event\n // before sending commands to the node.\n enableOfflineQueue: true,\n readOnly: readOnly,\n }, node, this.redisOptions, { lazyConnect: true }));\n return redis;\n }\n /**\n * Find or create a connection to the node\n */\n findOrCreate(node, readOnly = false) {\n const key = (0, util_1.getNodeKey)(node);\n readOnly = Boolean(readOnly);\n if (this.specifiedOptions[key]) {\n Object.assign(node, this.specifiedOptions[key]);\n }\n else {\n this.specifiedOptions[key] = node;\n }\n let redis;\n if (this.nodes.all[key]) {\n redis = this.nodes.all[key];\n if (redis.options.readOnly !== readOnly) {\n redis.options.readOnly = readOnly;\n debug(\"Change role of %s to %s\", key, readOnly ? \"slave\" : \"master\");\n redis[readOnly ? \"readonly\" : \"readwrite\"]().catch(utils_1.noop);\n if (readOnly) {\n delete this.nodes.master[key];\n this.nodes.slave[key] = redis;\n }\n else {\n delete this.nodes.slave[key];\n this.nodes.master[key] = redis;\n }\n }\n }\n else {\n debug(\"Connecting to %s as %s\", key, readOnly ? \"slave\" : \"master\");\n redis = this.createRedisFromOptions(node, readOnly);\n this.nodes.all[key] = redis;\n this.nodes[readOnly ? \"slave\" : \"master\"][key] = redis;\n redis.once(\"end\", () => {\n this.removeNode(key);\n this.emit(\"-node\", redis, key);\n if (!Object.keys(this.nodes.all).length) {\n this.emit(\"drain\");\n }\n });\n this.emit(\"+node\", redis, key);\n redis.on(\"error\", function (error) {\n this.emit(\"nodeError\", error, key);\n });\n }\n return redis;\n }\n /**\n * Reset the pool with a set of nodes.\n * The old node will be removed.\n */\n reset(nodes) {\n debug(\"Reset with %O\", nodes);\n const newNodes = {};\n nodes.forEach((node) => {\n const key = (0, util_1.getNodeKey)(node);\n // Don't override the existing (master) node\n // when the current one is slave.\n if (!(node.readOnly && newNodes[key])) {\n newNodes[key] = node;\n }\n });\n Object.keys(this.nodes.all).forEach((key) => {\n if (!newNodes[key]) {\n debug(\"Disconnect %s because the node does not hold any slot\", key);\n this.nodes.all[key].disconnect();\n this.removeNode(key);\n }\n });\n Object.keys(newNodes).forEach((key) => {\n const node = newNodes[key];\n this.findOrCreate(node, node.readOnly);\n });\n }\n /**\n * Remove a node from the pool.\n */\n removeNode(key) {\n const { nodes } = this;\n if (nodes.all[key]) {\n debug(\"Remove %s from the pool\", key);\n delete nodes.all[key];\n }\n delete nodes.master[key];\n delete nodes.slave[key];\n }\n}\nexports.default = ConnectionPool;\n","'use strict';\n\n/**\n * Custom implementation of a double ended queue.\n */\nfunction Denque(array, options) {\n var options = options || {};\n this._capacity = options.capacity;\n\n this._head = 0;\n this._tail = 0;\n\n if (Array.isArray(array)) {\n this._fromArray(array);\n } else {\n this._capacityMask = 0x3;\n this._list = new Array(4);\n }\n}\n\n/**\n * --------------\n * PUBLIC API\n * -------------\n */\n\n/**\n * Returns the item at the specified index from the list.\n * 0 is the first element, 1 is the second, and so on...\n * Elements at negative values are that many from the end: -1 is one before the end\n * (the last element), -2 is two before the end (one before last), etc.\n * @param index\n * @returns {*}\n */\nDenque.prototype.peekAt = function peekAt(index) {\n var i = index;\n // expect a number or return undefined\n if ((i !== (i | 0))) {\n return void 0;\n }\n var len = this.size();\n if (i >= len || i < -len) return undefined;\n if (i < 0) i += len;\n i = (this._head + i) & this._capacityMask;\n return this._list[i];\n};\n\n/**\n * Alias for peekAt()\n * @param i\n * @returns {*}\n */\nDenque.prototype.get = function get(i) {\n return this.peekAt(i);\n};\n\n/**\n * Returns the first item in the list without removing it.\n * @returns {*}\n */\nDenque.prototype.peek = function peek() {\n if (this._head === this._tail) return undefined;\n return this._list[this._head];\n};\n\n/**\n * Alias for peek()\n * @returns {*}\n */\nDenque.prototype.peekFront = function peekFront() {\n return this.peek();\n};\n\n/**\n * Returns the item that is at the back of the queue without removing it.\n * Uses peekAt(-1)\n */\nDenque.prototype.peekBack = function peekBack() {\n return this.peekAt(-1);\n};\n\n/**\n * Returns the current length of the queue\n * @return {Number}\n */\nObject.defineProperty(Denque.prototype, 'length', {\n get: function length() {\n return this.size();\n }\n});\n\n/**\n * Return the number of items on the list, or 0 if empty.\n * @returns {number}\n */\nDenque.prototype.size = function size() {\n if (this._head === this._tail) return 0;\n if (this._head < this._tail) return this._tail - this._head;\n else return this._capacityMask + 1 - (this._head - this._tail);\n};\n\n/**\n * Add an item at the beginning of the list.\n * @param item\n */\nDenque.prototype.unshift = function unshift(item) {\n if (arguments.length === 0) return this.size();\n var len = this._list.length;\n this._head = (this._head - 1 + len) & this._capacityMask;\n this._list[this._head] = item;\n if (this._tail === this._head) this._growArray();\n if (this._capacity && this.size() > this._capacity) this.pop();\n if (this._head < this._tail) return this._tail - this._head;\n else return this._capacityMask + 1 - (this._head - this._tail);\n};\n\n/**\n * Remove and return the first item on the list,\n * Returns undefined if the list is empty.\n * @returns {*}\n */\nDenque.prototype.shift = function shift() {\n var head = this._head;\n if (head === this._tail) return undefined;\n var item = this._list[head];\n this._list[head] = undefined;\n this._head = (head + 1) & this._capacityMask;\n if (head < 2 && this._tail > 10000 && this._tail <= this._list.length >>> 2) this._shrinkArray();\n return item;\n};\n\n/**\n * Add an item to the bottom of the list.\n * @param item\n */\nDenque.prototype.push = function push(item) {\n if (arguments.length === 0) return this.size();\n var tail = this._tail;\n this._list[tail] = item;\n this._tail = (tail + 1) & this._capacityMask;\n if (this._tail === this._head) {\n this._growArray();\n }\n if (this._capacity && this.size() > this._capacity) {\n this.shift();\n }\n if (this._head < this._tail) return this._tail - this._head;\n else return this._capacityMask + 1 - (this._head - this._tail);\n};\n\n/**\n * Remove and return the last item on the list.\n * Returns undefined if the list is empty.\n * @returns {*}\n */\nDenque.prototype.pop = function pop() {\n var tail = this._tail;\n if (tail === this._head) return undefined;\n var len = this._list.length;\n this._tail = (tail - 1 + len) & this._capacityMask;\n var item = this._list[this._tail];\n this._list[this._tail] = undefined;\n if (this._head < 2 && tail > 10000 && tail <= len >>> 2) this._shrinkArray();\n return item;\n};\n\n/**\n * Remove and return the item at the specified index from the list.\n * Returns undefined if the list is empty.\n * @param index\n * @returns {*}\n */\nDenque.prototype.removeOne = function removeOne(index) {\n var i = index;\n // expect a number or return undefined\n if ((i !== (i | 0))) {\n return void 0;\n }\n if (this._head === this._tail) return void 0;\n var size = this.size();\n var len = this._list.length;\n if (i >= size || i < -size) return void 0;\n if (i < 0) i += size;\n i = (this._head + i) & this._capacityMask;\n var item = this._list[i];\n var k;\n if (index < size / 2) {\n for (k = index; k > 0; k--) {\n this._list[i] = this._list[i = (i - 1 + len) & this._capacityMask];\n }\n this._list[i] = void 0;\n this._head = (this._head + 1 + len) & this._capacityMask;\n } else {\n for (k = size - 1 - index; k > 0; k--) {\n this._list[i] = this._list[i = (i + 1 + len) & this._capacityMask];\n }\n this._list[i] = void 0;\n this._tail = (this._tail - 1 + len) & this._capacityMask;\n }\n return item;\n};\n\n/**\n * Remove number of items from the specified index from the list.\n * Returns array of removed items.\n * Returns undefined if the list is empty.\n * @param index\n * @param count\n * @returns {array}\n */\nDenque.prototype.remove = function remove(index, count) {\n var i = index;\n var removed;\n var del_count = count;\n // expect a number or return undefined\n if ((i !== (i | 0))) {\n return void 0;\n }\n if (this._head === this._tail) return void 0;\n var size = this.size();\n var len = this._list.length;\n if (i >= size || i < -size || count < 1) return void 0;\n if (i < 0) i += size;\n if (count === 1 || !count) {\n removed = new Array(1);\n removed[0] = this.removeOne(i);\n return removed;\n }\n if (i === 0 && i + count >= size) {\n removed = this.toArray();\n this.clear();\n return removed;\n }\n if (i + count > size) count = size - i;\n var k;\n removed = new Array(count);\n for (k = 0; k < count; k++) {\n removed[k] = this._list[(this._head + i + k) & this._capacityMask];\n }\n i = (this._head + i) & this._capacityMask;\n if (index + count === size) {\n this._tail = (this._tail - count + len) & this._capacityMask;\n for (k = count; k > 0; k--) {\n this._list[i = (i + 1 + len) & this._capacityMask] = void 0;\n }\n return removed;\n }\n if (index === 0) {\n this._head = (this._head + count + len) & this._capacityMask;\n for (k = count - 1; k > 0; k--) {\n this._list[i = (i + 1 + len) & this._capacityMask] = void 0;\n }\n return removed;\n }\n if (i < size / 2) {\n this._head = (this._head + index + count + len) & this._capacityMask;\n for (k = index; k > 0; k--) {\n this.unshift(this._list[i = (i - 1 + len) & this._capacityMask]);\n }\n i = (this._head - 1 + len) & this._capacityMask;\n while (del_count > 0) {\n this._list[i = (i - 1 + len) & this._capacityMask] = void 0;\n del_count--;\n }\n if (index < 0) this._tail = i;\n } else {\n this._tail = i;\n i = (i + count + len) & this._capacityMask;\n for (k = size - (count + index); k > 0; k--) {\n this.push(this._list[i++]);\n }\n i = this._tail;\n while (del_count > 0) {\n this._list[i = (i + 1 + len) & this._capacityMask] = void 0;\n del_count--;\n }\n }\n if (this._head < 2 && this._tail > 10000 && this._tail <= len >>> 2) this._shrinkArray();\n return removed;\n};\n\n/**\n * Native splice implementation.\n * Remove number of items from the specified index from the list and/or add new elements.\n * Returns array of removed items or empty array if count == 0.\n * Returns undefined if the list is empty.\n *\n * @param index\n * @param count\n * @param {...*} [elements]\n * @returns {array}\n */\nDenque.prototype.splice = function splice(index, count) {\n var i = index;\n // expect a number or return undefined\n if ((i !== (i | 0))) {\n return void 0;\n }\n var size = this.size();\n if (i < 0) i += size;\n if (i > size) return void 0;\n if (arguments.length > 2) {\n var k;\n var temp;\n var removed;\n var arg_len = arguments.length;\n var len = this._list.length;\n var arguments_index = 2;\n if (!size || i < size / 2) {\n temp = new Array(i);\n for (k = 0; k < i; k++) {\n temp[k] = this._list[(this._head + k) & this._capacityMask];\n }\n if (count === 0) {\n removed = [];\n if (i > 0) {\n this._head = (this._head + i + len) & this._capacityMask;\n }\n } else {\n removed = this.remove(i, count);\n this._head = (this._head + i + len) & this._capacityMask;\n }\n while (arg_len > arguments_index) {\n this.unshift(arguments[--arg_len]);\n }\n for (k = i; k > 0; k--) {\n this.unshift(temp[k - 1]);\n }\n } else {\n temp = new Array(size - (i + count));\n var leng = temp.length;\n for (k = 0; k < leng; k++) {\n temp[k] = this._list[(this._head + i + count + k) & this._capacityMask];\n }\n if (count === 0) {\n removed = [];\n if (i != size) {\n this._tail = (this._head + i + len) & this._capacityMask;\n }\n } else {\n removed = this.remove(i, count);\n this._tail = (this._tail - leng + len) & this._capacityMask;\n }\n while (arguments_index < arg_len) {\n this.push(arguments[arguments_index++]);\n }\n for (k = 0; k < leng; k++) {\n this.push(temp[k]);\n }\n }\n return removed;\n } else {\n return this.remove(i, count);\n }\n};\n\n/**\n * Soft clear - does not reset capacity.\n */\nDenque.prototype.clear = function clear() {\n this._list = new Array(this._list.length);\n this._head = 0;\n this._tail = 0;\n};\n\n/**\n * Returns true or false whether the list is empty.\n * @returns {boolean}\n */\nDenque.prototype.isEmpty = function isEmpty() {\n return this._head === this._tail;\n};\n\n/**\n * Returns an array of all queue items.\n * @returns {Array}\n */\nDenque.prototype.toArray = function toArray() {\n return this._copyArray(false);\n};\n\n/**\n * -------------\n * INTERNALS\n * -------------\n */\n\n/**\n * Fills the queue with items from an array\n * For use in the constructor\n * @param array\n * @private\n */\nDenque.prototype._fromArray = function _fromArray(array) {\n var length = array.length;\n var capacity = this._nextPowerOf2(length);\n\n this._list = new Array(capacity);\n this._capacityMask = capacity - 1;\n this._tail = length;\n\n for (var i = 0; i < length; i++) this._list[i] = array[i];\n};\n\n/**\n *\n * @param fullCopy\n * @param size Initialize the array with a specific size. Will default to the current list size\n * @returns {Array}\n * @private\n */\nDenque.prototype._copyArray = function _copyArray(fullCopy, size) {\n var src = this._list;\n var capacity = src.length;\n var length = this.length;\n size = size | length;\n\n // No prealloc requested and the buffer is contiguous\n if (size == length && this._head < this._tail) {\n // Simply do a fast slice copy\n return this._list.slice(this._head, this._tail);\n }\n\n var dest = new Array(size);\n\n var k = 0;\n var i;\n if (fullCopy || this._head > this._tail) {\n for (i = this._head; i < capacity; i++) dest[k++] = src[i];\n for (i = 0; i < this._tail; i++) dest[k++] = src[i];\n } else {\n for (i = this._head; i < this._tail; i++) dest[k++] = src[i];\n }\n\n return dest;\n}\n\n/**\n * Grows the internal list array.\n * @private\n */\nDenque.prototype._growArray = function _growArray() {\n if (this._head != 0) {\n // double array size and copy existing data, head to end, then beginning to tail.\n var newList = this._copyArray(true, this._list.length << 1);\n\n this._tail = this._list.length;\n this._head = 0;\n\n this._list = newList;\n } else {\n this._tail = this._list.length;\n this._list.length <<= 1;\n }\n\n this._capacityMask = (this._capacityMask << 1) | 1;\n};\n\n/**\n * Shrinks the internal list array.\n * @private\n */\nDenque.prototype._shrinkArray = function _shrinkArray() {\n this._list.length >>>= 1;\n this._capacityMask >>>= 1;\n};\n\n/**\n * Find the next power of 2, at least 4\n * @private\n * @param {number} num \n * @returns {number}\n */\nDenque.prototype._nextPowerOf2 = function _nextPowerOf2(num) {\n var log2 = Math.log(num) / Math.log(2);\n var nextPow2 = 1 << (log2 + 1);\n\n return Math.max(nextPow2, 4);\n}\n\nmodule.exports = Denque;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst utils_1 = require(\"../utils\");\nconst Deque = require(\"denque\");\nconst debug = (0, utils_1.Debug)(\"delayqueue\");\n/**\n * Queue that runs items after specified duration\n */\nclass DelayQueue {\n constructor() {\n this.queues = {};\n this.timeouts = {};\n }\n /**\n * Add a new item to the queue\n *\n * @param bucket bucket name\n * @param item function that will run later\n * @param options\n */\n push(bucket, item, options) {\n const callback = options.callback || process.nextTick;\n if (!this.queues[bucket]) {\n this.queues[bucket] = new Deque();\n }\n const queue = this.queues[bucket];\n queue.push(item);\n if (!this.timeouts[bucket]) {\n this.timeouts[bucket] = setTimeout(() => {\n callback(() => {\n this.timeouts[bucket] = null;\n this.execute(bucket);\n });\n }, options.timeout);\n }\n }\n execute(bucket) {\n const queue = this.queues[bucket];\n if (!queue) {\n return;\n }\n const { length } = queue;\n if (!length) {\n return;\n }\n debug(\"send %d commands in %s queue\", length, bucket);\n this.queues[bucket] = null;\n while (queue.length > 0) {\n queue.shift()();\n }\n }\n}\nexports.default = DelayQueue;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst utils_1 = require(\"../utils\");\nconst ClusterSubscriber_1 = require(\"./ClusterSubscriber\");\nconst ConnectionPool_1 = require(\"./ConnectionPool\");\nconst util_1 = require(\"./util\");\nconst calculateSlot = require(\"cluster-key-slot\");\nconst debug = (0, utils_1.Debug)(\"cluster:subscriberGroup\");\n/**\n * Redis differs between \"normal\" and sharded PubSub. If using the \"normal\" PubSub feature, exactly one\n * ClusterSubscriber exists per cluster instance. This works because the Redis cluster bus forwards m\n * messages between shards. However, this has scalability limitations, which is the reason why the sharded\n * PubSub feature was added to Redis. With sharded PubSub, each shard is responsible for its own messages.\n * Given that, we need at least one ClusterSubscriber per master endpoint/node.\n *\n * This class leverages the previously exising ClusterSubscriber by adding support for multiple such subscribers\n * in alignment to the master nodes of the cluster. The ClusterSubscriber class was extended in a non-breaking way\n * to support this feature.\n */\nclass ClusterSubscriberGroup {\n /**\n * Register callbacks\n *\n * @param cluster\n */\n constructor(cluster, refreshSlotsCacheCallback) {\n this.cluster = cluster;\n this.shardedSubscribers = new Map();\n this.clusterSlots = [];\n //Simple [min, max] slot ranges aren't enough because you can migrate single slots\n this.subscriberToSlotsIndex = new Map();\n this.channels = new Map();\n cluster.on(\"+node\", (redis) => {\n this._addSubscriber(redis);\n });\n cluster.on(\"-node\", (redis) => {\n this._removeSubscriber(redis);\n });\n cluster.on(\"refresh\", () => {\n this._refreshSlots(cluster);\n });\n cluster.on(\"forceRefresh\", () => {\n refreshSlotsCacheCallback();\n });\n }\n /**\n * Get the responsible subscriber.\n *\n * Returns null if no subscriber was found\n *\n * @param slot\n */\n getResponsibleSubscriber(slot) {\n const nodeKey = this.clusterSlots[slot][0];\n return this.shardedSubscribers.get(nodeKey);\n }\n /**\n * Adds a channel for which this subscriber group is responsible\n *\n * @param channels\n */\n addChannels(channels) {\n const slot = calculateSlot(channels[0]);\n //Check if the all channels belong to the same slot and otherwise reject the operation\n channels.forEach((c) => {\n if (calculateSlot(c) != slot)\n return -1;\n });\n const currChannels = this.channels.get(slot);\n if (!currChannels) {\n this.channels.set(slot, channels);\n }\n else {\n this.channels.set(slot, currChannels.concat(channels));\n }\n return [...this.channels.values()].flatMap(v => v).length;\n }\n /**\n * Removes channels for which the subscriber group is responsible by optionally unsubscribing\n * @param channels\n */\n removeChannels(channels) {\n const slot = calculateSlot(channels[0]);\n //Check if the all channels belong to the same slot and otherwise reject the operation\n channels.forEach((c) => {\n if (calculateSlot(c) != slot)\n return -1;\n });\n const slotChannels = this.channels.get(slot);\n if (slotChannels) {\n const updatedChannels = slotChannels.filter(c => !channels.includes(c));\n this.channels.set(slot, updatedChannels);\n }\n return [...this.channels.values()].flatMap(v => v).length;\n }\n /**\n * Disconnect all subscribers\n */\n stop() {\n for (const s of this.shardedSubscribers.values()) {\n s.stop();\n }\n }\n /**\n * Start all not yet started subscribers\n */\n start() {\n for (const s of this.shardedSubscribers.values()) {\n if (!s.isStarted()) {\n s.start();\n }\n }\n }\n /**\n * Add a subscriber to the group of subscribers\n *\n * @param redis\n */\n _addSubscriber(redis) {\n const pool = new ConnectionPool_1.default(redis.options);\n if (pool.addMasterNode(redis)) {\n const sub = new ClusterSubscriber_1.default(pool, this.cluster, true);\n const nodeKey = (0, util_1.getNodeKey)(redis.options);\n this.shardedSubscribers.set(nodeKey, sub);\n sub.start();\n // We need to attempt to resubscribe them in case the new node serves their slot\n this._resubscribe();\n this.cluster.emit(\"+subscriber\");\n return sub;\n }\n return null;\n }\n /**\n * Removes a subscriber from the group\n * @param redis\n */\n _removeSubscriber(redis) {\n const nodeKey = (0, util_1.getNodeKey)(redis.options);\n const sub = this.shardedSubscribers.get(nodeKey);\n if (sub) {\n sub.stop();\n this.shardedSubscribers.delete(nodeKey);\n // Even though the subscriber to this node is going down, we might have another subscriber\n // handling the same slots, so we need to attempt to subscribe the orphaned channels\n this._resubscribe();\n this.cluster.emit(\"-subscriber\");\n }\n return this.shardedSubscribers;\n }\n /**\n * Refreshes the subscriber-related slot ranges\n *\n * Returns false if no refresh was needed\n *\n * @param cluster\n */\n _refreshSlots(cluster) {\n //If there was an actual change, then reassign the slot ranges\n if (this._slotsAreEqual(cluster.slots)) {\n debug(\"Nothing to refresh because the new cluster map is equal to the previous one.\");\n }\n else {\n debug(\"Refreshing the slots of the subscriber group.\");\n //Rebuild the slots index\n this.subscriberToSlotsIndex = new Map();\n for (let slot = 0; slot < cluster.slots.length; slot++) {\n const node = cluster.slots[slot][0];\n if (!this.subscriberToSlotsIndex.has(node)) {\n this.subscriberToSlotsIndex.set(node, []);\n }\n this.subscriberToSlotsIndex.get(node).push(Number(slot));\n }\n //Update the subscribers from the index\n this._resubscribe();\n //Update the cached slots map\n this.clusterSlots = JSON.parse(JSON.stringify(cluster.slots));\n this.cluster.emit(\"subscribersReady\");\n return true;\n }\n return false;\n }\n /**\n * Resubscribes to the previous channels\n *\n * @private\n */\n _resubscribe() {\n if (this.shardedSubscribers) {\n this.shardedSubscribers.forEach((s, nodeKey) => {\n const subscriberSlots = this.subscriberToSlotsIndex.get(nodeKey);\n if (subscriberSlots) {\n //More for debugging purposes\n s.associateSlotRange(subscriberSlots);\n //Resubscribe on the underlying connection\n subscriberSlots.forEach((ss) => {\n //Might return null if being disconnected\n const redis = s.getInstance();\n const channels = this.channels.get(ss);\n if (channels && channels.length > 0) {\n //Try to subscribe now\n if (redis) {\n redis.ssubscribe(channels);\n //If the instance isn't ready yet, then register the re-subscription for later\n redis.on(\"ready\", () => {\n redis.ssubscribe(channels);\n });\n }\n }\n });\n }\n });\n }\n }\n /**\n * Deep equality of the cluster slots objects\n *\n * @param other\n * @private\n */\n _slotsAreEqual(other) {\n if (this.clusterSlots === undefined)\n return false;\n else\n return JSON.stringify(this.clusterSlots) === JSON.stringify(other);\n }\n}\nexports.default = ClusterSubscriberGroup;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst commands_1 = require(\"@ioredis/commands\");\nconst events_1 = require(\"events\");\nconst redis_errors_1 = require(\"redis-errors\");\nconst standard_as_callback_1 = require(\"standard-as-callback\");\nconst Command_1 = require(\"../Command\");\nconst ClusterAllFailedError_1 = require(\"../errors/ClusterAllFailedError\");\nconst Redis_1 = require(\"../Redis\");\nconst ScanStream_1 = require(\"../ScanStream\");\nconst transaction_1 = require(\"../transaction\");\nconst utils_1 = require(\"../utils\");\nconst applyMixin_1 = require(\"../utils/applyMixin\");\nconst Commander_1 = require(\"../utils/Commander\");\nconst ClusterOptions_1 = require(\"./ClusterOptions\");\nconst ClusterSubscriber_1 = require(\"./ClusterSubscriber\");\nconst ConnectionPool_1 = require(\"./ConnectionPool\");\nconst DelayQueue_1 = require(\"./DelayQueue\");\nconst util_1 = require(\"./util\");\nconst Deque = require(\"denque\");\nconst ClusterSubscriberGroup_1 = require(\"./ClusterSubscriberGroup\");\nconst debug = (0, utils_1.Debug)(\"cluster\");\nconst REJECT_OVERWRITTEN_COMMANDS = new WeakSet();\n/**\n * Client for the official Redis Cluster\n */\nclass Cluster extends Commander_1.default {\n /**\n * Creates an instance of Cluster.\n */\n //TODO: Add an option that enables or disables sharded PubSub\n constructor(startupNodes, options = {}) {\n super();\n this.slots = [];\n /**\n * @ignore\n */\n this._groupsIds = {};\n /**\n * @ignore\n */\n this._groupsBySlot = Array(16384);\n /**\n * @ignore\n */\n this.isCluster = true;\n this.retryAttempts = 0;\n this.delayQueue = new DelayQueue_1.default();\n this.offlineQueue = new Deque();\n this.isRefreshing = false;\n this._refreshSlotsCacheCallbacks = [];\n this._autoPipelines = new Map();\n this._runningAutoPipelines = new Set();\n this._readyDelayedCallbacks = [];\n /**\n * Every time Cluster#connect() is called, this value will be\n * auto-incrementing. The purpose of this value is used for\n * discarding previous connect attampts when creating a new\n * connection.\n */\n this.connectionEpoch = 0;\n events_1.EventEmitter.call(this);\n this.startupNodes = startupNodes;\n this.options = (0, utils_1.defaults)({}, options, ClusterOptions_1.DEFAULT_CLUSTER_OPTIONS, this.options);\n if (this.options.shardedSubscribers == true)\n this.shardedSubscribers = new ClusterSubscriberGroup_1.default(this, this.refreshSlotsCache.bind(this));\n if (this.options.redisOptions &&\n this.options.redisOptions.keyPrefix &&\n !this.options.keyPrefix) {\n this.options.keyPrefix = this.options.redisOptions.keyPrefix;\n }\n // validate options\n if (typeof this.options.scaleReads !== \"function\" &&\n [\"all\", \"master\", \"slave\"].indexOf(this.options.scaleReads) === -1) {\n throw new Error('Invalid option scaleReads \"' +\n this.options.scaleReads +\n '\". Expected \"all\", \"master\", \"slave\" or a custom function');\n }\n this.connectionPool = new ConnectionPool_1.default(this.options.redisOptions);\n this.connectionPool.on(\"-node\", (redis, key) => {\n this.emit(\"-node\", redis);\n });\n this.connectionPool.on(\"+node\", (redis) => {\n this.emit(\"+node\", redis);\n });\n this.connectionPool.on(\"drain\", () => {\n this.setStatus(\"close\");\n });\n this.connectionPool.on(\"nodeError\", (error, key) => {\n this.emit(\"node error\", error, key);\n });\n this.subscriber = new ClusterSubscriber_1.default(this.connectionPool, this);\n if (this.options.scripts) {\n Object.entries(this.options.scripts).forEach(([name, definition]) => {\n this.defineCommand(name, definition);\n });\n }\n if (this.options.lazyConnect) {\n this.setStatus(\"wait\");\n }\n else {\n this.connect().catch((err) => {\n debug(\"connecting failed: %s\", err);\n });\n }\n }\n /**\n * Connect to a cluster\n */\n connect() {\n return new Promise((resolve, reject) => {\n if (this.status === \"connecting\" ||\n this.status === \"connect\" ||\n this.status === \"ready\") {\n reject(new Error(\"Redis is already connecting/connected\"));\n return;\n }\n const epoch = ++this.connectionEpoch;\n this.setStatus(\"connecting\");\n this.resolveStartupNodeHostnames()\n .then((nodes) => {\n if (this.connectionEpoch !== epoch) {\n debug(\"discard connecting after resolving startup nodes because epoch not match: %d != %d\", epoch, this.connectionEpoch);\n reject(new redis_errors_1.RedisError(\"Connection is discarded because a new connection is made\"));\n return;\n }\n if (this.status !== \"connecting\") {\n debug(\"discard connecting after resolving startup nodes because the status changed to %s\", this.status);\n reject(new redis_errors_1.RedisError(\"Connection is aborted\"));\n return;\n }\n this.connectionPool.reset(nodes);\n const readyHandler = () => {\n this.setStatus(\"ready\");\n this.retryAttempts = 0;\n this.executeOfflineCommands();\n this.resetNodesRefreshInterval();\n resolve();\n };\n let closeListener = undefined;\n const refreshListener = () => {\n this.invokeReadyDelayedCallbacks(undefined);\n this.removeListener(\"close\", closeListener);\n this.manuallyClosing = false;\n this.setStatus(\"connect\");\n if (this.options.enableReadyCheck) {\n this.readyCheck((err, fail) => {\n if (err || fail) {\n debug(\"Ready check failed (%s). Reconnecting...\", err || fail);\n if (this.status === \"connect\") {\n this.disconnect(true);\n }\n }\n else {\n readyHandler();\n }\n });\n }\n else {\n readyHandler();\n }\n };\n closeListener = () => {\n const error = new Error(\"None of startup nodes is available\");\n this.removeListener(\"refresh\", refreshListener);\n this.invokeReadyDelayedCallbacks(error);\n reject(error);\n };\n this.once(\"refresh\", refreshListener);\n this.once(\"close\", closeListener);\n this.once(\"close\", this.handleCloseEvent.bind(this));\n this.refreshSlotsCache((err) => {\n if (err && err.message === ClusterAllFailedError_1.default.defaultMessage) {\n Redis_1.default.prototype.silentEmit.call(this, \"error\", err);\n this.connectionPool.reset([]);\n }\n });\n this.subscriber.start();\n if (this.options.shardedSubscribers) {\n this.shardedSubscribers.start();\n }\n })\n .catch((err) => {\n this.setStatus(\"close\");\n this.handleCloseEvent(err);\n this.invokeReadyDelayedCallbacks(err);\n reject(err);\n });\n });\n }\n /**\n * Disconnect from every node in the cluster.\n */\n disconnect(reconnect = false) {\n const status = this.status;\n this.setStatus(\"disconnecting\");\n if (!reconnect) {\n this.manuallyClosing = true;\n }\n if (this.reconnectTimeout && !reconnect) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = null;\n debug(\"Canceled reconnecting attempts\");\n }\n this.clearNodesRefreshInterval();\n this.subscriber.stop();\n if (this.options.shardedSubscribers) {\n this.shardedSubscribers.stop();\n }\n if (status === \"wait\") {\n this.setStatus(\"close\");\n this.handleCloseEvent();\n }\n else {\n this.connectionPool.reset([]);\n }\n }\n /**\n * Quit the cluster gracefully.\n */\n quit(callback) {\n const status = this.status;\n this.setStatus(\"disconnecting\");\n this.manuallyClosing = true;\n if (this.reconnectTimeout) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = null;\n }\n this.clearNodesRefreshInterval();\n this.subscriber.stop();\n if (this.options.shardedSubscribers) {\n this.shardedSubscribers.stop();\n }\n if (status === \"wait\") {\n const ret = (0, standard_as_callback_1.default)(Promise.resolve(\"OK\"), callback);\n // use setImmediate to make sure \"close\" event\n // being emitted after quit() is returned\n setImmediate(function () {\n this.setStatus(\"close\");\n this.handleCloseEvent();\n }.bind(this));\n return ret;\n }\n return (0, standard_as_callback_1.default)(Promise.all(this.nodes().map((node) => node.quit().catch((err) => {\n // Ignore the error caused by disconnecting since\n // we're disconnecting...\n if (err.message === utils_1.CONNECTION_CLOSED_ERROR_MSG) {\n return \"OK\";\n }\n throw err;\n }))).then(() => \"OK\"), callback);\n }\n /**\n * Create a new instance with the same startup nodes and options as the current one.\n *\n * @example\n * ```js\n * var cluster = new Redis.Cluster([{ host: \"127.0.0.1\", port: \"30001\" }]);\n * var anotherCluster = cluster.duplicate();\n * ```\n */\n duplicate(overrideStartupNodes = [], overrideOptions = {}) {\n const startupNodes = overrideStartupNodes.length > 0\n ? overrideStartupNodes\n : this.startupNodes.slice(0);\n const options = Object.assign({}, this.options, overrideOptions);\n return new Cluster(startupNodes, options);\n }\n /**\n * Get nodes with the specified role\n */\n nodes(role = \"all\") {\n if (role !== \"all\" && role !== \"master\" && role !== \"slave\") {\n throw new Error('Invalid role \"' + role + '\". Expected \"all\", \"master\" or \"slave\"');\n }\n return this.connectionPool.getNodes(role);\n }\n /**\n * This is needed in order not to install a listener for each auto pipeline\n *\n * @ignore\n */\n delayUntilReady(callback) {\n this._readyDelayedCallbacks.push(callback);\n }\n /**\n * Get the number of commands queued in automatic pipelines.\n *\n * This is not available (and returns 0) until the cluster is connected and slots information have been received.\n */\n get autoPipelineQueueSize() {\n let queued = 0;\n for (const pipeline of this._autoPipelines.values()) {\n queued += pipeline.length;\n }\n return queued;\n }\n /**\n * Refresh the slot cache\n *\n * @ignore\n */\n refreshSlotsCache(callback) {\n if (callback) {\n this._refreshSlotsCacheCallbacks.push(callback);\n }\n if (this.isRefreshing) {\n return;\n }\n this.isRefreshing = true;\n const _this = this;\n const wrapper = (error) => {\n this.isRefreshing = false;\n for (const callback of this._refreshSlotsCacheCallbacks) {\n callback(error);\n }\n this._refreshSlotsCacheCallbacks = [];\n };\n const nodes = (0, utils_1.shuffle)(this.connectionPool.getNodes());\n let lastNodeError = null;\n function tryNode(index) {\n if (index === nodes.length) {\n const error = new ClusterAllFailedError_1.default(ClusterAllFailedError_1.default.defaultMessage, lastNodeError);\n return wrapper(error);\n }\n const node = nodes[index];\n const key = `${node.options.host}:${node.options.port}`;\n debug(\"getting slot cache from %s\", key);\n _this.getInfoFromNode(node, function (err) {\n switch (_this.status) {\n case \"close\":\n case \"end\":\n return wrapper(new Error(\"Cluster is disconnected.\"));\n case \"disconnecting\":\n return wrapper(new Error(\"Cluster is disconnecting.\"));\n }\n if (err) {\n _this.emit(\"node error\", err, key);\n lastNodeError = err;\n tryNode(index + 1);\n }\n else {\n _this.emit(\"refresh\");\n wrapper();\n }\n });\n }\n tryNode(0);\n }\n /**\n * @ignore\n */\n sendCommand(command, stream, node) {\n if (this.status === \"wait\") {\n this.connect().catch(utils_1.noop);\n }\n if (this.status === \"end\") {\n command.reject(new Error(utils_1.CONNECTION_CLOSED_ERROR_MSG));\n return command.promise;\n }\n let to = this.options.scaleReads;\n if (to !== \"master\") {\n const isCommandReadOnly = command.isReadOnly ||\n ((0, commands_1.exists)(command.name) && (0, commands_1.hasFlag)(command.name, \"readonly\"));\n if (!isCommandReadOnly) {\n to = \"master\";\n }\n }\n let targetSlot = node ? node.slot : command.getSlot();\n const ttl = {};\n const _this = this;\n if (!node && !REJECT_OVERWRITTEN_COMMANDS.has(command)) {\n REJECT_OVERWRITTEN_COMMANDS.add(command);\n const reject = command.reject;\n command.reject = function (err) {\n const partialTry = tryConnection.bind(null, true);\n _this.handleError(err, ttl, {\n moved: function (slot, key) {\n debug(\"command %s is moved to %s\", command.name, key);\n targetSlot = Number(slot);\n if (_this.slots[slot]) {\n _this.slots[slot][0] = key;\n }\n else {\n _this.slots[slot] = [key];\n }\n _this._groupsBySlot[slot] =\n _this._groupsIds[_this.slots[slot].join(\";\")];\n _this.connectionPool.findOrCreate(_this.natMapper(key));\n tryConnection();\n debug(\"refreshing slot caches... (triggered by MOVED error)\");\n _this.refreshSlotsCache();\n },\n ask: function (slot, key) {\n debug(\"command %s is required to ask %s:%s\", command.name, key);\n const mapped = _this.natMapper(key);\n _this.connectionPool.findOrCreate(mapped);\n tryConnection(false, `${mapped.host}:${mapped.port}`);\n },\n tryagain: partialTry,\n clusterDown: partialTry,\n connectionClosed: partialTry,\n maxRedirections: function (redirectionError) {\n reject.call(command, redirectionError);\n },\n defaults: function () {\n reject.call(command, err);\n },\n });\n };\n }\n tryConnection();\n function tryConnection(random, asking) {\n if (_this.status === \"end\") {\n command.reject(new redis_errors_1.AbortError(\"Cluster is ended.\"));\n return;\n }\n let redis;\n if (_this.status === \"ready\" || command.name === \"cluster\") {\n if (node && node.redis) {\n redis = node.redis;\n }\n else if (Command_1.default.checkFlag(\"ENTER_SUBSCRIBER_MODE\", command.name) ||\n Command_1.default.checkFlag(\"EXIT_SUBSCRIBER_MODE\", command.name)) {\n if (_this.options.shardedSubscribers == true &&\n (command.name == \"ssubscribe\" || command.name == \"sunsubscribe\")) {\n const sub = _this.shardedSubscribers.getResponsibleSubscriber(targetSlot);\n let status = -1;\n if (command.name == \"ssubscribe\")\n status = _this.shardedSubscribers.addChannels(command.getKeys());\n if (command.name == \"sunsubscribe\")\n status = _this.shardedSubscribers.removeChannels(command.getKeys());\n if (status !== -1) {\n redis = sub.getInstance();\n }\n else {\n command.reject(new redis_errors_1.AbortError(\"Can't add or remove the given channels. Are they in the same slot?\"));\n }\n }\n else {\n redis = _this.subscriber.getInstance();\n }\n if (!redis) {\n command.reject(new redis_errors_1.AbortError(\"No subscriber for the cluster\"));\n return;\n }\n }\n else {\n if (!random) {\n if (typeof targetSlot === \"number\" && _this.slots[targetSlot]) {\n const nodeKeys = _this.slots[targetSlot];\n if (typeof to === \"function\") {\n const nodes = nodeKeys.map(function (key) {\n return _this.connectionPool.getInstanceByKey(key);\n });\n redis = to(nodes, command);\n if (Array.isArray(redis)) {\n redis = (0, utils_1.sample)(redis);\n }\n if (!redis) {\n redis = nodes[0];\n }\n }\n else {\n let key;\n if (to === \"all\") {\n key = (0, utils_1.sample)(nodeKeys);\n }\n else if (to === \"slave\" && nodeKeys.length > 1) {\n key = (0, utils_1.sample)(nodeKeys, 1);\n }\n else {\n key = nodeKeys[0];\n }\n redis = _this.connectionPool.getInstanceByKey(key);\n }\n }\n if (asking) {\n redis = _this.connectionPool.getInstanceByKey(asking);\n redis.asking();\n }\n }\n if (!redis) {\n redis =\n (typeof to === \"function\"\n ? null\n : _this.connectionPool.getSampleInstance(to)) ||\n _this.connectionPool.getSampleInstance(\"all\");\n }\n }\n if (node && !node.redis) {\n node.redis = redis;\n }\n }\n if (redis) {\n redis.sendCommand(command, stream);\n }\n else if (_this.options.enableOfflineQueue) {\n _this.offlineQueue.push({\n command: command,\n stream: stream,\n node: node,\n });\n }\n else {\n command.reject(new Error(\"Cluster isn't ready and enableOfflineQueue options is false\"));\n }\n }\n return command.promise;\n }\n sscanStream(key, options) {\n return this.createScanStream(\"sscan\", { key, options });\n }\n sscanBufferStream(key, options) {\n return this.createScanStream(\"sscanBuffer\", { key, options });\n }\n hscanStream(key, options) {\n return this.createScanStream(\"hscan\", { key, options });\n }\n hscanBufferStream(key, options) {\n return this.createScanStream(\"hscanBuffer\", { key, options });\n }\n zscanStream(key, options) {\n return this.createScanStream(\"zscan\", { key, options });\n }\n zscanBufferStream(key, options) {\n return this.createScanStream(\"zscanBuffer\", { key, options });\n }\n /**\n * @ignore\n */\n handleError(error, ttl, handlers) {\n if (typeof ttl.value === \"undefined\") {\n ttl.value = this.options.maxRedirections;\n }\n else {\n ttl.value -= 1;\n }\n if (ttl.value <= 0) {\n handlers.maxRedirections(new Error(\"Too many Cluster redirections. Last error: \" + error));\n return;\n }\n const errv = error.message.split(\" \");\n if (errv[0] === \"MOVED\") {\n const timeout = this.options.retryDelayOnMoved;\n if (timeout && typeof timeout === \"number\") {\n this.delayQueue.push(\"moved\", handlers.moved.bind(null, errv[1], errv[2]), { timeout });\n }\n else {\n handlers.moved(errv[1], errv[2]);\n }\n }\n else if (errv[0] === \"ASK\") {\n handlers.ask(errv[1], errv[2]);\n }\n else if (errv[0] === \"TRYAGAIN\") {\n this.delayQueue.push(\"tryagain\", handlers.tryagain, {\n timeout: this.options.retryDelayOnTryAgain,\n });\n }\n else if (errv[0] === \"CLUSTERDOWN\" &&\n this.options.retryDelayOnClusterDown > 0) {\n this.delayQueue.push(\"clusterdown\", handlers.connectionClosed, {\n timeout: this.options.retryDelayOnClusterDown,\n callback: this.refreshSlotsCache.bind(this),\n });\n }\n else if (error.message === utils_1.CONNECTION_CLOSED_ERROR_MSG &&\n this.options.retryDelayOnFailover > 0 &&\n this.status === \"ready\") {\n this.delayQueue.push(\"failover\", handlers.connectionClosed, {\n timeout: this.options.retryDelayOnFailover,\n callback: this.refreshSlotsCache.bind(this),\n });\n }\n else {\n handlers.defaults();\n }\n }\n resetOfflineQueue() {\n this.offlineQueue = new Deque();\n }\n clearNodesRefreshInterval() {\n if (this.slotsTimer) {\n clearTimeout(this.slotsTimer);\n this.slotsTimer = null;\n }\n }\n resetNodesRefreshInterval() {\n if (this.slotsTimer || !this.options.slotsRefreshInterval) {\n return;\n }\n const nextRound = () => {\n this.slotsTimer = setTimeout(() => {\n debug('refreshing slot caches... (triggered by \"slotsRefreshInterval\" option)');\n this.refreshSlotsCache(() => {\n nextRound();\n });\n }, this.options.slotsRefreshInterval);\n };\n nextRound();\n }\n /**\n * Change cluster instance's status\n */\n setStatus(status) {\n debug(\"status: %s -> %s\", this.status || \"[empty]\", status);\n this.status = status;\n process.nextTick(() => {\n this.emit(status);\n });\n }\n /**\n * Called when closed to check whether a reconnection should be made\n */\n handleCloseEvent(reason) {\n if (reason) {\n debug(\"closed because %s\", reason);\n }\n let retryDelay;\n if (!this.manuallyClosing &&\n typeof this.options.clusterRetryStrategy === \"function\") {\n retryDelay = this.options.clusterRetryStrategy.call(this, ++this.retryAttempts, reason);\n }\n if (typeof retryDelay === \"number\") {\n this.setStatus(\"reconnecting\");\n this.reconnectTimeout = setTimeout(() => {\n this.reconnectTimeout = null;\n debug(\"Cluster is disconnected. Retrying after %dms\", retryDelay);\n this.connect().catch(function (err) {\n debug(\"Got error %s when reconnecting. Ignoring...\", err);\n });\n }, retryDelay);\n }\n else {\n this.setStatus(\"end\");\n this.flushQueue(new Error(\"None of startup nodes is available\"));\n }\n }\n /**\n * Flush offline queue with error.\n */\n flushQueue(error) {\n let item;\n while ((item = this.offlineQueue.shift())) {\n item.command.reject(error);\n }\n }\n executeOfflineCommands() {\n if (this.offlineQueue.length) {\n debug(\"send %d commands in offline queue\", this.offlineQueue.length);\n const offlineQueue = this.offlineQueue;\n this.resetOfflineQueue();\n let item;\n while ((item = offlineQueue.shift())) {\n this.sendCommand(item.command, item.stream, item.node);\n }\n }\n }\n natMapper(nodeKey) {\n const key = typeof nodeKey === \"string\"\n ? nodeKey\n : `${nodeKey.host}:${nodeKey.port}`;\n let mapped = null;\n if (this.options.natMap && typeof this.options.natMap === \"function\") {\n mapped = this.options.natMap(key);\n }\n else if (this.options.natMap && typeof this.options.natMap === \"object\") {\n mapped = this.options.natMap[key];\n }\n if (mapped) {\n debug(\"NAT mapping %s -> %O\", key, mapped);\n return Object.assign({}, mapped);\n }\n return typeof nodeKey === \"string\"\n ? (0, util_1.nodeKeyToRedisOptions)(nodeKey)\n : nodeKey;\n }\n getInfoFromNode(redis, callback) {\n if (!redis) {\n return callback(new Error(\"Node is disconnected\"));\n }\n // Use a duplication of the connection to avoid\n // timeouts when the connection is in the blocking\n // mode (e.g. waiting for BLPOP).\n const duplicatedConnection = redis.duplicate({\n enableOfflineQueue: true,\n enableReadyCheck: false,\n retryStrategy: null,\n connectionName: (0, util_1.getConnectionName)(\"refresher\", this.options.redisOptions && this.options.redisOptions.connectionName),\n });\n // Ignore error events since we will handle\n // exceptions for the CLUSTER SLOTS command.\n duplicatedConnection.on(\"error\", utils_1.noop);\n duplicatedConnection.cluster(\"SLOTS\", (0, utils_1.timeout)((err, result) => {\n duplicatedConnection.disconnect();\n if (err) {\n debug(\"error encountered running CLUSTER.SLOTS: %s\", err);\n return callback(err);\n }\n if (this.status === \"disconnecting\" ||\n this.status === \"close\" ||\n this.status === \"end\") {\n debug(\"ignore CLUSTER.SLOTS results (count: %d) since cluster status is %s\", result.length, this.status);\n callback();\n return;\n }\n const nodes = [];\n debug(\"cluster slots result count: %d\", result.length);\n for (let i = 0; i < result.length; ++i) {\n const items = result[i];\n const slotRangeStart = items[0];\n const slotRangeEnd = items[1];\n const keys = [];\n for (let j = 2; j < items.length; j++) {\n if (!items[j][0]) {\n continue;\n }\n const node = this.natMapper({\n host: items[j][0],\n port: items[j][1],\n });\n node.readOnly = j !== 2;\n nodes.push(node);\n keys.push(node.host + \":\" + node.port);\n }\n debug(\"cluster slots result [%d]: slots %d~%d served by %s\", i, slotRangeStart, slotRangeEnd, keys);\n for (let slot = slotRangeStart; slot <= slotRangeEnd; slot++) {\n this.slots[slot] = keys;\n }\n }\n // Assign to each node keys a numeric value to make autopipeline comparison faster.\n this._groupsIds = Object.create(null);\n let j = 0;\n for (let i = 0; i < 16384; i++) {\n const target = (this.slots[i] || []).join(\";\");\n if (!target.length) {\n this._groupsBySlot[i] = undefined;\n continue;\n }\n if (!this._groupsIds[target]) {\n this._groupsIds[target] = ++j;\n }\n this._groupsBySlot[i] = this._groupsIds[target];\n }\n this.connectionPool.reset(nodes);\n callback();\n }, this.options.slotsRefreshTimeout));\n }\n invokeReadyDelayedCallbacks(err) {\n for (const c of this._readyDelayedCallbacks) {\n process.nextTick(c, err);\n }\n this._readyDelayedCallbacks = [];\n }\n /**\n * Check whether Cluster is able to process commands\n */\n readyCheck(callback) {\n this.cluster(\"INFO\", (err, res) => {\n if (err) {\n return callback(err);\n }\n if (typeof res !== \"string\") {\n return callback();\n }\n let state;\n const lines = res.split(\"\\r\\n\");\n for (let i = 0; i < lines.length; ++i) {\n const parts = lines[i].split(\":\");\n if (parts[0] === \"cluster_state\") {\n state = parts[1];\n break;\n }\n }\n if (state === \"fail\") {\n debug(\"cluster state not ok (%s)\", state);\n callback(null, state);\n }\n else {\n callback();\n }\n });\n }\n resolveSrv(hostname) {\n return new Promise((resolve, reject) => {\n this.options.resolveSrv(hostname, (err, records) => {\n if (err) {\n return reject(err);\n }\n const self = this, groupedRecords = (0, util_1.groupSrvRecords)(records), sortedKeys = Object.keys(groupedRecords).sort((a, b) => parseInt(a) - parseInt(b));\n function tryFirstOne(err) {\n if (!sortedKeys.length) {\n return reject(err);\n }\n const key = sortedKeys[0], group = groupedRecords[key], record = (0, util_1.weightSrvRecords)(group);\n if (!group.records.length) {\n sortedKeys.shift();\n }\n self.dnsLookup(record.name).then((host) => resolve({\n host,\n port: record.port,\n }), tryFirstOne);\n }\n tryFirstOne();\n });\n });\n }\n dnsLookup(hostname) {\n return new Promise((resolve, reject) => {\n this.options.dnsLookup(hostname, (err, address) => {\n if (err) {\n debug(\"failed to resolve hostname %s to IP: %s\", hostname, err.message);\n reject(err);\n }\n else {\n debug(\"resolved hostname %s to IP %s\", hostname, address);\n resolve(address);\n }\n });\n });\n }\n /**\n * Normalize startup nodes, and resolving hostnames to IPs.\n *\n * This process happens every time when #connect() is called since\n * #startupNodes and DNS records may chanage.\n */\n async resolveStartupNodeHostnames() {\n if (!Array.isArray(this.startupNodes) || this.startupNodes.length === 0) {\n throw new Error(\"`startupNodes` should contain at least one node.\");\n }\n const startupNodes = (0, util_1.normalizeNodeOptions)(this.startupNodes);\n const hostnames = (0, util_1.getUniqueHostnamesFromOptions)(startupNodes);\n if (hostnames.length === 0) {\n return startupNodes;\n }\n const configs = await Promise.all(hostnames.map((this.options.useSRVRecords ? this.resolveSrv : this.dnsLookup).bind(this)));\n const hostnameToConfig = (0, utils_1.zipMap)(hostnames, configs);\n return startupNodes.map((node) => {\n const config = hostnameToConfig.get(node.host);\n if (!config) {\n return node;\n }\n if (this.options.useSRVRecords) {\n return Object.assign({}, node, config);\n }\n return Object.assign({}, node, { host: config });\n });\n }\n createScanStream(command, { key, options = {} }) {\n return new ScanStream_1.default({\n objectMode: true,\n key: key,\n redis: this,\n command: command,\n ...options,\n });\n }\n}\n(0, applyMixin_1.default)(Cluster, events_1.EventEmitter);\n(0, transaction_1.addTransactionSupport)(Cluster.prototype);\nexports.default = Cluster;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst utils_1 = require(\"../utils\");\nconst debug = (0, utils_1.Debug)(\"AbstractConnector\");\nclass AbstractConnector {\n constructor(disconnectTimeout) {\n this.connecting = false;\n this.disconnectTimeout = disconnectTimeout;\n }\n check(info) {\n return true;\n }\n disconnect() {\n this.connecting = false;\n if (this.stream) {\n const stream = this.stream; // Make sure callbacks refer to the same instance\n const timeout = setTimeout(() => {\n debug(\"stream %s:%s still open, destroying it\", stream.remoteAddress, stream.remotePort);\n stream.destroy();\n }, this.disconnectTimeout);\n stream.on(\"close\", () => clearTimeout(timeout));\n stream.end();\n }\n }\n}\nexports.default = AbstractConnector;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst net_1 = require(\"net\");\nconst tls_1 = require(\"tls\");\nconst utils_1 = require(\"../utils\");\nconst AbstractConnector_1 = require(\"./AbstractConnector\");\nclass StandaloneConnector extends AbstractConnector_1.default {\n constructor(options) {\n super(options.disconnectTimeout);\n this.options = options;\n }\n connect(_) {\n const { options } = this;\n this.connecting = true;\n let connectionOptions;\n if (\"path\" in options && options.path) {\n connectionOptions = {\n path: options.path,\n };\n }\n else {\n connectionOptions = {};\n if (\"port\" in options && options.port != null) {\n connectionOptions.port = options.port;\n }\n if (\"host\" in options && options.host != null) {\n connectionOptions.host = options.host;\n }\n if (\"family\" in options && options.family != null) {\n connectionOptions.family = options.family;\n }\n }\n if (options.tls) {\n Object.assign(connectionOptions, options.tls);\n }\n // TODO:\n // We use native Promise here since other Promise\n // implementation may use different schedulers that\n // cause issue when the stream is resolved in the\n // next tick.\n // Should use the provided promise in the next major\n // version and do not connect before resolved.\n return new Promise((resolve, reject) => {\n process.nextTick(() => {\n if (!this.connecting) {\n reject(new Error(utils_1.CONNECTION_CLOSED_ERROR_MSG));\n return;\n }\n try {\n if (options.tls) {\n this.stream = (0, tls_1.connect)(connectionOptions);\n }\n else {\n this.stream = (0, net_1.createConnection)(connectionOptions);\n }\n }\n catch (err) {\n reject(err);\n return;\n }\n this.stream.once(\"error\", (err) => {\n this.firstError = err;\n });\n resolve(this.stream);\n });\n });\n }\n}\nexports.default = StandaloneConnector;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nfunction isSentinelEql(a, b) {\n return ((a.host || \"127.0.0.1\") === (b.host || \"127.0.0.1\") &&\n (a.port || 26379) === (b.port || 26379));\n}\nclass SentinelIterator {\n constructor(sentinels) {\n this.cursor = 0;\n this.sentinels = sentinels.slice(0);\n }\n next() {\n const done = this.cursor >= this.sentinels.length;\n return { done, value: done ? undefined : this.sentinels[this.cursor++] };\n }\n reset(moveCurrentEndpointToFirst) {\n if (moveCurrentEndpointToFirst &&\n this.sentinels.length > 1 &&\n this.cursor !== 1) {\n this.sentinels.unshift(...this.sentinels.splice(this.cursor - 1));\n }\n this.cursor = 0;\n }\n add(sentinel) {\n for (let i = 0; i < this.sentinels.length; i++) {\n if (isSentinelEql(sentinel, this.sentinels[i])) {\n return false;\n }\n }\n this.sentinels.push(sentinel);\n return true;\n }\n toString() {\n return `${JSON.stringify(this.sentinels)} @${this.cursor}`;\n }\n}\nexports.default = SentinelIterator;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.FailoverDetector = void 0;\nconst utils_1 = require(\"../../utils\");\nconst debug = (0, utils_1.Debug)(\"FailoverDetector\");\nconst CHANNEL_NAME = \"+switch-master\";\nclass FailoverDetector {\n // sentinels can't be used for regular commands after this\n constructor(connector, sentinels) {\n this.isDisconnected = false;\n this.connector = connector;\n this.sentinels = sentinels;\n }\n cleanup() {\n this.isDisconnected = true;\n for (const sentinel of this.sentinels) {\n sentinel.client.disconnect();\n }\n }\n async subscribe() {\n debug(\"Starting FailoverDetector\");\n const promises = [];\n for (const sentinel of this.sentinels) {\n const promise = sentinel.client.subscribe(CHANNEL_NAME).catch((err) => {\n debug(\"Failed to subscribe to failover messages on sentinel %s:%s (%s)\", sentinel.address.host || \"127.0.0.1\", sentinel.address.port || 26739, err.message);\n });\n promises.push(promise);\n sentinel.client.on(\"message\", (channel) => {\n if (!this.isDisconnected && channel === CHANNEL_NAME) {\n this.disconnect();\n }\n });\n }\n await Promise.all(promises);\n }\n disconnect() {\n // Avoid disconnecting more than once per failover.\n // A new FailoverDetector will be created after reconnecting.\n this.isDisconnected = true;\n debug(\"Failover detected, disconnecting\");\n // Will call this.cleanup()\n this.connector.disconnect();\n }\n}\nexports.FailoverDetector = FailoverDetector;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SentinelIterator = void 0;\nconst net_1 = require(\"net\");\nconst utils_1 = require(\"../../utils\");\nconst tls_1 = require(\"tls\");\nconst SentinelIterator_1 = require(\"./SentinelIterator\");\nexports.SentinelIterator = SentinelIterator_1.default;\nconst AbstractConnector_1 = require(\"../AbstractConnector\");\nconst Redis_1 = require(\"../../Redis\");\nconst FailoverDetector_1 = require(\"./FailoverDetector\");\nconst debug = (0, utils_1.Debug)(\"SentinelConnector\");\nclass SentinelConnector extends AbstractConnector_1.default {\n constructor(options) {\n super(options.disconnectTimeout);\n this.options = options;\n this.emitter = null;\n this.failoverDetector = null;\n if (!this.options.sentinels.length) {\n throw new Error(\"Requires at least one sentinel to connect to.\");\n }\n if (!this.options.name) {\n throw new Error(\"Requires the name of master.\");\n }\n this.sentinelIterator = new SentinelIterator_1.default(this.options.sentinels);\n }\n check(info) {\n const roleMatches = !info.role || this.options.role === info.role;\n if (!roleMatches) {\n debug(\"role invalid, expected %s, but got %s\", this.options.role, info.role);\n // Start from the next item.\n // Note that `reset` will move the cursor to the previous element,\n // so we advance two steps here.\n this.sentinelIterator.next();\n this.sentinelIterator.next();\n this.sentinelIterator.reset(true);\n }\n return roleMatches;\n }\n disconnect() {\n super.disconnect();\n if (this.failoverDetector) {\n this.failoverDetector.cleanup();\n }\n }\n connect(eventEmitter) {\n this.connecting = true;\n this.retryAttempts = 0;\n let lastError;\n const connectToNext = async () => {\n const endpoint = this.sentinelIterator.next();\n if (endpoint.done) {\n this.sentinelIterator.reset(false);\n const retryDelay = typeof this.options.sentinelRetryStrategy === \"function\"\n ? this.options.sentinelRetryStrategy(++this.retryAttempts)\n : null;\n let errorMsg = typeof retryDelay !== \"number\"\n ? \"All sentinels are unreachable and retry is disabled.\"\n : `All sentinels are unreachable. Retrying from scratch after ${retryDelay}ms.`;\n if (lastError) {\n errorMsg += ` Last error: ${lastError.message}`;\n }\n debug(errorMsg);\n const error = new Error(errorMsg);\n if (typeof retryDelay === \"number\") {\n eventEmitter(\"error\", error);\n await new Promise((resolve) => setTimeout(resolve, retryDelay));\n return connectToNext();\n }\n else {\n throw error;\n }\n }\n let resolved = null;\n let err = null;\n try {\n resolved = await this.resolve(endpoint.value);\n }\n catch (error) {\n err = error;\n }\n if (!this.connecting) {\n throw new Error(utils_1.CONNECTION_CLOSED_ERROR_MSG);\n }\n const endpointAddress = endpoint.value.host + \":\" + endpoint.value.port;\n if (resolved) {\n debug(\"resolved: %s:%s from sentinel %s\", resolved.host, resolved.port, endpointAddress);\n if (this.options.enableTLSForSentinelMode && this.options.tls) {\n Object.assign(resolved, this.options.tls);\n this.stream = (0, tls_1.connect)(resolved);\n this.stream.once(\"secureConnect\", this.initFailoverDetector.bind(this));\n }\n else {\n this.stream = (0, net_1.createConnection)(resolved);\n this.stream.once(\"connect\", this.initFailoverDetector.bind(this));\n }\n this.stream.once(\"error\", (err) => {\n this.firstError = err;\n });\n return this.stream;\n }\n else {\n const errorMsg = err\n ? \"failed to connect to sentinel \" +\n endpointAddress +\n \" because \" +\n err.message\n : \"connected to sentinel \" +\n endpointAddress +\n \" successfully, but got an invalid reply: \" +\n resolved;\n debug(errorMsg);\n eventEmitter(\"sentinelError\", new Error(errorMsg));\n if (err) {\n lastError = err;\n }\n return connectToNext();\n }\n };\n return connectToNext();\n }\n async updateSentinels(client) {\n if (!this.options.updateSentinels) {\n return;\n }\n const result = await client.sentinel(\"sentinels\", this.options.name);\n if (!Array.isArray(result)) {\n return;\n }\n result\n .map(utils_1.packObject)\n .forEach((sentinel) => {\n const flags = sentinel.flags ? sentinel.flags.split(\",\") : [];\n if (flags.indexOf(\"disconnected\") === -1 &&\n sentinel.ip &&\n sentinel.port) {\n const endpoint = this.sentinelNatResolve(addressResponseToAddress(sentinel));\n if (this.sentinelIterator.add(endpoint)) {\n debug(\"adding sentinel %s:%s\", endpoint.host, endpoint.port);\n }\n }\n });\n debug(\"Updated internal sentinels: %s\", this.sentinelIterator);\n }\n async resolveMaster(client) {\n const result = await client.sentinel(\"get-master-addr-by-name\", this.options.name);\n await this.updateSentinels(client);\n return this.sentinelNatResolve(Array.isArray(result)\n ? { host: result[0], port: Number(result[1]) }\n : null);\n }\n async resolveSlave(client) {\n const result = await client.sentinel(\"slaves\", this.options.name);\n if (!Array.isArray(result)) {\n return null;\n }\n const availableSlaves = result\n .map(utils_1.packObject)\n .filter((slave) => slave.flags && !slave.flags.match(/(disconnected|s_down|o_down)/));\n return this.sentinelNatResolve(selectPreferredSentinel(availableSlaves, this.options.preferredSlaves));\n }\n sentinelNatResolve(item) {\n if (!item || !this.options.natMap)\n return item;\n const key = `${item.host}:${item.port}`;\n let result = item;\n if (typeof this.options.natMap === \"function\") {\n result = this.options.natMap(key) || item;\n }\n else if (typeof this.options.natMap === \"object\") {\n result = this.options.natMap[key] || item;\n }\n return result;\n }\n connectToSentinel(endpoint, options) {\n const redis = new Redis_1.default({\n port: endpoint.port || 26379,\n host: endpoint.host,\n username: this.options.sentinelUsername || null,\n password: this.options.sentinelPassword || null,\n family: endpoint.family ||\n // @ts-expect-error\n (\"path\" in this.options && this.options.path\n ? undefined\n : // @ts-expect-error\n this.options.family),\n tls: this.options.sentinelTLS,\n retryStrategy: null,\n enableReadyCheck: false,\n connectTimeout: this.options.connectTimeout,\n commandTimeout: this.options.sentinelCommandTimeout,\n ...options,\n });\n // @ts-expect-error\n return redis;\n }\n async resolve(endpoint) {\n const client = this.connectToSentinel(endpoint);\n // ignore the errors since resolve* methods will handle them\n client.on(\"error\", noop);\n try {\n if (this.options.role === \"slave\") {\n return await this.resolveSlave(client);\n }\n else {\n return await this.resolveMaster(client);\n }\n }\n finally {\n client.disconnect();\n }\n }\n async initFailoverDetector() {\n var _a;\n if (!this.options.failoverDetector) {\n return;\n }\n // Move the current sentinel to the first position\n this.sentinelIterator.reset(true);\n const sentinels = [];\n // In case of a large amount of sentinels, limit the number of concurrent connections\n while (sentinels.length < this.options.sentinelMaxConnections) {\n const { done, value } = this.sentinelIterator.next();\n if (done) {\n break;\n }\n const client = this.connectToSentinel(value, {\n lazyConnect: true,\n retryStrategy: this.options.sentinelReconnectStrategy,\n });\n client.on(\"reconnecting\", () => {\n var _a;\n // Tests listen to this event\n (_a = this.emitter) === null || _a === void 0 ? void 0 : _a.emit(\"sentinelReconnecting\");\n });\n sentinels.push({ address: value, client });\n }\n this.sentinelIterator.reset(false);\n if (this.failoverDetector) {\n // Clean up previous detector\n this.failoverDetector.cleanup();\n }\n this.failoverDetector = new FailoverDetector_1.FailoverDetector(this, sentinels);\n await this.failoverDetector.subscribe();\n // Tests listen to this event\n (_a = this.emitter) === null || _a === void 0 ? void 0 : _a.emit(\"failoverSubscribed\");\n }\n}\nexports.default = SentinelConnector;\nfunction selectPreferredSentinel(availableSlaves, preferredSlaves) {\n if (availableSlaves.length === 0) {\n return null;\n }\n let selectedSlave;\n if (typeof preferredSlaves === \"function\") {\n selectedSlave = preferredSlaves(availableSlaves);\n }\n else if (preferredSlaves !== null && typeof preferredSlaves === \"object\") {\n const preferredSlavesArray = Array.isArray(preferredSlaves)\n ? preferredSlaves\n : [preferredSlaves];\n // sort by priority\n preferredSlavesArray.sort((a, b) => {\n // default the priority to 1\n if (!a.prio) {\n a.prio = 1;\n }\n if (!b.prio) {\n b.prio = 1;\n }\n // lowest priority first\n if (a.prio < b.prio) {\n return -1;\n }\n if (a.prio > b.prio) {\n return 1;\n }\n return 0;\n });\n // loop over preferred slaves and return the first match\n for (let p = 0; p < preferredSlavesArray.length; p++) {\n for (let a = 0; a < availableSlaves.length; a++) {\n const slave = availableSlaves[a];\n if (slave.ip === preferredSlavesArray[p].ip) {\n if (slave.port === preferredSlavesArray[p].port) {\n selectedSlave = slave;\n break;\n }\n }\n }\n if (selectedSlave) {\n break;\n }\n }\n }\n // if none of the preferred slaves are available, a random available slave is returned\n if (!selectedSlave) {\n selectedSlave = (0, utils_1.sample)(availableSlaves);\n }\n return addressResponseToAddress(selectedSlave);\n}\nfunction addressResponseToAddress(input) {\n return { host: input.ip, port: Number(input.port) };\n}\nfunction noop() { }\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SentinelConnector = exports.StandaloneConnector = void 0;\nconst StandaloneConnector_1 = require(\"./StandaloneConnector\");\nexports.StandaloneConnector = StandaloneConnector_1.default;\nconst SentinelConnector_1 = require(\"./SentinelConnector\");\nexports.SentinelConnector = SentinelConnector_1.default;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst redis_errors_1 = require(\"redis-errors\");\nclass MaxRetriesPerRequestError extends redis_errors_1.AbortError {\n constructor(maxRetriesPerRequest) {\n const message = `Reached the max retries per request limit (which is ${maxRetriesPerRequest}). Refer to \"maxRetriesPerRequest\" option for details.`;\n super(message);\n Error.captureStackTrace(this, this.constructor);\n }\n get name() {\n return this.constructor.name;\n }\n}\nexports.default = MaxRetriesPerRequestError;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.MaxRetriesPerRequestError = void 0;\nconst MaxRetriesPerRequestError_1 = require(\"./MaxRetriesPerRequestError\");\nexports.MaxRetriesPerRequestError = MaxRetriesPerRequestError_1.default;\n","'use strict'\n\nconst Buffer = require('buffer').Buffer\nconst StringDecoder = require('string_decoder').StringDecoder\nconst decoder = new StringDecoder()\nconst errors = require('redis-errors')\nconst ReplyError = errors.ReplyError\nconst ParserError = errors.ParserError\nvar bufferPool = Buffer.allocUnsafe(32 * 1024)\nvar bufferOffset = 0\nvar interval = null\nvar counter = 0\nvar notDecreased = 0\n\n/**\n * Used for integer numbers only\n * @param {JavascriptRedisParser} parser\n * @returns {undefined|number}\n */\nfunction parseSimpleNumbers (parser) {\n const length = parser.buffer.length - 1\n var offset = parser.offset\n var number = 0\n var sign = 1\n\n if (parser.buffer[offset] === 45) {\n sign = -1\n offset++\n }\n\n while (offset < length) {\n const c1 = parser.buffer[offset++]\n if (c1 === 13) { // \\r\\n\n parser.offset = offset + 1\n return sign * number\n }\n number = (number * 10) + (c1 - 48)\n }\n}\n\n/**\n * Used for integer numbers in case of the returnNumbers option\n *\n * Reading the string as parts of n SMI is more efficient than\n * using a string directly.\n *\n * @param {JavascriptRedisParser} parser\n * @returns {undefined|string}\n */\nfunction parseStringNumbers (parser) {\n const length = parser.buffer.length - 1\n var offset = parser.offset\n var number = 0\n var res = ''\n\n if (parser.buffer[offset] === 45) {\n res += '-'\n offset++\n }\n\n while (offset < length) {\n var c1 = parser.buffer[offset++]\n if (c1 === 13) { // \\r\\n\n parser.offset = offset + 1\n if (number !== 0) {\n res += number\n }\n return res\n } else if (number > 429496728) {\n res += (number * 10) + (c1 - 48)\n number = 0\n } else if (c1 === 48 && number === 0) {\n res += 0\n } else {\n number = (number * 10) + (c1 - 48)\n }\n }\n}\n\n/**\n * Parse a '+' redis simple string response but forward the offsets\n * onto convertBufferRange to generate a string.\n * @param {JavascriptRedisParser} parser\n * @returns {undefined|string|Buffer}\n */\nfunction parseSimpleString (parser) {\n const start = parser.offset\n const buffer = parser.buffer\n const length = buffer.length - 1\n var offset = start\n\n while (offset < length) {\n if (buffer[offset++] === 13) { // \\r\\n\n parser.offset = offset + 1\n if (parser.optionReturnBuffers === true) {\n return parser.buffer.slice(start, offset - 1)\n }\n return parser.buffer.toString('utf8', start, offset - 1)\n }\n }\n}\n\n/**\n * Returns the read length\n * @param {JavascriptRedisParser} parser\n * @returns {undefined|number}\n */\nfunction parseLength (parser) {\n const length = parser.buffer.length - 1\n var offset = parser.offset\n var number = 0\n\n while (offset < length) {\n const c1 = parser.buffer[offset++]\n if (c1 === 13) {\n parser.offset = offset + 1\n return number\n }\n number = (number * 10) + (c1 - 48)\n }\n}\n\n/**\n * Parse a ':' redis integer response\n *\n * If stringNumbers is activated the parser always returns numbers as string\n * This is important for big numbers (number > Math.pow(2, 53)) as js numbers\n * are 64bit floating point numbers with reduced precision\n *\n * @param {JavascriptRedisParser} parser\n * @returns {undefined|number|string}\n */\nfunction parseInteger (parser) {\n if (parser.optionStringNumbers === true) {\n return parseStringNumbers(parser)\n }\n return parseSimpleNumbers(parser)\n}\n\n/**\n * Parse a '$' redis bulk string response\n * @param {JavascriptRedisParser} parser\n * @returns {undefined|null|string}\n */\nfunction parseBulkString (parser) {\n const length = parseLength(parser)\n if (length === undefined) {\n return\n }\n if (length < 0) {\n return null\n }\n const offset = parser.offset + length\n if (offset + 2 > parser.buffer.length) {\n parser.bigStrSize = offset + 2\n parser.totalChunkSize = parser.buffer.length\n parser.bufferCache.push(parser.buffer)\n return\n }\n const start = parser.offset\n parser.offset = offset + 2\n if (parser.optionReturnBuffers === true) {\n return parser.buffer.slice(start, offset)\n }\n return parser.buffer.toString('utf8', start, offset)\n}\n\n/**\n * Parse a '-' redis error response\n * @param {JavascriptRedisParser} parser\n * @returns {ReplyError}\n */\nfunction parseError (parser) {\n var string = parseSimpleString(parser)\n if (string !== undefined) {\n if (parser.optionReturnBuffers === true) {\n string = string.toString()\n }\n return new ReplyError(string)\n }\n}\n\n/**\n * Parsing error handler, resets parser buffer\n * @param {JavascriptRedisParser} parser\n * @param {number} type\n * @returns {undefined}\n */\nfunction handleError (parser, type) {\n const err = new ParserError(\n 'Protocol error, got ' + JSON.stringify(String.fromCharCode(type)) + ' as reply type byte',\n JSON.stringify(parser.buffer),\n parser.offset\n )\n parser.buffer = null\n parser.returnFatalError(err)\n}\n\n/**\n * Parse a '*' redis array response\n * @param {JavascriptRedisParser} parser\n * @returns {undefined|null|any[]}\n */\nfunction parseArray (parser) {\n const length = parseLength(parser)\n if (length === undefined) {\n return\n }\n if (length < 0) {\n return null\n }\n const responses = new Array(length)\n return parseArrayElements(parser, responses, 0)\n}\n\n/**\n * Push a partly parsed array to the stack\n *\n * @param {JavascriptRedisParser} parser\n * @param {any[]} array\n * @param {number} pos\n * @returns {undefined}\n */\nfunction pushArrayCache (parser, array, pos) {\n parser.arrayCache.push(array)\n parser.arrayPos.push(pos)\n}\n\n/**\n * Parse chunked redis array response\n * @param {JavascriptRedisParser} parser\n * @returns {undefined|any[]}\n */\nfunction parseArrayChunks (parser) {\n const tmp = parser.arrayCache.pop()\n var pos = parser.arrayPos.pop()\n if (parser.arrayCache.length) {\n const res = parseArrayChunks(parser)\n if (res === undefined) {\n pushArrayCache(parser, tmp, pos)\n return\n }\n tmp[pos++] = res\n }\n return parseArrayElements(parser, tmp, pos)\n}\n\n/**\n * Parse redis array response elements\n * @param {JavascriptRedisParser} parser\n * @param {Array} responses\n * @param {number} i\n * @returns {undefined|null|any[]}\n */\nfunction parseArrayElements (parser, responses, i) {\n const bufferLength = parser.buffer.length\n while (i < responses.length) {\n const offset = parser.offset\n if (parser.offset >= bufferLength) {\n pushArrayCache(parser, responses, i)\n return\n }\n const response = parseType(parser, parser.buffer[parser.offset++])\n if (response === undefined) {\n if (!(parser.arrayCache.length || parser.bufferCache.length)) {\n parser.offset = offset\n }\n pushArrayCache(parser, responses, i)\n return\n }\n responses[i] = response\n i++\n }\n\n return responses\n}\n\n/**\n * Called the appropriate parser for the specified type.\n *\n * 36: $\n * 43: +\n * 42: *\n * 58: :\n * 45: -\n *\n * @param {JavascriptRedisParser} parser\n * @param {number} type\n * @returns {*}\n */\nfunction parseType (parser, type) {\n switch (type) {\n case 36:\n return parseBulkString(parser)\n case 43:\n return parseSimpleString(parser)\n case 42:\n return parseArray(parser)\n case 58:\n return parseInteger(parser)\n case 45:\n return parseError(parser)\n default:\n return handleError(parser, type)\n }\n}\n\n/**\n * Decrease the bufferPool size over time\n *\n * Balance between increasing and decreasing the bufferPool.\n * Decrease the bufferPool by 10% by removing the first 10% of the current pool.\n * @returns {undefined}\n */\nfunction decreaseBufferPool () {\n if (bufferPool.length > 50 * 1024) {\n if (counter === 1 || notDecreased > counter * 2) {\n const minSliceLen = Math.floor(bufferPool.length / 10)\n const sliceLength = minSliceLen < bufferOffset\n ? bufferOffset\n : minSliceLen\n bufferOffset = 0\n bufferPool = bufferPool.slice(sliceLength, bufferPool.length)\n } else {\n notDecreased++\n counter--\n }\n } else {\n clearInterval(interval)\n counter = 0\n notDecreased = 0\n interval = null\n }\n}\n\n/**\n * Check if the requested size fits in the current bufferPool.\n * If it does not, reset and increase the bufferPool accordingly.\n *\n * @param {number} length\n * @returns {undefined}\n */\nfunction resizeBuffer (length) {\n if (bufferPool.length < length + bufferOffset) {\n const multiplier = length > 1024 * 1024 * 75 ? 2 : 3\n if (bufferOffset > 1024 * 1024 * 111) {\n bufferOffset = 1024 * 1024 * 50\n }\n bufferPool = Buffer.allocUnsafe(length * multiplier + bufferOffset)\n bufferOffset = 0\n counter++\n if (interval === null) {\n interval = setInterval(decreaseBufferPool, 50)\n }\n }\n}\n\n/**\n * Concat a bulk string containing multiple chunks\n *\n * Notes:\n * 1) The first chunk might contain the whole bulk string including the \\r\n * 2) We are only safe to fully add up elements that are neither the first nor any of the last two elements\n *\n * @param {JavascriptRedisParser} parser\n * @returns {String}\n */\nfunction concatBulkString (parser) {\n const list = parser.bufferCache\n const oldOffset = parser.offset\n var chunks = list.length\n var offset = parser.bigStrSize - parser.totalChunkSize\n parser.offset = offset\n if (offset <= 2) {\n if (chunks === 2) {\n return list[0].toString('utf8', oldOffset, list[0].length + offset - 2)\n }\n chunks--\n offset = list[list.length - 2].length + offset\n }\n var res = decoder.write(list[0].slice(oldOffset))\n for (var i = 1; i < chunks - 1; i++) {\n res += decoder.write(list[i])\n }\n res += decoder.end(list[i].slice(0, offset - 2))\n return res\n}\n\n/**\n * Concat the collected chunks from parser.bufferCache.\n *\n * Increases the bufferPool size beforehand if necessary.\n *\n * @param {JavascriptRedisParser} parser\n * @returns {Buffer}\n */\nfunction concatBulkBuffer (parser) {\n const list = parser.bufferCache\n const oldOffset = parser.offset\n const length = parser.bigStrSize - oldOffset - 2\n var chunks = list.length\n var offset = parser.bigStrSize - parser.totalChunkSize\n parser.offset = offset\n if (offset <= 2) {\n if (chunks === 2) {\n return list[0].slice(oldOffset, list[0].length + offset - 2)\n }\n chunks--\n offset = list[list.length - 2].length + offset\n }\n resizeBuffer(length)\n const start = bufferOffset\n list[0].copy(bufferPool, start, oldOffset, list[0].length)\n bufferOffset += list[0].length - oldOffset\n for (var i = 1; i < chunks - 1; i++) {\n list[i].copy(bufferPool, bufferOffset)\n bufferOffset += list[i].length\n }\n list[i].copy(bufferPool, bufferOffset, 0, offset - 2)\n bufferOffset += offset - 2\n return bufferPool.slice(start, bufferOffset)\n}\n\nclass JavascriptRedisParser {\n /**\n * Javascript Redis Parser constructor\n * @param {{returnError: Function, returnReply: Function, returnFatalError?: Function, returnBuffers: boolean, stringNumbers: boolean }} options\n * @constructor\n */\n constructor (options) {\n if (!options) {\n throw new TypeError('Options are mandatory.')\n }\n if (typeof options.returnError !== 'function' || typeof options.returnReply !== 'function') {\n throw new TypeError('The returnReply and returnError options have to be functions.')\n }\n this.setReturnBuffers(!!options.returnBuffers)\n this.setStringNumbers(!!options.stringNumbers)\n this.returnError = options.returnError\n this.returnFatalError = options.returnFatalError || options.returnError\n this.returnReply = options.returnReply\n this.reset()\n }\n\n /**\n * Reset the parser values to the initial state\n *\n * @returns {undefined}\n */\n reset () {\n this.offset = 0\n this.buffer = null\n this.bigStrSize = 0\n this.totalChunkSize = 0\n this.bufferCache = []\n this.arrayCache = []\n this.arrayPos = []\n }\n\n /**\n * Set the returnBuffers option\n *\n * @param {boolean} returnBuffers\n * @returns {undefined}\n */\n setReturnBuffers (returnBuffers) {\n if (typeof returnBuffers !== 'boolean') {\n throw new TypeError('The returnBuffers argument has to be a boolean')\n }\n this.optionReturnBuffers = returnBuffers\n }\n\n /**\n * Set the stringNumbers option\n *\n * @param {boolean} stringNumbers\n * @returns {undefined}\n */\n setStringNumbers (stringNumbers) {\n if (typeof stringNumbers !== 'boolean') {\n throw new TypeError('The stringNumbers argument has to be a boolean')\n }\n this.optionStringNumbers = stringNumbers\n }\n\n /**\n * Parse the redis buffer\n * @param {Buffer} buffer\n * @returns {undefined}\n */\n execute (buffer) {\n if (this.buffer === null) {\n this.buffer = buffer\n this.offset = 0\n } else if (this.bigStrSize === 0) {\n const oldLength = this.buffer.length\n const remainingLength = oldLength - this.offset\n const newBuffer = Buffer.allocUnsafe(remainingLength + buffer.length)\n this.buffer.copy(newBuffer, 0, this.offset, oldLength)\n buffer.copy(newBuffer, remainingLength, 0, buffer.length)\n this.buffer = newBuffer\n this.offset = 0\n if (this.arrayCache.length) {\n const arr = parseArrayChunks(this)\n if (arr === undefined) {\n return\n }\n this.returnReply(arr)\n }\n } else if (this.totalChunkSize + buffer.length >= this.bigStrSize) {\n this.bufferCache.push(buffer)\n var tmp = this.optionReturnBuffers ? concatBulkBuffer(this) : concatBulkString(this)\n this.bigStrSize = 0\n this.bufferCache = []\n this.buffer = buffer\n if (this.arrayCache.length) {\n this.arrayCache[0][this.arrayPos[0]++] = tmp\n tmp = parseArrayChunks(this)\n if (tmp === undefined) {\n return\n }\n }\n this.returnReply(tmp)\n } else {\n this.bufferCache.push(buffer)\n this.totalChunkSize += buffer.length\n return\n }\n\n while (this.offset < this.buffer.length) {\n const offset = this.offset\n const type = this.buffer[this.offset++]\n const response = parseType(this, type)\n if (response === undefined) {\n if (!(this.arrayCache.length || this.bufferCache.length)) {\n this.offset = offset\n }\n return\n }\n\n if (type === 45) {\n this.returnError(response)\n } else {\n this.returnReply(response)\n }\n }\n\n this.buffer = null\n }\n}\n\nmodule.exports = JavascriptRedisParser\n","'use strict'\n\nmodule.exports = require('./lib/parser')\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/**\n * Tiny class to simplify dealing with subscription set\n */\nclass SubscriptionSet {\n constructor() {\n this.set = {\n subscribe: {},\n psubscribe: {},\n ssubscribe: {},\n };\n }\n add(set, channel) {\n this.set[mapSet(set)][channel] = true;\n }\n del(set, channel) {\n delete this.set[mapSet(set)][channel];\n }\n channels(set) {\n return Object.keys(this.set[mapSet(set)]);\n }\n isEmpty() {\n return (this.channels(\"subscribe\").length === 0 &&\n this.channels(\"psubscribe\").length === 0 &&\n this.channels(\"ssubscribe\").length === 0);\n }\n}\nexports.default = SubscriptionSet;\nfunction mapSet(set) {\n if (set === \"unsubscribe\") {\n return \"subscribe\";\n }\n if (set === \"punsubscribe\") {\n return \"psubscribe\";\n }\n if (set === \"sunsubscribe\") {\n return \"ssubscribe\";\n }\n return set;\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst Command_1 = require(\"./Command\");\nconst utils_1 = require(\"./utils\");\nconst RedisParser = require(\"redis-parser\");\nconst SubscriptionSet_1 = require(\"./SubscriptionSet\");\nconst debug = (0, utils_1.Debug)(\"dataHandler\");\nclass DataHandler {\n constructor(redis, parserOptions) {\n this.redis = redis;\n const parser = new RedisParser({\n stringNumbers: parserOptions.stringNumbers,\n returnBuffers: true,\n returnError: (err) => {\n this.returnError(err);\n },\n returnFatalError: (err) => {\n this.returnFatalError(err);\n },\n returnReply: (reply) => {\n this.returnReply(reply);\n },\n });\n // prependListener ensures the parser receives and processes data before socket timeout checks are performed\n redis.stream.prependListener(\"data\", (data) => {\n parser.execute(data);\n });\n // prependListener() doesn't enable flowing mode automatically - we need to resume the stream manually\n redis.stream.resume();\n }\n returnFatalError(err) {\n err.message += \". Please report this.\";\n this.redis.recoverFromFatalError(err, err, { offlineQueue: false });\n }\n returnError(err) {\n const item = this.shiftCommand(err);\n if (!item) {\n return;\n }\n err.command = {\n name: item.command.name,\n args: item.command.args,\n };\n if (item.command.name == \"ssubscribe\" && err.message.includes(\"MOVED\")) {\n this.redis.emit(\"moved\");\n return;\n }\n this.redis.handleReconnection(err, item);\n }\n returnReply(reply) {\n if (this.handleMonitorReply(reply)) {\n return;\n }\n if (this.handleSubscriberReply(reply)) {\n return;\n }\n const item = this.shiftCommand(reply);\n if (!item) {\n return;\n }\n if (Command_1.default.checkFlag(\"ENTER_SUBSCRIBER_MODE\", item.command.name)) {\n this.redis.condition.subscriber = new SubscriptionSet_1.default();\n this.redis.condition.subscriber.add(item.command.name, reply[1].toString());\n if (!fillSubCommand(item.command, reply[2])) {\n this.redis.commandQueue.unshift(item);\n }\n }\n else if (Command_1.default.checkFlag(\"EXIT_SUBSCRIBER_MODE\", item.command.name)) {\n if (!fillUnsubCommand(item.command, reply[2])) {\n this.redis.commandQueue.unshift(item);\n }\n }\n else {\n item.command.resolve(reply);\n }\n }\n handleSubscriberReply(reply) {\n if (!this.redis.condition.subscriber) {\n return false;\n }\n const replyType = Array.isArray(reply) ? reply[0].toString() : null;\n debug('receive reply \"%s\" in subscriber mode', replyType);\n switch (replyType) {\n case \"message\":\n if (this.redis.listeners(\"message\").length > 0) {\n // Check if there're listeners to avoid unnecessary `toString()`.\n this.redis.emit(\"message\", reply[1].toString(), reply[2] ? reply[2].toString() : \"\");\n }\n this.redis.emit(\"messageBuffer\", reply[1], reply[2]);\n break;\n case \"pmessage\": {\n const pattern = reply[1].toString();\n if (this.redis.listeners(\"pmessage\").length > 0) {\n this.redis.emit(\"pmessage\", pattern, reply[2].toString(), reply[3].toString());\n }\n this.redis.emit(\"pmessageBuffer\", pattern, reply[2], reply[3]);\n break;\n }\n case \"smessage\": {\n if (this.redis.listeners(\"smessage\").length > 0) {\n this.redis.emit(\"smessage\", reply[1].toString(), reply[2] ? reply[2].toString() : \"\");\n }\n this.redis.emit(\"smessageBuffer\", reply[1], reply[2]);\n break;\n }\n case \"ssubscribe\":\n case \"subscribe\":\n case \"psubscribe\": {\n const channel = reply[1].toString();\n this.redis.condition.subscriber.add(replyType, channel);\n const item = this.shiftCommand(reply);\n if (!item) {\n return;\n }\n if (!fillSubCommand(item.command, reply[2])) {\n this.redis.commandQueue.unshift(item);\n }\n break;\n }\n case \"sunsubscribe\":\n case \"unsubscribe\":\n case \"punsubscribe\": {\n const channel = reply[1] ? reply[1].toString() : null;\n if (channel) {\n this.redis.condition.subscriber.del(replyType, channel);\n }\n const count = reply[2];\n if (Number(count) === 0) {\n this.redis.condition.subscriber = false;\n }\n const item = this.shiftCommand(reply);\n if (!item) {\n return;\n }\n if (!fillUnsubCommand(item.command, count)) {\n this.redis.commandQueue.unshift(item);\n }\n break;\n }\n default: {\n const item = this.shiftCommand(reply);\n if (!item) {\n return;\n }\n item.command.resolve(reply);\n }\n }\n return true;\n }\n handleMonitorReply(reply) {\n if (this.redis.status !== \"monitoring\") {\n return false;\n }\n const replyStr = reply.toString();\n if (replyStr === \"OK\") {\n // Valid commands in the monitoring mode are AUTH and MONITOR,\n // both of which always reply with 'OK'.\n // So if we got an 'OK', we can make certain that\n // the reply is made to AUTH & MONITOR.\n return false;\n }\n // Since commands sent in the monitoring mode will trigger an exception,\n // any replies we received in the monitoring mode should consider to be\n // realtime monitor data instead of result of commands.\n const len = replyStr.indexOf(\" \");\n const timestamp = replyStr.slice(0, len);\n const argIndex = replyStr.indexOf('\"');\n const args = replyStr\n .slice(argIndex + 1, -1)\n .split('\" \"')\n .map((elem) => elem.replace(/\\\\\"/g, '\"'));\n const dbAndSource = replyStr.slice(len + 2, argIndex - 2).split(\" \");\n this.redis.emit(\"monitor\", timestamp, args, dbAndSource[1], dbAndSource[0]);\n return true;\n }\n shiftCommand(reply) {\n const item = this.redis.commandQueue.shift();\n if (!item) {\n const message = \"Command queue state error. If you can reproduce this, please report it.\";\n const error = new Error(message +\n (reply instanceof Error\n ? ` Last error: ${reply.message}`\n : ` Last reply: ${reply.toString()}`));\n this.redis.emit(\"error\", error);\n return null;\n }\n return item;\n }\n}\nexports.default = DataHandler;\nconst remainingRepliesMap = new WeakMap();\nfunction fillSubCommand(command, count) {\n let remainingReplies = remainingRepliesMap.has(command)\n ? remainingRepliesMap.get(command)\n : command.args.length;\n remainingReplies -= 1;\n if (remainingReplies <= 0) {\n command.resolve(count);\n remainingRepliesMap.delete(command);\n return true;\n }\n remainingRepliesMap.set(command, remainingReplies);\n return false;\n}\nfunction fillUnsubCommand(command, count) {\n let remainingReplies = remainingRepliesMap.has(command)\n ? remainingRepliesMap.get(command)\n : command.args.length;\n if (remainingReplies === 0) {\n if (Number(count) === 0) {\n remainingRepliesMap.delete(command);\n command.resolve(count);\n return true;\n }\n return false;\n }\n remainingReplies -= 1;\n if (remainingReplies <= 0) {\n command.resolve(count);\n return true;\n }\n remainingRepliesMap.set(command, remainingReplies);\n return false;\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.readyHandler = exports.errorHandler = exports.closeHandler = exports.connectHandler = void 0;\nconst redis_errors_1 = require(\"redis-errors\");\nconst Command_1 = require(\"../Command\");\nconst errors_1 = require(\"../errors\");\nconst utils_1 = require(\"../utils\");\nconst DataHandler_1 = require(\"../DataHandler\");\nconst debug = (0, utils_1.Debug)(\"connection\");\nfunction connectHandler(self) {\n return function () {\n var _a;\n self.setStatus(\"connect\");\n self.resetCommandQueue();\n // AUTH command should be processed before any other commands\n let flushed = false;\n const { connectionEpoch } = self;\n if (self.condition.auth) {\n self.auth(self.condition.auth, function (err) {\n if (connectionEpoch !== self.connectionEpoch) {\n return;\n }\n if (err) {\n if (err.message.indexOf(\"no password is set\") !== -1) {\n console.warn(\"[WARN] Redis server does not require a password, but a password was supplied.\");\n }\n else if (err.message.indexOf(\"without any password configured for the default user\") !== -1) {\n console.warn(\"[WARN] This Redis server's `default` user does not require a password, but a password was supplied\");\n }\n else if (err.message.indexOf(\"wrong number of arguments for 'auth' command\") !== -1) {\n console.warn(`[ERROR] The server returned \"wrong number of arguments for 'auth' command\". You are probably passing both username and password to Redis version 5 or below. You should only pass the 'password' option for Redis version 5 and under.`);\n }\n else {\n flushed = true;\n self.recoverFromFatalError(err, err);\n }\n }\n });\n }\n if (self.condition.select) {\n self.select(self.condition.select).catch((err) => {\n // If the node is in cluster mode, select is disallowed.\n // In this case, reconnect won't help.\n self.silentEmit(\"error\", err);\n });\n }\n /*\n No need to keep the reference of DataHandler here\n because we don't need to do the cleanup.\n `Stream#end()` will remove all listeners for us.\n */\n new DataHandler_1.default(self, {\n stringNumbers: self.options.stringNumbers,\n });\n const clientCommandPromises = [];\n if (self.options.connectionName) {\n debug(\"set the connection name [%s]\", self.options.connectionName);\n clientCommandPromises.push(self.client(\"setname\", self.options.connectionName).catch(utils_1.noop));\n }\n if (!self.options.disableClientInfo) {\n debug(\"set the client info\");\n clientCommandPromises.push((0, utils_1.getPackageMeta)()\n .then((packageMeta) => {\n return self\n .client(\"SETINFO\", \"LIB-VER\", packageMeta.version)\n .catch(utils_1.noop);\n })\n .catch(utils_1.noop));\n clientCommandPromises.push(self\n .client(\"SETINFO\", \"LIB-NAME\", ((_a = self.options) === null || _a === void 0 ? void 0 : _a.clientInfoTag)\n ? `ioredis(${self.options.clientInfoTag})`\n : \"ioredis\")\n .catch(utils_1.noop));\n }\n Promise.all(clientCommandPromises)\n .catch(utils_1.noop)\n .finally(() => {\n if (!self.options.enableReadyCheck) {\n exports.readyHandler(self)();\n }\n if (self.options.enableReadyCheck) {\n self._readyCheck(function (err, info) {\n if (connectionEpoch !== self.connectionEpoch) {\n return;\n }\n if (err) {\n if (!flushed) {\n self.recoverFromFatalError(new Error(\"Ready check failed: \" + err.message), err);\n }\n }\n else {\n if (self.connector.check(info)) {\n exports.readyHandler(self)();\n }\n else {\n self.disconnect(true);\n }\n }\n });\n }\n });\n };\n}\nexports.connectHandler = connectHandler;\nfunction abortError(command) {\n const err = new redis_errors_1.AbortError(\"Command aborted due to connection close\");\n err.command = {\n name: command.name,\n args: command.args,\n };\n return err;\n}\n// If a contiguous set of pipeline commands starts from index zero then they\n// can be safely reattempted. If however we have a chain of pipelined commands\n// starting at index 1 or more it means we received a partial response before\n// the connection close and those pipelined commands must be aborted. For\n// example, if the queue looks like this: [2, 3, 4, 0, 1, 2] then after\n// aborting and purging we'll have a queue that looks like this: [0, 1, 2]\nfunction abortIncompletePipelines(commandQueue) {\n var _a;\n let expectedIndex = 0;\n for (let i = 0; i < commandQueue.length;) {\n const command = (_a = commandQueue.peekAt(i)) === null || _a === void 0 ? void 0 : _a.command;\n const pipelineIndex = command.pipelineIndex;\n if (pipelineIndex === undefined || pipelineIndex === 0) {\n expectedIndex = 0;\n }\n if (pipelineIndex !== undefined && pipelineIndex !== expectedIndex++) {\n commandQueue.remove(i, 1);\n command.reject(abortError(command));\n continue;\n }\n i++;\n }\n}\n// If only a partial transaction result was received before connection close,\n// we have to abort any transaction fragments that may have ended up in the\n// offline queue\nfunction abortTransactionFragments(commandQueue) {\n var _a;\n for (let i = 0; i < commandQueue.length;) {\n const command = (_a = commandQueue.peekAt(i)) === null || _a === void 0 ? void 0 : _a.command;\n if (command.name === \"multi\") {\n break;\n }\n if (command.name === \"exec\") {\n commandQueue.remove(i, 1);\n command.reject(abortError(command));\n break;\n }\n if (command.inTransaction) {\n commandQueue.remove(i, 1);\n command.reject(abortError(command));\n }\n else {\n i++;\n }\n }\n}\nfunction closeHandler(self) {\n return function () {\n const prevStatus = self.status;\n self.setStatus(\"close\");\n if (self.commandQueue.length) {\n abortIncompletePipelines(self.commandQueue);\n }\n if (self.offlineQueue.length) {\n abortTransactionFragments(self.offlineQueue);\n }\n if (prevStatus === \"ready\") {\n if (!self.prevCondition) {\n self.prevCondition = self.condition;\n }\n if (self.commandQueue.length) {\n self.prevCommandQueue = self.commandQueue;\n }\n }\n if (self.manuallyClosing) {\n self.manuallyClosing = false;\n debug(\"skip reconnecting since the connection is manually closed.\");\n return close();\n }\n if (typeof self.options.retryStrategy !== \"function\") {\n debug(\"skip reconnecting because `retryStrategy` is not a function\");\n return close();\n }\n const retryDelay = self.options.retryStrategy(++self.retryAttempts);\n if (typeof retryDelay !== \"number\") {\n debug(\"skip reconnecting because `retryStrategy` doesn't return a number\");\n return close();\n }\n debug(\"reconnect in %sms\", retryDelay);\n self.setStatus(\"reconnecting\", retryDelay);\n self.reconnectTimeout = setTimeout(function () {\n self.reconnectTimeout = null;\n self.connect().catch(utils_1.noop);\n }, retryDelay);\n const { maxRetriesPerRequest } = self.options;\n if (typeof maxRetriesPerRequest === \"number\") {\n if (maxRetriesPerRequest < 0) {\n debug(\"maxRetriesPerRequest is negative, ignoring...\");\n }\n else {\n const remainder = self.retryAttempts % (maxRetriesPerRequest + 1);\n if (remainder === 0) {\n debug(\"reach maxRetriesPerRequest limitation, flushing command queue...\");\n self.flushQueue(new errors_1.MaxRetriesPerRequestError(maxRetriesPerRequest));\n }\n }\n }\n };\n function close() {\n self.setStatus(\"end\");\n self.flushQueue(new Error(utils_1.CONNECTION_CLOSED_ERROR_MSG));\n }\n}\nexports.closeHandler = closeHandler;\nfunction errorHandler(self) {\n return function (error) {\n debug(\"error: %s\", error);\n self.silentEmit(\"error\", error);\n };\n}\nexports.errorHandler = errorHandler;\nfunction readyHandler(self) {\n return function () {\n self.setStatus(\"ready\");\n self.retryAttempts = 0;\n if (self.options.monitor) {\n self.call(\"monitor\").then(() => self.setStatus(\"monitoring\"), (error) => self.emit(\"error\", error));\n const { sendCommand } = self;\n self.sendCommand = function (command) {\n if (Command_1.default.checkFlag(\"VALID_IN_MONITOR_MODE\", command.name)) {\n return sendCommand.call(self, command);\n }\n command.reject(new Error(\"Connection is in monitoring mode, can't process commands.\"));\n return command.promise;\n };\n self.once(\"close\", function () {\n delete self.sendCommand;\n });\n return;\n }\n const finalSelect = self.prevCondition\n ? self.prevCondition.select\n : self.condition.select;\n if (self.options.readOnly) {\n debug(\"set the connection to readonly mode\");\n self.readonly().catch(utils_1.noop);\n }\n if (self.prevCondition) {\n const condition = self.prevCondition;\n self.prevCondition = null;\n if (condition.subscriber && self.options.autoResubscribe) {\n // We re-select the previous db first since\n // `SELECT` command is not valid in sub mode.\n if (self.condition.select !== finalSelect) {\n debug(\"connect to db [%d]\", finalSelect);\n self.select(finalSelect);\n }\n const subscribeChannels = condition.subscriber.channels(\"subscribe\");\n if (subscribeChannels.length) {\n debug(\"subscribe %d channels\", subscribeChannels.length);\n self.subscribe(subscribeChannels);\n }\n const psubscribeChannels = condition.subscriber.channels(\"psubscribe\");\n if (psubscribeChannels.length) {\n debug(\"psubscribe %d channels\", psubscribeChannels.length);\n self.psubscribe(psubscribeChannels);\n }\n const ssubscribeChannels = condition.subscriber.channels(\"ssubscribe\");\n if (ssubscribeChannels.length) {\n debug(\"ssubscribe %s\", ssubscribeChannels.length);\n for (const channel of ssubscribeChannels) {\n self.ssubscribe(channel);\n }\n }\n }\n }\n if (self.prevCommandQueue) {\n if (self.options.autoResendUnfulfilledCommands) {\n debug(\"resend %d unfulfilled commands\", self.prevCommandQueue.length);\n while (self.prevCommandQueue.length > 0) {\n const item = self.prevCommandQueue.shift();\n if (item.select !== self.condition.select &&\n item.command.name !== \"select\") {\n self.select(item.select);\n }\n self.sendCommand(item.command, item.stream);\n }\n }\n else {\n self.prevCommandQueue = null;\n }\n }\n if (self.offlineQueue.length) {\n debug(\"send %d commands in offline queue\", self.offlineQueue.length);\n const offlineQueue = self.offlineQueue;\n self.resetOfflineQueue();\n while (offlineQueue.length > 0) {\n const item = offlineQueue.shift();\n if (item.select !== self.condition.select &&\n item.command.name !== \"select\") {\n self.select(item.select);\n }\n self.sendCommand(item.command, item.stream);\n }\n }\n if (self.condition.select !== finalSelect) {\n debug(\"connect to db [%d]\", finalSelect);\n self.select(finalSelect);\n }\n };\n}\nexports.readyHandler = readyHandler;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DEFAULT_REDIS_OPTIONS = void 0;\nexports.DEFAULT_REDIS_OPTIONS = {\n // Connection\n port: 6379,\n host: \"localhost\",\n family: 0,\n connectTimeout: 10000,\n disconnectTimeout: 2000,\n retryStrategy: function (times) {\n return Math.min(times * 50, 2000);\n },\n keepAlive: 0,\n noDelay: true,\n connectionName: null,\n disableClientInfo: false,\n clientInfoTag: undefined,\n // Sentinel\n sentinels: null,\n name: null,\n role: \"master\",\n sentinelRetryStrategy: function (times) {\n return Math.min(times * 10, 1000);\n },\n sentinelReconnectStrategy: function () {\n // This strategy only applies when sentinels are used for detecting\n // a failover, not during initial master resolution.\n // The deployment can still function when some of the sentinels are down\n // for a long period of time, so we may not want to attempt reconnection\n // very often. Therefore the default interval is fairly long (1 minute).\n return 60000;\n },\n natMap: null,\n enableTLSForSentinelMode: false,\n updateSentinels: true,\n failoverDetector: false,\n // Status\n username: null,\n password: null,\n db: 0,\n // Others\n enableOfflineQueue: true,\n enableReadyCheck: true,\n autoResubscribe: true,\n autoResendUnfulfilledCommands: true,\n lazyConnect: false,\n keyPrefix: \"\",\n reconnectOnError: null,\n readOnly: false,\n stringNumbers: false,\n maxRetriesPerRequest: 20,\n maxLoadingRetryTime: 10000,\n enableAutoPipelining: false,\n autoPipeliningIgnoredCommands: [],\n sentinelMaxConnections: 10,\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst commands_1 = require(\"@ioredis/commands\");\nconst events_1 = require(\"events\");\nconst standard_as_callback_1 = require(\"standard-as-callback\");\nconst cluster_1 = require(\"./cluster\");\nconst Command_1 = require(\"./Command\");\nconst connectors_1 = require(\"./connectors\");\nconst SentinelConnector_1 = require(\"./connectors/SentinelConnector\");\nconst eventHandler = require(\"./redis/event_handler\");\nconst RedisOptions_1 = require(\"./redis/RedisOptions\");\nconst ScanStream_1 = require(\"./ScanStream\");\nconst transaction_1 = require(\"./transaction\");\nconst utils_1 = require(\"./utils\");\nconst applyMixin_1 = require(\"./utils/applyMixin\");\nconst Commander_1 = require(\"./utils/Commander\");\nconst lodash_1 = require(\"./utils/lodash\");\nconst Deque = require(\"denque\");\nconst debug = (0, utils_1.Debug)(\"redis\");\n/**\n * This is the major component of ioredis.\n * Use it to connect to a standalone Redis server or Sentinels.\n *\n * ```typescript\n * const redis = new Redis(); // Default port is 6379\n * async function main() {\n * redis.set(\"foo\", \"bar\");\n * redis.get(\"foo\", (err, result) => {\n * // `result` should be \"bar\"\n * console.log(err, result);\n * });\n * // Or use Promise\n * const result = await redis.get(\"foo\");\n * }\n * ```\n */\nclass Redis extends Commander_1.default {\n constructor(arg1, arg2, arg3) {\n super();\n this.status = \"wait\";\n /**\n * @ignore\n */\n this.isCluster = false;\n this.reconnectTimeout = null;\n this.connectionEpoch = 0;\n this.retryAttempts = 0;\n this.manuallyClosing = false;\n // Prepare autopipelines structures\n this._autoPipelines = new Map();\n this._runningAutoPipelines = new Set();\n this.parseOptions(arg1, arg2, arg3);\n events_1.EventEmitter.call(this);\n this.resetCommandQueue();\n this.resetOfflineQueue();\n if (this.options.Connector) {\n this.connector = new this.options.Connector(this.options);\n }\n else if (this.options.sentinels) {\n const sentinelConnector = new SentinelConnector_1.default(this.options);\n sentinelConnector.emitter = this;\n this.connector = sentinelConnector;\n }\n else {\n this.connector = new connectors_1.StandaloneConnector(this.options);\n }\n if (this.options.scripts) {\n Object.entries(this.options.scripts).forEach(([name, definition]) => {\n this.defineCommand(name, definition);\n });\n }\n // end(or wait) -> connecting -> connect -> ready -> end\n if (this.options.lazyConnect) {\n this.setStatus(\"wait\");\n }\n else {\n this.connect().catch(lodash_1.noop);\n }\n }\n /**\n * Create a Redis instance.\n * This is the same as `new Redis()` but is included for compatibility with node-redis.\n */\n static createClient(...args) {\n return new Redis(...args);\n }\n get autoPipelineQueueSize() {\n let queued = 0;\n for (const pipeline of this._autoPipelines.values()) {\n queued += pipeline.length;\n }\n return queued;\n }\n /**\n * Create a connection to Redis.\n * This method will be invoked automatically when creating a new Redis instance\n * unless `lazyConnect: true` is passed.\n *\n * When calling this method manually, a Promise is returned, which will\n * be resolved when the connection status is ready. The promise can reject\n * if the connection fails, times out, or if Redis is already connecting/connected.\n */\n connect(callback) {\n const promise = new Promise((resolve, reject) => {\n if (this.status === \"connecting\" ||\n this.status === \"connect\" ||\n this.status === \"ready\") {\n reject(new Error(\"Redis is already connecting/connected\"));\n return;\n }\n this.connectionEpoch += 1;\n this.setStatus(\"connecting\");\n const { options } = this;\n this.condition = {\n select: options.db,\n auth: options.username\n ? [options.username, options.password]\n : options.password,\n subscriber: false,\n };\n const _this = this;\n (0, standard_as_callback_1.default)(this.connector.connect(function (type, err) {\n _this.silentEmit(type, err);\n }), function (err, stream) {\n if (err) {\n _this.flushQueue(err);\n _this.silentEmit(\"error\", err);\n reject(err);\n _this.setStatus(\"end\");\n return;\n }\n let CONNECT_EVENT = options.tls ? \"secureConnect\" : \"connect\";\n if (\"sentinels\" in options &&\n options.sentinels &&\n !options.enableTLSForSentinelMode) {\n CONNECT_EVENT = \"connect\";\n }\n _this.stream = stream;\n if (options.noDelay) {\n stream.setNoDelay(true);\n }\n // Node ignores setKeepAlive before connect, therefore we wait for the event:\n // https://github.com/nodejs/node/issues/31663\n if (typeof options.keepAlive === \"number\") {\n if (stream.connecting) {\n stream.once(CONNECT_EVENT, () => {\n stream.setKeepAlive(true, options.keepAlive);\n });\n }\n else {\n stream.setKeepAlive(true, options.keepAlive);\n }\n }\n if (stream.connecting) {\n stream.once(CONNECT_EVENT, eventHandler.connectHandler(_this));\n if (options.connectTimeout) {\n /*\n * Typically, Socket#setTimeout(0) will clear the timer\n * set before. However, in some platforms (Electron 3.x~4.x),\n * the timer will not be cleared. So we introduce a variable here.\n *\n * See https://github.com/electron/electron/issues/14915\n */\n let connectTimeoutCleared = false;\n stream.setTimeout(options.connectTimeout, function () {\n if (connectTimeoutCleared) {\n return;\n }\n stream.setTimeout(0);\n stream.destroy();\n const err = new Error(\"connect ETIMEDOUT\");\n // @ts-expect-error\n err.errorno = \"ETIMEDOUT\";\n // @ts-expect-error\n err.code = \"ETIMEDOUT\";\n // @ts-expect-error\n err.syscall = \"connect\";\n eventHandler.errorHandler(_this)(err);\n });\n stream.once(CONNECT_EVENT, function () {\n connectTimeoutCleared = true;\n stream.setTimeout(0);\n });\n }\n }\n else if (stream.destroyed) {\n const firstError = _this.connector.firstError;\n if (firstError) {\n process.nextTick(() => {\n eventHandler.errorHandler(_this)(firstError);\n });\n }\n process.nextTick(eventHandler.closeHandler(_this));\n }\n else {\n process.nextTick(eventHandler.connectHandler(_this));\n }\n if (!stream.destroyed) {\n stream.once(\"error\", eventHandler.errorHandler(_this));\n stream.once(\"close\", eventHandler.closeHandler(_this));\n }\n const connectionReadyHandler = function () {\n _this.removeListener(\"close\", connectionCloseHandler);\n resolve();\n };\n var connectionCloseHandler = function () {\n _this.removeListener(\"ready\", connectionReadyHandler);\n reject(new Error(utils_1.CONNECTION_CLOSED_ERROR_MSG));\n };\n _this.once(\"ready\", connectionReadyHandler);\n _this.once(\"close\", connectionCloseHandler);\n });\n });\n return (0, standard_as_callback_1.default)(promise, callback);\n }\n /**\n * Disconnect from Redis.\n *\n * This method closes the connection immediately,\n * and may lose some pending replies that haven't written to client.\n * If you want to wait for the pending replies, use Redis#quit instead.\n */\n disconnect(reconnect = false) {\n if (!reconnect) {\n this.manuallyClosing = true;\n }\n if (this.reconnectTimeout && !reconnect) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = null;\n }\n if (this.status === \"wait\") {\n eventHandler.closeHandler(this)();\n }\n else {\n this.connector.disconnect();\n }\n }\n /**\n * Disconnect from Redis.\n *\n * @deprecated\n */\n end() {\n this.disconnect();\n }\n /**\n * Create a new instance with the same options as the current one.\n *\n * @example\n * ```js\n * var redis = new Redis(6380);\n * var anotherRedis = redis.duplicate();\n * ```\n */\n duplicate(override) {\n return new Redis({ ...this.options, ...override });\n }\n /**\n * Mode of the connection.\n *\n * One of `\"normal\"`, `\"subscriber\"`, or `\"monitor\"`. When the connection is\n * not in `\"normal\"` mode, certain commands are not allowed.\n */\n get mode() {\n var _a;\n return this.options.monitor\n ? \"monitor\"\n : ((_a = this.condition) === null || _a === void 0 ? void 0 : _a.subscriber)\n ? \"subscriber\"\n : \"normal\";\n }\n /**\n * Listen for all requests received by the server in real time.\n *\n * This command will create a new connection to Redis and send a\n * MONITOR command via the new connection in order to avoid disturbing\n * the current connection.\n *\n * @param callback The callback function. If omit, a promise will be returned.\n * @example\n * ```js\n * var redis = new Redis();\n * redis.monitor(function (err, monitor) {\n * // Entering monitoring mode.\n * monitor.on('monitor', function (time, args, source, database) {\n * console.log(time + \": \" + util.inspect(args));\n * });\n * });\n *\n * // supports promise as well as other commands\n * redis.monitor().then(function (monitor) {\n * monitor.on('monitor', function (time, args, source, database) {\n * console.log(time + \": \" + util.inspect(args));\n * });\n * });\n * ```\n */\n monitor(callback) {\n const monitorInstance = this.duplicate({\n monitor: true,\n lazyConnect: false,\n });\n return (0, standard_as_callback_1.default)(new Promise(function (resolve, reject) {\n monitorInstance.once(\"error\", reject);\n monitorInstance.once(\"monitoring\", function () {\n resolve(monitorInstance);\n });\n }), callback);\n }\n /**\n * Send a command to Redis\n *\n * This method is used internally and in most cases you should not\n * use it directly. If you need to send a command that is not supported\n * by the library, you can use the `call` method:\n *\n * ```js\n * const redis = new Redis();\n *\n * redis.call('set', 'foo', 'bar');\n * // or\n * redis.call(['set', 'foo', 'bar']);\n * ```\n *\n * @ignore\n */\n sendCommand(command, stream) {\n var _a, _b;\n if (this.status === \"wait\") {\n this.connect().catch(lodash_1.noop);\n }\n if (this.status === \"end\") {\n command.reject(new Error(utils_1.CONNECTION_CLOSED_ERROR_MSG));\n return command.promise;\n }\n if (((_a = this.condition) === null || _a === void 0 ? void 0 : _a.subscriber) &&\n !Command_1.default.checkFlag(\"VALID_IN_SUBSCRIBER_MODE\", command.name)) {\n command.reject(new Error(\"Connection in subscriber mode, only subscriber commands may be used\"));\n return command.promise;\n }\n if (typeof this.options.commandTimeout === \"number\") {\n command.setTimeout(this.options.commandTimeout);\n }\n let writable = this.status === \"ready\" ||\n (!stream &&\n this.status === \"connect\" &&\n (0, commands_1.exists)(command.name) &&\n ((0, commands_1.hasFlag)(command.name, \"loading\") ||\n Command_1.default.checkFlag(\"HANDSHAKE_COMMANDS\", command.name)));\n if (!this.stream) {\n writable = false;\n }\n else if (!this.stream.writable) {\n writable = false;\n // @ts-expect-error\n }\n else if (this.stream._writableState && this.stream._writableState.ended) {\n // TODO: We should be able to remove this as the PR has already been merged.\n // https://github.com/iojs/io.js/pull/1217\n writable = false;\n }\n if (!writable) {\n if (!this.options.enableOfflineQueue) {\n command.reject(new Error(\"Stream isn't writeable and enableOfflineQueue options is false\"));\n return command.promise;\n }\n if (command.name === \"quit\" && this.offlineQueue.length === 0) {\n this.disconnect();\n command.resolve(Buffer.from(\"OK\"));\n return command.promise;\n }\n // @ts-expect-error\n if (debug.enabled) {\n debug(\"queue command[%s]: %d -> %s(%o)\", this._getDescription(), this.condition.select, command.name, command.args);\n }\n this.offlineQueue.push({\n command: command,\n stream: stream,\n select: this.condition.select,\n });\n }\n else {\n // @ts-expect-error\n if (debug.enabled) {\n debug(\"write command[%s]: %d -> %s(%o)\", this._getDescription(), (_b = this.condition) === null || _b === void 0 ? void 0 : _b.select, command.name, command.args);\n }\n if (stream) {\n if (\"isPipeline\" in stream && stream.isPipeline) {\n stream.write(command.toWritable(stream.destination.redis.stream));\n }\n else {\n stream.write(command.toWritable(stream));\n }\n }\n else {\n this.stream.write(command.toWritable(this.stream));\n }\n this.commandQueue.push({\n command: command,\n stream: stream,\n select: this.condition.select,\n });\n if (Command_1.default.checkFlag(\"WILL_DISCONNECT\", command.name)) {\n this.manuallyClosing = true;\n }\n if (this.options.socketTimeout !== undefined && this.socketTimeoutTimer === undefined) {\n this.setSocketTimeout();\n }\n }\n if (command.name === \"select\" && (0, utils_1.isInt)(command.args[0])) {\n const db = parseInt(command.args[0], 10);\n if (this.condition.select !== db) {\n this.condition.select = db;\n this.emit(\"select\", db);\n debug(\"switch to db [%d]\", this.condition.select);\n }\n }\n return command.promise;\n }\n setSocketTimeout() {\n this.socketTimeoutTimer = setTimeout(() => {\n this.stream.destroy(new Error(`Socket timeout. Expecting data, but didn't receive any in ${this.options.socketTimeout}ms.`));\n this.socketTimeoutTimer = undefined;\n }, this.options.socketTimeout);\n // this handler must run after the \"data\" handler in \"DataHandler\"\n // so that `this.commandQueue.length` will be updated\n this.stream.once(\"data\", () => {\n clearTimeout(this.socketTimeoutTimer);\n this.socketTimeoutTimer = undefined;\n if (this.commandQueue.length === 0)\n return;\n this.setSocketTimeout();\n });\n }\n scanStream(options) {\n return this.createScanStream(\"scan\", { options });\n }\n scanBufferStream(options) {\n return this.createScanStream(\"scanBuffer\", { options });\n }\n sscanStream(key, options) {\n return this.createScanStream(\"sscan\", { key, options });\n }\n sscanBufferStream(key, options) {\n return this.createScanStream(\"sscanBuffer\", { key, options });\n }\n hscanStream(key, options) {\n return this.createScanStream(\"hscan\", { key, options });\n }\n hscanBufferStream(key, options) {\n return this.createScanStream(\"hscanBuffer\", { key, options });\n }\n zscanStream(key, options) {\n return this.createScanStream(\"zscan\", { key, options });\n }\n zscanBufferStream(key, options) {\n return this.createScanStream(\"zscanBuffer\", { key, options });\n }\n /**\n * Emit only when there's at least one listener.\n *\n * @ignore\n */\n silentEmit(eventName, arg) {\n let error;\n if (eventName === \"error\") {\n error = arg;\n if (this.status === \"end\") {\n return;\n }\n if (this.manuallyClosing) {\n // ignore connection related errors when manually disconnecting\n if (error instanceof Error &&\n (error.message === utils_1.CONNECTION_CLOSED_ERROR_MSG ||\n // @ts-expect-error\n error.syscall === \"connect\" ||\n // @ts-expect-error\n error.syscall === \"read\")) {\n return;\n }\n }\n }\n if (this.listeners(eventName).length > 0) {\n return this.emit.apply(this, arguments);\n }\n if (error && error instanceof Error) {\n console.error(\"[ioredis] Unhandled error event:\", error.stack);\n }\n return false;\n }\n /**\n * @ignore\n */\n recoverFromFatalError(_commandError, err, options) {\n this.flushQueue(err, options);\n this.silentEmit(\"error\", err);\n this.disconnect(true);\n }\n /**\n * @ignore\n */\n handleReconnection(err, item) {\n var _a;\n let needReconnect = false;\n if (this.options.reconnectOnError &&\n !Command_1.default.checkFlag(\"IGNORE_RECONNECT_ON_ERROR\", item.command.name)) {\n needReconnect = this.options.reconnectOnError(err);\n }\n switch (needReconnect) {\n case 1:\n case true:\n if (this.status !== \"reconnecting\") {\n this.disconnect(true);\n }\n item.command.reject(err);\n break;\n case 2:\n if (this.status !== \"reconnecting\") {\n this.disconnect(true);\n }\n if (((_a = this.condition) === null || _a === void 0 ? void 0 : _a.select) !== item.select &&\n item.command.name !== \"select\") {\n this.select(item.select);\n }\n // TODO\n // @ts-expect-error\n this.sendCommand(item.command);\n break;\n default:\n item.command.reject(err);\n }\n }\n /**\n * Get description of the connection. Used for debugging.\n */\n _getDescription() {\n let description;\n if (\"path\" in this.options && this.options.path) {\n description = this.options.path;\n }\n else if (this.stream &&\n this.stream.remoteAddress &&\n this.stream.remotePort) {\n description = this.stream.remoteAddress + \":\" + this.stream.remotePort;\n }\n else if (\"host\" in this.options && this.options.host) {\n description = this.options.host + \":\" + this.options.port;\n }\n else {\n // Unexpected\n description = \"\";\n }\n if (this.options.connectionName) {\n description += ` (${this.options.connectionName})`;\n }\n return description;\n }\n resetCommandQueue() {\n this.commandQueue = new Deque();\n }\n resetOfflineQueue() {\n this.offlineQueue = new Deque();\n }\n parseOptions(...args) {\n const options = {};\n let isTls = false;\n for (let i = 0; i < args.length; ++i) {\n const arg = args[i];\n if (arg === null || typeof arg === \"undefined\") {\n continue;\n }\n if (typeof arg === \"object\") {\n (0, lodash_1.defaults)(options, arg);\n }\n else if (typeof arg === \"string\") {\n (0, lodash_1.defaults)(options, (0, utils_1.parseURL)(arg));\n if (arg.startsWith(\"rediss://\")) {\n isTls = true;\n }\n }\n else if (typeof arg === \"number\") {\n options.port = arg;\n }\n else {\n throw new Error(\"Invalid argument \" + arg);\n }\n }\n if (isTls) {\n (0, lodash_1.defaults)(options, { tls: true });\n }\n (0, lodash_1.defaults)(options, Redis.defaultOptions);\n if (typeof options.port === \"string\") {\n options.port = parseInt(options.port, 10);\n }\n if (typeof options.db === \"string\") {\n options.db = parseInt(options.db, 10);\n }\n // @ts-expect-error\n this.options = (0, utils_1.resolveTLSProfile)(options);\n }\n /**\n * Change instance's status\n */\n setStatus(status, arg) {\n // @ts-expect-error\n if (debug.enabled) {\n debug(\"status[%s]: %s -> %s\", this._getDescription(), this.status || \"[empty]\", status);\n }\n this.status = status;\n process.nextTick(this.emit.bind(this, status, arg));\n }\n createScanStream(command, { key, options = {} }) {\n return new ScanStream_1.default({\n objectMode: true,\n key: key,\n redis: this,\n command: command,\n ...options,\n });\n }\n /**\n * Flush offline queue and command queue with error.\n *\n * @param error The error object to send to the commands\n * @param options options\n */\n flushQueue(error, options) {\n options = (0, lodash_1.defaults)({}, options, {\n offlineQueue: true,\n commandQueue: true,\n });\n let item;\n if (options.offlineQueue) {\n while ((item = this.offlineQueue.shift())) {\n item.command.reject(error);\n }\n }\n if (options.commandQueue) {\n if (this.commandQueue.length > 0) {\n if (this.stream) {\n this.stream.removeAllListeners(\"data\");\n }\n while ((item = this.commandQueue.shift())) {\n item.command.reject(error);\n }\n }\n }\n }\n /**\n * Check whether Redis has finished loading the persistent data and is able to\n * process commands.\n */\n _readyCheck(callback) {\n const _this = this;\n this.info(function (err, res) {\n if (err) {\n if (err.message && err.message.includes(\"NOPERM\")) {\n console.warn(`Skipping the ready check because INFO command fails: \"${err.message}\". You can disable ready check with \"enableReadyCheck\". More: https://github.com/luin/ioredis/wiki/Disable-ready-check.`);\n return callback(null, {});\n }\n return callback(err);\n }\n if (typeof res !== \"string\") {\n return callback(null, res);\n }\n const info = {};\n const lines = res.split(\"\\r\\n\");\n for (let i = 0; i < lines.length; ++i) {\n const [fieldName, ...fieldValueParts] = lines[i].split(\":\");\n const fieldValue = fieldValueParts.join(\":\");\n if (fieldValue) {\n info[fieldName] = fieldValue;\n }\n }\n if (!info.loading || info.loading === \"0\") {\n callback(null, info);\n }\n else {\n const loadingEtaMs = (info.loading_eta_seconds || 1) * 1000;\n const retryTime = _this.options.maxLoadingRetryTime &&\n _this.options.maxLoadingRetryTime < loadingEtaMs\n ? _this.options.maxLoadingRetryTime\n : loadingEtaMs;\n debug(\"Redis server still loading, trying again in \" + retryTime + \"ms\");\n setTimeout(function () {\n _this._readyCheck(callback);\n }, retryTime);\n }\n }).catch(lodash_1.noop);\n }\n}\nRedis.Cluster = cluster_1.default;\nRedis.Command = Command_1.default;\n/**\n * Default options\n */\nRedis.defaultOptions = RedisOptions_1.DEFAULT_REDIS_OPTIONS;\n(0, applyMixin_1.default)(Redis, events_1.EventEmitter);\n(0, transaction_1.addTransactionSupport)(Redis.prototype);\nexports.default = Redis;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.print = exports.ReplyError = exports.SentinelIterator = exports.SentinelConnector = exports.AbstractConnector = exports.Pipeline = exports.ScanStream = exports.Command = exports.Cluster = exports.Redis = exports.default = void 0;\nexports = module.exports = require(\"./Redis\").default;\nvar Redis_1 = require(\"./Redis\");\nObject.defineProperty(exports, \"default\", { enumerable: true, get: function () { return Redis_1.default; } });\nvar Redis_2 = require(\"./Redis\");\nObject.defineProperty(exports, \"Redis\", { enumerable: true, get: function () { return Redis_2.default; } });\nvar cluster_1 = require(\"./cluster\");\nObject.defineProperty(exports, \"Cluster\", { enumerable: true, get: function () { return cluster_1.default; } });\n/**\n * @ignore\n */\nvar Command_1 = require(\"./Command\");\nObject.defineProperty(exports, \"Command\", { enumerable: true, get: function () { return Command_1.default; } });\n/**\n * @ignore\n */\nvar ScanStream_1 = require(\"./ScanStream\");\nObject.defineProperty(exports, \"ScanStream\", { enumerable: true, get: function () { return ScanStream_1.default; } });\n/**\n * @ignore\n */\nvar Pipeline_1 = require(\"./Pipeline\");\nObject.defineProperty(exports, \"Pipeline\", { enumerable: true, get: function () { return Pipeline_1.default; } });\n/**\n * @ignore\n */\nvar AbstractConnector_1 = require(\"./connectors/AbstractConnector\");\nObject.defineProperty(exports, \"AbstractConnector\", { enumerable: true, get: function () { return AbstractConnector_1.default; } });\n/**\n * @ignore\n */\nvar SentinelConnector_1 = require(\"./connectors/SentinelConnector\");\nObject.defineProperty(exports, \"SentinelConnector\", { enumerable: true, get: function () { return SentinelConnector_1.default; } });\nObject.defineProperty(exports, \"SentinelIterator\", { enumerable: true, get: function () { return SentinelConnector_1.SentinelIterator; } });\n// No TS typings\nexports.ReplyError = require(\"redis-errors\").ReplyError;\n/**\n * @ignore\n */\nObject.defineProperty(exports, \"Promise\", {\n get() {\n console.warn(\"ioredis v5 does not support plugging third-party Promise library anymore. Native Promise will be used.\");\n return Promise;\n },\n set(_lib) {\n console.warn(\"ioredis v5 does not support plugging third-party Promise library anymore. Native Promise will be used.\");\n },\n});\n/**\n * @ignore\n */\nfunction print(err, reply) {\n if (err) {\n console.log(\"Error: \" + err);\n }\n else {\n console.log(\"Reply: \" + reply);\n }\n}\nexports.print = print;\n","export { startDevServer, startProdServer } from \"./server\";\r\nexport { InitServerData, ServerConfig, type RealtimeConfig } from \"@server/index\";\r\nexport { buildApp } from \"@build/index\";\r\nexport {\r\n ServerContext,\r\n LoaderResult,\r\n RouteMiddleware,\r\n ApiMiddleware,\r\n ApiContext,\r\n MetadataLoader,\r\n GenerateStaticParams,\r\n ServerLoader,\r\n WssContext,\r\n WssActions,\r\n} from \"@router/index.types\";\r\nexport {\r\n defineWssRoute,\r\n type WssRouteDefinition,\r\n type WssEventDefinition,\r\n type WssHandler,\r\n type AuthFn,\r\n type GuardFn,\r\n type AuthContext,\r\n type RateLimitCfg,\r\n type Schema,\r\n type RealtimeStateStore,\r\n type RealtimeLogger,\r\n type RealtimeMetrics,\r\n} from \"@realtime/index\";\r\nexport { bootstrapClient } from \"@runtime/client\";\r\nexport {\r\n FrameworkConfig,\r\n loadConfig,\r\n DEFAULT_CONFIG,\r\n getAppDir,\r\n getBuildDir,\r\n getStaticDir,\r\n} from \"./config\";\r\nexport { withCache } from \"@cache/index\";\r\nexport { validate, safeValidate, ValidationError, commonSchemas } from \"@validation/index\";\r\nexport { sanitizeString, sanitizeObject, sanitizeParams, sanitizeQuery } from \"@security/sanitize\";\r\nexport { createRateLimiter, defaultRateLimiter, strictRateLimiter, lenientRateLimiter } from \"@server/middleware/rate-limit\";\r\nexport {\r\n logger,\r\n Logger,\r\n createModuleLogger,\r\n getLogger,\r\n setLogger,\r\n resetLogger,\r\n requestLoggerMiddleware,\r\n getRequestLogger,\r\n generateRequestId,\r\n type LogLevel,\r\n type LoggerContext,\r\n type LoggerOptions,\r\n} from \"@logger/index\";\r\n","import fs from \"fs\";\r\nimport path from \"path\";\r\nimport { runInitIfExists } from \"@server/init\";\r\nimport { setupServer, setupRoutes, setupWssEvents } from \"@server/index\";\r\nimport { setupApplication } from \"@server/application\";\r\nimport { FilesystemRouteLoader, ManifestRouteLoader } from \"@router/index\";\r\nimport {\r\n loadConfig,\r\n ConfigValidationError,\r\n getAppDir,\r\n getBuildDir,\r\n type FrameworkConfig,\r\n} from \"./config\";\r\nimport { createModuleLogger } from \"@logger/index\";\r\nimport dotenv from \"dotenv\";\r\n\r\n// Load .env file if it exists (optional)\r\nconst envPath = path.join(process.cwd(), \".env\");\r\nif (fs.existsSync(envPath)) {\r\n dotenv.config({ path: envPath });\r\n} else {\r\n // Try default dotenv.config() which looks for .env in current directory\r\n dotenv.config();\r\n}\r\n\r\nconst logger = createModuleLogger(\"server\");\r\n\r\nexport interface StartServerOptions {\r\n port?: number;\r\n rootDir?: string;\r\n appDir?: string;\r\n isDev?: boolean;\r\n config?: FrameworkConfig;\r\n}\r\n\r\n/**\r\n * Unified server startup function.\r\n * Handles both development and production modes.\r\n *\r\n * @param options - Server startup options\r\n */\r\nexport async function startServer(options: StartServerOptions = {}) {\r\n const isDev = options.isDev ?? process.env.NODE_ENV === \"development\";\r\n const projectRoot = options.rootDir ?? process.cwd();\r\n\r\n // Load and validate configuration\r\n let config: FrameworkConfig;\r\n try {\r\n config = options.config ?? loadConfig(projectRoot);\r\n } catch (error) {\r\n if (error instanceof ConfigValidationError) {\r\n console.error('\\n' + error.message + '\\n');\r\n process.exit(1);\r\n }\r\n throw error;\r\n }\r\n\r\n // Use config values, but allow overrides from options and environment variables\r\n // PORT and HOST are standard environment variables in hosting platforms (Render, Heroku, etc.)\r\n const port =\r\n options.port ??\r\n (process.env.PORT ? parseInt(process.env.PORT, 10) : undefined) ??\r\n config.server.port;\r\n\r\n // In production, default to 0.0.0.0 to be accessible from outside\r\n // This is required for platforms like Render.com, Heroku, etc.\r\n const host =\r\n process.env.HOST ?? (!isDev ? \"0.0.0.0\" : undefined) ?? config.server.host;\r\n\r\n const appDir =\r\n options.appDir ??\r\n (isDev\r\n ? getAppDir(projectRoot, config)\r\n : path.join(getBuildDir(projectRoot, config), \"server\"));\r\n\r\n if (!isDev && !fs.existsSync(appDir)) {\r\n logger.error(\"Compiled directory not found\", undefined, {\r\n buildDir: config.directories.build,\r\n appDir,\r\n environment: \"production\",\r\n });\r\n process.exit(1);\r\n }\r\n\r\n const { app, httpServer } = await setupApplication({\r\n projectRoot,\r\n });\r\n\r\n // Run init.server.ts if it exists (allows user to set up server hooks, middleware, etc.)\r\n await runInitIfExists(projectRoot, { server: httpServer });\r\n\r\n const { routes, apiRoutes, wssRoutes, notFoundPage, errorPage, getRoutes } =\r\n setupServer(app, {\r\n projectRoot,\r\n appDir,\r\n isDev,\r\n config,\r\n });\r\n\r\n const routeLoader = isDev\r\n ? new FilesystemRouteLoader(appDir, projectRoot)\r\n : new ManifestRouteLoader(projectRoot);\r\n\r\n // Set up Socket.IO server and WebSocket event handlers\r\n await setupWssEvents({\r\n httpServer,\r\n wssRoutes,\r\n projectRoot,\r\n });\r\n\r\n setupRoutes({\r\n app,\r\n routes,\r\n apiRoutes,\r\n notFoundPage,\r\n errorPage,\r\n isDev,\r\n projectRoot,\r\n routeLoader,\r\n getRoutes,\r\n config,\r\n });\r\n\r\n httpServer.listen(port, host, () => {\r\n if (isDev) {\r\n // ANSI color codes for terminal output\r\n const reset = \"\\x1b[0m\";\r\n const cyan = \"\\x1b[36m\";\r\n const green = \"\\x1b[32m\";\r\n const dim = \"\\x1b[2m\";\r\n const bold = \"\\x1b[1m\";\r\n \r\n const url = `http://${host === \"0.0.0.0\" ? \"localhost\" : host}:${port}`;\r\n \r\n console.log();\r\n console.log(`${bold}${green}✓${reset} ${bold}Dev server ready${reset}`);\r\n console.log(`${dim} Local:${reset} ${cyan}${url}${reset}`);\r\n if (routes.length > 0 || apiRoutes.length > 0 || wssRoutes.length > 0) {\r\n console.log(`${dim} Routes:${reset} ${routes.length} pages, ${apiRoutes.length} API, ${wssRoutes.length} WSS`);\r\n }\r\n console.log();\r\n } else {\r\n // Production: simple, clean output\r\n const url = `http://${host}:${port}`;\r\n console.log(`🚀 Server running on ${url}`);\r\n }\r\n });\r\n}\r\n\r\nexport interface StartDevServerOptions {\r\n port?: number;\r\n rootDir?: string;\r\n appDir?: string;\r\n}\r\n\r\n/**\r\n * Development server startup.\r\n * Wrapper around startServer for backward compatibility.\r\n *\r\n * @param options - Server options\r\n */\r\nexport async function startDevServer(options: StartDevServerOptions = {}) {\r\n return startServer({\r\n ...options,\r\n isDev: true,\r\n });\r\n}\r\n\r\nexport interface StartProdServerOptions {\r\n port?: number;\r\n rootDir?: string;\r\n appDir?: string;\r\n}\r\n\r\n/**\r\n * Production server startup.\r\n * Wrapper around startServer for backward compatibility.\r\n *\r\n * @param options - Server options\r\n */\r\nexport async function startProdServer(options: StartProdServerOptions = {}) {\r\n return startServer({\r\n ...options,\r\n isDev: false,\r\n });\r\n}\r\n","import fs from \"fs\";\r\nimport path from \"path\";\r\nimport { BUILD_FOLDER_NAME } from \"@constants/globals\";\r\n\r\nexport const getServerFile = async (projectRoot: string, fileName: string) => {\r\n const fileTS = path.join(projectRoot, `${fileName}.ts`);\r\n const fileJS = path.join(projectRoot, BUILD_FOLDER_NAME, \"server\", `${fileName}.js`);\r\n\r\n const isDev = process.env.NODE_ENV === \"development\";\r\n let mod: any = null;\r\n\r\n if (isDev) {\r\n if (!fs.existsSync(fileTS)) {\r\n return null;\r\n }\r\n\r\n require(\"tsx/cjs\");\r\n mod = require(fileTS);\r\n } else {\r\n if (!fs.existsSync(fileJS)) {\r\n return null;\r\n }\r\n\r\n mod = require(fileJS);\r\n }\r\n\r\n return mod;\r\n};\r\n","import http from \"http\";\r\nimport { getServerFile } from \"./utils/server-dir\";\r\n\r\nexport const INIT_FILE_NAME = 'init.server';\r\n\r\nexport interface InitServerData {\r\n server: http.Server<typeof http.IncomingMessage, typeof http.ServerResponse>;\r\n}\r\n\r\nexport async function runInitIfExists(\r\n projectRoot: string,\r\n serverData: InitServerData\r\n): Promise<Record<string, any>> {\r\n let mod: any = await getServerFile(projectRoot, INIT_FILE_NAME);\r\n\r\n if (typeof mod?.init === \"function\") {\r\n const serverContext: any = { ...serverData };\r\n await mod.init({ serverContext });\r\n\r\n return serverContext;\r\n }\r\n\r\n return {};\r\n}\r\n","import express from \"express\";\r\nimport path from \"path\";\r\nimport {\r\n FilesystemRouteLoader,\r\n ManifestRouteLoader,\r\n RouteLoader,\r\n writeClientRoutesManifest,\r\n} from \"@router/index\";\r\nimport { startClientBundler } from \"@build/bundler/client\";\r\nimport { setupHotReload } from \"@dev/hot-reload-client\";\r\nimport { clearAppRequireCache } from \"@dev/hot-reload-server\";\r\nimport { LoadedRoute, ApiRoute, WssRoute } from \"@router/index.types\";\r\nimport { BUILD_FOLDER_NAME } from \"@constants/globals\";\r\nimport { getBuildDir } from \"@src/config\";\r\n\r\nexport { RouteLoader };\r\n\r\nimport type { FrameworkConfig } from \"@src/config\";\r\n\r\nexport interface ServerSetupOptions {\r\n projectRoot: string;\r\n appDir: string;\r\n isDev: boolean;\r\n config?: FrameworkConfig;\r\n}\r\n\r\nexport interface ServerSetupResult {\r\n routes: LoadedRoute[];\r\n wssRoutes: WssRoute[];\r\n notFoundPage: LoadedRoute | null;\r\n errorPage: LoadedRoute | null;\r\n apiRoutes: ApiRoute[];\r\n getRoutes?: () => {\r\n routes: LoadedRoute[];\r\n apiRoutes: ApiRoute[];\r\n };\r\n}\r\n\r\n/**\r\n * Sets up routes and bundler based on environment (dev/prod).\r\n *\r\n * @param app - Express application instance\r\n * @param options - Setup options\r\n * @returns Server setup result with routes and handlers\r\n */\r\nexport function setupServer(\r\n app: express.Application,\r\n options: ServerSetupOptions\r\n): ServerSetupResult {\r\n const { projectRoot, appDir, isDev, config } = options;\r\n\r\n const routeLoader: RouteLoader = isDev\r\n ? new FilesystemRouteLoader(appDir, projectRoot)\r\n : new ManifestRouteLoader(projectRoot);\r\n\r\n if (isDev) {\r\n const { outDir, waitForBuild } = startClientBundler(projectRoot, \"development\");\r\n \r\n // Callback to reload routes manifest and clear cache when files change\r\n const onFileChange = async (filePath: string) => {\r\n const rel = path.relative(appDir, filePath);\r\n const isPageFile = filePath.includes(\"page.tsx\") || filePath.includes(\"page.ts\") || \r\n filePath.includes(\"layout.tsx\") || filePath.includes(\"layout.ts\") ||\r\n filePath.includes(\"_not-found\") || filePath.includes(\"_error\");\r\n const isTsFile = filePath.endsWith(\".ts\") || filePath.endsWith(\".tsx\");\r\n \r\n // Clear require cache for ANY TypeScript/TSX file change\r\n // This ensures components, utilities, hooks, etc. are reloaded correctly\r\n if (isTsFile) {\r\n clearAppRequireCache(appDir);\r\n console.log(`[hot-reload] Cleared require cache for: ${rel}`);\r\n }\r\n \r\n // Reload client routes manifest for page files (affects client-side routing)\r\n // This is needed when routes are added/removed/changed\r\n if (isPageFile) {\r\n const loader = new FilesystemRouteLoader(appDir, projectRoot);\r\n const newRoutes = loader.loadRoutes();\r\n writeClientRoutesManifest(newRoutes, projectRoot);\r\n console.log(\"[hot-reload] Client routes manifest reloaded\");\r\n }\r\n \r\n // Note: \r\n // - API routes are already reloaded on each request via getRoutes().apiRoutes\r\n // - WSS routes require server restart to take effect (Socket.IO setup is one-time)\r\n // - Components and other files are handled by the bundler (Rspack watch mode)\r\n // and the require cache is cleared above to ensure server-side code reloads\r\n };\r\n \r\n setupHotReload({ app, appDir, projectRoot, waitForBuild, onFileChange });\r\n \r\n app.use(\"/static\", express.static(outDir));\r\n\r\n const routes = routeLoader.loadRoutes();\r\n const wssRoutes = routeLoader.loadWssRoutes();\r\n const notFoundPage = routeLoader.loadNotFoundRoute();\r\n const errorPage = routeLoader.loadErrorRoute();\r\n writeClientRoutesManifest(routes, projectRoot);\r\n\r\n // Reuse the same loader instance to benefit from caching\r\n // Pass projectRoot so it can monitor files outside app/ directory\r\n const sharedLoader = new FilesystemRouteLoader(appDir, projectRoot);\r\n \r\n function getRoutes() {\r\n clearAppRequireCache(appDir);\r\n // Invalidate cache to force reload after clearing require cache\r\n sharedLoader.invalidateCache();\r\n return {\r\n routes: sharedLoader.loadRoutes(),\r\n apiRoutes: sharedLoader.loadApiRoutes(),\r\n };\r\n }\r\n\r\n return {\r\n routes,\r\n wssRoutes,\r\n notFoundPage,\r\n errorPage,\r\n apiRoutes: routeLoader.loadApiRoutes(),\r\n getRoutes,\r\n };\r\n } else {\r\n const routes = routeLoader.loadRoutes();\r\n const apiRoutes = routeLoader.loadApiRoutes();\r\n const wssRoutes = routeLoader.loadWssRoutes();\r\n const notFoundPage = routeLoader.loadNotFoundRoute();\r\n const errorPage = routeLoader.loadErrorRoute();\r\n\r\n const buildDir = config ? getBuildDir(projectRoot, config) : path.join(projectRoot, BUILD_FOLDER_NAME);\r\n const clientOutDir = path.join(buildDir, \"client\");\r\n app.use(\r\n \"/static\",\r\n express.static(clientOutDir, {\r\n maxAge: \"1y\",\r\n immutable: true,\r\n })\r\n );\r\n\r\n return {\r\n routes,\r\n apiRoutes,\r\n wssRoutes,\r\n notFoundPage,\r\n errorPage,\r\n };\r\n }\r\n}\r\n","import fs from \"fs\";\r\nimport path from \"path\";\r\nimport { LoadedRoute, PageComponent, RouteMiddleware } from \"./index.types\";\r\nimport { PAGE_FILE_REGEX } from \"./constants\";\r\nimport { buildRoutePathFromDir, buildRegexFromRoutePath } from \"./path\";\r\nimport { loadLayoutsForDir } from \"./layout\";\r\nimport { loadServerHookForDir, loadLayoutServerHook } from \"./server-hook\";\r\n\r\n/**\r\n * Validates loaded routes and warns about common issues.\r\n */\r\nfunction validateRoutes(routes: LoadedRoute[], appDir: string): void {\r\n const routePatterns = new Map<string, LoadedRoute[]>();\r\n const errors: string[] = [];\r\n const warnings: string[] = [];\r\n\r\n // Check for duplicate route patterns\r\n for (const route of routes) {\r\n const existing = routePatterns.get(route.pattern) || [];\r\n existing.push(route);\r\n routePatterns.set(route.pattern, existing);\r\n }\r\n\r\n for (const [pattern, duplicateRoutes] of routePatterns.entries()) {\r\n if (duplicateRoutes.length > 1) {\r\n const files = duplicateRoutes.map(r => \r\n r.pageFile ? path.relative(appDir, r.pageFile) : 'unknown'\r\n ).join(', ');\r\n errors.push(\r\n `Duplicate route pattern \"${pattern}\" found in multiple files:\\n` +\r\n ` ${files}\\n` +\r\n ` 💡 Suggestion: Ensure each route has a unique path pattern`\r\n );\r\n }\r\n }\r\n\r\n // Check for routes with missing page files\r\n for (const route of routes) {\r\n if (!route.pageFile || !fs.existsSync(route.pageFile)) {\r\n warnings.push(\r\n `Route pattern \"${route.pattern}\" references a missing page file`\r\n );\r\n }\r\n }\r\n\r\n // Report errors (fatal)\r\n if (errors.length > 0) {\r\n const errorMessage = [\r\n '❌ Route validation failed:',\r\n '',\r\n ...errors,\r\n '',\r\n '💡 Please fix the errors above before starting the server.',\r\n ].join('\\n');\r\n throw new Error(errorMessage);\r\n }\r\n\r\n // Report warnings (non-fatal, but informative)\r\n if (warnings.length > 0 && process.env.NODE_ENV === 'development') {\r\n console.warn('\\n⚠️ Route warnings:');\r\n warnings.forEach(warning => console.warn(` • ${warning}`));\r\n console.warn('');\r\n }\r\n}\r\n\r\n/**\r\n * Scans the app directory and loads all page routes.\r\n * Recursively walks through the app directory, finding all page files and creating route definitions.\r\n */\r\nexport function loadRoutes(appDir: string): LoadedRoute[] {\r\n if (!fs.existsSync(appDir)) {\r\n return [];\r\n }\r\n\r\n const routes: LoadedRoute[] = [];\r\n\r\n function walk(currentDir: string) {\r\n const entries = fs.readdirSync(currentDir, { withFileTypes: true });\r\n\r\n for (const entry of entries) {\r\n const fullPath = path.join(currentDir, entry.name);\r\n\r\n if (entry.isDirectory()) {\r\n walk(fullPath);\r\n continue;\r\n }\r\n\r\n if (!PAGE_FILE_REGEX.test(entry.name)) continue;\r\n\r\n // Skip special error pages - they're handled separately\r\n if (entry.name.startsWith(\"_not-found.\") || entry.name.startsWith(\"_error.\")) {\r\n continue;\r\n }\r\n\r\n const relDir = path.relative(appDir, currentDir);\r\n const routePath = buildRoutePathFromDir(relDir);\r\n const { regex, paramNames } = buildRegexFromRoutePath(routePath);\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-var-requires\r\n const mod = require(fullPath);\r\n const component: PageComponent = mod.default;\r\n\r\n if (!component) {\r\n continue;\r\n }\r\n\r\n const { components: layouts, files: layoutFiles } = loadLayoutsForDir(\r\n currentDir,\r\n appDir\r\n );\r\n\r\n // Load server hooks and middlewares for each layout (root → specific, same order as layouts)\r\n // For a layout at app/layout.tsx, we look for app/layout.server.hook.ts (same directory)\r\n const layoutServerHooks: (typeof serverHook)[] = [];\r\n const layoutMiddlewares: RouteMiddleware[][] = [];\r\n for (const layoutFile of layoutFiles) {\r\n const layoutHookData = loadLayoutServerHook(layoutFile);\r\n if (layoutHookData) {\r\n layoutServerHooks.push(layoutHookData.serverHook);\r\n layoutMiddlewares.push(layoutHookData.middlewares);\r\n } else {\r\n layoutServerHooks.push(null);\r\n layoutMiddlewares.push([]);\r\n }\r\n }\r\n\r\n const { middlewares, serverHook, dynamic, generateStaticParams } =\r\n loadServerHookForDir(currentDir);\r\n\r\n routes.push({\r\n pattern: routePath,\r\n regex,\r\n paramNames,\r\n component,\r\n layouts,\r\n pageFile: fullPath,\r\n layoutFiles,\r\n middlewares,\r\n loader: serverHook, // Keep 'loader' field name for backward compatibility\r\n layoutServerHooks, // Server hooks for each layout (same order as layouts)\r\n layoutMiddlewares, // Middlewares for each layout (same order as layouts)\r\n dynamic,\r\n generateStaticParams,\r\n });\r\n }\r\n }\r\n\r\n walk(appDir);\r\n\r\n // Validate routes and report issues\r\n validateRoutes(routes, appDir);\r\n\r\n return routes;\r\n}\r\n\r\n","import type { FrameworkConfig } from \"@src/config\";\r\n\r\nexport const PAGE_FILE_REGEX = /^page\\.(tsx|ts|jsx|js)$/;\r\nexport const LAYOUT_FILE_BASENAME = \"layout\";\r\n\r\n/**\r\n * Creates a regex pattern for page files based on configuration.\r\n * \r\n * @param config - Framework configuration\r\n * @returns Regex pattern for matching page files\r\n */\r\nexport function createPageFileRegex(config: FrameworkConfig): RegExp {\r\n const pageName = config.conventions.page;\r\n return new RegExp(`^${pageName}\\\\.(tsx|ts|jsx|js)$`);\r\n}\r\n\r\n/**\r\n * Gets the layout file basename from configuration.\r\n * \r\n * @param config - Framework configuration\r\n * @returns Layout file basename\r\n */\r\nexport function getLayoutFileBasename(config: FrameworkConfig): string {\r\n return config.conventions.layout;\r\n}","/**\r\n * Path utilities for building route paths and regex patterns.\r\n */\r\n\r\n/**\r\n * Builds a route path from a relative directory path.\r\n * \r\n * @param relDir - Relative directory path (e.g., '', 'about', 'blog\\\\[slug]')\r\n * @returns Route path (e.g., '/', '/about', '/blog/[slug]')\r\n * \r\n * @example\r\n * buildRoutePathFromDir('') // '/'\r\n * buildRoutePathFromDir('about') // '/about'\r\n * buildRoutePathFromDir('blog\\\\[slug]') // '/blog/[slug]'\r\n */\r\nexport function buildRoutePathFromDir(relDir: string): string {\r\n if (!relDir || relDir === \".\") return \"/\";\r\n const clean = relDir.replace(/\\\\/g, \"/\");\r\n return \"/\" + clean;\r\n}\r\n\r\n/**\r\n * Builds a regex pattern and parameter names from a route path.\r\n * \r\n * Supports:\r\n * - Static segments: `/about` → `/^\\/about\\/?$/`\r\n * - Dynamic segments: `[slug]` → captures single segment\r\n * - Catch-all segments: `[...path]` → captures remaining path (must be last)\r\n * \r\n * @param routePath - Route path pattern (e.g., '/blog/[slug]', '/post/[...path]')\r\n * @returns Object with regex pattern and parameter names\r\n * \r\n * @example\r\n * buildRegexFromRoutePath('/blog/[slug]')\r\n * // { regex: /^\\/blog\\/([^\\/]+)\\/?$/, paramNames: ['slug'] }\r\n * \r\n * buildRegexFromRoutePath('/post/[...path]')\r\n * // { regex: /^\\/post\\/(.+)\\/?$/, paramNames: ['path'] }\r\n * \r\n * @throws Error if catch-all segment is not the last segment\r\n */\r\nexport function buildRegexFromRoutePath(routePath: string): {\r\n regex: RegExp;\r\n paramNames: string[];\r\n} {\r\n const segments = routePath.split(\"/\").filter(Boolean);\r\n const paramNames: string[] = [];\r\n const regexParts: string[] = [];\r\n\r\n for (let i = 0; i < segments.length; i++) {\r\n const seg = segments[i];\r\n\r\n // 1) Catch-all: [...slug]\r\n if (seg.startsWith(\"[...\") && seg.endsWith(\"]\")) {\r\n const paramName = seg.slice(4, -1); // \"[...slug]\" -> \"slug\"\r\n paramNames.push(paramName);\r\n\r\n // Catch-all must be the last segment\r\n if (i !== segments.length - 1) {\r\n throw new Error(\r\n `Catch-all segment \"${seg}\" in \"${routePath}\" must be the last segment.`\r\n );\r\n }\r\n\r\n // (.+) = one or more characters (non-empty), allows \"/\" inside\r\n regexParts.push(\"(.+)\");\r\n continue;\r\n }\r\n\r\n // 2) Normal param: [slug]\r\n if (seg.startsWith(\"[\") && seg.endsWith(\"]\")) {\r\n const paramName = seg.slice(1, -1);\r\n paramNames.push(paramName);\r\n regexParts.push(\"([^/]+)\");\r\n continue;\r\n }\r\n\r\n // 3) Static segment - escape special regex characters\r\n const escaped = seg.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\r\n regexParts.push(escaped);\r\n }\r\n\r\n const regexSource = \"^/\" + regexParts.join(\"/\") + \"/?$\";\r\n const regex = new RegExp(regexSource);\r\n\r\n return { regex, paramNames };\r\n}\r\n\r\n","import fs from \"fs\";\r\nimport path from \"path\";\r\nimport { LayoutComponent } from \"./index.types\";\r\nimport { LAYOUT_FILE_BASENAME } from \"./constants\";\r\n\r\n/**\r\n * Finds a layout file in the given directory.\r\n * Checks for layout.tsx, layout.ts, layout.jsx, or layout.js.\r\n */\r\nexport function findLayoutFileInDir(dir: string): string | null {\r\n const candidates = [\r\n `${LAYOUT_FILE_BASENAME}.tsx`,\r\n `${LAYOUT_FILE_BASENAME}.ts`,\r\n `${LAYOUT_FILE_BASENAME}.jsx`,\r\n `${LAYOUT_FILE_BASENAME}.js`,\r\n ];\r\n\r\n for (const file of candidates) {\r\n const fullPath = path.join(dir, file);\r\n if (fs.existsSync(fullPath)) return fullPath;\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/**\r\n * Loads all layout components for a page directory.\r\n * Walks up from the page directory to the app root, collecting layouts at each level.\r\n * Returns layouts in order from root to most specific.\r\n */\r\nexport function loadLayoutsForDir(\r\n pageDir: string,\r\n appDir: string\r\n): { components: LayoutComponent[]; files: string[] } {\r\n const componentsBottomUp: LayoutComponent[] = [];\r\n const filesBottomUp: string[] = [];\r\n\r\n let currentDir = pageDir;\r\n const appDirResolved = path.resolve(appDir);\r\n\r\n while (true) {\r\n const layoutFile = findLayoutFileInDir(currentDir);\r\n if (layoutFile) {\r\n // eslint-disable-next-line @typescript-eslint/no-var-requires\r\n const mod = require(layoutFile);\r\n const LayoutComp: LayoutComponent = mod.default;\r\n if (LayoutComp) {\r\n componentsBottomUp.push(LayoutComp);\r\n filesBottomUp.push(layoutFile);\r\n }\r\n }\r\n\r\n const currentResolved = path.resolve(currentDir);\r\n if (currentResolved === appDirResolved) break;\r\n\r\n const parent = path.dirname(currentDir);\r\n if (parent === currentDir) break; // Reached filesystem root\r\n currentDir = parent;\r\n }\r\n\r\n // Reverse to get root → most specific order\r\n return {\r\n components: componentsBottomUp.reverse(),\r\n files: filesBottomUp.reverse(),\r\n };\r\n}\r\n\r\n","import fs from \"fs\";\r\nimport path from \"path\";\r\nimport {\r\n DynamicMode,\r\n GenerateStaticParams,\r\n RouteMiddleware,\r\n ServerLoader,\r\n} from \"./index.types\";\r\n\r\nconst NAMING = {\r\n // Constants & Fns\r\n BEFORE_MIDDLEWARES: \"beforeServerData\",\r\n GET_SERVER_DATA_FN: \"getServerSideProps\",\r\n GENERATE_SSG_PARAMS: \"generateStaticParams\",\r\n RENDER_TYPE_CONST: \"dynamic\",\r\n\r\n // Files\r\n SERVER_HOOK: 'server.hook',\r\n};\r\n\r\n/**\r\n * Loads server-side hooks from a directory.\r\n * The server hook file contains getServerSideProps, middlewares, SSG config, etc.\r\n *\r\n * Looks for server hook files in this order:\r\n * 1. `page.server.hook.ts` (preferred, consistent with layout.server.hook.ts)\r\n * 2. `server.hook.ts` (legacy, for backward compatibility)\r\n *\r\n * @param currentDir - Directory to search for server hook file\r\n * @returns Object containing middlewares, serverHook, dynamic mode, and generateStaticParams\r\n *\r\n * @example\r\n * // app/blog/[slug]/page.server.hook.ts (preferred)\r\n * // app/blog/[slug]/server.hook.ts (legacy, still works)\r\n * export const beforeServerData = [authMiddleware];\r\n * export const getServerSideProps = async (ctx) => ({ props: {} });\r\n * export const dynamic = \"force-static\";\r\n * export const generateStaticParams = async () => [{ slug: \"post-1\" }];\r\n */\r\nexport function loadServerHookForDir(currentDir: string): {\r\n middlewares: RouteMiddleware[];\r\n serverHook: ServerLoader | null;\r\n dynamic: DynamicMode;\r\n generateStaticParams: GenerateStaticParams | null;\r\n} {\r\n // Try page.server.hook.ts first (preferred, consistent with layout.server.hook.ts)\r\n const pageServerHookTs = path.join(currentDir, `page.server.hook.ts`);\r\n const pageServerHookJs = path.join(currentDir, `page.server.hook.js`);\r\n \r\n // Fallback to server.hook.ts (legacy, backward compatibility)\r\n const serverHookTs = path.join(currentDir, `${NAMING.SERVER_HOOK}.ts`);\r\n const serverHookJs = path.join(currentDir, `${NAMING.SERVER_HOOK}.js`);\r\n\r\n const file = fs.existsSync(pageServerHookTs)\r\n ? pageServerHookTs\r\n : fs.existsSync(pageServerHookJs)\r\n ? pageServerHookJs\r\n : fs.existsSync(serverHookTs)\r\n ? serverHookTs\r\n : fs.existsSync(serverHookJs)\r\n ? serverHookJs\r\n : null;\r\n\r\n if (!file) {\r\n return {\r\n middlewares: [],\r\n serverHook: null,\r\n dynamic: \"auto\",\r\n generateStaticParams: null,\r\n };\r\n }\r\n\r\n // Ensure tsx is loaded for TypeScript files during build\r\n // tsx automatically reads tsconfig.json from the project root to resolve path aliases\r\n if (file.endsWith('.ts') || file.endsWith('.tsx')) {\r\n try {\r\n // Load tsx if not already loaded - it will handle TypeScript compilation and path resolution\r\n require('tsx/cjs');\r\n } catch (e) {\r\n // tsx might already be loaded, ignore error\r\n }\r\n }\r\n\r\n let mod;\r\n try {\r\n // eslint-disable-next-line @typescript-eslint/no-var-requires\r\n mod = require(file);\r\n } catch (error) {\r\n console.error(\r\n `[framework][server-hook] Error loading server hook from ${file}:`,\r\n error\r\n );\r\n // Return defaults if module fails to load\r\n return {\r\n middlewares: [],\r\n serverHook: null,\r\n dynamic: \"auto\",\r\n generateStaticParams: null,\r\n };\r\n }\r\n\r\n // Load and validate middlewares\r\n let middlewares: RouteMiddleware[] = [];\r\n const rawMiddlewares = mod?.[NAMING.BEFORE_MIDDLEWARES];\r\n \r\n if (rawMiddlewares !== undefined) {\r\n if (!Array.isArray(rawMiddlewares)) {\r\n console.warn(\r\n `[framework][server-hook] ${NAMING.BEFORE_MIDDLEWARES} must be an array in ${file}, ignoring invalid value`\r\n );\r\n } else {\r\n // Validate each middleware is a function\r\n for (let i = 0; i < rawMiddlewares.length; i++) {\r\n const mw = rawMiddlewares[i];\r\n if (typeof mw !== \"function\") {\r\n console.warn(\r\n `[framework][server-hook] Middleware at index ${i} in ${NAMING.BEFORE_MIDDLEWARES} is not a function in ${file}, skipping`\r\n );\r\n continue;\r\n }\r\n middlewares.push(mw);\r\n }\r\n }\r\n }\r\n\r\n const serverHook: ServerLoader | null =\r\n typeof mod?.[NAMING.GET_SERVER_DATA_FN] === \"function\"\r\n ? mod[NAMING.GET_SERVER_DATA_FN]\r\n : null;\r\n\r\n const dynamic: DynamicMode =\r\n mod?.[NAMING.RENDER_TYPE_CONST] === \"force-static\" ||\r\n mod?.[NAMING.RENDER_TYPE_CONST] === \"force-dynamic\"\r\n ? mod.dynamic\r\n : \"auto\";\r\n\r\n const generateStaticParams: GenerateStaticParams | null =\r\n typeof mod?.[NAMING.GENERATE_SSG_PARAMS] === \"function\"\r\n ? mod[NAMING.GENERATE_SSG_PARAMS]\r\n : null;\r\n\r\n return {\r\n middlewares,\r\n serverHook,\r\n dynamic,\r\n generateStaticParams,\r\n };\r\n}\r\n\r\n/**\r\n * Loads server hook and middlewares for a specific layout file.\r\n * Looks for layout.server.hook.ts in the same directory as the layout file.\r\n * \r\n * @param layoutFile - Full path to the layout file (e.g., app/layout.tsx)\r\n * @returns Object with server hook and middlewares, or null if not found\r\n * \r\n * @example\r\n * // app/layout.tsx → looks for app/layout.server.hook.ts\r\n * // app/blog/layout.tsx → looks for app/blog/layout.server.hook.ts\r\n * \r\n * // In layout.server.hook.ts:\r\n * export const beforeServerData: RouteMiddleware[] = [\r\n * async (ctx, next) => {\r\n * ctx.locals.layoutData = { theme: 'dark' };\r\n * await next();\r\n * }\r\n * ];\r\n * export const getServerSideProps: ServerLoader = async (ctx) => {\r\n * return { props: { theme: ctx.locals.layoutData?.theme } };\r\n * };\r\n */\r\nexport function loadLayoutServerHook(layoutFile: string): {\r\n serverHook: ServerLoader | null;\r\n middlewares: RouteMiddleware[];\r\n} | null {\r\n const layoutDir = path.dirname(layoutFile);\r\n const layoutBasename = path.basename(layoutFile, path.extname(layoutFile)); // \"layout\" without extension\r\n \r\n // Look for layout.server.hook.ts in the same directory\r\n const serverHookTs = path.join(layoutDir, `${layoutBasename}.server.hook.ts`);\r\n const serverHookJs = path.join(layoutDir, `${layoutBasename}.server.hook.js`);\r\n \r\n const file = fs.existsSync(serverHookTs)\r\n ? serverHookTs\r\n : fs.existsSync(serverHookJs)\r\n ? serverHookJs\r\n : null;\r\n\r\n if (!file) {\r\n return null;\r\n }\r\n\r\n // Ensure tsx is loaded for TypeScript files\r\n if (file.endsWith('.ts') || file.endsWith('.tsx')) {\r\n try {\r\n require('tsx/cjs');\r\n } catch (e) {\r\n // tsx might already be loaded, ignore error\r\n }\r\n }\r\n\r\n try {\r\n // eslint-disable-next-line @typescript-eslint/no-var-requires\r\n const mod = require(file);\r\n \r\n const serverHook: ServerLoader | null =\r\n typeof mod?.getServerSideProps === \"function\"\r\n ? mod.getServerSideProps\r\n : null;\r\n \r\n // Load middlewares from layout.server.hook.ts (same name as page middlewares: beforeServerData)\r\n let middlewares: RouteMiddleware[] = [];\r\n const rawMiddlewares = mod?.[NAMING.BEFORE_MIDDLEWARES];\r\n \r\n if (rawMiddlewares !== undefined) {\r\n if (!Array.isArray(rawMiddlewares)) {\r\n console.warn(\r\n `[framework][server-hook] ${NAMING.BEFORE_MIDDLEWARES} must be an array in ${file}, ignoring invalid value`\r\n );\r\n } else {\r\n // Validate each middleware is a function\r\n for (let i = 0; i < rawMiddlewares.length; i++) {\r\n const mw = rawMiddlewares[i];\r\n if (typeof mw !== \"function\") {\r\n console.warn(\r\n `[framework][server-hook] Middleware at index ${i} in ${NAMING.BEFORE_MIDDLEWARES} is not a function in ${file}, skipping`\r\n );\r\n continue;\r\n }\r\n middlewares.push(mw);\r\n }\r\n }\r\n }\r\n \r\n return {\r\n serverHook,\r\n middlewares,\r\n };\r\n } catch (error) {\r\n console.error(\r\n `[framework][server-hook] Error loading layout server hook from ${file}:`,\r\n error\r\n );\r\n return null;\r\n }\r\n}\r\n","import fs from \"fs\";\r\nimport path from \"path\";\r\nimport { ApiRoute } from \"./index.types\";\r\nimport {\r\n extractApiHandlers,\r\n extractApiMiddlewares,\r\n extractRouteRegex,\r\n loadModuleSafely,\r\n} from \"./helpers/routes\";\r\n\r\nconst ROUTE_FILE_REGEX = /route\\.(ts|tsx|js|jsx)$/;\r\nconst HTTP_METHODS = [\"GET\", \"POST\", \"PUT\", \"PATCH\", \"DELETE\", \"OPTIONS\"];\r\n\r\n/**\r\n * Scans the app/api directory and loads all API routes.\r\n * \r\n * Recursively walks through the app/api directory, finding all `route.ts`, `route.tsx`,\r\n * `route.js`, or `route.jsx` files and creating API route definitions.\r\n * \r\n * @param appDir - Root directory of the app (e.g., 'app')\r\n * @returns Array of loaded API routes with handlers and middlewares\r\n * \r\n * @example\r\n * const apiRoutes = loadApiRoutes('app');\r\n * // [\r\n * // {\r\n * // pattern: '/api/posts/[id]',\r\n * // handlers: { GET: getPost, POST: updatePost },\r\n * // middlewares: [authMiddleware],\r\n * // methodMiddlewares: { GET: [logMiddleware] },\r\n * // },\r\n * // ]\r\n */\r\nexport function loadApiRoutes(appDir: string): ApiRoute[] {\r\n const apiRoot = path.join(appDir, \"api\");\r\n const routes: ApiRoute[] = [];\r\n\r\n if (!fs.existsSync(apiRoot)) return routes;\r\n\r\n function walk(currentDir: string) {\r\n const entries = fs.readdirSync(currentDir, { withFileTypes: true });\r\n\r\n for (const entry of entries) {\r\n const fullPath = path.join(currentDir, entry.name);\r\n\r\n if (entry.isDirectory()) {\r\n walk(fullPath);\r\n continue;\r\n }\r\n\r\n // Only process route files\r\n if (!ROUTE_FILE_REGEX.test(entry.name)) continue;\r\n\r\n const relToApp = path.relative(appDir, fullPath).replace(/\\\\/g, \"/\");\r\n const withoutRoute = relToApp.replace(/\\/route\\.(ts|tsx|js|jsx)$/, \"\");\r\n const pattern = \"/\" + withoutRoute;\r\n\r\n const { regex, paramNames } = extractRouteRegex(pattern);\r\n\r\n const mod = loadModuleSafely(fullPath);\r\n if (!mod) {\r\n continue;\r\n }\r\n\r\n const handlers = extractApiHandlers(mod, HTTP_METHODS);\r\n const { global: globalMiddlewares, methodSpecific: methodMiddlewares } =\r\n extractApiMiddlewares(mod, HTTP_METHODS);\r\n\r\n routes.push({\r\n pattern,\r\n regex,\r\n paramNames,\r\n handlers,\r\n middlewares: globalMiddlewares,\r\n methodMiddlewares,\r\n filePath: fullPath,\r\n });\r\n }\r\n }\r\n\r\n walk(apiRoot);\r\n\r\n return routes;\r\n}\r\n\r\n","import fs from \"fs\";\r\nimport path from \"path\";\r\nimport {\r\n ApiHandler,\r\n ApiMiddleware,\r\n LayoutComponent,\r\n PageComponent,\r\n RoutesManifest,\r\n} from \"../../index.types\";\r\nimport { buildRegexFromRoutePath } from \"../../path\";\r\nimport { BUILD_FOLDER_NAME } from \"@constants/globals\";\r\n\r\n/**\r\n * Reads and parses the routes manifest file.\r\n */\r\nexport function readManifest(projectRoot: string): RoutesManifest | null {\r\n const manifestPath = path.join(\r\n projectRoot,\r\n BUILD_FOLDER_NAME,\r\n \"routes-manifest.json\"\r\n );\r\n\r\n if (!fs.existsSync(manifestPath)) {\r\n return null;\r\n }\r\n\r\n const raw = fs.readFileSync(manifestPath, \"utf-8\");\r\n return JSON.parse(raw) as RoutesManifest;\r\n}\r\n\r\n/**\r\n * Safely loads a module with error handling.\r\n */\r\nexport function loadModuleSafely(filePath: string): any | null {\r\n try {\r\n // eslint-disable-next-line @typescript-eslint/no-var-requires\r\n return require(filePath);\r\n } catch (err) {\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Loads and processes layout components from layout file paths.\r\n */\r\nexport function loadLayouts(\r\n layoutFiles: string[],\r\n projectRoot: string\r\n): LayoutComponent[] {\r\n const layoutMods = layoutFiles.map((lf) => {\r\n const fullPath = path.join(projectRoot, lf);\r\n return loadModuleSafely(fullPath);\r\n });\r\n\r\n return layoutMods\r\n .filter((m): m is { default: LayoutComponent } => !!m?.default)\r\n .map((m) => m.default);\r\n}\r\n\r\n/**\r\n * Builds regex and extracts param names from a route pattern.\r\n */\r\nexport function extractRouteRegex(pattern: string, paramNames?: string[]) {\r\n const { regex, paramNames: extractedParamNames } =\r\n buildRegexFromRoutePath(pattern);\r\n return {\r\n regex,\r\n paramNames: paramNames ?? extractedParamNames,\r\n };\r\n}\r\n\r\n/**\r\n * Extracts HTTP method handlers from a module.\r\n */\r\nexport function extractApiHandlers(\r\n mod: any,\r\n methods: string[]\r\n): Record<string, ApiHandler> {\r\n const handlers: Record<string, ApiHandler> = {};\r\n\r\n for (const method of methods) {\r\n if (typeof mod[method] === \"function\") {\r\n handlers[method] = mod[method] as ApiHandler;\r\n }\r\n }\r\n\r\n return handlers;\r\n}\r\n\r\n/**\r\n * Extracts global and method-specific middlewares from a module.\r\n */\r\nexport function extractApiMiddlewares(\r\n mod: any,\r\n methods: string[]\r\n): {\r\n global: ApiMiddleware[];\r\n methodSpecific: Record<string, ApiMiddleware[]>;\r\n} {\r\n const globalMiddlewares: ApiMiddleware[] = Array.isArray(mod.beforeApi)\r\n ? mod.beforeApi\r\n : [];\r\n\r\n const methodMiddlewares: Record<string, ApiMiddleware[]> = {};\r\n\r\n for (const method of methods) {\r\n const key = `before${method}`;\r\n const mws = mod[key];\r\n if (Array.isArray(mws)) {\r\n methodMiddlewares[method] = mws as ApiMiddleware[];\r\n }\r\n }\r\n\r\n return {\r\n global: globalMiddlewares,\r\n methodSpecific: methodMiddlewares,\r\n };\r\n}\r\n\r\n/**\r\n * Extracts WebSocket event handlers from a module.\r\n */\r\nexport function extractWssHandlers(\r\n mod: any,\r\n events: string[]\r\n): Record<string, ApiHandler> {\r\n const handlers: Record<string, ApiHandler> = {};\r\n\r\n if (!Array.isArray(mod.events)) {\r\n return handlers;\r\n }\r\n\r\n for (const eventName of events) {\r\n if (typeof eventName === \"string\") {\r\n const event = mod.events.find(\r\n (e: { name: string }) => e.name?.toLowerCase() === eventName.toLowerCase()\r\n );\r\n if (event?.handler) {\r\n handlers[eventName] = event.handler as ApiHandler;\r\n }\r\n }\r\n }\r\n\r\n return handlers;\r\n}\r\n\r\n/**\r\n * Extracts all WebSocket event handlers directly from a module's events array.\r\n * This is used when scanning filesystem routes where we iterate over all events.\r\n */\r\nexport function extractWssHandlersFromModule(mod: any): Record<string, ApiHandler> {\r\n const handlers: Record<string, ApiHandler> = {};\r\n\r\n if (!Array.isArray(mod?.events)) {\r\n return handlers;\r\n }\r\n\r\n for (const event of mod.events) {\r\n if (typeof event.handler === \"function\" && typeof event.name === \"string\") {\r\n handlers[event.name.toLowerCase()] = event.handler as ApiHandler;\r\n }\r\n }\r\n\r\n return handlers;\r\n}\r\n\r\n/**\r\n * Loads a page component from a file path.\r\n */\r\nexport function loadPageComponent(\r\n pageFile: string,\r\n projectRoot: string\r\n): PageComponent | null {\r\n const fullPath = path.join(projectRoot, pageFile);\r\n const pageMod = loadModuleSafely(fullPath);\r\n return pageMod?.default || null;\r\n}\r\n\r\n// Export WSS route extractor\r\nexport { extractDefineWssRoute, type NormalizedWssRoute } from \"./extract-wss-route\";\r\n\r\n","import type {\r\n WssRouteDefinition,\r\n WssEventDefinition,\r\n AuthFn,\r\n WssHandler,\r\n GuardFn,\r\n} from \"@realtime/types\";\r\n\r\n/**\r\n * Normalized internal structure for WSS routes.\r\n * This is what we use internally after loading and normalizing the route definition.\r\n */\r\nexport interface NormalizedWssRoute {\r\n namespace: string;\r\n auth?: AuthFn;\r\n onConnect?: WssHandler;\r\n onDisconnect?: (ctx: any, reason?: string) => void | Promise<void>;\r\n events: Map<\r\n string,\r\n {\r\n schema?: any;\r\n rateLimit?: { eventsPerSecond: number; burst?: number };\r\n guard?: GuardFn;\r\n handler: WssHandler;\r\n }\r\n >;\r\n}\r\n\r\n/**\r\n * Extracts and normalizes a WSS route from a module.\r\n * Supports the new defineWssRoute() format only.\r\n * \r\n * @param mod - The loaded module\r\n * @param namespace - The namespace path (inferred from folder structure)\r\n * @returns Normalized route or null if invalid\r\n */\r\nexport function extractDefineWssRoute(\r\n mod: any,\r\n namespace: string\r\n): NormalizedWssRoute | null {\r\n // Check if module exports default (new format)\r\n if (!mod.default) {\r\n // Check for legacy format\r\n if (mod.events && Array.isArray(mod.events)) {\r\n throw new Error(\r\n `[loly:realtime] BREAKING CHANGE: 'export const events = []' is no longer supported.\\n` +\r\n `Please use 'export default defineWssRoute({ events: { ... } })' instead.\\n` +\r\n `See migration guide: https://loly.dev/docs/migration\\n` +\r\n `File: ${mod.__filename || \"unknown\"}`\r\n );\r\n }\r\n\r\n // No default export and no legacy format\r\n return null;\r\n }\r\n\r\n const routeDef = mod.default as WssRouteDefinition;\r\n\r\n // Validate it's a valid route definition\r\n if (!routeDef || typeof routeDef !== \"object\" || !routeDef.events) {\r\n throw new Error(\r\n `[loly:realtime] Module must export default from defineWssRoute().\\n` +\r\n `Expected: export default defineWssRoute({ events: { ... } })\\n` +\r\n `File: ${mod.__filename || \"unknown\"}`\r\n );\r\n }\r\n\r\n // Normalize events\r\n const normalizedEvents = new Map<\r\n string,\r\n {\r\n schema?: any;\r\n rateLimit?: { eventsPerSecond: number; burst?: number };\r\n guard?: GuardFn;\r\n handler: WssHandler;\r\n }\r\n >();\r\n\r\n for (const [eventName, eventDef] of Object.entries(routeDef.events)) {\r\n if (typeof eventDef === \"function\") {\r\n // Simple handler function\r\n normalizedEvents.set(eventName.toLowerCase(), {\r\n handler: eventDef,\r\n });\r\n } else if (eventDef && typeof eventDef === \"object\" && eventDef.handler) {\r\n // Object with handler and optional config\r\n normalizedEvents.set(eventName.toLowerCase(), {\r\n schema: eventDef.schema,\r\n rateLimit: eventDef.rateLimit,\r\n guard: eventDef.guard,\r\n handler: eventDef.handler,\r\n });\r\n } else {\r\n throw new Error(\r\n `[loly:realtime] Invalid event definition for '${eventName}'. ` +\r\n `Event must be a handler function or an object with a 'handler' property.\\n` +\r\n `File: ${mod.__filename || \"unknown\"}`\r\n );\r\n }\r\n }\r\n\r\n return {\r\n namespace,\r\n auth: routeDef.auth,\r\n onConnect: routeDef.onConnect,\r\n onDisconnect: routeDef.onDisconnect,\r\n events: normalizedEvents,\r\n };\r\n}\r\n","import { ApiRoute, LoadedRoute } from \"./index.types\";\r\n\r\n/**\r\n * Matches a URL path against loaded routes and returns the matched route with params.\r\n * \r\n * @param routes - Array of loaded routes to match against\r\n * @param urlPath - URL path to match (e.g., '/blog/my-post')\r\n * @returns Matched route with extracted parameters, or null if no match\r\n * \r\n * @example\r\n * const routes = loadRoutes('app');\r\n * const match = matchRoute(routes, '/blog/my-post');\r\n * // { route: LoadedRoute, params: { slug: 'my-post' } }\r\n */\r\nexport function matchRoute(\r\n routes: LoadedRoute[],\r\n urlPath: string\r\n): { route: LoadedRoute; params: Record<string, string> } | null {\r\n for (const route of routes) {\r\n const match = route.regex.exec(urlPath);\r\n if (!match) continue;\r\n\r\n const params: Record<string, string> = {};\r\n route.paramNames.forEach((name, idx) => {\r\n params[name] = match[idx + 1];\r\n });\r\n\r\n return { route, params };\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/**\r\n * Matches a URL path against API routes and returns the matched route with params.\r\n * \r\n * @param routes - Array of API routes to match against\r\n * @param pathname - URL path to match (e.g., '/api/posts/123')\r\n * @returns Matched API route with extracted parameters, or null if no match\r\n * \r\n * @example\r\n * const apiRoutes = loadApiRoutes('app');\r\n * const match = matchApiRoute(apiRoutes, '/api/posts/123');\r\n * // { route: ApiRoute, params: { id: '123' } }\r\n */\r\nexport function matchApiRoute(\r\n routes: ApiRoute[],\r\n pathname: string\r\n): { route: ApiRoute; params: Record<string, string> } | null {\r\n for (const r of routes) {\r\n const match = r.regex.exec(pathname);\r\n if (!match) continue;\r\n\r\n const params: Record<string, string> = {};\r\n r.paramNames.forEach((name, idx) => {\r\n params[name] = match[idx + 1];\r\n });\r\n\r\n return { route: r, params };\r\n }\r\n return null;\r\n}\r\n\r\n","import fs from \"fs\";\r\nimport path from \"path\";\r\nimport {\r\n ApiRoute,\r\n ApiRouteManifestEntry,\r\n LoadedRoute,\r\n PageRouteManifestEntry,\r\n RoutesManifest,\r\n WssRoute,\r\n WssRouteManifestEntry,\r\n} from \"./index.types\";\r\nimport {\r\n BUILD_FOLDER_NAME,\r\n STYLE_FILE_NAME,\r\n NOT_FOUND_FILE_PREFIX,\r\n ERROR_FILE_PREFIX,\r\n NOT_FOUND_CHUNK_KEY,\r\n ERROR_CHUNK_KEY,\r\n NOT_FOUND_PATTERN,\r\n ERROR_PATTERN,\r\n} from \"@constants/globals\";\r\n\r\n/**\r\n * Writes the client-side routes manifest file.\r\n *\r\n * Generates a TypeScript file that exports route definitions with lazy-loaded\r\n * components for code splitting. The manifest is used by the client runtime\r\n * to handle client-side navigation.\r\n *\r\n * @param routes - Array of loaded routes\r\n * @param projectRoot - Root directory of the project\r\n * @param errorRoute - Optional error route for client-side error handling\r\n */\r\nexport function writeClientRoutesManifest(\r\n routes: LoadedRoute[],\r\n projectRoot: string\r\n): void {\r\n const fwDir = path.join(projectRoot, BUILD_FOLDER_NAME);\r\n if (!fs.existsSync(fwDir)) {\r\n fs.mkdirSync(fwDir, { recursive: true });\r\n }\r\n\r\n const manifestPath = path.join(fwDir, \"routes-client.ts\");\r\n const manifestDir = path.dirname(manifestPath);\r\n\r\n function toImportPath(filePath: string): string {\r\n const relRaw = path.relative(manifestDir, filePath).replace(/\\\\/g, \"/\");\r\n const rel = relRaw.startsWith(\".\") ? relRaw : \"./\" + relRaw;\r\n // Remove extension so bundler can resolve .tsx, .ts, .jsx, .js\r\n return rel.replace(/\\.(tsx|ts|jsx|js)$/, \"\");\r\n }\r\n\r\n function findUserNotFound(): string | null {\r\n const candidates = [\r\n `app/${NOT_FOUND_FILE_PREFIX}.tsx`,\r\n `app/${NOT_FOUND_FILE_PREFIX}.ts`,\r\n `app/${NOT_FOUND_FILE_PREFIX}.jsx`,\r\n `app/${NOT_FOUND_FILE_PREFIX}.js`,\r\n // Fallback to old style for backward compatibility\r\n \"app/not-found/page.tsx\",\r\n \"app/not-found/page.ts\",\r\n \"app/not-found/page.jsx\",\r\n \"app/not-found/page.js\",\r\n ];\r\n\r\n for (const rel of candidates) {\r\n const full = path.join(projectRoot, rel);\r\n if (fs.existsSync(full)) return full;\r\n }\r\n return null;\r\n }\r\n\r\n function findUserError(): string | null {\r\n const candidates = [\r\n `app/${ERROR_FILE_PREFIX}.tsx`,\r\n `app/${ERROR_FILE_PREFIX}.ts`,\r\n `app/${ERROR_FILE_PREFIX}.jsx`,\r\n `app/${ERROR_FILE_PREFIX}.js`,\r\n ];\r\n\r\n for (const rel of candidates) {\r\n const full = path.join(projectRoot, rel);\r\n if (fs.existsSync(full)) return full;\r\n }\r\n return null;\r\n }\r\n\r\n function findRootLayout(): string | null {\r\n const candidates = [\r\n \"app/layout.tsx\",\r\n \"app/layout.ts\",\r\n \"app/layout.jsx\",\r\n \"app/layout.js\",\r\n ];\r\n\r\n for (const rel of candidates) {\r\n const full = path.join(projectRoot, rel);\r\n if (fs.existsSync(full)) return full;\r\n }\r\n return null;\r\n }\r\n\r\n const lines: string[] = [];\r\n const chunkMap: Record<string, string> = {};\r\n\r\n lines.push(`import React from \"react\";`);\r\n lines.push(\"\");\r\n\r\n lines.push(`export interface ClientLoadedComponents {`);\r\n lines.push(` Page: React.ComponentType<any>;`);\r\n lines.push(` layouts: React.ComponentType<any>[];`);\r\n lines.push(`}`);\r\n lines.push(\"\");\r\n\r\n lines.push(`export interface ClientRouteLoaded {`);\r\n lines.push(` pattern: string;`);\r\n lines.push(` paramNames: string[];`);\r\n lines.push(` load: () => Promise<ClientLoadedComponents>;`);\r\n lines.push(`}`);\r\n lines.push(\"\");\r\n\r\n // --- rutas normales ---\r\n lines.push(`export const routes: ClientRouteLoaded[] = [`);\r\n\r\n for (const route of routes) {\r\n const pattern = route.pattern;\r\n const paramNames = route.paramNames;\r\n\r\n const modulePaths = [route.pageFile, ...route.layoutFiles].map(\r\n toImportPath\r\n );\r\n\r\n const safeName =\r\n pattern.replace(/^\\//, \"\").replace(/\\//g, \"_\").replace(/\\[|\\]/g, \"\") ||\r\n \"root\";\r\n\r\n const chunkName = `route-${safeName}`;\r\n chunkMap[pattern] = chunkName;\r\n\r\n lines.push(\" {\");\r\n lines.push(` pattern: ${JSON.stringify(pattern)},`);\r\n lines.push(` paramNames: ${JSON.stringify(paramNames)},`);\r\n lines.push(` load: async () => {`);\r\n lines.push(` const mods = await Promise.all([`);\r\n\r\n for (const p of modulePaths) {\r\n lines.push(\r\n ` import(/* webpackChunkName: \"${chunkName}\" */ \"${p}\"),`\r\n );\r\n }\r\n\r\n lines.push(\" ]);\");\r\n lines.push(\" const [pageMod, ...layoutMods] = mods;\");\r\n lines.push(\" return {\");\r\n lines.push(\" Page: pageMod.default,\");\r\n lines.push(\" layouts: layoutMods.map((m) => m.default),\");\r\n lines.push(\" };\");\r\n lines.push(\" },\");\r\n lines.push(\" },\");\r\n }\r\n\r\n lines.push(\"];\");\r\n lines.push(\"\");\r\n\r\n const notFoundPath = findUserNotFound();\r\n const errorPath = findUserError();\r\n const rootLayoutPath = findRootLayout();\r\n\r\n if (notFoundPath) {\r\n const notFoundImportPath = toImportPath(notFoundPath);\r\n const chunkName = \"route-not-found\";\r\n\r\n lines.push(`export const notFoundRoute: ClientRouteLoaded = {`);\r\n lines.push(` pattern: \"${NOT_FOUND_CHUNK_KEY}\",`);\r\n lines.push(` paramNames: [],`);\r\n lines.push(` load: async () => {`);\r\n lines.push(` const mods = await Promise.all([`);\r\n lines.push(\r\n ` import(/* webpackChunkName: \"${chunkName}\" */ \"${notFoundImportPath}\"),`\r\n );\r\n\r\n if (rootLayoutPath) {\r\n const rootLayoutImportPath = toImportPath(rootLayoutPath);\r\n lines.push(\r\n ` import(/* webpackChunkName: \"${chunkName}\" */ \"${rootLayoutImportPath}\"),`\r\n );\r\n }\r\n\r\n lines.push(` ]);`);\r\n lines.push(` const [pageMod, ...layoutMods] = mods;`);\r\n lines.push(` return {`);\r\n lines.push(` Page: pageMod.default,`);\r\n lines.push(` layouts: layoutMods.map((m) => m.default),`);\r\n lines.push(` };`);\r\n lines.push(` },`);\r\n lines.push(`};`);\r\n lines.push(\"\");\r\n\r\n chunkMap[NOT_FOUND_CHUNK_KEY] = chunkName;\r\n } else {\r\n lines.push(`export const notFoundRoute: ClientRouteLoaded | null = null;`);\r\n lines.push(\"\");\r\n }\r\n\r\n if (errorPath) {\r\n const errorImportPath = toImportPath(errorPath);\r\n const chunkName = \"route-error\";\r\n\r\n lines.push(`export const errorRoute: ClientRouteLoaded = {`);\r\n lines.push(` pattern: \"${ERROR_CHUNK_KEY}\",`);\r\n lines.push(` paramNames: [],`);\r\n lines.push(` load: async () => {`);\r\n lines.push(` const mods = await Promise.all([`);\r\n lines.push(\r\n ` import(/* webpackChunkName: \"${chunkName}\" */ \"${errorImportPath}\"),`\r\n );\r\n\r\n if (rootLayoutPath) {\r\n const rootLayoutImportPath = toImportPath(rootLayoutPath);\r\n lines.push(\r\n ` import(/* webpackChunkName: \"${chunkName}\" */ \"${rootLayoutImportPath}\"),`\r\n );\r\n }\r\n\r\n lines.push(` ]);`);\r\n lines.push(` const [pageMod, ...layoutMods] = mods;`);\r\n lines.push(` return {`);\r\n lines.push(` Page: pageMod.default,`);\r\n lines.push(` layouts: layoutMods.map((m) => m.default),`);\r\n lines.push(` };`);\r\n lines.push(` },`);\r\n lines.push(`};`);\r\n lines.push(\"\");\r\n\r\n chunkMap[ERROR_CHUNK_KEY] = chunkName;\r\n } else {\r\n lines.push(`export const errorRoute: ClientRouteLoaded | null = null;`);\r\n lines.push(\"\");\r\n }\r\n\r\n fs.writeFileSync(manifestPath, lines.join(\"\\n\"), \"utf-8\");\r\n\r\n const chunksJsonPath = path.join(fwDir, \"route-chunks.json\");\r\n fs.writeFileSync(chunksJsonPath, JSON.stringify(chunkMap, null, 2), \"utf-8\");\r\n}\r\n\r\n/**\r\n * Writes the client bootstrap manifest file.\r\n *\r\n * @param projectRoot - Root directory of the project\r\n */\r\nexport function writeClientBoostrapManifest(projectRoot: string): void {\r\n const buildDir = path.join(projectRoot, BUILD_FOLDER_NAME);\r\n if (!fs.existsSync(buildDir)) {\r\n fs.mkdirSync(buildDir, { recursive: true });\r\n }\r\n\r\n const manifestPath = path.join(buildDir, \"boostrap.ts\");\r\n\r\n const lines: string[] = [];\r\n\r\n lines.push(`import \"../app/${STYLE_FILE_NAME}\";`);\r\n lines.push(\"\");\r\n\r\n lines.push(`import {`);\r\n lines.push(` routes,`);\r\n lines.push(` type ClientRouteLoaded,`);\r\n lines.push(` notFoundRoute,`);\r\n lines.push(` errorRoute,`);\r\n lines.push(`} from \"./routes-client\";`);\r\n lines.push(\"\");\r\n\r\n lines.push(`import { bootstrapClient } from \"@lolyjs/core/runtime\"`);\r\n lines.push(\"\");\r\n lines.push(`try {`);\r\n lines.push(` bootstrapClient(routes as ClientRouteLoaded[], notFoundRoute, errorRoute);`);\r\n lines.push(`} catch (error) {`);\r\n lines.push(` console.error(\"[bootstrap] Fatal error during bootstrap:\", error);`);\r\n lines.push(` throw error;`);\r\n lines.push(`}`);\r\n\r\n fs.writeFileSync(manifestPath, lines.join(\"\\n\"), \"utf-8\");\r\n}\r\n\r\n/**\r\n * Writes the routes manifest JSON file.\r\n *\r\n * This manifest contains only data (no functions) and is:\r\n * - Readable by Node without compiling TypeScript\r\n * - Usable by the production server\r\n * - Usable by build/SSG processes\r\n *\r\n * @param routes - Array of loaded page routes\r\n * @param apiRoutes - Array of loaded API routes\r\n * @param notFoundRoute - Not-found route definition\r\n * @param errorRoute - Error route definition (optional)\r\n * @param projectRoot - Root directory of the project\r\n * @param serverOutDir - Server output directory from buildServerApp\r\n * @param appDir - Absolute path to the app directory\r\n */\r\nexport function writeRoutesManifest({\r\n routes,\r\n apiRoutes,\r\n wssRoutes,\r\n notFoundRoute,\r\n errorRoute,\r\n projectRoot,\r\n serverOutDir,\r\n appDir,\r\n}: {\r\n routes: LoadedRoute[];\r\n apiRoutes: ApiRoute[];\r\n wssRoutes: WssRoute[];\r\n notFoundRoute: LoadedRoute;\r\n errorRoute: LoadedRoute | null;\r\n projectRoot: string;\r\n serverOutDir: string;\r\n appDir: string;\r\n}) {\r\n const fwDir = path.join(projectRoot, BUILD_FOLDER_NAME);\r\n if (!fs.existsSync(fwDir)) {\r\n fs.mkdirSync(fwDir, { recursive: true });\r\n }\r\n\r\n const manifestPath = path.join(fwDir, \"routes-manifest.json\");\r\n\r\n const toRelative = (abs: string) =>\r\n path.relative(projectRoot, abs).replace(/\\\\/g, \"/\");\r\n\r\n const convertToJs = (file: string) =>\r\n file.replace(/\\.(ts|tsx|jsx|mjs|cjs)$/i, \".js\");\r\n\r\n const pageEntries: PageRouteManifestEntry[] = routes.map((r) => {\r\n const relativeSource = path.relative(appDir, r.pageFile);\r\n\r\n const jsPageFile = path.join(serverOutDir, convertToJs(relativeSource));\r\n\r\n const jsLayoutFiles = r.layoutFiles.map((lf) => {\r\n const rel = path.relative(appDir, lf);\r\n return path.join(serverOutDir, convertToJs(rel));\r\n });\r\n\r\n return {\r\n type: \"page\",\r\n pattern: r.pattern,\r\n paramNames: r.paramNames,\r\n pageFile: toRelative(jsPageFile),\r\n layoutFiles: jsLayoutFiles.map(toRelative),\r\n dynamic: r.dynamic,\r\n };\r\n });\r\n\r\n const apiEntries: ApiRouteManifestEntry[] = apiRoutes\r\n .map((r) => {\r\n const anyRoute = r as any;\r\n const filePath: string | undefined = anyRoute.filePath;\r\n\r\n if (!filePath) {\r\n return undefined;\r\n }\r\n\r\n const relSource = path.relative(appDir, filePath);\r\n\r\n const jsApiFile = path.join(serverOutDir, convertToJs(relSource));\r\n\r\n const methods = Object.keys(r.handlers || {});\r\n\r\n const entry: ApiRouteManifestEntry = {\r\n type: \"api\",\r\n pattern: r.pattern,\r\n paramNames: r.paramNames,\r\n file: toRelative(jsApiFile),\r\n methods,\r\n };\r\n\r\n return entry;\r\n })\r\n .filter((e): e is ApiRouteManifestEntry => !!e);\r\n\r\n const wssEntries: WssRouteManifestEntry[] = wssRoutes\r\n .map((r) => {\r\n const anyRoute = r as any;\r\n const filePath: string | undefined = anyRoute.filePath;\r\n\r\n if (!filePath) {\r\n return undefined;\r\n }\r\n\r\n const relSource = path.relative(appDir, filePath);\r\n\r\n const jsApiFile = path.join(serverOutDir, convertToJs(relSource));\r\n\r\n const events = Object.keys(r.handlers || {});\r\n\r\n const entry: WssRouteManifestEntry = {\r\n type: \"wss\",\r\n pattern: r.pattern,\r\n paramNames: r.paramNames,\r\n file: toRelative(jsApiFile),\r\n events,\r\n };\r\n\r\n return entry;\r\n })\r\n .filter((e): e is WssRouteManifestEntry => !!e);\r\n\r\n // Build not-found page entry\r\n const notFoundLayoutFiles = notFoundRoute.layoutFiles || [];\r\n const notFoundJsLayoutFiles = notFoundLayoutFiles.map((lf) => {\r\n const rel = path.relative(appDir, lf);\r\n return path.join(serverOutDir, convertToJs(rel));\r\n });\r\n\r\n const notFoundRelativeSource = notFoundRoute.pageFile\r\n ? path.relative(appDir, notFoundRoute.pageFile)\r\n : `${NOT_FOUND_FILE_PREFIX}.tsx`;\r\n const notFoundJsPageFile = notFoundRoute.pageFile\r\n ? path.join(serverOutDir, convertToJs(notFoundRelativeSource))\r\n : path.join(serverOutDir, convertToJs(`${NOT_FOUND_FILE_PREFIX}.tsx`));\r\n\r\n const notFoundPage: PageRouteManifestEntry = {\r\n type: \"page\",\r\n pageFile: toRelative(notFoundJsPageFile),\r\n layoutFiles: notFoundJsLayoutFiles.map(toRelative),\r\n dynamic: \"force-static\",\r\n paramNames: [],\r\n pattern: NOT_FOUND_PATTERN,\r\n };\r\n\r\n // Build error page entry (if exists)\r\n let errorPageEntry: PageRouteManifestEntry | undefined;\r\n if (errorRoute && errorRoute.pageFile) {\r\n const errorLayoutFiles = errorRoute.layoutFiles || [];\r\n const errorJsLayoutFiles = errorLayoutFiles.map((lf) => {\r\n const rel = path.relative(appDir, lf);\r\n return path.join(serverOutDir, convertToJs(rel));\r\n });\r\n\r\n const errorRelativeSource = path.relative(appDir, errorRoute.pageFile);\r\n const errorJsPageFile = path.join(\r\n serverOutDir,\r\n convertToJs(errorRelativeSource)\r\n );\r\n\r\n errorPageEntry = {\r\n type: \"page\",\r\n pageFile: toRelative(errorJsPageFile),\r\n layoutFiles: errorJsLayoutFiles.map(toRelative),\r\n dynamic: \"force-static\",\r\n paramNames: [],\r\n pattern: ERROR_PATTERN,\r\n };\r\n }\r\n\r\n const manifest: RoutesManifest = {\r\n version: 1,\r\n basePath: \"\",\r\n caseSensitive: false,\r\n pages404: true,\r\n routes: pageEntries,\r\n apiRoutes: apiEntries,\r\n notFound: notFoundPage,\r\n wssRoutes: wssEntries,\r\n ...(errorPageEntry && { error: errorPageEntry }),\r\n };\r\n\r\n fs.writeFileSync(manifestPath, JSON.stringify(manifest, null, 2), \"utf-8\");\r\n}\r\n","import fs from \"fs\";\r\nimport path from \"path\";\r\nimport {\r\n ApiRoute,\r\n LoadedRoute,\r\n RouteMiddleware,\r\n WssRoute,\r\n} from \"./index.types\";\r\nimport { loadServerHookForDir, loadLayoutServerHook } from \"./server-hook\";\r\nimport { BUILD_FOLDER_NAME, ERROR_PATTERN } from \"@constants/globals\";\r\nimport {\r\n extractApiHandlers,\r\n extractApiMiddlewares,\r\n extractRouteRegex,\r\n extractWssHandlers,\r\n extractDefineWssRoute,\r\n loadLayouts,\r\n loadModuleSafely,\r\n loadPageComponent,\r\n readManifest,\r\n} from \"./helpers/routes\";\r\nimport type { ExtendedWssRoute } from \"./loader-wss\";\r\n\r\n/**\r\n * Loads page and API routes from the routes manifest file.\r\n * Used in production to avoid filesystem scanning.\r\n *\r\n * @param projectRoot - Root directory of the project\r\n * @returns Object containing loaded routes and API routes\r\n */\r\nexport function loadRoutesFromManifest(projectRoot: string): {\r\n routes: LoadedRoute[];\r\n apiRoutes: ApiRoute[];\r\n wssRoutes: ExtendedWssRoute[];\r\n} {\r\n const manifest = readManifest(projectRoot);\r\n if (!manifest) {\r\n return { routes: [], apiRoutes: [], wssRoutes: [] };\r\n }\r\n\r\n const pageRoutes: LoadedRoute[] = [];\r\n\r\n for (const entry of manifest.routes) {\r\n const { regex, paramNames } = extractRouteRegex(\r\n entry.pattern,\r\n entry.paramNames\r\n );\r\n\r\n const component = loadPageComponent(entry.pageFile, projectRoot);\r\n if (!component) {\r\n continue;\r\n }\r\n\r\n const layouts = loadLayouts(entry.layoutFiles, projectRoot);\r\n const pageFile = path.join(projectRoot, entry.pageFile);\r\n const layoutFiles = entry.layoutFiles.map((f) =>\r\n path.join(projectRoot, f)\r\n );\r\n const pageDir = path.dirname(pageFile);\r\n \r\n // Load server hooks and middlewares for each layout (root → specific, same order as layouts)\r\n // For a layout at app/layout.tsx, we look for app/layout.server.hook.ts (same directory)\r\n const layoutServerHooks: (typeof serverHook)[] = [];\r\n const layoutMiddlewares: RouteMiddleware[][] = [];\r\n for (const layoutFile of layoutFiles) {\r\n const layoutHookData = loadLayoutServerHook(layoutFile);\r\n if (layoutHookData) {\r\n layoutServerHooks.push(layoutHookData.serverHook);\r\n layoutMiddlewares.push(layoutHookData.middlewares);\r\n } else {\r\n layoutServerHooks.push(null);\r\n layoutMiddlewares.push([]);\r\n }\r\n }\r\n \r\n const { middlewares, serverHook, dynamic, generateStaticParams } =\r\n loadServerHookForDir(pageDir);\r\n\r\n pageRoutes.push({\r\n pattern: entry.pattern,\r\n regex,\r\n paramNames,\r\n component,\r\n layouts,\r\n pageFile,\r\n layoutFiles,\r\n middlewares,\r\n loader: serverHook, // Keep 'loader' field name for backward compatibility\r\n layoutServerHooks, // Server hooks for each layout (same order as layouts)\r\n layoutMiddlewares, // Middlewares for each layout (same order as layouts)\r\n dynamic: entry.dynamic ?? dynamic,\r\n generateStaticParams,\r\n });\r\n }\r\n\r\n const apiRoutes: ApiRoute[] = [];\r\n const httpMethods = [\"GET\", \"POST\", \"PUT\", \"PATCH\", \"DELETE\", \"OPTIONS\"];\r\n\r\n for (const entry of manifest.apiRoutes) {\r\n const { regex, paramNames } = extractRouteRegex(\r\n entry.pattern,\r\n entry.paramNames\r\n );\r\n const filePath = path.join(projectRoot, entry.file);\r\n const mod = loadModuleSafely(filePath);\r\n\r\n if (!mod) {\r\n continue;\r\n }\r\n\r\n const handlers = extractApiHandlers(mod, httpMethods);\r\n const { global: globalMiddlewares, methodSpecific: methodMiddlewares } =\r\n extractApiMiddlewares(mod, httpMethods);\r\n\r\n apiRoutes.push({\r\n pattern: entry.pattern,\r\n regex,\r\n paramNames,\r\n handlers,\r\n middlewares: globalMiddlewares,\r\n methodMiddlewares,\r\n filePath,\r\n });\r\n }\r\n\r\n const wssRoutes: ExtendedWssRoute[] = [];\r\n\r\n for (const entry of manifest.wssRoutes) {\r\n const { regex, paramNames } = extractRouteRegex(\r\n entry.pattern,\r\n entry.paramNames\r\n );\r\n const filePath = path.join(projectRoot, entry.file);\r\n const mod = loadModuleSafely(filePath);\r\n\r\n if (!mod) {\r\n continue;\r\n }\r\n\r\n // Extract namespace from pattern (same logic as loader-wss.ts)\r\n let namespace = entry.pattern.replace(/^\\/wss/, \"\");\r\n if (!namespace.startsWith(\"/\")) {\r\n namespace = \"/\" + namespace;\r\n }\r\n if (namespace === \"\") {\r\n namespace = \"/\";\r\n }\r\n\r\n // Try to extract new format route (normalized)\r\n let normalized = null;\r\n try {\r\n normalized = extractDefineWssRoute(mod, namespace);\r\n } catch (error) {\r\n // If new format fails, fall back to legacy format\r\n console.warn(\r\n `[loly:realtime] Failed to extract normalized route from ${filePath}:`,\r\n error instanceof Error ? error.message : String(error)\r\n );\r\n }\r\n\r\n // Extract handlers (for backwards compatibility or if normalized failed)\r\n const handlers = extractWssHandlers(mod, entry.events || []);\r\n const { global: globalMiddlewares, methodSpecific: methodMiddlewares } =\r\n extractApiMiddlewares(mod, []);\r\n\r\n // If normalized exists, also extract handlers from it for backwards compatibility\r\n if (normalized) {\r\n for (const [eventName, eventDef] of normalized.events.entries()) {\r\n handlers[eventName] = eventDef.handler as any; // WssHandler is different from ApiHandler\r\n }\r\n }\r\n\r\n wssRoutes.push({\r\n pattern: entry.pattern,\r\n regex,\r\n paramNames,\r\n handlers,\r\n middlewares: globalMiddlewares,\r\n methodMiddlewares,\r\n filePath,\r\n normalized: normalized || undefined, // Store normalized structure (use undefined instead of null)\r\n });\r\n }\r\n\r\n return { routes: pageRoutes, apiRoutes, wssRoutes };\r\n}\r\n\r\n/**\r\n * Loads route chunks mapping from the manifest file.\r\n *\r\n * @param projectRoot - Root directory of the project\r\n * @returns Record mapping route patterns to chunk names\r\n */\r\nexport function loadChunksFromManifest(projectRoot: string): Record<string, string> {\r\n const chunksPath = path.join(\r\n projectRoot,\r\n BUILD_FOLDER_NAME,\r\n \"route-chunks.json\"\r\n );\r\n let routeChunks: Record<string, string> = {};\r\n if (fs.existsSync(chunksPath)) {\r\n try {\r\n routeChunks = JSON.parse(fs.readFileSync(chunksPath, \"utf-8\"));\r\n } catch (err) {\r\n // Silently fail if chunks file is invalid\r\n }\r\n }\r\n\r\n return routeChunks;\r\n}\r\n\r\n/**\r\n * Loads the not-found route from the routes manifest.\r\n *\r\n * @param projectRoot - Root directory of the project\r\n * @returns LoadedRoute for the not-found page, or null if not found\r\n */\r\nexport function loadNotFoundFromManifest(\r\n projectRoot: string\r\n): LoadedRoute | null {\r\n const manifest = readManifest(projectRoot);\r\n if (!manifest) {\r\n return null;\r\n }\r\n\r\n const component = loadPageComponent(manifest.notFound.pageFile, projectRoot);\r\n if (!component) {\r\n return null;\r\n }\r\n\r\n const layouts = loadLayouts(manifest.notFound.layoutFiles, projectRoot);\r\n const pageFile = path.join(projectRoot, manifest.notFound.pageFile);\r\n\r\n return {\r\n pattern: \"\",\r\n regex: new RegExp(\"\"),\r\n paramNames: [],\r\n component,\r\n layouts,\r\n pageFile,\r\n layoutFiles: [],\r\n middlewares: [],\r\n loader: null,\r\n dynamic: \"force-static\",\r\n generateStaticParams: null,\r\n };\r\n}\r\n\r\n/**\r\n * Loads the error route from the routes manifest.\r\n *\r\n * @param projectRoot - Root directory of the project\r\n * @returns LoadedRoute for the error page, or null if not found\r\n */\r\nexport function loadErrorFromManifest(\r\n projectRoot: string\r\n): LoadedRoute | null {\r\n const manifest = readManifest(projectRoot);\r\n if (!manifest) {\r\n return null;\r\n }\r\n\r\n // Check if error page exists in manifest\r\n const errorEntry = (manifest as any).error;\r\n if (!errorEntry) {\r\n return null;\r\n }\r\n\r\n const component = loadPageComponent(errorEntry.pageFile, projectRoot);\r\n if (!component) {\r\n return null;\r\n }\r\n\r\n const layoutFiles = (errorEntry.layoutFiles || []) as string[];\r\n const layouts = loadLayouts(layoutFiles, projectRoot);\r\n const pageFile = path.join(projectRoot, errorEntry.pageFile);\r\n\r\n return {\r\n pattern: ERROR_PATTERN,\r\n regex: new RegExp(`^${ERROR_PATTERN}/?$`),\r\n paramNames: [],\r\n component,\r\n layouts,\r\n pageFile,\r\n layoutFiles: [],\r\n middlewares: [],\r\n loader: null,\r\n dynamic: \"force-static\",\r\n generateStaticParams: null,\r\n };\r\n}\r\n","import fs from \"fs\";\r\nimport path from \"path\";\r\nimport { ApiRoute, LoadedRoute, PageComponent, RouteMiddleware, WssRoute, RoutesManifest } from \"./index.types\";\r\n\r\nimport { loadLayoutsForDir } from \"./layout\";\r\nimport { loadServerHookForDir, loadLayoutServerHook } from \"./server-hook\";\r\nimport {\r\n loadRoutesFromManifest,\r\n loadNotFoundFromManifest,\r\n loadErrorFromManifest,\r\n loadChunksFromManifest,\r\n} from \"./loader-routes\";\r\nimport { readManifest } from \"./helpers/routes\";\r\nimport { loadRoutes } from \"./loader-pages\";\r\nimport { loadApiRoutes } from \"./loader-api\";\r\nimport {\r\n NOT_FOUND_PATTERN,\r\n ERROR_PATTERN,\r\n NOT_FOUND_FILE_PREFIX,\r\n ERROR_FILE_PREFIX,\r\n} from \"@constants/globals\";\r\nimport { loadWssRoutes, type ExtendedWssRoute } from \"./loader-wss\";\r\n\r\n/**\r\n * Unified interface for loading routes from different sources.\r\n * Abstracts the difference between filesystem (dev) and manifest (prod) loading.\r\n */\r\nexport interface RouteLoader {\r\n loadRoutes(): LoadedRoute[];\r\n loadApiRoutes(): ApiRoute[];\r\n loadWssRoutes(): ExtendedWssRoute[];\r\n loadNotFoundRoute(): LoadedRoute | null;\r\n loadErrorRoute(): LoadedRoute | null;\r\n loadRouteChunks(): Record<string, string>;\r\n}\r\n\r\n/**\r\n * File change tracking for intelligent cache invalidation.\r\n */\r\ninterface FileStats {\r\n mtime: number;\r\n size: number;\r\n}\r\n\r\n/**\r\n * Cache entry for routes with file tracking.\r\n */\r\ninterface RoutesCache {\r\n routes: LoadedRoute[];\r\n apiRoutes: ApiRoute[];\r\n wssRoutes: ExtendedWssRoute[];\r\n notFoundRoute: LoadedRoute | null;\r\n errorRoute: LoadedRoute | null;\r\n fileStats: Map<string, FileStats>;\r\n timestamp: number;\r\n}\r\n\r\n/**\r\n * Directories to always skip when tracking file changes.\r\n * These are directories that never contain code affecting routes.\r\n */\r\nconst SKIP_DIRECTORIES = new Set([\r\n 'node_modules',\r\n '.git',\r\n '.loly',\r\n 'dist',\r\n 'build',\r\n '.next',\r\n '.cache',\r\n 'coverage',\r\n '.vscode',\r\n '.idea',\r\n '.turbo',\r\n '.swc',\r\n]);\r\n\r\n/**\r\n * Gets all relevant files for change detection.\r\n * Monitors the entire project root (except excluded directories) to catch\r\n * any changes in TypeScript/JavaScript files, regardless of directory structure.\r\n * \r\n * This approach doesn't assume any specific directory names (lib, components, etc.)\r\n * and will detect changes anywhere in the project that could affect routes.\r\n * \r\n * @param appDir - App directory path (used for context, but projectRoot is scanned)\r\n * @param projectRoot - Project root directory path to scan\r\n */\r\nfunction getRelevantFiles(appDir: string, projectRoot: string): string[] {\r\n const files: string[] = [];\r\n const projectRootNormalized = path.resolve(projectRoot);\r\n \r\n function walk(currentDir: string) {\r\n if (!fs.existsSync(currentDir)) {\r\n return;\r\n }\r\n \r\n const entries = fs.readdirSync(currentDir, { withFileTypes: true });\r\n \r\n for (const entry of entries) {\r\n const fullPath = path.join(currentDir, entry.name);\r\n \r\n if (entry.isDirectory()) {\r\n // Skip directories that never contain source code affecting routes\r\n // Note: We skip dot-prefixed dirs except those we know might have source (like .github/scripts)\r\n // but in practice, most dot-dirs are config/build artifacts\r\n if (SKIP_DIRECTORIES.has(entry.name)) {\r\n continue;\r\n }\r\n \r\n // Skip hidden directories (starting with .) unless they're known source dirs\r\n // This is a safe default - user can reorganize if needed\r\n if (entry.name.startsWith('.')) {\r\n continue;\r\n }\r\n \r\n walk(fullPath);\r\n } else {\r\n // Track all TypeScript/JavaScript files that could affect routes\r\n // This includes components, utils, libs, hooks - any code that routes might import\r\n const ext = path.extname(entry.name);\r\n if (['.ts', '.tsx', '.js', '.jsx'].includes(ext)) {\r\n files.push(fullPath);\r\n }\r\n }\r\n }\r\n }\r\n \r\n // Walk the entire project root - this catches changes in any directory structure\r\n // The appDir will be included automatically if it's within projectRoot\r\n walk(projectRootNormalized);\r\n \r\n return files;\r\n}\r\n\r\n/**\r\n * Checks if any relevant files have changed since cache was created.\r\n */\r\nfunction hasFilesChanged(\r\n appDir: string,\r\n projectRoot: string,\r\n cachedStats: Map<string, FileStats>\r\n): boolean {\r\n const currentFiles = getRelevantFiles(appDir, projectRoot);\r\n const currentFilesSet = new Set(currentFiles);\r\n \r\n // Check if any cached file was deleted\r\n for (const [filePath] of cachedStats.entries()) {\r\n if (!currentFilesSet.has(filePath)) {\r\n return true; // File was deleted\r\n }\r\n }\r\n \r\n // Check if any file changed (new or modified)\r\n for (const filePath of currentFiles) {\r\n if (!fs.existsSync(filePath)) {\r\n continue;\r\n }\r\n \r\n const stats = fs.statSync(filePath);\r\n const cachedStat = cachedStats.get(filePath);\r\n \r\n if (!cachedStat) {\r\n return true; // New file\r\n }\r\n \r\n // Check if mtime or size changed\r\n if (\r\n stats.mtimeMs !== cachedStat.mtime ||\r\n stats.size !== cachedStat.size\r\n ) {\r\n return true; // File was modified\r\n }\r\n }\r\n \r\n return false;\r\n}\r\n\r\n/**\r\n * Builds a map of file stats for change detection.\r\n */\r\nfunction buildFileStats(files: string[]): Map<string, FileStats> {\r\n const statsMap = new Map<string, FileStats>();\r\n \r\n for (const filePath of files) {\r\n if (fs.existsSync(filePath)) {\r\n const stats = fs.statSync(filePath);\r\n statsMap.set(filePath, {\r\n mtime: stats.mtimeMs,\r\n size: stats.size,\r\n });\r\n }\r\n }\r\n \r\n return statsMap;\r\n}\r\n\r\n/**\r\n * Loads routes directly from the filesystem with intelligent caching.\r\n * Used in development mode.\r\n * \r\n * Caches routes and only reloads when files change, reducing overhead.\r\n * Monitors both app directory and common source directories outside app.\r\n */\r\nexport class FilesystemRouteLoader implements RouteLoader {\r\n private cache: RoutesCache | null = null;\r\n private readonly cacheMaxAge = 1000; // Maximum cache age in ms (1 second fallback)\r\n\r\n constructor(\r\n private appDir: string,\r\n private projectRoot: string = appDir\r\n ) {\r\n // If projectRoot not provided, use appDir's parent or appDir itself\r\n if (this.projectRoot === this.appDir) {\r\n // Try to find project root by going up from appDir\r\n let current = path.resolve(this.appDir);\r\n while (current !== path.dirname(current)) {\r\n if (fs.existsSync(path.join(current, 'package.json'))) {\r\n this.projectRoot = current;\r\n break;\r\n }\r\n current = path.dirname(current);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Invalidates the cache, forcing a reload on next access.\r\n */\r\n invalidateCache(): void {\r\n this.cache = null;\r\n }\r\n\r\n /**\r\n * Checks if cache is still valid, invalidates if files changed.\r\n */\r\n private ensureCacheValid(): void {\r\n if (!this.cache) {\r\n return; // No cache, will be built on next access\r\n }\r\n\r\n // Check if cache is too old (fallback safety)\r\n const now = Date.now();\r\n if (now - this.cache.timestamp > this.cacheMaxAge) {\r\n // Verify files haven't changed\r\n if (hasFilesChanged(this.appDir, this.projectRoot, this.cache.fileStats)) {\r\n this.cache = null;\r\n } else {\r\n // Cache is still valid, just update timestamp\r\n this.cache.timestamp = now;\r\n }\r\n }\r\n }\r\n\r\n loadRoutes(): LoadedRoute[] {\r\n this.ensureCacheValid();\r\n \r\n if (!this.cache || hasFilesChanged(this.appDir, this.projectRoot, this.cache.fileStats)) {\r\n const routes = loadRoutes(this.appDir);\r\n const files = getRelevantFiles(this.appDir, this.projectRoot);\r\n const fileStats = buildFileStats(files);\r\n \r\n // Initialize or update cache\r\n this.cache = {\r\n routes,\r\n apiRoutes: this.cache?.apiRoutes || [],\r\n wssRoutes: this.cache?.wssRoutes || [],\r\n notFoundRoute: this.cache?.notFoundRoute ?? null,\r\n errorRoute: this.cache?.errorRoute ?? null,\r\n fileStats,\r\n timestamp: Date.now(),\r\n };\r\n }\r\n \r\n return this.cache.routes;\r\n }\r\n\r\n loadApiRoutes(): ApiRoute[] {\r\n this.ensureCacheValid();\r\n \r\n // Ensure cache exists\r\n if (!this.cache) {\r\n this.loadRoutes(); // This will initialize the cache\r\n }\r\n \r\n // Ensure we have a cache at this point\r\n if (!this.cache) {\r\n throw new Error('Failed to initialize route cache');\r\n }\r\n \r\n if (hasFilesChanged(this.appDir, this.projectRoot, this.cache.fileStats) || this.cache.apiRoutes.length === 0) {\r\n // Files changed or not loaded yet, reload\r\n const files = getRelevantFiles(this.appDir, this.projectRoot);\r\n const fileStats = buildFileStats(files);\r\n this.cache.apiRoutes = loadApiRoutes(this.appDir);\r\n this.cache.fileStats = fileStats;\r\n this.cache.timestamp = Date.now();\r\n }\r\n \r\n return this.cache.apiRoutes;\r\n }\r\n\r\n loadWssRoutes(): ExtendedWssRoute[] {\r\n this.ensureCacheValid();\r\n \r\n if (!this.cache) {\r\n this.loadRoutes(); // Initialize cache\r\n }\r\n \r\n if (!this.cache) {\r\n throw new Error('Failed to initialize route cache');\r\n }\r\n \r\n if (hasFilesChanged(this.appDir, this.projectRoot, this.cache.fileStats) || this.cache.wssRoutes.length === 0) {\r\n const files = getRelevantFiles(this.appDir, this.projectRoot);\r\n const fileStats = buildFileStats(files);\r\n this.cache.wssRoutes = loadWssRoutes(this.appDir);\r\n this.cache.fileStats = fileStats;\r\n this.cache.timestamp = Date.now();\r\n }\r\n \r\n return this.cache.wssRoutes;\r\n }\r\n\r\n loadNotFoundRoute(): LoadedRoute | null {\r\n this.ensureCacheValid();\r\n \r\n if (!this.cache) {\r\n this.loadRoutes(); // Initialize cache\r\n }\r\n \r\n if (!this.cache) {\r\n throw new Error('Failed to initialize route cache');\r\n }\r\n \r\n if (hasFilesChanged(this.appDir, this.projectRoot, this.cache.fileStats) || this.cache.notFoundRoute === undefined) {\r\n const files = getRelevantFiles(this.appDir, this.projectRoot);\r\n const fileStats = buildFileStats(files);\r\n this.cache.notFoundRoute = loadNotFoundRouteFromFilesystem(this.appDir);\r\n this.cache.fileStats = fileStats;\r\n this.cache.timestamp = Date.now();\r\n }\r\n \r\n return this.cache.notFoundRoute;\r\n }\r\n\r\n loadErrorRoute(): LoadedRoute | null {\r\n this.ensureCacheValid();\r\n \r\n if (!this.cache) {\r\n this.loadRoutes(); // Initialize cache\r\n }\r\n \r\n if (!this.cache) {\r\n throw new Error('Failed to initialize route cache');\r\n }\r\n \r\n if (hasFilesChanged(this.appDir, this.projectRoot, this.cache.fileStats) || this.cache.errorRoute === undefined) {\r\n const files = getRelevantFiles(this.appDir, this.projectRoot);\r\n const fileStats = buildFileStats(files);\r\n this.cache.errorRoute = loadErrorRouteFromFilesystem(this.appDir);\r\n this.cache.fileStats = fileStats;\r\n this.cache.timestamp = Date.now();\r\n }\r\n \r\n return this.cache.errorRoute;\r\n }\r\n\r\n loadRouteChunks(): Record<string, string> {\r\n // In dev, route chunks are not critical, return empty\r\n return {};\r\n }\r\n}\r\n\r\n/**\r\n * Cache entry for manifest-based routes.\r\n * In production, routes are static and don't change, so we cache everything.\r\n */\r\ninterface ManifestCache {\r\n routes?: LoadedRoute[];\r\n apiRoutes?: ApiRoute[];\r\n wssRoutes?: ExtendedWssRoute[];\r\n notFoundRoute?: LoadedRoute | null;\r\n errorRoute?: LoadedRoute | null;\r\n routeChunks?: Record<string, string>;\r\n manifest?: RoutesManifest | null;\r\n}\r\n\r\n/**\r\n * Loads routes from the compiled manifest file.\r\n * Used in production mode.\r\n * \r\n * Implements caching to avoid re-reading and re-processing the manifest\r\n * on every request, since routes are static in production.\r\n */\r\nexport class ManifestRouteLoader implements RouteLoader {\r\n private cache: ManifestCache = {};\r\n\r\n constructor(private projectRoot: string) {}\r\n\r\n /**\r\n * Gets the manifest, using cache if available.\r\n * The manifest is read once and cached for the lifetime of the loader.\r\n */\r\n private getManifest(): RoutesManifest | null {\r\n if (this.cache.manifest !== undefined) {\r\n return this.cache.manifest;\r\n }\r\n\r\n const manifest = readManifest(this.projectRoot);\r\n this.cache.manifest = manifest;\r\n return manifest;\r\n }\r\n\r\n loadRoutes(): LoadedRoute[] {\r\n if (this.cache.routes) {\r\n return this.cache.routes;\r\n }\r\n\r\n const { routes } = loadRoutesFromManifest(this.projectRoot);\r\n this.cache.routes = routes;\r\n return routes;\r\n }\r\n\r\n loadApiRoutes(): ApiRoute[] {\r\n if (this.cache.apiRoutes) {\r\n return this.cache.apiRoutes;\r\n }\r\n\r\n const { apiRoutes } = loadRoutesFromManifest(this.projectRoot);\r\n this.cache.apiRoutes = apiRoutes;\r\n return apiRoutes;\r\n }\r\n\r\n loadWssRoutes(): ExtendedWssRoute[] {\r\n if (this.cache.wssRoutes) {\r\n return this.cache.wssRoutes;\r\n }\r\n\r\n const { wssRoutes } = loadRoutesFromManifest(this.projectRoot);\r\n this.cache.wssRoutes = wssRoutes;\r\n return wssRoutes;\r\n }\r\n\r\n loadNotFoundRoute(): LoadedRoute | null {\r\n if (this.cache.notFoundRoute !== undefined) {\r\n return this.cache.notFoundRoute;\r\n }\r\n\r\n const route = loadNotFoundFromManifest(this.projectRoot);\r\n this.cache.notFoundRoute = route;\r\n return route;\r\n }\r\n\r\n loadErrorRoute(): LoadedRoute | null {\r\n if (this.cache.errorRoute !== undefined) {\r\n return this.cache.errorRoute;\r\n }\r\n\r\n const route = loadErrorFromManifest(this.projectRoot);\r\n this.cache.errorRoute = route;\r\n return route;\r\n }\r\n\r\n loadRouteChunks(): Record<string, string> {\r\n if (this.cache.routeChunks) {\r\n return this.cache.routeChunks;\r\n }\r\n\r\n const chunks = loadChunksFromManifest(this.projectRoot);\r\n this.cache.routeChunks = chunks;\r\n return chunks;\r\n }\r\n}\r\n\r\n/**\r\n * Loads the not-found route from the filesystem.\r\n * Looks for `_not-found.tsx` in the app root (Next.js style).\r\n *\r\n * @param appDir - Root directory of the app\r\n * @returns LoadedRoute for the not-found page, or null if not found\r\n */\r\nexport function loadNotFoundRouteFromFilesystem(\r\n appDir: string\r\n): LoadedRoute | null {\r\n const notFoundCandidates = [\r\n path.join(appDir, `${NOT_FOUND_FILE_PREFIX}.tsx`),\r\n path.join(appDir, `${NOT_FOUND_FILE_PREFIX}.ts`),\r\n path.join(appDir, `${NOT_FOUND_FILE_PREFIX}.jsx`),\r\n path.join(appDir, `${NOT_FOUND_FILE_PREFIX}.js`),\r\n // Fallback to old style for backward compatibility\r\n path.join(appDir, \"not-found\", \"page.tsx\"),\r\n path.join(appDir, \"not-found\", \"page.ts\"),\r\n path.join(appDir, \"not-found\", \"page.jsx\"),\r\n path.join(appDir, \"not-found\", \"page.js\"),\r\n ];\r\n\r\n let notFoundFile: string | null = null;\r\n for (const candidate of notFoundCandidates) {\r\n if (fs.existsSync(candidate)) {\r\n notFoundFile = candidate;\r\n break;\r\n }\r\n }\r\n\r\n if (!notFoundFile) {\r\n return null;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-var-requires\r\n const mod = require(notFoundFile);\r\n const component: PageComponent = mod.default;\r\n\r\n if (!component) {\r\n return null;\r\n }\r\n\r\n // For _not-found.tsx in root, use appDir as the directory\r\n const notFoundDir = notFoundFile.includes(NOT_FOUND_FILE_PREFIX)\r\n ? appDir\r\n : path.dirname(notFoundFile);\r\n\r\n const { components: layouts, files: layoutFiles } = loadLayoutsForDir(\r\n notFoundDir,\r\n appDir\r\n );\r\n\r\n // Load server hooks and middlewares for each layout\r\n // For a layout at app/layout.tsx, we look for app/layout.server.hook.ts (same directory)\r\n const layoutServerHooks: (typeof serverHook)[] = [];\r\n const layoutMiddlewares: RouteMiddleware[][] = [];\r\n for (const layoutFile of layoutFiles) {\r\n const layoutHookData = loadLayoutServerHook(layoutFile);\r\n if (layoutHookData) {\r\n layoutServerHooks.push(layoutHookData.serverHook);\r\n layoutMiddlewares.push(layoutHookData.middlewares);\r\n } else {\r\n layoutServerHooks.push(null);\r\n layoutMiddlewares.push([]);\r\n }\r\n }\r\n\r\n const { middlewares, serverHook, dynamic, generateStaticParams } =\r\n loadServerHookForDir(notFoundDir);\r\n\r\n return {\r\n pattern: NOT_FOUND_PATTERN,\r\n regex: new RegExp(`^${NOT_FOUND_PATTERN}/?$`),\r\n paramNames: [],\r\n component,\r\n layouts,\r\n pageFile: notFoundFile,\r\n layoutFiles,\r\n middlewares,\r\n loader: serverHook, // Keep 'loader' field name for backward compatibility\r\n layoutServerHooks, // Server hooks for each layout (same order as layouts)\r\n layoutMiddlewares, // Middlewares for each layout (same order as layouts)\r\n dynamic,\r\n generateStaticParams,\r\n };\r\n}\r\n\r\n/**\r\n * Loads the error route from the filesystem.\r\n * Looks for `_error.tsx` in the app root (Next.js style).\r\n *\r\n * @param appDir - Root directory of the app\r\n * @returns LoadedRoute for the error page, or null if not found\r\n */\r\nexport function loadErrorRouteFromFilesystem(\r\n appDir: string\r\n): LoadedRoute | null {\r\n const errorCandidates = [\r\n path.join(appDir, `${ERROR_FILE_PREFIX}.tsx`),\r\n path.join(appDir, `${ERROR_FILE_PREFIX}.ts`),\r\n path.join(appDir, `${ERROR_FILE_PREFIX}.jsx`),\r\n path.join(appDir, `${ERROR_FILE_PREFIX}.js`),\r\n ];\r\n\r\n let errorFile: string | null = null;\r\n for (const candidate of errorCandidates) {\r\n if (fs.existsSync(candidate)) {\r\n errorFile = candidate;\r\n break;\r\n }\r\n }\r\n\r\n if (!errorFile) {\r\n return null;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-var-requires\r\n const mod = require(errorFile);\r\n const component: PageComponent = mod.default;\r\n\r\n if (!component) {\r\n return null;\r\n }\r\n\r\n const { components: layouts, files: layoutFiles } = loadLayoutsForDir(\r\n appDir,\r\n appDir\r\n );\r\n\r\n // Load server hooks and middlewares for each layout\r\n // For a layout at app/layout.tsx, we look for app/layout.server.hook.ts (same directory)\r\n const layoutServerHooks: (typeof serverHook)[] = [];\r\n const layoutMiddlewares: RouteMiddleware[][] = [];\r\n for (const layoutFile of layoutFiles) {\r\n const layoutHookData = loadLayoutServerHook(layoutFile);\r\n if (layoutHookData) {\r\n layoutServerHooks.push(layoutHookData.serverHook);\r\n layoutMiddlewares.push(layoutHookData.middlewares);\r\n } else {\r\n layoutServerHooks.push(null);\r\n layoutMiddlewares.push([]);\r\n }\r\n }\r\n\r\n const { middlewares, serverHook, dynamic, generateStaticParams } =\r\n loadServerHookForDir(appDir);\r\n\r\n return {\r\n pattern: ERROR_PATTERN,\r\n regex: new RegExp(`^${ERROR_PATTERN}/?$`),\r\n paramNames: [],\r\n component,\r\n layouts,\r\n pageFile: errorFile,\r\n layoutFiles,\r\n middlewares,\r\n loader: serverHook, // Keep 'loader' field name for backward compatibility\r\n layoutServerHooks, // Server hooks for each layout (same order as layouts)\r\n layoutMiddlewares, // Middlewares for each layout (same order as layouts)\r\n dynamic,\r\n generateStaticParams,\r\n };\r\n}\r\n","import fs from \"fs\";\r\nimport path from \"path\";\r\nimport { WssRoute } from \"./index.types\";\r\nimport {\r\n extractApiMiddlewares,\r\n extractRouteRegex,\r\n loadModuleSafely,\r\n extractDefineWssRoute,\r\n type NormalizedWssRoute,\r\n} from \"./helpers/routes\";\r\n\r\nconst ROUTE_FILE_REGEX = /events\\.(ts|tsx|js|jsx)$/;\r\n\r\n/**\r\n * Extended WssRoute with normalized route definition.\r\n */\r\nexport interface ExtendedWssRoute extends WssRoute {\r\n normalized?: NormalizedWssRoute;\r\n}\r\n\r\n/**\r\n * Loads WSS routes from the filesystem.\r\n * Only supports the new defineWssRoute() format.\r\n * \r\n * @param appDir - Application directory\r\n * @returns Array of WSS routes\r\n */\r\nexport function loadWssRoutes(appDir: string): ExtendedWssRoute[] {\r\n const apiRoot = path.join(appDir, \"wss\");\r\n const routes: ExtendedWssRoute[] = [];\r\n\r\n if (!fs.existsSync(apiRoot)) return routes;\r\n\r\n function walk(currentDir: string) {\r\n const entries = fs.readdirSync(currentDir, { withFileTypes: true });\r\n\r\n for (const entry of entries) {\r\n const fullPath = path.join(currentDir, entry.name);\r\n\r\n if (entry.isDirectory()) {\r\n walk(fullPath);\r\n continue;\r\n }\r\n\r\n // Only process route files\r\n if (!ROUTE_FILE_REGEX.test(entry.name)) continue;\r\n\r\n const relToApp = path.relative(appDir, fullPath).replace(/\\\\/g, \"/\");\r\n const withoutRoute = relToApp.replace(/\\/events\\.(ts|tsx|js|jsx)$/, \"\");\r\n const pattern = \"/\" + withoutRoute;\r\n\r\n const { regex, paramNames } = extractRouteRegex(pattern);\r\n\r\n const mod = loadModuleSafely(fullPath);\r\n if (!mod) {\r\n continue;\r\n }\r\n\r\n // Extract namespace from pattern (remove /wss prefix if present)\r\n let namespace = pattern.replace(/^\\/wss/, \"\");\r\n if (!namespace.startsWith(\"/\")) {\r\n namespace = \"/\" + namespace;\r\n }\r\n if (namespace === \"\") {\r\n namespace = \"/\";\r\n }\r\n\r\n // Try to extract new format route\r\n let normalized: NormalizedWssRoute | null = null;\r\n try {\r\n normalized = extractDefineWssRoute(mod, namespace);\r\n } catch (error) {\r\n // Error already has helpful message, but we need to handle it\r\n console.error(error instanceof Error ? error.message : String(error));\r\n continue; // Skip this route\r\n }\r\n\r\n if (!normalized) {\r\n // No valid route definition found\r\n console.warn(\r\n `[loly:realtime] Skipping route at ${fullPath}: ` +\r\n \"No default export from defineWssRoute() found\"\r\n );\r\n continue;\r\n }\r\n\r\n // Convert normalized events to legacy handlers format for backwards compatibility\r\n // (This will be removed when we refactor setupWssEvents)\r\n const handlers: Record<string, any> = {};\r\n for (const [eventName, eventDef] of normalized.events.entries()) {\r\n handlers[eventName] = eventDef.handler;\r\n }\r\n\r\n const { global: globalMiddlewares, methodSpecific: methodMiddlewares } =\r\n extractApiMiddlewares(mod, []);\r\n\r\n routes.push({\r\n pattern,\r\n regex,\r\n paramNames,\r\n handlers,\r\n middlewares: globalMiddlewares,\r\n methodMiddlewares,\r\n filePath: fullPath,\r\n normalized, // Store normalized structure\r\n });\r\n }\r\n }\r\n\r\n walk(apiRoot);\r\n\r\n return routes;\r\n}\r\n\r\n","import { rspack, type Compiler } from \"@rspack/core\";\r\nimport { createClientConfig } from \"../config/client\";\r\nimport { copyStaticAssets, generateAssetManifest } from \"../utils\";\r\nimport path from \"path\";\r\nimport fs from \"fs\";\r\nimport { BUILD_FOLDER_NAME } from \"@constants/globals\";\r\n\r\nexport interface ClientBundlerResult {\r\n outDir: string;\r\n waitForBuild?: () => Promise<void>;\r\n}\r\n\r\n/**\r\n * Starts the client bundler in watch mode for development.\r\n * \r\n * Automatically rebuilds when files change and copies static assets.\r\n * \r\n * @param projectRoot - Root directory of the project\r\n * @param mode - Build mode ('development' or 'production'), defaults to 'development'\r\n * @returns Output directory path\r\n * \r\n * @example\r\n * const { outDir } = startClientBundler('/path/to/project', 'development');\r\n * // Bundler is now watching for changes\r\n */\r\nexport function startClientBundler(\r\n projectRoot: string,\r\n mode: \"development\" | \"production\" = \"development\"\r\n): ClientBundlerResult {\r\n const { config, outDir } = createClientConfig(projectRoot, mode);\r\n\r\n copyStaticAssets(projectRoot, outDir);\r\n\r\n const compiler = rspack(config);\r\n \r\n // Track build state\r\n let isBuilding = false;\r\n let buildResolve: (() => void) | null = null;\r\n let buildPromise: Promise<void> | null = null;\r\n let lastBuildTime = Date.now();\r\n\r\n // Mark as building when compilation starts\r\n compiler.hooks.compile.tap(\"HotReload\", () => {\r\n isBuilding = true;\r\n // Create new promise for this build\r\n buildPromise = new Promise<void>((resolve) => {\r\n buildResolve = resolve;\r\n });\r\n });\r\n\r\n compiler.watch({}, (err, stats) => {\r\n if (err) {\r\n console.error(\"\\n❌ [framework][client] Rspack compilation error:\");\r\n console.error(err);\r\n console.error(\"\\n💡 Suggestions:\");\r\n console.error(\" • Check for syntax errors in your code\");\r\n console.error(\" • Verify all imports are correct\");\r\n console.error(\" • Ensure all dependencies are installed\");\r\n console.error(\" • Try deleting .loly folder and rebuilding\\n\");\r\n isBuilding = false;\r\n lastBuildTime = Date.now();\r\n // Resolve any waiting promises even on error\r\n if (buildResolve) {\r\n buildResolve();\r\n buildResolve = null;\r\n buildPromise = null;\r\n }\r\n return;\r\n }\r\n if (!stats) {\r\n console.warn(\"⚠️ [framework][client] Build completed but no stats available\");\r\n isBuilding = false;\r\n lastBuildTime = Date.now();\r\n return;\r\n }\r\n\r\n if (stats.hasErrors()) {\r\n console.error(\"\\n❌ [framework][client] Build failed with errors:\\n\");\r\n console.error(stats.toString(\"errors-only\"));\r\n console.error(\"\\n💡 Common fixes:\");\r\n console.error(\" • Fix syntax errors shown above\");\r\n console.error(\" • Check for missing imports or dependencies\");\r\n console.error(\" • Verify TypeScript types are correct\\n\");\r\n } else {\r\n console.log(\"✅ [framework][client] Client bundle rebuilt successfully\");\r\n }\r\n \r\n isBuilding = false;\r\n lastBuildTime = Date.now();\r\n \r\n // Resolve waiting promise\r\n if (buildResolve) {\r\n buildResolve();\r\n buildResolve = null;\r\n buildPromise = null;\r\n }\r\n });\r\n\r\n return {\r\n outDir,\r\n waitForBuild: async () => {\r\n // If currently building, wait for it to finish\r\n if (isBuilding && buildPromise) {\r\n await buildPromise;\r\n // Give it a small delay to ensure files are written to disk\r\n await new Promise(resolve => setTimeout(resolve, 100));\r\n return;\r\n }\r\n \r\n // If not building, check if a build just finished recently\r\n // (within last 500ms) - this handles the case where the build\r\n // finished just before we checked\r\n const timeSinceLastBuild = Date.now() - lastBuildTime;\r\n if (timeSinceLastBuild < 500) {\r\n // Build just finished, wait a bit for files to be written\r\n await new Promise(resolve => setTimeout(resolve, 200));\r\n return;\r\n }\r\n \r\n // No build in progress and none recently finished, return immediately\r\n return Promise.resolve();\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * Builds the client bundle for production.\r\n * \r\n * Creates an optimized production bundle and copies static assets.\r\n * \r\n * @param projectRoot - Root directory of the project\r\n * @returns Promise that resolves with output directory path\r\n * \r\n * @example\r\n * const { outDir } = await buildClientBundle('/path/to/project');\r\n * // Production bundle created at {BUILD_FOLDER_NAME}/client\r\n */\r\nexport function buildClientBundle(\r\n projectRoot: string\r\n): Promise<ClientBundlerResult> {\r\n const { config, outDir } = createClientConfig(projectRoot, \"production\");\r\n const compiler = rspack(config);\r\n\r\n return new Promise<ClientBundlerResult>((resolve, reject) => {\r\n compiler.run((err, stats) => {\r\n compiler.close(() => {});\r\n\r\n if (err) {\r\n console.error(\"\\n❌ [framework][client] Production build error:\");\r\n console.error(err);\r\n console.error(\"\\n💡 Suggestions:\");\r\n console.error(\" • Check for syntax errors in your code\");\r\n console.error(\" • Verify all imports are correct\");\r\n console.error(\" • Ensure all dependencies are installed\");\r\n console.error(\" • Review the error details above\\n\");\r\n return reject(err);\r\n }\r\n if (!stats) {\r\n const error = new Error(\"No stats from Rspack - build may have failed silently\");\r\n console.error(\"\\n❌ [framework][client] Build error:\", error.message);\r\n console.error(\"💡 Try rebuilding or check Rspack configuration\\n\");\r\n return reject(error);\r\n }\r\n if (stats.hasErrors()) {\r\n console.error(\"\\n❌ [framework][client] Production build failed:\\n\");\r\n console.error(stats.toString(\"errors-only\"));\r\n console.error(\"\\n💡 Common fixes:\");\r\n console.error(\" • Fix syntax errors shown above\");\r\n console.error(\" • Check for missing imports or dependencies\");\r\n console.error(\" • Verify TypeScript types are correct\");\r\n console.error(\" • Review build configuration\\n\");\r\n return reject(new Error(\"Client build failed - see errors above\"));\r\n }\r\n\r\n copyStaticAssets(projectRoot, outDir);\r\n\r\n // Generate asset manifest with hashed filenames using stats for entrypoints\r\n const assetManifest = generateAssetManifest(outDir, stats);\r\n \r\n // Save asset manifest\r\n const manifestPath = path.join(projectRoot, BUILD_FOLDER_NAME, \"asset-manifest.json\");\r\n fs.writeFileSync(manifestPath, JSON.stringify(assetManifest, null, 2), \"utf-8\");\r\n\r\n resolve({ outDir });\r\n });\r\n });\r\n}\r\n\r\n","import path from \"path\";\r\nimport fs from \"fs\";\r\nimport { rspack, type Configuration } from \"@rspack/core\";\r\nimport { loadAliasesFromTsconfig } from \"../utils\";\r\nimport dotenv from 'dotenv';\r\nimport { BUILD_FOLDER_NAME, STATIC_PATH } from \"@constants/globals\";\r\n\r\n/**\r\n * Creates Rspack configuration for client bundle.\r\n *\r\n * @param projectRoot - Root directory of the project\r\n * @param mode - Build mode ('development' or 'production')\r\n * @returns Rspack configuration and output directory\r\n *\r\n * @example\r\n * const { config, outDir } = createClientConfig('/path/to/project', 'production');\r\n */\r\nexport function createClientConfig(\r\n projectRoot: string,\r\n mode: \"development\" | \"production\"\r\n): { config: Configuration; outDir: string } {\r\n const buildDir = path.join(projectRoot, BUILD_FOLDER_NAME);\r\n const clientEntry = path.join(buildDir, \"boostrap.ts\");\r\n const outDir = path.join(buildDir, \"client\");\r\n\r\n const envPath = path.join(projectRoot, \".env\");\r\n if (fs.existsSync(envPath)) {\r\n dotenv.config({ path: envPath });\r\n }\r\n\r\n const publicEnv: Record<string, string> = {};\r\n for (const [key, value] of Object.entries(process.env)) {\r\n if (key.startsWith(\"PUBLIC_\")) {\r\n publicEnv[`process.env.${key}`] = JSON.stringify(value ?? \"\");\r\n }\r\n }\r\n\r\n // Always define PUBLIC_WS_BASE_URL to prevent \"process.env is not defined\" errors\r\n if (!publicEnv[\"process.env.PUBLIC_WS_BASE_URL\"]) {\r\n publicEnv[\"process.env.PUBLIC_WS_BASE_URL\"] = JSON.stringify(undefined);\r\n }\r\n\r\n const config: Configuration = {\r\n mode,\r\n entry: {\r\n client: clientEntry,\r\n },\r\n output: {\r\n path: outDir,\r\n filename: mode === \"production\" ? \"client.[contenthash].js\" : \"client.js\", // Main entry\r\n chunkFilename: mode === \"production\" ? \"[name].[contenthash].js\" : \"[name].js\", // Code-split chunks (route-..., 0.js, etc.)\r\n publicPath: `${STATIC_PATH}/`,\r\n },\r\n context: projectRoot,\r\n resolve: {\r\n extensions: [\".tsx\", \".ts\", \".jsx\", \".js\"],\r\n alias: loadAliasesFromTsconfig(projectRoot),\r\n },\r\n module: {\r\n rules: [\r\n {\r\n test: /\\.[jt]sx?$/,\r\n loader: \"builtin:swc-loader\",\r\n options: {\r\n jsc: {\r\n parser: { syntax: \"typescript\", tsx: true },\r\n transform: {\r\n react: {\r\n runtime: \"automatic\",\r\n development: mode === \"development\",\r\n refresh: false,\r\n },\r\n },\r\n },\r\n },\r\n },\r\n {\r\n test: /\\.css$/,\r\n use: [\r\n rspack.CssExtractRspackPlugin.loader,\r\n \"css-loader\",\r\n \"postcss-loader\",\r\n ],\r\n },\r\n ],\r\n },\r\n plugins: [\r\n new rspack.DefinePlugin({\r\n // Use mode directly to ensure development mode is correctly set\r\n // This replaces process.env.NODE_ENV in the client bundle with the literal string value\r\n \"process.env.NODE_ENV\": JSON.stringify(mode),\r\n ...publicEnv,\r\n }),\r\n new rspack.CssExtractRspackPlugin({\r\n filename: mode === \"production\" ? \"client.[contenthash].css\" : \"client.css\",\r\n }),\r\n ],\r\n optimization: mode === \"production\" ? {\r\n usedExports: true,\r\n sideEffects: false, // More aggressive tree shaking - assume no side effects\r\n providedExports: true,\r\n concatenateModules: true, // Better for tree shaking\r\n minimize: true,\r\n removeEmptyChunks: true,\r\n mergeDuplicateChunks: true,\r\n // Improved code splitting: separate vendor chunks for better caching\r\n splitChunks: {\r\n chunks: \"all\",\r\n cacheGroups: {\r\n // Separate React/React-DOM into dedicated vendor chunk\r\n // This improves caching: React rarely changes, so users don't need to re-download it\r\n vendor: {\r\n test: /[\\\\/]node_modules[\\\\/](react|react-dom|scheduler)[\\\\/]/,\r\n name: \"vendor\",\r\n priority: 30,\r\n enforce: true, // Force separation even if only used once\r\n reuseExistingChunk: true,\r\n },\r\n // Other node_modules dependencies in a separate chunk\r\n vendorCommons: {\r\n test: /[\\\\/]node_modules[\\\\/](?!(react|react-dom|scheduler)[\\\\/])/,\r\n name: \"vendor-commons\",\r\n priority: 10,\r\n minChunks: 2, // Only create if used in 2+ chunks\r\n reuseExistingChunk: true,\r\n },\r\n // Default: shared application code (not in node_modules)\r\n default: {\r\n minChunks: 2,\r\n priority: 5,\r\n reuseExistingChunk: true,\r\n },\r\n },\r\n },\r\n } : undefined,\r\n infrastructureLogging: {\r\n level: \"error\",\r\n },\r\n stats: \"minimal\",\r\n };\r\n\r\n return { config, outDir };\r\n}\r\n","import fs from \"fs\";\r\nimport path from \"path\";\r\n\r\n/**\r\n * Ensures a directory exists, creating it recursively if needed.\r\n * \r\n * This is a convenience wrapper around `fs.mkdirSync` with `recursive: true`.\r\n * \r\n * @param dir - Directory path to ensure exists\r\n * \r\n * @example\r\n * ensureDir('/path/to/directory');\r\n * // Directory is created if it doesn't exist\r\n */\r\nexport function ensureDir(dir: string): void {\r\n fs.mkdirSync(dir, { recursive: true });\r\n}\r\n\r\n/**\r\n * Loads path aliases from tsconfig.json.\r\n * \r\n * Reads the tsconfig.json file and extracts path mappings from the `paths` option.\r\n * Falls back to a default `@app` alias if tsconfig.json is not found or invalid.\r\n * \r\n * @param projectRoot - Root directory of the project\r\n * @returns Record of alias keys to resolved paths\r\n * \r\n * @example\r\n * // tsconfig.json\r\n * // {\r\n * // \"compilerOptions\": {\r\n * // \"paths\": {\r\n * // \"@components/*\": [\"components/*\"]\r\n * // }\r\n * // }\r\n * // }\r\n * \r\n * loadAliasesFromTsconfig('/project')\r\n * // { '@components': '/project/components', '@app': '/project/app' }\r\n */\r\nexport function loadAliasesFromTsconfig(\r\n projectRoot: string\r\n): Record<string, string> {\r\n const tsconfigPath = path.join(projectRoot, \"tsconfig.json\");\r\n const aliases: Record<string, string> = {};\r\n\r\n if (!fs.existsSync(tsconfigPath)) {\r\n // Fallback: default @app alias\r\n aliases[\"@app\"] = path.resolve(projectRoot, \"app\");\r\n return aliases;\r\n }\r\n\r\n let tsconfig: any;\r\n try {\r\n tsconfig = JSON.parse(fs.readFileSync(tsconfigPath, \"utf-8\"));\r\n } catch (err) {\r\n console.warn(\"⚠️ [framework] Could not read tsconfig.json:\", err instanceof Error ? err.message : String(err));\r\n console.warn(\"💡 Using default path aliases. For custom aliases, ensure tsconfig.json is valid.\");\r\n aliases[\"@app\"] = path.resolve(projectRoot, \"app\");\r\n return aliases;\r\n }\r\n\r\n const compilerOptions = tsconfig.compilerOptions ?? {};\r\n const paths = compilerOptions.paths ?? {};\r\n const baseUrl = compilerOptions.baseUrl ?? \".\";\r\n\r\n for (const [aliasPattern, targets] of Object.entries(paths) as [\r\n string,\r\n string[]\r\n ][]) {\r\n if (!Array.isArray(targets) || targets.length === 0) continue;\r\n\r\n // aliasPattern like \"@components/*\" -> \"@components\"\r\n const aliasKey = aliasPattern.replace(/\\/\\*$/, \"\");\r\n const firstTarget = targets[0]; // \"components/*\"\r\n const targetPath = firstTarget.replace(/\\/\\*$/, \"\");\r\n\r\n const resolved = path.resolve(projectRoot, baseUrl, targetPath);\r\n aliases[aliasKey] = resolved;\r\n }\r\n\r\n // Fallback: ensure @app alias exists\r\n if (!aliases[\"@app\"]) {\r\n aliases[\"@app\"] = path.resolve(projectRoot, \"app\");\r\n }\r\n\r\n return aliases;\r\n}\r\n\r\n/**\r\n * Recursively copies a directory and all its contents.\r\n * \r\n * @param srcDir - Source directory to copy from\r\n * @param destDir - Destination directory to copy to\r\n */\r\nexport function copyDirRecursive(srcDir: string, destDir: string): void {\r\n if (!fs.existsSync(srcDir)) return;\r\n ensureDir(destDir);\r\n\r\n const entries = fs.readdirSync(srcDir, { withFileTypes: true });\r\n for (const entry of entries) {\r\n const srcPath = path.join(srcDir, entry.name);\r\n const destPath = path.join(destDir, entry.name);\r\n\r\n if (entry.isDirectory()) {\r\n copyDirRecursive(srcPath, destPath);\r\n } else if (entry.isFile()) {\r\n fs.copyFileSync(srcPath, destPath);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Copies static assets to the output directory.\r\n * \r\n * Copies:\r\n * 1. `assets/` directory (if exists) → `outDir/assets/`\r\n * 2. Favicon files (`favicon.ico` or `favicon.png`) from `app/` or project root\r\n * \r\n * @param projectRoot - Root directory of the project\r\n * @param outDir - Output directory to copy assets to\r\n * \r\n * @example\r\n * copyStaticAssets('/project', '/project/{BUILD_FOLDER_NAME}/client');\r\n * // Copies assets/ and favicon.* to {BUILD_FOLDER_NAME}/client/\r\n */\r\nexport function copyStaticAssets(projectRoot: string, outDir: string): void {\r\n // 1) Copy assets/ directory (if exists) → {BUILD_FOLDER_NAME}/client/assets/\r\n const assetsSrc = path.join(projectRoot, \"assets\");\r\n const assetsDest = path.join(outDir, \"assets\");\r\n copyDirRecursive(assetsSrc, assetsDest);\r\n\r\n // 2) Find and copy favicon from app/ or project root\r\n const appDir = path.join(projectRoot, \"app\");\r\n const candidates = [\"favicon.ico\", \"favicon.png\"];\r\n\r\n for (const name of candidates) {\r\n const fromApp = path.join(appDir, name);\r\n const fromRoot = path.join(projectRoot, name);\r\n\r\n let src: string | null = null;\r\n if (fs.existsSync(fromApp)) src = fromApp;\r\n else if (fs.existsSync(fromRoot)) src = fromRoot;\r\n\r\n if (src) {\r\n const dest = path.join(outDir, name); // Will be served as ${STATIC_PATH}/favicon.*\r\n ensureDir(path.dirname(dest));\r\n fs.copyFileSync(src, dest);\r\n break; // Use the first one found\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Asset manifest interface for tracking hashed filenames.\r\n */\r\nexport interface AssetManifest {\r\n client: {\r\n js: string; // e.g., \"client.abc123.js\"\r\n css: string; // e.g., \"client.def456.css\"\r\n };\r\n chunks: Record<string, string>; // chunk name -> hashed filename, e.g., \"route-root\" -> \"route-root.xyz789.js\"\r\n entrypoints?: {\r\n client: string[]; // All JS files needed for client entrypoint in order (runtime, vendor, commons, entry)\r\n };\r\n}\r\n\r\n/**\r\n * Generates an asset manifest by scanning the build output directory.\r\n * \r\n * Finds files with content hashes and maps them to their logical names.\r\n * Optionally uses Rspack stats to get entrypoints in correct order.\r\n * \r\n * @param outDir - Output directory to scan\r\n * @param stats - Optional Rspack stats to extract entrypoints\r\n * @returns Asset manifest with hashed filenames\r\n * \r\n * @example\r\n * const manifest = generateAssetManifest('/project/.loly/client', stats);\r\n * // { client: { js: 'client.abc123.js', css: 'client.def456.css' }, chunks: {...}, entrypoints: {...} }\r\n */\r\nexport function generateAssetManifest(outDir: string, stats?: any): AssetManifest {\r\n const manifest: AssetManifest = {\r\n client: {\r\n js: \"client.js\",\r\n css: \"client.css\",\r\n },\r\n chunks: {},\r\n };\r\n\r\n if (!fs.existsSync(outDir)) {\r\n return manifest;\r\n }\r\n\r\n const files = fs.readdirSync(outDir);\r\n \r\n // Try to get entrypoints from stats (more reliable than regex)\r\n if (stats) {\r\n try {\r\n const statsJson = stats.toJson({ \r\n all: false, \r\n entrypoints: true, \r\n assets: true, \r\n chunks: true,\r\n chunkRelations: true, // Include chunk dependencies\r\n });\r\n const clientEntrypoint = statsJson.entrypoints?.client;\r\n \r\n if (clientEntrypoint?.assets) {\r\n // Extract JS files in order (runtime, vendor, commons, entry)\r\n const clientJsFiles = clientEntrypoint.assets\r\n .map((asset: string | { name: string }) => typeof asset === \"string\" ? asset : asset.name)\r\n .filter((name: string) => name.endsWith(\".js\"));\r\n \r\n // Include chunks that are dependencies of the entrypoint\r\n // Rspack may generate shared chunks that are needed by the entrypoint\r\n if (statsJson.chunks && clientEntrypoint.chunks) {\r\n const entrypointChunkIds = new Set(\r\n Array.isArray(clientEntrypoint.chunks) \r\n ? clientEntrypoint.chunks \r\n : [clientEntrypoint.chunks]\r\n );\r\n \r\n // Find all chunks that are part of the entrypoint\r\n const dependencyChunks: string[] = [];\r\n for (const chunk of statsJson.chunks) {\r\n if (chunk.id && entrypointChunkIds.has(chunk.id)) {\r\n // This chunk is part of the entrypoint\r\n if (chunk.files) {\r\n const jsFiles = chunk.files\r\n .filter((f: string) => f.endsWith(\".js\"))\r\n .filter((f: string) => !clientJsFiles.includes(f));\r\n dependencyChunks.push(...jsFiles);\r\n }\r\n }\r\n }\r\n \r\n // Check for chunks that are children/dependencies of entrypoint chunks\r\n const visitedChunkIds = new Set(entrypointChunkIds);\r\n const chunksToCheck = Array.from(entrypointChunkIds);\r\n \r\n while (chunksToCheck.length > 0) {\r\n const chunkId = chunksToCheck.shift();\r\n if (!chunkId) continue;\r\n \r\n const chunk = statsJson.chunks?.find((c: any) => c.id === chunkId);\r\n if (chunk?.children) {\r\n const children = Array.isArray(chunk.children) ? chunk.children : [chunk.children];\r\n for (const childId of children) {\r\n if (!visitedChunkIds.has(childId)) {\r\n visitedChunkIds.add(childId);\r\n chunksToCheck.push(childId);\r\n \r\n // Add this child chunk's files to dependency chunks\r\n const childChunk = statsJson.chunks?.find((c: any) => c.id === childId);\r\n if (childChunk?.files) {\r\n const jsFiles = childChunk.files\r\n .filter((f: string) => f.endsWith(\".js\"))\r\n .filter((f: string) => !clientJsFiles.includes(f) && !dependencyChunks.includes(f));\r\n dependencyChunks.push(...jsFiles);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n \r\n // Add dependency chunks before the main entry\r\n if (dependencyChunks.length > 0) {\r\n clientJsFiles.splice(-1, 0, ...dependencyChunks);\r\n }\r\n }\r\n \r\n if (clientJsFiles.length > 0) {\r\n manifest.entrypoints = {\r\n client: clientJsFiles,\r\n };\r\n \r\n // Last file is the main entry\r\n manifest.client.js = clientJsFiles[clientJsFiles.length - 1];\r\n \r\n // Extract CSS files\r\n const clientCssFiles = clientEntrypoint.assets\r\n .map((asset: string | { name: string }) => typeof asset === \"string\" ? asset : asset.name)\r\n .filter((name: string) => name.endsWith(\".css\"));\r\n \r\n if (clientCssFiles.length > 0) {\r\n manifest.client.css = clientCssFiles[0];\r\n }\r\n }\r\n }\r\n } catch (err) {\r\n console.warn(\"[framework] Failed to extract entrypoints from stats, falling back to file scanning:\", err);\r\n }\r\n }\r\n \r\n // Fallback: Find client.js (with or without hash) if not found in stats\r\n if (!manifest.client.js) {\r\n const clientJsMatch = files.find((f) => /^client\\.[\\w-]+\\.js$/.test(f) || f === \"client.js\");\r\n if (clientJsMatch) {\r\n manifest.client.js = clientJsMatch;\r\n }\r\n }\r\n\r\n // Fallback: Find client.css (with or without hash) if not found in stats\r\n if (!manifest.client.css) {\r\n const clientCssMatch = files.find((f) => /^client\\.[\\w-]+\\.css$/.test(f) || f === \"client.css\");\r\n if (clientCssMatch) {\r\n manifest.client.css = clientCssMatch;\r\n }\r\n }\r\n\r\n // Find all chunk files (route-*.js, 0.js, 1.js, etc. with or without hash)\r\n // Pattern: route-*.js or numeric chunks like 0.js, 1.js, etc.\r\n const sharedChunksToAdd: string[] = []; // Chunks that should be in entrypoints\r\n \r\n for (const file of files) {\r\n if (!file.endsWith(\".js\")) continue;\r\n \r\n // Skip the main client.js file\r\n if (file === manifest.client.js) continue;\r\n \r\n // Skip files already in entrypoints\r\n if (manifest.entrypoints?.client?.includes(file)) continue;\r\n \r\n // Match route chunks: route-*.js or route-*.[hash].js\r\n const routeMatch = file.match(/^(route-[^.]+)(\\.[\\w-]+)?\\.js$/);\r\n if (routeMatch) {\r\n const chunkName = routeMatch[1]; // e.g., \"route-root\"\r\n manifest.chunks[chunkName] = file;\r\n continue; // Route chunks are loaded on-demand, not in entrypoints\r\n }\r\n \r\n // Match vendor chunks: vendor.js or vendor.[hash].js\r\n const vendorMatch = file.match(/^(vendor)(\\.[\\w-]+)?\\.js$/);\r\n if (vendorMatch) {\r\n const chunkName = vendorMatch[1]; // e.g., \"vendor\"\r\n manifest.chunks[chunkName] = file;\r\n sharedChunksToAdd.push(file); // Vendor chunks should be in entrypoints\r\n continue;\r\n }\r\n \r\n // Match vendor-commons chunks: vendor-commons.js or vendor-commons.[hash].js\r\n const vendorCommonsMatch = file.match(/^(vendor-commons)(\\.[\\w-]+)?\\.js$/);\r\n if (vendorCommonsMatch) {\r\n const chunkName = vendorCommonsMatch[1]; // e.g., \"vendor-commons\"\r\n manifest.chunks[chunkName] = file;\r\n sharedChunksToAdd.push(file); // Vendor-commons chunks should be in entrypoints\r\n continue;\r\n }\r\n \r\n // Match numeric chunks: 0.js, 1.js, etc. or 0.[hash].js\r\n const numericMatch = file.match(/^(\\d+)(\\.[\\w-]+)?\\.js$/);\r\n if (numericMatch) {\r\n const chunkName = numericMatch[1];\r\n manifest.chunks[chunkName] = file;\r\n sharedChunksToAdd.push(file);\r\n continue;\r\n }\r\n }\r\n \r\n // Add shared chunks to entrypoints if they're not already there\r\n if (sharedChunksToAdd.length > 0 && manifest.entrypoints?.client) {\r\n const entrypoints = manifest.entrypoints.client;\r\n const mainEntry = entrypoints[entrypoints.length - 1];\r\n const uniqueShared = sharedChunksToAdd.filter(f => !entrypoints.includes(f));\r\n entrypoints.splice(-1, 0, ...uniqueShared);\r\n // Ensure main entry is still last\r\n if (entrypoints[entrypoints.length - 1] !== mainEntry) {\r\n const mainIndex = entrypoints.indexOf(mainEntry);\r\n if (mainIndex >= 0) {\r\n entrypoints.splice(mainIndex, 1);\r\n }\r\n entrypoints.push(mainEntry);\r\n }\r\n }\r\n\r\n return manifest;\r\n}\r\n\r\n/**\r\n * Loads the asset manifest from the build directory.\r\n * \r\n * @param projectRoot - Root directory of the project\r\n * @returns Asset manifest or null if not found\r\n */\r\nexport function loadAssetManifest(projectRoot: string): AssetManifest | null {\r\n const { BUILD_FOLDER_NAME } = require(\"@constants/globals\");\r\n const manifestPath = path.join(projectRoot, BUILD_FOLDER_NAME, \"asset-manifest.json\");\r\n \r\n if (!fs.existsSync(manifestPath)) {\r\n return null;\r\n }\r\n\r\n try {\r\n const manifest: AssetManifest = JSON.parse(fs.readFileSync(manifestPath, \"utf-8\"));\r\n return manifest;\r\n } catch (err) {\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Gets the client JS path with hash from the asset manifest.\r\n * Falls back to default path if manifest is not available.\r\n * \r\n * @param projectRoot - Root directory of the project\r\n * @returns Path to client JS file (e.g., \"/static/client.abc123.js\")\r\n */\r\nexport function getClientJsPath(projectRoot: string): string {\r\n const { STATIC_PATH } = require(\"@constants/globals\");\r\n const manifest = loadAssetManifest(projectRoot);\r\n const filename = manifest?.client.js || \"client.js\";\r\n return `${STATIC_PATH}/${filename}`;\r\n}\r\n\r\n/**\r\n * Gets the client CSS path with hash from the asset manifest.\r\n * Falls back to default path if manifest is not available.\r\n * \r\n * @param projectRoot - Root directory of the project\r\n * @returns Path to client CSS file (e.g., \"/static/client.def456.css\")\r\n */\r\nexport function getClientCssPath(projectRoot: string): string {\r\n const { STATIC_PATH } = require(\"@constants/globals\");\r\n const manifest = loadAssetManifest(projectRoot);\r\n const filename = manifest?.client.css || \"client.css\";\r\n return `${STATIC_PATH}/${filename}`;\r\n}","/*! chokidar - MIT License (c) 2012 Paul Miller (paulmillr.com) */\nimport { stat as statcb } from 'fs';\nimport { stat, readdir } from 'fs/promises';\nimport { EventEmitter } from 'events';\nimport * as sysPath from 'path';\nimport { readdirp } from 'readdirp';\nimport { NodeFsHandler, EVENTS as EV, isWindows, isIBMi, EMPTY_FN, STR_CLOSE, STR_END, } from './handler.js';\nconst SLASH = '/';\nconst SLASH_SLASH = '//';\nconst ONE_DOT = '.';\nconst TWO_DOTS = '..';\nconst STRING_TYPE = 'string';\nconst BACK_SLASH_RE = /\\\\/g;\nconst DOUBLE_SLASH_RE = /\\/\\//;\nconst DOT_RE = /\\..*\\.(sw[px])$|~$|\\.subl.*\\.tmp/;\nconst REPLACER_RE = /^\\.[/\\\\]/;\nfunction arrify(item) {\n return Array.isArray(item) ? item : [item];\n}\nconst isMatcherObject = (matcher) => typeof matcher === 'object' && matcher !== null && !(matcher instanceof RegExp);\nfunction createPattern(matcher) {\n if (typeof matcher === 'function')\n return matcher;\n if (typeof matcher === 'string')\n return (string) => matcher === string;\n if (matcher instanceof RegExp)\n return (string) => matcher.test(string);\n if (typeof matcher === 'object' && matcher !== null) {\n return (string) => {\n if (matcher.path === string)\n return true;\n if (matcher.recursive) {\n const relative = sysPath.relative(matcher.path, string);\n if (!relative) {\n return false;\n }\n return !relative.startsWith('..') && !sysPath.isAbsolute(relative);\n }\n return false;\n };\n }\n return () => false;\n}\nfunction normalizePath(path) {\n if (typeof path !== 'string')\n throw new Error('string expected');\n path = sysPath.normalize(path);\n path = path.replace(/\\\\/g, '/');\n let prepend = false;\n if (path.startsWith('//'))\n prepend = true;\n const DOUBLE_SLASH_RE = /\\/\\//;\n while (path.match(DOUBLE_SLASH_RE))\n path = path.replace(DOUBLE_SLASH_RE, '/');\n if (prepend)\n path = '/' + path;\n return path;\n}\nfunction matchPatterns(patterns, testString, stats) {\n const path = normalizePath(testString);\n for (let index = 0; index < patterns.length; index++) {\n const pattern = patterns[index];\n if (pattern(path, stats)) {\n return true;\n }\n }\n return false;\n}\nfunction anymatch(matchers, testString) {\n if (matchers == null) {\n throw new TypeError('anymatch: specify first argument');\n }\n // Early cache for matchers.\n const matchersArray = arrify(matchers);\n const patterns = matchersArray.map((matcher) => createPattern(matcher));\n if (testString == null) {\n return (testString, stats) => {\n return matchPatterns(patterns, testString, stats);\n };\n }\n return matchPatterns(patterns, testString);\n}\nconst unifyPaths = (paths_) => {\n const paths = arrify(paths_).flat();\n if (!paths.every((p) => typeof p === STRING_TYPE)) {\n throw new TypeError(`Non-string provided as watch path: ${paths}`);\n }\n return paths.map(normalizePathToUnix);\n};\n// If SLASH_SLASH occurs at the beginning of path, it is not replaced\n// because \"//StoragePC/DrivePool/Movies\" is a valid network path\nconst toUnix = (string) => {\n let str = string.replace(BACK_SLASH_RE, SLASH);\n let prepend = false;\n if (str.startsWith(SLASH_SLASH)) {\n prepend = true;\n }\n while (str.match(DOUBLE_SLASH_RE)) {\n str = str.replace(DOUBLE_SLASH_RE, SLASH);\n }\n if (prepend) {\n str = SLASH + str;\n }\n return str;\n};\n// Our version of upath.normalize\n// TODO: this is not equal to path-normalize module - investigate why\nconst normalizePathToUnix = (path) => toUnix(sysPath.normalize(toUnix(path)));\n// TODO: refactor\nconst normalizeIgnored = (cwd = '') => (path) => {\n if (typeof path === 'string') {\n return normalizePathToUnix(sysPath.isAbsolute(path) ? path : sysPath.join(cwd, path));\n }\n else {\n return path;\n }\n};\nconst getAbsolutePath = (path, cwd) => {\n if (sysPath.isAbsolute(path)) {\n return path;\n }\n return sysPath.join(cwd, path);\n};\nconst EMPTY_SET = Object.freeze(new Set());\n/**\n * Directory entry.\n */\nclass DirEntry {\n constructor(dir, removeWatcher) {\n this.path = dir;\n this._removeWatcher = removeWatcher;\n this.items = new Set();\n }\n add(item) {\n const { items } = this;\n if (!items)\n return;\n if (item !== ONE_DOT && item !== TWO_DOTS)\n items.add(item);\n }\n async remove(item) {\n const { items } = this;\n if (!items)\n return;\n items.delete(item);\n if (items.size > 0)\n return;\n const dir = this.path;\n try {\n await readdir(dir);\n }\n catch (err) {\n if (this._removeWatcher) {\n this._removeWatcher(sysPath.dirname(dir), sysPath.basename(dir));\n }\n }\n }\n has(item) {\n const { items } = this;\n if (!items)\n return;\n return items.has(item);\n }\n getChildren() {\n const { items } = this;\n if (!items)\n return [];\n return [...items.values()];\n }\n dispose() {\n this.items.clear();\n this.path = '';\n this._removeWatcher = EMPTY_FN;\n this.items = EMPTY_SET;\n Object.freeze(this);\n }\n}\nconst STAT_METHOD_F = 'stat';\nconst STAT_METHOD_L = 'lstat';\nexport class WatchHelper {\n constructor(path, follow, fsw) {\n this.fsw = fsw;\n const watchPath = path;\n this.path = path = path.replace(REPLACER_RE, '');\n this.watchPath = watchPath;\n this.fullWatchPath = sysPath.resolve(watchPath);\n this.dirParts = [];\n this.dirParts.forEach((parts) => {\n if (parts.length > 1)\n parts.pop();\n });\n this.followSymlinks = follow;\n this.statMethod = follow ? STAT_METHOD_F : STAT_METHOD_L;\n }\n entryPath(entry) {\n return sysPath.join(this.watchPath, sysPath.relative(this.watchPath, entry.fullPath));\n }\n filterPath(entry) {\n const { stats } = entry;\n if (stats && stats.isSymbolicLink())\n return this.filterDir(entry);\n const resolvedPath = this.entryPath(entry);\n // TODO: what if stats is undefined? remove !\n return this.fsw._isntIgnored(resolvedPath, stats) && this.fsw._hasReadPermissions(stats);\n }\n filterDir(entry) {\n return this.fsw._isntIgnored(this.entryPath(entry), entry.stats);\n }\n}\n/**\n * Watches files & directories for changes. Emitted events:\n * `add`, `addDir`, `change`, `unlink`, `unlinkDir`, `all`, `error`\n *\n * new FSWatcher()\n * .add(directories)\n * .on('add', path => log('File', path, 'was added'))\n */\nexport class FSWatcher extends EventEmitter {\n // Not indenting methods for history sake; for now.\n constructor(_opts = {}) {\n super();\n this.closed = false;\n this._closers = new Map();\n this._ignoredPaths = new Set();\n this._throttled = new Map();\n this._streams = new Set();\n this._symlinkPaths = new Map();\n this._watched = new Map();\n this._pendingWrites = new Map();\n this._pendingUnlinks = new Map();\n this._readyCount = 0;\n this._readyEmitted = false;\n const awf = _opts.awaitWriteFinish;\n const DEF_AWF = { stabilityThreshold: 2000, pollInterval: 100 };\n const opts = {\n // Defaults\n persistent: true,\n ignoreInitial: false,\n ignorePermissionErrors: false,\n interval: 100,\n binaryInterval: 300,\n followSymlinks: true,\n usePolling: false,\n // useAsync: false,\n atomic: true, // NOTE: overwritten later (depends on usePolling)\n ..._opts,\n // Change format\n ignored: _opts.ignored ? arrify(_opts.ignored) : arrify([]),\n awaitWriteFinish: awf === true ? DEF_AWF : typeof awf === 'object' ? { ...DEF_AWF, ...awf } : false,\n };\n // Always default to polling on IBM i because fs.watch() is not available on IBM i.\n if (isIBMi)\n opts.usePolling = true;\n // Editor atomic write normalization enabled by default with fs.watch\n if (opts.atomic === undefined)\n opts.atomic = !opts.usePolling;\n // opts.atomic = typeof _opts.atomic === 'number' ? _opts.atomic : 100;\n // Global override. Useful for developers, who need to force polling for all\n // instances of chokidar, regardless of usage / dependency depth\n const envPoll = process.env.CHOKIDAR_USEPOLLING;\n if (envPoll !== undefined) {\n const envLower = envPoll.toLowerCase();\n if (envLower === 'false' || envLower === '0')\n opts.usePolling = false;\n else if (envLower === 'true' || envLower === '1')\n opts.usePolling = true;\n else\n opts.usePolling = !!envLower;\n }\n const envInterval = process.env.CHOKIDAR_INTERVAL;\n if (envInterval)\n opts.interval = Number.parseInt(envInterval, 10);\n // This is done to emit ready only once, but each 'add' will increase that?\n let readyCalls = 0;\n this._emitReady = () => {\n readyCalls++;\n if (readyCalls >= this._readyCount) {\n this._emitReady = EMPTY_FN;\n this._readyEmitted = true;\n // use process.nextTick to allow time for listener to be bound\n process.nextTick(() => this.emit(EV.READY));\n }\n };\n this._emitRaw = (...args) => this.emit(EV.RAW, ...args);\n this._boundRemove = this._remove.bind(this);\n this.options = opts;\n this._nodeFsHandler = new NodeFsHandler(this);\n // You’re frozen when your heart’s not open.\n Object.freeze(opts);\n }\n _addIgnoredPath(matcher) {\n if (isMatcherObject(matcher)) {\n // return early if we already have a deeply equal matcher object\n for (const ignored of this._ignoredPaths) {\n if (isMatcherObject(ignored) &&\n ignored.path === matcher.path &&\n ignored.recursive === matcher.recursive) {\n return;\n }\n }\n }\n this._ignoredPaths.add(matcher);\n }\n _removeIgnoredPath(matcher) {\n this._ignoredPaths.delete(matcher);\n // now find any matcher objects with the matcher as path\n if (typeof matcher === 'string') {\n for (const ignored of this._ignoredPaths) {\n // TODO (43081j): make this more efficient.\n // probably just make a `this._ignoredDirectories` or some\n // such thing.\n if (isMatcherObject(ignored) && ignored.path === matcher) {\n this._ignoredPaths.delete(ignored);\n }\n }\n }\n }\n // Public methods\n /**\n * Adds paths to be watched on an existing FSWatcher instance.\n * @param paths_ file or file list. Other arguments are unused\n */\n add(paths_, _origAdd, _internal) {\n const { cwd } = this.options;\n this.closed = false;\n this._closePromise = undefined;\n let paths = unifyPaths(paths_);\n if (cwd) {\n paths = paths.map((path) => {\n const absPath = getAbsolutePath(path, cwd);\n // Check `path` instead of `absPath` because the cwd portion can't be a glob\n return absPath;\n });\n }\n paths.forEach((path) => {\n this._removeIgnoredPath(path);\n });\n this._userIgnored = undefined;\n if (!this._readyCount)\n this._readyCount = 0;\n this._readyCount += paths.length;\n Promise.all(paths.map(async (path) => {\n const res = await this._nodeFsHandler._addToNodeFs(path, !_internal, undefined, 0, _origAdd);\n if (res)\n this._emitReady();\n return res;\n })).then((results) => {\n if (this.closed)\n return;\n results.forEach((item) => {\n if (item)\n this.add(sysPath.dirname(item), sysPath.basename(_origAdd || item));\n });\n });\n return this;\n }\n /**\n * Close watchers or start ignoring events from specified paths.\n */\n unwatch(paths_) {\n if (this.closed)\n return this;\n const paths = unifyPaths(paths_);\n const { cwd } = this.options;\n paths.forEach((path) => {\n // convert to absolute path unless relative path already matches\n if (!sysPath.isAbsolute(path) && !this._closers.has(path)) {\n if (cwd)\n path = sysPath.join(cwd, path);\n path = sysPath.resolve(path);\n }\n this._closePath(path);\n this._addIgnoredPath(path);\n if (this._watched.has(path)) {\n this._addIgnoredPath({\n path,\n recursive: true,\n });\n }\n // reset the cached userIgnored anymatch fn\n // to make ignoredPaths changes effective\n this._userIgnored = undefined;\n });\n return this;\n }\n /**\n * Close watchers and remove all listeners from watched paths.\n */\n close() {\n if (this._closePromise) {\n return this._closePromise;\n }\n this.closed = true;\n // Memory management.\n this.removeAllListeners();\n const closers = [];\n this._closers.forEach((closerList) => closerList.forEach((closer) => {\n const promise = closer();\n if (promise instanceof Promise)\n closers.push(promise);\n }));\n this._streams.forEach((stream) => stream.destroy());\n this._userIgnored = undefined;\n this._readyCount = 0;\n this._readyEmitted = false;\n this._watched.forEach((dirent) => dirent.dispose());\n this._closers.clear();\n this._watched.clear();\n this._streams.clear();\n this._symlinkPaths.clear();\n this._throttled.clear();\n this._closePromise = closers.length\n ? Promise.all(closers).then(() => undefined)\n : Promise.resolve();\n return this._closePromise;\n }\n /**\n * Expose list of watched paths\n * @returns for chaining\n */\n getWatched() {\n const watchList = {};\n this._watched.forEach((entry, dir) => {\n const key = this.options.cwd ? sysPath.relative(this.options.cwd, dir) : dir;\n const index = key || ONE_DOT;\n watchList[index] = entry.getChildren().sort();\n });\n return watchList;\n }\n emitWithAll(event, args) {\n this.emit(event, ...args);\n if (event !== EV.ERROR)\n this.emit(EV.ALL, event, ...args);\n }\n // Common helpers\n // --------------\n /**\n * Normalize and emit events.\n * Calling _emit DOES NOT MEAN emit() would be called!\n * @param event Type of event\n * @param path File or directory path\n * @param stats arguments to be passed with event\n * @returns the error if defined, otherwise the value of the FSWatcher instance's `closed` flag\n */\n async _emit(event, path, stats) {\n if (this.closed)\n return;\n const opts = this.options;\n if (isWindows)\n path = sysPath.normalize(path);\n if (opts.cwd)\n path = sysPath.relative(opts.cwd, path);\n const args = [path];\n if (stats != null)\n args.push(stats);\n const awf = opts.awaitWriteFinish;\n let pw;\n if (awf && (pw = this._pendingWrites.get(path))) {\n pw.lastChange = new Date();\n return this;\n }\n if (opts.atomic) {\n if (event === EV.UNLINK) {\n this._pendingUnlinks.set(path, [event, ...args]);\n setTimeout(() => {\n this._pendingUnlinks.forEach((entry, path) => {\n this.emit(...entry);\n this.emit(EV.ALL, ...entry);\n this._pendingUnlinks.delete(path);\n });\n }, typeof opts.atomic === 'number' ? opts.atomic : 100);\n return this;\n }\n if (event === EV.ADD && this._pendingUnlinks.has(path)) {\n event = EV.CHANGE;\n this._pendingUnlinks.delete(path);\n }\n }\n if (awf && (event === EV.ADD || event === EV.CHANGE) && this._readyEmitted) {\n const awfEmit = (err, stats) => {\n if (err) {\n event = EV.ERROR;\n args[0] = err;\n this.emitWithAll(event, args);\n }\n else if (stats) {\n // if stats doesn't exist the file must have been deleted\n if (args.length > 1) {\n args[1] = stats;\n }\n else {\n args.push(stats);\n }\n this.emitWithAll(event, args);\n }\n };\n this._awaitWriteFinish(path, awf.stabilityThreshold, event, awfEmit);\n return this;\n }\n if (event === EV.CHANGE) {\n const isThrottled = !this._throttle(EV.CHANGE, path, 50);\n if (isThrottled)\n return this;\n }\n if (opts.alwaysStat &&\n stats === undefined &&\n (event === EV.ADD || event === EV.ADD_DIR || event === EV.CHANGE)) {\n const fullPath = opts.cwd ? sysPath.join(opts.cwd, path) : path;\n let stats;\n try {\n stats = await stat(fullPath);\n }\n catch (err) {\n // do nothing\n }\n // Suppress event when fs_stat fails, to avoid sending undefined 'stat'\n if (!stats || this.closed)\n return;\n args.push(stats);\n }\n this.emitWithAll(event, args);\n return this;\n }\n /**\n * Common handler for errors\n * @returns The error if defined, otherwise the value of the FSWatcher instance's `closed` flag\n */\n _handleError(error) {\n const code = error && error.code;\n if (error &&\n code !== 'ENOENT' &&\n code !== 'ENOTDIR' &&\n (!this.options.ignorePermissionErrors || (code !== 'EPERM' && code !== 'EACCES'))) {\n this.emit(EV.ERROR, error);\n }\n return error || this.closed;\n }\n /**\n * Helper utility for throttling\n * @param actionType type being throttled\n * @param path being acted upon\n * @param timeout duration of time to suppress duplicate actions\n * @returns tracking object or false if action should be suppressed\n */\n _throttle(actionType, path, timeout) {\n if (!this._throttled.has(actionType)) {\n this._throttled.set(actionType, new Map());\n }\n const action = this._throttled.get(actionType);\n if (!action)\n throw new Error('invalid throttle');\n const actionPath = action.get(path);\n if (actionPath) {\n actionPath.count++;\n return false;\n }\n // eslint-disable-next-line prefer-const\n let timeoutObject;\n const clear = () => {\n const item = action.get(path);\n const count = item ? item.count : 0;\n action.delete(path);\n clearTimeout(timeoutObject);\n if (item)\n clearTimeout(item.timeoutObject);\n return count;\n };\n timeoutObject = setTimeout(clear, timeout);\n const thr = { timeoutObject, clear, count: 0 };\n action.set(path, thr);\n return thr;\n }\n _incrReadyCount() {\n return this._readyCount++;\n }\n /**\n * Awaits write operation to finish.\n * Polls a newly created file for size variations. When files size does not change for 'threshold' milliseconds calls callback.\n * @param path being acted upon\n * @param threshold Time in milliseconds a file size must be fixed before acknowledging write OP is finished\n * @param event\n * @param awfEmit Callback to be called when ready for event to be emitted.\n */\n _awaitWriteFinish(path, threshold, event, awfEmit) {\n const awf = this.options.awaitWriteFinish;\n if (typeof awf !== 'object')\n return;\n const pollInterval = awf.pollInterval;\n let timeoutHandler;\n let fullPath = path;\n if (this.options.cwd && !sysPath.isAbsolute(path)) {\n fullPath = sysPath.join(this.options.cwd, path);\n }\n const now = new Date();\n const writes = this._pendingWrites;\n function awaitWriteFinishFn(prevStat) {\n statcb(fullPath, (err, curStat) => {\n if (err || !writes.has(path)) {\n if (err && err.code !== 'ENOENT')\n awfEmit(err);\n return;\n }\n const now = Number(new Date());\n if (prevStat && curStat.size !== prevStat.size) {\n writes.get(path).lastChange = now;\n }\n const pw = writes.get(path);\n const df = now - pw.lastChange;\n if (df >= threshold) {\n writes.delete(path);\n awfEmit(undefined, curStat);\n }\n else {\n timeoutHandler = setTimeout(awaitWriteFinishFn, pollInterval, curStat);\n }\n });\n }\n if (!writes.has(path)) {\n writes.set(path, {\n lastChange: now,\n cancelWait: () => {\n writes.delete(path);\n clearTimeout(timeoutHandler);\n return event;\n },\n });\n timeoutHandler = setTimeout(awaitWriteFinishFn, pollInterval);\n }\n }\n /**\n * Determines whether user has asked to ignore this path.\n */\n _isIgnored(path, stats) {\n if (this.options.atomic && DOT_RE.test(path))\n return true;\n if (!this._userIgnored) {\n const { cwd } = this.options;\n const ign = this.options.ignored;\n const ignored = (ign || []).map(normalizeIgnored(cwd));\n const ignoredPaths = [...this._ignoredPaths];\n const list = [...ignoredPaths.map(normalizeIgnored(cwd)), ...ignored];\n this._userIgnored = anymatch(list, undefined);\n }\n return this._userIgnored(path, stats);\n }\n _isntIgnored(path, stat) {\n return !this._isIgnored(path, stat);\n }\n /**\n * Provides a set of common helpers and properties relating to symlink handling.\n * @param path file or directory pattern being watched\n */\n _getWatchHelpers(path) {\n return new WatchHelper(path, this.options.followSymlinks, this);\n }\n // Directory helpers\n // -----------------\n /**\n * Provides directory tracking objects\n * @param directory path of the directory\n */\n _getWatchedDir(directory) {\n const dir = sysPath.resolve(directory);\n if (!this._watched.has(dir))\n this._watched.set(dir, new DirEntry(dir, this._boundRemove));\n return this._watched.get(dir);\n }\n // File helpers\n // ------------\n /**\n * Check for read permissions: https://stackoverflow.com/a/11781404/1358405\n */\n _hasReadPermissions(stats) {\n if (this.options.ignorePermissionErrors)\n return true;\n return Boolean(Number(stats.mode) & 0o400);\n }\n /**\n * Handles emitting unlink events for\n * files and directories, and via recursion, for\n * files and directories within directories that are unlinked\n * @param directory within which the following item is located\n * @param item base path of item/directory\n */\n _remove(directory, item, isDirectory) {\n // if what is being deleted is a directory, get that directory's paths\n // for recursive deleting and cleaning of watched object\n // if it is not a directory, nestedDirectoryChildren will be empty array\n const path = sysPath.join(directory, item);\n const fullPath = sysPath.resolve(path);\n isDirectory =\n isDirectory != null ? isDirectory : this._watched.has(path) || this._watched.has(fullPath);\n // prevent duplicate handling in case of arriving here nearly simultaneously\n // via multiple paths (such as _handleFile and _handleDir)\n if (!this._throttle('remove', path, 100))\n return;\n // if the only watched file is removed, watch for its return\n if (!isDirectory && this._watched.size === 1) {\n this.add(directory, item, true);\n }\n // This will create a new entry in the watched object in either case\n // so we got to do the directory check beforehand\n const wp = this._getWatchedDir(path);\n const nestedDirectoryChildren = wp.getChildren();\n // Recursively remove children directories / files.\n nestedDirectoryChildren.forEach((nested) => this._remove(path, nested));\n // Check if item was on the watched list and remove it\n const parent = this._getWatchedDir(directory);\n const wasTracked = parent.has(item);\n parent.remove(item);\n // Fixes issue #1042 -> Relative paths were detected and added as symlinks\n // (https://github.com/paulmillr/chokidar/blob/e1753ddbc9571bdc33b4a4af172d52cb6e611c10/lib/nodefs-handler.js#L612),\n // but never removed from the map in case the path was deleted.\n // This leads to an incorrect state if the path was recreated:\n // https://github.com/paulmillr/chokidar/blob/e1753ddbc9571bdc33b4a4af172d52cb6e611c10/lib/nodefs-handler.js#L553\n if (this._symlinkPaths.has(fullPath)) {\n this._symlinkPaths.delete(fullPath);\n }\n // If we wait for this file to be fully written, cancel the wait.\n let relPath = path;\n if (this.options.cwd)\n relPath = sysPath.relative(this.options.cwd, path);\n if (this.options.awaitWriteFinish && this._pendingWrites.has(relPath)) {\n const event = this._pendingWrites.get(relPath).cancelWait();\n if (event === EV.ADD)\n return;\n }\n // The Entry will either be a directory that just got removed\n // or a bogus entry to a file, in either case we have to remove it\n this._watched.delete(path);\n this._watched.delete(fullPath);\n const eventName = isDirectory ? EV.UNLINK_DIR : EV.UNLINK;\n if (wasTracked && !this._isIgnored(path))\n this._emit(eventName, path);\n // Avoid conflicts if we later create another file with the same name\n this._closePath(path);\n }\n /**\n * Closes all watchers for a path\n */\n _closePath(path) {\n this._closeFile(path);\n const dir = sysPath.dirname(path);\n this._getWatchedDir(dir).remove(sysPath.basename(path));\n }\n /**\n * Closes only file-specific watchers\n */\n _closeFile(path) {\n const closers = this._closers.get(path);\n if (!closers)\n return;\n closers.forEach((closer) => closer());\n this._closers.delete(path);\n }\n _addPathCloser(path, closer) {\n if (!closer)\n return;\n let list = this._closers.get(path);\n if (!list) {\n list = [];\n this._closers.set(path, list);\n }\n list.push(closer);\n }\n _readdirp(root, opts) {\n if (this.closed)\n return;\n const options = { type: EV.ALL, alwaysStat: true, lstat: true, ...opts, depth: 0 };\n let stream = readdirp(root, options);\n this._streams.add(stream);\n stream.once(STR_CLOSE, () => {\n stream = undefined;\n });\n stream.once(STR_END, () => {\n if (stream) {\n this._streams.delete(stream);\n stream = undefined;\n }\n });\n return stream;\n }\n}\n/**\n * Instantiates watcher with paths to be tracked.\n * @param paths file / directory paths\n * @param options opts, such as `atomic`, `awaitWriteFinish`, `ignored`, and others\n * @returns an instance of FSWatcher for chaining.\n * @example\n * const watcher = watch('.').on('all', (event, path) => { console.log(event, path); });\n * watch('.', { atomic: true, awaitWriteFinish: true, ignored: (f, stats) => stats?.isFile() && !f.endsWith('.js') })\n */\nexport function watch(paths, options = {}) {\n const watcher = new FSWatcher(options);\n watcher.add(paths);\n return watcher;\n}\nexport default { watch, FSWatcher };\n","import { stat, lstat, readdir, realpath } from 'node:fs/promises';\nimport { Readable } from 'node:stream';\nimport { resolve as presolve, relative as prelative, join as pjoin, sep as psep } from 'node:path';\nexport const EntryTypes = {\n FILE_TYPE: 'files',\n DIR_TYPE: 'directories',\n FILE_DIR_TYPE: 'files_directories',\n EVERYTHING_TYPE: 'all',\n};\nconst defaultOptions = {\n root: '.',\n fileFilter: (_entryInfo) => true,\n directoryFilter: (_entryInfo) => true,\n type: EntryTypes.FILE_TYPE,\n lstat: false,\n depth: 2147483648,\n alwaysStat: false,\n highWaterMark: 4096,\n};\nObject.freeze(defaultOptions);\nconst RECURSIVE_ERROR_CODE = 'READDIRP_RECURSIVE_ERROR';\nconst NORMAL_FLOW_ERRORS = new Set(['ENOENT', 'EPERM', 'EACCES', 'ELOOP', RECURSIVE_ERROR_CODE]);\nconst ALL_TYPES = [\n EntryTypes.DIR_TYPE,\n EntryTypes.EVERYTHING_TYPE,\n EntryTypes.FILE_DIR_TYPE,\n EntryTypes.FILE_TYPE,\n];\nconst DIR_TYPES = new Set([\n EntryTypes.DIR_TYPE,\n EntryTypes.EVERYTHING_TYPE,\n EntryTypes.FILE_DIR_TYPE,\n]);\nconst FILE_TYPES = new Set([\n EntryTypes.EVERYTHING_TYPE,\n EntryTypes.FILE_DIR_TYPE,\n EntryTypes.FILE_TYPE,\n]);\nconst isNormalFlowError = (error) => NORMAL_FLOW_ERRORS.has(error.code);\nconst wantBigintFsStats = process.platform === 'win32';\nconst emptyFn = (_entryInfo) => true;\nconst normalizeFilter = (filter) => {\n if (filter === undefined)\n return emptyFn;\n if (typeof filter === 'function')\n return filter;\n if (typeof filter === 'string') {\n const fl = filter.trim();\n return (entry) => entry.basename === fl;\n }\n if (Array.isArray(filter)) {\n const trItems = filter.map((item) => item.trim());\n return (entry) => trItems.some((f) => entry.basename === f);\n }\n return emptyFn;\n};\n/** Readable readdir stream, emitting new files as they're being listed. */\nexport class ReaddirpStream extends Readable {\n constructor(options = {}) {\n super({\n objectMode: true,\n autoDestroy: true,\n highWaterMark: options.highWaterMark,\n });\n const opts = { ...defaultOptions, ...options };\n const { root, type } = opts;\n this._fileFilter = normalizeFilter(opts.fileFilter);\n this._directoryFilter = normalizeFilter(opts.directoryFilter);\n const statMethod = opts.lstat ? lstat : stat;\n // Use bigint stats if it's windows and stat() supports options (node 10+).\n if (wantBigintFsStats) {\n this._stat = (path) => statMethod(path, { bigint: true });\n }\n else {\n this._stat = statMethod;\n }\n this._maxDepth = opts.depth ?? defaultOptions.depth;\n this._wantsDir = type ? DIR_TYPES.has(type) : false;\n this._wantsFile = type ? FILE_TYPES.has(type) : false;\n this._wantsEverything = type === EntryTypes.EVERYTHING_TYPE;\n this._root = presolve(root);\n this._isDirent = !opts.alwaysStat;\n this._statsProp = this._isDirent ? 'dirent' : 'stats';\n this._rdOptions = { encoding: 'utf8', withFileTypes: this._isDirent };\n // Launch stream with one parent, the root dir.\n this.parents = [this._exploreDir(root, 1)];\n this.reading = false;\n this.parent = undefined;\n }\n async _read(batch) {\n if (this.reading)\n return;\n this.reading = true;\n try {\n while (!this.destroyed && batch > 0) {\n const par = this.parent;\n const fil = par && par.files;\n if (fil && fil.length > 0) {\n const { path, depth } = par;\n const slice = fil.splice(0, batch).map((dirent) => this._formatEntry(dirent, path));\n const awaited = await Promise.all(slice);\n for (const entry of awaited) {\n if (!entry)\n continue;\n if (this.destroyed)\n return;\n const entryType = await this._getEntryType(entry);\n if (entryType === 'directory' && this._directoryFilter(entry)) {\n if (depth <= this._maxDepth) {\n this.parents.push(this._exploreDir(entry.fullPath, depth + 1));\n }\n if (this._wantsDir) {\n this.push(entry);\n batch--;\n }\n }\n else if ((entryType === 'file' || this._includeAsFile(entry)) &&\n this._fileFilter(entry)) {\n if (this._wantsFile) {\n this.push(entry);\n batch--;\n }\n }\n }\n }\n else {\n const parent = this.parents.pop();\n if (!parent) {\n this.push(null);\n break;\n }\n this.parent = await parent;\n if (this.destroyed)\n return;\n }\n }\n }\n catch (error) {\n this.destroy(error);\n }\n finally {\n this.reading = false;\n }\n }\n async _exploreDir(path, depth) {\n let files;\n try {\n files = await readdir(path, this._rdOptions);\n }\n catch (error) {\n this._onError(error);\n }\n return { files, depth, path };\n }\n async _formatEntry(dirent, path) {\n let entry;\n const basename = this._isDirent ? dirent.name : dirent;\n try {\n const fullPath = presolve(pjoin(path, basename));\n entry = { path: prelative(this._root, fullPath), fullPath, basename };\n entry[this._statsProp] = this._isDirent ? dirent : await this._stat(fullPath);\n }\n catch (err) {\n this._onError(err);\n return;\n }\n return entry;\n }\n _onError(err) {\n if (isNormalFlowError(err) && !this.destroyed) {\n this.emit('warn', err);\n }\n else {\n this.destroy(err);\n }\n }\n async _getEntryType(entry) {\n // entry may be undefined, because a warning or an error were emitted\n // and the statsProp is undefined\n if (!entry && this._statsProp in entry) {\n return '';\n }\n const stats = entry[this._statsProp];\n if (stats.isFile())\n return 'file';\n if (stats.isDirectory())\n return 'directory';\n if (stats && stats.isSymbolicLink()) {\n const full = entry.fullPath;\n try {\n const entryRealPath = await realpath(full);\n const entryRealPathStats = await lstat(entryRealPath);\n if (entryRealPathStats.isFile()) {\n return 'file';\n }\n if (entryRealPathStats.isDirectory()) {\n const len = entryRealPath.length;\n if (full.startsWith(entryRealPath) && full.substr(len, 1) === psep) {\n const recursiveError = new Error(`Circular symlink detected: \"${full}\" points to \"${entryRealPath}\"`);\n // @ts-ignore\n recursiveError.code = RECURSIVE_ERROR_CODE;\n return this._onError(recursiveError);\n }\n return 'directory';\n }\n }\n catch (error) {\n this._onError(error);\n return '';\n }\n }\n }\n _includeAsFile(entry) {\n const stats = entry && entry[this._statsProp];\n return stats && this._wantsEverything && !stats.isDirectory();\n }\n}\n/**\n * Streaming version: Reads all files and directories in given root recursively.\n * Consumes ~constant small amount of RAM.\n * @param root Root directory\n * @param options Options to specify root (start directory), filters and recursion depth\n */\nexport function readdirp(root, options = {}) {\n // @ts-ignore\n let type = options.entryType || options.type;\n if (type === 'both')\n type = EntryTypes.FILE_DIR_TYPE; // backwards-compatibility\n if (type)\n options.type = type;\n if (!root) {\n throw new Error('readdirp: root argument is required. Usage: readdirp(root, options)');\n }\n else if (typeof root !== 'string') {\n throw new TypeError('readdirp: root argument must be a string. Usage: readdirp(root, options)');\n }\n else if (type && !ALL_TYPES.includes(type)) {\n throw new Error(`readdirp: Invalid type passed. Use one of ${ALL_TYPES.join(', ')}`);\n }\n options.root = root;\n return new ReaddirpStream(options);\n}\n/**\n * Promise version: Reads all files and directories in given root recursively.\n * Compared to streaming version, will consume a lot of RAM e.g. when 1 million files are listed.\n * @returns array of paths and their entry infos\n */\nexport function readdirpPromise(root, options = {}) {\n return new Promise((resolve, reject) => {\n const files = [];\n readdirp(root, options)\n .on('data', (entry) => files.push(entry))\n .on('end', () => resolve(files))\n .on('error', (error) => reject(error));\n });\n}\nexport default readdirp;\n","import { watchFile, unwatchFile, watch as fs_watch } from 'fs';\nimport { open, stat, lstat, realpath as fsrealpath } from 'fs/promises';\nimport * as sysPath from 'path';\nimport { type as osType } from 'os';\nexport const STR_DATA = 'data';\nexport const STR_END = 'end';\nexport const STR_CLOSE = 'close';\nexport const EMPTY_FN = () => { };\nexport const IDENTITY_FN = (val) => val;\nconst pl = process.platform;\nexport const isWindows = pl === 'win32';\nexport const isMacos = pl === 'darwin';\nexport const isLinux = pl === 'linux';\nexport const isFreeBSD = pl === 'freebsd';\nexport const isIBMi = osType() === 'OS400';\nexport const EVENTS = {\n ALL: 'all',\n READY: 'ready',\n ADD: 'add',\n CHANGE: 'change',\n ADD_DIR: 'addDir',\n UNLINK: 'unlink',\n UNLINK_DIR: 'unlinkDir',\n RAW: 'raw',\n ERROR: 'error',\n};\nconst EV = EVENTS;\nconst THROTTLE_MODE_WATCH = 'watch';\nconst statMethods = { lstat, stat };\nconst KEY_LISTENERS = 'listeners';\nconst KEY_ERR = 'errHandlers';\nconst KEY_RAW = 'rawEmitters';\nconst HANDLER_KEYS = [KEY_LISTENERS, KEY_ERR, KEY_RAW];\n// prettier-ignore\nconst binaryExtensions = new Set([\n '3dm', '3ds', '3g2', '3gp', '7z', 'a', 'aac', 'adp', 'afdesign', 'afphoto', 'afpub', 'ai',\n 'aif', 'aiff', 'alz', 'ape', 'apk', 'appimage', 'ar', 'arj', 'asf', 'au', 'avi',\n 'bak', 'baml', 'bh', 'bin', 'bk', 'bmp', 'btif', 'bz2', 'bzip2',\n 'cab', 'caf', 'cgm', 'class', 'cmx', 'cpio', 'cr2', 'cur', 'dat', 'dcm', 'deb', 'dex', 'djvu',\n 'dll', 'dmg', 'dng', 'doc', 'docm', 'docx', 'dot', 'dotm', 'dra', 'DS_Store', 'dsk', 'dts',\n 'dtshd', 'dvb', 'dwg', 'dxf',\n 'ecelp4800', 'ecelp7470', 'ecelp9600', 'egg', 'eol', 'eot', 'epub', 'exe',\n 'f4v', 'fbs', 'fh', 'fla', 'flac', 'flatpak', 'fli', 'flv', 'fpx', 'fst', 'fvt',\n 'g3', 'gh', 'gif', 'graffle', 'gz', 'gzip',\n 'h261', 'h263', 'h264', 'icns', 'ico', 'ief', 'img', 'ipa', 'iso',\n 'jar', 'jpeg', 'jpg', 'jpgv', 'jpm', 'jxr', 'key', 'ktx',\n 'lha', 'lib', 'lvp', 'lz', 'lzh', 'lzma', 'lzo',\n 'm3u', 'm4a', 'm4v', 'mar', 'mdi', 'mht', 'mid', 'midi', 'mj2', 'mka', 'mkv', 'mmr', 'mng',\n 'mobi', 'mov', 'movie', 'mp3',\n 'mp4', 'mp4a', 'mpeg', 'mpg', 'mpga', 'mxu',\n 'nef', 'npx', 'numbers', 'nupkg',\n 'o', 'odp', 'ods', 'odt', 'oga', 'ogg', 'ogv', 'otf', 'ott',\n 'pages', 'pbm', 'pcx', 'pdb', 'pdf', 'pea', 'pgm', 'pic', 'png', 'pnm', 'pot', 'potm',\n 'potx', 'ppa', 'ppam',\n 'ppm', 'pps', 'ppsm', 'ppsx', 'ppt', 'pptm', 'pptx', 'psd', 'pya', 'pyc', 'pyo', 'pyv',\n 'qt',\n 'rar', 'ras', 'raw', 'resources', 'rgb', 'rip', 'rlc', 'rmf', 'rmvb', 'rpm', 'rtf', 'rz',\n 's3m', 's7z', 'scpt', 'sgi', 'shar', 'snap', 'sil', 'sketch', 'slk', 'smv', 'snk', 'so',\n 'stl', 'suo', 'sub', 'swf',\n 'tar', 'tbz', 'tbz2', 'tga', 'tgz', 'thmx', 'tif', 'tiff', 'tlz', 'ttc', 'ttf', 'txz',\n 'udf', 'uvh', 'uvi', 'uvm', 'uvp', 'uvs', 'uvu',\n 'viv', 'vob',\n 'war', 'wav', 'wax', 'wbmp', 'wdp', 'weba', 'webm', 'webp', 'whl', 'wim', 'wm', 'wma',\n 'wmv', 'wmx', 'woff', 'woff2', 'wrm', 'wvx',\n 'xbm', 'xif', 'xla', 'xlam', 'xls', 'xlsb', 'xlsm', 'xlsx', 'xlt', 'xltm', 'xltx', 'xm',\n 'xmind', 'xpi', 'xpm', 'xwd', 'xz',\n 'z', 'zip', 'zipx',\n]);\nconst isBinaryPath = (filePath) => binaryExtensions.has(sysPath.extname(filePath).slice(1).toLowerCase());\n// TODO: emit errors properly. Example: EMFILE on Macos.\nconst foreach = (val, fn) => {\n if (val instanceof Set) {\n val.forEach(fn);\n }\n else {\n fn(val);\n }\n};\nconst addAndConvert = (main, prop, item) => {\n let container = main[prop];\n if (!(container instanceof Set)) {\n main[prop] = container = new Set([container]);\n }\n container.add(item);\n};\nconst clearItem = (cont) => (key) => {\n const set = cont[key];\n if (set instanceof Set) {\n set.clear();\n }\n else {\n delete cont[key];\n }\n};\nconst delFromSet = (main, prop, item) => {\n const container = main[prop];\n if (container instanceof Set) {\n container.delete(item);\n }\n else if (container === item) {\n delete main[prop];\n }\n};\nconst isEmptySet = (val) => (val instanceof Set ? val.size === 0 : !val);\nconst FsWatchInstances = new Map();\n/**\n * Instantiates the fs_watch interface\n * @param path to be watched\n * @param options to be passed to fs_watch\n * @param listener main event handler\n * @param errHandler emits info about errors\n * @param emitRaw emits raw event data\n * @returns {NativeFsWatcher}\n */\nfunction createFsWatchInstance(path, options, listener, errHandler, emitRaw) {\n const handleEvent = (rawEvent, evPath) => {\n listener(path);\n emitRaw(rawEvent, evPath, { watchedPath: path });\n // emit based on events occurring for files from a directory's watcher in\n // case the file's watcher misses it (and rely on throttling to de-dupe)\n if (evPath && path !== evPath) {\n fsWatchBroadcast(sysPath.resolve(path, evPath), KEY_LISTENERS, sysPath.join(path, evPath));\n }\n };\n try {\n return fs_watch(path, {\n persistent: options.persistent,\n }, handleEvent);\n }\n catch (error) {\n errHandler(error);\n return undefined;\n }\n}\n/**\n * Helper for passing fs_watch event data to a collection of listeners\n * @param fullPath absolute path bound to fs_watch instance\n */\nconst fsWatchBroadcast = (fullPath, listenerType, val1, val2, val3) => {\n const cont = FsWatchInstances.get(fullPath);\n if (!cont)\n return;\n foreach(cont[listenerType], (listener) => {\n listener(val1, val2, val3);\n });\n};\n/**\n * Instantiates the fs_watch interface or binds listeners\n * to an existing one covering the same file system entry\n * @param path\n * @param fullPath absolute path\n * @param options to be passed to fs_watch\n * @param handlers container for event listener functions\n */\nconst setFsWatchListener = (path, fullPath, options, handlers) => {\n const { listener, errHandler, rawEmitter } = handlers;\n let cont = FsWatchInstances.get(fullPath);\n let watcher;\n if (!options.persistent) {\n watcher = createFsWatchInstance(path, options, listener, errHandler, rawEmitter);\n if (!watcher)\n return;\n return watcher.close.bind(watcher);\n }\n if (cont) {\n addAndConvert(cont, KEY_LISTENERS, listener);\n addAndConvert(cont, KEY_ERR, errHandler);\n addAndConvert(cont, KEY_RAW, rawEmitter);\n }\n else {\n watcher = createFsWatchInstance(path, options, fsWatchBroadcast.bind(null, fullPath, KEY_LISTENERS), errHandler, // no need to use broadcast here\n fsWatchBroadcast.bind(null, fullPath, KEY_RAW));\n if (!watcher)\n return;\n watcher.on(EV.ERROR, async (error) => {\n const broadcastErr = fsWatchBroadcast.bind(null, fullPath, KEY_ERR);\n if (cont)\n cont.watcherUnusable = true; // documented since Node 10.4.1\n // Workaround for https://github.com/joyent/node/issues/4337\n if (isWindows && error.code === 'EPERM') {\n try {\n const fd = await open(path, 'r');\n await fd.close();\n broadcastErr(error);\n }\n catch (err) {\n // do nothing\n }\n }\n else {\n broadcastErr(error);\n }\n });\n cont = {\n listeners: listener,\n errHandlers: errHandler,\n rawEmitters: rawEmitter,\n watcher,\n };\n FsWatchInstances.set(fullPath, cont);\n }\n // const index = cont.listeners.indexOf(listener);\n // removes this instance's listeners and closes the underlying fs_watch\n // instance if there are no more listeners left\n return () => {\n delFromSet(cont, KEY_LISTENERS, listener);\n delFromSet(cont, KEY_ERR, errHandler);\n delFromSet(cont, KEY_RAW, rawEmitter);\n if (isEmptySet(cont.listeners)) {\n // Check to protect against issue gh-730.\n // if (cont.watcherUnusable) {\n cont.watcher.close();\n // }\n FsWatchInstances.delete(fullPath);\n HANDLER_KEYS.forEach(clearItem(cont));\n // @ts-ignore\n cont.watcher = undefined;\n Object.freeze(cont);\n }\n };\n};\n// fs_watchFile helpers\n// object to hold per-process fs_watchFile instances\n// (may be shared across chokidar FSWatcher instances)\nconst FsWatchFileInstances = new Map();\n/**\n * Instantiates the fs_watchFile interface or binds listeners\n * to an existing one covering the same file system entry\n * @param path to be watched\n * @param fullPath absolute path\n * @param options options to be passed to fs_watchFile\n * @param handlers container for event listener functions\n * @returns closer\n */\nconst setFsWatchFileListener = (path, fullPath, options, handlers) => {\n const { listener, rawEmitter } = handlers;\n let cont = FsWatchFileInstances.get(fullPath);\n // let listeners = new Set();\n // let rawEmitters = new Set();\n const copts = cont && cont.options;\n if (copts && (copts.persistent < options.persistent || copts.interval > options.interval)) {\n // \"Upgrade\" the watcher to persistence or a quicker interval.\n // This creates some unlikely edge case issues if the user mixes\n // settings in a very weird way, but solving for those cases\n // doesn't seem worthwhile for the added complexity.\n // listeners = cont.listeners;\n // rawEmitters = cont.rawEmitters;\n unwatchFile(fullPath);\n cont = undefined;\n }\n if (cont) {\n addAndConvert(cont, KEY_LISTENERS, listener);\n addAndConvert(cont, KEY_RAW, rawEmitter);\n }\n else {\n // TODO\n // listeners.add(listener);\n // rawEmitters.add(rawEmitter);\n cont = {\n listeners: listener,\n rawEmitters: rawEmitter,\n options,\n watcher: watchFile(fullPath, options, (curr, prev) => {\n foreach(cont.rawEmitters, (rawEmitter) => {\n rawEmitter(EV.CHANGE, fullPath, { curr, prev });\n });\n const currmtime = curr.mtimeMs;\n if (curr.size !== prev.size || currmtime > prev.mtimeMs || currmtime === 0) {\n foreach(cont.listeners, (listener) => listener(path, curr));\n }\n }),\n };\n FsWatchFileInstances.set(fullPath, cont);\n }\n // const index = cont.listeners.indexOf(listener);\n // Removes this instance's listeners and closes the underlying fs_watchFile\n // instance if there are no more listeners left.\n return () => {\n delFromSet(cont, KEY_LISTENERS, listener);\n delFromSet(cont, KEY_RAW, rawEmitter);\n if (isEmptySet(cont.listeners)) {\n FsWatchFileInstances.delete(fullPath);\n unwatchFile(fullPath);\n cont.options = cont.watcher = undefined;\n Object.freeze(cont);\n }\n };\n};\n/**\n * @mixin\n */\nexport class NodeFsHandler {\n constructor(fsW) {\n this.fsw = fsW;\n this._boundHandleError = (error) => fsW._handleError(error);\n }\n /**\n * Watch file for changes with fs_watchFile or fs_watch.\n * @param path to file or dir\n * @param listener on fs change\n * @returns closer for the watcher instance\n */\n _watchWithNodeFs(path, listener) {\n const opts = this.fsw.options;\n const directory = sysPath.dirname(path);\n const basename = sysPath.basename(path);\n const parent = this.fsw._getWatchedDir(directory);\n parent.add(basename);\n const absolutePath = sysPath.resolve(path);\n const options = {\n persistent: opts.persistent,\n };\n if (!listener)\n listener = EMPTY_FN;\n let closer;\n if (opts.usePolling) {\n const enableBin = opts.interval !== opts.binaryInterval;\n options.interval = enableBin && isBinaryPath(basename) ? opts.binaryInterval : opts.interval;\n closer = setFsWatchFileListener(path, absolutePath, options, {\n listener,\n rawEmitter: this.fsw._emitRaw,\n });\n }\n else {\n closer = setFsWatchListener(path, absolutePath, options, {\n listener,\n errHandler: this._boundHandleError,\n rawEmitter: this.fsw._emitRaw,\n });\n }\n return closer;\n }\n /**\n * Watch a file and emit add event if warranted.\n * @returns closer for the watcher instance\n */\n _handleFile(file, stats, initialAdd) {\n if (this.fsw.closed) {\n return;\n }\n const dirname = sysPath.dirname(file);\n const basename = sysPath.basename(file);\n const parent = this.fsw._getWatchedDir(dirname);\n // stats is always present\n let prevStats = stats;\n // if the file is already being watched, do nothing\n if (parent.has(basename))\n return;\n const listener = async (path, newStats) => {\n if (!this.fsw._throttle(THROTTLE_MODE_WATCH, file, 5))\n return;\n if (!newStats || newStats.mtimeMs === 0) {\n try {\n const newStats = await stat(file);\n if (this.fsw.closed)\n return;\n // Check that change event was not fired because of changed only accessTime.\n const at = newStats.atimeMs;\n const mt = newStats.mtimeMs;\n if (!at || at <= mt || mt !== prevStats.mtimeMs) {\n this.fsw._emit(EV.CHANGE, file, newStats);\n }\n if ((isMacos || isLinux || isFreeBSD) && prevStats.ino !== newStats.ino) {\n this.fsw._closeFile(path);\n prevStats = newStats;\n const closer = this._watchWithNodeFs(file, listener);\n if (closer)\n this.fsw._addPathCloser(path, closer);\n }\n else {\n prevStats = newStats;\n }\n }\n catch (error) {\n // Fix issues where mtime is null but file is still present\n this.fsw._remove(dirname, basename);\n }\n // add is about to be emitted if file not already tracked in parent\n }\n else if (parent.has(basename)) {\n // Check that change event was not fired because of changed only accessTime.\n const at = newStats.atimeMs;\n const mt = newStats.mtimeMs;\n if (!at || at <= mt || mt !== prevStats.mtimeMs) {\n this.fsw._emit(EV.CHANGE, file, newStats);\n }\n prevStats = newStats;\n }\n };\n // kick off the watcher\n const closer = this._watchWithNodeFs(file, listener);\n // emit an add event if we're supposed to\n if (!(initialAdd && this.fsw.options.ignoreInitial) && this.fsw._isntIgnored(file)) {\n if (!this.fsw._throttle(EV.ADD, file, 0))\n return;\n this.fsw._emit(EV.ADD, file, stats);\n }\n return closer;\n }\n /**\n * Handle symlinks encountered while reading a dir.\n * @param entry returned by readdirp\n * @param directory path of dir being read\n * @param path of this item\n * @param item basename of this item\n * @returns true if no more processing is needed for this entry.\n */\n async _handleSymlink(entry, directory, path, item) {\n if (this.fsw.closed) {\n return;\n }\n const full = entry.fullPath;\n const dir = this.fsw._getWatchedDir(directory);\n if (!this.fsw.options.followSymlinks) {\n // watch symlink directly (don't follow) and detect changes\n this.fsw._incrReadyCount();\n let linkPath;\n try {\n linkPath = await fsrealpath(path);\n }\n catch (e) {\n this.fsw._emitReady();\n return true;\n }\n if (this.fsw.closed)\n return;\n if (dir.has(item)) {\n if (this.fsw._symlinkPaths.get(full) !== linkPath) {\n this.fsw._symlinkPaths.set(full, linkPath);\n this.fsw._emit(EV.CHANGE, path, entry.stats);\n }\n }\n else {\n dir.add(item);\n this.fsw._symlinkPaths.set(full, linkPath);\n this.fsw._emit(EV.ADD, path, entry.stats);\n }\n this.fsw._emitReady();\n return true;\n }\n // don't follow the same symlink more than once\n if (this.fsw._symlinkPaths.has(full)) {\n return true;\n }\n this.fsw._symlinkPaths.set(full, true);\n }\n _handleRead(directory, initialAdd, wh, target, dir, depth, throttler) {\n // Normalize the directory name on Windows\n directory = sysPath.join(directory, '');\n throttler = this.fsw._throttle('readdir', directory, 1000);\n if (!throttler)\n return;\n const previous = this.fsw._getWatchedDir(wh.path);\n const current = new Set();\n let stream = this.fsw._readdirp(directory, {\n fileFilter: (entry) => wh.filterPath(entry),\n directoryFilter: (entry) => wh.filterDir(entry),\n });\n if (!stream)\n return;\n stream\n .on(STR_DATA, async (entry) => {\n if (this.fsw.closed) {\n stream = undefined;\n return;\n }\n const item = entry.path;\n let path = sysPath.join(directory, item);\n current.add(item);\n if (entry.stats.isSymbolicLink() &&\n (await this._handleSymlink(entry, directory, path, item))) {\n return;\n }\n if (this.fsw.closed) {\n stream = undefined;\n return;\n }\n // Files that present in current directory snapshot\n // but absent in previous are added to watch list and\n // emit `add` event.\n if (item === target || (!target && !previous.has(item))) {\n this.fsw._incrReadyCount();\n // ensure relativeness of path is preserved in case of watcher reuse\n path = sysPath.join(dir, sysPath.relative(dir, path));\n this._addToNodeFs(path, initialAdd, wh, depth + 1);\n }\n })\n .on(EV.ERROR, this._boundHandleError);\n return new Promise((resolve, reject) => {\n if (!stream)\n return reject();\n stream.once(STR_END, () => {\n if (this.fsw.closed) {\n stream = undefined;\n return;\n }\n const wasThrottled = throttler ? throttler.clear() : false;\n resolve(undefined);\n // Files that absent in current directory snapshot\n // but present in previous emit `remove` event\n // and are removed from @watched[directory].\n previous\n .getChildren()\n .filter((item) => {\n return item !== directory && !current.has(item);\n })\n .forEach((item) => {\n this.fsw._remove(directory, item);\n });\n stream = undefined;\n // one more time for any missed in case changes came in extremely quickly\n if (wasThrottled)\n this._handleRead(directory, false, wh, target, dir, depth, throttler);\n });\n });\n }\n /**\n * Read directory to add / remove files from `@watched` list and re-read it on change.\n * @param dir fs path\n * @param stats\n * @param initialAdd\n * @param depth relative to user-supplied path\n * @param target child path targeted for watch\n * @param wh Common watch helpers for this path\n * @param realpath\n * @returns closer for the watcher instance.\n */\n async _handleDir(dir, stats, initialAdd, depth, target, wh, realpath) {\n const parentDir = this.fsw._getWatchedDir(sysPath.dirname(dir));\n const tracked = parentDir.has(sysPath.basename(dir));\n if (!(initialAdd && this.fsw.options.ignoreInitial) && !target && !tracked) {\n this.fsw._emit(EV.ADD_DIR, dir, stats);\n }\n // ensure dir is tracked (harmless if redundant)\n parentDir.add(sysPath.basename(dir));\n this.fsw._getWatchedDir(dir);\n let throttler;\n let closer;\n const oDepth = this.fsw.options.depth;\n if ((oDepth == null || depth <= oDepth) && !this.fsw._symlinkPaths.has(realpath)) {\n if (!target) {\n await this._handleRead(dir, initialAdd, wh, target, dir, depth, throttler);\n if (this.fsw.closed)\n return;\n }\n closer = this._watchWithNodeFs(dir, (dirPath, stats) => {\n // if current directory is removed, do nothing\n if (stats && stats.mtimeMs === 0)\n return;\n this._handleRead(dirPath, false, wh, target, dir, depth, throttler);\n });\n }\n return closer;\n }\n /**\n * Handle added file, directory, or glob pattern.\n * Delegates call to _handleFile / _handleDir after checks.\n * @param path to file or ir\n * @param initialAdd was the file added at watch instantiation?\n * @param priorWh depth relative to user-supplied path\n * @param depth Child path actually targeted for watch\n * @param target Child path actually targeted for watch\n */\n async _addToNodeFs(path, initialAdd, priorWh, depth, target) {\n const ready = this.fsw._emitReady;\n if (this.fsw._isIgnored(path) || this.fsw.closed) {\n ready();\n return false;\n }\n const wh = this.fsw._getWatchHelpers(path);\n if (priorWh) {\n wh.filterPath = (entry) => priorWh.filterPath(entry);\n wh.filterDir = (entry) => priorWh.filterDir(entry);\n }\n // evaluate what is at the path we're being asked to watch\n try {\n const stats = await statMethods[wh.statMethod](wh.watchPath);\n if (this.fsw.closed)\n return;\n if (this.fsw._isIgnored(wh.watchPath, stats)) {\n ready();\n return false;\n }\n const follow = this.fsw.options.followSymlinks;\n let closer;\n if (stats.isDirectory()) {\n const absPath = sysPath.resolve(path);\n const targetPath = follow ? await fsrealpath(path) : path;\n if (this.fsw.closed)\n return;\n closer = await this._handleDir(wh.watchPath, stats, initialAdd, depth, target, wh, targetPath);\n if (this.fsw.closed)\n return;\n // preserve this symlink's target path\n if (absPath !== targetPath && targetPath !== undefined) {\n this.fsw._symlinkPaths.set(absPath, targetPath);\n }\n }\n else if (stats.isSymbolicLink()) {\n const targetPath = follow ? await fsrealpath(path) : path;\n if (this.fsw.closed)\n return;\n const parent = sysPath.dirname(wh.watchPath);\n this.fsw._getWatchedDir(parent).add(wh.watchPath);\n this.fsw._emit(EV.ADD, wh.watchPath, stats);\n closer = await this._handleDir(parent, stats, initialAdd, depth, path, wh, targetPath);\n if (this.fsw.closed)\n return;\n // preserve this symlink's target path\n if (targetPath !== undefined) {\n this.fsw._symlinkPaths.set(sysPath.resolve(path), targetPath);\n }\n }\n else {\n closer = this._handleFile(wh.watchPath, stats, initialAdd);\n }\n ready();\n if (closer)\n this.fsw._addPathCloser(path, closer);\n return false;\n }\n catch (error) {\n if (this.fsw._handleError(error)) {\n ready();\n return path;\n }\n }\n }\n}\n","import type { Application, Request, Response } from \"express\";\r\nimport chokidar from \"chokidar\";\r\nimport path from \"path\";\r\nimport { BUILD_FOLDER_NAME } from \"@constants/globals\";\r\n\r\nexport interface HotReloadOptions {\r\n app: Application;\r\n appDir: string; // carpeta de la app (ej: apps/example/app)\r\n projectRoot?: string; // Project root directory (optional, will be inferred from appDir)\r\n route?: string; // endpoint SSE, default: \"/__fw/hot\"\r\n waitForBuild?: () => Promise<void>; // Function to wait for client bundle to finish building\r\n onFileChange?: (filePath: string) => void | Promise<void>; // Callback when file changes\r\n}\r\n\r\n/**\r\n * Sets up an SSE endpoint and file watcher on appDir.\r\n * Each change triggers a reload to connected clients.\r\n *\r\n * @param options - Hot reload options\r\n */\r\nexport function setupHotReload({\r\n app,\r\n appDir,\r\n projectRoot,\r\n route = \"/__fw/hot\",\r\n waitForBuild,\r\n onFileChange,\r\n}: HotReloadOptions) {\r\n const clients = new Set<Response>();\r\n\r\n app.get(route, (req: Request, res: Response) => {\r\n // Set proper SSE headers\r\n res.setHeader(\"Content-Type\", \"text/event-stream; charset=utf-8\");\r\n res.setHeader(\"Cache-Control\", \"no-cache, no-transform\");\r\n res.setHeader(\"Connection\", \"keep-alive\");\r\n res.setHeader(\"X-Accel-Buffering\", \"no\"); // Disable nginx/proxy buffering\r\n \r\n // Flush headers immediately\r\n if (res.flushHeaders) {\r\n res.flushHeaders();\r\n } else {\r\n // Fallback for Express versions without flushHeaders\r\n res.writeHead(200, {\r\n \"Content-Type\": \"text/event-stream; charset=utf-8\",\r\n \"Cache-Control\": \"no-cache, no-transform\",\r\n \"Connection\": \"keep-alive\",\r\n \"X-Accel-Buffering\": \"no\",\r\n });\r\n }\r\n\r\n clients.add(res);\r\n \r\n // Send initial ping to confirm connection\r\n // SSE format: event: <event-type>\\ndata: <data>\\n\\n (double newline required!)\r\n const pingMessage = \"event: ping\\ndata: connected\\n\\n\";\r\n try {\r\n res.write(pingMessage, \"utf-8\");\r\n } catch (error) {\r\n console.error(`[hot-reload-server] ❌ Error sending ping:`, error);\r\n clients.delete(res);\r\n }\r\n\r\n req.on(\"close\", () => {\r\n clients.delete(res);\r\n });\r\n \r\n req.on(\"aborted\", () => {\r\n clients.delete(res);\r\n });\r\n });\r\n \r\n console.log(`[hot-reload-server] ✅ SSE endpoint registered at ${route}`);\r\n\r\n // Determine project root: use provided or infer from appDir\r\n const resolvedProjectRoot = projectRoot \r\n ? path.resolve(projectRoot)\r\n : path.dirname(path.resolve(appDir));\r\n\r\n // Watch the entire project root to catch changes anywhere\r\n // This ensures changes in lib/, components/, utils/, or any other directory trigger reload\r\n // Similar to how the route cache works - monitor everything except excluded dirs\r\n const watcher = chokidar.watch(resolvedProjectRoot, {\r\n ignoreInitial: true,\r\n ignored: [\r\n \"**/node_modules/**\",\r\n `**/${BUILD_FOLDER_NAME}/**`,\r\n \"**/.loly/**\", // Ignore build output directory completely\r\n \"**/.git/**\",\r\n \"**/dist/**\",\r\n \"**/build/**\",\r\n \"**/.next/**\",\r\n \"**/.cache/**\",\r\n \"**/.turbo/**\",\r\n \"**/.swc/**\",\r\n \"**/coverage/**\",\r\n // Ignore generated files that trigger unnecessary reloads\r\n \"**/*.map\", // Source maps\r\n \"**/*.log\", // Log files\r\n \"**/.DS_Store\", // macOS\r\n \"**/Thumbs.db\", // Windows\r\n ],\r\n persistent: true,\r\n ignorePermissionErrors: true,\r\n // Only watch relevant source files (TypeScript, JavaScript, CSS)\r\n // Filter out JSON files in build directories\r\n awaitWriteFinish: {\r\n stabilityThreshold: 150, // Wait 150ms after file change to trigger event (debounce)\r\n pollInterval: 50, // Check every 50ms\r\n },\r\n });\r\n\r\n // Debounce reload broadcasts to avoid multiple rapid events\r\n let broadcastTimeout: ReturnType<typeof setTimeout> | null = null;\r\n const BROADCAST_DEBOUNCE_MS = 300;\r\n\r\n async function broadcastReload(reason: string, filePath: string) {\r\n // Filter out files that shouldn't trigger reloads\r\n // Even though chokidar has ignored patterns, some files might still get through\r\n const normalizedPath = path.normalize(filePath);\r\n \r\n // Skip if file is in build directory or is a generated file\r\n if (\r\n normalizedPath.includes(BUILD_FOLDER_NAME) ||\r\n normalizedPath.includes('.loly') ||\r\n normalizedPath.endsWith('.map') ||\r\n normalizedPath.endsWith('.log') ||\r\n normalizedPath.includes('route-chunks.json') ||\r\n normalizedPath.includes('routes-client.ts') ||\r\n normalizedPath.includes('/client/route-')\r\n ) {\r\n // Silently skip these files - they're generated and shouldn't trigger reloads\r\n return;\r\n }\r\n\r\n const rel = path.relative(appDir, filePath);\r\n console.log(`[hot-reload] ${reason}: ${rel}`);\r\n\r\n // Debounce: clear existing timeout and set new one\r\n // This prevents multiple rapid file changes from triggering multiple reloads\r\n if (broadcastTimeout) {\r\n clearTimeout(broadcastTimeout);\r\n }\r\n\r\n broadcastTimeout = setTimeout(async () => {\r\n // Call onFileChange callback if provided (e.g., to reload routes manifest)\r\n if (onFileChange) {\r\n try {\r\n await onFileChange(filePath);\r\n } catch (error) {\r\n console.warn(\"[hot-reload] Error in onFileChange callback:\", error);\r\n }\r\n }\r\n\r\n // Wait for client bundle to finish building before sending reload event\r\n if (waitForBuild) {\r\n try {\r\n console.log(\"[hot-reload] Waiting for client bundle to finish...\");\r\n await waitForBuild();\r\n console.log(\"[hot-reload] Client bundle ready, sending reload event\");\r\n } catch (error) {\r\n console.warn(\"[hot-reload] Error waiting for build:\", error);\r\n // Continue anyway, don't block reload\r\n }\r\n }\r\n\r\n // Broadcast to all connected clients\r\n // SSE format: event: <event-type>\\ndata: <data>\\n\\n (double newline required!)\r\n const message = `event: message\\ndata: reload:${rel}\\n\\n`;\r\n console.log(`[hot-reload-server] 📤 Broadcasting reload event to ${clients.size} client(s)`);\r\n \r\n let sentCount = 0;\r\n for (const res of clients) {\r\n try {\r\n // Ensure response is still writable\r\n if (res.writableEnded || res.destroyed) {\r\n clients.delete(res);\r\n continue;\r\n }\r\n \r\n res.write(message, \"utf-8\");\r\n sentCount++;\r\n } catch (error) {\r\n console.error(`[hot-reload-server] ✗ Error sending to client:`, error);\r\n // Client disconnected, remove from set\r\n clients.delete(res);\r\n }\r\n }\r\n \r\n if (sentCount > 0) {\r\n console.log(`[hot-reload-server] ✅ Reload event sent to ${sentCount} client(s)`);\r\n }\r\n }, BROADCAST_DEBOUNCE_MS);\r\n }\r\n\r\n watcher\r\n .on(\"add\", (filePath) => broadcastReload(\"add\", filePath))\r\n .on(\"change\", (filePath) => broadcastReload(\"change\", filePath))\r\n .on(\"unlink\", (filePath) => broadcastReload(\"unlink\", filePath));\r\n}\r\n","import path from \"path\";\r\n\r\n/**\r\n * Clears the require cache for files in the app directory.\r\n *\r\n * @param appDir - App directory path\r\n */\r\nexport function clearAppRequireCache(appDir: string) {\r\n const appDirNormalized = path.resolve(appDir);\r\n\r\n for (const id of Object.keys(require.cache)) {\r\n if (id.startsWith(appDirNormalized)) {\r\n delete require.cache[id];\r\n }\r\n }\r\n}\r\n","import path from \"path\";\r\nimport fs from \"fs\";\r\nimport { BUILD_FOLDER_NAME } from \"../constants/globals\";\r\n\r\n/**\r\n * Framework configuration interface.\r\n * \r\n * Allows customization of framework behavior without code changes.\r\n */\r\nexport interface FrameworkConfig {\r\n // Directory structure\r\n directories: {\r\n app: string; // Default: 'app'\r\n build: string; // Default: '.loly'\r\n static: string; // Default: 'public'\r\n };\r\n \r\n // File naming conventions\r\n conventions: {\r\n page: string; // Default: 'page'\r\n layout: string; // Default: 'layout'\r\n notFound: string; // Default: '_not-found'\r\n error: string; // Default: '_error'\r\n api: string; // Default: 'route'\r\n };\r\n \r\n // Routing\r\n routing: {\r\n trailingSlash: 'always' | 'never' | 'ignore';\r\n caseSensitive: boolean;\r\n basePath: string; // Default: ''\r\n };\r\n \r\n // Build\r\n build: {\r\n clientBundler: 'rspack' | 'webpack' | 'vite';\r\n serverBundler: 'esbuild' | 'tsup' | 'swc';\r\n outputFormat: 'cjs' | 'esm';\r\n };\r\n \r\n // Server\r\n server: {\r\n adapter: 'express' | 'fastify' | 'koa';\r\n port: number;\r\n host: string;\r\n };\r\n \r\n // Rendering\r\n rendering: {\r\n framework: 'react' | 'preact' | 'vue' | 'svelte';\r\n streaming: boolean;\r\n ssr: boolean;\r\n ssg: boolean;\r\n };\r\n \r\n // Plugins (to be implemented in Phase 2)\r\n plugins?: any[];\r\n}\r\n\r\n/**\r\n * Default framework configuration.\r\n */\r\nexport const DEFAULT_CONFIG: FrameworkConfig = {\r\n directories: {\r\n app: 'app',\r\n build: BUILD_FOLDER_NAME,\r\n static: 'public',\r\n },\r\n conventions: {\r\n page: 'page',\r\n layout: 'layout',\r\n notFound: '_not-found',\r\n error: '_error',\r\n api: 'route',\r\n },\r\n routing: {\r\n trailingSlash: 'ignore',\r\n caseSensitive: false,\r\n basePath: '',\r\n },\r\n build: {\r\n clientBundler: 'rspack',\r\n serverBundler: 'esbuild',\r\n outputFormat: 'cjs',\r\n },\r\n server: {\r\n adapter: 'express',\r\n port: 3000,\r\n host: 'localhost',\r\n },\r\n rendering: {\r\n framework: 'react',\r\n streaming: true,\r\n ssr: true,\r\n ssg: true,\r\n },\r\n plugins: [],\r\n};\r\n\r\n/**\r\n * Deep merge utility for configuration objects.\r\n */\r\nfunction deepMerge<T extends Record<string, any>>(target: T, source: Partial<T>): T {\r\n const result = { ...target };\r\n \r\n for (const key in source) {\r\n const sourceValue = source[key];\r\n if (sourceValue && typeof sourceValue === 'object' && !Array.isArray(sourceValue)) {\r\n const targetValue = result[key];\r\n if (targetValue && typeof targetValue === 'object' && !Array.isArray(targetValue)) {\r\n result[key] = deepMerge(targetValue, sourceValue as any);\r\n } else {\r\n result[key] = sourceValue as T[Extract<keyof T, string>];\r\n }\r\n } else if (sourceValue !== undefined) {\r\n result[key] = sourceValue as T[Extract<keyof T, string>];\r\n }\r\n }\r\n \r\n return result;\r\n}\r\n\r\n/**\r\n * Configuration validation errors.\r\n */\r\nexport class ConfigValidationError extends Error {\r\n constructor(message: string, public readonly errors: string[] = []) {\r\n super(message);\r\n this.name = 'ConfigValidationError';\r\n }\r\n}\r\n\r\n/**\r\n * Validates framework configuration.\r\n * \r\n * @param config - Configuration to validate\r\n * @param projectRoot - Root directory of the project\r\n * @throws ConfigValidationError if validation fails\r\n */\r\nfunction validateConfig(config: FrameworkConfig, projectRoot: string): void {\r\n const errors: string[] = [];\r\n\r\n // Validate directories\r\n if (!config.directories.app || typeof config.directories.app !== 'string') {\r\n errors.push('config.directories.app must be a non-empty string');\r\n } else {\r\n const appDir = path.join(projectRoot, config.directories.app);\r\n if (!fs.existsSync(appDir) && process.env.NODE_ENV !== 'test') {\r\n errors.push(\r\n `App directory not found: ${config.directories.app}\\n` +\r\n ` Expected at: ${appDir}\\n` +\r\n ` 💡 Suggestion: Create the directory or update config.directories.app`\r\n );\r\n }\r\n }\r\n\r\n if (!config.directories.build || typeof config.directories.build !== 'string') {\r\n errors.push('config.directories.build must be a non-empty string');\r\n }\r\n\r\n if (!config.directories.static || typeof config.directories.static !== 'string') {\r\n errors.push('config.directories.static must be a non-empty string');\r\n }\r\n\r\n // Validate conventions\r\n const conventionKeys = ['page', 'layout', 'notFound', 'error', 'api'] as const;\r\n for (const key of conventionKeys) {\r\n if (!config.conventions[key] || typeof config.conventions[key] !== 'string') {\r\n errors.push(`config.conventions.${key} must be a non-empty string`);\r\n }\r\n }\r\n\r\n // Validate routing\r\n if (!['always', 'never', 'ignore'].includes(config.routing.trailingSlash)) {\r\n errors.push(\r\n `config.routing.trailingSlash must be 'always', 'never', or 'ignore'\\n` +\r\n ` Received: ${JSON.stringify(config.routing.trailingSlash)}\\n` +\r\n ` 💡 Suggestion: Use one of the valid values: 'always' | 'never' | 'ignore'`\r\n );\r\n }\r\n\r\n if (typeof config.routing.caseSensitive !== 'boolean') {\r\n errors.push('config.routing.caseSensitive must be a boolean');\r\n }\r\n\r\n if (typeof config.routing.basePath !== 'string') {\r\n errors.push('config.routing.basePath must be a string');\r\n } else if (config.routing.basePath && !config.routing.basePath.startsWith('/')) {\r\n errors.push(\r\n `config.routing.basePath must start with '/' (if not empty)\\n` +\r\n ` Received: ${JSON.stringify(config.routing.basePath)}\\n` +\r\n ` 💡 Suggestion: Use an empty string '' or a path starting with '/', e.g., '/api'`\r\n );\r\n }\r\n\r\n // Validate build\r\n const validClientBundlers = ['rspack', 'webpack', 'vite'];\r\n if (!validClientBundlers.includes(config.build.clientBundler)) {\r\n errors.push(\r\n `config.build.clientBundler must be one of: ${validClientBundlers.join(', ')}\\n` +\r\n ` Received: ${JSON.stringify(config.build.clientBundler)}`\r\n );\r\n }\r\n\r\n const validServerBundlers = ['esbuild', 'tsup', 'swc'];\r\n if (!validServerBundlers.includes(config.build.serverBundler)) {\r\n errors.push(\r\n `config.build.serverBundler must be one of: ${validServerBundlers.join(', ')}\\n` +\r\n ` Received: ${JSON.stringify(config.build.serverBundler)}`\r\n );\r\n }\r\n\r\n if (!['cjs', 'esm'].includes(config.build.outputFormat)) {\r\n errors.push(\r\n `config.build.outputFormat must be 'cjs' or 'esm'\\n` +\r\n ` Received: ${JSON.stringify(config.build.outputFormat)}`\r\n );\r\n }\r\n\r\n // Validate server\r\n const validAdapters = ['express', 'fastify', 'koa'];\r\n if (!validAdapters.includes(config.server.adapter)) {\r\n errors.push(\r\n `config.server.adapter must be one of: ${validAdapters.join(', ')}\\n` +\r\n ` Received: ${JSON.stringify(config.server.adapter)}`\r\n );\r\n }\r\n\r\n if (typeof config.server.port !== 'number' || config.server.port < 1 || config.server.port > 65535) {\r\n errors.push(\r\n `config.server.port must be a number between 1 and 65535\\n` +\r\n ` Received: ${JSON.stringify(config.server.port)}`\r\n );\r\n }\r\n\r\n if (!config.server.host || typeof config.server.host !== 'string') {\r\n errors.push('config.server.host must be a non-empty string');\r\n }\r\n\r\n // Validate rendering\r\n const validFrameworks = ['react', 'preact', 'vue', 'svelte'];\r\n if (!validFrameworks.includes(config.rendering.framework)) {\r\n errors.push(\r\n `config.rendering.framework must be one of: ${validFrameworks.join(', ')}\\n` +\r\n ` Received: ${JSON.stringify(config.rendering.framework)}`\r\n );\r\n }\r\n\r\n if (typeof config.rendering.streaming !== 'boolean') {\r\n errors.push('config.rendering.streaming must be a boolean');\r\n }\r\n\r\n if (typeof config.rendering.ssr !== 'boolean') {\r\n errors.push('config.rendering.ssr must be a boolean');\r\n }\r\n\r\n if (typeof config.rendering.ssg !== 'boolean') {\r\n errors.push('config.rendering.ssg must be a boolean');\r\n }\r\n\r\n // If there are errors, throw with detailed message\r\n if (errors.length > 0) {\r\n const errorMessage = [\r\n '❌ Configuration validation failed:',\r\n '',\r\n ...errors.map((err, i) => `${i + 1}. ${err}`),\r\n '',\r\n '💡 Please check your loly.config.ts file and fix the errors above.',\r\n ].join('\\n');\r\n\r\n throw new ConfigValidationError(errorMessage, errors);\r\n }\r\n}\r\n\r\n/**\r\n * Loads framework configuration from project root.\r\n * \r\n * Looks for configuration in the following order:\r\n * 1. loly.config.ts (TypeScript)\r\n * 2. loly.config.js (JavaScript)\r\n * 3. loly.config.json (JSON)\r\n * \r\n * Merges user config with defaults and validates.\r\n * \r\n * @param projectRoot - Root directory of the project\r\n * @returns Framework configuration\r\n * @throws ConfigValidationError if configuration is invalid\r\n */\r\nexport function loadConfig(projectRoot: string): FrameworkConfig {\r\n const configFiles = [\r\n path.join(projectRoot, 'loly.config.ts'),\r\n path.join(projectRoot, 'loly.config.js'),\r\n path.join(projectRoot, 'loly.config.json'),\r\n ];\r\n\r\n let userConfig: Partial<FrameworkConfig> = {};\r\n let loadedConfigFile: string | null = null;\r\n\r\n // Try to load config file\r\n for (const configFile of configFiles) {\r\n if (fs.existsSync(configFile)) {\r\n try {\r\n if (configFile.endsWith('.json')) {\r\n // Load JSON config\r\n const content = fs.readFileSync(configFile, 'utf-8');\r\n userConfig = JSON.parse(content);\r\n } else {\r\n // Load TS/JS config (requires require/import)\r\n // In production, these should be compiled\r\n // For now, we'll use require with tsx in dev\r\n if (process.env.NODE_ENV === 'development') {\r\n require('tsx/cjs');\r\n }\r\n const mod = require(configFile);\r\n userConfig = typeof mod.default === 'function' \r\n ? mod.default(process.env.NODE_ENV)\r\n : (mod.default || mod.config || mod);\r\n }\r\n loadedConfigFile = path.relative(projectRoot, configFile);\r\n break;\r\n } catch (error) {\r\n const errorMessage = error instanceof Error ? error.message : String(error);\r\n throw new ConfigValidationError(\r\n `Failed to load configuration from ${path.relative(projectRoot, configFile)}:\\n` +\r\n ` ${errorMessage}\\n` +\r\n ` 💡 Suggestion: Check that your config file exports a valid configuration object`\r\n );\r\n }\r\n }\r\n }\r\n\r\n // Merge with defaults\r\n const config = deepMerge(DEFAULT_CONFIG, userConfig);\r\n\r\n // Validate configuration\r\n try {\r\n validateConfig(config, projectRoot);\r\n } catch (error) {\r\n if (error instanceof ConfigValidationError) {\r\n // Enhance error message with config file info\r\n if (loadedConfigFile) {\r\n error.message = `[Configuration Error in ${loadedConfigFile}]\\n\\n${error.message}`;\r\n }\r\n throw error;\r\n }\r\n throw error;\r\n }\r\n\r\n return config;\r\n}\r\n\r\n/**\r\n * Gets the resolved app directory path.\r\n * \r\n * @param projectRoot - Root directory of the project\r\n * @param config - Framework configuration\r\n * @returns Resolved app directory path\r\n */\r\nexport function getAppDir(projectRoot: string, config: FrameworkConfig): string {\r\n return path.resolve(projectRoot, config.directories.app);\r\n}\r\n\r\n/**\r\n * Gets the resolved build directory path.\r\n * \r\n * @param projectRoot - Root directory of the project\r\n * @param config - Framework configuration\r\n * @returns Resolved build directory path\r\n */\r\nexport function getBuildDir(projectRoot: string, config: FrameworkConfig): string {\r\n return path.join(projectRoot, config.directories.build);\r\n}\r\n\r\n/**\r\n * Gets the resolved static directory path.\r\n * \r\n * @param projectRoot - Root directory of the project\r\n * @param config - Framework configuration\r\n * @returns Resolved static directory path\r\n */\r\nexport function getStaticDir(projectRoot: string, config: FrameworkConfig): string {\r\n return path.resolve(projectRoot, config.directories.static);\r\n}\r\n\r\n","/**\r\n * Security utilities for input sanitization.\r\n */\r\n\r\n/**\r\n * Sanitizes a string by removing potentially dangerous characters.\r\n * Basic sanitization - for production, consider using a library like DOMPurify.\r\n * \r\n * @param input - String to sanitize\r\n * @returns Sanitized string\r\n */\r\nexport function sanitizeString(input: string): string {\r\n if (typeof input !== \"string\") {\r\n return String(input);\r\n }\r\n\r\n // Remove null bytes\r\n let sanitized = input.replace(/\\0/g, \"\");\r\n\r\n // Remove control characters except newlines and tabs\r\n sanitized = sanitized.replace(/[\\x00-\\x08\\x0B-\\x0C\\x0E-\\x1F\\x7F]/g, \"\");\r\n\r\n return sanitized;\r\n}\r\n\r\n/**\r\n * Sanitizes an object by recursively sanitizing all string values.\r\n * \r\n * @param obj - Object to sanitize\r\n * @returns Sanitized object\r\n */\r\nexport function sanitizeObject<T extends Record<string, any>>(obj: T): T {\r\n if (obj === null || obj === undefined) {\r\n return obj;\r\n }\r\n\r\n if (typeof obj !== \"object\") {\r\n return typeof obj === \"string\" ? (sanitizeString(obj) as any) : obj;\r\n }\r\n\r\n if (Array.isArray(obj)) {\r\n return obj.map((item) => sanitizeObject(item)) as any;\r\n }\r\n\r\n const sanitized: any = {};\r\n for (const key in obj) {\r\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\r\n const value = obj[key];\r\n if (typeof value === \"string\") {\r\n sanitized[key] = sanitizeString(value);\r\n } else if (typeof value === \"object\" && value !== null) {\r\n sanitized[key] = sanitizeObject(value);\r\n } else {\r\n sanitized[key] = value;\r\n }\r\n }\r\n }\r\n\r\n return sanitized;\r\n}\r\n\r\n/**\r\n * Sanitizes route parameters.\r\n * \r\n * @param params - Route parameters object\r\n * @returns Sanitized parameters\r\n */\r\nexport function sanitizeParams<T extends Record<string, string | string[]>>(\r\n params: T\r\n): T {\r\n const sanitized: any = {};\r\n for (const key in params) {\r\n if (Object.prototype.hasOwnProperty.call(params, key)) {\r\n const value = params[key];\r\n if (Array.isArray(value)) {\r\n sanitized[key] = value.map((v) => sanitizeString(String(v)));\r\n } else {\r\n sanitized[key] = sanitizeString(String(value));\r\n }\r\n }\r\n }\r\n return sanitized;\r\n}\r\n\r\n/**\r\n * Sanitizes query parameters.\r\n * \r\n * @param query - Query parameters object\r\n * @returns Sanitized query parameters\r\n */\r\nexport function sanitizeQuery<T extends Record<string, any>>(query: T): T {\r\n return sanitizeObject(query);\r\n}\r\n\r\n","import rateLimit from \"express-rate-limit\";\r\nimport { createModuleLogger } from \"@logger/index\";\r\n\r\nconst logger = createModuleLogger(\"rate-limit\");\r\n\r\nexport interface RateLimitConfig {\r\n windowMs?: number;\r\n max?: number;\r\n message?: string;\r\n standardHeaders?: boolean;\r\n legacyHeaders?: boolean;\r\n skipSuccessfulRequests?: boolean;\r\n skipFailedRequests?: boolean;\r\n // Custom key generator (defaults to IP address)\r\n keyGenerator?: (req: any) => string;\r\n // Custom skip function\r\n skip?: (req: any) => boolean;\r\n}\r\n\r\n/**\r\n * Validates rate limit configuration.\r\n * \r\n * @param config - Rate limiting configuration\r\n * @throws Error if configuration is invalid\r\n */\r\nfunction validateRateLimitConfig(config: RateLimitConfig): void {\r\n if (config.windowMs !== undefined && (config.windowMs < 1000 || !Number.isInteger(config.windowMs))) {\r\n throw new Error(\r\n `Invalid rateLimit.windowMs: ${config.windowMs}. Must be an integer >= 1000 (milliseconds)`\r\n );\r\n }\r\n \r\n if (config.max !== undefined && (config.max < 1 || !Number.isInteger(config.max))) {\r\n throw new Error(\r\n `Invalid rateLimit.max: ${config.max}. Must be an integer >= 1`\r\n );\r\n }\r\n}\r\n\r\n/**\r\n * Creates a rate limiter middleware with configurable options.\r\n * \r\n * @param config - Rate limiting configuration\r\n * @returns Express rate limit middleware\r\n * @throws Error if configuration is invalid\r\n */\r\nexport function createRateLimiter(config: RateLimitConfig = {}) {\r\n // Validate configuration\r\n validateRateLimitConfig(config);\r\n \r\n const {\r\n windowMs = 15 * 60 * 1000, // 15 minutes\r\n max = 100, // limit each IP to 100 requests per windowMs\r\n message = \"Too many requests from this IP, please try again later.\",\r\n standardHeaders = true,\r\n legacyHeaders = false,\r\n skipSuccessfulRequests = false,\r\n skipFailedRequests = false,\r\n keyGenerator,\r\n skip,\r\n } = config;\r\n\r\n const limiter = rateLimit({\r\n windowMs,\r\n max,\r\n message: {\r\n error: message,\r\n retryAfter: Math.ceil(windowMs / 1000), // seconds until retry\r\n },\r\n standardHeaders,\r\n legacyHeaders,\r\n skipSuccessfulRequests,\r\n skipFailedRequests,\r\n keyGenerator,\r\n skip,\r\n });\r\n\r\n // Wrap limiter to add logging when rate limit is exceeded\r\n const wrappedLimiter = (req: any, res: any, next: any) => {\r\n limiter(req, res, (err?: any) => {\r\n if (err && res.statusCode === 429) {\r\n // Rate limit exceeded\r\n const ip = req.ip || req.connection?.remoteAddress || \"unknown\";\r\n logger.warn(\"Rate limit exceeded\", {\r\n ip,\r\n path: req.path,\r\n method: req.method,\r\n limit: max,\r\n windowMs,\r\n retryAfter: Math.ceil(windowMs / 1000),\r\n });\r\n }\r\n if (err) {\r\n return next(err);\r\n }\r\n next();\r\n });\r\n };\r\n\r\n // Copy properties from original limiter\r\n Object.setPrototypeOf(wrappedLimiter, limiter);\r\n Object.assign(wrappedLimiter, limiter);\r\n\r\n return wrappedLimiter as typeof limiter;\r\n}\r\n\r\n/**\r\n * Default rate limiter for general API routes.\r\n * Limits: 100 requests per 15 minutes per IP\r\n */\r\nexport const defaultRateLimiter = createRateLimiter({\r\n windowMs: 15 * 60 * 1000, // 15 minutes\r\n max: 100,\r\n message: \"Too many requests from this IP, please try again later.\",\r\n});\r\n\r\n/**\r\n * Strict rate limiter for authentication and sensitive endpoints.\r\n * Limits: 5 requests per 15 minutes per IP\r\n */\r\nexport const strictRateLimiter = createRateLimiter({\r\n windowMs: 15 * 60 * 1000, // 15 minutes\r\n max: 5,\r\n message: \"Too many authentication attempts, please try again later.\",\r\n});\r\n\r\n/**\r\n * Lenient rate limiter for public pages.\r\n * Limits: 200 requests per 15 minutes per IP\r\n */\r\nexport const lenientRateLimiter = createRateLimiter({\r\n windowMs: 15 * 60 * 1000, // 15 minutes\r\n max: 200,\r\n message: \"Too many requests from this IP, please try again later.\",\r\n});\r\n\r\n/**\r\n * Creates a rate limiter using values from ServerConfig.\r\n * Uses apiMax for API routes, or max for general routes.\r\n * \r\n * @param config - ServerConfig rateLimit section\r\n * @param useApiMax - If true, use apiMax instead of max\r\n * @returns Rate limiter middleware or null if rate limiting is disabled\r\n */\r\nexport function createRateLimiterFromConfig(\r\n config: { windowMs?: number; max?: number; apiMax?: number; strictMax?: number } | undefined,\r\n useApiMax: boolean = false\r\n) {\r\n if (!config) return null;\r\n \r\n const max = useApiMax ? (config.apiMax ?? config.max ?? 100) : (config.max ?? 100);\r\n const windowMs = config.windowMs ?? 15 * 60 * 1000;\r\n \r\n return createRateLimiter({\r\n windowMs,\r\n max,\r\n message: `Too many requests from this IP, please try again after ${Math.ceil(windowMs / 1000)} seconds.`,\r\n });\r\n}\r\n\r\n/**\r\n * Creates a strict rate limiter using strictMax from ServerConfig.\r\n * \r\n * @param config - ServerConfig rateLimit section\r\n * @returns Rate limiter middleware or null if rate limiting is disabled\r\n */\r\nexport function createStrictRateLimiterFromConfig(\r\n config: { windowMs?: number; strictMax?: number } | undefined\r\n) {\r\n if (!config || config.strictMax === undefined) {\r\n return strictRateLimiter; // Use default strict limiter\r\n }\r\n \r\n const windowMs = config.windowMs ?? 15 * 60 * 1000;\r\n \r\n return createRateLimiter({\r\n windowMs,\r\n max: config.strictMax,\r\n message: `Too many authentication attempts, please try again after ${Math.ceil(windowMs / 1000)} seconds.`,\r\n });\r\n}\r\n\r\n","import pino from \"pino\";\r\nimport type { Logger as PinoLogger } from \"pino\";\r\nimport type { Request, Response } from \"express\";\r\n\r\nexport type LogLevel = \"fatal\" | \"error\" | \"warn\" | \"info\" | \"debug\" | \"trace\";\r\n\r\nexport interface LoggerContext {\r\n [key: string]: unknown;\r\n}\r\n\r\nexport interface LoggerOptions {\r\n level?: LogLevel;\r\n enabled?: boolean;\r\n pretty?: boolean;\r\n destination?: pino.DestinationStream;\r\n}\r\n\r\n/**\r\n * Creates a Pino logger instance with appropriate configuration for dev/prod.\r\n * \r\n * - Development: Pretty printed with colors via pino-pretty\r\n * - Production: JSON structured output for log aggregation\r\n */\r\nfunction createLogger(options: LoggerOptions = {}): PinoLogger {\r\n const {\r\n level = (process.env.LOG_LEVEL as LogLevel) || (process.env.NODE_ENV === \"development\" ? \"debug\" : \"info\"),\r\n enabled = process.env.LOG_ENABLED !== \"false\",\r\n pretty = process.env.NODE_ENV === \"development\",\r\n destination,\r\n } = options;\r\n\r\n if (!enabled) {\r\n // Return a no-op logger\r\n return pino({ enabled: false });\r\n }\r\n\r\n const baseConfig: pino.LoggerOptions = {\r\n level,\r\n base: {\r\n name: \"@lolyjs/core\",\r\n env: process.env.NODE_ENV || \"development\",\r\n },\r\n timestamp: pino.stdTimeFunctions.isoTime,\r\n formatters: {\r\n level: (label) => {\r\n return { level: label };\r\n },\r\n },\r\n };\r\n\r\n // In development, use pino-pretty for colored, human-readable output\r\n if (pretty && !destination) {\r\n try {\r\n // Dynamic import to avoid bundling pino-pretty in production\r\n const pinoPretty = require(\"pino-pretty\");\r\n return pino(\r\n baseConfig,\r\n pinoPretty({\r\n colorize: true,\r\n translateTime: \"HH:MM:ss Z\",\r\n ignore: \"pid,hostname\",\r\n singleLine: false,\r\n messageFormat: \"[{module}] {msg}\",\r\n })\r\n );\r\n } catch (e) {\r\n // Fallback if pino-pretty is not available\r\n console.warn(\"[logger] pino-pretty not available, using default formatter\");\r\n }\r\n }\r\n\r\n // Production: structured JSON logging\r\n return destination ? pino(baseConfig, destination) : pino(baseConfig);\r\n}\r\n\r\n// Singleton logger instance\r\nlet loggerInstance: PinoLogger | null = null;\r\n\r\n/**\r\n * Gets or creates the singleton logger instance.\r\n */\r\nexport function getLogger(options?: LoggerOptions): PinoLogger {\r\n if (!loggerInstance) {\r\n loggerInstance = createLogger(options);\r\n }\r\n return loggerInstance;\r\n}\r\n\r\n/**\r\n * Sets a custom logger instance (useful for testing or custom configuration).\r\n */\r\nexport function setLogger(customLogger: PinoLogger): void {\r\n loggerInstance = customLogger;\r\n}\r\n\r\n/**\r\n * Resets the logger instance (useful for testing).\r\n */\r\nexport function resetLogger(): void {\r\n loggerInstance = null;\r\n}\r\n\r\n/**\r\n * Logger class wrapper for easier usage with context.\r\n */\r\nexport class Logger {\r\n private pino: PinoLogger;\r\n private context: LoggerContext;\r\n\r\n constructor(logger?: PinoLogger, context: LoggerContext = {}) {\r\n this.pino = logger || getLogger();\r\n this.context = context;\r\n }\r\n\r\n /**\r\n * Creates a child logger with additional context.\r\n */\r\n child(context: LoggerContext): Logger {\r\n return new Logger(this.pino.child(context), { ...this.context, ...context });\r\n }\r\n\r\n /**\r\n * Logs a fatal error (application should terminate).\r\n */\r\n fatal(message: string, context?: LoggerContext): void {\r\n this.pino.fatal({ ...this.context, ...context }, message);\r\n }\r\n\r\n /**\r\n * Logs an error.\r\n */\r\n error(message: string, error?: Error | unknown, context?: LoggerContext): void {\r\n const errorContext: LoggerContext = { ...this.context, ...context };\r\n \r\n if (error instanceof Error) {\r\n errorContext.error = {\r\n name: error.name,\r\n message: error.message,\r\n stack: error.stack,\r\n };\r\n } else if (error) {\r\n errorContext.error = error;\r\n }\r\n\r\n this.pino.error(errorContext, message);\r\n }\r\n\r\n /**\r\n * Logs a warning.\r\n */\r\n warn(message: string, context?: LoggerContext): void {\r\n this.pino.warn({ ...this.context, ...context }, message);\r\n }\r\n\r\n /**\r\n * Logs informational message.\r\n */\r\n info(message: string, context?: LoggerContext): void {\r\n this.pino.info({ ...this.context, ...context }, message);\r\n }\r\n\r\n /**\r\n * Logs a debug message (only in development or when level is debug).\r\n */\r\n debug(message: string, context?: LoggerContext): void {\r\n this.pino.debug({ ...this.context, ...context }, message);\r\n }\r\n\r\n /**\r\n * Logs a trace message (most verbose).\r\n */\r\n trace(message: string, context?: LoggerContext): void {\r\n this.pino.trace({ ...this.context, ...context }, message);\r\n }\r\n}\r\n\r\n/**\r\n * Default logger instance.\r\n */\r\nexport const logger = new Logger();\r\n\r\n/**\r\n * Creates a logger for a specific module/component.\r\n */\r\nexport function createModuleLogger(module: string, context?: LoggerContext): Logger {\r\n return logger.child({ module, ...context });\r\n}\r\n\r\n/**\r\n * Generates a unique request ID for request tracking.\r\n */\r\nexport function generateRequestId(): string {\r\n return `${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;\r\n}\r\n\r\n/**\r\n * Default paths to ignore from request logging (static assets, favicon, etc.)\r\n */\r\nconst DEFAULT_IGNORED_PATHS = [\r\n /^\\/static\\//, // Static assets\r\n /^\\/favicon\\.ico$/i, // Favicon\r\n /^\\/_next\\//, // Next.js internals (if used)\r\n /^\\/\\.well-known\\//, // Well-known paths\r\n /^\\/__webpack/, // Webpack dev server\r\n /^\\/sockjs-node/, // Hot reload websocket\r\n];\r\n\r\n/**\r\n * Checks if a path should be ignored from logging.\r\n */\r\nfunction shouldIgnorePath(path: string, ignoredPaths: (string | RegExp)[]): boolean {\r\n return ignoredPaths.some(pattern => {\r\n if (typeof pattern === \"string\") {\r\n return path === pattern || path.startsWith(pattern);\r\n }\r\n return pattern.test(path);\r\n });\r\n}\r\n\r\n/**\r\n * Express middleware for request logging.\r\n * Adds request ID to res.locals and logs incoming requests.\r\n */\r\nexport function requestLoggerMiddleware(options: {\r\n logger?: Logger;\r\n logRequests?: boolean;\r\n logResponses?: boolean;\r\n ignorePaths?: (string | RegExp)[];\r\n logStaticAssets?: boolean;\r\n} = {}) {\r\n const {\r\n logger: customLogger = logger,\r\n logRequests = true,\r\n logResponses = true,\r\n ignorePaths = DEFAULT_IGNORED_PATHS,\r\n logStaticAssets = false,\r\n } = options;\r\n\r\n return (req: Request, res: Response, next: () => void): void => {\r\n // Generate or use existing request ID\r\n const requestId = (req.headers[\"x-request-id\"] as string) || generateRequestId();\r\n (res.locals as any).requestId = requestId;\r\n\r\n // Add request ID to response headers\r\n res.setHeader(\"X-Request-ID\", requestId);\r\n\r\n // Check if we should ignore this path\r\n const shouldIgnore = !logStaticAssets && shouldIgnorePath(req.path, ignorePaths);\r\n\r\n // Create request-scoped logger (always available for handlers, minimal context to avoid duplication)\r\n const reqLogger = customLogger.child({\r\n requestId,\r\n method: req.method,\r\n path: req.path,\r\n });\r\n\r\n // Store logger in request for use in handlers (always available)\r\n (req as any).logger = reqLogger;\r\n\r\n // Log incoming request (only if not ignored and enabled)\r\n if (logRequests && !shouldIgnore) {\r\n reqLogger.debug(`${req.method} ${req.path}`, {\r\n query: Object.keys(req.query).length > 0 ? req.query : undefined,\r\n });\r\n }\r\n\r\n // Log response when finished (only if not ignored)\r\n if (logResponses && !shouldIgnore) {\r\n const startTime = Date.now();\r\n \r\n res.on(\"finish\", () => {\r\n const duration = Date.now() - startTime;\r\n \r\n // By default, only log errors and warnings (not successful 2xx requests)\r\n if (res.statusCode >= 500) {\r\n reqLogger.error(`${req.method} ${req.path} ${res.statusCode}`, {\r\n statusCode: res.statusCode,\r\n duration: `${duration}ms`,\r\n });\r\n } else if (res.statusCode >= 400) {\r\n reqLogger.warn(`${req.method} ${req.path} ${res.statusCode}`, {\r\n statusCode: res.statusCode,\r\n duration: `${duration}ms`,\r\n });\r\n }\r\n // 2xx requests are not logged by default to reduce noise\r\n });\r\n }\r\n\r\n next();\r\n };\r\n}\r\n\r\n/**\r\n * Gets the logger from the request object (set by requestLoggerMiddleware).\r\n */\r\nexport function getRequestLogger(req: Request): Logger {\r\n return (req as any).logger || logger.child({ requestId: \"unknown\" });\r\n}\r\n\r\n","import { ApiRoute } from \"@router/index.types\";\nimport { strictRateLimiter, defaultRateLimiter, lenientRateLimiter, createStrictRateLimiterFromConfig } from \"./rate-limit\";\n\n/**\n * Determines if a route path matches any of the strict patterns.\n * \n * @param path - Route path to check\n * @param patterns - Array of patterns to match against\n * @returns True if path matches any pattern\n */\nexport function matchesStrictPattern(\n path: string,\n patterns: string[]\n): boolean {\n for (const pattern of patterns) {\n // Convert pattern to regex\n // ** matches any path segment\n // * matches single path segment\n const regexPattern = pattern\n .replace(/\\*\\*/g, \".*\") // ** -> .*\n .replace(/\\*/g, \"[^/]*\") // * -> [^/]*\n .replace(/\\//g, \"\\\\/\"); // / -> \\/\n\n const regex = new RegExp(`^${regexPattern}$`);\n if (regex.test(path)) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Checks if a middleware is a rate limiter.\n * \n * @param mw - Middleware to check\n * @returns True if middleware is a rate limiter\n */\nfunction isRateLimiter(mw: any): boolean {\n if (!mw) return false;\n \n // Check if it's one of our known rate limiters\n if (mw === strictRateLimiter || mw === defaultRateLimiter || mw === lenientRateLimiter) {\n return true;\n }\n \n // Check for express-rate-limit signature\n // Rate limiters from express-rate-limit have specific properties\n if (typeof mw === 'function' && mw.name && mw.name.includes('rateLimit')) {\n return true;\n }\n \n // Check if middleware function has rate limit properties\n if (mw && typeof mw === 'function' && (mw as any).skip || (mw as any).resetKey) {\n return true;\n }\n \n return false;\n}\n\n/**\n * Gets the appropriate rate limiter for a route based on configuration.\n * \n * @param route - API route\n * @param strictPatterns - Patterns that should use strict rate limiting\n * @param rateLimitConfig - Optional rate limit configuration from ServerConfig\n * @returns Rate limiter middleware or null if route already has rate limiting\n */\nexport function getAutoRateLimiter(\n route: ApiRoute,\n strictPatterns: string[] = [],\n rateLimitConfig?: { windowMs?: number; strictMax?: number }\n): any | null {\n // If route already has rate limiting middleware, don't add another\n const hasRateLimiter = route.middlewares?.some(isRateLimiter) ||\n Object.values(route.methodMiddlewares || {}).some((mws: any[]) => \n mws?.some(isRateLimiter)\n );\n\n if (hasRateLimiter) {\n return null; // Route already has rate limiting\n }\n\n // Check if route matches strict patterns\n if (strictPatterns.length > 0 && matchesStrictPattern(route.pattern, strictPatterns)) {\n // Use config-based strict limiter if config provided, otherwise use default\n const limiter = rateLimitConfig \n ? createStrictRateLimiterFromConfig(rateLimitConfig)\n : strictRateLimiter;\n \n return limiter;\n }\n\n // Default: no auto rate limiting (global rate limiter already applied)\n return null;\n}\n\n","import { Request, Response } from \"express\";\r\nimport { ApiContext, ApiRoute, matchApiRoute } from \"@router/index\";\r\nimport { sanitizeParams, sanitizeQuery } from \"@security/sanitize\";\r\nimport { getAutoRateLimiter } from \"@server/middleware/auto-rate-limit\";\r\nimport { getRequestLogger, createModuleLogger } from \"@logger/index\";\r\n\r\nexport interface HandleApiRequestOptions {\r\n apiRoutes: ApiRoute[];\r\n urlPath: string;\r\n req: Request;\r\n res: Response;\r\n env?: \"dev\" | \"prod\";\r\n strictRateLimitPatterns?: string[];\r\n rateLimitConfig?: { windowMs?: number; strictMax?: number };\r\n}\r\n\r\n/**\r\n * Handles an API route request.\r\n * Unifies logic between dev and prod.\r\n *\r\n * @param options - Request handling options\r\n */\r\nexport async function handleApiRequest(\r\n options: HandleApiRequestOptions\r\n): Promise<void> {\r\n const { apiRoutes, urlPath, req, res, env = \"dev\" } = options;\r\n\r\n const matched = matchApiRoute(apiRoutes, urlPath);\r\n\r\n if (!matched) {\r\n res.status(404).json({ error: \"Not Found\" });\r\n return;\r\n }\r\n\r\n const { route, params } = matched;\r\n const method = req.method.toUpperCase();\r\n const handler = route.handlers[method];\r\n\r\n if (!handler) {\r\n res.setHeader(\"Allow\", Object.keys(route.handlers).join(\", \"));\r\n res.status(405).json({ error: \"Method Not Allowed\" });\r\n return;\r\n }\r\n\r\n // Security: Sanitize route parameters and query parameters\r\n const sanitizedParams = sanitizeParams(params);\r\n const sanitizedQuery = sanitizeQuery(req.query as Record<string, any>);\r\n\r\n const ctx: ApiContext = {\r\n req,\r\n res,\r\n Response: (body: any = {}, status = 200) => res.status(status).json(body),\r\n NotFound: (body: any = {}) => res.status(404).json(body),\r\n params: sanitizedParams,\r\n pathname: urlPath,\r\n locals: {},\r\n };\r\n\r\n // Update req.query with sanitized values\r\n req.query = sanitizedQuery as any;\r\n\r\n try {\r\n // Auto-apply rate limiting if route matches strict patterns and doesn't already have one\r\n const autoRateLimiter = getAutoRateLimiter(\r\n route,\r\n options.strictRateLimitPatterns,\r\n options.rateLimitConfig\r\n );\r\n \r\n const reqLogger = getRequestLogger(req);\r\n \r\n if (autoRateLimiter) {\r\n reqLogger.debug(\"Auto rate limiter applied\", {\r\n route: route.pattern,\r\n patterns: options.strictRateLimitPatterns,\r\n });\r\n }\r\n\r\n const globalMws = route.middlewares ?? [];\r\n const perMethodMws = route.methodMiddlewares?.[method] ?? [];\r\n \r\n // Prepend auto rate limiter if applicable\r\n const chain = autoRateLimiter \r\n ? [autoRateLimiter, ...globalMws, ...perMethodMws]\r\n : [...globalMws, ...perMethodMws];\r\n\r\n for (let i = 0; i < chain.length; i++) {\r\n const mw = chain[i];\r\n \r\n // Validate middleware is a function\r\n if (typeof mw !== 'function') {\r\n reqLogger.warn(\"Invalid middleware in chain\", {\r\n route: route.pattern,\r\n method,\r\n middlewareIndex: i,\r\n middlewareType: typeof mw,\r\n });\r\n continue;\r\n }\r\n \r\n try {\r\n // Check if this is an express-rate-limit middleware (expects req, res, next)\r\n // express-rate-limit middlewares have specific properties\r\n const isExpressRateLimit = \r\n (mw as any).skip || (mw as any).resetKey || mw.name?.includes('rateLimit');\r\n \r\n if (isExpressRateLimit) {\r\n // Call express-rate-limit middleware with (req, res, next)\r\n await new Promise<void>((resolve, reject) => {\r\n const next = (err?: any) => {\r\n if (err) reject(err);\r\n else resolve();\r\n };\r\n try {\r\n const result = mw(req, res, next);\r\n // If it returns a promise, wait for it\r\n if (result && typeof result.then === 'function') {\r\n result.then(() => resolve()).catch(reject);\r\n }\r\n } catch (err) {\r\n reject(err);\r\n }\r\n });\r\n } else {\r\n // Call framework middleware with (ctx, next)\r\n await Promise.resolve(mw(ctx, async () => {}));\r\n }\r\n } catch (error) {\r\n reqLogger.error(\"API middleware failed\", error instanceof Error ? error : new Error(String(error)), {\r\n route: route.pattern,\r\n method,\r\n middlewareIndex: i,\r\n middlewareName: mw.name || 'anonymous',\r\n });\r\n \r\n // Re-throw to be handled by error handler\r\n throw error;\r\n }\r\n \r\n if (res.headersSent) {\r\n return;\r\n }\r\n }\r\n\r\n await handler(ctx);\r\n } catch (err) {\r\n const reqLogger = getRequestLogger(req);\r\n reqLogger.error(\"API handler error\", err, {\r\n route: route.pattern,\r\n method,\r\n env,\r\n });\r\n if (!res.headersSent) {\r\n res.status(500).json({ error: \"Internal Server Error\" });\r\n }\r\n }\r\n}\r\n","import { Request, Response } from \"express\";\r\nimport { renderToPipeableStream } from \"react-dom/server\";\r\nimport {\r\n ServerContext,\r\n LoadedRoute,\r\n LoaderResult,\r\n matchRoute,\r\n} from \"@router/index\";\r\nimport {\r\n buildAppTree,\r\n buildInitialData,\r\n createDocumentTree,\r\n buildRouterData,\r\n} from \"@rendering/index\";\r\nimport { runRouteMiddlewares } from \"./middleware\";\r\nimport { runRouteServerHook } from \"./server-hook\";\r\nimport { handleDataResponse, handleRedirect, handleNotFound } from \"./response\";\r\nimport { tryServeSsgHtml, tryServeSsgData } from \"./ssg\";\r\nimport { ERROR_CHUNK_KEY, STATIC_PATH } from \"@constants/globals\";\r\nimport { getClientJsPath, getClientCssPath, loadAssetManifest } from \"@build/utils\";\r\nimport { sanitizeParams } from \"@security/sanitize\";\r\nimport { getRequestLogger } from \"@logger/index\";\r\nimport path from \"path\";\r\nimport type { PageMetadata } from \"@router/index\";\r\n\r\n/**\r\n * Merges two PageMetadata objects.\r\n * The second metadata (newer) overrides the first (older).\r\n * For nested objects like openGraph and twitter, we do a shallow merge.\r\n * Arrays like metaTags and links are replaced entirely (not merged).\r\n * \r\n * @param base - Base metadata (from layout, can be null)\r\n * @param override - Override metadata (from page or more specific layout, can be null)\r\n * @returns Combined metadata or null if both are null\r\n */\r\nexport function mergeMetadata(\r\n base: PageMetadata | null,\r\n override: PageMetadata | null\r\n): PageMetadata | null {\r\n if (!base && !override) return null;\r\n if (!base) return override;\r\n if (!override) return base;\r\n\r\n return {\r\n // Simple fields: override wins\r\n title: override.title ?? base.title,\r\n description: override.description ?? base.description,\r\n lang: override.lang ?? base.lang,\r\n canonical: override.canonical ?? base.canonical,\r\n robots: override.robots ?? base.robots,\r\n themeColor: override.themeColor ?? base.themeColor,\r\n viewport: override.viewport ?? base.viewport,\r\n \r\n // Nested objects: shallow merge (override wins for each field)\r\n openGraph: override.openGraph\r\n ? {\r\n ...base.openGraph,\r\n ...override.openGraph,\r\n // For image, if override has image, use it entirely (don't merge)\r\n image: override.openGraph.image ?? base.openGraph?.image,\r\n }\r\n : base.openGraph,\r\n \r\n twitter: override.twitter\r\n ? {\r\n ...base.twitter,\r\n ...override.twitter,\r\n }\r\n : base.twitter,\r\n \r\n // Arrays: override replaces base entirely (not merged)\r\n metaTags: override.metaTags ?? base.metaTags,\r\n links: override.links ?? base.links,\r\n };\r\n}\r\n\r\nexport interface HandlePageRequestOptions {\r\n routes: LoadedRoute[];\r\n notFoundPage: LoadedRoute | null;\r\n errorPage: LoadedRoute | null;\r\n routeChunks: Record<string, string>;\r\n urlPath: string;\r\n req: Request;\r\n res: Response;\r\n env?: \"dev\" | \"prod\";\r\n ssgOutDir?: string;\r\n theme?: string;\r\n projectRoot?: string;\r\n}\r\n\r\n/**\r\n * Determines if a request is a data request (JSON).\r\n *\r\n * @param req - Express request object\r\n * @returns True if the request is a data request\r\n */\r\nexport function isDataRequest(req: Request): boolean {\r\n return (\r\n (req.query && (req.query as any).__fw_data === \"1\") ||\r\n req.headers[\"x-fw-data\"] === \"1\"\r\n );\r\n}\r\n\r\n/**\r\n * Handles a page route request.\r\n * Unifies logic between dev and prod (with SSG support in prod).\r\n *\r\n * @param options - Request handling options\r\n */\r\nexport async function handlePageRequest(\r\n options: HandlePageRequestOptions\r\n): Promise<void> {\r\n try {\r\n await handlePageRequestInternal(options);\r\n } catch (error) {\r\n const { errorPage, req, res, routeChunks, theme, projectRoot } = options;\r\n const reqLogger = getRequestLogger(req);\r\n \r\n if (errorPage) {\r\n await renderErrorPageWithStream(errorPage, req, res, error, routeChunks || {}, theme, projectRoot, options.env);\r\n } else {\r\n reqLogger.error(\"Unhandled error in page request\", error, {\r\n urlPath: options.urlPath,\r\n hasErrorPage: !!errorPage,\r\n });\r\n if (!res.headersSent) {\r\n res.statusCode = 500;\r\n res.setHeader(\"Content-Type\", \"text/html; charset=utf-8\");\r\n res.end(\"<!doctype html><h1>Internal Server Error</h1>\");\r\n }\r\n }\r\n }\r\n}\r\n\r\nasync function handlePageRequestInternal(\r\n options: HandlePageRequestOptions\r\n): Promise<void> {\r\n const {\r\n routes,\r\n notFoundPage,\r\n errorPage,\r\n routeChunks,\r\n urlPath,\r\n req,\r\n res,\r\n env = \"dev\",\r\n ssgOutDir,\r\n theme,\r\n projectRoot,\r\n } = options;\r\n\r\n // Get asset paths - in dev, always use non-hashed names; in prod, use manifest if available\r\n const clientJsPath = env === \"dev\" \r\n ? \"/static/client.js\" \r\n : (projectRoot ? getClientJsPath(projectRoot) : \"/static/client.js\");\r\n const clientCssPath = env === \"dev\"\r\n ? \"/static/client.css\"\r\n : (projectRoot ? getClientCssPath(projectRoot) : \"/static/client.css\");\r\n const assetManifest = env === \"prod\" && projectRoot ? loadAssetManifest(projectRoot) : null;\r\n\r\n const isDataReq = isDataRequest(req);\r\n \r\n // Check if client wants to skip layout hooks execution (SPA navigation optimization)\r\n // Only skip for data requests, never for HTML requests (initial load)\r\n const skipLayoutHooks = isDataReq && req.headers[\"x-skip-layout-hooks\"] === \"true\";\r\n\r\n if (env === \"prod\" && ssgOutDir) {\r\n if (isDataReq) {\r\n if (tryServeSsgData(res, ssgOutDir, urlPath)) {\r\n return;\r\n }\r\n } else {\r\n if (tryServeSsgHtml(res, ssgOutDir, urlPath)) {\r\n return;\r\n }\r\n }\r\n }\r\n\r\n const matched = matchRoute(routes, urlPath);\r\n\r\n const routerData = buildRouterData(req);\r\n\r\n if (!matched) {\r\n if (notFoundPage) {\r\n const ctx: ServerContext & { theme?: string } = {\r\n req,\r\n res,\r\n params: {},\r\n pathname: urlPath,\r\n locals: {},\r\n };\r\n\r\n // Execute layout server hooks and combine props (skip if header is set)\r\n const layoutProps: Record<string, any> = {};\r\n if (!skipLayoutHooks && notFoundPage.layoutServerHooks && notFoundPage.layoutServerHooks.length > 0) {\r\n for (let i = 0; i < notFoundPage.layoutServerHooks.length; i++) {\r\n const layoutServerHook = notFoundPage.layoutServerHooks[i];\r\n const layoutMiddlewares = notFoundPage.layoutMiddlewares?.[i] || [];\r\n \r\n // Execute layout middlewares before layout hook\r\n if (layoutMiddlewares.length > 0) {\r\n for (const mw of layoutMiddlewares) {\r\n try {\r\n await Promise.resolve(\r\n mw(ctx, async () => {\r\n /* no-op */\r\n })\r\n );\r\n } catch (error) {\r\n const reqLogger = getRequestLogger(req);\r\n const layoutFile = notFoundPage.layoutFiles[i];\r\n const relativeLayoutPath = layoutFile\r\n ? path.relative(projectRoot || process.cwd(), layoutFile)\r\n : \"unknown\";\r\n \r\n reqLogger.error(\"Layout middleware failed for not-found page\", error instanceof Error ? error : new Error(String(error)), {\r\n layoutIndex: i,\r\n layoutFile: relativeLayoutPath,\r\n });\r\n \r\n throw error;\r\n }\r\n \r\n if (ctx.res.headersSent) {\r\n return;\r\n }\r\n }\r\n }\r\n \r\n if (layoutServerHook) {\r\n try {\r\n const layoutResult = await layoutServerHook(ctx);\r\n if (layoutResult.props) {\r\n Object.assign(layoutProps, layoutResult.props);\r\n }\r\n } catch (error) {\r\n // Log but continue\r\n const reqLogger = getRequestLogger(req);\r\n const layoutFile = notFoundPage.layoutFiles[i];\r\n const relativeLayoutPath = layoutFile\r\n ? path.relative(projectRoot || process.cwd(), layoutFile)\r\n : \"unknown\";\r\n \r\n reqLogger.warn(\"Layout server hook failed for not-found page\", {\r\n error: error instanceof Error ? error.message : String(error),\r\n stack: error instanceof Error ? error.stack : undefined,\r\n layoutFile: relativeLayoutPath,\r\n layoutIndex: i,\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n let loaderResult = await runRouteServerHook(notFoundPage, ctx);\r\n // Automatically inject theme from server into loaderResult if not already set\r\n if (!loaderResult.theme) {\r\n loaderResult.theme = theme;\r\n }\r\n \r\n // Combine props: layout props + page props\r\n const combinedProps = {\r\n ...layoutProps,\r\n ...(loaderResult.props || {}),\r\n };\r\n const combinedLoaderResult: LoaderResult = {\r\n ...loaderResult,\r\n props: combinedProps,\r\n };\r\n\r\n // Handle data requests for notFound\r\n if (isDataReq) {\r\n const pagePropsOnly = loaderResult.props || {};\r\n handleDataResponse(\r\n res,\r\n combinedLoaderResult,\r\n theme,\r\n skipLayoutHooks ? null : (Object.keys(layoutProps).length > 0 ? layoutProps : null),\r\n pagePropsOnly\r\n );\r\n return;\r\n }\r\n \r\n const initialData = buildInitialData(urlPath, {}, combinedLoaderResult);\r\n const appTree = buildAppTree(notFoundPage, {}, initialData.props);\r\n initialData.notFound = true;\r\n \r\n // Get nonce from res.locals (set by Helmet for CSP)\r\n const nonce = (res.locals as any).nonce || undefined;\r\n\r\n // Get entrypoint files in order for preload\r\n const entrypointFiles: string[] = [];\r\n if (assetManifest?.entrypoints?.client) {\r\n entrypointFiles.push(...assetManifest.entrypoints.client.map(file => `${STATIC_PATH}/${file}`));\r\n }\r\n\r\n const documentTree = createDocumentTree({\r\n appTree,\r\n initialData,\r\n routerData,\r\n meta: combinedLoaderResult.metadata ?? null,\r\n titleFallback: \"Not found\",\r\n descriptionFallback: \"Loly demo\",\r\n chunkHref: null,\r\n entrypointFiles,\r\n theme,\r\n clientJsPath,\r\n clientCssPath,\r\n nonce,\r\n });\r\n \r\n let didError = false;\r\n \r\n const { pipe, abort } = renderToPipeableStream(documentTree, {\r\n onShellReady() {\r\n if (didError || res.headersSent) return;\r\n \r\n res.statusCode = 404;\r\n res.setHeader(\"Content-Type\", \"text/html; charset=utf-8\");\r\n pipe(res);\r\n },\r\n onShellError(err) {\r\n didError = true;\r\n const reqLogger = getRequestLogger(req);\r\n reqLogger.error(\"SSR shell error\", err, { route: \"not-found\" });\r\n if (!res.headersSent && errorPage) {\r\n renderErrorPageWithStream(errorPage, req, res, err, routeChunks, theme, projectRoot, env);\r\n } else if (!res.headersSent) {\r\n res.statusCode = 500;\r\n res.setHeader(\"Content-Type\", \"text/html; charset=utf-8\");\r\n res.end(\"<!doctype html><h1>Internal Server Error</h1>\");\r\n }\r\n abort();\r\n },\r\n onError(err) {\r\n didError = true;\r\n const reqLogger = getRequestLogger(req);\r\n reqLogger.error(\"SSR error\", err, { route: \"not-found\" });\r\n },\r\n });\r\n \r\n req.on(\"close\", () => abort());\r\n return;\r\n }\r\n\r\n handleNotFound(res, urlPath);\r\n return;\r\n }\r\n\r\n const { route, params } = matched;\r\n\r\n // Security: Sanitize route parameters\r\n const sanitizedParams = sanitizeParams(params);\r\n\r\n const ctx: ServerContext = {\r\n req,\r\n res,\r\n params: sanitizedParams,\r\n pathname: urlPath,\r\n locals: {},\r\n };\r\n\r\n await runRouteMiddlewares(route, ctx);\r\n if (res.headersSent) {\r\n return;\r\n }\r\n\r\n // 1. Execute layout server hooks (root → specific) and collect props + metadata\r\n // Skip layout hooks if client requested it (SPA navigation optimization)\r\n const layoutProps: Record<string, any> = {};\r\n const layoutMetadata: Array<LoaderResult[\"metadata\"]> = [];\r\n const reqLogger = getRequestLogger(req);\r\n\r\n if (!skipLayoutHooks && route.layoutServerHooks && route.layoutServerHooks.length > 0) {\r\n for (let i = 0; i < route.layoutServerHooks.length; i++) {\r\n const layoutServerHook = route.layoutServerHooks[i];\r\n const layoutMiddlewares = route.layoutMiddlewares?.[i] || [];\r\n \r\n // Execute layout middlewares before layout hook\r\n if (layoutMiddlewares.length > 0) {\r\n for (const mw of layoutMiddlewares) {\r\n try {\r\n await Promise.resolve(\r\n mw(ctx, async () => {\r\n /* no-op */\r\n })\r\n );\r\n } catch (error) {\r\n const layoutFile = route.layoutFiles[i];\r\n const relativeLayoutPath = layoutFile\r\n ? path.relative(projectRoot || process.cwd(), layoutFile)\r\n : \"unknown\";\r\n \r\n reqLogger.error(\"Layout middleware failed\", error instanceof Error ? error : new Error(String(error)), {\r\n route: route.pattern,\r\n layoutIndex: i,\r\n layoutFile: relativeLayoutPath,\r\n });\r\n \r\n // Re-throw to be handled by the route handler\r\n throw error;\r\n }\r\n \r\n // Stop executing if response was sent (e.g., redirect)\r\n if (ctx.res.headersSent) {\r\n return;\r\n }\r\n }\r\n }\r\n \r\n if (layoutServerHook) {\r\n try {\r\n const layoutResult = await layoutServerHook(ctx);\r\n // Merge props (more specific layouts override general ones)\r\n if (layoutResult.props) {\r\n Object.assign(layoutProps, layoutResult.props);\r\n }\r\n // Collect metadata from layouts (will be merged later)\r\n if (layoutResult.metadata) {\r\n layoutMetadata.push(layoutResult.metadata);\r\n }\r\n } catch (error) {\r\n // Log error but continue (layout server hook failure shouldn't break the page)\r\n const layoutFile = route.layoutFiles[i];\r\n const relativeLayoutPath = layoutFile\r\n ? path.relative(projectRoot || process.cwd(), layoutFile)\r\n : \"unknown\";\r\n \r\n reqLogger.warn(\"Layout server hook failed\", {\r\n error: error instanceof Error ? error.message : String(error),\r\n stack: error instanceof Error ? error.stack : undefined,\r\n layoutFile: relativeLayoutPath,\r\n route: route.pattern,\r\n layoutIndex: i,\r\n suggestion: \"Check your layout.server.hook.ts file for errors\",\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n // 2. Execute page server hook (getServerSideProps)\r\n let loaderResult: LoaderResult;\r\n try {\r\n loaderResult = await runRouteServerHook(route, ctx);\r\n // Automatically inject theme from server into loaderResult if not already set\r\n if (!loaderResult.theme) {\r\n loaderResult.theme = theme;\r\n }\r\n } catch (error) {\r\n // Log detailed error information\r\n const relativePagePath = route.pageFile\r\n ? path.relative(projectRoot || process.cwd(), route.pageFile)\r\n : \"unknown\";\r\n \r\n reqLogger.error(\"Page server hook failed\", {\r\n error: error instanceof Error ? error.message : String(error),\r\n stack: error instanceof Error ? error.stack : undefined,\r\n pageFile: relativePagePath,\r\n route: route.pattern,\r\n pathname: urlPath,\r\n suggestion: \"Check your page.server.hook.ts (or server.hook.ts) file for errors\",\r\n });\r\n \r\n // If loader throws, handle error appropriately\r\n if (isDataReq) {\r\n // For data requests, return error JSON with more context\r\n res.statusCode = 500;\r\n res.setHeader(\"Content-Type\", \"application/json; charset=utf-8\");\r\n const errorResponse = {\r\n error: true,\r\n message: error instanceof Error ? error.message : String(error),\r\n route: route.pattern,\r\n pageFile: relativePagePath,\r\n };\r\n res.end(JSON.stringify(errorResponse, null, 2));\r\n return;\r\n } else {\r\n // For HTML requests, render error page\r\n if (errorPage) {\r\n await renderErrorPageWithStream(errorPage, req, res, error, routeChunks, theme, projectRoot, env);\r\n return;\r\n } else {\r\n throw error; // Re-throw to be caught by outer try-catch\r\n }\r\n }\r\n }\r\n\r\n // 3. Combine props: layout props (stable) + page props (page overrides layout)\r\n // This must be done before checking for redirect/notFound to ensure data requests get combined props\r\n const combinedProps = {\r\n ...layoutProps, // Props from layouts (stable)\r\n ...(loaderResult.props || {}), // Props from page (overrides layout)\r\n };\r\n\r\n // 4. Combine metadata: layout metadata (base) + page metadata (page overrides layout)\r\n // Layout metadata provides defaults (like site-wide Open Graph, canonical base, etc.)\r\n // Page metadata can override specific fields or add page-specific data\r\n let combinedMetadata: LoaderResult[\"metadata\"] = null;\r\n \r\n // Start with layout metadata (most general first, then more specific)\r\n // Later layouts override earlier ones, then page overrides all\r\n for (const layoutMeta of layoutMetadata) {\r\n if (layoutMeta) {\r\n combinedMetadata = mergeMetadata(combinedMetadata, layoutMeta);\r\n }\r\n }\r\n \r\n // Finally, page metadata overrides everything\r\n if (loaderResult.metadata) {\r\n combinedMetadata = mergeMetadata(combinedMetadata, loaderResult.metadata);\r\n }\r\n\r\n // Use combined props and metadata in loaderResult\r\n const combinedLoaderResult: LoaderResult = {\r\n ...loaderResult,\r\n props: combinedProps,\r\n metadata: combinedMetadata,\r\n };\r\n\r\n if (isDataReq) {\r\n // For data requests, pass separated props:\r\n // - layoutProps: only if layout hooks were executed (not skipped)\r\n // - pageProps: always (from page.server.hook)\r\n const pagePropsOnly = loaderResult.props || {};\r\n handleDataResponse(\r\n res,\r\n combinedLoaderResult,\r\n theme,\r\n skipLayoutHooks ? null : (Object.keys(layoutProps).length > 0 ? layoutProps : null),\r\n pagePropsOnly\r\n );\r\n return;\r\n }\r\n\r\n if (loaderResult.redirect) {\r\n handleRedirect(res, loaderResult.redirect);\r\n return;\r\n }\r\n\r\n if (loaderResult.notFound) {\r\n if (isDataReq) {\r\n res.status(200).json({ notFound: true });\r\n } else {\r\n handleNotFound(res, urlPath);\r\n }\r\n return;\r\n }\r\n\r\n const initialData = buildInitialData(urlPath, params, combinedLoaderResult);\r\n const appTree = buildAppTree(route, params, initialData.props);\r\n\r\n // Get chunk href with hash if available\r\n const chunkName = routeChunks[route.pattern];\r\n let chunkHref: string | null = null;\r\n if (chunkName != null) {\r\n if (assetManifest && assetManifest.chunks[chunkName]) {\r\n // Use hashed filename from manifest\r\n chunkHref = `${STATIC_PATH}/${assetManifest.chunks[chunkName]}`;\r\n } else {\r\n // Fallback to non-hashed filename\r\n chunkHref = `${STATIC_PATH}/${chunkName}.js`;\r\n }\r\n }\r\n\r\n // Get nonce from res.locals (set by Helmet for CSP)\r\n const nonce = (res.locals as any).nonce || undefined;\r\n\r\n // Get entrypoint files in order (runtime, vendor, commons, entry) for preload\r\n const entrypointFiles: string[] = [];\r\n if (assetManifest?.entrypoints?.client) {\r\n entrypointFiles.push(...assetManifest.entrypoints.client.map(file => `${STATIC_PATH}/${file}`));\r\n }\r\n\r\n const documentTree = createDocumentTree({\r\n appTree,\r\n initialData,\r\n routerData,\r\n meta: combinedLoaderResult.metadata,\r\n titleFallback: \"Loly framework\",\r\n descriptionFallback: \"Loly demo\",\r\n chunkHref,\r\n entrypointFiles,\r\n theme,\r\n clientJsPath,\r\n clientCssPath,\r\n nonce,\r\n });\r\n\r\n let didError = false;\r\n\r\n const { pipe, abort } = renderToPipeableStream(documentTree, {\r\n onShellReady() {\r\n if (didError || res.headersSent) {\r\n return;\r\n }\r\n\r\n res.statusCode = 200;\r\n res.setHeader(\"Content-Type\", \"text/html; charset=utf-8\");\r\n pipe(res);\r\n },\r\n\r\n onShellError(err) {\r\n didError = true;\r\n const reqLogger = getRequestLogger(req);\r\n const routePattern = matched?.route?.pattern || \"unknown\";\r\n reqLogger.error(\"SSR shell error\", err, { route: routePattern });\r\n \r\n const errorMessage = err instanceof Error ? err.message : String(err);\r\n console.error(`\\n❌ [framework][ssr] Shell error for route \"${routePattern}\":`);\r\n console.error(` ${errorMessage}`);\r\n if (err instanceof Error && err.stack) {\r\n console.error(` Stack: ${err.stack.split('\\n').slice(0, 3).join('\\n ')}`);\r\n }\r\n console.error(\"💡 This usually indicates a React rendering error\\n\");\r\n\r\n if (!res.headersSent && errorPage) {\r\n renderErrorPageWithStream(errorPage, req, res, err, routeChunks, theme, projectRoot, env);\r\n } else if (!res.headersSent) {\r\n res.statusCode = 500;\r\n res.setHeader(\"Content-Type\", \"text/html; charset=utf-8\");\r\n res.end(\"<!doctype html><h1>Internal Server Error</h1>\");\r\n }\r\n\r\n abort();\r\n },\r\n\r\n onError(err) {\r\n didError = true;\r\n const reqLogger = getRequestLogger(req);\r\n const routePattern = matched?.route?.pattern || \"unknown\";\r\n reqLogger.error(\"SSR error\", err, { route: routePattern });\r\n \r\n const errorMessage = err instanceof Error ? err.message : String(err);\r\n console.error(`⚠️ [framework][ssr] Error during streaming for route \"${routePattern}\":`);\r\n console.error(` ${errorMessage}`);\r\n },\r\n });\r\n\r\n req.on(\"close\", () => {\r\n abort();\r\n });\r\n}\r\n\r\n/**\r\n * Renders the error page when an error occurs using streaming.\r\n *\r\n * @param errorPage - Error page route\r\n * @param req - Express request\r\n * @param res - Express response\r\n * @param error - Error that occurred\r\n * @param routeChunks - Route chunks mapping\r\n */\r\nasync function renderErrorPageWithStream(\r\n errorPage: LoadedRoute,\r\n req: Request,\r\n res: Response,\r\n error: unknown,\r\n routeChunks: Record<string, string>,\r\n theme?: string,\r\n projectRoot?: string,\r\n env: \"dev\" | \"prod\" = \"dev\",\r\n): Promise<void> {\r\n try {\r\n const isDataReq = isDataRequest(req);\r\n // Check if client wants to skip layout hooks execution (SPA navigation optimization)\r\n const skipLayoutHooks = isDataReq && req.headers[\"x-skip-layout-hooks\"] === \"true\";\r\n \r\n const ctx: ServerContext = {\r\n req,\r\n res,\r\n params: { error: String(error) },\r\n pathname: req.path,\r\n locals: { error },\r\n };\r\n\r\n // Execute layout server hooks and combine props (skip if header is set)\r\n const layoutProps: Record<string, any> = {};\r\n const reqLogger = getRequestLogger(req);\r\n if (!skipLayoutHooks && errorPage.layoutServerHooks && errorPage.layoutServerHooks.length > 0) {\r\n for (let i = 0; i < errorPage.layoutServerHooks.length; i++) {\r\n const layoutServerHook = errorPage.layoutServerHooks[i];\r\n const layoutMiddlewares = errorPage.layoutMiddlewares?.[i] || [];\r\n \r\n // Execute layout middlewares before layout hook\r\n if (layoutMiddlewares.length > 0) {\r\n for (const mw of layoutMiddlewares) {\r\n try {\r\n await Promise.resolve(\r\n mw(ctx, async () => {\r\n /* no-op */\r\n })\r\n );\r\n } catch (error) {\r\n const layoutFile = errorPage.layoutFiles[i];\r\n const relativeLayoutPath = layoutFile\r\n ? path.relative(projectRoot || process.cwd(), layoutFile)\r\n : \"unknown\";\r\n \r\n reqLogger.error(\"Layout middleware failed for error page\", error instanceof Error ? error : new Error(String(error)), {\r\n layoutIndex: i,\r\n layoutFile: relativeLayoutPath,\r\n });\r\n \r\n throw error;\r\n }\r\n \r\n if (ctx.res.headersSent) {\r\n return;\r\n }\r\n }\r\n }\r\n \r\n if (layoutServerHook) {\r\n try {\r\n const layoutResult = await layoutServerHook(ctx);\r\n if (layoutResult.props) {\r\n Object.assign(layoutProps, layoutResult.props);\r\n }\r\n } catch (err) {\r\n // Log but continue\r\n const layoutFile = errorPage.layoutFiles[i];\r\n const relativeLayoutPath = layoutFile\r\n ? path.relative(projectRoot || process.cwd(), layoutFile)\r\n : \"unknown\";\r\n \r\n reqLogger.warn(\"Layout server hook failed for error page\", {\r\n error: err instanceof Error ? err.message : String(err),\r\n stack: err instanceof Error ? err.stack : undefined,\r\n layoutFile: relativeLayoutPath,\r\n layoutIndex: i,\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n let loaderResult = await runRouteServerHook(errorPage, ctx);\r\n // Automatically inject theme from server into loaderResult if not already set\r\n if (!loaderResult.theme && theme) {\r\n loaderResult.theme = theme;\r\n }\r\n\r\n // Combine props: layout props + page props\r\n const combinedProps = {\r\n ...layoutProps,\r\n ...(loaderResult.props || {}),\r\n };\r\n const combinedLoaderResult: LoaderResult = {\r\n ...loaderResult,\r\n props: combinedProps,\r\n };\r\n\r\n const initialData = buildInitialData(req.path, { error: String(error) }, combinedLoaderResult);\r\n const routerData = buildRouterData(req);\r\n initialData.error = true;\r\n \r\n // If this is a data request, return JSON instead of HTML\r\n if (isDataReq) {\r\n const pagePropsOnly = loaderResult.props || {};\r\n handleDataResponse(\r\n res,\r\n combinedLoaderResult,\r\n theme,\r\n skipLayoutHooks ? null : (Object.keys(layoutProps).length > 0 ? layoutProps : null),\r\n pagePropsOnly,\r\n true, // error flag\r\n String(error) // error message\r\n );\r\n return;\r\n }\r\n const appTree = buildAppTree(errorPage, { error: String(error) }, initialData.props);\r\n\r\n // Get asset paths with hashes (if in production and manifest exists)\r\n // In dev, always use non-hashed names; in prod, use manifest if available\r\n const clientJsPath = env === \"dev\"\r\n ? \"/static/client.js\"\r\n : (projectRoot ? getClientJsPath(projectRoot) : \"/static/client.js\");\r\n const clientCssPath = env === \"dev\"\r\n ? \"/static/client.css\"\r\n : (projectRoot ? getClientCssPath(projectRoot) : \"/static/client.css\");\r\n const assetManifest = env === \"prod\" && projectRoot ? loadAssetManifest(projectRoot) : null;\r\n\r\n const chunkName = routeChunks[ERROR_CHUNK_KEY];\r\n let chunkHref: string | null = null;\r\n if (chunkName != null) {\r\n if (assetManifest && assetManifest.chunks[chunkName]) {\r\n chunkHref = `${STATIC_PATH}/${assetManifest.chunks[chunkName]}`;\r\n } else {\r\n chunkHref = `${STATIC_PATH}/${chunkName}.js`;\r\n }\r\n }\r\n\r\n // Get nonce from res.locals (set by Helmet for CSP)\r\n const nonce = (res.locals as any).nonce || undefined;\r\n\r\n // Get entrypoint files in order for preload\r\n const entrypointFiles: string[] = [];\r\n if (assetManifest?.entrypoints?.client) {\r\n entrypointFiles.push(...assetManifest.entrypoints.client.map(file => `${STATIC_PATH}/${file}`));\r\n }\r\n\r\n const documentTree = createDocumentTree({\r\n appTree,\r\n initialData,\r\n routerData,\r\n meta: combinedLoaderResult.metadata ?? null,\r\n titleFallback: \"Error\",\r\n descriptionFallback: \"An error occurred\",\r\n chunkHref,\r\n theme,\r\n clientJsPath,\r\n clientCssPath,\r\n nonce,\r\n });\r\n\r\n let didError = false;\r\n\r\n const { pipe, abort } = renderToPipeableStream(documentTree, {\r\n onShellReady() {\r\n if (didError || res.headersSent) {\r\n return;\r\n }\r\n\r\n res.statusCode = 500;\r\n res.setHeader(\"Content-Type\", \"text/html; charset=utf-8\");\r\n pipe(res);\r\n },\r\n onShellError(err) {\r\n didError = true;\r\n const reqLogger = getRequestLogger(req);\r\n reqLogger.error(\"Error rendering error page\", err, { type: \"shellError\" });\r\n if (!res.headersSent) {\r\n res.statusCode = 500;\r\n res.setHeader(\"Content-Type\", \"text/html; charset=utf-8\");\r\n res.end(\"<!doctype html><h1>Internal Server Error</h1>\");\r\n }\r\n abort();\r\n },\r\n onError(err) {\r\n didError = true;\r\n const reqLogger = getRequestLogger(req);\r\n reqLogger.error(\"Error in error page\", err);\r\n },\r\n });\r\n\r\n req.on(\"close\", () => {\r\n abort();\r\n });\r\n } catch (renderErr) {\r\n const reqLogger = getRequestLogger(req);\r\n reqLogger.error(\"Error rendering error page (catch)\", renderErr, { type: \"renderException\" });\r\n if (!res.headersSent) {\r\n res.statusCode = 500;\r\n res.setHeader(\"Content-Type\", \"text/html; charset=utf-8\");\r\n res.end(\"<!doctype html><h1>Internal Server Error</h1>\");\r\n }\r\n }\r\n}\r\n\r\n","import React, { ReactElement } from \"react\";\r\nimport type { LoaderResult, PageComponent, LoadedRoute, PageMetadata } from \"@router/index\";\r\nimport { InitialData, RouterData } from \"../index.types\";\r\nimport {\r\n WINDOW_DATA_KEY,\r\n APP_CONTAINER_ID,\r\n FAVICON_PATH,\r\n ROUTER_DATA_KEY,\r\n} from \"@constants/globals\";\r\n\r\n/**\r\n * Builds the app tree (Page + layouts) in the same way for SSR and SSG.\r\n *\r\n * @param route - Route definition\r\n * @param params - Route parameters\r\n * @param props - Props from loader\r\n * @returns React element tree\r\n */\r\n/**\r\n * Builds the app tree (Page + layouts) in the same way for SSR and SSG.\r\n *\r\n * @param route - Route definition\r\n * @param params - Route parameters\r\n * @param props - Props from loader (combined layout + page props)\r\n * @returns React element tree\r\n */\r\nexport function buildAppTree(\r\n route: LoadedRoute,\r\n params: Record<string, string>,\r\n props: Record<string, any>\r\n): ReactElement {\r\n const Page = route.component;\r\n\r\n let appTree: ReactElement = React.createElement(Page, {\r\n params,\r\n ...props,\r\n } as any);\r\n\r\n const layoutChain = route.layouts.slice().reverse();\r\n\r\n for (const Layout of layoutChain) {\r\n appTree = React.createElement(Layout, {\r\n params,\r\n ...props,\r\n children: appTree,\r\n } as any);\r\n }\r\n\r\n return appTree;\r\n}\r\n\r\n/**\r\n * Builds the complete HTML document tree. Used by both SSR and SSG.\r\n *\r\n * @param options - Document tree options\r\n * @returns React element representing the HTML document\r\n */\r\nexport function createDocumentTree(options: {\r\n appTree: ReactElement;\r\n initialData: InitialData;\r\n routerData: RouterData;\r\n meta: LoaderResult<any>[\"metadata\"];\r\n titleFallback?: string;\r\n descriptionFallback?: string;\r\n chunkHref?: string | null;\r\n entrypointFiles?: string[]; // All JS files for client entrypoint in order (runtime, vendor, commons, entry)\r\n theme?: string;\r\n clientJsPath?: string;\r\n clientCssPath?: string;\r\n nonce?: string;\r\n includeInlineScripts?: boolean; // For SSG: include inline scripts in body (renderToString doesn't support bootstrapScripts)\r\n}): ReactElement {\r\n const {\r\n appTree,\r\n initialData,\r\n routerData,\r\n meta,\r\n titleFallback,\r\n descriptionFallback,\r\n chunkHref,\r\n entrypointFiles = [],\r\n theme,\r\n clientJsPath = \"/static/client.js\",\r\n clientCssPath = \"/static/client.css\",\r\n nonce,\r\n includeInlineScripts = true, // Default true - scripts inline in body for both SSR and SSG\r\n } = options;\r\n\r\n // Type-safe metadata access\r\n const metaObj: PageMetadata | null = meta ?? null;\r\n const title = metaObj?.title ?? titleFallback ?? \"My Framework Dev\";\r\n const lang = metaObj?.lang ?? \"en\";\r\n const description = metaObj?.description ?? descriptionFallback ?? \"Demo Loly framework\";\r\n\r\n const extraMetaTags: ReactElement[] = [];\r\n const linkTags: ReactElement[] = [];\r\n\r\n // Basic meta tags\r\n if (description) {\r\n extraMetaTags.push(\r\n React.createElement(\"meta\", {\r\n key: \"meta-description\",\r\n name: \"description\",\r\n content: description,\r\n })\r\n );\r\n }\r\n\r\n if (metaObj?.robots) {\r\n extraMetaTags.push(\r\n React.createElement(\"meta\", {\r\n key: \"meta-robots\",\r\n name: \"robots\",\r\n content: metaObj.robots,\r\n })\r\n );\r\n }\r\n\r\n if (metaObj?.themeColor) {\r\n extraMetaTags.push(\r\n React.createElement(\"meta\", {\r\n key: \"meta-theme-color\",\r\n name: \"theme-color\",\r\n content: metaObj.themeColor,\r\n })\r\n );\r\n }\r\n\r\n // Viewport (if custom, otherwise use default)\r\n if (metaObj?.viewport) {\r\n extraMetaTags.push(\r\n React.createElement(\"meta\", {\r\n key: \"meta-viewport\",\r\n name: \"viewport\",\r\n content: metaObj.viewport,\r\n })\r\n );\r\n }\r\n\r\n // Canonical URL\r\n if (metaObj?.canonical) {\r\n linkTags.push(\r\n React.createElement(\"link\", {\r\n key: \"link-canonical\",\r\n rel: \"canonical\",\r\n href: metaObj.canonical,\r\n })\r\n );\r\n }\r\n\r\n // Open Graph tags\r\n if (metaObj?.openGraph) {\r\n const og = metaObj.openGraph;\r\n \r\n if (og.title) {\r\n extraMetaTags.push(\r\n React.createElement(\"meta\", {\r\n key: \"og-title\",\r\n property: \"og:title\",\r\n content: og.title,\r\n })\r\n );\r\n }\r\n \r\n if (og.description) {\r\n extraMetaTags.push(\r\n React.createElement(\"meta\", {\r\n key: \"og-description\",\r\n property: \"og:description\",\r\n content: og.description,\r\n })\r\n );\r\n }\r\n \r\n if (og.type) {\r\n extraMetaTags.push(\r\n React.createElement(\"meta\", {\r\n key: \"og-type\",\r\n property: \"og:type\",\r\n content: og.type,\r\n })\r\n );\r\n }\r\n \r\n if (og.url) {\r\n extraMetaTags.push(\r\n React.createElement(\"meta\", {\r\n key: \"og-url\",\r\n property: \"og:url\",\r\n content: og.url,\r\n })\r\n );\r\n }\r\n \r\n if (og.image) {\r\n if (typeof og.image === \"string\") {\r\n extraMetaTags.push(\r\n React.createElement(\"meta\", {\r\n key: \"og-image\",\r\n property: \"og:image\",\r\n content: og.image,\r\n })\r\n );\r\n } else {\r\n extraMetaTags.push(\r\n React.createElement(\"meta\", {\r\n key: \"og-image\",\r\n property: \"og:image\",\r\n content: og.image.url,\r\n })\r\n );\r\n if (og.image.width) {\r\n extraMetaTags.push(\r\n React.createElement(\"meta\", {\r\n key: \"og-image-width\",\r\n property: \"og:image:width\",\r\n content: String(og.image.width),\r\n })\r\n );\r\n }\r\n if (og.image.height) {\r\n extraMetaTags.push(\r\n React.createElement(\"meta\", {\r\n key: \"og-image-height\",\r\n property: \"og:image:height\",\r\n content: String(og.image.height),\r\n })\r\n );\r\n }\r\n if (og.image.alt) {\r\n extraMetaTags.push(\r\n React.createElement(\"meta\", {\r\n key: \"og-image-alt\",\r\n property: \"og:image:alt\",\r\n content: og.image.alt,\r\n })\r\n );\r\n }\r\n }\r\n }\r\n \r\n if (og.siteName) {\r\n extraMetaTags.push(\r\n React.createElement(\"meta\", {\r\n key: \"og-site-name\",\r\n property: \"og:site_name\",\r\n content: og.siteName,\r\n })\r\n );\r\n }\r\n \r\n if (og.locale) {\r\n extraMetaTags.push(\r\n React.createElement(\"meta\", {\r\n key: \"og-locale\",\r\n property: \"og:locale\",\r\n content: og.locale,\r\n })\r\n );\r\n }\r\n }\r\n\r\n // Twitter Card tags\r\n if (metaObj?.twitter) {\r\n const twitter = metaObj.twitter;\r\n \r\n if (twitter.card) {\r\n extraMetaTags.push(\r\n React.createElement(\"meta\", {\r\n key: \"twitter-card\",\r\n name: \"twitter:card\",\r\n content: twitter.card,\r\n })\r\n );\r\n }\r\n \r\n if (twitter.title) {\r\n extraMetaTags.push(\r\n React.createElement(\"meta\", {\r\n key: \"twitter-title\",\r\n name: \"twitter:title\",\r\n content: twitter.title,\r\n })\r\n );\r\n }\r\n \r\n if (twitter.description) {\r\n extraMetaTags.push(\r\n React.createElement(\"meta\", {\r\n key: \"twitter-description\",\r\n name: \"twitter:description\",\r\n content: twitter.description,\r\n })\r\n );\r\n }\r\n \r\n if (twitter.image) {\r\n extraMetaTags.push(\r\n React.createElement(\"meta\", {\r\n key: \"twitter-image\",\r\n name: \"twitter:image\",\r\n content: twitter.image,\r\n })\r\n );\r\n }\r\n \r\n if (twitter.imageAlt) {\r\n extraMetaTags.push(\r\n React.createElement(\"meta\", {\r\n key: \"twitter-image-alt\",\r\n name: \"twitter:image:alt\",\r\n content: twitter.imageAlt,\r\n })\r\n );\r\n }\r\n \r\n if (twitter.site) {\r\n extraMetaTags.push(\r\n React.createElement(\"meta\", {\r\n key: \"twitter-site\",\r\n name: \"twitter:site\",\r\n content: twitter.site,\r\n })\r\n );\r\n }\r\n \r\n if (twitter.creator) {\r\n extraMetaTags.push(\r\n React.createElement(\"meta\", {\r\n key: \"twitter-creator\",\r\n name: \"twitter:creator\",\r\n content: twitter.creator,\r\n })\r\n );\r\n }\r\n }\r\n\r\n // Custom meta tags\r\n if (metaObj?.metaTags && Array.isArray(metaObj.metaTags)) {\r\n metaObj.metaTags.forEach((tag, index) => {\r\n extraMetaTags.push(\r\n React.createElement(\"meta\", {\r\n key: `meta-custom-${index}`,\r\n name: tag.name,\r\n property: tag.property,\r\n httpEquiv: tag.httpEquiv,\r\n content: tag.content,\r\n })\r\n );\r\n });\r\n }\r\n\r\n // Custom link tags\r\n if (metaObj?.links && Array.isArray(metaObj.links)) {\r\n metaObj.links.forEach((link, index) => {\r\n linkTags.push(\r\n React.createElement(\"link\", {\r\n key: `link-custom-${index}`,\r\n rel: link.rel,\r\n href: link.href,\r\n as: link.as,\r\n crossOrigin: link.crossorigin,\r\n type: link.type,\r\n })\r\n );\r\n });\r\n }\r\n\r\n // Serialize data for bootstrap scripts\r\n // For SSR: moved to head via bootstrapScripts in renderToPipeableStream\r\n // For SSG: included inline in body (renderToString doesn't support bootstrapScripts)\r\n const serialized = JSON.stringify({\r\n ...initialData,\r\n theme,\r\n });\r\n\r\n const routerSerialized = JSON.stringify({\r\n ...routerData,\r\n });\r\n\r\n const bodyChildren: ReactElement[] = [\r\n React.createElement(\"div\", { id: APP_CONTAINER_ID }, appTree),\r\n ];\r\n\r\n // Add inline scripts for SSG (renderToString doesn't support bootstrapScripts)\r\n if (includeInlineScripts) {\r\n bodyChildren.push(\r\n React.createElement(\"script\", {\r\n key: \"initial-data\",\r\n nonce: nonce,\r\n dangerouslySetInnerHTML: {\r\n __html: `window.${WINDOW_DATA_KEY} = ${serialized};`,\r\n },\r\n }),\r\n React.createElement(\"script\", {\r\n key: \"router-data\",\r\n nonce: nonce,\r\n dangerouslySetInnerHTML: {\r\n __html: `window.${ROUTER_DATA_KEY} = ${routerSerialized};`,\r\n },\r\n })\r\n );\r\n }\r\n\r\n const documentTree = React.createElement(\r\n \"html\",\r\n { lang },\r\n React.createElement(\r\n \"head\",\r\n null,\r\n React.createElement(\"meta\", { charSet: \"utf-8\" }),\r\n React.createElement(\"title\", null, title),\r\n // Viewport: use custom if provided, otherwise default\r\n React.createElement(\"meta\", {\r\n name: \"viewport\",\r\n content: metaObj?.viewport ?? \"width=device-width, initial-scale=1\",\r\n }),\r\n ...extraMetaTags,\r\n ...linkTags,\r\n // Preload all entrypoint files except the last one (runtime, vendor, commons)\r\n // The last file is the main entry which we load as a script\r\n ...(entrypointFiles.length > 0\r\n ? entrypointFiles.slice(0, -1).map((file) =>\r\n React.createElement(\"link\", {\r\n key: `preload-${file}`,\r\n rel: \"preload\",\r\n href: file,\r\n as: \"script\",\r\n })\r\n )\r\n : []),\r\n // Preload route-specific chunk if available\r\n chunkHref &&\r\n React.createElement(\"link\", {\r\n key: `preload-${chunkHref}`,\r\n rel: \"preload\",\r\n href: chunkHref,\r\n as: \"script\",\r\n }),\r\n React.createElement(\"link\", {\r\n rel: \"icon\",\r\n href: FAVICON_PATH,\r\n type: \"image/png\",\r\n }),\r\n React.createElement(\"link\", {\r\n rel: \"stylesheet\",\r\n href: clientCssPath,\r\n }),\r\n // Execute ALL entrypoint files in order (runtime, vendor, commons, entry)\r\n // With defer, browser downloads in parallel but executes in DOM order\r\n ...(entrypointFiles.length > 0\r\n ? entrypointFiles.map((file) =>\r\n React.createElement(\"script\", {\r\n key: file,\r\n src: file,\r\n defer: true,\r\n nonce, // CSP nonce for external scripts\r\n })\r\n )\r\n : [\r\n React.createElement(\"script\", {\r\n key: \"client\",\r\n src: clientJsPath,\r\n defer: true,\r\n nonce, // CSP nonce for external scripts\r\n }),\r\n ])\r\n ),\r\n React.createElement(\r\n \"body\",\r\n { \r\n style: { margin: 0 }, \r\n className: [initialData.className || \"\", theme].filter(Boolean).join(\" \"),\r\n suppressHydrationWarning: true // Allow theme class to differ between server and client initially\r\n },\r\n ...bodyChildren\r\n )\r\n );\r\n\r\n return documentTree;\r\n}\r\n","import type { InitialData } from \"../index.types\";\nimport type { LoaderResult } from \"@router/index\";\n\n/**\n * Builds InitialData in a consistent way.\n *\n * @param urlPath - URL path\n * @param params - Route parameters\n * @param loaderResult - Loader result\n * @returns Initial data object\n */\nexport function buildInitialData(\n urlPath: string,\n params: Record<string, string>,\n loaderResult: LoaderResult,\n): InitialData {\n // Include theme in props so it's available to layouts and pages\n const props = {\n ...(loaderResult.props ?? {}),\n ...(loaderResult.theme ? { theme: loaderResult.theme } : {}),\n };\n \n return {\n pathname: urlPath,\n params,\n props,\n metadata: loaderResult.metadata ?? null,\n className: loaderResult.className,\n error: false,\n notFound: false,\n };\n}\n","import { RouterData } from \"@rendering/index.types\";\r\nimport { Request } from \"express\";\r\n\r\nexport const buildRouterData = (req: Request): RouterData => {\r\n return {\r\n pathname: req.path,\r\n params: req.params,\r\n searchParams: req.query,\r\n };\r\n};\r\n","import { ServerContext, LoadedRoute } from \"@router/index\";\r\nimport path from \"path\";\r\nimport { getRequestLogger } from \"@logger/index\";\r\n\r\n/**\r\n * Executes route middlewares in chain.\r\n * \r\n * If a middleware throws an error, it's logged and rethrown to be handled by the route handler.\r\n *\r\n * @param route - Route definition\r\n * @param ctx - Server context\r\n * @throws Error if a middleware throws an error\r\n */\r\nexport async function runRouteMiddlewares(\r\n route: LoadedRoute<any, any>,\r\n ctx: ServerContext\r\n): Promise<void> {\r\n for (let i = 0; i < route.middlewares.length; i++) {\r\n const mw = route.middlewares[i];\r\n \r\n try {\r\n await Promise.resolve(\r\n mw(ctx, async () => {\r\n /* no-op */\r\n })\r\n );\r\n } catch (error) {\r\n const reqLogger = getRequestLogger(ctx.req);\r\n const relativePath = route.pageFile \r\n ? path.relative(process.cwd(), route.pageFile)\r\n : route.pattern;\r\n \r\n reqLogger.error(\"Route middleware failed\", error instanceof Error ? error : new Error(String(error)), {\r\n route: route.pattern,\r\n middlewareIndex: i,\r\n pageFile: relativePath,\r\n });\r\n \r\n // Re-throw to be handled by the route handler\r\n throw error;\r\n }\r\n \r\n // Stop executing if response was sent (e.g., redirect)\r\n if (ctx.res.headersSent) {\r\n return;\r\n }\r\n }\r\n}\r\n\r\n","import { ServerContext, LoadedRoute, LoaderResult } from \"@router/index\";\r\nimport path from \"path\";\r\n\r\n/**\r\n * Creates a detailed error message for server hook failures.\r\n */\r\nfunction createServerHookErrorMessage(\r\n error: unknown,\r\n hookType: \"page\" | \"layout\",\r\n routePattern: string,\r\n filePath?: string\r\n): string {\r\n const errorMessage = error instanceof Error ? error.message : String(error);\r\n const errorStack = error instanceof Error ? error.stack : undefined;\r\n \r\n let message = `[${hookType.toUpperCase()} SERVER HOOK ERROR]\\n`;\r\n message += `Route: ${routePattern}\\n`;\r\n \r\n if (filePath) {\r\n const relativePath = path.relative(process.cwd(), filePath);\r\n message += `File: ${relativePath}\\n`;\r\n }\r\n \r\n message += `Error: ${errorMessage}\\n`;\r\n \r\n // Add common suggestions\r\n if (errorMessage.includes(\"Cannot find module\")) {\r\n message += `\\n💡 Suggestion: Check that all imports in your ${hookType}.server.hook.ts are correct.\\n`;\r\n } else if (errorMessage.includes(\"is not defined\") || errorMessage.includes(\"Cannot read property\")) {\r\n message += `\\n💡 Suggestion: Verify that all variables and properties exist in your ${hookType}.server.hook.ts.\\n`;\r\n } else if (errorMessage.includes(\"async\") || errorMessage.includes(\"await\")) {\r\n message += `\\n💡 Suggestion: Make sure getServerSideProps is an async function and all promises are awaited.\\n`;\r\n }\r\n \r\n if (errorStack) {\r\n message += `\\nStack trace:\\n${errorStack}`;\r\n }\r\n \r\n return message;\r\n}\r\n\r\n/**\r\n * Executes the route server hook (getServerSideProps) if it exists.\r\n * Wraps errors with helpful context information.\r\n *\r\n * @param route - Route definition\r\n * @param ctx - Server context\r\n * @returns Loader result\r\n * @throws Error with detailed context if server hook fails\r\n */\r\nexport async function runRouteServerHook(\r\n route: LoadedRoute<any, any>,\r\n ctx: ServerContext\r\n): Promise<LoaderResult<any>> {\r\n if (!route.loader) {\r\n return { props: {} };\r\n }\r\n\r\n try {\r\n return await route.loader(ctx);\r\n } catch (error) {\r\n const detailedError = new Error(\r\n createServerHookErrorMessage(error, \"page\", route.pattern, route.pageFile)\r\n );\r\n \r\n // Preserve original error stack if available\r\n if (error instanceof Error && error.stack) {\r\n detailedError.stack = error.stack;\r\n }\r\n \r\n // Attach original error for logging\r\n (detailedError as any).originalError = error;\r\n \r\n throw detailedError;\r\n }\r\n}\r\n\r\n","import { Response } from \"express\";\r\nimport { LoaderResult } from \"@router/index\";\r\n\r\n/**\r\n * Handles data request responses (JSON).\r\n *\r\n * @param res - Express response object\r\n * @param loaderResult - Loader result\r\n * @param theme - Optional theme value to include in response\r\n * @param layoutProps - Optional layout props (only included when layout hooks were executed)\r\n * @param pageProps - Optional page props (always included in data requests)\r\n * @param error - Optional error flag to include in response\r\n * @param message - Optional error message to include in response\r\n */\r\nexport function handleDataResponse(\r\n res: Response,\r\n loaderResult: LoaderResult,\r\n theme?: string,\r\n layoutProps?: Record<string, unknown> | null,\r\n pageProps?: Record<string, unknown> | null,\r\n error?: boolean,\r\n message?: string\r\n): void {\r\n res.setHeader(\"Content-Type\", \"application/json; charset=utf-8\");\r\n\r\n if (loaderResult.redirect) {\r\n res.statusCode = 200;\r\n res.end(JSON.stringify({ redirect: loaderResult.redirect }));\r\n return;\r\n }\r\n\r\n if (loaderResult.notFound) {\r\n res.statusCode = 404;\r\n res.end(JSON.stringify({ notFound: true }));\r\n return;\r\n }\r\n\r\n // Build response with separated props if provided, otherwise use combined props\r\n const response: Record<string, unknown> = {\r\n // Combined props for backward compatibility\r\n props: loaderResult.props ?? {},\r\n metadata: loaderResult.metadata ?? null,\r\n theme: loaderResult.theme ?? theme ?? null,\r\n };\r\n\r\n // Include separated props if provided (layoutProps only when layout hooks were executed)\r\n if (layoutProps !== undefined && layoutProps !== null) {\r\n response.layoutProps = layoutProps;\r\n }\r\n if (pageProps !== undefined && pageProps !== null) {\r\n response.pageProps = pageProps;\r\n }\r\n\r\n // Include error information if provided\r\n if (error !== undefined) {\r\n response.error = error;\r\n }\r\n if (message !== undefined) {\r\n response.message = message;\r\n }\r\n\r\n res.statusCode = error ? 500 : 200;\r\n res.end(JSON.stringify(response));\r\n}\r\n\r\n/**\r\n * Handles redirects for HTML responses.\r\n *\r\n * @param res - Express response object\r\n * @param redirect - Redirect configuration\r\n */\r\nexport function handleRedirect(\r\n res: Response,\r\n redirect: { destination: string; permanent?: boolean }\r\n): void {\r\n const { destination, permanent } = redirect;\r\n res.redirect(permanent ? 301 : 302, destination);\r\n}\r\n\r\n/**\r\n * Handles not found responses for HTML.\r\n *\r\n * @param res - Express response object\r\n * @param urlPath - Optional URL path for error message\r\n */\r\nexport function handleNotFound(res: Response, urlPath?: string): void {\r\n res.statusCode = 200;\r\n res.setHeader(\"Content-Type\", \"text/html; charset=utf-8\");\r\n if (urlPath) {\r\n res.end(`<h1>404 - Not Found</h1><p>Route not found: ${urlPath}</p>`);\r\n } else {\r\n res.end(\"<h1>404 - Not Found</h1>\");\r\n }\r\n}\r\n\r\n","import fs from \"fs\";\r\nimport path from \"path\";\r\nimport { Response } from \"express\";\r\nimport { createModuleLogger } from \"@logger/index\";\r\n\r\nconst logger = createModuleLogger(\"ssg\");\r\n\r\n/**\r\n * Gets the SSG directory path for a route.\r\n *\r\n * @param baseDir - Base SSG output directory\r\n * @param urlPath - URL path\r\n * @returns Directory path for the route\r\n */\r\nexport function getSsgDirForPath(baseDir: string, urlPath: string): string {\r\n const clean = urlPath === \"/\" ? \"\" : urlPath.replace(/^\\/+/, \"\");\r\n return path.join(baseDir, clean);\r\n}\r\n\r\n/**\r\n * Gets the SSG HTML file path for a URL.\r\n *\r\n * @param baseDir - Base SSG output directory\r\n * @param urlPath - URL path\r\n * @returns HTML file path\r\n */\r\nexport function getSsgHtmlPath(baseDir: string, urlPath: string): string {\r\n const dir = getSsgDirForPath(baseDir, urlPath);\r\n return path.join(dir, \"index.html\");\r\n}\r\n\r\n/**\r\n * Gets the SSG data.json file path for a URL.\r\n *\r\n * @param baseDir - Base SSG output directory\r\n * @param urlPath - URL path\r\n * @returns Data JSON file path\r\n */\r\nexport function getSsgDataPath(baseDir: string, urlPath: string): string {\r\n const dir = getSsgDirForPath(baseDir, urlPath);\r\n return path.join(dir, \"data.json\");\r\n}\r\n\r\n/**\r\n * Attempts to serve SSG HTML if it exists.\r\n *\r\n * @param res - Express response object\r\n * @param ssgOutDir - SSG output directory\r\n * @param urlPath - URL path\r\n * @returns True if served, false if not found\r\n */\r\nexport function tryServeSsgHtml(\r\n res: Response,\r\n ssgOutDir: string,\r\n urlPath: string\r\n): boolean {\r\n const ssgHtmlPath = getSsgHtmlPath(ssgOutDir, urlPath);\r\n\r\n if (!fs.existsSync(ssgHtmlPath)) {\r\n return false;\r\n }\r\n\r\n logger.info(\"Serving SSG HTML\", { urlPath, ssgHtmlPath });\r\n\r\n // For SSG files, we need to allow 'unsafe-inline' since we can't generate nonces\r\n // for static HTML files. Override the CSP header set by Helmet.\r\n // Note: setHeader will override any existing header with the same name\r\n res.setHeader(\r\n \"Content-Security-Policy\",\r\n \"default-src 'self'; \" +\r\n \"style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; \" +\r\n \"script-src 'self' 'unsafe-inline'; \" +\r\n \"img-src 'self' data: https:; \" +\r\n \"connect-src 'self' https:; \" +\r\n \"font-src 'self' data: https://fonts.gstatic.com; \" +\r\n \"object-src 'none'; \" +\r\n \"media-src 'self' https:; \" +\r\n \"frame-src 'none';\"\r\n );\r\n\r\n res.statusCode = 200;\r\n res.setHeader(\"Content-Type\", \"text/html; charset=utf-8\");\r\n const stream = fs.createReadStream(ssgHtmlPath, { encoding: \"utf-8\" });\r\n stream.pipe(res);\r\n return true;\r\n}\r\n\r\n/**\r\n * Attempts to serve SSG data.json if it exists.\r\n *\r\n * @param res - Express response object\r\n * @param ssgOutDir - SSG output directory\r\n * @param urlPath - URL path\r\n * @returns True if served, false if not found\r\n */\r\nexport function tryServeSsgData(\r\n res: Response,\r\n ssgOutDir: string,\r\n urlPath: string\r\n): boolean {\r\n const ssgDataPath = getSsgDataPath(ssgOutDir, urlPath);\r\n\r\n if (!fs.existsSync(ssgDataPath)) {\r\n return false;\r\n }\r\n\r\n try {\r\n const raw = fs.readFileSync(ssgDataPath, \"utf-8\");\r\n res.setHeader(\"Content-Type\", \"application/json; charset=utf-8\");\r\n res.status(200).end(raw);\r\n return true;\r\n } catch (err) {\r\n logger.error(\"Error reading SSG data\", err, { urlPath, ssgDataPath });\r\n return false;\r\n }\r\n}\r\n\r\n","import express from \"express\";\r\nimport { LoadedRoute, ApiRoute, WssRoute } from \"@router/index.types\";\r\nimport { handleApiRequest, handlePageRequest } from \"./handlers\";\r\nimport { RouteLoader } from \"@router/index\";\r\nimport { BUILD_FOLDER_NAME } from \"@constants/globals\";\r\nimport { getBuildDir, type FrameworkConfig } from \"@src/config\";\r\nimport { getServerConfig } from \"@server/config\";\r\nimport path from \"path\";\r\n\r\nexport interface SetupRoutesOptions {\r\n app: express.Application;\r\n routes: LoadedRoute[];\r\n apiRoutes: ApiRoute[];\r\n notFoundPage: LoadedRoute | null;\r\n errorPage: LoadedRoute | null;\r\n isDev: boolean;\r\n projectRoot: string;\r\n routeLoader: RouteLoader;\r\n getRoutes?: () => {\r\n routes: LoadedRoute[];\r\n apiRoutes: ApiRoute[];\r\n };\r\n config?: FrameworkConfig;\r\n}\r\n\r\n/**\r\n * Sets up route handlers for the Express application.\r\n * Unifies logic between dev and prod environments.\r\n *\r\n * @param options - Route setup options\r\n */\r\nexport function setupRoutes(options: SetupRoutesOptions): void {\r\n const {\r\n app,\r\n routes: initialRoutes,\r\n apiRoutes: initialApiRoutes,\r\n notFoundPage,\r\n errorPage,\r\n isDev,\r\n projectRoot,\r\n routeLoader,\r\n getRoutes,\r\n config,\r\n } = options;\r\n\r\n // Cache route chunks - they don't change during runtime\r\n const routeChunks = routeLoader.loadRouteChunks();\r\n\r\n // SSG directory - available in both dev and prod if files exist\r\n const ssgOutDir = path.join(\r\n config ? getBuildDir(projectRoot, config) : path.join(projectRoot, BUILD_FOLDER_NAME),\r\n \"ssg\"\r\n );\r\n\r\n app.all(\"/api/*\", async (req, res) => {\r\n const apiRoutes = isDev && getRoutes\r\n ? getRoutes().apiRoutes\r\n : initialApiRoutes;\r\n\r\n // Get rate limit configuration for auto-application\r\n const serverConfig = await getServerConfig(projectRoot);\r\n const strictPatterns = serverConfig.rateLimit?.strictPatterns || [];\r\n const rateLimitConfig = serverConfig.rateLimit;\r\n\r\n await handleApiRequest({\r\n apiRoutes,\r\n urlPath: req.path,\r\n req,\r\n res,\r\n env: isDev ? \"dev\" : \"prod\",\r\n strictRateLimitPatterns: strictPatterns,\r\n rateLimitConfig,\r\n });\r\n });\r\n\r\n app.get(\"*\", async (req, res) => {\r\n let routes = initialRoutes;\r\n let currentNotFoundPage = notFoundPage;\r\n\r\n if (isDev && getRoutes) {\r\n routes = getRoutes().routes;\r\n // In dev, reload not-found on each request to support hot-reload\r\n currentNotFoundPage = routeLoader.loadNotFoundRoute();\r\n }\r\n\r\n const currentErrorPage = isDev && getRoutes\r\n ? routeLoader.loadErrorRoute()\r\n : errorPage;\r\n\r\n await handlePageRequest({\r\n routes,\r\n notFoundPage: currentNotFoundPage,\r\n errorPage: currentErrorPage,\r\n routeChunks,\r\n urlPath: req.path,\r\n req,\r\n res,\r\n env: isDev ? \"dev\" : \"prod\",\r\n ssgOutDir,\r\n theme: req.cookies?.theme || \"light\",\r\n projectRoot,\r\n });\r\n });\r\n}\r\n\r\n","import { getServerFile } from \"./utils/server-dir\";\r\n\r\nexport const CONFIG_FILE_NAME = \"loly.config\";\r\n\r\n/**\r\n * Realtime/WebSocket configuration\r\n */\r\nexport interface RealtimeConfig {\r\n /** Enable realtime features */\r\n enabled?: boolean;\r\n\r\n /** Socket.IO server settings */\r\n path?: string;\r\n transports?: (\"websocket\" | \"polling\")[];\r\n pingIntervalMs?: number;\r\n pingTimeoutMs?: number;\r\n maxPayloadBytes?: number;\r\n\r\n /** Security */\r\n allowedOrigins?: string | string[];\r\n cors?: {\r\n credentials?: boolean;\r\n allowedHeaders?: string[];\r\n };\r\n\r\n /** Scaling configuration */\r\n scale?: {\r\n mode?: \"single\" | \"cluster\";\r\n adapter?: {\r\n name: \"redis\";\r\n url: string;\r\n pubClientName?: string;\r\n subClientName?: string;\r\n };\r\n stateStore?: {\r\n name: \"memory\" | \"redis\";\r\n url?: string;\r\n prefix?: string;\r\n };\r\n };\r\n\r\n /** Rate limiting */\r\n limits?: {\r\n connectionsPerIp?: number;\r\n eventsPerSecond?: number;\r\n burst?: number;\r\n };\r\n\r\n /** Logging */\r\n logging?: {\r\n level?: \"debug\" | \"info\" | \"warn\" | \"error\";\r\n pretty?: boolean;\r\n };\r\n}\r\n\r\nexport interface ServerConfig {\r\n bodyLimit?: string;\r\n corsOrigin?: string | string[] | boolean | ((origin: string | undefined, callback: (err: Error | null, allow?: boolean) => void) => void);\r\n rateLimit?: {\r\n windowMs?: number;\r\n max?: number;\r\n apiMax?: number;\r\n strictMax?: number;\r\n // Auto-apply strict rate limiting to routes matching these patterns\r\n strictPatterns?: string[];\r\n };\r\n security?: {\r\n contentSecurityPolicy?: boolean | Record<string, any>;\r\n hsts?: boolean | { maxAge?: number; includeSubDomains?: boolean };\r\n };\r\n /** Realtime/WebSocket configuration */\r\n realtime?: RealtimeConfig;\r\n}\r\n\r\nconst DEFAULT_REALTIME_CONFIG: RealtimeConfig = {\r\n enabled: true,\r\n path: \"/wss\",\r\n transports: [\"websocket\", \"polling\"],\r\n pingIntervalMs: 25000,\r\n pingTimeoutMs: 20000,\r\n maxPayloadBytes: 64 * 1024,\r\n allowedOrigins: process.env.NODE_ENV === \"production\" ? [] : \"*\",\r\n cors: {\r\n credentials: true,\r\n allowedHeaders: [\"content-type\", \"authorization\"],\r\n },\r\n scale: {\r\n mode: \"single\",\r\n },\r\n limits: {\r\n connectionsPerIp: 20,\r\n eventsPerSecond: 30,\r\n burst: 60,\r\n },\r\n logging: {\r\n level: \"info\",\r\n pretty: process.env.NODE_ENV !== \"production\",\r\n },\r\n};\r\n\r\nconst DEFAULT_CONFIG: ServerConfig = {\r\n bodyLimit: '1mb',\r\n corsOrigin: process.env.CORS_ORIGIN \r\n ? (process.env.CORS_ORIGIN.includes(',') \r\n ? process.env.CORS_ORIGIN.split(',').map(s => s.trim())\r\n : process.env.CORS_ORIGIN)\r\n : (process.env.NODE_ENV === 'production' ? [] : true),\r\n rateLimit: {\r\n windowMs: 15 * 60 * 1000, // 15 minutes\r\n max: 100, // General requests\r\n apiMax: 100, // API requests\r\n strictMax: 5, // Strict endpoints (auth, etc.)\r\n // Auto-apply strict rate limiting to these route patterns\r\n strictPatterns: [\r\n '/api/auth/**',\r\n '/api/login/**',\r\n '/api/register/**',\r\n '/api/password/**',\r\n '/api/reset/**',\r\n '/api/verify/**',\r\n ],\r\n },\r\n security: {\r\n contentSecurityPolicy: {\r\n directives: {\r\n defaultSrc: [\"'self'\"],\r\n styleSrc: [\"'self'\", \"'unsafe-inline'\"],\r\n scriptSrc: [\"'self'\", \"'unsafe-inline'\", \"'unsafe-eval'\"], // Needed for dev\r\n imgSrc: [\"'self'\", \"data:\", \"https:\"],\r\n connectSrc: [\"'self'\"],\r\n fontSrc: [\"'self'\", \"data:\"],\r\n objectSrc: [\"'none'\"],\r\n mediaSrc: [\"'self'\"],\r\n frameSrc: [\"'none'\"],\r\n },\r\n },\r\n hsts: {\r\n maxAge: 31536000, // 1 year\r\n includeSubDomains: true,\r\n },\r\n },\r\n realtime: DEFAULT_REALTIME_CONFIG,\r\n}\r\n\r\nexport async function getServerConfig(\r\n projectRoot: string,\r\n): Promise<ServerConfig> {\r\n let mod: any = await getServerFile(projectRoot, CONFIG_FILE_NAME);\r\n\r\n if (typeof mod?.config === \"function\") {\r\n const options = mod?.config(process.env.NODE_ENV) as ServerConfig;\r\n\r\n // Deep merge for nested objects\r\n const merged: ServerConfig = {\r\n ...DEFAULT_CONFIG,\r\n ...options,\r\n rateLimit: {\r\n ...DEFAULT_CONFIG.rateLimit,\r\n ...options.rateLimit,\r\n },\r\n security: {\r\n ...DEFAULT_CONFIG.security,\r\n ...options.security,\r\n },\r\n realtime: {\r\n ...DEFAULT_REALTIME_CONFIG,\r\n ...options.realtime,\r\n cors: {\r\n ...DEFAULT_REALTIME_CONFIG.cors,\r\n ...options.realtime?.cors,\r\n },\r\n scale: options.realtime?.scale\r\n ? {\r\n ...DEFAULT_REALTIME_CONFIG.scale,\r\n ...options.realtime.scale,\r\n adapter: options.realtime.scale.adapter,\r\n stateStore: options.realtime.scale.stateStore\r\n ? {\r\n ...DEFAULT_REALTIME_CONFIG.scale?.stateStore,\r\n ...options.realtime.scale.stateStore,\r\n // Ensure name is set (user config takes priority, fallback to default or \"memory\")\r\n name: (options.realtime.scale.stateStore.name || \r\n DEFAULT_REALTIME_CONFIG.scale?.stateStore?.name || \r\n \"memory\") as \"memory\" | \"redis\",\r\n }\r\n : DEFAULT_REALTIME_CONFIG.scale?.stateStore,\r\n }\r\n : DEFAULT_REALTIME_CONFIG.scale,\r\n limits: {\r\n ...DEFAULT_REALTIME_CONFIG.limits,\r\n ...options.realtime?.limits,\r\n },\r\n logging: {\r\n ...DEFAULT_REALTIME_CONFIG.logging,\r\n ...options.realtime?.logging,\r\n },\r\n },\r\n };\r\n\r\n // Validate realtime config\r\n validateRealtimeConfig(merged.realtime!);\r\n\r\n return merged;\r\n }\r\n\r\n // Validate default config\r\n validateRealtimeConfig(DEFAULT_CONFIG.realtime!);\r\n\r\n return DEFAULT_CONFIG;\r\n}\r\n\r\n/**\r\n * Validates realtime configuration and throws errors for invalid setups.\r\n */\r\nfunction validateRealtimeConfig(config: RealtimeConfig): void {\r\n if (!config.enabled) {\r\n return; // Skip validation if disabled\r\n }\r\n\r\n // Cluster mode requires adapter\r\n if (config.scale?.mode === \"cluster\") {\r\n if (!config.scale.adapter) {\r\n throw new Error(\r\n \"[loly:realtime] Cluster mode requires a Redis adapter. \" +\r\n \"Please configure realtime.scale.adapter in your loly.config.ts\"\r\n );\r\n }\r\n\r\n if (config.scale.adapter.name !== \"redis\") {\r\n throw new Error(\r\n \"[loly:realtime] Only Redis adapter is supported for cluster mode\"\r\n );\r\n }\r\n\r\n if (!config.scale.adapter.url) {\r\n throw new Error(\r\n \"[loly:realtime] Redis adapter requires a URL. \" +\r\n \"Set realtime.scale.adapter.url or REDIS_URL environment variable\"\r\n );\r\n }\r\n\r\n // Warning if stateStore is memory in cluster mode\r\n if (config.scale.stateStore?.name === \"memory\") {\r\n console.warn(\r\n \"[loly:realtime] WARNING: Using memory state store in cluster mode. \" +\r\n \"State will diverge across instances. Consider using Redis state store.\"\r\n );\r\n }\r\n }\r\n\r\n // Production requires allowedOrigins (but auto-allow localhost for simplicity)\r\n if (process.env.NODE_ENV === \"production\") {\r\n // If no config or \"*\", auto-allow localhost (for local development)\r\n // The wss.ts will handle converting \"*\" to localhost-allowing function\r\n if (!config.allowedOrigins || \r\n (Array.isArray(config.allowedOrigins) && config.allowedOrigins.length === 0) ||\r\n config.allowedOrigins === \"*\") {\r\n // Keep \"*\" - wss.ts will auto-convert to localhost-allowing function\r\n // This allows local development without configuration\r\n config.allowedOrigins = \"*\";\r\n console.warn(\r\n \"[loly:realtime] No allowedOrigins configured. \" +\r\n \"Auto-allowing localhost for local development. \" +\r\n \"For production deployment, configure realtime.allowedOrigins in loly.config.ts\"\r\n );\r\n }\r\n // If user explicitly set \"*\", allow it (wss.ts will handle it)\r\n }\r\n}\r\n","import { Server as HttpServer } from \"http\";\r\nimport { Server, Socket } from \"socket.io\";\r\nimport type { ExtendedWssRoute } from \"@router/loader-wss\";\r\nimport type { WssContext } from \"@realtime/types\";\r\nimport { getServerConfig } from \"./config\";\r\nimport { createStateStore } from \"@realtime/state\";\r\nimport { PresenceManager } from \"@realtime/presence\";\r\nimport { RateLimiter } from \"@realtime/rate-limit\";\r\nimport { executeAuth } from \"@realtime/auth\";\r\nimport { executeGuard } from \"@realtime/guards\";\r\nimport { validateSchema } from \"@realtime/validation\";\r\nimport { createWssLogger } from \"@realtime/logging\";\r\nimport { generateRequestId } from \"@logger/index\";\r\nimport type { PresenceManager as PresenceManagerType } from \"@realtime/presence\";\r\n\r\nexport interface SetupWssEventsOptions {\r\n httpServer: HttpServer;\r\n wssRoutes: ExtendedWssRoute[];\r\n projectRoot: string;\r\n}\r\n\r\n/**\r\n * Generates helper actions for WebSocket context.\r\n * \r\n * Wraps Socket.IO methods in arrow functions to preserve the correct context\r\n * when used later in event handlers.\r\n * \r\n * @param socket - The Socket.IO socket instance\r\n * @param namespace - The Socket.IO namespace instance\r\n * @param presence - Optional presence manager for user targeting\r\n * @returns Actions object with helper methods for the namespace\r\n */\r\nconst generateActions = (\r\n socket: Socket,\r\n namespace: any,\r\n presence?: PresenceManagerType\r\n): WssContext['actions'] => {\r\n return {\r\n // Emit to current socket only (reply)\r\n reply: (event: string, payload?: any) => {\r\n socket.emit(event, payload);\r\n },\r\n\r\n // Emit to all clients in the namespace\r\n emit: (event: string, payload?: any) => {\r\n socket.nsp.emit(event, payload);\r\n },\r\n \r\n // Emit to everyone except current socket\r\n broadcast: (\r\n event: string,\r\n payload?: any,\r\n opts?: { excludeSelf?: boolean }\r\n ) => {\r\n if (opts?.excludeSelf === false) {\r\n // Include self - emit to namespace\r\n socket.nsp.emit(event, payload);\r\n } else {\r\n // Exclude self - use broadcast\r\n socket.broadcast.emit(event, payload);\r\n }\r\n },\r\n\r\n // Join a room\r\n join: async (room: string) => {\r\n await socket.join(room);\r\n },\r\n\r\n // Leave a room\r\n leave: async (room: string) => {\r\n await socket.leave(room);\r\n },\r\n\r\n // Emit to a specific room\r\n toRoom: (room: string) => {\r\n return {\r\n emit: (event: string, payload?: any) => {\r\n namespace.to(room).emit(event, payload);\r\n },\r\n };\r\n },\r\n\r\n // Emit to a specific user (by userId)\r\n toUser: (userId: string) => {\r\n return {\r\n emit: async (event: string, payload?: any) => {\r\n if (!presence) {\r\n console.warn(\r\n \"[loly:realtime] toUser() requires presence manager. \" +\r\n \"Make sure realtime is properly configured.\"\r\n );\r\n return;\r\n }\r\n\r\n const socketIds = await presence.getSocketsForUser(userId);\r\n for (const socketId of socketIds) {\r\n const targetSocket = namespace.sockets.get(socketId);\r\n if (targetSocket) {\r\n targetSocket.emit(event, payload);\r\n }\r\n }\r\n },\r\n };\r\n },\r\n\r\n // Emit error event (reserved event: __loly:error)\r\n error: (code: string, message: string, details?: any) => {\r\n socket.emit(\"__loly:error\", {\r\n code,\r\n message,\r\n details,\r\n requestId: (socket as any).requestId || undefined,\r\n });\r\n },\r\n \r\n // Legacy: Emit to a specific socket by Socket.IO socket ID\r\n emitTo: (socketId: string, event: string, ...args: any[]) => {\r\n const targetSocket = namespace.sockets.get(socketId);\r\n if (targetSocket) {\r\n targetSocket.emit(event, ...args);\r\n }\r\n },\r\n \r\n // Legacy: Emit to a specific client by custom clientId\r\n emitToClient: (clientId: string, event: string, ...args: any[]) => {\r\n namespace.sockets.forEach((s: Socket) => {\r\n if (s.data?.clientId === clientId) {\r\n s.emit(event, ...args);\r\n }\r\n });\r\n },\r\n };\r\n};\r\n\r\n/**\r\n * Sets up Socket.IO server and registers WebSocket event handlers for each route.\r\n * \r\n * This is the new, production-ready implementation that includes:\r\n * - Configuration from loly.config.ts\r\n * - State store (memory or Redis)\r\n * - Presence management\r\n * - Authentication hooks\r\n * - Schema validation\r\n * - Guards\r\n * - Rate limiting\r\n * - Logging\r\n * \r\n * @param options - WebSocket setup options\r\n */\r\nexport async function setupWssEvents(options: SetupWssEventsOptions): Promise<void> {\r\n const { httpServer, wssRoutes, projectRoot } = options;\r\n\r\n if (wssRoutes.length === 0) {\r\n return;\r\n }\r\n\r\n // Get server configuration\r\n const serverConfig = await getServerConfig(projectRoot);\r\n const realtimeConfig = serverConfig.realtime;\r\n\r\n // Skip if realtime is disabled\r\n if (!realtimeConfig || !realtimeConfig.enabled) {\r\n return;\r\n }\r\n\r\n // Initialize state store\r\n const stateStore = await createStateStore(realtimeConfig);\r\n const stateStorePrefix = realtimeConfig.scale?.stateStore?.prefix || \"loly:rt:\";\r\n\r\n // Initialize presence manager\r\n const presence = new PresenceManager(stateStore, stateStorePrefix);\r\n\r\n // Initialize rate limiter\r\n const rateLimiter = new RateLimiter(\r\n realtimeConfig.scale?.mode === \"cluster\" ? stateStore : undefined,\r\n `${stateStorePrefix}rate:`\r\n );\r\n\r\n // Configure CORS - auto-allow localhost if no config (for simplicity)\r\n const allowedOrigins = realtimeConfig.allowedOrigins;\r\n \r\n // Auto-allow localhost if no config or empty array (for local development)\r\n const corsOrigin: any = \r\n !allowedOrigins || \r\n (Array.isArray(allowedOrigins) && allowedOrigins.length === 0) ||\r\n allowedOrigins === \"*\"\r\n ? // Auto-allow localhost on any port for simplicity\r\n (origin: string | undefined, callback: (err: Error | null, allow?: boolean) => void) => {\r\n if (!origin) {\r\n callback(null, true);\r\n return;\r\n }\r\n // Allow localhost on any port\r\n if (origin.startsWith(\"http://localhost:\") || \r\n origin.startsWith(\"http://127.0.0.1:\") ||\r\n origin.startsWith(\"https://localhost:\") ||\r\n origin.startsWith(\"https://127.0.0.1:\")) {\r\n callback(null, true);\r\n } else {\r\n callback(new Error(\"Not allowed by CORS\"));\r\n }\r\n }\r\n : allowedOrigins; // Use configured origins\r\n \r\n const corsOptions: any = {\r\n origin: corsOrigin,\r\n credentials: realtimeConfig.cors?.credentials ?? true,\r\n methods: [\"GET\", \"POST\"],\r\n allowedHeaders: realtimeConfig.cors?.allowedHeaders || [\r\n \"content-type\",\r\n \"authorization\",\r\n ],\r\n };\r\n\r\n // Create Socket.IO server\r\n const io = new Server(httpServer, {\r\n path: realtimeConfig.path || \"/wss\",\r\n transports: realtimeConfig.transports || [\"websocket\", \"polling\"],\r\n pingInterval: realtimeConfig.pingIntervalMs || 25000,\r\n pingTimeout: realtimeConfig.pingTimeoutMs || 20000,\r\n maxHttpBufferSize: realtimeConfig.maxPayloadBytes || 64 * 1024,\r\n cors: corsOptions,\r\n });\r\n\r\n // Setup Redis adapter if cluster mode\r\n if (realtimeConfig.scale?.mode === \"cluster\" && realtimeConfig.scale.adapter) {\r\n try {\r\n // Dynamic import for optional dependencies\r\n // @ts-ignore - Optional dependencies may not be installed\r\n const redisAdapterModule = await import(\"@socket.io/redis-adapter\").catch(() => null);\r\n // @ts-ignore - Optional dependencies may not be installed\r\n const ioredisModule = await import(\"ioredis\").catch(() => null);\r\n \r\n if (!redisAdapterModule || !ioredisModule) {\r\n throw new Error(\r\n \"[loly:realtime] Redis adapter dependencies not found. \" +\r\n \"Install @socket.io/redis-adapter and ioredis for cluster mode: \" +\r\n \"pnpm add @socket.io/redis-adapter ioredis\"\r\n );\r\n }\r\n \r\n const { createAdapter } = redisAdapterModule;\r\n const Redis = ioredisModule.default || ioredisModule;\r\n \r\n const pubClient = new Redis(realtimeConfig.scale.adapter.url);\r\n const subClient = pubClient.duplicate();\r\n\r\n io.adapter(createAdapter(pubClient, subClient));\r\n } catch (error) {\r\n console.error(\r\n \"[loly:realtime] Failed to setup Redis adapter:\",\r\n error instanceof Error ? error.message : String(error)\r\n );\r\n throw error;\r\n }\r\n }\r\n\r\n // Process each route\r\n for (const wssRoute of wssRoutes) {\r\n // Use normalized route if available, otherwise fall back to legacy format\r\n const normalized = (wssRoute as any).normalized;\r\n \r\n if (!normalized) {\r\n // Legacy format - skip for now (should not happen with new loader)\r\n console.warn(\r\n `[loly:realtime] Skipping route ${wssRoute.pattern}: No normalized route definition`\r\n );\r\n continue;\r\n }\r\n\r\n // Extract namespace (use from normalized or infer from pattern)\r\n let namespacePath = normalized.namespace || wssRoute.pattern.replace(/^\\/wss/, '');\r\n \r\n if (!namespacePath.startsWith('/')) {\r\n namespacePath = '/' + namespacePath;\r\n }\r\n \r\n if (namespacePath === '') {\r\n namespacePath = '/';\r\n }\r\n\r\n const namespace = io.of(namespacePath);\r\n \r\n console.log(`[loly:realtime] Registered namespace: ${namespacePath} (from pattern: ${wssRoute.pattern})`);\r\n\r\n // Set up connection handler for this namespace\r\n namespace.on('connection', async (socket: Socket) => {\r\n console.log(`[loly:realtime] Client connected to namespace ${namespacePath}, socket: ${socket.id}`);\r\n // Generate request ID for this connection\r\n const requestId = generateRequestId();\r\n (socket as any).requestId = requestId;\r\n\r\n // Create logger for this socket\r\n const log = createWssLogger(namespacePath, socket);\r\n\r\n try {\r\n // Execute auth hook\r\n const user = await executeAuth(normalized.auth, socket, namespacePath);\r\n \r\n // Store user on socket\r\n (socket as any).data = (socket as any).data || {};\r\n (socket as any).data.user = user;\r\n\r\n // Add to presence if user exists\r\n if (user && user.id) {\r\n await presence.addSocketForUser(String(user.id), socket.id);\r\n }\r\n\r\n // Build base context\r\n const baseCtx: Partial<WssContext> = {\r\n socket,\r\n io: namespace.server,\r\n req: {\r\n headers: socket.handshake.headers as Record<string, string | string[] | undefined>,\r\n ip: socket.handshake.address,\r\n url: socket.handshake.url,\r\n cookies: socket.handshake.headers.cookie\r\n ? parseCookies(socket.handshake.headers.cookie)\r\n : undefined,\r\n },\r\n user: user || null,\r\n params: {},\r\n pathname: wssRoute.pattern,\r\n actions: generateActions(socket, namespace, presence),\r\n state: stateStore,\r\n log,\r\n };\r\n\r\n // Execute onConnect hook\r\n if (normalized.onConnect) {\r\n try {\r\n await normalized.onConnect(baseCtx as WssContext);\r\n } catch (error) {\r\n log.error(\"Error in onConnect hook\", {\r\n error: error instanceof Error ? error.message : String(error),\r\n });\r\n }\r\n }\r\n\r\n // Register event handlers\r\n for (const [eventName, eventDef] of normalized.events.entries()) {\r\n socket.on(eventName, async (data: any) => {\r\n const eventRequestId = generateRequestId();\r\n (socket as any).requestId = eventRequestId;\r\n\r\n const eventLog = createWssLogger(namespacePath, socket);\r\n eventLog.debug(`Event received: ${eventName}`, { data });\r\n\r\n try {\r\n // Build context for this event\r\n const ctx: WssContext = {\r\n ...baseCtx,\r\n data,\r\n log: eventLog,\r\n } as WssContext;\r\n\r\n // Schema validation\r\n if (eventDef.schema) {\r\n const validation = validateSchema(eventDef.schema, data);\r\n if (!validation.success) {\r\n ctx.actions.error(\"BAD_PAYLOAD\", \"Invalid payload\", {\r\n error: validation.error,\r\n });\r\n eventLog.warn(\"Schema validation failed\", {\r\n error: validation.error,\r\n });\r\n return;\r\n }\r\n // Use validated data\r\n ctx.data = validation.data;\r\n }\r\n\r\n // Guard check\r\n if (eventDef.guard) {\r\n const allowed = await executeGuard(eventDef.guard, ctx);\r\n if (!allowed) {\r\n ctx.actions.error(\"FORBIDDEN\", \"Access denied\");\r\n eventLog.warn(\"Guard check failed\");\r\n return;\r\n }\r\n }\r\n\r\n // Rate limiting (global)\r\n const globalLimit = realtimeConfig.limits;\r\n if (globalLimit) {\r\n const globalAllowed = await rateLimiter.checkLimit(\r\n socket.id,\r\n {\r\n eventsPerSecond: globalLimit.eventsPerSecond || 30,\r\n burst: globalLimit.burst || 60,\r\n }\r\n );\r\n if (!globalAllowed) {\r\n ctx.actions.error(\"RATE_LIMIT\", \"Rate limit exceeded\");\r\n eventLog.warn(\"Global rate limit exceeded\");\r\n return;\r\n }\r\n }\r\n\r\n // Rate limiting (per-event)\r\n if (eventDef.rateLimit) {\r\n const eventAllowed = await rateLimiter.checkLimit(\r\n `${socket.id}:${eventName}`,\r\n eventDef.rateLimit\r\n );\r\n if (!eventAllowed) {\r\n ctx.actions.error(\"RATE_LIMIT\", \"Event rate limit exceeded\");\r\n eventLog.warn(\"Event rate limit exceeded\");\r\n return;\r\n }\r\n }\r\n\r\n // Execute handler\r\n await eventDef.handler(ctx);\r\n eventLog.debug(`Event handled: ${eventName}`);\r\n } catch (error) {\r\n const errorLog = createWssLogger(namespacePath, socket);\r\n errorLog.error(`Error handling event ${eventName}`, {\r\n error: error instanceof Error ? error.message : String(error),\r\n stack: error instanceof Error ? error.stack : undefined,\r\n });\r\n\r\n // Emit error to client\r\n socket.emit(\"__loly:error\", {\r\n code: \"INTERNAL_ERROR\",\r\n message: \"An error occurred while processing your request\",\r\n requestId: eventRequestId,\r\n });\r\n }\r\n });\r\n }\r\n\r\n // Handle disconnect\r\n socket.on('disconnect', async (reason?: string) => {\r\n const userId = (socket as any).data?.user?.id;\r\n \r\n // Remove from presence\r\n if (userId) {\r\n await presence.removeSocketForUser(String(userId), socket.id);\r\n }\r\n\r\n // Execute onDisconnect hook\r\n if (normalized.onDisconnect) {\r\n try {\r\n const disconnectCtx: WssContext = {\r\n ...baseCtx,\r\n log: createWssLogger(namespacePath, socket),\r\n } as WssContext;\r\n await normalized.onDisconnect(disconnectCtx, reason);\r\n } catch (error) {\r\n log.error(\"Error in onDisconnect hook\", {\r\n error: error instanceof Error ? error.message : String(error),\r\n });\r\n }\r\n }\r\n\r\n log.info(\"Socket disconnected\", { reason });\r\n });\r\n } catch (error) {\r\n log.error(\"Error during connection setup\", {\r\n error: error instanceof Error ? error.message : String(error),\r\n });\r\n socket.disconnect();\r\n }\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * Parse cookie string into object\r\n */\r\nfunction parseCookies(cookieString: string): Record<string, string> {\r\n const cookies: Record<string, string> = {};\r\n cookieString.split(\";\").forEach((cookie) => {\r\n const [name, value] = cookie.trim().split(\"=\");\r\n if (name && value) {\r\n cookies[name] = decodeURIComponent(value);\r\n }\r\n });\r\n return cookies;\r\n}\r\n","import type { RealtimeStateStore } from \"../types\";\r\n\r\ninterface MemoryValue {\r\n value: any;\r\n expiresAt?: number;\r\n}\r\n\r\ninterface LockEntry {\r\n expiresAt: number;\r\n}\r\n\r\n/**\r\n * In-memory state store implementation.\r\n * Suitable for single-instance deployments.\r\n * \r\n * Features:\r\n * - Key-value storage with optional TTL\r\n * - Atomic increment/decrement\r\n * - List operations (push, range)\r\n * - Set operations (add, remove, members)\r\n * - Optional distributed locks\r\n */\r\nexport class MemoryStateStore implements RealtimeStateStore {\r\n private store: Map<string, MemoryValue> = new Map();\r\n private lists: Map<string, any[]> = new Map();\r\n private sets: Map<string, Set<string>> = new Map();\r\n private locks: Map<string, LockEntry> = new Map();\r\n private cleanupInterval?: NodeJS.Timeout;\r\n\r\n constructor() {\r\n // Cleanup expired entries every 60 seconds\r\n this.cleanupInterval = setInterval(() => {\r\n this.cleanupExpired();\r\n }, 60000);\r\n }\r\n\r\n /**\r\n * Cleanup expired entries\r\n */\r\n private cleanupExpired(): void {\r\n const now = Date.now();\r\n\r\n // Cleanup expired values\r\n for (const [key, entry] of this.store.entries()) {\r\n if (entry.expiresAt && entry.expiresAt < now) {\r\n this.store.delete(key);\r\n }\r\n }\r\n\r\n // Cleanup expired locks\r\n for (const [key, lock] of this.locks.entries()) {\r\n if (lock.expiresAt < now) {\r\n this.locks.delete(key);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Get a value by key\r\n */\r\n async get<T = any>(key: string): Promise<T | null> {\r\n const entry = this.store.get(key);\r\n if (!entry) {\r\n return null;\r\n }\r\n\r\n // Check if expired\r\n if (entry.expiresAt && entry.expiresAt < Date.now()) {\r\n this.store.delete(key);\r\n return null;\r\n }\r\n\r\n return entry.value as T;\r\n }\r\n\r\n /**\r\n * Set a value with optional TTL\r\n */\r\n async set<T = any>(\r\n key: string,\r\n value: T,\r\n opts?: { ttlMs?: number }\r\n ): Promise<void> {\r\n const entry: MemoryValue = {\r\n value,\r\n };\r\n\r\n if (opts?.ttlMs) {\r\n entry.expiresAt = Date.now() + opts.ttlMs;\r\n }\r\n\r\n this.store.set(key, entry);\r\n }\r\n\r\n /**\r\n * Delete a key\r\n */\r\n async del(key: string): Promise<void> {\r\n this.store.delete(key);\r\n this.lists.delete(key);\r\n this.sets.delete(key);\r\n this.locks.delete(key);\r\n }\r\n\r\n /**\r\n * Increment a numeric value\r\n */\r\n async incr(key: string, by: number = 1): Promise<number> {\r\n const current = await this.get<number>(key);\r\n const newValue = (current ?? 0) + by;\r\n await this.set(key, newValue);\r\n return newValue;\r\n }\r\n\r\n /**\r\n * Decrement a numeric value\r\n */\r\n async decr(key: string, by: number = 1): Promise<number> {\r\n return this.incr(key, -by);\r\n }\r\n\r\n /**\r\n * Push to a list (left push)\r\n */\r\n async listPush(\r\n key: string,\r\n value: any,\r\n opts?: { maxLen?: number }\r\n ): Promise<void> {\r\n let list = this.lists.get(key);\r\n if (!list) {\r\n list = [];\r\n this.lists.set(key, list);\r\n }\r\n\r\n list.unshift(value);\r\n\r\n // Trim if maxLen specified\r\n if (opts?.maxLen && list.length > opts.maxLen) {\r\n list.splice(opts.maxLen);\r\n }\r\n }\r\n\r\n /**\r\n * Get range from a list\r\n */\r\n async listRange<T = any>(\r\n key: string,\r\n start: number,\r\n end: number\r\n ): Promise<T[]> {\r\n const list = this.lists.get(key);\r\n if (!list) {\r\n return [];\r\n }\r\n\r\n // Handle negative indices (from end)\r\n const len = list.length;\r\n const actualStart = start < 0 ? Math.max(0, len + start) : Math.min(start, len);\r\n const actualEnd = end < 0 ? Math.max(0, len + end + 1) : Math.min(end + 1, len);\r\n\r\n return list.slice(actualStart, actualEnd) as T[];\r\n }\r\n\r\n /**\r\n * Add member to a set\r\n */\r\n async setAdd(key: string, member: string): Promise<void> {\r\n let set = this.sets.get(key);\r\n if (!set) {\r\n set = new Set<string>();\r\n this.sets.set(key, set);\r\n }\r\n set.add(member);\r\n }\r\n\r\n /**\r\n * Remove member from a set\r\n */\r\n async setRem(key: string, member: string): Promise<void> {\r\n const set = this.sets.get(key);\r\n if (set) {\r\n set.delete(member);\r\n if (set.size === 0) {\r\n this.sets.delete(key);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Get all members of a set\r\n */\r\n async setMembers(key: string): Promise<string[]> {\r\n const set = this.sets.get(key);\r\n if (!set) {\r\n return [];\r\n }\r\n return Array.from(set);\r\n }\r\n\r\n /**\r\n * Acquire a distributed lock\r\n */\r\n async lock(key: string, ttlMs: number): Promise<() => Promise<void>> {\r\n const lockKey = `__lock:${key}`;\r\n const now = Date.now();\r\n const existingLock = this.locks.get(lockKey);\r\n\r\n // Check if lock exists and is still valid\r\n if (existingLock && existingLock.expiresAt > now) {\r\n throw new Error(`Lock '${key}' is already held`);\r\n }\r\n\r\n // Acquire lock\r\n this.locks.set(lockKey, {\r\n expiresAt: now + ttlMs,\r\n });\r\n\r\n // Return unlock function\r\n return async () => {\r\n const lock = this.locks.get(lockKey);\r\n if (lock && lock.expiresAt > Date.now()) {\r\n this.locks.delete(lockKey);\r\n }\r\n };\r\n }\r\n\r\n /**\r\n * Cleanup resources (call when shutting down)\r\n */\r\n destroy(): void {\r\n if (this.cleanupInterval) {\r\n clearInterval(this.cleanupInterval);\r\n this.cleanupInterval = undefined;\r\n }\r\n this.store.clear();\r\n this.lists.clear();\r\n this.sets.clear();\r\n this.locks.clear();\r\n }\r\n}\r\n","import type { RealtimeStateStore } from \"../types\";\r\n\r\n/**\r\n * Redis client type (supports both ioredis and redis packages)\r\n */\r\ntype RedisClient = {\r\n get(key: string): Promise<string | null>;\r\n set(key: string, value: string, ...args: any[]): Promise<string | \"OK\" | null>;\r\n del(key: string): Promise<number>;\r\n incr(key: string): Promise<number>;\r\n incrby(key: string, increment: number): Promise<number>;\r\n decr(key: string): Promise<number>;\r\n decrby(key: string, decrement: number): Promise<number>;\r\n lpush(key: string, ...values: string[]): Promise<number>;\r\n lrange(key: string, start: number, stop: number): Promise<string[]>;\r\n sadd(key: string, ...members: string[]): Promise<number>;\r\n srem(key: string, ...members: string[]): Promise<number>;\r\n smembers(key: string): Promise<string[]>;\r\n eval(script: string, numKeys: number, ...keysAndArgs: string[]): Promise<any>;\r\n psetex(key: string, milliseconds: number, value: string): Promise<string | \"OK\">;\r\n};\r\n\r\n/**\r\n * Redis state store implementation.\r\n * Suitable for multi-instance/cluster deployments.\r\n * \r\n * Features:\r\n * - Key-value storage with TTL\r\n * - Atomic increment/decrement\r\n * - List operations (push, range)\r\n * - Set operations (add, remove, members)\r\n * - Distributed locks using Redis SET NX EX\r\n */\r\nexport class RedisStateStore implements RealtimeStateStore {\r\n private client: RedisClient;\r\n private prefix: string;\r\n\r\n constructor(client: RedisClient, prefix: string = \"loly:rt:\") {\r\n this.client = client;\r\n this.prefix = prefix;\r\n }\r\n\r\n /**\r\n * Add prefix to key\r\n */\r\n private key(key: string): string {\r\n return `${this.prefix}${key}`;\r\n }\r\n\r\n /**\r\n * Serialize value to JSON string\r\n */\r\n private serialize(value: any): string {\r\n return JSON.stringify(value);\r\n }\r\n\r\n /**\r\n * Deserialize JSON string to value\r\n */\r\n private deserialize<T>(value: string | null): T | null {\r\n if (value === null) {\r\n return null;\r\n }\r\n try {\r\n return JSON.parse(value) as T;\r\n } catch {\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Get a value by key\r\n */\r\n async get<T = any>(key: string): Promise<T | null> {\r\n const value = await this.client.get(this.key(key));\r\n return this.deserialize<T>(value);\r\n }\r\n\r\n /**\r\n * Set a value with optional TTL\r\n */\r\n async set<T = any>(\r\n key: string,\r\n value: T,\r\n opts?: { ttlMs?: number }\r\n ): Promise<void> {\r\n const serialized = this.serialize(value);\r\n const prefixedKey = this.key(key);\r\n\r\n if (opts?.ttlMs) {\r\n // Use psetex for TTL\r\n await this.client.psetex(prefixedKey, opts.ttlMs, serialized);\r\n } else {\r\n await this.client.set(prefixedKey, serialized);\r\n }\r\n }\r\n\r\n /**\r\n * Delete a key\r\n */\r\n async del(key: string): Promise<void> {\r\n await this.client.del(this.key(key));\r\n }\r\n\r\n /**\r\n * Increment a numeric value\r\n */\r\n async incr(key: string, by: number = 1): Promise<number> {\r\n const prefixedKey = this.key(key);\r\n if (by === 1) {\r\n return await this.client.incr(prefixedKey);\r\n } else {\r\n return await this.client.incrby(prefixedKey, by);\r\n }\r\n }\r\n\r\n /**\r\n * Decrement a numeric value\r\n */\r\n async decr(key: string, by: number = 1): Promise<number> {\r\n const prefixedKey = this.key(key);\r\n if (by === 1) {\r\n return await this.client.decr(prefixedKey);\r\n } else {\r\n return await this.client.decrby(prefixedKey, by);\r\n }\r\n }\r\n\r\n /**\r\n * Push to a list (left push)\r\n */\r\n async listPush(\r\n key: string,\r\n value: any,\r\n opts?: { maxLen?: number }\r\n ): Promise<void> {\r\n const serialized = this.serialize(value);\r\n const prefixedKey = this.key(key);\r\n\r\n await this.client.lpush(prefixedKey, serialized);\r\n\r\n // Trim if maxLen specified (using LTRIM)\r\n if (opts?.maxLen) {\r\n // LTRIM key 0 maxLen-1 keeps first maxLen elements\r\n await this.client.eval(\r\n `redis.call('ltrim', KEYS[1], 0, ARGV[1])`,\r\n 1,\r\n prefixedKey,\r\n String(opts.maxLen - 1)\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Get range from a list\r\n */\r\n async listRange<T = any>(\r\n key: string,\r\n start: number,\r\n end: number\r\n ): Promise<T[]> {\r\n const prefixedKey = this.key(key);\r\n const values = await this.client.lrange(prefixedKey, start, end);\r\n return values.map((v) => this.deserialize<T>(v)).filter((v) => v !== null) as T[];\r\n }\r\n\r\n /**\r\n * Add member to a set\r\n */\r\n async setAdd(key: string, member: string): Promise<void> {\r\n const prefixedKey = this.key(key);\r\n await this.client.sadd(prefixedKey, member);\r\n }\r\n\r\n /**\r\n * Remove member from a set\r\n */\r\n async setRem(key: string, member: string): Promise<void> {\r\n const prefixedKey = this.key(key);\r\n await this.client.srem(prefixedKey, member);\r\n }\r\n\r\n /**\r\n * Get all members of a set\r\n */\r\n async setMembers(key: string): Promise<string[]> {\r\n const prefixedKey = this.key(key);\r\n return await this.client.smembers(prefixedKey);\r\n }\r\n\r\n /**\r\n * Acquire a distributed lock using Redis SET NX EX\r\n */\r\n async lock(key: string, ttlMs: number): Promise<() => Promise<void>> {\r\n const lockKey = this.key(`__lock:${key}`);\r\n const lockValue = `${Date.now()}-${Math.random()}`;\r\n const ttlSeconds = Math.ceil(ttlMs / 1000);\r\n\r\n // Try to acquire lock: SET lockKey lockValue NX EX ttlSeconds\r\n const result = await this.client.set(\r\n lockKey,\r\n lockValue,\r\n \"NX\", // Only set if not exists\r\n \"EX\", // Expire in seconds\r\n ttlSeconds\r\n );\r\n\r\n if (result === null) {\r\n throw new Error(`Lock '${key}' is already held`);\r\n }\r\n\r\n // Return unlock function\r\n return async () => {\r\n // Lua script to safely unlock (only if value matches)\r\n const unlockScript = `\r\n if redis.call(\"get\", KEYS[1]) == ARGV[1] then\r\n return redis.call(\"del\", KEYS[1])\r\n else\r\n return 0\r\n end\r\n `;\r\n await this.client.eval(unlockScript, 1, lockKey, lockValue);\r\n };\r\n }\r\n}\r\n","import type { RealtimeConfig } from \"@server/config\";\r\nimport type { RealtimeStateStore } from \"../types\";\r\nimport { MemoryStateStore } from \"./memory-store\";\r\nimport { RedisStateStore } from \"./redis-store\";\r\n\r\n/**\r\n * Creates a state store instance based on configuration.\r\n * \r\n * @param config - Realtime configuration\r\n * @returns State store instance\r\n */\r\nexport async function createStateStore(\r\n config: RealtimeConfig\r\n): Promise<RealtimeStateStore> {\r\n if (!config.enabled) {\r\n // Return a no-op store if disabled\r\n return createNoOpStore();\r\n }\r\n\r\n const storeType = config.scale?.stateStore?.name || \"memory\";\r\n const prefix = config.scale?.stateStore?.prefix || \"loly:rt:\";\r\n\r\n if (storeType === \"memory\") {\r\n return new MemoryStateStore();\r\n }\r\n\r\n if (storeType === \"redis\") {\r\n const url = config.scale?.stateStore?.url || process.env.REDIS_URL;\r\n if (!url) {\r\n throw new Error(\r\n \"[loly:realtime] Redis state store requires a URL. \" +\r\n \"Set realtime.scale.stateStore.url or REDIS_URL environment variable\"\r\n );\r\n }\r\n\r\n const client = await createRedisClient(url);\r\n return new RedisStateStore(client, prefix);\r\n }\r\n\r\n throw new Error(\r\n `[loly:realtime] Unknown state store type: ${storeType}. ` +\r\n \"Supported types: 'memory', 'redis'\"\r\n );\r\n}\r\n\r\n/**\r\n * Creates a Redis client (supports both ioredis and redis packages).\r\n */\r\nasync function createRedisClient(url: string): Promise<any> {\r\n // Try ioredis first (more common)\r\n try {\r\n // @ts-ignore - Optional dependency may not be installed\r\n const Redis = await import(\"ioredis\");\r\n return new Redis.default(url);\r\n } catch {\r\n // Fallback to redis package\r\n try {\r\n // @ts-ignore - Optional dependency may not be installed\r\n const { createClient } = await import(\"redis\");\r\n const client = createClient({ url });\r\n await client.connect();\r\n return client;\r\n } catch (err) {\r\n throw new Error(\r\n \"[loly:realtime] Failed to create Redis client. \" +\r\n \"Please install 'ioredis' or 'redis' package. \" +\r\n `Error: ${err instanceof Error ? err.message : String(err)}`\r\n );\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Creates a no-op store (for when realtime is disabled).\r\n */\r\nfunction createNoOpStore(): RealtimeStateStore {\r\n const noOp = async () => {\r\n // No-op\r\n };\r\n const noOpReturn = async () => null;\r\n const noOpNumber = async () => 0;\r\n const noOpArray = async () => [];\r\n const noOpUnlock = async () => {};\r\n\r\n return {\r\n get: noOpReturn,\r\n set: noOp,\r\n del: noOp,\r\n incr: noOpNumber,\r\n decr: noOpNumber,\r\n listPush: noOp,\r\n listRange: noOpArray,\r\n setAdd: noOp,\r\n setRem: noOp,\r\n setMembers: noOpArray,\r\n lock: async () => noOpUnlock,\r\n };\r\n}\r\n\r\nexport { MemoryStateStore } from \"./memory-store\";\r\nexport { RedisStateStore } from \"./redis-store\";\r\n","import type { Socket } from \"socket.io\";\r\nimport type { RealtimeStateStore } from \"../types\";\r\n\r\n/**\r\n * Presence manager for tracking user-to-socket mappings.\r\n * Used for implementing toUser() targeting.\r\n */\r\nexport class PresenceManager {\r\n private stateStore: RealtimeStateStore;\r\n private prefix: string;\r\n\r\n constructor(stateStore: RealtimeStateStore, prefix: string = \"loly:rt:\") {\r\n this.stateStore = stateStore;\r\n this.prefix = prefix;\r\n }\r\n\r\n /**\r\n * Add a socket for a user\r\n */\r\n async addSocketForUser(userId: string, socketId: string): Promise<void> {\r\n const key = this.key(`userSockets:${userId}`);\r\n await this.stateStore.setAdd(key, socketId);\r\n \r\n // Also store reverse mapping\r\n const socketKey = this.key(`socketUser:${socketId}`);\r\n await this.stateStore.set(socketKey, userId);\r\n }\r\n\r\n /**\r\n * Remove a socket for a user\r\n */\r\n async removeSocketForUser(userId: string, socketId: string): Promise<void> {\r\n const key = this.key(`userSockets:${userId}`);\r\n await this.stateStore.setRem(key, socketId);\r\n \r\n // Remove reverse mapping\r\n const socketKey = this.key(`socketUser:${socketId}`);\r\n await this.stateStore.del(socketKey);\r\n \r\n // Check if user has no more sockets\r\n const sockets = await this.stateStore.setMembers(key);\r\n if (sockets.length === 0) {\r\n await this.stateStore.del(key);\r\n }\r\n }\r\n\r\n /**\r\n * Get all socket IDs for a user\r\n */\r\n async getSocketsForUser(userId: string): Promise<string[]> {\r\n const key = this.key(`userSockets:${userId}`);\r\n return await this.stateStore.setMembers(key);\r\n }\r\n\r\n /**\r\n * Get user ID for a socket\r\n */\r\n async getUserForSocket(socketId: string): Promise<string | null> {\r\n const socketKey = this.key(`socketUser:${socketId}`);\r\n return await this.stateStore.get<string>(socketKey);\r\n }\r\n\r\n /**\r\n * Add user to a room's presence (optional feature)\r\n */\r\n async addUserToRoom(namespace: string, room: string, userId: string): Promise<void> {\r\n const key = this.key(`presence:${namespace}:${room}`);\r\n await this.stateStore.setAdd(key, userId);\r\n }\r\n\r\n /**\r\n * Remove user from a room's presence\r\n */\r\n async removeUserFromRoom(namespace: string, room: string, userId: string): Promise<void> {\r\n const key = this.key(`presence:${namespace}:${room}`);\r\n await this.stateStore.setRem(key, userId);\r\n \r\n // Cleanup if room is empty\r\n const members = await this.stateStore.setMembers(key);\r\n if (members.length === 0) {\r\n await this.stateStore.del(key);\r\n }\r\n }\r\n\r\n /**\r\n * Get all users in a room\r\n */\r\n async getUsersInRoom(namespace: string, room: string): Promise<string[]> {\r\n const key = this.key(`presence:${namespace}:${room}`);\r\n return await this.stateStore.setMembers(key);\r\n }\r\n\r\n /**\r\n * Add prefix to key\r\n */\r\n private key(key: string): string {\r\n return `${this.prefix}${key}`;\r\n }\r\n}\r\n","/**\r\n * Token bucket implementation for rate limiting.\r\n */\r\nexport class TokenBucket {\r\n private tokens: number;\r\n private lastRefill: number;\r\n private readonly capacity: number;\r\n private readonly refillRate: number; // tokens per second\r\n\r\n constructor(capacity: number, refillRate: number) {\r\n this.capacity = capacity;\r\n this.refillRate = refillRate;\r\n this.tokens = capacity;\r\n this.lastRefill = Date.now();\r\n }\r\n\r\n /**\r\n * Try to consume tokens. Returns true if successful, false if rate limited.\r\n */\r\n consume(tokens: number = 1): boolean {\r\n this.refill();\r\n\r\n if (this.tokens >= tokens) {\r\n this.tokens -= tokens;\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Get current available tokens\r\n */\r\n getAvailable(): number {\r\n this.refill();\r\n return this.tokens;\r\n }\r\n\r\n /**\r\n * Refill tokens based on elapsed time\r\n */\r\n private refill(): void {\r\n const now = Date.now();\r\n const elapsed = (now - this.lastRefill) / 1000; // seconds\r\n const tokensToAdd = elapsed * this.refillRate;\r\n\r\n this.tokens = Math.min(this.capacity, this.tokens + tokensToAdd);\r\n this.lastRefill = now;\r\n }\r\n\r\n /**\r\n * Reset bucket to full capacity\r\n */\r\n reset(): void {\r\n this.tokens = this.capacity;\r\n this.lastRefill = Date.now();\r\n }\r\n}\r\n","import type { RealtimeStateStore, RateLimitCfg } from \"../types\";\r\nimport { TokenBucket } from \"./token-bucket\";\r\n\r\n/**\r\n * Rate limiter using token bucket algorithm.\r\n * Supports both in-memory (single instance) and state store (cluster) modes.\r\n */\r\nexport class RateLimiter {\r\n private stateStore?: RealtimeStateStore;\r\n private memoryBuckets: Map<string, TokenBucket> = new Map();\r\n private prefix: string;\r\n\r\n constructor(stateStore?: RealtimeStateStore, prefix: string = \"loly:rt:rate:\") {\r\n this.stateStore = stateStore;\r\n this.prefix = prefix;\r\n }\r\n\r\n /**\r\n * Check if a request should be rate limited.\r\n * \r\n * @param key - Unique key for the rate limit (e.g., socketId or socketId:eventName)\r\n * @param config - Rate limit configuration\r\n * @returns true if allowed, false if rate limited\r\n */\r\n async checkLimit(key: string, config: RateLimitCfg): Promise<boolean> {\r\n const fullKey = `${this.prefix}${key}`;\r\n const burst = config.burst || config.eventsPerSecond * 2;\r\n\r\n if (this.stateStore) {\r\n // Use state store for distributed rate limiting\r\n return this.checkLimitWithStore(fullKey, config.eventsPerSecond, burst);\r\n } else {\r\n // Use in-memory token bucket\r\n return this.checkLimitInMemory(fullKey, config.eventsPerSecond, burst);\r\n }\r\n }\r\n\r\n /**\r\n * Check rate limit using state store (for cluster mode)\r\n */\r\n private async checkLimitWithStore(\r\n key: string,\r\n ratePerSecond: number,\r\n burst: number\r\n ): Promise<boolean> {\r\n // Simple implementation: use a counter with TTL\r\n // In production, you might want a more sophisticated sliding window\r\n const count = await this.stateStore!.get<number>(key) || 0;\r\n \r\n if (count >= burst) {\r\n return false; // Rate limited\r\n }\r\n\r\n // Increment counter\r\n await this.stateStore!.incr(key, 1);\r\n \r\n // Set TTL to reset window (1 second)\r\n await this.stateStore!.set(key, count + 1, { ttlMs: 1000 });\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Check rate limit using in-memory token bucket\r\n */\r\n private checkLimitInMemory(\r\n key: string,\r\n ratePerSecond: number,\r\n burst: number\r\n ): boolean {\r\n let bucket = this.memoryBuckets.get(key);\r\n \r\n if (!bucket) {\r\n bucket = new TokenBucket(burst, ratePerSecond);\r\n this.memoryBuckets.set(key, bucket);\r\n }\r\n\r\n return bucket.consume(1);\r\n }\r\n\r\n /**\r\n * Cleanup old buckets (call periodically)\r\n */\r\n cleanup(): void {\r\n // Remove buckets that haven't been used in a while\r\n // For now, we'll keep all buckets (they're lightweight)\r\n // In production, you might want to implement LRU eviction\r\n }\r\n}\r\n","import type { Socket } from \"socket.io\";\r\nimport type { AuthFn, AuthContext } from \"../types\";\r\n\r\n/**\r\n * Executes the auth hook and sets the user on the socket.\r\n * \r\n * @param authFn - The auth function from the route definition\r\n * @param socket - The Socket.IO socket\r\n * @param namespace - The namespace path\r\n * @returns The authenticated user or null\r\n */\r\nexport async function executeAuth(\r\n authFn: AuthFn | undefined,\r\n socket: Socket,\r\n namespace: string\r\n): Promise<any | null> {\r\n if (!authFn) {\r\n return null;\r\n }\r\n\r\n // Build auth context\r\n const authCtx: AuthContext = {\r\n req: {\r\n headers: socket.handshake.headers as Record<string, string | string[] | undefined>,\r\n ip: socket.handshake.address,\r\n url: socket.handshake.url,\r\n cookies: socket.handshake.headers.cookie\r\n ? parseCookies(socket.handshake.headers.cookie)\r\n : undefined,\r\n },\r\n socket,\r\n namespace,\r\n };\r\n\r\n // Execute auth function\r\n const user = await authFn(authCtx);\r\n\r\n // Store user on socket\r\n if (user) {\r\n (socket as any).data = (socket as any).data || {};\r\n (socket as any).data.user = user;\r\n }\r\n\r\n return user;\r\n}\r\n\r\n/**\r\n * Parse cookie string into object\r\n */\r\nfunction parseCookies(cookieString: string): Record<string, string> {\r\n const cookies: Record<string, string> = {};\r\n cookieString.split(\";\").forEach((cookie) => {\r\n const [name, value] = cookie.trim().split(\"=\");\r\n if (name && value) {\r\n cookies[name] = decodeURIComponent(value);\r\n }\r\n });\r\n return cookies;\r\n}\r\n","import type { GuardFn, WssContext } from \"../types\";\r\n\r\n/**\r\n * Executes a guard function to check if an event should be allowed.\r\n * \r\n * @param guardFn - The guard function\r\n * @param ctx - The WSS context\r\n * @returns true if allowed, false if blocked\r\n */\r\nexport async function executeGuard(\r\n guardFn: GuardFn | undefined,\r\n ctx: WssContext\r\n): Promise<boolean> {\r\n if (!guardFn) {\r\n return true; // No guard = allow\r\n }\r\n\r\n const guardCtx = {\r\n user: ctx.user,\r\n req: ctx.req,\r\n socket: ctx.socket,\r\n namespace: ctx.pathname,\r\n };\r\n\r\n const result = await guardFn(guardCtx);\r\n return result === true;\r\n}\r\n","import type { Schema, WssContext } from \"../types\";\r\n\r\n/**\r\n * Validates event data against a schema.\r\n * \r\n * @param schema - The validation schema (Zod/Valibot compatible)\r\n * @param data - The data to validate\r\n * @returns Validation result with success flag and data/error\r\n */\r\nexport function validateSchema(\r\n schema: Schema | undefined,\r\n data: any\r\n): { success: boolean; data?: any; error?: any } {\r\n if (!schema) {\r\n return { success: true, data };\r\n }\r\n\r\n // Try safeParse first (Zod/Valibot style)\r\n if (typeof schema.safeParse === \"function\") {\r\n const result = schema.safeParse(data);\r\n if (result.success) {\r\n return { success: true, data: result.data };\r\n } else {\r\n return { success: false, error: result.error };\r\n }\r\n }\r\n\r\n // Fallback to parse (Zod style)\r\n if (typeof schema.parse === \"function\") {\r\n try {\r\n const parsed = schema.parse(data);\r\n return { success: true, data: parsed };\r\n } catch (error) {\r\n return { success: false, error };\r\n }\r\n }\r\n\r\n // Unknown schema type\r\n return {\r\n success: false,\r\n error: new Error(\"Schema must have 'parse' or 'safeParse' method\"),\r\n };\r\n}\r\n","import type { RealtimeLogger } from \"../types\";\r\nimport type { Socket } from \"socket.io\";\r\n\r\n/**\r\n * Creates a logger with WSS context.\r\n */\r\nexport function createWssLogger(\r\n namespace: string,\r\n socket: Socket,\r\n baseLogger?: any\r\n): RealtimeLogger {\r\n const context = {\r\n namespace,\r\n socketId: socket.id,\r\n userId: (socket as any).data?.user?.id || null,\r\n };\r\n\r\n const log = (level: string, message: string, meta?: Record<string, any>) => {\r\n const fullMeta = {\r\n ...context,\r\n ...meta,\r\n requestId: (socket as any).requestId || generateRequestId(),\r\n };\r\n\r\n if (baseLogger) {\r\n baseLogger[level](message, fullMeta);\r\n } else {\r\n console[level === \"error\" ? \"error\" : \"log\"](\r\n `[${level.toUpperCase()}] [${namespace}] ${message}`,\r\n fullMeta\r\n );\r\n }\r\n };\r\n\r\n return {\r\n debug: (message: string, meta?: Record<string, any>) => log(\"debug\", message, meta),\r\n info: (message: string, meta?: Record<string, any>) => log(\"info\", message, meta),\r\n warn: (message: string, meta?: Record<string, any>) => log(\"warn\", message, meta),\r\n error: (message: string, meta?: Record<string, any>) => log(\"error\", message, meta),\r\n };\r\n}\r\n\r\n/**\r\n * Generate a simple request ID\r\n */\r\nfunction generateRequestId(): string {\r\n return `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\r\n}\r\n","import http from \"http\";\r\nimport express from \"express\";\r\nimport cors from \"cors\";\r\nimport helmet from \"helmet\";\r\nimport cookieParser from \"cookie-parser\";\r\nimport compression from \"compression\";\r\nimport crypto from \"crypto\";\r\nimport { getServerConfig } from \"@server/config\";\r\nimport { createRateLimiter, createRateLimiterFromConfig } from \"@server/middleware/rate-limit\";\r\nimport { requestLoggerMiddleware, createModuleLogger } from \"@logger/index\";\r\n\r\ninterface SetupAppOptions {\r\n projectRoot: string;\r\n}\r\n\r\nexport const setupApplication = async ({\r\n projectRoot,\r\n}: SetupAppOptions): Promise<{\r\n app: express.Express;\r\n httpServer: http.Server<\r\n typeof http.IncomingMessage,\r\n typeof http.ServerResponse\r\n >;\r\n}> => {\r\n const app = express();\r\n\r\n const serverConfig = await getServerConfig(projectRoot);\r\n\r\n const { bodyLimit, corsOrigin, rateLimit, security } = serverConfig;\r\n\r\n // Security: Helmet with configurable CSP\r\n const helmetConfig: any = {};\r\n\r\n if (security?.contentSecurityPolicy !== false) {\r\n // In development, allow unsafe-inline and unsafe-eval for hot reload\r\n if (process.env.NODE_ENV === \"development\") {\r\n helmetConfig.contentSecurityPolicy = {\r\n directives: {\r\n defaultSrc: [\"'self'\"],\r\n styleSrc: [\r\n \"'self'\",\r\n \"'unsafe-inline'\",\r\n \"https://fonts.googleapis.com\",\r\n ],\r\n scriptSrc: [\"'self'\", \"'unsafe-inline'\", \"'unsafe-eval'\"],\r\n imgSrc: [\"'self'\", \"data:\", \"https:\"],\r\n // Allow fetch/XHR to any HTTPS endpoint - users can restrict in their config if needed\r\n connectSrc: [\"'self'\", \"ws:\", \"wss:\", \"https:\"],\r\n fontSrc: [\"'self'\", \"data:\", \"https://fonts.gstatic.com\"],\r\n },\r\n };\r\n } else {\r\n // Use function-based CSP to enable nonce support in production\r\n const userCSP = security?.contentSecurityPolicy;\r\n const nonceFunction = (req: express.Request, res: express.Response) => {\r\n // Nonce is generated by middleware and stored in res.locals.nonce\r\n // This allows inline scripts with the nonce attribute\r\n const nonce = (res as any).locals?.nonce || \"\";\r\n return nonce ? `'nonce-${nonce}'` : \"'self'\";\r\n };\r\n\r\n const defaultCSP = {\r\n directives: {\r\n defaultSrc: [\"'self'\"],\r\n styleSrc: [\r\n \"'self'\",\r\n \"'unsafe-inline'\",\r\n \"https://fonts.googleapis.com\",\r\n ],\r\n scriptSrc: [\"'self'\", nonceFunction],\r\n imgSrc: [\"'self'\", \"data:\", \"https:\"],\r\n // Allow fetch/XHR to any HTTPS endpoint - users can restrict in their config if needed\r\n connectSrc: [\"'self'\", \"https:\"],\r\n fontSrc: [\"'self'\", \"data:\", \"https://fonts.gstatic.com\"],\r\n objectSrc: [\"'none'\"],\r\n mediaSrc: [\"'self'\", \"https:\"],\r\n frameSrc: [\"'none'\"],\r\n },\r\n };\r\n\r\n if (userCSP && typeof userCSP === \"object\" && !Array.isArray(userCSP)) {\r\n // Merge user CSP with default, but ensure scriptSrc includes nonce support\r\n const userDirectives = userCSP.directives || {};\r\n const mergedDirectives: any = {\r\n ...defaultCSP.directives,\r\n ...userDirectives,\r\n };\r\n\r\n // Ensure scriptSrc includes nonce support even if user provided custom scriptSrc\r\n const userScriptSrc = userDirectives.scriptSrc;\r\n if (userScriptSrc && Array.isArray(userScriptSrc)) {\r\n // Check if nonce function is already included\r\n const hasNonceSupport = userScriptSrc.some(\r\n (src) => typeof src === \"function\"\r\n );\r\n\r\n if (!hasNonceSupport) {\r\n // Add nonce function to user's scriptSrc\r\n mergedDirectives.scriptSrc = [...userScriptSrc, nonceFunction];\r\n } else {\r\n mergedDirectives.scriptSrc = userScriptSrc;\r\n }\r\n }\r\n\r\n // Ensure connectSrc includes https: for flexibility - merge arrays instead of replacing\r\n const userConnectSrc = userDirectives.connectSrc;\r\n if (userConnectSrc && Array.isArray(userConnectSrc)) {\r\n // If user provided connectSrc, merge with defaults to ensure https: is included\r\n const defaultConnectSrc = defaultCSP.directives.connectSrc || [];\r\n const mergedConnectSrc = [\r\n ...new Set([...defaultConnectSrc, ...userConnectSrc]),\r\n ];\r\n mergedDirectives.connectSrc = mergedConnectSrc;\r\n }\r\n\r\n // Ensure styleSrc includes Google Fonts\r\n const userStyleSrc = userDirectives.styleSrc;\r\n if (userStyleSrc && Array.isArray(userStyleSrc)) {\r\n const defaultStyleSrc = defaultCSP.directives.styleSrc || [];\r\n const mergedStyleSrc = [\r\n ...new Set([...defaultStyleSrc, ...userStyleSrc]),\r\n ];\r\n mergedDirectives.styleSrc = mergedStyleSrc;\r\n }\r\n\r\n // Ensure fontSrc includes Google Fonts\r\n const userFontSrc = userDirectives.fontSrc;\r\n if (userFontSrc && Array.isArray(userFontSrc)) {\r\n const defaultFontSrc = defaultCSP.directives.fontSrc || [];\r\n const mergedFontSrc = [\r\n ...new Set([...defaultFontSrc, ...userFontSrc]),\r\n ];\r\n mergedDirectives.fontSrc = mergedFontSrc;\r\n }\r\n\r\n helmetConfig.contentSecurityPolicy = {\r\n ...userCSP,\r\n directives: mergedDirectives,\r\n };\r\n } else {\r\n helmetConfig.contentSecurityPolicy = defaultCSP;\r\n }\r\n }\r\n } else {\r\n helmetConfig.contentSecurityPolicy = false;\r\n }\r\n\r\n // HSTS configuration\r\n if (security?.hsts !== false) {\r\n helmetConfig.hsts =\r\n security?.hsts === true\r\n ? { maxAge: 31536000, includeSubDomains: true }\r\n : security?.hsts;\r\n } else {\r\n helmetConfig.hsts = false;\r\n }\r\n\r\n // Generate nonce for CSP inline scripts (only in production)\r\n // In development, unsafe-inline is allowed\r\n // IMPORTANT: This must run BEFORE helmet so the nonce is available when CSP is evaluated\r\n if (\r\n process.env.NODE_ENV !== \"development\" &&\r\n security?.contentSecurityPolicy !== false\r\n ) {\r\n app.use(\r\n (\r\n req: express.Request,\r\n res: express.Response,\r\n next: express.NextFunction\r\n ) => {\r\n // Generate a unique nonce for this request\r\n const nonce = crypto.randomBytes(16).toString(\"base64\");\r\n (res.locals as any).nonce = nonce;\r\n next();\r\n }\r\n );\r\n }\r\n\r\n app.use(helmet(helmetConfig));\r\n\r\n // Logging: Request logger middleware (adds request ID and logs requests/responses)\r\n // Must be early in the middleware chain to capture all requests\r\n // Filters out static assets and other noisy paths by default\r\n const appLogger = createModuleLogger(\"framework\");\r\n app.use(\r\n requestLoggerMiddleware({\r\n logger: appLogger.child({ component: \"server\" }),\r\n logRequests: process.env.LOG_REQUESTS === \"true\", // Default to false (only errors/warnings)\r\n logResponses: process.env.LOG_RESPONSES !== \"false\", // Default to true (but filtered)\r\n logStaticAssets: process.env.LOG_STATIC_ASSETS === \"true\", // Default to false\r\n })\r\n );\r\n\r\n // Security: CORS with proper origin validation\r\n const corsOptions: cors.CorsOptions = {\r\n credentials: true,\r\n };\r\n\r\n if (typeof corsOrigin === \"function\") {\r\n corsOptions.origin = corsOrigin;\r\n } else if (Array.isArray(corsOrigin)) {\r\n corsOptions.origin = corsOrigin.length > 0 ? corsOrigin : false;\r\n } else if (corsOrigin === true) {\r\n // Allow all origins (development only)\r\n corsOptions.origin = true;\r\n } else if (typeof corsOrigin === \"string\") {\r\n corsOptions.origin =\r\n corsOrigin === \"*\"\r\n ? process.env.NODE_ENV === \"development\"\r\n ? true\r\n : false\r\n : [corsOrigin];\r\n } else {\r\n // Default: no CORS in production, allow all in development\r\n corsOptions.origin = process.env.NODE_ENV === \"development\";\r\n }\r\n\r\n app.use(cors(corsOptions));\r\n\r\n // Security: Rate limiting\r\n // Apply rate limiting in production, or in development if explicitly enabled\r\n if (rateLimit) {\r\n // In development, only apply if explicitly configured (not just defaults)\r\n const shouldApply = process.env.NODE_ENV !== \"development\" || \r\n process.env.ENABLE_RATE_LIMIT === \"true\";\r\n \r\n if (shouldApply) {\r\n try {\r\n const generalLimiter = createRateLimiterFromConfig(rateLimit, false);\r\n \r\n if (generalLimiter) {\r\n // Apply general rate limiting to all routes\r\n app.use(generalLimiter);\r\n \r\n const logger = createModuleLogger(\"server\");\r\n logger.info(\"Rate limiting enabled\", {\r\n windowMs: rateLimit.windowMs ?? 15 * 60 * 1000,\r\n max: rateLimit.max ?? 100,\r\n apiMax: rateLimit.apiMax,\r\n strictMax: rateLimit.strictMax,\r\n strictPatterns: rateLimit.strictPatterns?.length ?? 0,\r\n });\r\n }\r\n } catch (error) {\r\n const logger = createModuleLogger(\"server\");\r\n logger.error(\"Failed to setup rate limiting\", {\r\n error: error instanceof Error ? error.message : String(error),\r\n });\r\n // Don't throw - continue without rate limiting rather than crashing\r\n }\r\n }\r\n }\r\n\r\n app.use(cookieParser());\r\n\r\n app.use(express.json({ limit: bodyLimit }));\r\n app.use(express.urlencoded({ extended: true, limit: bodyLimit }));\r\n\r\n app.use(compression());\r\n\r\n // Create http server\r\n const httpServer = http.createServer(app);\r\n\r\n return {\r\n app,\r\n httpServer,\r\n };\r\n};\r\n","import path from \"path\";\r\nimport type { LoadedRoute } from \"@router/index\";\r\nimport { buildPathFromPattern } from \"./path\";\r\nimport { renderStaticRoute } from \"./renderer\";\r\nimport { ensureDir } from \"../utils\";\r\nimport { BUILD_FOLDER_NAME } from \"@constants/globals\";\r\n\r\n/**\r\n * Builds static pages for routes marked with `dynamic: \"force-static\"`.\r\n * \r\n * For each static route:\r\n * 1. Calls `generateStaticParams()` to get all parameter combinations\r\n * 2. Renders each combination to HTML and data.json\r\n * 3. Writes files to `{BUILD_FOLDER_NAME}/ssg/{path}/index.html` and `data.json`\r\n * \r\n * @param projectRoot - Root directory of the project\r\n * @param routes - Array of loaded routes\r\n * \r\n * @example\r\n * await buildStaticPages('/path/to/project', routes);\r\n *\r\n */\r\nexport async function buildStaticPages(\r\n projectRoot: string,\r\n routes: LoadedRoute[]\r\n): Promise<void> {\r\n const ssgOutDir = path.join(projectRoot, BUILD_FOLDER_NAME, \"ssg\");\r\n ensureDir(ssgOutDir);\r\n\r\n for (const route of routes) {\r\n // Only process routes marked as static\r\n if (route.dynamic !== \"force-static\") continue;\r\n\r\n let allParams: Array<Record<string, string>> = [];\r\n\r\n if (route.paramNames.length === 0) {\r\n allParams = [{}];\r\n } else {\r\n if (!route.generateStaticParams) {\r\n console.warn(\r\n `⚠️ [framework][ssg] Route \"${route.pattern}\" is marked as force-static but has no generateStaticParams function`\r\n );\r\n console.warn(` 💡 Add a generateStaticParams export to enable static generation for this route`);\r\n console.warn(` Skipping this route...\\n`);\r\n continue;\r\n }\r\n \r\n try {\r\n console.log(`📦 [framework][ssg] Generating static params for route: ${route.pattern}`);\r\n \r\n // Add timeout to detect hanging\r\n let timeoutId: NodeJS.Timeout | null = null;\r\n const timeoutPromise = new Promise((_, reject) => {\r\n timeoutId = setTimeout(() => {\r\n reject(new Error(`generateStaticParams for route ${route.pattern} timed out after 30 seconds`));\r\n }, 30000);\r\n });\r\n \r\n const sp = await Promise.race([\r\n route.generateStaticParams(),\r\n timeoutPromise\r\n ]) as Array<Record<string, string>>;\r\n \r\n // Clear timeout if it's still pending\r\n if (timeoutId) {\r\n clearTimeout(timeoutId);\r\n }\r\n \r\n allParams = sp;\r\n console.log(` ✅ Generated ${sp.length} static params for route: ${route.pattern}`);\r\n } catch (error) {\r\n console.error(`\\n❌ [framework][ssg] Error generating static params for route \"${route.pattern}\":`);\r\n console.error(error instanceof Error ? error.message : String(error));\r\n if (error instanceof Error && error.stack) {\r\n console.error(` Stack: ${error.stack.split('\\n').slice(0, 3).join('\\n ')}`);\r\n }\r\n console.error(`💡 Check your generateStaticParams function for this route\\n`);\r\n throw error;\r\n }\r\n }\r\n for (const params of allParams) {\r\n const urlPath = buildPathFromPattern(route.pattern, params);\r\n await renderStaticRoute(projectRoot, ssgOutDir, route, urlPath, params);\r\n }\r\n }\r\n \r\n console.log(`✅ [framework][ssg] Finished building all static pages`);\r\n}\r\n\r\n","import path from \"path\";\r\n\r\n/**\r\n * Builds a URL path from a route pattern and parameters.\r\n * \r\n * Replaces dynamic segments ([slug], [...path]) with actual parameter values.\r\n * \r\n * @param pattern - Route pattern (e.g., '/blog/[slug]', '/post/[...path]')\r\n * @param params - Parameter values to substitute\r\n * @returns Actual URL path\r\n * \r\n * @example\r\n * buildPathFromPattern('/blog/[slug]', { slug: 'my-post' })\r\n * // '/blog/my-post'\r\n * \r\n * buildPathFromPattern('/post/[...path]', { path: 'a/b/c' })\r\n * // '/post/a/b/c'\r\n * \r\n * @throws Error if required parameters are missing\r\n */\r\nexport function buildPathFromPattern(\r\n pattern: string,\r\n params: Record<string, string>\r\n): string {\r\n const segments = pattern.split(\"/\").filter(Boolean);\r\n const parts: string[] = [];\r\n\r\n for (const seg of segments) {\r\n // Catch-all parameter: [...path]\r\n if (seg.startsWith(\"[...\") && seg.endsWith(\"]\")) {\r\n const name = seg.slice(4, -1);\r\n const value = params[name];\r\n if (!value) {\r\n throw new Error(\r\n `Missing parameter \"${name}\" for catch-all pattern \"${pattern}\"`\r\n );\r\n }\r\n parts.push(value);\r\n }\r\n // Normal parameter: [slug]\r\n else if (seg.startsWith(\"[\") && seg.endsWith(\"]\")) {\r\n const name = seg.slice(1, -1);\r\n const value = params[name];\r\n if (!value) {\r\n throw new Error(`Missing parameter \"${name}\" for pattern \"${pattern}\"`);\r\n }\r\n parts.push(encodeURIComponent(value));\r\n }\r\n // Static segment\r\n else {\r\n parts.push(seg);\r\n }\r\n }\r\n\r\n return \"/\" + parts.join(\"/\");\r\n}\r\n\r\n/**\r\n * Converts a URL path to an output directory path.\r\n * \r\n * @param baseDir - Base output directory\r\n * @param urlPath - URL path (e.g., '/blog/my-post' or '/')\r\n * @returns Directory path relative to baseDir\r\n * \r\n * @example\r\n * pathToOutDir('/output/ssg', '/blog/my-post')\r\n * // '/output/ssg/blog/my-post'\r\n * \r\n * pathToOutDir('/output/ssg', '/')\r\n * // '/output/ssg'\r\n */\r\nexport function pathToOutDir(baseDir: string, urlPath: string): string {\r\n const clean = urlPath === \"/\" ? \"\" : urlPath.replace(/^\\/+/, \"\");\r\n return path.join(baseDir, clean);\r\n}\r\n\r\n","import fs from \"fs\";\r\nimport path from \"path\";\r\nimport { renderToString } from \"react-dom/server\";\r\nimport { loadChunksFromManifest, type LoadedRoute, type LoaderResult, type ServerContext } from \"@router/index\";\r\nimport {\r\n buildAppTree,\r\n buildInitialData,\r\n buildRouterData,\r\n createDocumentTree,\r\n} from \"@rendering/index\";\r\nimport { pathToOutDir } from \"./path\";\r\nimport { ensureDir, getClientJsPath, getClientCssPath, loadAssetManifest } from \"../utils\";\r\nimport { STATIC_PATH } from \"@constants/globals\";\r\nimport { mergeMetadata } from \"../../server/handlers/pages\";\r\n\r\n/**\r\n * Renders a static page for SSG.\r\n * \r\n * Executes middlewares and loader, then renders the React component tree\r\n * to HTML. Writes both the HTML file and the data JSON file.\r\n * \r\n * @param projectRoot - Root directory of the project\r\n * @param ssgOutDir - SSG output directory\r\n * @param route - Route definition\r\n * @param urlPath - URL path for this page\r\n * @param params - Route parameters\r\n * \r\n * @example\r\n * await renderStaticRoute(\r\n * '/project',\r\n * '/project/{BUILD_FOLDER_NAME}/ssg',\r\n * route,\r\n * '/blog/my-post',\r\n * { slug: 'my-post' }\r\n * );\r\n */\r\nexport async function renderStaticRoute(\r\n projectRoot: string,\r\n ssgOutDir: string,\r\n route: LoadedRoute,\r\n urlPath: string,\r\n params: Record<string, string>\r\n): Promise<void> {\r\n const routeChunks = loadChunksFromManifest(projectRoot);\r\n const assetManifest = loadAssetManifest(projectRoot);\r\n const clientJsPath = getClientJsPath(projectRoot);\r\n const clientCssPath = getClientCssPath(projectRoot);\r\n \r\n // Get chunk href with hash if available\r\n const chunkName = routeChunks[route.pattern];\r\n let chunkHref: string | null = null;\r\n if (chunkName != null) {\r\n if (assetManifest && assetManifest.chunks[chunkName]) {\r\n chunkHref = `${STATIC_PATH}/${assetManifest.chunks[chunkName]}`;\r\n } else {\r\n chunkHref = `${STATIC_PATH}/${chunkName}.js`;\r\n }\r\n }\r\n\r\n // Get entrypoint files in order for preload\r\n const entrypointFiles: string[] = [];\r\n if (assetManifest?.entrypoints?.client) {\r\n entrypointFiles.push(...assetManifest.entrypoints.client.map(file => `${STATIC_PATH}/${file}`));\r\n }\r\n\r\n // Mock request/response objects for SSG\r\n const req: any = {\r\n method: \"GET\",\r\n headers: {},\r\n query: {},\r\n path: urlPath,\r\n };\r\n\r\n const res: any = {\r\n statusCode: 200,\r\n headers: {} as Record<string, string>,\r\n setHeader(name: string, value: string) {\r\n this.headers[name.toLowerCase()] = value;\r\n },\r\n get headersSent() {\r\n return false;\r\n },\r\n };\r\n\r\n const ctx: ServerContext = {\r\n req,\r\n res,\r\n params,\r\n pathname: urlPath,\r\n locals: {},\r\n };\r\n\r\n // Execute middlewares\r\n for (const mw of route.middlewares) {\r\n await Promise.resolve(\r\n mw(ctx, async () => {\r\n /* no-op */\r\n })\r\n );\r\n }\r\n\r\n // 1. Execute layout server hooks (root → specific) and collect props + metadata\r\n const layoutProps: Record<string, any> = {};\r\n const layoutMetadata: Array<LoaderResult[\"metadata\"]> = [];\r\n\r\n if (route.layoutServerHooks && route.layoutServerHooks.length > 0) {\r\n for (let i = 0; i < route.layoutServerHooks.length; i++) {\r\n const layoutServerHook = route.layoutServerHooks[i];\r\n if (layoutServerHook) {\r\n try {\r\n const layoutResult = await layoutServerHook(ctx);\r\n // Merge props (more specific layouts override general ones)\r\n if (layoutResult.props) {\r\n Object.assign(layoutProps, layoutResult.props);\r\n }\r\n // Collect metadata from layouts (will be merged later)\r\n if (layoutResult.metadata) {\r\n layoutMetadata.push(layoutResult.metadata);\r\n }\r\n } catch (error) {\r\n // Log error but continue (layout server hook failure shouldn't break SSG)\r\n console.warn(\r\n `⚠️ [framework][ssg] Layout server hook ${i} failed for route ${route.pattern}:`,\r\n error instanceof Error ? error.message : String(error)\r\n );\r\n if (error instanceof Error && error.stack) {\r\n console.warn(` Stack: ${error.stack.split('\\n').slice(0, 3).join('\\n ')}`);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n // 2. Execute page server hook (getServerSideProps)\r\n let loaderResult: LoaderResult = { props: {} };\r\n\r\n if (route.loader) {\r\n loaderResult = await route.loader(ctx);\r\n }\r\n\r\n // 3. Combine props: layout props (stable) + page props (page overrides layout)\r\n const combinedProps = {\r\n ...layoutProps,\r\n ...(loaderResult.props || {}),\r\n };\r\n\r\n // 4. Combine metadata: layout metadata (base) + page metadata (page overrides layout)\r\n // Layout metadata provides defaults (like site-wide Open Graph, canonical base, etc.)\r\n // Page metadata can override specific fields or add page-specific data\r\n let combinedMetadata: LoaderResult[\"metadata\"] = null;\r\n \r\n // Start with layout metadata (most general first, then more specific)\r\n // Later layouts override earlier ones, then page overrides all\r\n for (const layoutMeta of layoutMetadata) {\r\n if (layoutMeta) {\r\n combinedMetadata = mergeMetadata(combinedMetadata, layoutMeta);\r\n }\r\n }\r\n \r\n // Finally, page metadata overrides everything\r\n if (loaderResult.metadata) {\r\n combinedMetadata = mergeMetadata(combinedMetadata, loaderResult.metadata);\r\n }\r\n\r\n // Create combined loader result with merged props and metadata\r\n const combinedLoaderResult: LoaderResult = {\r\n ...loaderResult,\r\n props: combinedProps,\r\n metadata: combinedMetadata,\r\n };\r\n\r\n if (combinedLoaderResult.redirect || combinedLoaderResult.notFound) {\r\n return;\r\n }\r\n\r\n // Build React component tree with combined props\r\n const initialData = buildInitialData(urlPath, params, combinedLoaderResult);\r\n const routerData = buildRouterData(req);\r\n const appTree = buildAppTree(route, params, initialData.props);\r\n const documentTree = createDocumentTree({\r\n appTree,\r\n initialData,\r\n routerData,\r\n meta: combinedLoaderResult.metadata,\r\n titleFallback: \"My Framework Dev\",\r\n descriptionFallback: \"Static page generated by @lolyjs/core.\",\r\n chunkHref,\r\n entrypointFiles,\r\n clientJsPath,\r\n clientCssPath,\r\n includeInlineScripts: true, // SSG needs inline scripts (renderToString doesn't support bootstrapScripts)\r\n });\r\n\r\n // Render to HTML (hydratable, same as SSR)\r\n // Note: renderToString doesn't support bootstrapScripts like renderToPipeableStream,\r\n // so scripts remain in body (acceptable for SSG as it's pre-rendered)\r\n const html = \"<!DOCTYPE html>\" + renderToString(documentTree);\r\n\r\n // Write files\r\n const dir = pathToOutDir(ssgOutDir, urlPath);\r\n ensureDir(dir);\r\n\r\n const htmlFile = path.join(dir, \"index.html\");\r\n const dataFile = path.join(dir, \"data.json\");\r\n\r\n fs.writeFileSync(htmlFile, html, \"utf-8\");\r\n fs.writeFileSync(dataFile, JSON.stringify(initialData, null, 2), \"utf-8\");\r\n}\r\n\r\n","import path from \"path\";\r\nimport fs from \"fs\";\r\nimport esbuild from \"esbuild\";\r\nimport { ensureDir, loadAliasesFromTsconfig } from \"../utils\";\r\nimport { INIT_FILE_NAME } from \"@server/init\";\r\nimport { CONFIG_FILE_NAME } from \"@server/config\";\r\nimport { BUILD_FOLDER_NAME } from \"@constants/globals\";\r\n\r\nconst SERVER_FILES = [INIT_FILE_NAME, CONFIG_FILE_NAME];\r\n\r\nexport interface BuildServerResult {\r\n outDir: string;\r\n}\r\n\r\n/**\r\n * Creates an esbuild plugin that resolves TypeScript path aliases to relative paths.\r\n * This is needed when bundle: false because esbuild doesn't resolve aliases in that mode.\r\n * \r\n * @param projectRoot - Root directory of the project\r\n * @param outDir - Output directory where compiled files will be placed\r\n * @returns esbuild plugin that resolves path aliases\r\n */\r\nfunction createPathAliasPlugin(\r\n projectRoot: string,\r\n outDir: string\r\n): esbuild.Plugin {\r\n const aliases = loadAliasesFromTsconfig(projectRoot);\r\n \r\n // Read tsconfig to get baseUrl\r\n const tsconfigPath = path.join(projectRoot, \"tsconfig.json\");\r\n let baseUrl = \".\";\r\n if (fs.existsSync(tsconfigPath)) {\r\n try {\r\n const tsconfig = JSON.parse(fs.readFileSync(tsconfigPath, \"utf-8\"));\r\n baseUrl = tsconfig.compilerOptions?.baseUrl ?? \".\";\r\n } catch {\r\n // Use default baseUrl\r\n }\r\n }\r\n\r\n return {\r\n name: \"path-alias-resolver\",\r\n setup(build) {\r\n // Intercept all import paths\r\n build.onResolve({ filter: /.*/ }, (args) => {\r\n // Skip relative paths, absolute paths, and node_modules\r\n if (\r\n args.path.startsWith(\".\") ||\r\n args.path.startsWith(\"/\") ||\r\n path.isAbsolute(args.path) ||\r\n args.path.includes(\"node_modules\")\r\n ) {\r\n return null; // Let esbuild handle it normally\r\n }\r\n\r\n // Check if the path starts with any alias\r\n for (const [aliasKey, aliasPath] of Object.entries(aliases)) {\r\n if (args.path.startsWith(aliasKey + \"/\") || args.path === aliasKey) {\r\n // Extract the path after the alias\r\n const restPath = args.path.startsWith(aliasKey + \"/\")\r\n ? args.path.slice(aliasKey.length + 1)\r\n : \"\";\r\n \r\n // Resolve to absolute path\r\n const resolvedPath = restPath\r\n ? path.join(aliasPath, restPath)\r\n : aliasPath;\r\n\r\n // Try to find the actual file (with extensions)\r\n let actualPath: string | null = null;\r\n const extensions = [\".ts\", \".tsx\", \".js\", \".jsx\", \".json\"];\r\n \r\n // Check if it's a directory with index file\r\n if (fs.existsSync(resolvedPath) && fs.statSync(resolvedPath).isDirectory()) {\r\n for (const ext of extensions) {\r\n const indexPath = path.join(resolvedPath, `index${ext}`);\r\n if (fs.existsSync(indexPath)) {\r\n actualPath = indexPath;\r\n break;\r\n }\r\n }\r\n } else {\r\n // Check if file exists with any extension\r\n for (const ext of extensions) {\r\n const filePath = resolvedPath + ext;\r\n if (fs.existsSync(filePath)) {\r\n actualPath = filePath;\r\n break;\r\n }\r\n }\r\n \r\n // If no extension match, check if the path itself exists\r\n if (!actualPath && fs.existsSync(resolvedPath)) {\r\n actualPath = resolvedPath;\r\n }\r\n }\r\n\r\n if (actualPath) {\r\n // Calculate relative path from output directory to the resolved file\r\n // This is needed because when bundle: false, esbuild doesn't transform\r\n // absolute paths to relative paths automatically\r\n const relativePath = path.relative(outDir, actualPath);\r\n \r\n // Normalize to use forward slashes (works on Windows too)\r\n const normalizedPath = relativePath.replace(/\\\\/g, \"/\");\r\n \r\n // Ensure it starts with ./ for relative imports\r\n const finalPath = normalizedPath.startsWith(\".\")\r\n ? normalizedPath\r\n : `./${normalizedPath}`;\r\n\r\n // Remove file extension for CommonJS imports (Node.js will resolve it)\r\n // But keep .json extension as it's required\r\n const ext = path.extname(finalPath);\r\n const pathWithoutExt = ext === \".json\" \r\n ? finalPath \r\n : finalPath.slice(0, -ext.length);\r\n\r\n return {\r\n path: pathWithoutExt,\r\n namespace: \"file\",\r\n };\r\n }\r\n }\r\n }\r\n\r\n return null; // Let esbuild handle it normally\r\n });\r\n },\r\n };\r\n}\r\n\r\nfunction collectAppSources(appDir: string): string[] {\r\n const entries: string[] = [];\r\n\r\n function walk(dir: string) {\r\n const items = fs.readdirSync(dir, { withFileTypes: true });\r\n\r\n for (const item of items) {\r\n const full = path.join(dir, item.name);\r\n\r\n if (item.isDirectory()) {\r\n walk(full);\r\n continue;\r\n }\r\n\r\n if (item.isFile()) {\r\n if (full.endsWith(\".d.ts\")) continue;\r\n\r\n if (\r\n full.endsWith(\".ts\") ||\r\n full.endsWith(\".tsx\") ||\r\n full.endsWith(\".js\") ||\r\n full.endsWith(\".jsx\")\r\n ) {\r\n entries.push(full);\r\n }\r\n }\r\n }\r\n }\r\n\r\n walk(appDir);\r\n return entries;\r\n}\r\n\r\n/**\r\n * Builds the server application.\r\n *\r\n * Compiles app directory with bundling enabled, and server files (init/config)\r\n * without bundling for direct require access.\r\n *\r\n * @param projectRoot - Root directory of the project\r\n * @param appDir - App directory to build\r\n * @returns Promise resolving to build result with output directory\r\n */\r\nexport async function buildServerApp(\r\n projectRoot: string,\r\n appDir: string\r\n): Promise<BuildServerResult> {\r\n const outDir = path.join(projectRoot, BUILD_FOLDER_NAME, \"server\");\r\n\r\n const entryPoints = collectAppSources(appDir);\r\n ensureDir(outDir);\r\n\r\n if (entryPoints.length === 0) {\r\n return { outDir };\r\n }\r\n\r\n await esbuild.build({\r\n entryPoints,\r\n outdir: outDir,\r\n outbase: appDir,\r\n platform: \"node\",\r\n format: \"cjs\",\r\n target: \"node18\",\r\n jsx: \"automatic\",\r\n sourcemap: true,\r\n bundle: true,\r\n splitting: false,\r\n logLevel: \"info\",\r\n tsconfig: path.join(projectRoot, \"tsconfig.json\"),\r\n packages: \"external\",\r\n });\r\n\r\n // Create path alias plugin for server files\r\n const pathAliasPlugin = createPathAliasPlugin(projectRoot, outDir);\r\n\r\n for (const fileName of SERVER_FILES) {\r\n const initTS = path.join(projectRoot, `${fileName}.ts`);\r\n const initJS = path.join(outDir, `${fileName}.js`);\r\n\r\n if (fs.existsSync(initTS)) {\r\n await esbuild.build({\r\n entryPoints: [initTS],\r\n outfile: initJS,\r\n platform: \"node\",\r\n format: \"cjs\",\r\n target: \"node18\",\r\n jsx: \"automatic\",\r\n sourcemap: true,\r\n bundle: false,\r\n logLevel: \"info\",\r\n tsconfig: path.join(projectRoot, \"tsconfig.json\"),\r\n plugins: [pathAliasPlugin],\r\n });\r\n }\r\n }\r\n\r\n return { outDir };\r\n}\r\n","import path from \"path\";\r\nimport {\r\n loadApiRoutes,\r\n LoadedRoute,\r\n loadRoutes,\r\n writeClientBoostrapManifest,\r\n writeClientRoutesManifest,\r\n writeRoutesManifest,\r\n loadNotFoundRouteFromFilesystem,\r\n loadErrorRouteFromFilesystem,\r\n} from \"@router/index\";\r\nimport { buildClientBundle } from \"./bundler/client\";\r\nimport { buildStaticPages } from \"./ssg\";\r\nimport { buildServerApp } from \"./bundler/server\";\r\nimport { NOT_FOUND_PATTERN } from \"@constants/globals\";\r\nimport { loadConfig, getAppDir, type FrameworkConfig } from \"@src/config\";\r\nimport { loadWssRoutes } from \"@router/loader-wss\";\r\n\r\nexport interface BuildAppOptions {\r\n rootDir?: string;\r\n appDir?: string;\r\n config?: FrameworkConfig;\r\n}\r\n\r\nexport async function buildApp(options: BuildAppOptions = {}): Promise<void> {\r\n const projectRoot = options.rootDir ?? process.cwd();\r\n const config = options.config ?? loadConfig(projectRoot);\r\n const appDir = options.appDir ?? getAppDir(projectRoot, config);\r\n\r\n process.env.LOLY_BUILD = \"1\";\r\n\r\n const routes = loadRoutes(appDir);\r\n const apiRoutes = loadApiRoutes(appDir);\r\n const wssRoutes = loadWssRoutes(appDir);\r\n\r\n const { outDir: serverOutDir } = await buildServerApp(projectRoot, appDir);\r\n\r\n // Load special error pages (_not-found.tsx, _error.tsx)\r\n const notFoundRoute = loadNotFoundRouteFromFilesystem(appDir);\r\n const errorRoute = loadErrorRouteFromFilesystem(appDir);\r\n\r\n if (!notFoundRoute) {\r\n console.warn(\r\n `[framework][build] No not-found route found. Consider creating ${config.directories.app}/${config.conventions.notFound}.tsx`\r\n );\r\n }\r\n\r\n // Create a minimal not-found route if none exists\r\n const fallbackNotFound: LoadedRoute = notFoundRoute || {\r\n pattern: NOT_FOUND_PATTERN,\r\n regex: new RegExp(`^${NOT_FOUND_PATTERN}/?$`),\r\n paramNames: [],\r\n component: () => null,\r\n layouts: [],\r\n pageFile: \"\",\r\n layoutFiles: [],\r\n middlewares: [],\r\n loader: null,\r\n dynamic: \"force-static\",\r\n generateStaticParams: null,\r\n };\r\n\r\n writeRoutesManifest({\r\n routes,\r\n apiRoutes,\r\n wssRoutes,\r\n notFoundRoute: fallbackNotFound,\r\n errorRoute,\r\n projectRoot,\r\n serverOutDir,\r\n appDir,\r\n });\r\n\r\n writeClientBoostrapManifest(projectRoot);\r\n\r\n writeClientRoutesManifest(routes, projectRoot);\r\n\r\n await buildClientBundle(projectRoot);\r\n\r\n await buildStaticPages(projectRoot, routes);\r\n\r\n delete process.env.LOLY_BUILD;\r\n\r\n console.log(`[framework][build] Build completed successfully`);\r\n}\r\n\r\nexport { startClientBundler, buildClientBundle } from \"./bundler/client\";\r\nexport { buildServerApp } from \"./bundler/server\";\r\nexport { buildStaticPages } from \"./ssg\";\r\n","import type {\r\n WssRouteDefinition,\r\n WssEventDefinition,\r\n AuthFn,\r\n WssHandler,\r\n} from \"./types\";\r\n\r\n/**\r\n * Defines a WebSocket route with authentication, hooks, and event handlers.\r\n * \r\n * This is the new, recommended way to define WSS routes. It provides:\r\n * - Type safety\r\n * - Built-in validation\r\n * - Auth hooks\r\n * - Connection/disconnection hooks\r\n * - Per-event validation, guards, and rate limiting\r\n * \r\n * @example\r\n * ```ts\r\n * import { defineWssRoute } from \"@lolyjs/core\";\r\n * import { z } from \"zod\";\r\n * \r\n * export default defineWssRoute({\r\n * auth: async (ctx) => {\r\n * const token = ctx.req.headers.authorization;\r\n * return await verifyToken(token);\r\n * },\r\n * onConnect: (ctx) => {\r\n * console.log(\"User connected:\", ctx.user?.id);\r\n * },\r\n * events: {\r\n * message: {\r\n * schema: z.object({ text: z.string() }),\r\n * guard: ({ user }) => !!user,\r\n * handler: (ctx) => {\r\n * ctx.actions.broadcast(\"message\", ctx.data);\r\n * }\r\n * }\r\n * }\r\n * });\r\n * ```\r\n */\r\nexport function defineWssRoute<TUser = any>(\r\n definition: WssRouteDefinition<TUser>\r\n): WssRouteDefinition<TUser> {\r\n // Runtime validation in dev mode\r\n if (process.env.NODE_ENV !== \"production\") {\r\n validateRouteDefinition(definition);\r\n }\r\n\r\n return definition;\r\n}\r\n\r\n/**\r\n * Validates a route definition structure.\r\n */\r\nfunction validateRouteDefinition<TUser>(\r\n definition: WssRouteDefinition<TUser>\r\n): void {\r\n if (!definition) {\r\n throw new Error(\r\n \"[loly:realtime] Route definition is required. \" +\r\n \"Use defineWssRoute({ events: { ... } })\"\r\n );\r\n }\r\n\r\n if (!definition.events || typeof definition.events !== \"object\") {\r\n throw new Error(\r\n \"[loly:realtime] Route definition must have an 'events' object. \" +\r\n \"Example: defineWssRoute({ events: { message: { handler: ... } } })\"\r\n );\r\n }\r\n\r\n if (Object.keys(definition.events).length === 0) {\r\n throw new Error(\r\n \"[loly:realtime] Route definition must have at least one event handler\"\r\n );\r\n }\r\n\r\n // Validate each event\r\n for (const [eventName, eventDef] of Object.entries(definition.events)) {\r\n if (typeof eventName !== \"string\" || eventName.trim() === \"\") {\r\n throw new Error(\r\n \"[loly:realtime] Event names must be non-empty strings\"\r\n );\r\n }\r\n\r\n // Reserved event name\r\n if (eventName === \"__loly:error\") {\r\n throw new Error(\r\n \"[loly:realtime] '__loly:error' is a reserved event name\"\r\n );\r\n }\r\n\r\n // Validate event definition\r\n if (typeof eventDef === \"function\") {\r\n // Simple handler function - valid\r\n continue;\r\n }\r\n\r\n if (typeof eventDef !== \"object\" || eventDef === null) {\r\n throw new Error(\r\n `[loly:realtime] Event '${eventName}' must be a handler function or an object with a 'handler' property`\r\n );\r\n }\r\n\r\n if (typeof eventDef.handler !== \"function\") {\r\n throw new Error(\r\n `[loly:realtime] Event '${eventName}' must have a 'handler' function`\r\n );\r\n }\r\n\r\n // Validate schema if present\r\n if (eventDef.schema !== undefined) {\r\n if (\r\n typeof eventDef.schema !== \"object\" ||\r\n eventDef.schema === null ||\r\n (typeof eventDef.schema.parse !== \"function\" &&\r\n typeof eventDef.schema.safeParse !== \"function\")\r\n ) {\r\n throw new Error(\r\n `[loly:realtime] Event '${eventName}' schema must be a Zod or Valibot schema ` +\r\n \"(must have 'parse' or 'safeParse' method)\"\r\n );\r\n }\r\n }\r\n\r\n // Validate rateLimit if present\r\n if (eventDef.rateLimit !== undefined) {\r\n if (\r\n typeof eventDef.rateLimit !== \"object\" ||\r\n eventDef.rateLimit === null ||\r\n typeof eventDef.rateLimit.eventsPerSecond !== \"number\" ||\r\n eventDef.rateLimit.eventsPerSecond <= 0\r\n ) {\r\n throw new Error(\r\n `[loly:realtime] Event '${eventName}' rateLimit must have a positive 'eventsPerSecond' number`\r\n );\r\n }\r\n }\r\n\r\n // Validate guard if present\r\n if (eventDef.guard !== undefined && typeof eventDef.guard !== \"function\") {\r\n throw new Error(\r\n `[loly:realtime] Event '${eventName}' guard must be a function`\r\n );\r\n }\r\n }\r\n\r\n // Validate hooks\r\n if (definition.auth !== undefined && typeof definition.auth !== \"function\") {\r\n throw new Error(\r\n \"[loly:realtime] 'auth' must be a function\"\r\n );\r\n }\r\n\r\n if (\r\n definition.onConnect !== undefined &&\r\n typeof definition.onConnect !== \"function\"\r\n ) {\r\n throw new Error(\r\n \"[loly:realtime] 'onConnect' must be a function\"\r\n );\r\n }\r\n\r\n if (\r\n definition.onDisconnect !== undefined &&\r\n typeof definition.onDisconnect !== \"function\"\r\n ) {\r\n throw new Error(\r\n \"[loly:realtime] 'onDisconnect' must be a function\"\r\n );\r\n }\r\n}\r\n","import { hydrateRoot } from \"react-dom/client\";\r\nimport { APP_CONTAINER_ID } from \"./constants\";\r\nimport { getWindowData, getRouterData, setRouterData, setPreservedLayoutProps } from \"./window-data\";\r\nimport { matchRouteClient } from \"./route-matcher\";\r\nimport { applyMetadata } from \"./metadata\";\r\nimport { AppShell } from \"./AppShell\";\r\nimport { setupHotReload } from \"./hot-reload\";\r\nimport type {\r\n InitialData,\r\n ClientRouteLoaded,\r\n RouteViewState,\r\n} from \"./types\";\r\n\r\nexport async function loadInitialRoute(\r\n initialUrl: string,\r\n initialData: InitialData | null,\r\n routes: ClientRouteLoaded[],\r\n notFoundRoute: ClientRouteLoaded | null,\r\n errorRoute: ClientRouteLoaded | null\r\n): Promise<RouteViewState> {\r\n const isInitialNotFound = initialData?.notFound === true;\r\n const isInitialError = initialData?.error === true;\r\n\r\n let initialRoute: ClientRouteLoaded | null = null;\r\n let initialParams: Record<string, string> = {};\r\n let initialComponents = null;\r\n\r\n if (isInitialError && errorRoute) {\r\n initialRoute = errorRoute;\r\n initialParams = initialData?.params ?? {};\r\n initialComponents = await errorRoute.load();\r\n } else if (isInitialNotFound && notFoundRoute) {\r\n initialRoute = notFoundRoute;\r\n initialParams = {};\r\n initialComponents = await notFoundRoute.load();\r\n } else {\r\n const match = matchRouteClient(initialUrl, routes);\r\n if (match) {\r\n initialRoute = match.route;\r\n initialParams = match.params;\r\n initialComponents = await match.route.load();\r\n } else if (notFoundRoute) {\r\n initialRoute = notFoundRoute;\r\n initialParams = {};\r\n initialComponents = await notFoundRoute.load();\r\n } else {\r\n console.warn(\r\n `[client] No route match found for ${initialUrl}. Available routes:`,\r\n routes.map((r) => r.pattern)\r\n );\r\n }\r\n }\r\n\r\n return {\r\n url: initialUrl,\r\n route: initialRoute,\r\n params: initialParams,\r\n components: initialComponents,\r\n props: initialData?.props ?? {},\r\n };\r\n}\r\n\r\n/**\r\n * Initializes router data from server or builds it from the current URL.\r\n */\r\nfunction initializeRouterData(\r\n initialUrl: string,\r\n initialData: InitialData | null\r\n): void {\r\n let routerData = getRouterData();\r\n if (!routerData) {\r\n const url = new URL(initialUrl, window.location.origin);\r\n routerData = {\r\n pathname: url.pathname,\r\n params: initialData?.params || {},\r\n searchParams: Object.fromEntries(url.searchParams.entries()),\r\n };\r\n setRouterData(routerData);\r\n }\r\n}\r\n\r\n/**\r\n * Loads and hydrates the initial route.\r\n */\r\nasync function hydrateInitialRoute(\r\n container: HTMLElement,\r\n initialUrl: string,\r\n initialData: InitialData | null,\r\n routes: ClientRouteLoaded[],\r\n notFoundRoute: ClientRouteLoaded | null,\r\n errorRoute: ClientRouteLoaded | null\r\n): Promise<void> {\r\n try {\r\n // Load initial route\r\n const initialState = await loadInitialRoute(\r\n initialUrl,\r\n initialData,\r\n routes,\r\n notFoundRoute,\r\n errorRoute\r\n );\r\n\r\n // Apply metadata if available\r\n if (initialData?.metadata) {\r\n try {\r\n applyMetadata(initialData.metadata);\r\n } catch (metadataError) {\r\n console.warn(\"[client] Error applying metadata:\", metadataError);\r\n // Continue even if metadata fails\r\n }\r\n }\r\n\r\n // Hydrate React root\r\n hydrateRoot(\r\n container,\r\n <AppShell\r\n initialState={initialState}\r\n routes={routes}\r\n notFoundRoute={notFoundRoute}\r\n errorRoute={errorRoute}\r\n />\r\n );\r\n } catch (error) {\r\n console.error(\r\n \"[client] Error loading initial route components for\",\r\n initialUrl,\r\n error\r\n );\r\n throw error; // Re-throw to handle in bootstrapClient\r\n }\r\n}\r\n\r\n/**\r\n * Bootstraps the client-side application.\r\n * \r\n * Simplified flow:\r\n * 1. Setup hot reload (development only)\r\n * 2. Get container and initial data\r\n * 3. Initialize router data\r\n * 4. Load and hydrate initial route\r\n *\r\n * @param routes - Array of client routes\r\n * @param notFoundRoute - Not-found route definition\r\n * @param errorRoute - Error route definition\r\n */\r\nexport function bootstrapClient(\r\n routes: ClientRouteLoaded[],\r\n notFoundRoute: ClientRouteLoaded | null,\r\n errorRoute: ClientRouteLoaded | null = null\r\n): void {\r\n // 1. Setup hot reload (development only)\r\n setupHotReload();\r\n\r\n // Start bootstrap process\r\n (async () => {\r\n try {\r\n // 2. Get container and initial data\r\n const container = document.getElementById(APP_CONTAINER_ID);\r\n if (!container) {\r\n console.error(`\\n❌ [client] Hydration failed: Container #${APP_CONTAINER_ID} not found`);\r\n console.error(\"💡 This usually means:\");\r\n console.error(\" • The HTML structure doesn't match what React expects\");\r\n console.error(\" • The container was removed before hydration\");\r\n console.error(\" • There's a mismatch between SSR and client HTML\\n\");\r\n return;\r\n }\r\n\r\n const initialData = getWindowData();\r\n const initialUrl = window.location.pathname + window.location.search;\r\n\r\n // Preserve layout props from initial load (they come combined in initialData.props)\r\n // In SSR, layout hooks are always executed, so we need to extract layout props\r\n // For now, we'll preserve all props as layout props since they're combined\r\n // This ensures navigation items are available even in SPA navigation\r\n if (initialData?.props) {\r\n // In SSR, props are combined (layout + page), so we preserve them all as layout props\r\n // This is not perfect but ensures layout props are available in SPA navigation\r\n setPreservedLayoutProps(initialData.props);\r\n }\r\n\r\n // 3. Initialize router data\r\n initializeRouterData(initialUrl, initialData);\r\n\r\n // 4. Load and hydrate initial route\r\n await hydrateInitialRoute(\r\n container,\r\n initialUrl,\r\n initialData,\r\n routes,\r\n notFoundRoute,\r\n errorRoute\r\n );\r\n } catch (error) {\r\n // Fatal error during bootstrap - reload the page\r\n console.error(\"\\n❌ [client] Fatal error during bootstrap:\");\r\n console.error(error);\r\n if (error instanceof Error) {\r\n console.error(\"\\nError details:\");\r\n console.error(` Message: ${error.message}`);\r\n if (error.stack) {\r\n console.error(` Stack: ${error.stack}`);\r\n }\r\n }\r\n console.error(\"\\n💡 Attempting page reload to recover...\\n\");\r\n window.location.reload();\r\n }\r\n })();\r\n}\r\n\r\n","// Client-side constants (hardcoded to avoid alias resolution issues in Rspack)\r\nexport const WINDOW_DATA_KEY = \"__FW_DATA__\";\r\nexport const ROUTER_DATA_KEY = \"__LOLY_ROUTER_DATA__\";\r\nexport const APP_CONTAINER_ID = \"__app\";\r\n// Global key for navigate function fallback (exposed by AppShell for hydration timing issues)\r\nexport const ROUTER_NAVIGATE_KEY = \"__LOLY_ROUTER_NAVIGATE__\";\r\n\r\n","import { WINDOW_DATA_KEY, ROUTER_DATA_KEY } from \"./constants\";\r\nimport type { InitialData, RouterData } from \"./types\";\r\n\r\nconst LAYOUT_PROPS_KEY = \"__FW_LAYOUT_PROPS__\";\r\n\r\nexport function getWindowData(): InitialData | null {\r\n if (typeof window === \"undefined\") {\r\n return null;\r\n }\r\n return (window[WINDOW_DATA_KEY] as InitialData | undefined) ?? null;\r\n}\r\n\r\n/**\r\n * Gets preserved layout props from window storage.\r\n * Layout props are preserved across SPA navigations when layout hooks are skipped.\r\n */\r\nexport function getPreservedLayoutProps(): Record<string, any> | null {\r\n if (typeof window === \"undefined\") {\r\n return null;\r\n }\r\n return ((window as any)[LAYOUT_PROPS_KEY] as Record<string, any> | undefined) ?? null;\r\n}\r\n\r\n/**\r\n * Sets preserved layout props in window storage.\r\n * These props are used when layout hooks are skipped in SPA navigation.\r\n */\r\nexport function setPreservedLayoutProps(props: Record<string, any> | null): void {\r\n if (typeof window === \"undefined\") {\r\n return;\r\n }\r\n if (props === null) {\r\n delete (window as any)[LAYOUT_PROPS_KEY];\r\n } else {\r\n (window as any)[LAYOUT_PROPS_KEY] = props;\r\n }\r\n}\r\n\r\nexport function getRouterData(): RouterData | null {\r\n if (typeof window === \"undefined\") {\r\n return null;\r\n }\r\n return (window[ROUTER_DATA_KEY] as RouterData | undefined) ?? null;\r\n}\r\n\r\nexport function setWindowData(data: InitialData): void {\r\n window[WINDOW_DATA_KEY] = data;\r\n \r\n // Dispatch event for components to listen to (e.g. ThemeProvider)\r\n // This ensures components update when navigating in SPA mode\r\n if (typeof window !== \"undefined\") {\r\n window.dispatchEvent(\r\n new CustomEvent(\"fw-data-refresh\", {\r\n detail: { data },\r\n })\r\n );\r\n }\r\n}\r\n\r\nexport function setRouterData(data: RouterData): void {\r\n window[ROUTER_DATA_KEY] = data;\r\n \r\n // Dispatch event for router data updates\r\n if (typeof window !== \"undefined\") {\r\n window.dispatchEvent(\r\n new CustomEvent(\"fw-router-data-refresh\", {\r\n detail: { data },\r\n })\r\n );\r\n }\r\n}\r\n\r\nexport function getCurrentTheme(): string | null {\r\n return getWindowData()?.theme ?? null;\r\n}\r\n\r\n","import type { ClientRouteLoaded, ClientRouteMatch } from \"./types\";\r\n\r\nexport function buildClientRegexFromPattern(pattern: string): RegExp {\r\n const segments = pattern.split(\"/\").filter(Boolean);\r\n const regexParts: string[] = [];\r\n\r\n for (let i = 0; i < segments.length; i++) {\r\n const seg = segments[i];\r\n\r\n // catch-all [...slug]\r\n if (seg.startsWith(\"[...\") && seg.endsWith(\"]\")) {\r\n if (i !== segments.length - 1) {\r\n throw new Error(\r\n `Catch-all segment \"${seg}\" in \"${pattern}\" must be the last segment.`\r\n );\r\n }\r\n regexParts.push(\"(.+)\");\r\n continue;\r\n }\r\n\r\n // dynamic [id]\r\n if (seg.startsWith(\"[\") && seg.endsWith(\"]\")) {\r\n regexParts.push(\"([^/]+)\");\r\n continue;\r\n }\r\n\r\n // static segment\r\n const escaped = seg.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\r\n regexParts.push(escaped);\r\n }\r\n\r\n const regexSource = \"^/\" + regexParts.join(\"/\") + \"/?$\";\r\n return new RegExp(regexSource);\r\n}\r\n\r\nexport function matchRouteClient(\r\n pathWithSearch: string,\r\n routes: ClientRouteLoaded[]\r\n): ClientRouteMatch | null {\r\n const [pathname] = pathWithSearch.split(\"?\");\r\n for (const r of routes) {\r\n const regex = buildClientRegexFromPattern(r.pattern);\r\n const match = regex.exec(pathname);\r\n if (!match) continue;\r\n\r\n const params: Record<string, string> = {};\r\n r.paramNames.forEach((name, idx) => {\r\n params[name] = decodeURIComponent(match[idx + 1] || \"\");\r\n });\r\n\r\n return { route: r, params };\r\n }\r\n return null;\r\n}\r\n\r\n","import type { PageMetadata } from \"@router/index\";\r\n\r\n/**\r\n * Helper to get or create a meta tag element\r\n */\r\nfunction getOrCreateMeta(\r\n selector: string,\r\n attributes: { name?: string; property?: string; httpEquiv?: string }\r\n): HTMLMetaElement {\r\n let meta = document.querySelector(selector) as HTMLMetaElement | null;\r\n if (!meta) {\r\n meta = document.createElement(\"meta\");\r\n if (attributes.name) meta.name = attributes.name;\r\n if (attributes.property) meta.setAttribute(\"property\", attributes.property);\r\n if (attributes.httpEquiv) meta.httpEquiv = attributes.httpEquiv;\r\n document.head.appendChild(meta);\r\n }\r\n return meta;\r\n}\r\n\r\n/**\r\n * Helper to get or create a link tag element\r\n */\r\nfunction getOrCreateLink(rel: string, href: string): HTMLLinkElement {\r\n const selector = `link[rel=\"${rel}\"]`;\r\n let link = document.querySelector(selector) as HTMLLinkElement | null;\r\n if (!link) {\r\n link = document.createElement(\"link\");\r\n link.rel = rel;\r\n link.href = href;\r\n document.head.appendChild(link);\r\n } else {\r\n link.href = href;\r\n }\r\n return link;\r\n}\r\n\r\n/**\r\n * Updates page metadata in the document head.\r\n * Supports all metadata fields including Open Graph, Twitter Cards, canonical URLs, etc.\r\n * \r\n * @param md - Page metadata object\r\n */\r\nexport function applyMetadata(md?: PageMetadata | null): void {\r\n if (!md) return;\r\n\r\n // Title\r\n if (md.title) {\r\n document.title = md.title;\r\n }\r\n\r\n // Description\r\n if (md.description) {\r\n const meta = getOrCreateMeta('meta[name=\"description\"]', { name: \"description\" });\r\n meta.content = md.description;\r\n }\r\n\r\n // Robots\r\n if (md.robots) {\r\n const meta = getOrCreateMeta('meta[name=\"robots\"]', { name: \"robots\" });\r\n meta.content = md.robots;\r\n }\r\n\r\n // Theme color\r\n if (md.themeColor) {\r\n const meta = getOrCreateMeta('meta[name=\"theme-color\"]', { name: \"theme-color\" });\r\n meta.content = md.themeColor;\r\n }\r\n\r\n // Viewport\r\n if (md.viewport) {\r\n const meta = getOrCreateMeta('meta[name=\"viewport\"]', { name: \"viewport\" });\r\n meta.content = md.viewport;\r\n }\r\n\r\n // Canonical URL\r\n if (md.canonical) {\r\n getOrCreateLink(\"canonical\", md.canonical);\r\n }\r\n\r\n // Open Graph tags\r\n if (md.openGraph) {\r\n const og = md.openGraph;\r\n\r\n if (og.title) {\r\n const meta = getOrCreateMeta('meta[property=\"og:title\"]', { property: \"og:title\" });\r\n meta.content = og.title;\r\n }\r\n\r\n if (og.description) {\r\n const meta = getOrCreateMeta('meta[property=\"og:description\"]', { property: \"og:description\" });\r\n meta.content = og.description;\r\n }\r\n\r\n if (og.type) {\r\n const meta = getOrCreateMeta('meta[property=\"og:type\"]', { property: \"og:type\" });\r\n meta.content = og.type;\r\n }\r\n\r\n if (og.url) {\r\n const meta = getOrCreateMeta('meta[property=\"og:url\"]', { property: \"og:url\" });\r\n meta.content = og.url;\r\n }\r\n\r\n if (og.image) {\r\n if (typeof og.image === \"string\") {\r\n const meta = getOrCreateMeta('meta[property=\"og:image\"]', { property: \"og:image\" });\r\n meta.content = og.image;\r\n } else {\r\n const meta = getOrCreateMeta('meta[property=\"og:image\"]', { property: \"og:image\" });\r\n meta.content = og.image.url;\r\n\r\n if (og.image.width) {\r\n const metaWidth = getOrCreateMeta('meta[property=\"og:image:width\"]', { property: \"og:image:width\" });\r\n metaWidth.content = String(og.image.width);\r\n }\r\n\r\n if (og.image.height) {\r\n const metaHeight = getOrCreateMeta('meta[property=\"og:image:height\"]', { property: \"og:image:height\" });\r\n metaHeight.content = String(og.image.height);\r\n }\r\n\r\n if (og.image.alt) {\r\n const metaAlt = getOrCreateMeta('meta[property=\"og:image:alt\"]', { property: \"og:image:alt\" });\r\n metaAlt.content = og.image.alt;\r\n }\r\n }\r\n }\r\n\r\n if (og.siteName) {\r\n const meta = getOrCreateMeta('meta[property=\"og:site_name\"]', { property: \"og:site_name\" });\r\n meta.content = og.siteName;\r\n }\r\n\r\n if (og.locale) {\r\n const meta = getOrCreateMeta('meta[property=\"og:locale\"]', { property: \"og:locale\" });\r\n meta.content = og.locale;\r\n }\r\n }\r\n\r\n // Twitter Card tags\r\n if (md.twitter) {\r\n const twitter = md.twitter;\r\n\r\n if (twitter.card) {\r\n const meta = getOrCreateMeta('meta[name=\"twitter:card\"]', { name: \"twitter:card\" });\r\n meta.content = twitter.card;\r\n }\r\n\r\n if (twitter.title) {\r\n const meta = getOrCreateMeta('meta[name=\"twitter:title\"]', { name: \"twitter:title\" });\r\n meta.content = twitter.title;\r\n }\r\n\r\n if (twitter.description) {\r\n const meta = getOrCreateMeta('meta[name=\"twitter:description\"]', { name: \"twitter:description\" });\r\n meta.content = twitter.description;\r\n }\r\n\r\n if (twitter.image) {\r\n const meta = getOrCreateMeta('meta[name=\"twitter:image\"]', { name: \"twitter:image\" });\r\n meta.content = twitter.image;\r\n }\r\n\r\n if (twitter.imageAlt) {\r\n const meta = getOrCreateMeta('meta[name=\"twitter:image:alt\"]', { name: \"twitter:image:alt\" });\r\n meta.content = twitter.imageAlt;\r\n }\r\n\r\n if (twitter.site) {\r\n const meta = getOrCreateMeta('meta[name=\"twitter:site\"]', { name: \"twitter:site\" });\r\n meta.content = twitter.site;\r\n }\r\n\r\n if (twitter.creator) {\r\n const meta = getOrCreateMeta('meta[name=\"twitter:creator\"]', { name: \"twitter:creator\" });\r\n meta.content = twitter.creator;\r\n }\r\n }\r\n\r\n // Custom meta tags\r\n if (md.metaTags && Array.isArray(md.metaTags)) {\r\n md.metaTags.forEach((tag) => {\r\n let selector = \"\";\r\n if (tag.name) {\r\n selector = `meta[name=\"${tag.name}\"]`;\r\n } else if (tag.property) {\r\n selector = `meta[property=\"${tag.property}\"]`;\r\n } else if (tag.httpEquiv) {\r\n selector = `meta[http-equiv=\"${tag.httpEquiv}\"]`;\r\n }\r\n\r\n if (selector) {\r\n const meta = getOrCreateMeta(selector, {\r\n name: tag.name,\r\n property: tag.property,\r\n httpEquiv: tag.httpEquiv,\r\n });\r\n meta.content = tag.content;\r\n }\r\n });\r\n }\r\n\r\n // Custom link tags\r\n if (md.links && Array.isArray(md.links)) {\r\n md.links.forEach((link) => {\r\n getOrCreateLink(link.rel, link.href);\r\n // Note: Additional attributes like 'as', 'crossorigin', 'type' would need\r\n // more complex logic to update existing links. For now, we just ensure\r\n // the link exists with the correct href.\r\n });\r\n }\r\n}\r\n\r\n","import { useEffect, useState, useRef, useCallback } from \"react\";\r\nimport { RouterView } from \"./RouterView\";\r\nimport {\r\n navigate,\r\n createClickHandler,\r\n createPopStateHandler,\r\n createHoverHandler,\r\n type NavigationHandlers,\r\n} from \"./navigation\";\r\nimport { RouterContext } from \"./RouterContext\";\r\nimport { ROUTER_NAVIGATE_KEY, WINDOW_DATA_KEY } from \"./constants\";\r\nimport { applyMetadata } from \"./metadata\";\r\nimport type {\r\n RouteViewState,\r\n ClientRouteLoaded,\r\n} from \"./types\";\r\n\r\nexport interface AppShellProps {\r\n initialState: RouteViewState;\r\n routes: ClientRouteLoaded[];\r\n notFoundRoute: ClientRouteLoaded | null;\r\n errorRoute: ClientRouteLoaded | null;\r\n}\r\n\r\nexport function AppShell({\r\n initialState,\r\n routes,\r\n notFoundRoute,\r\n errorRoute,\r\n}: AppShellProps) {\r\n const [state, setState] = useState<RouteViewState>(initialState);\r\n const handlersRef = useRef<NavigationHandlers>({\r\n setState,\r\n routes,\r\n notFoundRoute,\r\n errorRoute,\r\n });\r\n\r\n useEffect(() => {\r\n handlersRef.current = {\r\n setState,\r\n routes,\r\n notFoundRoute,\r\n errorRoute,\r\n };\r\n }, [routes, notFoundRoute, errorRoute]);\r\n\r\n // Create navigate function for router context\r\n const handleNavigate = useCallback(\r\n async (\r\n nextUrl: string,\r\n options?: { revalidate?: boolean; replace?: boolean }\r\n ) => {\r\n await navigate(nextUrl, handlersRef.current, {\r\n revalidate: options?.revalidate,\r\n });\r\n },\r\n []\r\n );\r\n\r\n /**\r\n * SOLUTION: Expose navigate function globally as fallback\r\n * \r\n * During React hydration, components rendered in layouts may execute before\r\n * RouterContext is fully available. By exposing navigate globally, useRouter\r\n * can access it even when the context isn't ready yet, ensuring SPA navigation\r\n * works correctly from the first render.\r\n * \r\n * This is similar to how window.__FW_DATA__ is used for initial data.\r\n */\r\n useEffect(() => {\r\n if (typeof window !== \"undefined\") {\r\n window[ROUTER_NAVIGATE_KEY] = handleNavigate;\r\n return () => {\r\n delete window[ROUTER_NAVIGATE_KEY];\r\n };\r\n }\r\n }, [handleNavigate]);\r\n\r\n useEffect(() => {\r\n let isMounted = true;\r\n\r\n async function handleNavigateInternal(\r\n nextUrl: string,\r\n options?: { revalidate?: boolean }\r\n ) {\r\n if (!isMounted) return;\r\n await navigate(nextUrl, handlersRef.current, options);\r\n }\r\n\r\n const handleClick = createClickHandler(handleNavigateInternal);\r\n const handlePopState = createPopStateHandler(handleNavigateInternal);\r\n const handleHover = createHoverHandler(routes, notFoundRoute);\r\n\r\n window.addEventListener(\"click\", handleClick, false);\r\n window.addEventListener(\"popstate\", handlePopState, false);\r\n window.addEventListener(\"mouseover\", handleHover, false);\r\n\r\n return () => {\r\n isMounted = false;\r\n window.removeEventListener(\"click\", handleClick, false);\r\n window.removeEventListener(\"popstate\", handlePopState, false);\r\n window.removeEventListener(\"mouseover\", handleHover, false);\r\n };\r\n }, [routes, notFoundRoute]);\r\n\r\n // Listen for data refresh events and update state when current route is revalidated\r\n useEffect(() => {\r\n const handleDataRefresh = () => {\r\n const freshData = window[WINDOW_DATA_KEY];\r\n \r\n if (!freshData) return;\r\n \r\n const currentPathname = window.location.pathname;\r\n const freshPathname = freshData.pathname;\r\n \r\n if (freshPathname === currentPathname) {\r\n if (freshData.metadata !== undefined) {\r\n applyMetadata(freshData.metadata);\r\n }\r\n \r\n setState((prevState) => ({\r\n ...prevState,\r\n props: freshData.props ?? prevState.props,\r\n params: freshData.params ?? prevState.params,\r\n }));\r\n }\r\n };\r\n\r\n window.addEventListener(\"fw-data-refresh\", handleDataRefresh);\r\n\r\n return () => {\r\n window.removeEventListener(\"fw-data-refresh\", handleDataRefresh);\r\n };\r\n }, []); // Empty deps - only register once, not when state.url changes\r\n\r\n const isError = state.route === errorRoute;\r\n const isNotFound = state.route === notFoundRoute;\r\n const routeType = isError ? \"error\" : isNotFound ? \"notfound\" : \"normal\";\r\n const routeKey = `${state.url}:${routeType}`;\r\n\r\n return (\r\n <RouterContext.Provider value={{ navigate: handleNavigate }}>\r\n <RouterView key={routeKey} state={state} />\r\n </RouterContext.Provider>\r\n );\r\n}\r\n\r\n","import type { RouteViewState } from \"./types\";\r\n\r\nexport function RouterView({ state }: { state: RouteViewState }) {\r\n if (!state.route) {\r\n // Don't show 404 if we're waiting for components to load\r\n if (state.components === null) {\r\n return null;\r\n }\r\n return <h1>404 - Route not found</h1>;\r\n }\r\n\r\n if (!state.components) {\r\n return null;\r\n }\r\n\r\n const { Page, layouts } = state.components;\r\n const { params, props } = state;\r\n\r\n let element = <Page params={params} {...props} />;\r\n\r\n const layoutChain = layouts.slice().reverse();\r\n for (const Layout of layoutChain) {\r\n element = (\r\n <Layout params={params} {...props}>\r\n {element}\r\n </Layout>\r\n );\r\n }\r\n\r\n return element;\r\n}\r\n\r\n","import type { PageMetadata } from \"@router/index\";\n\n/**\n * Response data structure from server for route data requests\n */\nexport type RouteDataResponse = {\n /** Combined props (layout + page) - kept for backward compatibility */\n props?: Record<string, unknown>;\n /** Layout props (from layout.server.hook.ts) - only present when layout hooks were executed */\n layoutProps?: Record<string, unknown>;\n /** Page props (from page.server.hook.ts) - always present in data requests */\n pageProps?: Record<string, unknown>;\n metadata?: PageMetadata | null;\n theme?: string;\n redirect?: { destination: string; permanent?: boolean };\n notFound?: boolean;\n error?: boolean;\n message?: string;\n params?: Record<string, string>;\n};\n\ntype RouteData = {\n ok: boolean;\n status: number;\n json: RouteDataResponse;\n};\n\ntype CacheEntry =\n | { status: \"pending\"; promise: Promise<RouteData> }\n | { status: \"fulfilled\"; value: RouteData }\n | { status: \"rejected\"; error: any };\n\n// Use window to guarantee a single shared cache instance\n// across all bundles/modules\nconst CACHE_KEY = \"__FW_DATA_CACHE__\";\n\n// Maximum number of entries in the cache (LRU)\nconst MAX_CACHE_SIZE = 100;\n\ntype CacheStore = {\n data: Map<string, CacheEntry>;\n index: Map<string, Set<string>>; // pathBase -> Set of keys\n lru: string[]; // Ordered list: most recent at end, oldest at start\n};\n\nfunction getCacheStore(): CacheStore {\n if (typeof window !== \"undefined\") {\n if (!(window as any)[CACHE_KEY]) {\n (window as any)[CACHE_KEY] = {\n data: new Map<string, CacheEntry>(),\n index: new Map<string, Set<string>>(),\n lru: [],\n };\n }\n return (window as any)[CACHE_KEY];\n }\n // Fallback for SSR (though this shouldn't be used on the client)\n return {\n data: new Map<string, CacheEntry>(),\n index: new Map<string, Set<string>>(),\n lru: [],\n };\n}\n\nconst cacheStore = getCacheStore();\nconst dataCache = cacheStore.data;\nconst pathIndex = cacheStore.index;\nconst lru = cacheStore.lru;\n\n// Helper functions for cache management\n\n/**\n * Extract base path from a cache key (removes query params)\n */\nfunction extractPathBase(key: string): string {\n return key.split(\"?\")[0];\n}\n\n/**\n * Add key to path index\n */\nfunction addToIndex(key: string): void {\n const pathBase = extractPathBase(key);\n if (!pathIndex.has(pathBase)) {\n pathIndex.set(pathBase, new Set());\n }\n pathIndex.get(pathBase)!.add(key);\n}\n\n/**\n * Remove key from path index\n */\nfunction removeFromIndex(key: string): void {\n const pathBase = extractPathBase(key);\n const keys = pathIndex.get(pathBase);\n if (keys) {\n keys.delete(key);\n if (keys.size === 0) {\n pathIndex.delete(pathBase);\n }\n }\n}\n\n/**\n * Update LRU order - move key to end (most recent)\n */\nfunction updateLRU(key: string): void {\n const index = lru.indexOf(key);\n if (index !== -1) {\n lru.splice(index, 1);\n }\n lru.push(key);\n}\n\n/**\n * Remove oldest entries if cache exceeds MAX_CACHE_SIZE\n */\nfunction evictOldest(): void {\n while (lru.length >= MAX_CACHE_SIZE && lru.length > 0) {\n const oldestKey = lru.shift()!;\n dataCache.delete(oldestKey);\n removeFromIndex(oldestKey);\n }\n}\n\n/**\n * Set cache entry and maintain indexes\n */\nfunction setCacheEntry(key: string, entry: CacheEntry): void {\n const existingEntry = dataCache.get(key);\n const wasFulfilled = existingEntry?.status === \"fulfilled\";\n \n dataCache.set(key, entry);\n \n // Only track fulfilled entries in LRU and index (not pending/rejected)\n if (entry.status === \"fulfilled\") {\n // Add to index if it wasn't already fulfilled (new entry or transition from pending/rejected)\n if (!wasFulfilled) {\n addToIndex(key);\n }\n updateLRU(key);\n evictOldest();\n } else if (wasFulfilled) {\n // If entry was fulfilled and now isn't (transitioning to pending/rejected), remove from index\n removeFromIndex(key);\n }\n}\n\n/**\n * Delete cache entry and clean up indexes\n */\nfunction deleteCacheEntry(key: string): void {\n if (dataCache.has(key)) {\n dataCache.delete(key);\n removeFromIndex(key);\n const lruIndex = lru.indexOf(key);\n if (lruIndex !== -1) {\n lru.splice(lruIndex, 1);\n }\n }\n}\n\nfunction buildDataUrl(url: string): string {\n return url + (url.includes(\"?\") ? \"&\" : \"?\") + \"__fw_data=1\";\n}\n\nasync function fetchRouteDataOnce(\n url: string,\n skipLayoutHooks: boolean = true\n): Promise<RouteData> {\n const dataUrl = buildDataUrl(url);\n\n const headers: Record<string, string> = {\n \"x-fw-data\": \"1\",\n Accept: \"application/json\",\n };\n\n // Send header to skip layout hooks execution in SPA navigation\n // Only skip if skipLayoutHooks is true (normal SPA navigation)\n // If false (revalidate), don't send header to force execution of all hooks\n if (skipLayoutHooks) {\n headers[\"x-skip-layout-hooks\"] = \"true\";\n }\n\n const res = await fetch(dataUrl, { headers });\n\n let json: any = {};\n\n try {\n const text = await res.text();\n if (text) {\n json = JSON.parse(text);\n }\n } catch (parseError) {\n console.error(\n \"[client][cache] Failed to parse response as JSON:\",\n parseError\n );\n }\n\n const result: RouteData = {\n ok: res.ok,\n status: res.status,\n json,\n };\n\n return result;\n}\n\n/**\n * Revalidates route data by removing it from the cache.\n * The next time you navigate to this route, fresh data will be fetched from the server.\n * This is a client-side function and does not require a server-side revalidation.\n *\n * @param path - The route path to revalidate (e.g., '/posts/1' or '/posts/1?page=2')\n * If query params are not included, revalidates all variants of that route.\n *\n * @example\n * ```ts\n * // After saving something to the DB, revalidate the route\n * await saveToDatabase(data);\n * revalidatePath('/posts');\n * \n * // Revalidate a specific route with query params\n * revalidatePath('/posts?page=2');\n * ```\n */\nexport function revalidatePath(path: string, skipAutoRevalidate: boolean = false): void {\n // Normalize the base path (without query params)\n const normalizedPath = path.split(\"?\")[0];\n const hasQueryParams = path.includes(\"?\");\n \n // Get all keys for this path base from index (O(1) lookup)\n const keysForPath = pathIndex.get(normalizedPath);\n \n if (!keysForPath || keysForPath.size === 0) {\n return; // No entries to revalidate\n }\n \n // If the path includes specific query params, extract them\n let specificQueryParams: string | undefined;\n if (hasQueryParams) {\n const queryPart = path.split(\"?\")[1];\n // Sort query params for consistent comparison\n specificQueryParams = queryPart\n .split(\"&\")\n .filter((p) => !p.startsWith(\"__fw_data=\"))\n .sort()\n .join(\"&\");\n }\n \n // Iterate only over keys for this path (much smaller set)\n const keysToDelete: string[] = [];\n for (const key of keysForPath) {\n // If specific query params were specified, check if they match\n if (hasQueryParams && specificQueryParams) {\n const [, keyQuery = \"\"] = key.split(\"?\");\n const keyQueryParams = keyQuery\n .split(\"&\")\n .filter((p) => !p.startsWith(\"__fw_data=\"))\n .sort()\n .join(\"&\");\n \n if (keyQueryParams === specificQueryParams) {\n keysToDelete.push(key);\n }\n } else {\n // If no specific query params, revalidate all variants\n keysToDelete.push(key);\n }\n }\n \n // Delete matching entries\n keysToDelete.forEach((key) => {\n deleteCacheEntry(key);\n });\n \n // If the revalidated path matches the current route, automatically refresh data\n // UNLESS skipAutoRevalidate is true (to prevent recursive calls from revalidate())\n if (!skipAutoRevalidate && typeof window !== \"undefined\") {\n const currentPathname = window.location.pathname;\n const currentSearch = window.location.search;\n const matchesCurrentPath = normalizedPath === currentPathname;\n \n if (matchesCurrentPath) {\n if (hasQueryParams && specificQueryParams) {\n const currentQueryParams = currentSearch\n .replace(\"?\", \"\")\n .split(\"&\")\n .filter((p) => !p.startsWith(\"__fw_data=\"))\n .sort()\n .join(\"&\");\n \n if (currentQueryParams === specificQueryParams) {\n revalidate().catch((err) => {\n console.error(\n \"[client][cache] Error revalidating current route:\",\n err\n );\n });\n }\n } else {\n revalidate().catch((err) => {\n console.error(\n \"[client][cache] Error revalidating current route:\",\n err\n );\n });\n }\n }\n }\n}\n\n/**\n * Revalidates and refreshes the current page data.\n * Similar to Next.js's `router.refresh()`.\n * \n * This function:\n * 1. Removes the current route from cache\n * 2. Fetches fresh data from the server\n * 3. Updates window.__FW_DATA__ with the new data\n * 4. Dispatches a 'fw-data-refresh' event for components to listen to\n * \n * @returns Promise that resolves with the fresh route data\n * \n * @example\n * ```ts\n * // Refresh current page data after a mutation\n * await revalidate();\n * ```\n */\n// Flag to prevent recursive calls to revalidate()\nlet isRevalidating = false;\n\nexport async function revalidate(): Promise<RouteData> {\n if (typeof window === \"undefined\") {\n throw new Error(\"revalidate() can only be called on the client\");\n }\n\n // Prevent multiple simultaneous revalidations\n if (isRevalidating) {\n // Wait for the current revalidation to complete\n const key = buildDataUrl(window.location.pathname + window.location.search);\n const entry = dataCache.get(key);\n if (entry && entry.status === \"pending\") {\n return entry.promise;\n }\n // If no pending entry, something went wrong, allow the call\n }\n\n isRevalidating = true;\n try {\n const pathname = window.location.pathname + window.location.search;\n \n // Revalidate the path (remove from cache)\n // Pass a flag to prevent revalidatePath from calling revalidate() again (recursive call)\n revalidatePath(pathname, true); // true = skip auto-revalidate\n \n // Fetch fresh data\n const freshData = await getRouteData(pathname, { revalidate: true });\n \n // Update window.__FW_DATA__ if it exists\n if ((window as any).__FW_DATA__ && freshData.ok && freshData.json) {\n const currentData = (window as any).__FW_DATA__;\n \n // Update preserved layout props if new ones were returned\n if (freshData.json.layoutProps !== undefined && freshData.json.layoutProps !== null) {\n (window as any).__FW_LAYOUT_PROPS__ = freshData.json.layoutProps;\n }\n \n // Combine layout props (new or preserved) + page props\n let combinedProps = currentData.props || {};\n if (freshData.json.layoutProps !== undefined && freshData.json.layoutProps !== null) {\n // Use new layout props\n combinedProps = {\n ...freshData.json.layoutProps,\n ...(freshData.json.pageProps ?? freshData.json.props ?? {}),\n };\n } else if (freshData.json.pageProps !== undefined) {\n // Use preserved layout props + new page props\n const preservedLayoutProps = (window as any).__FW_LAYOUT_PROPS__ || {};\n combinedProps = {\n ...preservedLayoutProps,\n ...freshData.json.pageProps,\n };\n } else if (freshData.json.props) {\n // Fallback to combined props\n combinedProps = freshData.json.props;\n }\n \n (window as any).__FW_DATA__ = {\n ...currentData,\n pathname: pathname.split(\"?\")[0],\n params: freshData.json.params || currentData.params || {},\n props: combinedProps,\n metadata: freshData.json.metadata ?? currentData.metadata ?? null,\n notFound: freshData.json.notFound ?? false,\n error: freshData.json.error ?? false,\n };\n \n // Dispatch event for components to listen to\n window.dispatchEvent(new CustomEvent(\"fw-data-refresh\", {\n detail: { data: freshData },\n }));\n }\n \n return freshData;\n } finally {\n isRevalidating = false;\n }\n}\n\n/**\n * @deprecated Use `revalidatePath()` instead. This function is kept for backwards compatibility.\n */\nexport function revalidateRouteData(url: string): void {\n revalidatePath(url);\n}\n\nexport function prefetchRouteData(url: string): void {\n const key = buildDataUrl(url);\n\n const cached = dataCache.get(key);\n\n if (cached && cached.status !== \"rejected\") {\n // Update LRU if it exists and is fulfilled\n if (cached.status === \"fulfilled\") {\n updateLRU(key);\n }\n return;\n }\n\n // Prefetch uses skipLayoutHooks: true (normal navigation behavior)\n const promise = fetchRouteDataOnce(url, true)\n .then((value) => {\n setCacheEntry(key, { status: \"fulfilled\", value });\n return value;\n })\n .catch((error) => {\n console.error(\"[client][cache] Error prefetching route data:\", error);\n dataCache.set(key, { status: \"rejected\", error });\n throw error;\n });\n\n dataCache.set(key, { status: \"pending\", promise });\n}\n\nexport type GetRouteDataOptions = {\n /**\n * If true, forces revalidation of route data,\n * ignoring the cache and fetching fresh data from the server.\n * Similar to Next.js's `router.refresh()` behavior.\n */\n revalidate?: boolean;\n};\n\nexport async function getRouteData(\n url: string,\n options?: GetRouteDataOptions\n): Promise<RouteData> {\n const key = buildDataUrl(url);\n\n // If revalidation is requested, remove the entry from cache\n // This ensures we don't reuse pending or fulfilled entries\n if (options?.revalidate) {\n deleteCacheEntry(key);\n }\n\n const entry = dataCache.get(key);\n\n if (entry && !options?.revalidate) {\n // Only use cached entry if not revalidating\n if (entry.status === \"fulfilled\") {\n // Update LRU: mark as recently used\n updateLRU(key);\n return entry.value;\n }\n if (entry.status === \"pending\") {\n // Return existing pending promise to avoid duplicate requests\n return entry.promise;\n }\n }\n\n // No entry in cache (or revalidating), fetch it\n // skipLayoutHooks: true for normal SPA navigation, false when revalidating\n const skipLayoutHooks = !options?.revalidate;\n \n // Check again if an entry was added while we were processing (race condition)\n const currentEntry = dataCache.get(key);\n if (currentEntry && !options?.revalidate) {\n if (currentEntry.status === \"fulfilled\") {\n updateLRU(key);\n return currentEntry.value;\n }\n if (currentEntry.status === \"pending\") {\n return currentEntry.promise;\n }\n }\n \n // Create a new promise for this fetch\n const promise = fetchRouteDataOnce(url, skipLayoutHooks)\n .then((value) => {\n // Only set cache entry if this is still the current fetch for this key\n // This prevents race conditions where multiple revalidations happen simultaneously\n const entryAfterFetch = dataCache.get(key);\n if (!entryAfterFetch || entryAfterFetch.status === \"pending\") {\n setCacheEntry(key, { status: \"fulfilled\", value });\n }\n return value;\n })\n .catch((error) => {\n console.error(\"[client][cache] Error fetching route data:\", error);\n const entryAfterFetch = dataCache.get(key);\n if (!entryAfterFetch || entryAfterFetch.status === \"pending\") {\n dataCache.set(key, { status: \"rejected\", error });\n }\n throw error;\n });\n\n // Set pending entry - if revalidating, we already deleted it, so this is safe\n dataCache.set(key, { status: \"pending\", promise });\n \n return promise;\n}\n","import { getRouteData } from \"../../react/cache/index\";\r\nimport type { RouteDataResponse } from \"../../react/cache/client-data-cache\";\r\nimport { matchRouteClient } from \"./route-matcher\";\r\nimport { applyMetadata } from \"./metadata\";\r\nimport { setWindowData, getCurrentTheme, setRouterData, getPreservedLayoutProps, setPreservedLayoutProps } from \"./window-data\";\r\nimport type {\r\n ClientRouteLoaded,\r\n RouteViewState,\r\n InitialData,\r\n RouterData,\r\n ClientLoadedComponents,\r\n} from \"./types\";\r\n\r\nexport type NavigationHandlers = {\r\n setState: (state: RouteViewState) => void;\r\n routes: ClientRouteLoaded[];\r\n notFoundRoute: ClientRouteLoaded | null;\r\n errorRoute: ClientRouteLoaded | null;\r\n};\r\n\r\nasync function handleErrorRoute(\r\n nextUrl: string,\r\n json: RouteDataResponse,\r\n errorRoute: ClientRouteLoaded,\r\n setState: (state: RouteViewState) => void\r\n): Promise<boolean> {\r\n try {\r\n const components = await errorRoute.load();\r\n \r\n // Get theme: prioritize cookie, then server, then window data, then default\r\n let theme: string = \"light\";\r\n if (typeof document !== \"undefined\") {\r\n const cookieMatch = document.cookie.match(/theme=([^;]+)/);\r\n if (cookieMatch) {\r\n theme = cookieMatch[1];\r\n } else if (json.theme) {\r\n theme = json.theme;\r\n } else {\r\n const currentTheme = getCurrentTheme();\r\n if (currentTheme) theme = currentTheme;\r\n }\r\n } else if (json.theme) {\r\n theme = json.theme;\r\n }\r\n \r\n // Preserve layout props if not in response (SPA navigation)\r\n let layoutProps: Record<string, any> = {};\r\n if (json.layoutProps !== undefined && json.layoutProps !== null) {\r\n layoutProps = json.layoutProps;\r\n setPreservedLayoutProps(layoutProps);\r\n } else {\r\n const preserved = getPreservedLayoutProps();\r\n if (preserved) {\r\n layoutProps = preserved;\r\n }\r\n }\r\n\r\n const pageProps = json.pageProps ?? json.props ?? {\r\n error: json.message || \"An error occurred\",\r\n };\r\n\r\n const errorProps = {\r\n ...layoutProps,\r\n ...pageProps,\r\n theme,\r\n };\r\n\r\n const windowData: InitialData = {\r\n pathname: nextUrl,\r\n params: json.params || {},\r\n props: errorProps,\r\n metadata: json.metadata ?? null,\r\n theme,\r\n notFound: false,\r\n error: true,\r\n };\r\n\r\n setWindowData(windowData);\r\n\r\n // Update routerData\r\n const url = new URL(nextUrl, typeof window !== \"undefined\" ? window.location.origin : \"http://localhost\");\r\n const routerData: RouterData = {\r\n pathname: url.pathname,\r\n params: json.params || {},\r\n searchParams: Object.fromEntries(url.searchParams.entries()),\r\n };\r\n setRouterData(routerData);\r\n\r\n setState({\r\n url: nextUrl,\r\n route: errorRoute,\r\n params: json.params || {},\r\n components,\r\n props: errorProps,\r\n });\r\n return true;\r\n } catch (loadError) {\r\n console.error(\"\\n❌ [client] Error loading error route components:\");\r\n console.error(loadError);\r\n if (loadError instanceof Error) {\r\n console.error(` Message: ${loadError.message}`);\r\n if (loadError.stack) {\r\n console.error(` Stack: ${loadError.stack.split('\\n').slice(0, 3).join('\\n ')}`);\r\n }\r\n }\r\n console.error(\"💡 Falling back to full page reload\\n\");\r\n window.location.href = nextUrl;\r\n return false;\r\n }\r\n}\r\n\r\nasync function handleNotFoundRoute(\r\n nextUrl: string,\r\n json: RouteDataResponse,\r\n notFoundRoute: ClientRouteLoaded | null,\r\n setState: (state: RouteViewState) => void\r\n): Promise<void> {\r\n // Get theme: prioritize cookie, then server, then window data, then default\r\n let theme: string = \"light\";\r\n if (typeof document !== \"undefined\") {\r\n const cookieMatch = document.cookie.match(/theme=([^;]+)/);\r\n if (cookieMatch) {\r\n theme = cookieMatch[1];\r\n } else if (json.theme) {\r\n theme = json.theme;\r\n } else {\r\n const currentTheme = getCurrentTheme();\r\n if (currentTheme) theme = currentTheme;\r\n }\r\n } else if (json.theme) {\r\n theme = json.theme;\r\n }\r\n \r\n // Preserve layout props if not in response (SPA navigation)\r\n let layoutProps: Record<string, any> = {};\r\n if (json.layoutProps !== undefined && json.layoutProps !== null) {\r\n layoutProps = json.layoutProps;\r\n setPreservedLayoutProps(layoutProps);\r\n } else {\r\n const preserved = getPreservedLayoutProps();\r\n if (preserved) {\r\n layoutProps = preserved;\r\n }\r\n }\r\n\r\n const pageProps = json.pageProps ?? json.props ?? {};\r\n\r\n const notFoundProps = {\r\n ...layoutProps,\r\n ...pageProps,\r\n theme,\r\n };\r\n\r\n const windowData: InitialData = {\r\n pathname: nextUrl,\r\n params: {},\r\n props: notFoundProps,\r\n metadata: json.metadata ?? null,\r\n theme,\r\n notFound: true,\r\n error: false,\r\n };\r\n\r\n setWindowData(windowData);\r\n\r\n // Update routerData\r\n const url = new URL(nextUrl, typeof window !== \"undefined\" ? window.location.origin : \"http://localhost\");\r\n const routerData: RouterData = {\r\n pathname: url.pathname,\r\n params: {},\r\n searchParams: Object.fromEntries(url.searchParams.entries()),\r\n };\r\n setRouterData(routerData);\r\n\r\n if (notFoundRoute) {\r\n const components = await notFoundRoute.load();\r\n setState({\r\n url: nextUrl,\r\n route: notFoundRoute,\r\n params: {},\r\n components,\r\n props: notFoundProps,\r\n });\r\n } else {\r\n setState({\r\n url: nextUrl,\r\n route: null,\r\n params: {},\r\n components: null,\r\n props: {},\r\n });\r\n }\r\n}\r\n\r\nasync function handleNormalRoute(\r\n nextUrl: string,\r\n json: RouteDataResponse,\r\n routes: ClientRouteLoaded[],\r\n setState: (state: RouteViewState) => void\r\n): Promise<boolean> {\r\n applyMetadata(json.metadata ?? null);\r\n \r\n // Get theme: prioritize cookie (source of truth), then server response, then window data, then default\r\n // Cookie is the source of truth because it persists across navigation\r\n let theme: string = \"light\"; // Default\r\n if (typeof document !== \"undefined\") {\r\n const cookieMatch = document.cookie.match(/theme=([^;]+)/);\r\n if (cookieMatch) {\r\n theme = cookieMatch[1];\r\n } else if (json.theme) {\r\n theme = json.theme;\r\n } else {\r\n const currentTheme = getCurrentTheme();\r\n if (currentTheme) {\r\n theme = currentTheme;\r\n }\r\n }\r\n } else if (json.theme) {\r\n theme = json.theme;\r\n }\r\n \r\n // Handle layout props preservation:\r\n // - If layoutProps are in response, use them and preserve them\r\n // - If layoutProps are NOT in response (layout hooks were skipped), use preserved ones\r\n let layoutProps: Record<string, any> = {};\r\n if (json.layoutProps !== undefined && json.layoutProps !== null) {\r\n // Layout hooks were executed, use new layout props and preserve them\r\n layoutProps = json.layoutProps;\r\n setPreservedLayoutProps(layoutProps);\r\n } else {\r\n // Layout hooks were skipped, use preserved layout props\r\n const preserved = getPreservedLayoutProps();\r\n if (preserved) {\r\n layoutProps = preserved;\r\n }\r\n }\r\n\r\n // Get page props (always from response)\r\n const pageProps = json.pageProps ?? json.props ?? {};\r\n\r\n // Combine: layout props (preserved or new) + page props (always new)\r\n // Page props override layout props if there's a conflict\r\n const combinedProps = {\r\n ...layoutProps,\r\n ...pageProps,\r\n theme, // Always include theme\r\n };\r\n\r\n const matched = matchRouteClient(nextUrl, routes);\r\n\r\n if (!matched) {\r\n window.location.href = nextUrl;\r\n return false;\r\n }\r\n\r\n const windowData: InitialData = {\r\n pathname: nextUrl,\r\n params: matched.params,\r\n props: combinedProps,\r\n metadata: json.metadata ?? null,\r\n theme,\r\n notFound: false,\r\n error: false,\r\n };\r\n\r\n setWindowData(windowData);\r\n\r\n // Update routerData\r\n const url = new URL(nextUrl, typeof window !== \"undefined\" ? window.location.origin : \"http://localhost\");\r\n const routerData: RouterData = {\r\n pathname: url.pathname,\r\n params: matched.params,\r\n searchParams: Object.fromEntries(url.searchParams.entries()),\r\n };\r\n setRouterData(routerData);\r\n\r\n // Use prefetched route if available, otherwise load it\r\n const prefetched = prefetchedRoutes.get(matched.route);\r\n const components = prefetched ? await prefetched : await matched.route.load();\r\n \r\n // Cache the loaded route for future use\r\n if (!prefetched) {\r\n prefetchedRoutes.set(matched.route, Promise.resolve(components));\r\n }\r\n\r\n window.scrollTo({\r\n top: 0,\r\n behavior: \"smooth\",\r\n });\r\n\r\n setState({\r\n url: nextUrl,\r\n route: matched.route,\r\n params: matched.params,\r\n components,\r\n props: combinedProps,\r\n });\r\n\r\n return true;\r\n}\r\n\r\nexport type NavigateOptions = {\r\n /**\r\n * If true, forces revalidation of route data,\r\n * ignoring the cache and fetching fresh data from the server.\r\n * Similar to Next.js's `router.refresh()` behavior.\r\n */\r\n revalidate?: boolean;\r\n};\r\n\r\nexport async function navigate(\r\n nextUrl: string,\r\n handlers: NavigationHandlers,\r\n options?: NavigateOptions\r\n): Promise<void> {\r\n const { setState, routes, notFoundRoute, errorRoute } = handlers;\r\n\r\n try {\r\n const { ok, json } = await getRouteData(nextUrl, {\r\n revalidate: options?.revalidate,\r\n });\r\n\r\n if (json && json.error) {\r\n if (errorRoute) {\r\n const handled = await handleErrorRoute(\r\n nextUrl,\r\n json,\r\n errorRoute,\r\n setState\r\n );\r\n if (handled) return;\r\n } else {\r\n console.warn(\r\n \"[client] Error route not available, reloading page.\",\r\n errorRoute\r\n );\r\n window.location.href = nextUrl;\r\n return;\r\n }\r\n }\r\n\r\n // 🔴 HTTP error (404/500/etc)\r\n if (!ok) {\r\n if (json?.redirect) {\r\n window.location.href = json.redirect.destination;\r\n return;\r\n }\r\n window.location.href = nextUrl;\r\n return;\r\n }\r\n\r\n // Redirect via JSON\r\n if (json.redirect) {\r\n window.location.href = json.redirect.destination;\r\n return;\r\n }\r\n\r\n // Handle notFound\r\n if (json.notFound) {\r\n await handleNotFoundRoute(nextUrl, json, notFoundRoute, setState);\r\n return;\r\n }\r\n\r\n // Normal route\r\n await handleNormalRoute(nextUrl, json, routes, setState);\r\n } catch (err) {\r\n console.error(\"[client] Error fetching FW data:\", err);\r\n window.location.href = nextUrl;\r\n }\r\n}\r\n\r\n// Cache for prefetched routes to avoid loading twice\r\nconst prefetchedRoutes = new WeakMap<ClientRouteLoaded, Promise<ClientLoadedComponents>>();\r\n\r\n/**\r\n * Prefetches a route's components when user hovers over a link.\r\n * This improves perceived performance by loading the route before the user clicks.\r\n */\r\nfunction prefetchRoute(\r\n url: string,\r\n routes: ClientRouteLoaded[],\r\n notFoundRoute: ClientRouteLoaded | null\r\n): void {\r\n const [pathname] = url.split(\"?\");\r\n const matched = matchRouteClient(pathname, routes);\r\n \r\n if (!matched) {\r\n // If no match, might be not-found route\r\n if (notFoundRoute) {\r\n const existing = prefetchedRoutes.get(notFoundRoute);\r\n if (!existing) {\r\n const promise = notFoundRoute.load();\r\n prefetchedRoutes.set(notFoundRoute, promise);\r\n }\r\n }\r\n return;\r\n }\r\n\r\n // Prefetch the matched route if not already prefetched\r\n const existing = prefetchedRoutes.get(matched.route);\r\n if (!existing) {\r\n const promise = matched.route.load();\r\n prefetchedRoutes.set(matched.route, promise);\r\n }\r\n}\r\n\r\n/**\r\n * Creates a hover handler for prefetching routes on link hover.\r\n */\r\nexport function createHoverHandler(\r\n routes: ClientRouteLoaded[],\r\n notFoundRoute: ClientRouteLoaded | null\r\n): (ev: MouseEvent) => void {\r\n return function handleHover(ev: MouseEvent) {\r\n try {\r\n const target = ev.target as HTMLElement | null;\r\n if (!target) return;\r\n\r\n const anchor = target.closest(\"a[href]\") as HTMLAnchorElement | null;\r\n if (!anchor) return;\r\n\r\n const href = anchor.getAttribute(\"href\");\r\n if (!href) return;\r\n if (href.startsWith(\"#\")) return;\r\n\r\n const url = new URL(href, window.location.href);\r\n if (url.origin !== window.location.origin) return;\r\n if (anchor.target && anchor.target !== \"_self\") return;\r\n\r\n const nextUrl = url.pathname + url.search;\r\n const currentUrl = window.location.pathname + window.location.search;\r\n if (nextUrl === currentUrl) return;\r\n\r\n // Prefetch the route\r\n prefetchRoute(nextUrl, routes, notFoundRoute);\r\n } catch (error) {\r\n // Silently fail - prefetch is an optimization, not critical\r\n }\r\n };\r\n}\r\n\r\nexport function createClickHandler(\r\n navigate: (url: string, options?: NavigateOptions) => void\r\n): (ev: MouseEvent) => void {\r\n return function handleClick(ev: MouseEvent) {\r\n try {\r\n // Exit early if event was already prevented\r\n if (ev.defaultPrevented) return;\r\n \r\n // Verify it's a real mouse event (not synthetic or keyboard)\r\n if (ev.type !== \"click\") return;\r\n if (ev.button !== 0) return;\r\n if (ev.metaKey || ev.ctrlKey || ev.shiftKey || ev.altKey) return;\r\n \r\n // Verify event has valid coordinates (real mouse events have them)\r\n const target = ev.target as HTMLElement | null;\r\n if (ev.clientX === 0 && ev.clientY === 0 && ev.detail === 0) {\r\n // Could be a synthetic event, be more cautious\r\n if (target) {\r\n const tagName = target.tagName.toLowerCase();\r\n if (tagName === \"input\" || tagName === \"textarea\" || tagName === \"button\" || tagName === \"select\") {\r\n return; // It's an input, don't process synthetic events\r\n }\r\n }\r\n }\r\n\r\n if (!target) return;\r\n\r\n // Check FIRST if target is an interactive element (faster)\r\n const tagName = target.tagName.toLowerCase();\r\n if (\r\n tagName === \"input\" ||\r\n tagName === \"textarea\" ||\r\n tagName === \"button\" ||\r\n tagName === \"select\" ||\r\n target.isContentEditable ||\r\n target.getAttribute(\"contenteditable\") === \"true\"\r\n ) {\r\n return; // It's an interactive element, don't process\r\n }\r\n\r\n // Check if it's inside an interactive element using closest (more efficient than composedPath)\r\n const interactiveParent = target.closest(\"input, textarea, button, select, [contenteditable], label\");\r\n if (interactiveParent) {\r\n // If parent is a label, check if it has an associated control\r\n if (interactiveParent.tagName.toLowerCase() === \"label\") {\r\n const label = interactiveParent as HTMLLabelElement;\r\n if (label.control) {\r\n return; // Label has an associated control (input, etc)\r\n }\r\n } else {\r\n return; // It's inside an interactive element\r\n }\r\n }\r\n\r\n // Only search for anchor if it's not an interactive element\r\n const anchor = target.closest(\"a[href]\") as HTMLAnchorElement | null;\r\n if (!anchor) return;\r\n\r\n const href = anchor.getAttribute(\"href\");\r\n if (!href) return;\r\n if (href.startsWith(\"#\")) return;\r\n\r\n const url = new URL(href, window.location.href);\r\n if (url.origin !== window.location.origin) return;\r\n if (anchor.target && anchor.target !== \"_self\") return;\r\n\r\n ev.preventDefault();\r\n\r\n const nextUrl = url.pathname + url.search;\r\n const currentUrl = window.location.pathname + window.location.search;\r\n if (nextUrl === currentUrl) return;\r\n\r\n // Detect if link has data-revalidate to force revalidation\r\n const shouldRevalidate =\r\n anchor.hasAttribute(\"data-revalidate\") &&\r\n anchor.getAttribute(\"data-revalidate\") !== \"false\";\r\n\r\n window.history.pushState({}, \"\", nextUrl);\r\n navigate(nextUrl, shouldRevalidate ? { revalidate: true } : undefined);\r\n } catch (error) {\r\n // Silenciar errores para evitar bloquear el navegador\r\n console.error(\"[navigation] Error in click handler:\", error);\r\n }\r\n };\r\n}\r\n\r\nexport function createPopStateHandler(\r\n navigate: (url: string, options?: NavigateOptions) => void\r\n): () => void {\r\n return function handlePopState() {\r\n const nextUrl = window.location.pathname + window.location.search;\r\n navigate(nextUrl);\r\n };\r\n}\r\n\r\n","import { createContext, useContext } from \"react\";\r\n\r\nexport type NavigateFunction = (\r\n url: string,\r\n options?: { revalidate?: boolean; replace?: boolean }\r\n) => Promise<void>;\r\n\r\nexport interface RouterContextValue {\r\n navigate: NavigateFunction;\r\n}\r\n\r\nexport const RouterContext = createContext<RouterContextValue | null>(null);\r\n\r\nexport function useRouterContext(): RouterContextValue {\r\n const context = useContext(RouterContext);\r\n if (!context) {\r\n throw new Error(\r\n \"useRouter must be used within a RouterProvider. Make sure you're using it inside a Loly app.\"\r\n );\r\n }\r\n return context;\r\n}\r\n","/**\r\n * Sets up hot reload via Server-Sent Events (SSE) in development mode.\r\n * Listens for file changes and reloads the page when needed.\r\n * \r\n * This module is separate from bootstrap to keep concerns separated\r\n * and make the code more maintainable.\r\n */\r\nexport function setupHotReload(): void {\r\n // process.env.NODE_ENV is replaced by DefinePlugin at build time\r\n // DefinePlugin replaces this with a string literal: \"development\" or \"production\"\r\n // @ts-expect-error - process.env.NODE_ENV is replaced at build time by DefinePlugin\r\n const nodeEnv: string = process.env.NODE_ENV || \"production\";\r\n const isDev = nodeEnv === \"development\";\r\n \r\n console.log(`[hot-reload] NODE_ENV: ${nodeEnv}, isDev: ${isDev}`);\r\n \r\n if (!isDev) {\r\n console.log(\"[hot-reload] Skipping hot reload setup (not in development mode)\");\r\n return;\r\n }\r\n \r\n console.log(\"[hot-reload] Setting up hot reload client...\");\r\n\r\n let eventSource: EventSource | null = null;\r\n let reloadTimeout: ReturnType<typeof setTimeout> | null = null;\r\n let reconnectTimeout: ReturnType<typeof setTimeout> | null = null;\r\n let reconnectAttempts = 0;\r\n const MAX_RECONNECT_ATTEMPTS = 10;\r\n const RECONNECT_DELAY = 1000; // 1 second\r\n const RELOAD_DELAY = 100; // Reduced from 500ms to 100ms for faster reload\r\n\r\n function connect(): void {\r\n try {\r\n if (eventSource) {\r\n console.log(\"[hot-reload] Closing existing EventSource connection\");\r\n eventSource.close();\r\n }\r\n\r\n const endpoint = \"/__fw/hot\";\r\n eventSource = new EventSource(endpoint);\r\n \r\n // Register ping listener FIRST (before message) to catch initial ping\r\n eventSource.addEventListener(\"ping\", (event: Event) => {\r\n if ('data' in event) {\r\n console.log(\"[hot-reload] ✅ Connected to hot reload server\");\r\n }\r\n reconnectAttempts = 0;\r\n });\r\n\r\n // Register message listener for reload events\r\n eventSource.addEventListener(\"message\", (event: MessageEvent) => {\r\n const data = event.data;\r\n if (data && typeof data === \"string\" && data.startsWith(\"reload:\")) {\r\n const filePath = data.slice(7);\r\n console.log(`[hot-reload] 📝 File changed: ${filePath}, reloading...`);\r\n\r\n // Clear existing timeout to debounce rapid events\r\n if (reloadTimeout) {\r\n clearTimeout(reloadTimeout);\r\n }\r\n\r\n // Debounce reload - wait a bit in case multiple files change at once\r\n reloadTimeout = setTimeout(() => {\r\n try {\r\n window.location.reload();\r\n } catch (error) {\r\n console.error(\"[hot-reload] ❌ Error reloading page:\", error);\r\n // Fallback: try to reload after a short delay\r\n setTimeout(() => window.location.reload(), 100);\r\n }\r\n }, RELOAD_DELAY);\r\n }\r\n });\r\n\r\n eventSource.onopen = () => {\r\n reconnectAttempts = 0; // Reset on successful connection\r\n };\r\n\r\n eventSource.onerror = (error) => {\r\n const states = [\"CONNECTING\", \"OPEN\", \"CLOSED\"];\r\n const state = states[eventSource?.readyState ?? 0] || \"UNKNOWN\";\r\n \r\n if (eventSource?.readyState === EventSource.CONNECTING) {\r\n // Still connecting, this is normal\r\n console.log(\"[hot-reload] ⏳ Still connecting...\");\r\n return;\r\n } else if (eventSource?.readyState === EventSource.OPEN) {\r\n // Connection is open but error occurred (might be temporary)\r\n console.warn(\"[hot-reload] ⚠️ Connection error (but connection is open):\", error);\r\n } else {\r\n // Connection closed, try to reconnect\r\n console.warn(`[hot-reload] ❌ Connection closed (readyState: ${state})`);\r\n \r\n if (reconnectAttempts < MAX_RECONNECT_ATTEMPTS) {\r\n reconnectAttempts++;\r\n const delay = RECONNECT_DELAY * reconnectAttempts; // Exponential backoff\r\n \r\n if (reconnectTimeout) {\r\n clearTimeout(reconnectTimeout);\r\n }\r\n \r\n reconnectTimeout = setTimeout(() => {\r\n console.log(`[hot-reload] 🔄 Reconnecting... (attempt ${reconnectAttempts}/${MAX_RECONNECT_ATTEMPTS})`);\r\n connect();\r\n }, delay);\r\n } else {\r\n console.error(\"[hot-reload] ❌ Max reconnect attempts reached. Please refresh the page manually.\");\r\n }\r\n }\r\n };\r\n } catch (error) {\r\n console.error(\"[hot-reload] ❌ Failed to create EventSource:\", error);\r\n console.error(\"[hot-reload] EventSource may not be supported in this browser.\");\r\n }\r\n }\r\n\r\n // Initial connection\r\n connect();\r\n}\r\n\r\n","export function withCache(fn: any, options: any): any {\r\n const ttl = options.ttl ?? 60;\r\n\r\n return async function cachedGssp(ctx: any): Promise<any> {\r\n return await fn(ctx);\r\n };\r\n}\r\n","import { z, ZodSchema, ZodError } from \"zod\";\r\n\r\n/**\r\n * Validation error with detailed information.\r\n */\r\nexport class ValidationError extends Error {\r\n constructor(\r\n public errors: z.ZodIssue[],\r\n message = \"Validation failed\"\r\n ) {\r\n super(message);\r\n this.name = \"ValidationError\";\r\n }\r\n\r\n /**\r\n * Formats validation errors into a user-friendly format.\r\n */\r\n format(): Record<string, string[]> {\r\n const formatted: Record<string, string[]> = {};\r\n for (const error of this.errors) {\r\n const path = error.path.join(\".\");\r\n if (!formatted[path]) {\r\n formatted[path] = [];\r\n }\r\n formatted[path].push(error.message);\r\n }\r\n return formatted;\r\n }\r\n}\r\n\r\n/**\r\n * Validates data against a Zod schema.\r\n * \r\n * @param schema - Zod schema to validate against\r\n * @param data - Data to validate\r\n * @returns Validated data\r\n * @throws ValidationError if validation fails\r\n */\r\nexport function validate<T>(\r\n schema: ZodSchema<T>,\r\n data: unknown\r\n): T {\r\n try {\r\n return schema.parse(data);\r\n } catch (error) {\r\n if (error instanceof ZodError) {\r\n throw new ValidationError(error.errors);\r\n }\r\n throw error;\r\n }\r\n}\r\n\r\n/**\r\n * Safely validates data and returns a result object.\r\n * \r\n * @param schema - Zod schema to validate against\r\n * @param data - Data to validate\r\n * @returns Result object with success flag and data/error\r\n */\r\nexport function safeValidate<T>(\r\n schema: ZodSchema<T>,\r\n data: unknown\r\n): { success: true; data: T } | { success: false; error: ValidationError } {\r\n try {\r\n const validated = schema.parse(data);\r\n return { success: true, data: validated };\r\n } catch (error) {\r\n if (error instanceof ZodError) {\r\n return {\r\n success: false,\r\n error: new ValidationError(error.errors),\r\n };\r\n }\r\n throw error;\r\n }\r\n}\r\n\r\n/**\r\n * Common validation schemas for reuse.\r\n */\r\nexport const commonSchemas = {\r\n /**\r\n * Validates a string parameter (e.g., route params).\r\n */\r\n stringParam: z.string().min(1).max(255),\r\n\r\n /**\r\n * Validates an optional string parameter.\r\n */\r\n optionalStringParam: z.string().max(255).optional(),\r\n\r\n /**\r\n * Validates a numeric ID parameter.\r\n */\r\n idParam: z.string().regex(/^\\d+$/, \"ID must be numeric\").transform(Number),\r\n\r\n /**\r\n * Validates a UUID parameter.\r\n */\r\n uuidParam: z.string().uuid(\"Invalid UUID format\"),\r\n\r\n /**\r\n * Validates pagination parameters.\r\n */\r\n pagination: z.object({\r\n page: z.string().regex(/^\\d+$/).transform(Number).default(\"1\"),\r\n limit: z.string().regex(/^\\d+$/).transform(Number).default(\"10\"),\r\n }),\r\n\r\n /**\r\n * Validates a search query parameter.\r\n */\r\n searchQuery: z.string().min(1).max(100).optional(),\r\n};\r\n\r\n"],"mappings":"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AA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MACxD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAC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","names":["exports","module","exports","flags","args","keys","exports","require_built","exports","exports","module","exports","module","exports","module","exports","module","toUTF8Array","generate","exports","module","require_lodash","exports","module","require_lodash","exports","exports","module","exports","module","exports","module","exports","module","exports","module","exports","module","useColors","exports","module","exports","exports","require_utils","exports","timeout","exports","resolve","exports","exports","exports","resolve","pipeline","exports","exports","exports","resolve","exports","exec","resolve","exports","exports","exports","exports","exports","exports","module","exports","exports","exports","resolve","callback","j","err","exports","exports","resolve","exports","exports","exports","resolve","err","_a","exports","exports","exports","exports","module","Buffer","exports","module","exports","exports","exports","exports","exports","resolve","err","require_built","exports","module","import_fs","import_path","path","fs","import_path","import_fs","import_path","import_fs","import_path","path","fs","import_fs","import_path","path","fs","path","fs","import_fs","import_path","import_fs","import_path","path","fs","path","path","fs","import_fs","import_path","path","fs","import_fs","import_path","path","fs","import_fs","import_path","import_fs","import_path","ROUTE_FILE_REGEX","path","fs","path","fs","import_core","import_path","import_fs","import_fs","import_path","fs","path","BUILD_FOLDER_NAME","STATIC_PATH","path","envPath","fs","dotenv","import_path","import_fs","resolve","path","fs","import_fs","import_promises","sysPath","path","presolve","basename","pjoin","prelative","psep","import_fs","import_promises","osType","path","fs_watch","rawEmitter","listener","basename","dirname","newStats","closer","fsrealpath","resolve","realpath","stats","relative","path","DOUBLE_SLASH_RE","testString","stats","statcb","now","stat","import_path","path","import_path","path","import_path","import_fs","path","fs","getRoutes","path","express","pino","logger","module","path","logger","rateLimit","path","resolve","React","import_path","path","import_path","path","import_fs","import_path","logger","path","fs","import_path","ctx","layoutProps","reqLogger","path","loaderResult","combinedProps","combinedLoaderResult","initialData","appTree","nonce","entrypointFiles","documentTree","didError","pipe","abort","error","DEFAULT_CONFIG","import_path","path","generateRequestId","parseCookies","import_express","express","rateLimit","crypto","helmet","cors","logger","cookieParser","compression","http","import_dotenv","path","fs","dotenv","logger","import_path","import_path","path","import_fs","import_path","import_server","path","fs","path","import_path","import_fs","path","fs","esbuild","import_client","WINDOW_DATA_KEY","ROUTER_DATA_KEY","APP_CONTAINER_ID","WINDOW_DATA_KEY","ROUTER_DATA_KEY","import_react","existing","navigate","tagName","import_react","import_jsx_runtime","WINDOW_DATA_KEY","setupHotReload","import_jsx_runtime","setupHotReload","APP_CONTAINER_ID","path"]}