baraqex 1.0.47 → 1.0.48

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 (28) hide show
  1. package/dist/index.js +39 -5
  2. package/dist/index.js.map +2 -2
  3. package/dist/server.js +7 -5
  4. package/dist/server.js.map +2 -2
  5. package/package.json +1 -1
  6. package/templates/fullstack-template/package.json +4 -3
  7. package/templates/fullstack-template/server.js +548 -15
  8. package/templates/fullstack-template/src/api/hello.js +9 -11
  9. package/templates/fullstack-template/src/pages/index.js +196 -114
  10. package/templates/fullstack-app/package-lock.json +0 -3683
  11. package/templates/fullstack-app/package.json +0 -26
  12. package/templates/fullstack-app/public/client.js +0 -139
  13. package/templates/fullstack-app/public/fullstack-styles.css +0 -445
  14. package/templates/fullstack-app/server.js +0 -32
  15. package/templates/fullstack-app/src/api/auth.js +0 -48
  16. package/templates/fullstack-app/src/api/users.js +0 -85
  17. package/templates/fullstack-app/src/pages/index.js +0 -0
  18. package/templates/fullstack-app/src/pages/index.jsx +0 -181
  19. package/templates/fullstack-app/src/pages/login.js +0 -139
  20. package/templates/fullstack-app/src/pages/login.jsx +0 -150
  21. package/templates/fullstack-template/package-lock.json +0 -968
  22. package/templates/fullstack-template/public/client.js +0 -17
  23. package/templates/fullstack-template/src/api/users/index.js +0 -43
  24. package/templates/go-wasm-app/package.json +0 -24
  25. package/templates/go-wasm-app/public/wasm-styles.css +0 -184
  26. package/templates/go-wasm-app/server.js +0 -36
  27. package/templates/go-wasm-app/src/pages/index.jsx +0 -161
  28. package/templates/go-wasm-app/src/wasm/main.go +0 -164
package/dist/server.js CHANGED
@@ -888,6 +888,9 @@ var Server = class {
888
888
  enableCors: true,
889
889
  ...config
890
890
  };
891
+ this.initializeApp().catch((error) => {
892
+ console.error("Failed to initialize server:", error);
893
+ });
891
894
  }
892
895
  async initializeApp() {
893
896
  if (this.initialized) {
@@ -925,7 +928,7 @@ var Server = class {
925
928
  this.app.use(notFoundHandler);
926
929
  this.app.use(errorHandler);
927
930
  this.initialized = true;
928
- console.log("Server initialized successfully");
931
+ console.log("\u2705 Baraqex server initialized successfully");
929
932
  } catch (error) {
930
933
  if (error.code === "MODULE_NOT_FOUND" && error.message.includes("express")) {
931
934
  throw new Error("Express not installed. Run: npm install express @types/express");
@@ -1114,8 +1117,8 @@ var Server = class {
1114
1117
  return this.auth;
1115
1118
  }
1116
1119
  async start() {
1117
- if (!this.initialized) {
1118
- await this.initializeApp();
1120
+ while (!this.initialized) {
1121
+ await new Promise((resolve) => setTimeout(resolve, 50));
1119
1122
  }
1120
1123
  return new Promise((resolve, reject) => {
1121
1124
  if (!this.app) {
@@ -1123,7 +1126,7 @@ var Server = class {
1123
1126
  return;
1124
1127
  }
1125
1128
  this.server = this.app.listen(this.config.port, () => {
1126
- console.log(`Server running at http://localhost:${this.config.port}`);
1129
+ console.log(`\u{1F680} Server running at http://localhost:${this.config.port}`);
1127
1130
  resolve();
1128
1131
  });
1129
1132
  this.server.on("error", (error) => {
@@ -1216,7 +1219,6 @@ function createDevServer(options = {}) {
1216
1219
  function createProductionServer(config) {
1217
1220
  const server = new Server({
1218
1221
  ...config,
1219
- // Fix the PORT parsing
1220
1222
  port: config.port || (process.env.PORT ? parseInt(process.env.PORT) : 8080)
1221
1223
  });
1222
1224
  server.addShutdownHandler();
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/server/index.ts", "../src/server/database.ts", "../src/server/auth.ts", "../src/server/api-router.ts", "../src/server/middleware.ts", "../src/server/utils.ts", "../src/server/templates.ts", "../src/server/wasm.ts"],
4
- "sourcesContent": ["import path from 'path';\r\nimport http from 'http';\r\nimport fs from 'fs';\r\nimport { renderToString } from 'frontend-hamroun';\r\nimport { Database } from './database.js';\r\nimport { AuthService } from './auth.js';\r\nimport { ApiRouter } from './api-router.js';\r\nimport { requestLogger, errorHandler, notFoundHandler, rateLimit } from './middleware.js';\r\n\r\n// Import the utility functions\r\nimport * as utils from './utils.js';\r\nimport * as templates from './templates.js';\r\nimport { initNodeWasm, loadGoWasmFromFile } from './wasm.js';\r\n\r\n// Helper function to get the component name from the file path\r\nfunction getComponentName(filePath: string, pagesDir: string): string {\r\n try {\r\n // Get relative path from pages directory\r\n const relativePath = path.relative(pagesDir, filePath);\r\n // Remove extension\r\n const withoutExt = relativePath.replace(/\\.[^/.]+$/, '');\r\n // Replace index with empty for clean paths\r\n const cleanPath = withoutExt.replace(/\\/index$/, '');\r\n // Convert to module path format\r\n return `/pages/${cleanPath}`;\r\n } catch (e) {\r\n return '';\r\n }\r\n}\r\n\r\nexport interface ServerConfig {\r\n port?: number;\r\n apiDir?: string;\r\n pagesDir?: string;\r\n staticDir?: string;\r\n enableCors?: boolean;\r\n corsOptions?: any;\r\n db?: {\r\n url: string;\r\n type: 'mongodb' | 'mysql' | 'postgres';\r\n };\r\n auth?: {\r\n secret: string;\r\n expiresIn?: string | number;\r\n };\r\n}\r\n\r\nexport class Server {\r\n private app: any;\r\n private server: http.Server | null = null;\r\n private config: ServerConfig;\r\n private db: Database | null = null;\r\n private auth: AuthService | null = null;\r\n private initialized: boolean = false;\r\n\r\n constructor(config: ServerConfig = {}) {\r\n this.config = {\r\n port: 3000,\r\n apiDir: './api',\r\n pagesDir: './pages',\r\n staticDir: './public',\r\n enableCors: true,\r\n ...config\r\n };\r\n\r\n // Don't call initializeApp in constructor\r\n // It will be called when start() is called\r\n }\r\n\r\n private async initializeApp() {\r\n if (this.initialized) {\r\n return; // Already initialized\r\n }\r\n\r\n try {\r\n // Dynamic import of express to handle missing dependency\r\n const express = await import('express');\r\n this.app = express.default();\r\n \r\n // Basic middleware\r\n this.app.use(express.default.json());\r\n this.app.use(express.default.urlencoded({ extended: true }));\r\n \r\n // CORS setup\r\n if (this.config.enableCors) {\r\n try {\r\n const cors = await import('cors');\r\n this.app.use(cors.default(this.config.corsOptions));\r\n } catch (error) {\r\n console.warn('CORS not available - install with: npm install cors @types/cors');\r\n }\r\n }\r\n \r\n // Setup database if configured\r\n if (this.config.db) {\r\n this.db = new Database(this.config.db);\r\n }\r\n \r\n // Setup auth if configured\r\n if (this.config.auth) {\r\n this.auth = new AuthService({\r\n secret: this.config.auth.secret,\r\n expiresIn: this.config.auth.expiresIn\r\n });\r\n this.app.use(this.auth.initialize());\r\n }\r\n \r\n // Static files - setup before other routes\r\n const staticPath = path.resolve(process.cwd(), this.config.staticDir!);\r\n if (fs.existsSync(staticPath)) {\r\n this.app.use(express.default.static(staticPath));\r\n }\r\n \r\n // Setup API routes\r\n this.setupApiRoutes();\r\n \r\n // Setup page routes (for SSR)\r\n this.setupPageRoutes();\r\n \r\n // Add error handlers at the end\r\n this.app.use(notFoundHandler);\r\n this.app.use(errorHandler);\r\n\r\n this.initialized = true;\r\n console.log('Server initialized successfully');\r\n \r\n } catch (error: any) {\r\n if (error.code === 'MODULE_NOT_FOUND' && error.message.includes('express')) {\r\n throw new Error('Express not installed. Run: npm install express @types/express');\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n private setupApiRoutes() {\r\n const apiRouter = new ApiRouter(this.config.apiDir!, this.auth);\r\n this.app.use('/api', requestLogger, apiRouter.router);\r\n \r\n // Add API documentation route\r\n this.app.get('/api-docs', (req: any, res: any) => {\r\n const apiDocs = this.generateApiDocs();\r\n res.json(apiDocs);\r\n });\r\n }\r\n\r\n private generateApiDocs() {\r\n // Generate documentation based on API routes\r\n const apiDir = path.resolve(process.cwd(), this.config.apiDir!);\r\n const docs = { endpoints: [] as any[] };\r\n \r\n if (fs.existsSync(apiDir)) {\r\n this.scanApiDirectory(apiDir, '', docs.endpoints);\r\n }\r\n \r\n return docs;\r\n }\r\n \r\n private scanApiDirectory(dirPath: string, routePrefix: string, endpoints: any[]) {\r\n const entries = fs.readdirSync(dirPath, { withFileTypes: true });\r\n \r\n for (const entry of entries) {\r\n const fullPath = path.join(dirPath, entry.name);\r\n \r\n if (entry.isDirectory()) {\r\n this.scanApiDirectory(fullPath, `${routePrefix}/${entry.name}`, endpoints);\r\n } else if (entry.name.endsWith('.js') || entry.name.endsWith('.ts')) {\r\n const routePath = this.getRoutePath(entry.name, routePrefix);\r\n endpoints.push({\r\n path: routePath,\r\n file: path.relative(process.cwd(), fullPath),\r\n methods: this.detectApiMethods(fullPath)\r\n });\r\n }\r\n }\r\n }\r\n \r\n private getRoutePath(filename: string, routePrefix: string): string {\r\n const baseName = path.basename(filename, path.extname(filename));\r\n \r\n if (baseName === 'index') {\r\n return routePrefix || '/';\r\n }\r\n \r\n const paramMatch = baseName.match(/^\\[(.+)\\]$/);\r\n if (paramMatch) {\r\n return `${routePrefix}/:${paramMatch[1]}`;\r\n }\r\n \r\n return `${routePrefix}/${baseName}`;\r\n }\r\n \r\n private detectApiMethods(filePath: string): string[] {\r\n try {\r\n const content = fs.readFileSync(filePath, 'utf8');\r\n const methods = ['get', 'post', 'put', 'delete', 'patch', 'options'];\r\n return methods.filter(method => \r\n new RegExp(`export (async )?function ${method}\\\\s*\\\\(`).test(content) ||\r\n new RegExp(`export const ${method}\\\\s*=`).test(content)\r\n );\r\n } catch (error) {\r\n return [];\r\n }\r\n }\r\n\r\n private setupPageRoutes() {\r\n const pagesPath = path.resolve(process.cwd(), this.config.pagesDir!);\r\n if (!fs.existsSync(pagesPath)) {\r\n return;\r\n }\r\n\r\n // Setup catch-all route for SSR - but only if pages directory exists\r\n this.app.get('*', async (req: { path: string; }, res: { status: (arg0: number) => { (): any; new(): any; send: { (arg0: string): void; new(): any; }; }; }) => {\r\n try {\r\n const { html, statusCode } = await this.renderPage(req.path);\r\n res.status(statusCode || 200).send(html);\r\n } catch (error) {\r\n console.error('Error rendering page:', error);\r\n const errorHtml = templates.generateErrorPage(500, 'Server Error');\r\n res.status(500).send(errorHtml);\r\n }\r\n });\r\n }\r\n\r\n private async renderPage(routePath: string): Promise<{ html: string, statusCode?: number }> {\r\n try {\r\n // Try to find the page component\r\n const pagesDir = this.config.pagesDir ? path.resolve(process.cwd(), this.config.pagesDir) : '';\r\n if (!pagesDir || !fs.existsSync(pagesDir)) {\r\n return { \r\n html: templates.generateErrorPage(404, 'Pages directory not found'), \r\n statusCode: 404 \r\n };\r\n }\r\n \r\n // Normalize the path\r\n let normalizedPath = routePath;\r\n if (!normalizedPath.startsWith('/')) {\r\n normalizedPath = '/' + normalizedPath;\r\n }\r\n \r\n // Default to index for the root\r\n if (normalizedPath === '/') {\r\n normalizedPath = '/index';\r\n }\r\n \r\n // Try to find a matching page file\r\n let pagePath = '';\r\n const possiblePaths = [\r\n path.join(pagesDir, `${normalizedPath}.js`),\r\n path.join(pagesDir, `${normalizedPath}.ts`),\r\n path.join(pagesDir, `${normalizedPath}.jsx`),\r\n path.join(pagesDir, `${normalizedPath}.tsx`),\r\n path.join(pagesDir, `${normalizedPath}/index.js`),\r\n path.join(pagesDir, `${normalizedPath}/index.ts`),\r\n path.join(pagesDir, `${normalizedPath}/index.jsx`),\r\n path.join(pagesDir, `${normalizedPath}/index.tsx`)\r\n ];\r\n \r\n for (const p of possiblePaths) {\r\n if (fs.existsSync(p)) {\r\n pagePath = p;\r\n break;\r\n }\r\n }\r\n \r\n // Handle 404 if page not found\r\n if (!pagePath) {\r\n return { \r\n html: templates.generateErrorPage(404, `Page not found: ${normalizedPath}`), \r\n statusCode: 404 \r\n };\r\n }\r\n \r\n // Import and render the page component\r\n try {\r\n const pageModule = await import(pagePath);\r\n if (!pageModule || !pageModule.default) {\r\n throw new Error(`No default export found in ${pagePath}`);\r\n }\r\n \r\n const PageComponent = pageModule.default;\r\n const initialProps = {\r\n // Provide any initial props here\r\n path: normalizedPath,\r\n query: {}, // Could be parsed from URL\r\n api: { serverTime: new Date().toISOString() }\r\n };\r\n \r\n // Use the fixed renderComponent function\r\n const renderResult = await renderComponent(PageComponent, initialProps);\r\n \r\n if (!renderResult.success) {\r\n return { \r\n html: templates.generateErrorPage(500, 'Failed to render page', renderResult.error instanceof Error ? renderResult.error : new Error('Unknown error')), \r\n statusCode: 500 \r\n };\r\n }\r\n \r\n // Get the HTML string from the render result\r\n const htmlContent = renderResult.html;\r\n \r\n // Generate the full HTML document\r\n let pageTitle = 'My App';\r\n try {\r\n // Try to extract title from component if it has a getTitle method\r\n if (typeof PageComponent.getTitle === 'function') {\r\n pageTitle = PageComponent.getTitle(initialProps);\r\n } else if (PageComponent.title) {\r\n pageTitle = PageComponent.title;\r\n }\r\n } catch (e) {\r\n // Ignore title errors\r\n }\r\n \r\n // Parse the component name for hydration\r\n const componentName = getComponentName(pagePath, pagesDir);\r\n \r\n // Generate full HTML document with our template\r\n const fullHtml = templates.generateDocument(htmlContent, {\r\n title: pageTitle,\r\n // Get description from component if available\r\n description: typeof PageComponent.getDescription === 'function' \r\n ? PageComponent.getDescription(initialProps) \r\n : (PageComponent.description || ''),\r\n // Add scripts for client-side hydration\r\n scripts: ['/client.js'],\r\n // Add any custom meta tags\r\n meta: typeof PageComponent.getMeta === 'function'\r\n ? PageComponent.getMeta(initialProps)\r\n : {},\r\n // Add custom styles\r\n styles: ['/styles.css'],\r\n // Add initial data for client-side hydration\r\n initialData: initialProps,\r\n // Add component information for hydration\r\n componentName: componentName\r\n });\r\n \r\n return { html: fullHtml, statusCode: 200 };\r\n \r\n } catch (error) {\r\n console.error('Error rendering page:', error);\r\n return { \r\n html: templates.generateErrorPage(500, 'Error rendering page', error instanceof Error ? error : new Error('Unknown error')), \r\n statusCode: 500 \r\n };\r\n }\r\n } catch (error) {\r\n console.error('Error finding page:', error);\r\n return { \r\n html: templates.generateErrorPage(500, 'Server error', error instanceof Error ? error : new Error('Unknown error')), \r\n statusCode: 500 \r\n };\r\n }\r\n }\r\n\r\n public getExpressApp(): any {\r\n return this.app;\r\n }\r\n\r\n public getDatabase(): Database | null {\r\n return this.db;\r\n }\r\n\r\n public getAuth(): AuthService | null {\r\n return this.auth;\r\n }\r\n\r\n public async start(): Promise<void> {\r\n // Initialize the app first if not already done\r\n if (!this.initialized) {\r\n await this.initializeApp();\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n if (!this.app) {\r\n reject(new Error('Server not initialized. Express app is missing.'));\r\n return;\r\n }\r\n\r\n this.server = this.app.listen(this.config.port, () => {\r\n console.log(`Server running at http://localhost:${this.config.port}`);\r\n resolve();\r\n });\r\n\r\n this.server!.on('error', (error: any) => {\r\n reject(error);\r\n });\r\n });\r\n }\r\n\r\n public stop(): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n if (!this.server) {\r\n return resolve();\r\n }\r\n \r\n this.server.close((err: any) => {\r\n if (err) return reject(err);\r\n this.server = null;\r\n resolve();\r\n });\r\n });\r\n }\r\n\r\n public restart(): Promise<void> {\r\n return this.stop().then(() => this.start());\r\n }\r\n \r\n public enableSSR(options: { hydratable?: boolean } = {}): void {\r\n if (!fs.existsSync(path.resolve(process.cwd(), this.config.pagesDir!))) {\r\n fs.mkdirSync(path.resolve(process.cwd(), this.config.pagesDir!), { recursive: true });\r\n }\r\n \r\n // Set up client-side JS for hydration if needed\r\n if (options.hydratable) {\r\n const staticDir = path.resolve(process.cwd(), this.config.staticDir!);\r\n if (!fs.existsSync(staticDir)) {\r\n fs.mkdirSync(staticDir, { recursive: true });\r\n }\r\n \r\n // Generate or copy client hydration script\r\n // This is a simplified example - would need more implementation\r\n const clientJsPath = path.join(staticDir, 'client.js');\r\n if (!fs.existsSync(clientJsPath)) {\r\n const clientJsContent = `\r\n // Auto-generated hydration script\r\n import { hydrate } from 'frontend-hamroun';\r\n \r\n // Find SSR content and hydrate it\r\n document.addEventListener('DOMContentLoaded', () => {\r\n const ssrRoots = document.querySelectorAll('[data-ssr-root]');\r\n ssrRoots.forEach(root => {\r\n const componentPath = root.getAttribute('data-component');\r\n if (componentPath) {\r\n import(componentPath).then(module => {\r\n hydrate(module.default, root);\r\n });\r\n }\r\n });\r\n });\r\n `;\r\n fs.writeFileSync(clientJsPath, clientJsContent);\r\n }\r\n }\r\n }\r\n\r\n public registerPlugin(plugin: (server: Server) => void): void {\r\n plugin(this);\r\n }\r\n \r\n public addShutdownHandler(): void {\r\n // Handle graceful shutdown\r\n const gracefulShutdown = async () => {\r\n console.log('Received shutdown signal, closing server...');\r\n try {\r\n await this.stop();\r\n if (this.db) {\r\n await this.db.disconnect();\r\n }\r\n console.log('Server shut down gracefully');\r\n process.exit(0);\r\n } catch (error) {\r\n console.error('Error during shutdown:', error);\r\n process.exit(1);\r\n }\r\n };\r\n \r\n // Listen for termination signals\r\n process.on('SIGTERM', gracefulShutdown);\r\n process.on('SIGINT', gracefulShutdown);\r\n }\r\n}\r\n\r\n// Add server utility functions\r\n\r\n/**\r\n * Creates and configures a new server instance\r\n */\r\nexport function createServer(config: ServerConfig = {}): Server {\r\n return new Server(config);\r\n}\r\n\r\n/**\r\n * Creates a new server with sensible defaults for development\r\n */\r\nexport function createDevServer(options: {\r\n port?: number;\r\n enableCors?: boolean;\r\n} = {}): Server {\r\n return new Server({\r\n port: options.port || 3000,\r\n enableCors: options.enableCors !== false,\r\n apiDir: './src/api',\r\n pagesDir: './src/pages',\r\n staticDir: './public'\r\n });\r\n}\r\n\r\n/**\r\n * Creates a production-ready server with optimized settings\r\n */\r\nexport function createProductionServer(config: ServerConfig): Server {\r\n const server = new Server({\r\n ...config,\r\n // Fix the PORT parsing\r\n port: config.port || (process.env.PORT ? parseInt(process.env.PORT) : 8080)\r\n });\r\n \r\n // Add shutdown handler for production environments\r\n server.addShutdownHandler();\r\n \r\n return server;\r\n}\r\n\r\n// Export additional utility functions\r\nexport function getRequestIp(req: any): string {\r\n return req.ip || \r\n (req.headers['x-forwarded-for'] as string)?.split(',')[0].trim() || \r\n req.socket.remoteAddress || \r\n '';\r\n}\r\n\r\nexport function parseCookies(req: any): Record<string, string> {\r\n const cookies: Record<string, string> = {};\r\n const cookieHeader = req.headers.cookie;\r\n \r\n if (cookieHeader) {\r\n cookieHeader.split(';').forEach((cookie: string) => {\r\n const [name, value] = cookie.split('=').map(c => c.trim());\r\n cookies[name] = value;\r\n });\r\n }\r\n \r\n return cookies;\r\n}\r\n\r\n// Fix the renderComponent function to use frontend-hamroun's renderToString properly\r\nexport const renderComponent = async (Component: any, props: any = {}) => {\r\n try {\r\n // Import frontend-hamroun modules\r\n const { jsx, renderToString } = await import('frontend-hamroun');\r\n \r\n // Create component element using jsx\r\n const element = jsx(Component, props);\r\n \r\n // Use frontend-hamroun's renderToString for proper SSR\r\n const html = renderToString(element);\r\n \r\n return {\r\n html: typeof html === 'string' ? html : String(html),\r\n success: true\r\n };\r\n } catch (error) {\r\n console.error('Error rendering component:', error);\r\n return {\r\n html: `<div class=\"error\">Error rendering component: ${error instanceof Error ? error.message : 'Unknown error'}</div>`,\r\n success: false,\r\n error\r\n };\r\n }\r\n};\r\n\r\n// Export WASM utilities for server-side usage\r\nexport { initNodeWasm, loadGoWasmFromFile } from './wasm.js';\r\n\r\n// Import and export server utilities\r\nexport * from './utils.js';\r\nexport * from './templates.js';\r\n\r\n// Export the Database and AuthService classes\r\nexport { Database } from './database.js';\r\nexport { AuthService } from './auth.js';\r\nexport { ApiRouter } from './api-router.js';\r\nexport { \r\n requestLogger, \r\n errorHandler, \r\n notFoundHandler, \r\n rateLimit \r\n} from './middleware.js';\r\n\r\n// Export renderToString for convenient SSR\r\nexport { renderToString };\r\n\r\n// Ensure the default export includes all required functions\r\nexport default {\r\n Server,\r\n createServer,\r\n createDevServer,\r\n createProductionServer,\r\n rateLimit,\r\n requestLogger,\r\n errorHandler,\r\n notFoundHandler,\r\n loadGoWasmFromFile,\r\n // Template utilities\r\n templates,\r\n // Server utilities\r\n utils,\r\n // Additional exports\r\n renderComponent,\r\n renderToString,\r\n getRequestIp,\r\n parseCookies,\r\n Database,\r\n AuthService,\r\n ApiRouter\r\n};\r\n\r\n", "export interface DbConfig {\r\n url: string;\r\n type: 'mongodb' | 'mysql' | 'postgres';\r\n}\r\n\r\nexport class Database {\r\n private config: DbConfig;\r\n private mongoClient: any = null;\r\n private mongoDb: any = null;\r\n private mysqlPool: any = null;\r\n private pgPool: any = null;\r\n\r\n constructor(config: DbConfig) {\r\n this.config = config;\r\n }\r\n\r\n async connect(): Promise<void> {\r\n switch (this.config.type) {\r\n case 'mongodb':\r\n await this.connectMongo();\r\n break;\r\n case 'mysql':\r\n await this.connectMysql();\r\n break;\r\n case 'postgres':\r\n await this.connectPostgres();\r\n break;\r\n default:\r\n throw new Error(`Unsupported database type: ${this.config.type}`);\r\n }\r\n }\r\n\r\n private async connectMongo(): Promise<void> {\r\n try {\r\n const { MongoClient } = await import('mongodb');\r\n this.mongoClient = new MongoClient(this.config.url);\r\n await this.mongoClient.connect();\r\n this.mongoDb = this.mongoClient.db();\r\n console.log('Connected to MongoDB');\r\n } catch (error: any) {\r\n if (error.code === 'MODULE_NOT_FOUND') {\r\n throw new Error('MongoDB driver not installed. Run: npm install mongodb');\r\n }\r\n console.error('MongoDB connection error:', error);\r\n throw error;\r\n }\r\n }\r\n\r\n private async connectMysql(): Promise<void> {\r\n try {\r\n const mysql = await import('mysql2/promise');\r\n this.mysqlPool = mysql.createPool(this.config.url);\r\n // Test connection\r\n await this.mysqlPool.getConnection();\r\n console.log('Connected to MySQL');\r\n } catch (error: any) {\r\n if (error.code === 'MODULE_NOT_FOUND') {\r\n throw new Error('MySQL driver not installed. Run: npm install mysql2');\r\n }\r\n console.error('MySQL connection error:', error);\r\n throw error;\r\n }\r\n }\r\n\r\n private async connectPostgres(): Promise<void> {\r\n try {\r\n const pg = await import('pg');\r\n this.pgPool = new pg.Pool({ connectionString: this.config.url });\r\n // Test connection\r\n const client = await this.pgPool.connect();\r\n client.release();\r\n console.log('Connected to PostgreSQL');\r\n } catch (error: any) {\r\n if (error.code === 'MODULE_NOT_FOUND') {\r\n throw new Error('PostgreSQL driver not installed. Run: npm install pg @types/pg');\r\n }\r\n console.error('PostgreSQL connection error:', error);\r\n throw error;\r\n }\r\n }\r\n\r\n async disconnect(): Promise<void> {\r\n if (this.mongoClient) {\r\n await this.mongoClient.close();\r\n this.mongoClient = null;\r\n this.mongoDb = null;\r\n }\r\n \r\n if (this.mysqlPool) {\r\n await this.mysqlPool.end();\r\n this.mysqlPool = null;\r\n }\r\n \r\n if (this.pgPool) {\r\n await this.pgPool.end();\r\n this.pgPool = null;\r\n }\r\n }\r\n\r\n // Database-specific methods\r\n getMongoDb(): any {\r\n return this.mongoDb;\r\n }\r\n\r\n getMysqlPool(): any {\r\n return this.mysqlPool;\r\n }\r\n\r\n getPgPool(): any {\r\n return this.pgPool;\r\n }\r\n\r\n // Generic query method\r\n async query(sql: string, values?: any[]): Promise<any> {\r\n switch (this.config.type) {\r\n case 'mongodb':\r\n throw new Error('For MongoDB, use getMongoDb() instead of query()');\r\n case 'mysql':\r\n if (!this.mysqlPool) throw new Error('MySQL not connected');\r\n const [rows] = await this.mysqlPool.execute(sql, values || []);\r\n return rows;\r\n case 'postgres':\r\n if (!this.pgPool) throw new Error('PostgreSQL not connected');\r\n const result = await this.pgPool.query(sql, values || []);\r\n return result.rows;\r\n default:\r\n throw new Error(`Unsupported database type: ${this.config.type}`);\r\n }\r\n }\r\n}\r\n", "\r\n\r\nexport interface AuthConfig {\r\n secret: string;\r\n expiresIn?: string | number;\r\n}\r\n\r\nexport interface User {\r\n id: string | number;\r\n username: string;\r\n password?: string;\r\n email?: string;\r\n roles?: string[];\r\n [key: string]: any;\r\n}\r\n\r\nexport class AuthService {\r\n private config: AuthConfig;\r\n\r\n constructor(config: AuthConfig) {\r\n this.config = {\r\n expiresIn: '24h',\r\n ...config\r\n };\r\n }\r\n\r\n async hashPassword(password: string): Promise<string> {\r\n try {\r\n const bcrypt = await import('bcryptjs');\r\n return bcrypt.hash(password, 10);\r\n } catch (error: any) {\r\n if (error.code === 'MODULE_NOT_FOUND') {\r\n throw new Error('bcryptjs not installed. Run: npm install bcryptjs @types/bcryptjs');\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n async comparePasswords(password: string, hashedPassword: string): Promise<boolean> {\r\n try {\r\n const bcrypt = await import('bcryptjs');\r\n return bcrypt.compare(password, hashedPassword);\r\n } catch (error: any) {\r\n if (error.code === 'MODULE_NOT_FOUND') {\r\n throw new Error('bcryptjs not installed. Run: npm install bcryptjs @types/bcryptjs');\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n generateToken(user: Omit<User, 'password'>): string {\r\n try {\r\n const jwt = require('jsonwebtoken');\r\n const options: any = {};\r\n \r\n if (this.config.expiresIn) {\r\n options.expiresIn = this.config.expiresIn;\r\n }\r\n \r\n return jwt.sign(\r\n { id: user.id, username: user.username, roles: user.roles || [] },\r\n this.config.secret,\r\n options\r\n );\r\n } catch (error: any) {\r\n if (error.code === 'MODULE_NOT_FOUND') {\r\n throw new Error('jsonwebtoken not installed. Run: npm install jsonwebtoken @types/jsonwebtoken');\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n verifyToken(token: string): any {\r\n try {\r\n const jwt = require('jsonwebtoken');\r\n return jwt.verify(token, this.config.secret);\r\n } catch (error: any) {\r\n if (error.code === 'MODULE_NOT_FOUND') {\r\n throw new Error('jsonwebtoken not installed. Run: npm install jsonwebtoken @types/jsonwebtoken');\r\n }\r\n return null;\r\n }\r\n }\r\n\r\n // Express middleware for authentication\r\n initialize() {\r\n return (req: any, res: any, next: any) => {\r\n const token = this.extractToken(req);\r\n if (token) {\r\n const decoded = this.verifyToken(token);\r\n if (decoded) {\r\n req.user = decoded;\r\n }\r\n }\r\n next();\r\n };\r\n }\r\n\r\n // Express middleware for requiring authentication\r\n requireAuth() {\r\n return (req: any, res: any, next: any) => {\r\n if (!req.user) {\r\n return res.status(401).json({ message: 'Unauthorized' });\r\n }\r\n return next();\r\n };\r\n }\r\n\r\n // Express middleware for requiring specific roles\r\n requireRoles(roles: string[]) {\r\n return (req: any, res: any, next: any) => {\r\n if (!req.user) {\r\n return res.status(401).json({ message: 'Unauthorized' });\r\n }\r\n \r\n const userRoles = req.user.roles || [];\r\n const hasRequiredRole = roles.some(role => userRoles.includes(role));\r\n \r\n if (!hasRequiredRole) {\r\n return res.status(403).json({ message: 'Forbidden' });\r\n }\r\n \r\n return next();\r\n };\r\n }\r\n\r\n private extractToken(req: any): string | null {\r\n if (req.headers.authorization && req.headers.authorization.startsWith('Bearer ')) {\r\n return req.headers.authorization.substring(7);\r\n }\r\n return null;\r\n }\r\n}\r\n", "import path from 'path';\r\nimport fs from 'fs';\r\nimport { AuthService } from './auth.js';\r\nimport { pathToFileURL } from 'url';\r\n\r\ninterface RouteHandler {\r\n (req: any, res: any, next?: any): void | Promise<void>;\r\n}\r\n\r\ninterface RouteModule {\r\n get?: RouteHandler;\r\n post?: RouteHandler;\r\n put?: RouteHandler;\r\n delete?: RouteHandler;\r\n patch?: RouteHandler;\r\n options?: RouteHandler;\r\n middleware?: ((req: any, res: any, next: any) => void)[];\r\n // Add index signature to allow string indexing\r\n [key: string]: RouteHandler | ((req: any, res: any, next: any) => void)[] | undefined;\r\n}\r\n\r\nexport class ApiRouter {\r\n public router: any;\r\n private apiDir: string;\r\n private auth: AuthService | null;\r\n\r\n constructor(apiDir: string, auth: AuthService | null = null) {\r\n this.router = null;\r\n this.apiDir = path.resolve(process.cwd(), apiDir);\r\n this.auth = auth;\r\n \r\n this.initializeRouter();\r\n }\r\n\r\n private async initializeRouter() {\r\n try {\r\n const express = await import('express');\r\n this.router = express.default.Router();\r\n this.setupRoutes();\r\n } catch (error: any) {\r\n if (error.code === 'MODULE_NOT_FOUND') {\r\n throw new Error('Express not installed. Run: npm install express @types/express');\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n private setupRoutes() {\r\n if (!fs.existsSync(this.apiDir)) {\r\n console.log(`API directory not found: ${this.apiDir}`);\r\n return;\r\n }\r\n\r\n this.scanDirectory(this.apiDir, '');\r\n }\r\n\r\n private scanDirectory(dirPath: string, routePrefix: string) {\r\n const entries = fs.readdirSync(dirPath, { withFileTypes: true });\r\n\r\n for (const entry of entries) {\r\n const fullPath = path.join(dirPath, entry.name);\r\n \r\n if (entry.isDirectory()) {\r\n // Recursively scan subdirectories\r\n this.scanDirectory(fullPath, `${routePrefix}/${entry.name}`);\r\n } else if (this.isRouteFile(entry.name)) {\r\n // Process route file\r\n const routePath = this.getRoutePath(entry.name, routePrefix);\r\n this.registerRoute(fullPath, routePath);\r\n }\r\n }\r\n }\r\n\r\n private isRouteFile(filename: string): boolean {\r\n return filename.endsWith('.js') || \r\n filename.endsWith('.ts') || \r\n filename.endsWith('.mjs');\r\n }\r\n\r\n private getRoutePath(filename: string, routePrefix: string): string {\r\n // Remove extension and handle special names\r\n const baseName = path.basename(filename, path.extname(filename));\r\n \r\n if (baseName === 'index') {\r\n return routePrefix || '/';\r\n }\r\n \r\n // Handle dynamic routes [param]\r\n const paramMatch = baseName.match(/^\\[(.+)\\]$/);\r\n if (paramMatch) {\r\n return `${routePrefix}/:${paramMatch[1]}`;\r\n }\r\n \r\n return `${routePrefix}/${baseName}`;\r\n }\r\n\r\n private async registerRoute(filePath: string, routePath: string) {\r\n try {\r\n // Ensure we have an absolute path and normalize it\r\n const absolutePath = path.isAbsolute(filePath) ? filePath : path.resolve(filePath);\r\n \r\n // Convert to proper file:// URL for Windows\r\n const fileUrl = pathToFileURL(absolutePath).href;\r\n \r\n if (process.platform === 'win32') {\r\n // Add timestamp to force reload on Windows\r\n const urlWithTimestamp = `${fileUrl}?t=${Date.now()}`;\r\n \r\n // Dynamic import the route file\r\n const routeModule = await import(urlWithTimestamp);\r\n \r\n if (!this.isValidRouteModule(routeModule)) {\r\n console.warn(`Invalid route module: ${filePath}`);\r\n return;\r\n }\r\n \r\n console.log(`Registering API route: ${routePath}`);\r\n \r\n // Register middleware if any\r\n const middleware = routeModule.middleware || [];\r\n \r\n // Register HTTP methods\r\n for (const method of ['get', 'post', 'put', 'delete', 'patch', 'options']) {\r\n const handler = routeModule[method];\r\n if (typeof handler === 'function') {\r\n const routerMethod = this.router[method];\r\n routerMethod.call(\r\n this.router,\r\n routePath, \r\n ...middleware,\r\n this.wrapHandler(handler)\r\n );\r\n }\r\n }\r\n } else {\r\n // Non-Windows platforms\r\n const routeModule = await import(fileUrl);\r\n \r\n if (!this.isValidRouteModule(routeModule)) {\r\n console.warn(`Invalid route module: ${filePath}`);\r\n return;\r\n }\r\n \r\n console.log(`Registering API route: ${routePath}`);\r\n \r\n // Register middleware if any\r\n const middleware = routeModule.middleware || [];\r\n \r\n // Register HTTP methods\r\n for (const method of ['get', 'post', 'put', 'delete', 'patch', 'options']) {\r\n const handler = routeModule[method];\r\n if (typeof handler === 'function') {\r\n const routerMethod = this.router[method];\r\n routerMethod.call(\r\n this.router,\r\n routePath, \r\n ...middleware,\r\n this.wrapHandler(handler)\r\n );\r\n }\r\n }\r\n }\r\n } catch (error) {\r\n console.error(`Error registering route (${filePath}):`, error);\r\n }\r\n }\r\n\r\n private isValidRouteModule(module: any): module is RouteModule {\r\n if (!module) return false;\r\n \r\n // Check if at least one HTTP method handler is defined\r\n return ['get', 'post', 'put', 'delete', 'patch', 'options']\r\n .some(method => typeof module[method] === 'function');\r\n }\r\n\r\n private wrapHandler(handler: RouteHandler) {\r\n return async (req: any, res: any, next: any) => {\r\n try {\r\n await handler(req, res, next);\r\n } catch (error) {\r\n next(error);\r\n }\r\n };\r\n }\r\n}\r\n", "import { Request, Response, NextFunction } from 'express';\r\n\r\nexport interface MiddlewareFunction {\r\n (req: any, res: any, next: any): void | Promise<void>;\r\n}\r\n\r\n// Common middleware functions\r\nexport const requestLogger: MiddlewareFunction = (req, res, next) => {\r\n console.log(`${new Date().toISOString()} - ${req.method} ${req.url}`);\r\n next();\r\n};\r\n\r\nexport const errorHandler = (\r\n err: Error, \r\n req: any, \r\n res: any, \r\n next: any\r\n) => {\r\n console.error(err.stack);\r\n res.status(500).json({\r\n error: {\r\n message: 'Internal Server Error',\r\n ...(process.env.NODE_ENV !== 'production' ? { details: err.message, stack: err.stack } : {})\r\n }\r\n });\r\n};\r\n\r\nexport const notFoundHandler = (req: any, res: any) => {\r\n res.status(404).json({\r\n error: {\r\n message: `Not Found - ${req.method} ${req.url}`\r\n }\r\n });\r\n};\r\n\r\n// Middleware for rate limiting\r\nexport function rateLimit(options: { windowMs: number; max: number }) {\r\n const requests = new Map<string, number[]>();\r\n \r\n return (req: any, res: any, next: any) => {\r\n const ip = req.ip || req.socket.remoteAddress || 'unknown';\r\n const now = Date.now();\r\n \r\n // Get existing requests and filter out old ones\r\n const reqTimes = (requests.get(ip) || [])\r\n .filter(time => now - time < options.windowMs);\r\n \r\n // Add current request\r\n reqTimes.push(now);\r\n requests.set(ip, reqTimes);\r\n \r\n // Check if too many requests\r\n if (reqTimes.length > options.max) {\r\n return res.status(429).json({\r\n error: {\r\n message: 'Too Many Requests',\r\n retryAfter: Math.ceil(options.windowMs / 1000)\r\n }\r\n });\r\n }\r\n \r\n return next();\r\n };\r\n}\r\n", "import crypto from 'crypto';\r\nimport fs from 'fs/promises';\r\nimport path from 'path';\r\n\r\n/**\r\n * Utility functions for server-side operations\r\n */\r\n\r\n/**\r\n * Safely parse JSON with error handling\r\n */\r\nexport function safeJsonParse<T>(json: string, fallback: T): T {\r\n try {\r\n return JSON.parse(json) as T;\r\n } catch (error) {\r\n return fallback;\r\n }\r\n}\r\n\r\n/**\r\n * Generate a secure random token\r\n */\r\nexport function generateToken(length: number = 32): string {\r\n return crypto.randomBytes(length).toString('hex');\r\n}\r\n\r\n/**\r\n * Hash a string using SHA-256\r\n */\r\nexport function hashString(input: string, salt: string = ''): string {\r\n return crypto.createHash('sha256').update(input + salt).digest('hex');\r\n}\r\n\r\n/**\r\n * Get pagination parameters from request\r\n */\r\nexport function getPagination(req: any): { page: number; limit: number; skip: number } {\r\n const page = Math.max(1, parseInt(req.query.page as string) || 1);\r\n const rawLimit = parseInt(req.query.limit as string);\r\n \r\n // If no limit is provided or limit is 0/invalid, use default of 20\r\n // If limit is provided and valid, enforce min of 1 and max of 100\r\n let limit: number;\r\n if (isNaN(rawLimit) || rawLimit <= 0) {\r\n limit = 20; // Default limit\r\n } else {\r\n limit = Math.max(1, Math.min(100, rawLimit));\r\n }\r\n \r\n const skip = (page - 1) * limit;\r\n \r\n return { page, limit, skip };\r\n}\r\n\r\n/**\r\n * Standard success response format\r\n */\r\nexport function sendSuccess<T>(res: any, data: T, message: string = 'Success'): any {\r\n return res.json({\r\n success: true,\r\n message,\r\n data\r\n });\r\n}\r\n\r\n/**\r\n * Standard error response format\r\n */\r\nexport function sendError(\r\n res: any, \r\n message: string = 'An error occurred', \r\n statusCode: number = 400,\r\n errors?: any\r\n): any {\r\n return res.status(statusCode).json({\r\n success: false,\r\n message,\r\n errors: errors || undefined\r\n });\r\n}\r\n\r\n/**\r\n * Validate required fields in request body\r\n */\r\nexport function validateFields(\r\n req: any, \r\n requiredFields: string[]\r\n): { valid: boolean; missing: string[] } {\r\n const missing = requiredFields.filter(field => {\r\n const value = req.body[field];\r\n return value === undefined || value === null || value === '';\r\n });\r\n \r\n return {\r\n valid: missing.length === 0,\r\n missing\r\n };\r\n}\r\n\r\n/**\r\n * Handle file upload validation\r\n */\r\nexport function validateFileUpload(\r\n file: any, // Using 'any' to avoid the Express.Multer dependency\r\n options: {\r\n maxSize?: number;\r\n allowedTypes?: string[];\r\n } = {}\r\n): { valid: boolean; error?: string } {\r\n if (!file) {\r\n return { valid: false, error: 'No file provided' };\r\n }\r\n \r\n // Check file size\r\n if (options.maxSize && file.size > options.maxSize) {\r\n return { \r\n valid: false, \r\n error: `File too large. Maximum size allowed is ${options.maxSize / 1024 / 1024}MB` \r\n };\r\n }\r\n \r\n // Check file type\r\n if (options.allowedTypes && options.allowedTypes.length > 0) {\r\n const fileType = file.mimetype;\r\n if (!options.allowedTypes.includes(fileType)) {\r\n return { \r\n valid: false, \r\n error: `Invalid file type. Allowed types: ${options.allowedTypes.join(', ')}` \r\n };\r\n }\r\n }\r\n \r\n return { valid: true };\r\n}\r\n\r\n/**\r\n * Get server environment information\r\n */\r\nexport function getEnvironmentInfo(): Record<string, any> {\r\n return {\r\n nodeVersion: process.version,\r\n platform: process.platform,\r\n arch: process.arch,\r\n memory: process.memoryUsage(),\r\n uptime: process.uptime(),\r\n env: process.env.NODE_ENV || 'development'\r\n };\r\n}\r\n\r\n/**\r\n * Check if a directory is empty\r\n */\r\nexport async function isDirectoryEmpty(dirPath: string): Promise<boolean> {\r\n try {\r\n const files = await fs.readdir(dirPath);\r\n return files.length === 0;\r\n } catch (error) {\r\n // Directory doesn't exist or can't be read\r\n return true;\r\n }\r\n}\r\n\r\n/**\r\n * Create directory if it doesn't exist\r\n */\r\nexport async function ensureDirectory(dirPath: string): Promise<void> {\r\n try {\r\n await fs.access(dirPath);\r\n } catch (error) {\r\n // Directory doesn't exist, create it\r\n await fs.mkdir(dirPath, { recursive: true });\r\n }\r\n}\r\n\r\n/**\r\n * Write JSON to file\r\n */\r\nexport async function writeJsonFile(filePath: string, data: any): Promise<void> {\r\n await ensureDirectory(path.dirname(filePath));\r\n await fs.writeFile(filePath, JSON.stringify(data, null, 2), 'utf8');\r\n}\r\n\r\n/**\r\n * Read JSON from file\r\n */\r\nexport async function readJsonFile<T>(filePath: string, defaultValue: T): Promise<T> {\r\n try {\r\n const data = await fs.readFile(filePath, 'utf8');\r\n return safeJsonParse<T>(data, defaultValue);\r\n } catch (error) {\r\n return defaultValue;\r\n }\r\n}\r\n", "/**\r\n * HTML template generators for server-side rendering\r\n */\r\n\r\nexport interface DocumentOptions {\r\n title?: string;\r\n description?: string;\r\n lang?: string;\r\n charset?: string;\r\n viewport?: string;\r\n scripts?: string[];\r\n styles?: string[];\r\n meta?: Record<string, string>;\r\n bodyClasses?: string;\r\n htmlAttrs?: Record<string, string>;\r\n bodyAttrs?: Record<string, string>;\r\n initialData?: any;\r\n componentName?: string;\r\n}\r\n\r\n/**\r\n * Generate a complete HTML document\r\n */\r\nexport function generateDocument(\r\n content: string, \r\n options: DocumentOptions = {}\r\n): string {\r\n const {\r\n title = 'Frontend Hamroun App',\r\n description = '',\r\n lang = 'en',\r\n charset = 'UTF-8',\r\n viewport = 'width=device-width, initial-scale=1.0',\r\n scripts = [],\r\n styles = [],\r\n meta = {},\r\n bodyClasses = '',\r\n htmlAttrs = {},\r\n bodyAttrs = {},\r\n initialData = {},\r\n componentName = ''\r\n } = options;\r\n \r\n // Generate HTML attributes\r\n const htmlAttributes = Object.entries(htmlAttrs)\r\n .map(([key, value]) => `${key}=\"${escapeHtml(value)}\"`)\r\n .join(' ');\r\n \r\n // Generate body attributes\r\n const bodyAttributes = Object.entries(bodyAttrs)\r\n .map(([key, value]) => `${key}=\"${escapeHtml(value)}\"`)\r\n .join(' ');\r\n \r\n // Generate meta tags\r\n const metaTags = [\r\n `<meta charset=\"${charset}\">`,\r\n `<meta name=\"viewport\" content=\"${viewport}\">`,\r\n description ? `<meta name=\"description\" content=\"${escapeHtml(description)}\">` : ''\r\n ];\r\n \r\n // Add custom meta tags\r\n Object.entries(meta).forEach(([name, content]) => {\r\n metaTags.push(`<meta name=\"${escapeHtml(name)}\" content=\"${escapeHtml(content)}\">`);\r\n });\r\n \r\n // Generate script tags\r\n const scriptTags = scripts.map(src => {\r\n if (src.startsWith('<script')) {\r\n return src; // Allow inline scripts\r\n }\r\n return `<script src=\"${escapeHtml(src)}\" ${src.endsWith('.js') ? 'type=\"module\"' : ''} defer></script>`;\r\n });\r\n \r\n // Generate style tags\r\n const styleTags = styles.map(href => {\r\n if (href.startsWith('<style')) {\r\n return href; // Allow inline styles\r\n }\r\n return `<link rel=\"stylesheet\" href=\"${escapeHtml(href)}\">`;\r\n });\r\n \r\n // Create initial data script\r\n const initialDataScript = Object.keys(initialData).length > 0 ? \r\n `<script id=\"__APP_DATA__\" type=\"application/json\">${escapeHtml(JSON.stringify(initialData))}</script>` : '';\r\n \r\n // Create the complete HTML document\r\n return `<!DOCTYPE html>\r\n<html lang=\"${lang}\" ${htmlAttributes}>\r\n<head>\r\n ${metaTags.filter(Boolean).join('\\n ')}\r\n <title>${escapeHtml(title)}</title>\r\n ${styleTags.join('\\n ')}\r\n</head>\r\n<body class=\"${bodyClasses}\" ${bodyAttributes}>\r\n <div id=\"app-root\" data-ssr-root${componentName ? ` data-component=\"${escapeHtml(componentName)}\"` : ''}>${content}</div>\r\n ${initialDataScript}\r\n ${scriptTags.join('\\n ')}\r\n</body>\r\n</html>`;\r\n}\r\n\r\n/**\r\n * Generate an error page\r\n */\r\nexport function generateErrorPage(\r\n statusCode: number, \r\n message: string, \r\n error?: Error\r\n): string {\r\n const errorMessages: Record<number, string> = {\r\n 400: 'Bad Request',\r\n 401: 'Unauthorized',\r\n 403: 'Forbidden',\r\n 404: 'Not Found',\r\n 500: 'Internal Server Error'\r\n };\r\n \r\n const title = `${statusCode} - ${errorMessages[statusCode] || 'Error'}`;\r\n \r\n // Generate error details (only in development)\r\n const isDev = process.env.NODE_ENV !== 'production';\r\n const errorDetails = isDev && error ? `\r\n <div class=\"error-details\">\r\n <pre>${escapeHtml(error.stack || error.message)}</pre>\r\n </div>\r\n ` : '';\r\n \r\n // Create error content\r\n const content = `\r\n <div class=\"error-container\">\r\n <h1>${statusCode}</h1>\r\n <h2>${escapeHtml(errorMessages[statusCode] || 'Error')}</h2>\r\n <p>${escapeHtml(message)}</p>\r\n ${errorDetails}\r\n <a href=\"/\" class=\"home-link\">Back to Home</a>\r\n </div>\r\n `;\r\n \r\n // Add error page styling\r\n const styles = [`<style>\r\n body {\r\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n min-height: 100vh;\r\n margin: 0;\r\n background-color: #f7f7f7;\r\n color: #333;\r\n }\r\n .error-container {\r\n text-align: center;\r\n padding: 2rem;\r\n border-radius: 8px;\r\n background-color: white;\r\n box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);\r\n max-width: 600px;\r\n width: 100%;\r\n }\r\n h1 {\r\n font-size: 6rem;\r\n margin: 0;\r\n color: #e74c3c;\r\n }\r\n h2 {\r\n margin-top: 0;\r\n margin-bottom: 1rem;\r\n color: #333;\r\n }\r\n .error-details {\r\n text-align: left;\r\n margin: 2rem 0;\r\n padding: 1rem;\r\n background-color: #f8f8f8;\r\n border-radius: 4px;\r\n overflow: auto;\r\n }\r\n pre {\r\n margin: 0;\r\n font-family: monospace;\r\n font-size: 0.85rem;\r\n white-space: pre-wrap;\r\n }\r\n .home-link {\r\n display: inline-block;\r\n margin-top: 1.5rem;\r\n padding: 0.75rem 1.5rem;\r\n background-color: #3498db;\r\n color: white;\r\n text-decoration: none;\r\n border-radius: 4px;\r\n transition: background-color 0.2s;\r\n }\r\n .home-link:hover {\r\n background-color: #2980b9;\r\n }\r\n </style>`];\r\n \r\n return generateDocument(content, {\r\n title,\r\n description: `Error ${statusCode}: ${errorMessages[statusCode] || 'Error'}`,\r\n bodyClasses: 'error-page',\r\n styles\r\n });\r\n}\r\n\r\n/**\r\n * Generate a loading page\r\n */\r\nexport function generateLoadingPage(message: string = 'Loading...'): string {\r\n const content = `\r\n <div class=\"loading-container\">\r\n <div class=\"spinner\"></div>\r\n <p>${escapeHtml(message)}</p>\r\n </div>\r\n `;\r\n \r\n const styles = [`<style>\r\n body {\r\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n min-height: 100vh;\r\n margin: 0;\r\n background-color: #f7f7f7;\r\n color: #333;\r\n }\r\n .loading-container {\r\n text-align: center;\r\n }\r\n .spinner {\r\n width: 50px;\r\n height: 50px;\r\n border: 5px solid rgba(0, 0, 0, 0.1);\r\n border-radius: 50%;\r\n border-top-color: #3498db;\r\n animation: spin 1s ease-in-out infinite;\r\n margin: 0 auto 20px;\r\n }\r\n @keyframes spin {\r\n to { transform: rotate(360deg); }\r\n }\r\n </style>`];\r\n \r\n return generateDocument(content, {\r\n title: 'Loading',\r\n bodyClasses: 'loading-page',\r\n styles\r\n });\r\n}\r\n\r\n/**\r\n * Escape HTML special characters\r\n */\r\nfunction escapeHtml(text: string): string {\r\n return String(text)\r\n .replace(/&/g, '&amp;')\r\n .replace(/</g, '&lt;')\r\n .replace(/>/g, '&gt;')\r\n .replace(/\"/g, '&quot;')\r\n .replace(/'/g, '&#039;');\r\n}\r\n", "/**\r\n * Server-side Go WASM integration for Node.js\r\n * Uses the standard Go WASM runtime (wasm_exec.js)\r\n */\r\nimport fs from 'fs/promises';\r\nimport path from 'path';\r\nimport { pathToFileURL } from 'url';\r\nimport { GoWasmInstance, GoWasmOptions } from '../server/types.js';\r\n\r\n// Global flag to ensure we only initialize WASM once\r\nlet initialized = false;\r\n\r\n/**\r\n * Initialize the Node.js environment for running Go WASM modules\r\n */\r\nexport async function initNodeWasm(): Promise<void> {\r\n if (initialized) return;\r\n \r\n try {\r\n // Global WASM environment setup for Node.js\r\n globalThis.TextEncoder = globalThis.TextEncoder || TextEncoder;\r\n globalThis.TextDecoder = globalThis.TextDecoder || TextDecoder;\r\n \r\n // Mark as initialized\r\n initialized = true;\r\n } catch (error) {\r\n console.error('[WASM] Failed to initialize Node.js WASM environment:', error);\r\n throw error;\r\n }\r\n}\r\n\r\n/**\r\n * Load Go WASM runtime from wasm_exec.js file\r\n */\r\nasync function loadGoRuntime(goWasmPath?: string): Promise<any> {\r\n if (typeof global.Go === 'function') {\r\n return global.Go;\r\n }\r\n\r\n // Try to find wasm_exec.js or wasm_exec.cjs\r\n const possiblePaths = [\r\n goWasmPath,\r\n './wasm_exec.cjs',\r\n './wasm_exec.js',\r\n './public/wasm_exec.cjs',\r\n './public/wasm_exec.js',\r\n './src/wasm_exec.cjs',\r\n './src/wasm_exec.js',\r\n path.join(process.cwd(), 'wasm_exec.cjs'),\r\n path.join(process.cwd(), 'wasm_exec.js'),\r\n path.join(process.cwd(), 'public', 'wasm_exec.cjs'),\r\n path.join(process.cwd(), 'public', 'wasm_exec.js'),\r\n path.join(process.cwd(), 'src', 'wasm_exec.cjs'),\r\n path.join(process.cwd(), 'src', 'wasm_exec.js')\r\n ].filter(Boolean);\r\n\r\n for (const wasmExecPath of possiblePaths) {\r\n try {\r\n const resolvedPath = path.resolve(wasmExecPath!);\r\n \r\n // Check if file exists using fs.stat instead of fs.access\r\n try {\r\n const stats = await fs.stat(resolvedPath);\r\n if (!stats.isFile()) {\r\n continue;\r\n }\r\n } catch (statError) {\r\n continue; // File doesn't exist, try next path\r\n }\r\n \r\n // Load the Go runtime using dynamic import with file:// URL\r\n const wasmExecUrl = pathToFileURL(resolvedPath).href;\r\n \r\n // Clear global.Go to ensure fresh import\r\n if (global.Go) {\r\n delete (global as any).Go;\r\n }\r\n \r\n // Import the module\r\n await import(wasmExecUrl);\r\n \r\n if (typeof global.Go === 'function') {\r\n console.log(`[WASM] Loaded Go runtime from: ${resolvedPath}`);\r\n return global.Go;\r\n } else {\r\n console.warn(`[WASM] File found but Go class not exported: ${resolvedPath}`);\r\n }\r\n } catch (error: any) {\r\n console.warn(`[WASM] Error loading from ${wasmExecPath}:`, error.message);\r\n continue;\r\n }\r\n }\r\n\r\n throw new Error(\r\n '[WASM] Could not find wasm_exec.js. Please ensure you have the Go WASM runtime file available.\\n' +\r\n 'You can get it from: https://github.com/golang/go/blob/master/misc/wasm/wasm_exec.js\\n' +\r\n `Searched paths: ${possiblePaths.join(', ')}`\r\n );\r\n}\r\n\r\n/**\r\n * Load a Go WASM module from a file path for server-side usage\r\n */\r\nexport async function loadGoWasmFromFile(\r\n wasmFilePath: string,\r\n options: GoWasmOptions = {}\r\n): Promise<GoWasmInstance> {\r\n try {\r\n // Initialize Node.js WASM environment\r\n await initNodeWasm();\r\n \r\n if (options.debug) {\r\n console.log('[WASM] Loading WASM from file:', wasmFilePath);\r\n }\r\n\r\n // Load the standard Go runtime\r\n const GoRuntime = await loadGoRuntime(options.goWasmPath);\r\n const go = new GoRuntime();\r\n \r\n // Load WASM binary\r\n const wasmBuffer = await fs.readFile(wasmFilePath);\r\n const wasmModule = await WebAssembly.compile(wasmBuffer);\r\n \r\n // The updated wasm_exec.js provides imports under 'gojs' instead of 'go'\r\n // Create imports object with the correct structure\r\n const baseImports = go.importObject;\r\n const finalImportObject = {\r\n ...baseImports,\r\n ...options.importObject\r\n };\r\n \r\n if (options.debug) {\r\n console.log('[WASM] Available import modules:', Object.keys(finalImportObject));\r\n \r\n // Debug each module's functions\r\n for (const [moduleName, moduleExports] of Object.entries(finalImportObject)) {\r\n if (typeof moduleExports === 'object' && moduleExports !== null) {\r\n const exportNames = Object.keys(moduleExports);\r\n console.log(`[WASM] ${moduleName} import functions:`, exportNames);\r\n }\r\n }\r\n }\r\n \r\n // Instantiate the WASM module\r\n const instance = await WebAssembly.instantiate(wasmModule, finalImportObject);\r\n \r\n if (options.debug) {\r\n console.log('[WASM] WASM instance created, starting Go runtime...');\r\n }\r\n \r\n // Initialize Go runtime - this will run the main function\r\n // The go.run() method returns a promise that resolves when the program exits\r\n const runPromise = go.run(instance);\r\n \r\n if (options.debug) {\r\n console.log('[WASM] Go runtime started, waiting for initialization...');\r\n }\r\n \r\n // Give Go runtime time to initialize and register functions\r\n // Don't wait for the program to finish, just wait for functions to be registered\r\n await new Promise(resolve => setTimeout(resolve, 2000));\r\n \r\n if (options.debug) {\r\n console.log('[WASM] Scanning global object for Go functions...');\r\n }\r\n \r\n // Extract exported functions from global scope\r\n const functions: Record<string, Function> = {};\r\n const globalObj = global as any;\r\n \r\n // Scan for Go functions\r\n const allKeys = Object.getOwnPropertyNames(globalObj);\r\n const goKeys = allKeys.filter(key => key.startsWith('go'));\r\n \r\n if (options.debug) {\r\n console.log('[WASM] All keys starting with \"go\":', goKeys);\r\n }\r\n \r\n for (const key of goKeys) {\r\n if (typeof globalObj[key] === 'function') {\r\n functions[key] = globalObj[key];\r\n if (options.debug) {\r\n console.log(`[WASM] Found function: ${key}`);\r\n }\r\n }\r\n }\r\n\r\n const wasmInstance: GoWasmInstance = {\r\n instance,\r\n module: wasmModule,\r\n exports: instance.exports,\r\n functions\r\n };\r\n \r\n // Run onLoad callback if provided\r\n if (options.onLoad) {\r\n options.onLoad(wasmInstance);\r\n }\r\n \r\n if (options.debug) {\r\n console.log(`[WASM] Module loaded successfully with ${Object.keys(functions).length} functions`);\r\n console.log('[WASM] Final function list:', Object.keys(functions));\r\n }\r\n \r\n // Don't await the runPromise - let the Go program finish in the background\r\n // The functions are already registered and available\r\n runPromise.catch((error:any)=> {\r\n if (options.debug) {\r\n console.log('[WASM] Go program finished with error:', error);\r\n }\r\n });\r\n \r\n return wasmInstance;\r\n } catch (error) {\r\n console.error('[WASM] Failed to load Go WASM module:', error);\r\n throw error;\r\n }\r\n}\r\n\r\n/**\r\n * Call a Go WASM function in Node.js environment\r\n */\r\nexport function callWasmFunction(funcName: string, ...args: any[]): any {\r\n const func = (global as any)[funcName];\r\n if (typeof func !== 'function') {\r\n throw new Error(`Function ${funcName} not found. Make sure the WASM module is loaded.`);\r\n }\r\n \r\n return func(...args);\r\n}\r\n\r\n/**\r\n * Check if Go WASM is ready in Node.js\r\n */\r\nexport function isWasmReady(): boolean {\r\n const globalObj = global as any;\r\n return Object.keys(globalObj).some(key => \r\n key.startsWith('go') && typeof globalObj[key] === 'function'\r\n );\r\n}\r\n\r\n/**\r\n * Get all available Go WASM functions in Node.js\r\n */\r\nexport function getWasmFunctions(): string[] {\r\n const globalObj = global as any;\r\n return Object.keys(globalObj).filter(key => \r\n key.startsWith('go') && typeof globalObj[key] === 'function'\r\n );\r\n}\r\n\r\n// Extend global for Go runtime\r\ndeclare global {\r\n var Go: new () => {\r\n importObject: any;\r\n run: (instance: WebAssembly.Instance) => Promise<void>;\r\n };\r\n}\r\n\r\nexport type { GoWasmInstance, GoWasmOptions };\r\n"],
5
- "mappings": ";;;;;;;;;;;;;;AAAA,OAAOA,WAAU;AAEjB,OAAOC,SAAQ;AACf,SAAS,sBAAsB;;;ACExB,IAAM,WAAN,MAAe;AAAA,EAOpB,YAAY,QAAkB;AAL9B,SAAQ,cAAmB;AAC3B,SAAQ,UAAe;AACvB,SAAQ,YAAiB;AACzB,SAAQ,SAAc;AAGpB,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,MAAM,UAAyB;AAC7B,YAAQ,KAAK,OAAO,MAAM;AAAA,MACxB,KAAK;AACH,cAAM,KAAK,aAAa;AACxB;AAAA,MACF,KAAK;AACH,cAAM,KAAK,aAAa;AACxB;AAAA,MACF,KAAK;AACH,cAAM,KAAK,gBAAgB;AAC3B;AAAA,MACF;AACE,cAAM,IAAI,MAAM,8BAA8B,KAAK,OAAO,IAAI,EAAE;AAAA,IACpE;AAAA,EACF;AAAA,EAEA,MAAc,eAA8B;AAC1C,QAAI;AACF,YAAM,EAAE,YAAY,IAAI,MAAM,OAAO,SAAS;AAC9C,WAAK,cAAc,IAAI,YAAY,KAAK,OAAO,GAAG;AAClD,YAAM,KAAK,YAAY,QAAQ;AAC/B,WAAK,UAAU,KAAK,YAAY,GAAG;AACnC,cAAQ,IAAI,sBAAsB;AAAA,IACpC,SAAS,OAAY;AACnB,UAAI,MAAM,SAAS,oBAAoB;AACrC,cAAM,IAAI,MAAM,wDAAwD;AAAA,MAC1E;AACA,cAAQ,MAAM,6BAA6B,KAAK;AAChD,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAc,eAA8B;AAC1C,QAAI;AACF,YAAM,QAAQ,MAAM,OAAO,gBAAgB;AAC3C,WAAK,YAAY,MAAM,WAAW,KAAK,OAAO,GAAG;AAEjD,YAAM,KAAK,UAAU,cAAc;AACnC,cAAQ,IAAI,oBAAoB;AAAA,IAClC,SAAS,OAAY;AACnB,UAAI,MAAM,SAAS,oBAAoB;AACrC,cAAM,IAAI,MAAM,qDAAqD;AAAA,MACvE;AACA,cAAQ,MAAM,2BAA2B,KAAK;AAC9C,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAc,kBAAiC;AAC7C,QAAI;AACF,YAAM,KAAK,MAAM,OAAO,IAAI;AAC5B,WAAK,SAAS,IAAI,GAAG,KAAK,EAAE,kBAAkB,KAAK,OAAO,IAAI,CAAC;AAE/D,YAAM,SAAS,MAAM,KAAK,OAAO,QAAQ;AACzC,aAAO,QAAQ;AACf,cAAQ,IAAI,yBAAyB;AAAA,IACvC,SAAS,OAAY;AACnB,UAAI,MAAM,SAAS,oBAAoB;AACrC,cAAM,IAAI,MAAM,gEAAgE;AAAA,MAClF;AACA,cAAQ,MAAM,gCAAgC,KAAK;AACnD,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAM,aAA4B;AAChC,QAAI,KAAK,aAAa;AACpB,YAAM,KAAK,YAAY,MAAM;AAC7B,WAAK,cAAc;AACnB,WAAK,UAAU;AAAA,IACjB;AAEA,QAAI,KAAK,WAAW;AAClB,YAAM,KAAK,UAAU,IAAI;AACzB,WAAK,YAAY;AAAA,IACnB;AAEA,QAAI,KAAK,QAAQ;AACf,YAAM,KAAK,OAAO,IAAI;AACtB,WAAK,SAAS;AAAA,IAChB;AAAA,EACF;AAAA;AAAA,EAGA,aAAkB;AAChB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,eAAoB;AAClB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,YAAiB;AACf,WAAO,KAAK;AAAA,EACd;AAAA;AAAA,EAGA,MAAM,MAAM,KAAa,QAA8B;AACrD,YAAQ,KAAK,OAAO,MAAM;AAAA,MACxB,KAAK;AACH,cAAM,IAAI,MAAM,kDAAkD;AAAA,MACpE,KAAK;AACH,YAAI,CAAC,KAAK;AAAW,gBAAM,IAAI,MAAM,qBAAqB;AAC1D,cAAM,CAAC,IAAI,IAAI,MAAM,KAAK,UAAU,QAAQ,KAAK,UAAU,CAAC,CAAC;AAC7D,eAAO;AAAA,MACT,KAAK;AACH,YAAI,CAAC,KAAK;AAAQ,gBAAM,IAAI,MAAM,0BAA0B;AAC5D,cAAM,SAAS,MAAM,KAAK,OAAO,MAAM,KAAK,UAAU,CAAC,CAAC;AACxD,eAAO,OAAO;AAAA,MAChB;AACE,cAAM,IAAI,MAAM,8BAA8B,KAAK,OAAO,IAAI,EAAE;AAAA,IACpE;AAAA,EACF;AACF;;;ACjHO,IAAM,cAAN,MAAkB;AAAA,EAGvB,YAAY,QAAoB;AAC9B,SAAK,SAAS;AAAA,MACZ,WAAW;AAAA,MACX,GAAG;AAAA,IACL;AAAA,EACF;AAAA,EAEA,MAAM,aAAa,UAAmC;AACpD,QAAI;AACF,YAAM,SAAS,MAAM,OAAO,UAAU;AACtC,aAAO,OAAO,KAAK,UAAU,EAAE;AAAA,IACjC,SAAS,OAAY;AACnB,UAAI,MAAM,SAAS,oBAAoB;AACrC,cAAM,IAAI,MAAM,mEAAmE;AAAA,MACrF;AACA,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAM,iBAAiB,UAAkB,gBAA0C;AACjF,QAAI;AACF,YAAM,SAAS,MAAM,OAAO,UAAU;AACtC,aAAO,OAAO,QAAQ,UAAU,cAAc;AAAA,IAChD,SAAS,OAAY;AACnB,UAAI,MAAM,SAAS,oBAAoB;AACrC,cAAM,IAAI,MAAM,mEAAmE;AAAA,MACrF;AACA,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,cAAc,MAAsC;AAClD,QAAI;AACF,YAAM,MAAM,UAAQ,cAAc;AAClC,YAAM,UAAe,CAAC;AAEtB,UAAI,KAAK,OAAO,WAAW;AACzB,gBAAQ,YAAY,KAAK,OAAO;AAAA,MAClC;AAEA,aAAO,IAAI;AAAA,QACT,EAAE,IAAI,KAAK,IAAI,UAAU,KAAK,UAAU,OAAO,KAAK,SAAS,CAAC,EAAE;AAAA,QAChE,KAAK,OAAO;AAAA,QACZ;AAAA,MACF;AAAA,IACF,SAAS,OAAY;AACnB,UAAI,MAAM,SAAS,oBAAoB;AACrC,cAAM,IAAI,MAAM,+EAA+E;AAAA,MACjG;AACA,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,YAAY,OAAoB;AAC9B,QAAI;AACF,YAAM,MAAM,UAAQ,cAAc;AAClC,aAAO,IAAI,OAAO,OAAO,KAAK,OAAO,MAAM;AAAA,IAC7C,SAAS,OAAY;AACnB,UAAI,MAAM,SAAS,oBAAoB;AACrC,cAAM,IAAI,MAAM,+EAA+E;AAAA,MACjG;AACA,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA,EAGA,aAAa;AACX,WAAO,CAAC,KAAU,KAAU,SAAc;AACxC,YAAM,QAAQ,KAAK,aAAa,GAAG;AACnC,UAAI,OAAO;AACT,cAAM,UAAU,KAAK,YAAY,KAAK;AACtC,YAAI,SAAS;AACX,cAAI,OAAO;AAAA,QACb;AAAA,MACF;AACA,WAAK;AAAA,IACP;AAAA,EACF;AAAA;AAAA,EAGA,cAAc;AACZ,WAAO,CAAC,KAAU,KAAU,SAAc;AACxC,UAAI,CAAC,IAAI,MAAM;AACb,eAAO,IAAI,OAAO,GAAG,EAAE,KAAK,EAAE,SAAS,eAAe,CAAC;AAAA,MACzD;AACA,aAAO,KAAK;AAAA,IACd;AAAA,EACF;AAAA;AAAA,EAGA,aAAa,OAAiB;AAC5B,WAAO,CAAC,KAAU,KAAU,SAAc;AACxC,UAAI,CAAC,IAAI,MAAM;AACb,eAAO,IAAI,OAAO,GAAG,EAAE,KAAK,EAAE,SAAS,eAAe,CAAC;AAAA,MACzD;AAEA,YAAM,YAAY,IAAI,KAAK,SAAS,CAAC;AACrC,YAAM,kBAAkB,MAAM,KAAK,UAAQ,UAAU,SAAS,IAAI,CAAC;AAEnE,UAAI,CAAC,iBAAiB;AACpB,eAAO,IAAI,OAAO,GAAG,EAAE,KAAK,EAAE,SAAS,YAAY,CAAC;AAAA,MACtD;AAEA,aAAO,KAAK;AAAA,IACd;AAAA,EACF;AAAA,EAEQ,aAAa,KAAyB;AAC5C,QAAI,IAAI,QAAQ,iBAAiB,IAAI,QAAQ,cAAc,WAAW,SAAS,GAAG;AAChF,aAAO,IAAI,QAAQ,cAAc,UAAU,CAAC;AAAA,IAC9C;AACA,WAAO;AAAA,EACT;AACF;;;ACpIA,OAAO,UAAU;AACjB,OAAO,QAAQ;AAEf,SAAS,qBAAqB;AAkBvB,IAAM,YAAN,MAAgB;AAAA,EAKrB,YAAY,QAAgB,OAA2B,MAAM;AAC3D,SAAK,SAAS;AACd,SAAK,SAAS,KAAK,QAAQ,QAAQ,IAAI,GAAG,MAAM;AAChD,SAAK,OAAO;AAEZ,SAAK,iBAAiB;AAAA,EACxB;AAAA,EAEA,MAAc,mBAAmB;AAC/B,QAAI;AACF,YAAM,UAAU,MAAM,OAAO,SAAS;AACtC,WAAK,SAAS,QAAQ,QAAQ,OAAO;AACrC,WAAK,YAAY;AAAA,IACnB,SAAS,OAAY;AACnB,UAAI,MAAM,SAAS,oBAAoB;AACrC,cAAM,IAAI,MAAM,gEAAgE;AAAA,MAClF;AACA,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEQ,cAAc;AACpB,QAAI,CAAC,GAAG,WAAW,KAAK,MAAM,GAAG;AAC/B,cAAQ,IAAI,4BAA4B,KAAK,MAAM,EAAE;AACrD;AAAA,IACF;AAEA,SAAK,cAAc,KAAK,QAAQ,EAAE;AAAA,EACpC;AAAA,EAEQ,cAAc,SAAiB,aAAqB;AAC1D,UAAM,UAAU,GAAG,YAAY,SAAS,EAAE,eAAe,KAAK,CAAC;AAE/D,eAAW,SAAS,SAAS;AAC3B,YAAM,WAAW,KAAK,KAAK,SAAS,MAAM,IAAI;AAE9C,UAAI,MAAM,YAAY,GAAG;AAEvB,aAAK,cAAc,UAAU,GAAG,WAAW,IAAI,MAAM,IAAI,EAAE;AAAA,MAC7D,WAAW,KAAK,YAAY,MAAM,IAAI,GAAG;AAEvC,cAAM,YAAY,KAAK,aAAa,MAAM,MAAM,WAAW;AAC3D,aAAK,cAAc,UAAU,SAAS;AAAA,MACxC;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,YAAY,UAA2B;AAC7C,WAAO,SAAS,SAAS,KAAK,KACvB,SAAS,SAAS,KAAK,KACvB,SAAS,SAAS,MAAM;AAAA,EACjC;AAAA,EAEQ,aAAa,UAAkB,aAA6B;AAElE,UAAM,WAAW,KAAK,SAAS,UAAU,KAAK,QAAQ,QAAQ,CAAC;AAE/D,QAAI,aAAa,SAAS;AACxB,aAAO,eAAe;AAAA,IACxB;AAGA,UAAM,aAAa,SAAS,MAAM,YAAY;AAC9C,QAAI,YAAY;AACd,aAAO,GAAG,WAAW,KAAK,WAAW,CAAC,CAAC;AAAA,IACzC;AAEA,WAAO,GAAG,WAAW,IAAI,QAAQ;AAAA,EACnC;AAAA,EAEA,MAAc,cAAc,UAAkB,WAAmB;AAC/D,QAAI;AAEF,YAAM,eAAe,KAAK,WAAW,QAAQ,IAAI,WAAW,KAAK,QAAQ,QAAQ;AAGjF,YAAM,UAAU,cAAc,YAAY,EAAE;AAE5C,UAAI,QAAQ,aAAa,SAAS;AAEhC,cAAM,mBAAmB,GAAG,OAAO,MAAM,KAAK,IAAI,CAAC;AAGnD,cAAM,cAAc,MAAM,OAAO;AAEjC,YAAI,CAAC,KAAK,mBAAmB,WAAW,GAAG;AACzC,kBAAQ,KAAK,yBAAyB,QAAQ,EAAE;AAChD;AAAA,QACF;AAEA,gBAAQ,IAAI,0BAA0B,SAAS,EAAE;AAGjD,cAAM,aAAa,YAAY,cAAc,CAAC;AAG9C,mBAAW,UAAU,CAAC,OAAO,QAAQ,OAAO,UAAU,SAAS,SAAS,GAAG;AACzE,gBAAM,UAAU,YAAY,MAAM;AAClC,cAAI,OAAO,YAAY,YAAY;AACjC,kBAAM,eAAe,KAAK,OAAO,MAAM;AACvC,yBAAa;AAAA,cACX,KAAK;AAAA,cACL;AAAA,cACA,GAAG;AAAA,cACH,KAAK,YAAY,OAAO;AAAA,YAC1B;AAAA,UACF;AAAA,QACF;AAAA,MACF,OAAO;AAEL,cAAM,cAAc,MAAM,OAAO;AAEjC,YAAI,CAAC,KAAK,mBAAmB,WAAW,GAAG;AACzC,kBAAQ,KAAK,yBAAyB,QAAQ,EAAE;AAChD;AAAA,QACF;AAEA,gBAAQ,IAAI,0BAA0B,SAAS,EAAE;AAGjD,cAAM,aAAa,YAAY,cAAc,CAAC;AAG9C,mBAAW,UAAU,CAAC,OAAO,QAAQ,OAAO,UAAU,SAAS,SAAS,GAAG;AACzE,gBAAM,UAAU,YAAY,MAAM;AAClC,cAAI,OAAO,YAAY,YAAY;AACjC,kBAAM,eAAe,KAAK,OAAO,MAAM;AACvC,yBAAa;AAAA,cACX,KAAK;AAAA,cACL;AAAA,cACA,GAAG;AAAA,cACH,KAAK,YAAY,OAAO;AAAA,YAC1B;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,cAAQ,MAAM,4BAA4B,QAAQ,MAAM,KAAK;AAAA,IAC/D;AAAA,EACF;AAAA,EAEQ,mBAAmB,QAAoC;AAC7D,QAAI,CAAC;AAAQ,aAAO;AAGpB,WAAO,CAAC,OAAO,QAAQ,OAAO,UAAU,SAAS,SAAS,EACvD,KAAK,YAAU,OAAO,OAAO,MAAM,MAAM,UAAU;AAAA,EACxD;AAAA,EAEQ,YAAY,SAAuB;AACzC,WAAO,OAAO,KAAU,KAAU,SAAc;AAC9C,UAAI;AACF,cAAM,QAAQ,KAAK,KAAK,IAAI;AAAA,MAC9B,SAAS,OAAO;AACd,aAAK,KAAK;AAAA,MACZ;AAAA,IACF;AAAA,EACF;AACF;;;ACjLO,IAAM,gBAAoC,CAAC,KAAK,KAAK,SAAS;AACnE,UAAQ,IAAI,IAAG,oBAAI,KAAK,GAAE,YAAY,CAAC,MAAM,IAAI,MAAM,IAAI,IAAI,GAAG,EAAE;AACpE,OAAK;AACP;AAEO,IAAM,eAAe,CAC1B,KACA,KACA,KACA,SACG;AACH,UAAQ,MAAM,IAAI,KAAK;AACvB,MAAI,OAAO,GAAG,EAAE,KAAK;AAAA,IACnB,OAAO;AAAA,MACL,SAAS;AAAA,MACT,GAAI,QAAQ,IAAI,aAAa,eAAe,EAAE,SAAS,IAAI,SAAS,OAAO,IAAI,MAAM,IAAI,CAAC;AAAA,IAC5F;AAAA,EACF,CAAC;AACH;AAEO,IAAM,kBAAkB,CAAC,KAAU,QAAa;AACrD,MAAI,OAAO,GAAG,EAAE,KAAK;AAAA,IACnB,OAAO;AAAA,MACL,SAAS,eAAe,IAAI,MAAM,IAAI,IAAI,GAAG;AAAA,IAC/C;AAAA,EACF,CAAC;AACH;AAGO,SAAS,UAAU,SAA4C;AACpE,QAAM,WAAW,oBAAI,IAAsB;AAE3C,SAAO,CAAC,KAAU,KAAU,SAAc;AACxC,UAAM,KAAK,IAAI,MAAM,IAAI,OAAO,iBAAiB;AACjD,UAAM,MAAM,KAAK,IAAI;AAGrB,UAAM,YAAY,SAAS,IAAI,EAAE,KAAK,CAAC,GACpC,OAAO,UAAQ,MAAM,OAAO,QAAQ,QAAQ;AAG/C,aAAS,KAAK,GAAG;AACjB,aAAS,IAAI,IAAI,QAAQ;AAGzB,QAAI,SAAS,SAAS,QAAQ,KAAK;AACjC,aAAO,IAAI,OAAO,GAAG,EAAE,KAAK;AAAA,QAC1B,OAAO;AAAA,UACL,SAAS;AAAA,UACT,YAAY,KAAK,KAAK,QAAQ,WAAW,GAAI;AAAA,QAC/C;AAAA,MACF,CAAC;AAAA,IACH;AAEA,WAAO,KAAK;AAAA,EACd;AACF;;;AC/DA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAAO,YAAY;AACnB,OAAOC,SAAQ;AACf,OAAOC,WAAU;AASV,SAAS,cAAiB,MAAc,UAAgB;AAC7D,MAAI;AACF,WAAO,KAAK,MAAM,IAAI;AAAA,EACxB,SAAS,OAAO;AACd,WAAO;AAAA,EACT;AACF;AAKO,SAAS,cAAc,SAAiB,IAAY;AACzD,SAAO,OAAO,YAAY,MAAM,EAAE,SAAS,KAAK;AAClD;AAKO,SAAS,WAAW,OAAe,OAAe,IAAY;AACnE,SAAO,OAAO,WAAW,QAAQ,EAAE,OAAO,QAAQ,IAAI,EAAE,OAAO,KAAK;AACtE;AAKO,SAAS,cAAc,KAAyD;AACrF,QAAM,OAAO,KAAK,IAAI,GAAG,SAAS,IAAI,MAAM,IAAc,KAAK,CAAC;AAChE,QAAM,WAAW,SAAS,IAAI,MAAM,KAAe;AAInD,MAAI;AACJ,MAAI,MAAM,QAAQ,KAAK,YAAY,GAAG;AACpC,YAAQ;AAAA,EACV,OAAO;AACL,YAAQ,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,QAAQ,CAAC;AAAA,EAC7C;AAEA,QAAM,QAAQ,OAAO,KAAK;AAE1B,SAAO,EAAE,MAAM,OAAO,KAAK;AAC7B;AAKO,SAAS,YAAe,KAAU,MAAS,UAAkB,WAAgB;AAClF,SAAO,IAAI,KAAK;AAAA,IACd,SAAS;AAAA,IACT;AAAA,IACA;AAAA,EACF,CAAC;AACH;AAKO,SAAS,UACd,KACA,UAAkB,qBAClB,aAAqB,KACrB,QACK;AACL,SAAO,IAAI,OAAO,UAAU,EAAE,KAAK;AAAA,IACjC,SAAS;AAAA,IACT;AAAA,IACA,QAAQ,UAAU;AAAA,EACpB,CAAC;AACH;AAKO,SAAS,eACd,KACA,gBACuC;AACvC,QAAM,UAAU,eAAe,OAAO,WAAS;AAC7C,UAAM,QAAQ,IAAI,KAAK,KAAK;AAC5B,WAAO,UAAU,UAAa,UAAU,QAAQ,UAAU;AAAA,EAC5D,CAAC;AAED,SAAO;AAAA,IACL,OAAO,QAAQ,WAAW;AAAA,IAC1B;AAAA,EACF;AACF;AAKO,SAAS,mBACd,MACA,UAGI,CAAC,GAC+B;AACpC,MAAI,CAAC,MAAM;AACT,WAAO,EAAE,OAAO,OAAO,OAAO,mBAAmB;AAAA,EACnD;AAGA,MAAI,QAAQ,WAAW,KAAK,OAAO,QAAQ,SAAS;AAClD,WAAO;AAAA,MACL,OAAO;AAAA,MACP,OAAO,2CAA2C,QAAQ,UAAU,OAAO,IAAI;AAAA,IACjF;AAAA,EACF;AAGA,MAAI,QAAQ,gBAAgB,QAAQ,aAAa,SAAS,GAAG;AAC3D,UAAM,WAAW,KAAK;AACtB,QAAI,CAAC,QAAQ,aAAa,SAAS,QAAQ,GAAG;AAC5C,aAAO;AAAA,QACL,OAAO;AAAA,QACP,OAAO,qCAAqC,QAAQ,aAAa,KAAK,IAAI,CAAC;AAAA,MAC7E;AAAA,IACF;AAAA,EACF;AAEA,SAAO,EAAE,OAAO,KAAK;AACvB;AAKO,SAAS,qBAA0C;AACxD,SAAO;AAAA,IACL,aAAa,QAAQ;AAAA,IACrB,UAAU,QAAQ;AAAA,IAClB,MAAM,QAAQ;AAAA,IACd,QAAQ,QAAQ,YAAY;AAAA,IAC5B,QAAQ,QAAQ,OAAO;AAAA,IACvB,KAAK,QAAQ,IAAI,YAAY;AAAA,EAC/B;AACF;AAKA,eAAsB,iBAAiB,SAAmC;AACxE,MAAI;AACF,UAAM,QAAQ,MAAMD,IAAG,QAAQ,OAAO;AACtC,WAAO,MAAM,WAAW;AAAA,EAC1B,SAAS,OAAO;AAEd,WAAO;AAAA,EACT;AACF;AAKA,eAAsB,gBAAgB,SAAgC;AACpE,MAAI;AACF,UAAMA,IAAG,OAAO,OAAO;AAAA,EACzB,SAAS,OAAO;AAEd,UAAMA,IAAG,MAAM,SAAS,EAAE,WAAW,KAAK,CAAC;AAAA,EAC7C;AACF;AAKA,eAAsB,cAAc,UAAkB,MAA0B;AAC9E,QAAM,gBAAgBC,MAAK,QAAQ,QAAQ,CAAC;AAC5C,QAAMD,IAAG,UAAU,UAAU,KAAK,UAAU,MAAM,MAAM,CAAC,GAAG,MAAM;AACpE;AAKA,eAAsB,aAAgB,UAAkB,cAA6B;AACnF,MAAI;AACF,UAAM,OAAO,MAAMA,IAAG,SAAS,UAAU,MAAM;AAC/C,WAAO,cAAiB,MAAM,YAAY;AAAA,EAC5C,SAAS,OAAO;AACd,WAAO;AAAA,EACT;AACF;;;AChMA;AAAA;AAAA;AAAA;AAAA;AAAA;AAuBO,SAAS,iBACd,SACA,UAA2B,CAAC,GACpB;AACR,QAAM;AAAA,IACJ,QAAQ;AAAA,IACR,cAAc;AAAA,IACd,OAAO;AAAA,IACP,UAAU;AAAA,IACV,WAAW;AAAA,IACX,UAAU,CAAC;AAAA,IACX,SAAS,CAAC;AAAA,IACV,OAAO,CAAC;AAAA,IACR,cAAc;AAAA,IACd,YAAY,CAAC;AAAA,IACb,YAAY,CAAC;AAAA,IACb,cAAc,CAAC;AAAA,IACf,gBAAgB;AAAA,EAClB,IAAI;AAGJ,QAAM,iBAAiB,OAAO,QAAQ,SAAS,EAC5C,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,GAAG,GAAG,KAAK,WAAW,KAAK,CAAC,GAAG,EACrD,KAAK,GAAG;AAGX,QAAM,iBAAiB,OAAO,QAAQ,SAAS,EAC5C,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,GAAG,GAAG,KAAK,WAAW,KAAK,CAAC,GAAG,EACrD,KAAK,GAAG;AAGX,QAAM,WAAW;AAAA,IACf,kBAAkB,OAAO;AAAA,IACzB,kCAAkC,QAAQ;AAAA,IAC1C,cAAc,qCAAqC,WAAW,WAAW,CAAC,OAAO;AAAA,EACnF;AAGA,SAAO,QAAQ,IAAI,EAAE,QAAQ,CAAC,CAAC,MAAME,QAAO,MAAM;AAChD,aAAS,KAAK,eAAe,WAAW,IAAI,CAAC,cAAc,WAAWA,QAAO,CAAC,IAAI;AAAA,EACpF,CAAC;AAGD,QAAM,aAAa,QAAQ,IAAI,SAAO;AACpC,QAAI,IAAI,WAAW,SAAS,GAAG;AAC7B,aAAO;AAAA,IACT;AACA,WAAO,gBAAgB,WAAW,GAAG,CAAC,KAAK,IAAI,SAAS,KAAK,IAAI,kBAAkB,EAAE;AAAA,EACvF,CAAC;AAGD,QAAM,YAAY,OAAO,IAAI,UAAQ;AACnC,QAAI,KAAK,WAAW,QAAQ,GAAG;AAC7B,aAAO;AAAA,IACT;AACA,WAAO,gCAAgC,WAAW,IAAI,CAAC;AAAA,EACzD,CAAC;AAGD,QAAM,oBAAoB,OAAO,KAAK,WAAW,EAAE,SAAS,IAC1D,qDAAqD,WAAW,KAAK,UAAU,WAAW,CAAC,CAAC,cAAc;AAG5G,SAAO;AAAA,cACK,IAAI,KAAK,cAAc;AAAA;AAAA,IAEjC,SAAS,OAAO,OAAO,EAAE,KAAK,MAAM,CAAC;AAAA,WAC9B,WAAW,KAAK,CAAC;AAAA,IACxB,UAAU,KAAK,MAAM,CAAC;AAAA;AAAA,eAEX,WAAW,KAAK,cAAc;AAAA,oCACT,gBAAgB,oBAAoB,WAAW,aAAa,CAAC,MAAM,EAAE,IAAI,OAAO;AAAA,IAChH,iBAAiB;AAAA,IACjB,WAAW,KAAK,MAAM,CAAC;AAAA;AAAA;AAG3B;AAKO,SAAS,kBACd,YACA,SACA,OACQ;AACR,QAAM,gBAAwC;AAAA,IAC5C,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,EACP;AAEA,QAAM,QAAQ,GAAG,UAAU,MAAM,cAAc,UAAU,KAAK,OAAO;AAGrE,QAAM,QAAQ,QAAQ,IAAI,aAAa;AACvC,QAAM,eAAe,SAAS,QAAQ;AAAA;AAAA,aAE3B,WAAW,MAAM,SAAS,MAAM,OAAO,CAAC;AAAA;AAAA,MAE/C;AAGJ,QAAM,UAAU;AAAA;AAAA,YAEN,UAAU;AAAA,YACV,WAAW,cAAc,UAAU,KAAK,OAAO,CAAC;AAAA,WACjD,WAAW,OAAO,CAAC;AAAA,QACtB,YAAY;AAAA;AAAA;AAAA;AAMlB,QAAM,SAAS,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,WAyDP;AAET,SAAO,iBAAiB,SAAS;AAAA,IAC/B;AAAA,IACA,aAAa,SAAS,UAAU,KAAK,cAAc,UAAU,KAAK,OAAO;AAAA,IACzE,aAAa;AAAA,IACb;AAAA,EACF,CAAC;AACH;AAKO,SAAS,oBAAoB,UAAkB,cAAsB;AAC1E,QAAM,UAAU;AAAA;AAAA;AAAA,WAGP,WAAW,OAAO,CAAC;AAAA;AAAA;AAI5B,QAAM,SAAS,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,WA0BP;AAET,SAAO,iBAAiB,SAAS;AAAA,IAC/B,OAAO;AAAA,IACP,aAAa;AAAA,IACb;AAAA,EACF,CAAC;AACH;AAKA,SAAS,WAAW,MAAsB;AACxC,SAAO,OAAO,IAAI,EACf,QAAQ,MAAM,OAAO,EACrB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,QAAQ,EACtB,QAAQ,MAAM,QAAQ;AAC3B;;;AClQA,OAAOC,SAAQ;AACf,OAAOC,WAAU;AACjB,SAAS,iBAAAC,sBAAqB;AAI9B,IAAI,cAAc;AAKlB,eAAsB,eAA8B;AAClD,MAAI;AAAa;AAEjB,MAAI;AAEF,eAAW,cAAc,WAAW,eAAe;AACnD,eAAW,cAAc,WAAW,eAAe;AAGnD,kBAAc;AAAA,EAChB,SAAS,OAAO;AACd,YAAQ,MAAM,yDAAyD,KAAK;AAC5E,UAAM;AAAA,EACR;AACF;AAKA,eAAe,cAAc,YAAmC;AAC9D,MAAI,OAAO,OAAO,OAAO,YAAY;AACnC,WAAO,OAAO;AAAA,EAChB;AAGA,QAAM,gBAAgB;AAAA,IACpB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACAD,MAAK,KAAK,QAAQ,IAAI,GAAG,eAAe;AAAA,IACxCA,MAAK,KAAK,QAAQ,IAAI,GAAG,cAAc;AAAA,IACvCA,MAAK,KAAK,QAAQ,IAAI,GAAG,UAAU,eAAe;AAAA,IAClDA,MAAK,KAAK,QAAQ,IAAI,GAAG,UAAU,cAAc;AAAA,IACjDA,MAAK,KAAK,QAAQ,IAAI,GAAG,OAAO,eAAe;AAAA,IAC/CA,MAAK,KAAK,QAAQ,IAAI,GAAG,OAAO,cAAc;AAAA,EAChD,EAAE,OAAO,OAAO;AAEhB,aAAW,gBAAgB,eAAe;AACxC,QAAI;AACF,YAAM,eAAeA,MAAK,QAAQ,YAAa;AAG/C,UAAI;AACF,cAAM,QAAQ,MAAMD,IAAG,KAAK,YAAY;AACxC,YAAI,CAAC,MAAM,OAAO,GAAG;AACnB;AAAA,QACF;AAAA,MACF,SAAS,WAAW;AAClB;AAAA,MACF;AAGA,YAAM,cAAcE,eAAc,YAAY,EAAE;AAGhD,UAAI,OAAO,IAAI;AACb,eAAQ,OAAe;AAAA,MACzB;AAGA,YAAM,OAAO;AAEb,UAAI,OAAO,OAAO,OAAO,YAAY;AACnC,gBAAQ,IAAI,kCAAkC,YAAY,EAAE;AAC5D,eAAO,OAAO;AAAA,MAChB,OAAO;AACL,gBAAQ,KAAK,gDAAgD,YAAY,EAAE;AAAA,MAC7E;AAAA,IACF,SAAS,OAAY;AACnB,cAAQ,KAAK,6BAA6B,YAAY,KAAK,MAAM,OAAO;AACxE;AAAA,IACF;AAAA,EACF;AAEA,QAAM,IAAI;AAAA,IACR;AAAA;AAAA,kBAEmB,cAAc,KAAK,IAAI,CAAC;AAAA,EAC7C;AACF;AAKA,eAAsB,mBACpB,cACA,UAAyB,CAAC,GACD;AACzB,MAAI;AAEF,UAAM,aAAa;AAEnB,QAAI,QAAQ,OAAO;AACjB,cAAQ,IAAI,kCAAkC,YAAY;AAAA,IAC5D;AAGA,UAAM,YAAY,MAAM,cAAc,QAAQ,UAAU;AACxD,UAAM,KAAK,IAAI,UAAU;AAGzB,UAAM,aAAa,MAAMF,IAAG,SAAS,YAAY;AACjD,UAAM,aAAa,MAAM,YAAY,QAAQ,UAAU;AAIvD,UAAM,cAAc,GAAG;AACvB,UAAM,oBAAoB;AAAA,MACxB,GAAG;AAAA,MACH,GAAG,QAAQ;AAAA,IACb;AAEA,QAAI,QAAQ,OAAO;AACjB,cAAQ,IAAI,oCAAoC,OAAO,KAAK,iBAAiB,CAAC;AAG9E,iBAAW,CAAC,YAAY,aAAa,KAAK,OAAO,QAAQ,iBAAiB,GAAG;AAC3E,YAAI,OAAO,kBAAkB,YAAY,kBAAkB,MAAM;AAC/D,gBAAM,cAAc,OAAO,KAAK,aAAa;AAC7C,kBAAQ,IAAI,UAAU,UAAU,sBAAsB,WAAW;AAAA,QACnE;AAAA,MACF;AAAA,IACF;AAGA,UAAM,WAAW,MAAM,YAAY,YAAY,YAAY,iBAAiB;AAE5E,QAAI,QAAQ,OAAO;AACjB,cAAQ,IAAI,sDAAsD;AAAA,IACpE;AAIA,UAAM,aAAa,GAAG,IAAI,QAAQ;AAElC,QAAI,QAAQ,OAAO;AACjB,cAAQ,IAAI,0DAA0D;AAAA,IACxE;AAIA,UAAM,IAAI,QAAQ,aAAW,WAAW,SAAS,GAAI,CAAC;AAEtD,QAAI,QAAQ,OAAO;AACjB,cAAQ,IAAI,mDAAmD;AAAA,IACjE;AAGA,UAAM,YAAsC,CAAC;AAC7C,UAAM,YAAY;AAGlB,UAAM,UAAU,OAAO,oBAAoB,SAAS;AACpD,UAAM,SAAS,QAAQ,OAAO,SAAO,IAAI,WAAW,IAAI,CAAC;AAEzD,QAAI,QAAQ,OAAO;AACjB,cAAQ,IAAI,uCAAuC,MAAM;AAAA,IAC3D;AAEA,eAAW,OAAO,QAAQ;AACxB,UAAI,OAAO,UAAU,GAAG,MAAM,YAAY;AACxC,kBAAU,GAAG,IAAI,UAAU,GAAG;AAC9B,YAAI,QAAQ,OAAO;AACjB,kBAAQ,IAAI,0BAA0B,GAAG,EAAE;AAAA,QAC7C;AAAA,MACF;AAAA,IACF;AAEA,UAAM,eAA+B;AAAA,MACnC;AAAA,MACA,QAAQ;AAAA,MACR,SAAS,SAAS;AAAA,MAClB;AAAA,IACF;AAGA,QAAI,QAAQ,QAAQ;AAClB,cAAQ,OAAO,YAAY;AAAA,IAC7B;AAEA,QAAI,QAAQ,OAAO;AACjB,cAAQ,IAAI,0CAA0C,OAAO,KAAK,SAAS,EAAE,MAAM,YAAY;AAC/F,cAAQ,IAAI,+BAA+B,OAAO,KAAK,SAAS,CAAC;AAAA,IACnE;AAIA,eAAW,MAAM,CAAC,UAAa;AAC7B,UAAI,QAAQ,OAAO;AACjB,gBAAQ,IAAI,0CAA0C,KAAK;AAAA,MAC7D;AAAA,IACF,CAAC;AAED,WAAO;AAAA,EACT,SAAS,OAAO;AACd,YAAQ,MAAM,yCAAyC,KAAK;AAC5D,UAAM;AAAA,EACR;AACF;;;AP1MA,SAAS,iBAAiB,UAAkB,UAA0B;AACpE,MAAI;AAEF,UAAM,eAAeG,MAAK,SAAS,UAAU,QAAQ;AAErD,UAAM,aAAa,aAAa,QAAQ,aAAa,EAAE;AAEvD,UAAM,YAAY,WAAW,QAAQ,YAAY,EAAE;AAEnD,WAAO,UAAU,SAAS;AAAA,EAC5B,SAAS,GAAG;AACV,WAAO;AAAA,EACT;AACF;AAmBO,IAAM,SAAN,MAAa;AAAA,EAQlB,YAAY,SAAuB,CAAC,GAAG;AANvC,SAAQ,SAA6B;AAErC,SAAQ,KAAsB;AAC9B,SAAQ,OAA2B;AACnC,SAAQ,cAAuB;AAG7B,SAAK,SAAS;AAAA,MACZ,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,GAAG;AAAA,IACL;AAAA,EAIF;AAAA,EAEA,MAAc,gBAAgB;AAC5B,QAAI,KAAK,aAAa;AACpB;AAAA,IACF;AAEA,QAAI;AAEF,YAAM,UAAU,MAAM,OAAO,SAAS;AACtC,WAAK,MAAM,QAAQ,QAAQ;AAG3B,WAAK,IAAI,IAAI,QAAQ,QAAQ,KAAK,CAAC;AACnC,WAAK,IAAI,IAAI,QAAQ,QAAQ,WAAW,EAAE,UAAU,KAAK,CAAC,CAAC;AAG3D,UAAI,KAAK,OAAO,YAAY;AAC1B,YAAI;AACF,gBAAM,OAAO,MAAM,OAAO,MAAM;AAChC,eAAK,IAAI,IAAI,KAAK,QAAQ,KAAK,OAAO,WAAW,CAAC;AAAA,QACpD,SAAS,OAAO;AACd,kBAAQ,KAAK,iEAAiE;AAAA,QAChF;AAAA,MACF;AAGA,UAAI,KAAK,OAAO,IAAI;AAClB,aAAK,KAAK,IAAI,SAAS,KAAK,OAAO,EAAE;AAAA,MACvC;AAGA,UAAI,KAAK,OAAO,MAAM;AACpB,aAAK,OAAO,IAAI,YAAY;AAAA,UAC1B,QAAQ,KAAK,OAAO,KAAK;AAAA,UACzB,WAAW,KAAK,OAAO,KAAK;AAAA,QAC9B,CAAC;AACD,aAAK,IAAI,IAAI,KAAK,KAAK,WAAW,CAAC;AAAA,MACrC;AAGA,YAAM,aAAaA,MAAK,QAAQ,QAAQ,IAAI,GAAG,KAAK,OAAO,SAAU;AACrE,UAAIC,IAAG,WAAW,UAAU,GAAG;AAC7B,aAAK,IAAI,IAAI,QAAQ,QAAQ,OAAO,UAAU,CAAC;AAAA,MACjD;AAGA,WAAK,eAAe;AAGpB,WAAK,gBAAgB;AAGrB,WAAK,IAAI,IAAI,eAAe;AAC5B,WAAK,IAAI,IAAI,YAAY;AAEzB,WAAK,cAAc;AACnB,cAAQ,IAAI,iCAAiC;AAAA,IAE/C,SAAS,OAAY;AACnB,UAAI,MAAM,SAAS,sBAAsB,MAAM,QAAQ,SAAS,SAAS,GAAG;AAC1E,cAAM,IAAI,MAAM,gEAAgE;AAAA,MAClF;AACA,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEQ,iBAAiB;AACvB,UAAM,YAAY,IAAI,UAAU,KAAK,OAAO,QAAS,KAAK,IAAI;AAC9D,SAAK,IAAI,IAAI,QAAQ,eAAe,UAAU,MAAM;AAGpD,SAAK,IAAI,IAAI,aAAa,CAAC,KAAU,QAAa;AAChD,YAAM,UAAU,KAAK,gBAAgB;AACrC,UAAI,KAAK,OAAO;AAAA,IAClB,CAAC;AAAA,EACH;AAAA,EAEQ,kBAAkB;AAExB,UAAM,SAASD,MAAK,QAAQ,QAAQ,IAAI,GAAG,KAAK,OAAO,MAAO;AAC9D,UAAM,OAAO,EAAE,WAAW,CAAC,EAAW;AAEtC,QAAIC,IAAG,WAAW,MAAM,GAAG;AACzB,WAAK,iBAAiB,QAAQ,IAAI,KAAK,SAAS;AAAA,IAClD;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,iBAAiB,SAAiB,aAAqB,WAAkB;AAC/E,UAAM,UAAUA,IAAG,YAAY,SAAS,EAAE,eAAe,KAAK,CAAC;AAE/D,eAAW,SAAS,SAAS;AAC3B,YAAM,WAAWD,MAAK,KAAK,SAAS,MAAM,IAAI;AAE9C,UAAI,MAAM,YAAY,GAAG;AACvB,aAAK,iBAAiB,UAAU,GAAG,WAAW,IAAI,MAAM,IAAI,IAAI,SAAS;AAAA,MAC3E,WAAW,MAAM,KAAK,SAAS,KAAK,KAAK,MAAM,KAAK,SAAS,KAAK,GAAG;AACnE,cAAM,YAAY,KAAK,aAAa,MAAM,MAAM,WAAW;AAC3D,kBAAU,KAAK;AAAA,UACb,MAAM;AAAA,UACN,MAAMA,MAAK,SAAS,QAAQ,IAAI,GAAG,QAAQ;AAAA,UAC3C,SAAS,KAAK,iBAAiB,QAAQ;AAAA,QACzC,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,aAAa,UAAkB,aAA6B;AAClE,UAAM,WAAWA,MAAK,SAAS,UAAUA,MAAK,QAAQ,QAAQ,CAAC;AAE/D,QAAI,aAAa,SAAS;AACxB,aAAO,eAAe;AAAA,IACxB;AAEA,UAAM,aAAa,SAAS,MAAM,YAAY;AAC9C,QAAI,YAAY;AACd,aAAO,GAAG,WAAW,KAAK,WAAW,CAAC,CAAC;AAAA,IACzC;AAEA,WAAO,GAAG,WAAW,IAAI,QAAQ;AAAA,EACnC;AAAA,EAEQ,iBAAiB,UAA4B;AACnD,QAAI;AACF,YAAM,UAAUC,IAAG,aAAa,UAAU,MAAM;AAChD,YAAM,UAAU,CAAC,OAAO,QAAQ,OAAO,UAAU,SAAS,SAAS;AACnE,aAAO,QAAQ;AAAA,QAAO,YACpB,IAAI,OAAO,4BAA4B,MAAM,SAAS,EAAE,KAAK,OAAO,KACpE,IAAI,OAAO,gBAAgB,MAAM,OAAO,EAAE,KAAK,OAAO;AAAA,MACxD;AAAA,IACF,SAAS,OAAO;AACd,aAAO,CAAC;AAAA,IACV;AAAA,EACF;AAAA,EAEQ,kBAAkB;AACxB,UAAM,YAAYD,MAAK,QAAQ,QAAQ,IAAI,GAAG,KAAK,OAAO,QAAS;AACnE,QAAI,CAACC,IAAG,WAAW,SAAS,GAAG;AAC7B;AAAA,IACF;AAGA,SAAK,IAAI,IAAI,KAAK,OAAO,KAAwB,QAA8G;AAC7J,UAAI;AACF,cAAM,EAAE,MAAM,WAAW,IAAI,MAAM,KAAK,WAAW,IAAI,IAAI;AAC3D,YAAI,OAAO,cAAc,GAAG,EAAE,KAAK,IAAI;AAAA,MACzC,SAAS,OAAO;AACd,gBAAQ,MAAM,yBAAyB,KAAK;AAC5C,cAAM,YAAsB,kBAAkB,KAAK,cAAc;AACjE,YAAI,OAAO,GAAG,EAAE,KAAK,SAAS;AAAA,MAChC;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,WAAW,WAAmE;AAC1F,QAAI;AAEF,YAAM,WAAW,KAAK,OAAO,WAAWD,MAAK,QAAQ,QAAQ,IAAI,GAAG,KAAK,OAAO,QAAQ,IAAI;AAC5F,UAAI,CAAC,YAAY,CAACC,IAAG,WAAW,QAAQ,GAAG;AACzC,eAAO;AAAA,UACL,MAAgB,kBAAkB,KAAK,2BAA2B;AAAA,UAClE,YAAY;AAAA,QACd;AAAA,MACF;AAGA,UAAI,iBAAiB;AACrB,UAAI,CAAC,eAAe,WAAW,GAAG,GAAG;AACnC,yBAAiB,MAAM;AAAA,MACzB;AAGA,UAAI,mBAAmB,KAAK;AAC1B,yBAAiB;AAAA,MACnB;AAGA,UAAI,WAAW;AACf,YAAM,gBAAgB;AAAA,QACpBD,MAAK,KAAK,UAAU,GAAG,cAAc,KAAK;AAAA,QAC1CA,MAAK,KAAK,UAAU,GAAG,cAAc,KAAK;AAAA,QAC1CA,MAAK,KAAK,UAAU,GAAG,cAAc,MAAM;AAAA,QAC3CA,MAAK,KAAK,UAAU,GAAG,cAAc,MAAM;AAAA,QAC3CA,MAAK,KAAK,UAAU,GAAG,cAAc,WAAW;AAAA,QAChDA,MAAK,KAAK,UAAU,GAAG,cAAc,WAAW;AAAA,QAChDA,MAAK,KAAK,UAAU,GAAG,cAAc,YAAY;AAAA,QACjDA,MAAK,KAAK,UAAU,GAAG,cAAc,YAAY;AAAA,MACnD;AAEA,iBAAW,KAAK,eAAe;AAC7B,YAAIC,IAAG,WAAW,CAAC,GAAG;AACpB,qBAAW;AACX;AAAA,QACF;AAAA,MACF;AAGA,UAAI,CAAC,UAAU;AACb,eAAO;AAAA,UACL,MAAgB,kBAAkB,KAAK,mBAAmB,cAAc,EAAE;AAAA,UAC1E,YAAY;AAAA,QACd;AAAA,MACF;AAGA,UAAI;AACF,cAAM,aAAa,MAAM,OAAO;AAChC,YAAI,CAAC,cAAc,CAAC,WAAW,SAAS;AACtC,gBAAM,IAAI,MAAM,8BAA8B,QAAQ,EAAE;AAAA,QAC1D;AAEA,cAAM,gBAAgB,WAAW;AACjC,cAAM,eAAe;AAAA;AAAA,UAEnB,MAAM;AAAA,UACN,OAAO,CAAC;AAAA;AAAA,UACR,KAAK,EAAE,aAAY,oBAAI,KAAK,GAAE,YAAY,EAAE;AAAA,QAC9C;AAGA,cAAM,eAAe,MAAM,gBAAgB,eAAe,YAAY;AAEtE,YAAI,CAAC,aAAa,SAAS;AACzB,iBAAO;AAAA,YACL,MAAgB,kBAAkB,KAAK,yBAAyB,aAAa,iBAAiB,QAAQ,aAAa,QAAQ,IAAI,MAAM,eAAe,CAAC;AAAA,YACrJ,YAAY;AAAA,UACd;AAAA,QACF;AAGA,cAAM,cAAc,aAAa;AAGjC,YAAI,YAAY;AAChB,YAAI;AAEF,cAAI,OAAO,cAAc,aAAa,YAAY;AAChD,wBAAY,cAAc,SAAS,YAAY;AAAA,UACjD,WAAW,cAAc,OAAO;AAC9B,wBAAY,cAAc;AAAA,UAC5B;AAAA,QACF,SAAS,GAAG;AAAA,QAEZ;AAGA,cAAM,gBAAgB,iBAAiB,UAAU,QAAQ;AAGzD,cAAM,WAAqB,iBAAiB,aAAa;AAAA,UACvD,OAAO;AAAA;AAAA,UAEP,aAAa,OAAO,cAAc,mBAAmB,aACjD,cAAc,eAAe,YAAY,IACxC,cAAc,eAAe;AAAA;AAAA,UAElC,SAAS,CAAC,YAAY;AAAA;AAAA,UAEtB,MAAM,OAAO,cAAc,YAAY,aACnC,cAAc,QAAQ,YAAY,IAClC,CAAC;AAAA;AAAA,UAEL,QAAQ,CAAC,aAAa;AAAA;AAAA,UAEtB,aAAa;AAAA;AAAA,UAEb;AAAA,QACF,CAAC;AAED,eAAO,EAAE,MAAM,UAAU,YAAY,IAAI;AAAA,MAE3C,SAAS,OAAO;AACd,gBAAQ,MAAM,yBAAyB,KAAK;AAC5C,eAAO;AAAA,UACL,MAAgB,kBAAkB,KAAK,wBAAwB,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,eAAe,CAAC;AAAA,UAC1H,YAAY;AAAA,QACd;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,cAAQ,MAAM,uBAAuB,KAAK;AAC1C,aAAO;AAAA,QACL,MAAgB,kBAAkB,KAAK,gBAAgB,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,eAAe,CAAC;AAAA,QAClH,YAAY;AAAA,MACd;AAAA,IACF;AAAA,EACF;AAAA,EAEO,gBAAqB;AAC1B,WAAO,KAAK;AAAA,EACd;AAAA,EAEO,cAA+B;AACpC,WAAO,KAAK;AAAA,EACd;AAAA,EAEO,UAA8B;AACnC,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAa,QAAuB;AAElC,QAAI,CAAC,KAAK,aAAa;AACrB,YAAM,KAAK,cAAc;AAAA,IAC3B;AAEA,WAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAI,CAAC,KAAK,KAAK;AACb,eAAO,IAAI,MAAM,iDAAiD,CAAC;AACnE;AAAA,MACF;AAEA,WAAK,SAAS,KAAK,IAAI,OAAO,KAAK,OAAO,MAAM,MAAM;AACpD,gBAAQ,IAAI,sCAAsC,KAAK,OAAO,IAAI,EAAE;AACpE,gBAAQ;AAAA,MACV,CAAC;AAED,WAAK,OAAQ,GAAG,SAAS,CAAC,UAAe;AACvC,eAAO,KAAK;AAAA,MACd,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAAA,EAEO,OAAsB;AAC3B,WAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAI,CAAC,KAAK,QAAQ;AAChB,eAAO,QAAQ;AAAA,MACjB;AAEA,WAAK,OAAO,MAAM,CAAC,QAAa;AAC9B,YAAI;AAAK,iBAAO,OAAO,GAAG;AAC1B,aAAK,SAAS;AACd,gBAAQ;AAAA,MACV,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAAA,EAEO,UAAyB;AAC9B,WAAO,KAAK,KAAK,EAAE,KAAK,MAAM,KAAK,MAAM,CAAC;AAAA,EAC5C;AAAA,EAEO,UAAU,UAAoC,CAAC,GAAS;AAC7D,QAAI,CAACA,IAAG,WAAWD,MAAK,QAAQ,QAAQ,IAAI,GAAG,KAAK,OAAO,QAAS,CAAC,GAAG;AACtE,MAAAC,IAAG,UAAUD,MAAK,QAAQ,QAAQ,IAAI,GAAG,KAAK,OAAO,QAAS,GAAG,EAAE,WAAW,KAAK,CAAC;AAAA,IACtF;AAGA,QAAI,QAAQ,YAAY;AACtB,YAAM,YAAYA,MAAK,QAAQ,QAAQ,IAAI,GAAG,KAAK,OAAO,SAAU;AACpE,UAAI,CAACC,IAAG,WAAW,SAAS,GAAG;AAC7B,QAAAA,IAAG,UAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AAAA,MAC7C;AAIA,YAAM,eAAeD,MAAK,KAAK,WAAW,WAAW;AACrD,UAAI,CAACC,IAAG,WAAW,YAAY,GAAG;AAChC,cAAM,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiBxB,QAAAA,IAAG,cAAc,cAAc,eAAe;AAAA,MAChD;AAAA,IACF;AAAA,EACF;AAAA,EAEO,eAAe,QAAwC;AAC5D,WAAO,IAAI;AAAA,EACb;AAAA,EAEO,qBAA2B;AAEhC,UAAM,mBAAmB,YAAY;AACnC,cAAQ,IAAI,6CAA6C;AACzD,UAAI;AACF,cAAM,KAAK,KAAK;AAChB,YAAI,KAAK,IAAI;AACX,gBAAM,KAAK,GAAG,WAAW;AAAA,QAC3B;AACA,gBAAQ,IAAI,6BAA6B;AACzC,gBAAQ,KAAK,CAAC;AAAA,MAChB,SAAS,OAAO;AACd,gBAAQ,MAAM,0BAA0B,KAAK;AAC7C,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,IACF;AAGA,YAAQ,GAAG,WAAW,gBAAgB;AACtC,YAAQ,GAAG,UAAU,gBAAgB;AAAA,EACvC;AACF;AAOO,SAAS,aAAa,SAAuB,CAAC,GAAW;AAC9D,SAAO,IAAI,OAAO,MAAM;AAC1B;AAKO,SAAS,gBAAgB,UAG5B,CAAC,GAAW;AACd,SAAO,IAAI,OAAO;AAAA,IAChB,MAAM,QAAQ,QAAQ;AAAA,IACtB,YAAY,QAAQ,eAAe;AAAA,IACnC,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,WAAW;AAAA,EACb,CAAC;AACH;AAKO,SAAS,uBAAuB,QAA8B;AACnE,QAAM,SAAS,IAAI,OAAO;AAAA,IACxB,GAAG;AAAA;AAAA,IAEH,MAAM,OAAO,SAAS,QAAQ,IAAI,OAAO,SAAS,QAAQ,IAAI,IAAI,IAAI;AAAA,EACxE,CAAC;AAGD,SAAO,mBAAmB;AAE1B,SAAO;AACT;AAGO,SAAS,aAAa,KAAkB;AAC7C,SAAO,IAAI,MACR,IAAI,QAAQ,iBAAiB,GAAc,MAAM,GAAG,EAAE,CAAC,EAAE,KAAK,KAC/D,IAAI,OAAO,iBACX;AACJ;AAEO,SAAS,aAAa,KAAkC;AAC7D,QAAM,UAAkC,CAAC;AACzC,QAAM,eAAe,IAAI,QAAQ;AAEjC,MAAI,cAAc;AAChB,iBAAa,MAAM,GAAG,EAAE,QAAQ,CAAC,WAAmB;AAClD,YAAM,CAAC,MAAM,KAAK,IAAI,OAAO,MAAM,GAAG,EAAE,IAAI,OAAK,EAAE,KAAK,CAAC;AACzD,cAAQ,IAAI,IAAI;AAAA,IAClB,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAGO,IAAM,kBAAkB,OAAO,WAAgB,QAAa,CAAC,MAAM;AACxE,MAAI;AAEF,UAAM,EAAE,KAAK,gBAAAC,gBAAe,IAAI,MAAM,OAAO,kBAAkB;AAG/D,UAAM,UAAU,IAAI,WAAW,KAAK;AAGpC,UAAM,OAAOA,gBAAe,OAAO;AAEnC,WAAO;AAAA,MACL,MAAM,OAAO,SAAS,WAAW,OAAO,OAAO,IAAI;AAAA,MACnD,SAAS;AAAA,IACX;AAAA,EACF,SAAS,OAAO;AACd,YAAQ,MAAM,8BAA8B,KAAK;AACjD,WAAO;AAAA,MACL,MAAM,iDAAiD,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,MAC/G,SAAS;AAAA,MACT;AAAA,IACF;AAAA,EACF;AACF;AAwBA,IAAO,iBAAQ;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;",
4
+ "sourcesContent": ["import path from 'path';\r\nimport http from 'http';\r\nimport fs from 'fs';\r\nimport { renderToString } from 'frontend-hamroun';\r\nimport { Database } from './database.js';\r\nimport { AuthService } from './auth.js';\r\nimport { ApiRouter } from './api-router.js';\r\nimport { requestLogger, errorHandler, notFoundHandler, rateLimit } from './middleware.js';\r\n\r\n// Import the utility functions\r\nimport * as utils from './utils.js';\r\nimport * as templates from './templates.js';\r\nimport { initNodeWasm, loadGoWasmFromFile } from './wasm.js';\r\n\r\n// Helper function to get the component name from the file path\r\nfunction getComponentName(filePath: string, pagesDir: string): string {\r\n try {\r\n // Get relative path from pages directory\r\n const relativePath = path.relative(pagesDir, filePath);\r\n // Remove extension\r\n const withoutExt = relativePath.replace(/\\.[^/.]+$/, '');\r\n // Replace index with empty for clean paths\r\n const cleanPath = withoutExt.replace(/\\/index$/, '');\r\n // Convert to module path format\r\n return `/pages/${cleanPath}`;\r\n } catch (e) {\r\n return '';\r\n }\r\n}\r\n\r\nexport interface ServerConfig {\r\n port?: number;\r\n apiDir?: string;\r\n pagesDir?: string;\r\n staticDir?: string;\r\n enableCors?: boolean;\r\n corsOptions?: any;\r\n db?: {\r\n url: string;\r\n type: 'mongodb' | 'mysql' | 'postgres';\r\n };\r\n auth?: {\r\n secret: string;\r\n expiresIn?: string | number;\r\n };\r\n}\r\n\r\nexport class Server {\r\n private app: any;\r\n private server: http.Server | null = null;\r\n private config: ServerConfig;\r\n private db: Database | null = null;\r\n private auth: AuthService | null = null;\r\n private initialized: boolean = false;\r\n\r\n constructor(config: ServerConfig = {}) {\r\n this.config = {\r\n port: 3000,\r\n apiDir: './api',\r\n pagesDir: './pages',\r\n staticDir: './public',\r\n enableCors: true,\r\n ...config\r\n };\r\n\r\n // Initialize immediately without waiting\r\n this.initializeApp().catch(error => {\r\n console.error('Failed to initialize server:', error);\r\n });\r\n }\r\n\r\n private async initializeApp() {\r\n if (this.initialized) {\r\n return;\r\n }\r\n\r\n try {\r\n // Dynamic import of express to handle missing dependency\r\n const express = await import('express');\r\n this.app = express.default();\r\n \r\n // Basic middleware\r\n this.app.use(express.default.json());\r\n this.app.use(express.default.urlencoded({ extended: true }));\r\n \r\n // CORS setup\r\n if (this.config.enableCors) {\r\n try {\r\n const cors = await import('cors');\r\n this.app.use(cors.default(this.config.corsOptions));\r\n } catch (error) {\r\n console.warn('CORS not available - install with: npm install cors @types/cors');\r\n }\r\n }\r\n \r\n // Setup database if configured\r\n if (this.config.db) {\r\n this.db = new Database(this.config.db);\r\n }\r\n \r\n // Setup auth if configured\r\n if (this.config.auth) {\r\n this.auth = new AuthService({\r\n secret: this.config.auth.secret,\r\n expiresIn: this.config.auth.expiresIn\r\n });\r\n this.app.use(this.auth.initialize());\r\n }\r\n \r\n // Static files - setup before other routes\r\n const staticPath = path.resolve(process.cwd(), this.config.staticDir!);\r\n if (fs.existsSync(staticPath)) {\r\n this.app.use(express.default.static(staticPath));\r\n }\r\n \r\n // Setup API routes\r\n this.setupApiRoutes();\r\n \r\n // Setup page routes (for SSR)\r\n this.setupPageRoutes();\r\n \r\n // Add error handlers at the end\r\n this.app.use(notFoundHandler);\r\n this.app.use(errorHandler);\r\n\r\n this.initialized = true;\r\n console.log('\u2705 Baraqex server initialized successfully');\r\n \r\n } catch (error: any) {\r\n if (error.code === 'MODULE_NOT_FOUND' && error.message.includes('express')) {\r\n throw new Error('Express not installed. Run: npm install express @types/express');\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n private setupApiRoutes() {\r\n const apiRouter = new ApiRouter(this.config.apiDir!, this.auth);\r\n this.app.use('/api', requestLogger, apiRouter.router);\r\n \r\n // Add API documentation route\r\n this.app.get('/api-docs', (req: any, res: any) => {\r\n const apiDocs = this.generateApiDocs();\r\n res.json(apiDocs);\r\n });\r\n }\r\n\r\n private generateApiDocs() {\r\n // Generate documentation based on API routes\r\n const apiDir = path.resolve(process.cwd(), this.config.apiDir!);\r\n const docs = { endpoints: [] as any[] };\r\n \r\n if (fs.existsSync(apiDir)) {\r\n this.scanApiDirectory(apiDir, '', docs.endpoints);\r\n }\r\n \r\n return docs;\r\n }\r\n \r\n private scanApiDirectory(dirPath: string, routePrefix: string, endpoints: any[]) {\r\n const entries = fs.readdirSync(dirPath, { withFileTypes: true });\r\n \r\n for (const entry of entries) {\r\n const fullPath = path.join(dirPath, entry.name);\r\n \r\n if (entry.isDirectory()) {\r\n this.scanApiDirectory(fullPath, `${routePrefix}/${entry.name}`, endpoints);\r\n } else if (entry.name.endsWith('.js') || entry.name.endsWith('.ts')) {\r\n const routePath = this.getRoutePath(entry.name, routePrefix);\r\n endpoints.push({\r\n path: routePath,\r\n file: path.relative(process.cwd(), fullPath),\r\n methods: this.detectApiMethods(fullPath)\r\n });\r\n }\r\n }\r\n }\r\n \r\n private getRoutePath(filename: string, routePrefix: string): string {\r\n const baseName = path.basename(filename, path.extname(filename));\r\n \r\n if (baseName === 'index') {\r\n return routePrefix || '/';\r\n }\r\n \r\n const paramMatch = baseName.match(/^\\[(.+)\\]$/);\r\n if (paramMatch) {\r\n return `${routePrefix}/:${paramMatch[1]}`;\r\n }\r\n \r\n return `${routePrefix}/${baseName}`;\r\n }\r\n \r\n private detectApiMethods(filePath: string): string[] {\r\n try {\r\n const content = fs.readFileSync(filePath, 'utf8');\r\n const methods = ['get', 'post', 'put', 'delete', 'patch', 'options'];\r\n return methods.filter(method => \r\n new RegExp(`export (async )?function ${method}\\\\s*\\\\(`).test(content) ||\r\n new RegExp(`export const ${method}\\\\s*=`).test(content)\r\n );\r\n } catch (error) {\r\n return [];\r\n }\r\n }\r\n\r\n private setupPageRoutes() {\r\n const pagesPath = path.resolve(process.cwd(), this.config.pagesDir!);\r\n if (!fs.existsSync(pagesPath)) {\r\n return;\r\n }\r\n\r\n // Setup catch-all route for SSR - but only if pages directory exists\r\n this.app.get('*', async (req: { path: string; }, res: { status: (arg0: number) => { (): any; new(): any; send: { (arg0: string): void; new(): any; }; }; }) => {\r\n try {\r\n const { html, statusCode } = await this.renderPage(req.path);\r\n res.status(statusCode || 200).send(html);\r\n } catch (error) {\r\n console.error('Error rendering page:', error);\r\n const errorHtml = templates.generateErrorPage(500, 'Server Error');\r\n res.status(500).send(errorHtml);\r\n }\r\n });\r\n }\r\n\r\n private async renderPage(routePath: string): Promise<{ html: string, statusCode?: number }> {\r\n try {\r\n // Try to find the page component\r\n const pagesDir = this.config.pagesDir ? path.resolve(process.cwd(), this.config.pagesDir) : '';\r\n if (!pagesDir || !fs.existsSync(pagesDir)) {\r\n return { \r\n html: templates.generateErrorPage(404, 'Pages directory not found'), \r\n statusCode: 404 \r\n };\r\n }\r\n \r\n // Normalize the path\r\n let normalizedPath = routePath;\r\n if (!normalizedPath.startsWith('/')) {\r\n normalizedPath = '/' + normalizedPath;\r\n }\r\n \r\n // Default to index for the root\r\n if (normalizedPath === '/') {\r\n normalizedPath = '/index';\r\n }\r\n \r\n // Try to find a matching page file\r\n let pagePath = '';\r\n const possiblePaths = [\r\n path.join(pagesDir, `${normalizedPath}.js`),\r\n path.join(pagesDir, `${normalizedPath}.ts`),\r\n path.join(pagesDir, `${normalizedPath}.jsx`),\r\n path.join(pagesDir, `${normalizedPath}.tsx`),\r\n path.join(pagesDir, `${normalizedPath}/index.js`),\r\n path.join(pagesDir, `${normalizedPath}/index.ts`),\r\n path.join(pagesDir, `${normalizedPath}/index.jsx`),\r\n path.join(pagesDir, `${normalizedPath}/index.tsx`)\r\n ];\r\n \r\n for (const p of possiblePaths) {\r\n if (fs.existsSync(p)) {\r\n pagePath = p;\r\n break;\r\n }\r\n }\r\n \r\n // Handle 404 if page not found\r\n if (!pagePath) {\r\n return { \r\n html: templates.generateErrorPage(404, `Page not found: ${normalizedPath}`), \r\n statusCode: 404 \r\n };\r\n }\r\n \r\n // Import and render the page component\r\n try {\r\n const pageModule = await import(pagePath);\r\n if (!pageModule || !pageModule.default) {\r\n throw new Error(`No default export found in ${pagePath}`);\r\n }\r\n \r\n const PageComponent = pageModule.default;\r\n const initialProps = {\r\n // Provide any initial props here\r\n path: normalizedPath,\r\n query: {}, // Could be parsed from URL\r\n api: { serverTime: new Date().toISOString() }\r\n };\r\n \r\n // Use the fixed renderComponent function\r\n const renderResult = await renderComponent(PageComponent, initialProps);\r\n \r\n if (!renderResult.success) {\r\n return { \r\n html: templates.generateErrorPage(500, 'Failed to render page', renderResult.error instanceof Error ? renderResult.error : new Error('Unknown error')), \r\n statusCode: 500 \r\n };\r\n }\r\n \r\n // Get the HTML string from the render result\r\n const htmlContent = renderResult.html;\r\n \r\n // Generate the full HTML document\r\n let pageTitle = 'My App';\r\n try {\r\n // Try to extract title from component if it has a getTitle method\r\n if (typeof PageComponent.getTitle === 'function') {\r\n pageTitle = PageComponent.getTitle(initialProps);\r\n } else if (PageComponent.title) {\r\n pageTitle = PageComponent.title;\r\n }\r\n } catch (e) {\r\n // Ignore title errors\r\n }\r\n \r\n // Parse the component name for hydration\r\n const componentName = getComponentName(pagePath, pagesDir);\r\n \r\n // Generate full HTML document with our template\r\n const fullHtml = templates.generateDocument(htmlContent, {\r\n title: pageTitle,\r\n // Get description from component if available\r\n description: typeof PageComponent.getDescription === 'function' \r\n ? PageComponent.getDescription(initialProps) \r\n : (PageComponent.description || ''),\r\n // Add scripts for client-side hydration\r\n scripts: ['/client.js'],\r\n // Add any custom meta tags\r\n meta: typeof PageComponent.getMeta === 'function'\r\n ? PageComponent.getMeta(initialProps)\r\n : {},\r\n // Add custom styles\r\n styles: ['/styles.css'],\r\n // Add initial data for client-side hydration\r\n initialData: initialProps,\r\n // Add component information for hydration\r\n componentName: componentName\r\n });\r\n \r\n return { html: fullHtml, statusCode: 200 };\r\n \r\n } catch (error) {\r\n console.error('Error rendering page:', error);\r\n return { \r\n html: templates.generateErrorPage(500, 'Error rendering page', error instanceof Error ? error : new Error('Unknown error')), \r\n statusCode: 500 \r\n };\r\n }\r\n } catch (error) {\r\n console.error('Error finding page:', error);\r\n return { \r\n html: templates.generateErrorPage(500, 'Server error', error instanceof Error ? error : new Error('Unknown error')), \r\n statusCode: 500 \r\n };\r\n }\r\n }\r\n\r\n public getExpressApp(): any {\r\n return this.app;\r\n }\r\n\r\n public getDatabase(): Database | null {\r\n return this.db;\r\n }\r\n\r\n public getAuth(): AuthService | null {\r\n return this.auth;\r\n }\r\n\r\n public async start(): Promise<void> {\r\n // Wait for initialization if not ready\r\n while (!this.initialized) {\r\n await new Promise(resolve => setTimeout(resolve, 50));\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n if (!this.app) {\r\n reject(new Error('Server not initialized. Express app is missing.'));\r\n return;\r\n }\r\n\r\n this.server = this.app.listen(this.config.port, () => {\r\n console.log(`\uD83D\uDE80 Server running at http://localhost:${this.config.port}`);\r\n resolve();\r\n });\r\n\r\n this.server!.on('error', (error: any) => {\r\n reject(error);\r\n });\r\n });\r\n }\r\n\r\n public stop(): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n if (!this.server) {\r\n return resolve();\r\n }\r\n \r\n this.server.close((err: any) => {\r\n if (err) return reject(err);\r\n this.server = null;\r\n resolve();\r\n });\r\n });\r\n }\r\n\r\n public restart(): Promise<void> {\r\n return this.stop().then(() => this.start());\r\n }\r\n \r\n public enableSSR(options: { hydratable?: boolean } = {}): void {\r\n if (!fs.existsSync(path.resolve(process.cwd(), this.config.pagesDir!))) {\r\n fs.mkdirSync(path.resolve(process.cwd(), this.config.pagesDir!), { recursive: true });\r\n }\r\n \r\n // Set up client-side JS for hydration if needed\r\n if (options.hydratable) {\r\n const staticDir = path.resolve(process.cwd(), this.config.staticDir!);\r\n if (!fs.existsSync(staticDir)) {\r\n fs.mkdirSync(staticDir, { recursive: true });\r\n }\r\n \r\n // Generate or copy client hydration script\r\n const clientJsPath = path.join(staticDir, 'client.js');\r\n if (!fs.existsSync(clientJsPath)) {\r\n const clientJsContent = `\r\n // Auto-generated hydration script\r\n import { hydrate } from 'frontend-hamroun';\r\n \r\n // Find SSR content and hydrate it\r\n document.addEventListener('DOMContentLoaded', () => {\r\n const ssrRoots = document.querySelectorAll('[data-ssr-root]');\r\n ssrRoots.forEach(root => {\r\n const componentPath = root.getAttribute('data-component');\r\n if (componentPath) {\r\n import(componentPath).then(module => {\r\n hydrate(module.default, root);\r\n });\r\n }\r\n });\r\n });\r\n `;\r\n fs.writeFileSync(clientJsPath, clientJsContent);\r\n }\r\n }\r\n }\r\n\r\n public registerPlugin(plugin: (server: Server) => void): void {\r\n plugin(this);\r\n }\r\n \r\n public addShutdownHandler(): void {\r\n // Handle graceful shutdown\r\n const gracefulShutdown = async () => {\r\n console.log('Received shutdown signal, closing server...');\r\n try {\r\n await this.stop();\r\n if (this.db) {\r\n await this.db.disconnect();\r\n }\r\n console.log('Server shut down gracefully');\r\n process.exit(0);\r\n } catch (error) {\r\n console.error('Error during shutdown:', error);\r\n process.exit(1);\r\n }\r\n };\r\n \r\n // Listen for termination signals\r\n process.on('SIGTERM', gracefulShutdown);\r\n process.on('SIGINT', gracefulShutdown);\r\n }\r\n}\r\n\r\n/**\r\n * Creates and configures a new server instance - simplified and reliable\r\n */\r\nexport function createServer(config: ServerConfig = {}): Server {\r\n return new Server(config);\r\n}\r\n\r\n/**\r\n * Creates a new server with sensible defaults for development - immediate return\r\n */\r\nexport function createDevServer(options: {\r\n port?: number;\r\n enableCors?: boolean;\r\n} = {}): Server {\r\n return new Server({\r\n port: options.port || 3000,\r\n enableCors: options.enableCors !== false,\r\n apiDir: './src/api',\r\n pagesDir: './src/pages',\r\n staticDir: './public'\r\n });\r\n}\r\n\r\n/**\r\n * Creates a production-ready server with optimized settings\r\n */\r\nexport function createProductionServer(config: ServerConfig): Server {\r\n const server = new Server({\r\n ...config,\r\n port: config.port || (process.env.PORT ? parseInt(process.env.PORT) : 8080)\r\n });\r\n \r\n // Add shutdown handler for production environments\r\n server.addShutdownHandler();\r\n \r\n return server;\r\n}\r\n\r\n// Export additional utility functions\r\nexport function getRequestIp(req: any): string {\r\n return req.ip || \r\n (req.headers['x-forwarded-for'] as string)?.split(',')[0].trim() || \r\n req.socket.remoteAddress || \r\n '';\r\n}\r\n\r\nexport function parseCookies(req: any): Record<string, string> {\r\n const cookies: Record<string, string> = {};\r\n const cookieHeader = req.headers.cookie;\r\n \r\n if (cookieHeader) {\r\n cookieHeader.split(';').forEach((cookie: string) => {\r\n const [name, value] = cookie.split('=').map(c => c.trim());\r\n cookies[name] = value;\r\n });\r\n }\r\n \r\n return cookies;\r\n}\r\n\r\n// Fix the renderComponent function to use frontend-hamroun's renderToString properly\r\nexport const renderComponent = async (Component: any, props: any = {}) => {\r\n try {\r\n // Import frontend-hamroun modules\r\n const { jsx, renderToString } = await import('frontend-hamroun');\r\n \r\n // Create component element using jsx\r\n const element = jsx(Component, props);\r\n \r\n // Use frontend-hamroun's renderToString for proper SSR\r\n const html = renderToString(element);\r\n \r\n return {\r\n html: typeof html === 'string' ? html : String(html),\r\n success: true\r\n };\r\n } catch (error) {\r\n console.error('Error rendering component:', error);\r\n return {\r\n html: `<div class=\"error\">Error rendering component: ${error instanceof Error ? error.message : 'Unknown error'}</div>`,\r\n success: false,\r\n error\r\n };\r\n }\r\n};\r\n\r\n// Export WASM utilities for server-side usage\r\nexport { initNodeWasm, loadGoWasmFromFile } from './wasm.js';\r\n\r\n// Import and export server utilities\r\nexport * from './utils.js';\r\nexport * from './templates.js';\r\n\r\n// Export the Database and AuthService classes\r\nexport { Database } from './database.js';\r\nexport { AuthService } from './auth.js';\r\nexport { ApiRouter } from './api-router.js';\r\nexport { \r\n requestLogger, \r\n errorHandler, \r\n notFoundHandler, \r\n rateLimit \r\n} from './middleware.js';\r\n\r\n// Export renderToString for convenient SSR\r\nexport { renderToString };\r\n\r\n// Ensure the default export includes all required functions\r\nexport default {\r\n Server,\r\n createServer,\r\n createDevServer,\r\n createProductionServer,\r\n rateLimit,\r\n requestLogger,\r\n errorHandler,\r\n notFoundHandler,\r\n loadGoWasmFromFile,\r\n // Template utilities\r\n templates,\r\n // Server utilities\r\n utils,\r\n // Additional exports\r\n renderComponent,\r\n renderToString,\r\n getRequestIp,\r\n parseCookies,\r\n Database,\r\n AuthService,\r\n ApiRouter\r\n};\r\n\r\n", "export interface DbConfig {\r\n url: string;\r\n type: 'mongodb' | 'mysql' | 'postgres';\r\n}\r\n\r\nexport class Database {\r\n private config: DbConfig;\r\n private mongoClient: any = null;\r\n private mongoDb: any = null;\r\n private mysqlPool: any = null;\r\n private pgPool: any = null;\r\n\r\n constructor(config: DbConfig) {\r\n this.config = config;\r\n }\r\n\r\n async connect(): Promise<void> {\r\n switch (this.config.type) {\r\n case 'mongodb':\r\n await this.connectMongo();\r\n break;\r\n case 'mysql':\r\n await this.connectMysql();\r\n break;\r\n case 'postgres':\r\n await this.connectPostgres();\r\n break;\r\n default:\r\n throw new Error(`Unsupported database type: ${this.config.type}`);\r\n }\r\n }\r\n\r\n private async connectMongo(): Promise<void> {\r\n try {\r\n const { MongoClient } = await import('mongodb');\r\n this.mongoClient = new MongoClient(this.config.url);\r\n await this.mongoClient.connect();\r\n this.mongoDb = this.mongoClient.db();\r\n console.log('Connected to MongoDB');\r\n } catch (error: any) {\r\n if (error.code === 'MODULE_NOT_FOUND') {\r\n throw new Error('MongoDB driver not installed. Run: npm install mongodb');\r\n }\r\n console.error('MongoDB connection error:', error);\r\n throw error;\r\n }\r\n }\r\n\r\n private async connectMysql(): Promise<void> {\r\n try {\r\n const mysql = await import('mysql2/promise');\r\n this.mysqlPool = mysql.createPool(this.config.url);\r\n // Test connection\r\n await this.mysqlPool.getConnection();\r\n console.log('Connected to MySQL');\r\n } catch (error: any) {\r\n if (error.code === 'MODULE_NOT_FOUND') {\r\n throw new Error('MySQL driver not installed. Run: npm install mysql2');\r\n }\r\n console.error('MySQL connection error:', error);\r\n throw error;\r\n }\r\n }\r\n\r\n private async connectPostgres(): Promise<void> {\r\n try {\r\n const pg = await import('pg');\r\n this.pgPool = new pg.Pool({ connectionString: this.config.url });\r\n // Test connection\r\n const client = await this.pgPool.connect();\r\n client.release();\r\n console.log('Connected to PostgreSQL');\r\n } catch (error: any) {\r\n if (error.code === 'MODULE_NOT_FOUND') {\r\n throw new Error('PostgreSQL driver not installed. Run: npm install pg @types/pg');\r\n }\r\n console.error('PostgreSQL connection error:', error);\r\n throw error;\r\n }\r\n }\r\n\r\n async disconnect(): Promise<void> {\r\n if (this.mongoClient) {\r\n await this.mongoClient.close();\r\n this.mongoClient = null;\r\n this.mongoDb = null;\r\n }\r\n \r\n if (this.mysqlPool) {\r\n await this.mysqlPool.end();\r\n this.mysqlPool = null;\r\n }\r\n \r\n if (this.pgPool) {\r\n await this.pgPool.end();\r\n this.pgPool = null;\r\n }\r\n }\r\n\r\n // Database-specific methods\r\n getMongoDb(): any {\r\n return this.mongoDb;\r\n }\r\n\r\n getMysqlPool(): any {\r\n return this.mysqlPool;\r\n }\r\n\r\n getPgPool(): any {\r\n return this.pgPool;\r\n }\r\n\r\n // Generic query method\r\n async query(sql: string, values?: any[]): Promise<any> {\r\n switch (this.config.type) {\r\n case 'mongodb':\r\n throw new Error('For MongoDB, use getMongoDb() instead of query()');\r\n case 'mysql':\r\n if (!this.mysqlPool) throw new Error('MySQL not connected');\r\n const [rows] = await this.mysqlPool.execute(sql, values || []);\r\n return rows;\r\n case 'postgres':\r\n if (!this.pgPool) throw new Error('PostgreSQL not connected');\r\n const result = await this.pgPool.query(sql, values || []);\r\n return result.rows;\r\n default:\r\n throw new Error(`Unsupported database type: ${this.config.type}`);\r\n }\r\n }\r\n}\r\n", "\r\n\r\nexport interface AuthConfig {\r\n secret: string;\r\n expiresIn?: string | number;\r\n}\r\n\r\nexport interface User {\r\n id: string | number;\r\n username: string;\r\n password?: string;\r\n email?: string;\r\n roles?: string[];\r\n [key: string]: any;\r\n}\r\n\r\nexport class AuthService {\r\n private config: AuthConfig;\r\n\r\n constructor(config: AuthConfig) {\r\n this.config = {\r\n expiresIn: '24h',\r\n ...config\r\n };\r\n }\r\n\r\n async hashPassword(password: string): Promise<string> {\r\n try {\r\n const bcrypt = await import('bcryptjs');\r\n return bcrypt.hash(password, 10);\r\n } catch (error: any) {\r\n if (error.code === 'MODULE_NOT_FOUND') {\r\n throw new Error('bcryptjs not installed. Run: npm install bcryptjs @types/bcryptjs');\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n async comparePasswords(password: string, hashedPassword: string): Promise<boolean> {\r\n try {\r\n const bcrypt = await import('bcryptjs');\r\n return bcrypt.compare(password, hashedPassword);\r\n } catch (error: any) {\r\n if (error.code === 'MODULE_NOT_FOUND') {\r\n throw new Error('bcryptjs not installed. Run: npm install bcryptjs @types/bcryptjs');\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n generateToken(user: Omit<User, 'password'>): string {\r\n try {\r\n const jwt = require('jsonwebtoken');\r\n const options: any = {};\r\n \r\n if (this.config.expiresIn) {\r\n options.expiresIn = this.config.expiresIn;\r\n }\r\n \r\n return jwt.sign(\r\n { id: user.id, username: user.username, roles: user.roles || [] },\r\n this.config.secret,\r\n options\r\n );\r\n } catch (error: any) {\r\n if (error.code === 'MODULE_NOT_FOUND') {\r\n throw new Error('jsonwebtoken not installed. Run: npm install jsonwebtoken @types/jsonwebtoken');\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n verifyToken(token: string): any {\r\n try {\r\n const jwt = require('jsonwebtoken');\r\n return jwt.verify(token, this.config.secret);\r\n } catch (error: any) {\r\n if (error.code === 'MODULE_NOT_FOUND') {\r\n throw new Error('jsonwebtoken not installed. Run: npm install jsonwebtoken @types/jsonwebtoken');\r\n }\r\n return null;\r\n }\r\n }\r\n\r\n // Express middleware for authentication\r\n initialize() {\r\n return (req: any, res: any, next: any) => {\r\n const token = this.extractToken(req);\r\n if (token) {\r\n const decoded = this.verifyToken(token);\r\n if (decoded) {\r\n req.user = decoded;\r\n }\r\n }\r\n next();\r\n };\r\n }\r\n\r\n // Express middleware for requiring authentication\r\n requireAuth() {\r\n return (req: any, res: any, next: any) => {\r\n if (!req.user) {\r\n return res.status(401).json({ message: 'Unauthorized' });\r\n }\r\n return next();\r\n };\r\n }\r\n\r\n // Express middleware for requiring specific roles\r\n requireRoles(roles: string[]) {\r\n return (req: any, res: any, next: any) => {\r\n if (!req.user) {\r\n return res.status(401).json({ message: 'Unauthorized' });\r\n }\r\n \r\n const userRoles = req.user.roles || [];\r\n const hasRequiredRole = roles.some(role => userRoles.includes(role));\r\n \r\n if (!hasRequiredRole) {\r\n return res.status(403).json({ message: 'Forbidden' });\r\n }\r\n \r\n return next();\r\n };\r\n }\r\n\r\n private extractToken(req: any): string | null {\r\n if (req.headers.authorization && req.headers.authorization.startsWith('Bearer ')) {\r\n return req.headers.authorization.substring(7);\r\n }\r\n return null;\r\n }\r\n}\r\n", "import path from 'path';\r\nimport fs from 'fs';\r\nimport { AuthService } from './auth.js';\r\nimport { pathToFileURL } from 'url';\r\n\r\ninterface RouteHandler {\r\n (req: any, res: any, next?: any): void | Promise<void>;\r\n}\r\n\r\ninterface RouteModule {\r\n get?: RouteHandler;\r\n post?: RouteHandler;\r\n put?: RouteHandler;\r\n delete?: RouteHandler;\r\n patch?: RouteHandler;\r\n options?: RouteHandler;\r\n middleware?: ((req: any, res: any, next: any) => void)[];\r\n // Add index signature to allow string indexing\r\n [key: string]: RouteHandler | ((req: any, res: any, next: any) => void)[] | undefined;\r\n}\r\n\r\nexport class ApiRouter {\r\n public router: any;\r\n private apiDir: string;\r\n private auth: AuthService | null;\r\n\r\n constructor(apiDir: string, auth: AuthService | null = null) {\r\n this.router = null;\r\n this.apiDir = path.resolve(process.cwd(), apiDir);\r\n this.auth = auth;\r\n \r\n this.initializeRouter();\r\n }\r\n\r\n private async initializeRouter() {\r\n try {\r\n const express = await import('express');\r\n this.router = express.default.Router();\r\n this.setupRoutes();\r\n } catch (error: any) {\r\n if (error.code === 'MODULE_NOT_FOUND') {\r\n throw new Error('Express not installed. Run: npm install express @types/express');\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n private setupRoutes() {\r\n if (!fs.existsSync(this.apiDir)) {\r\n console.log(`API directory not found: ${this.apiDir}`);\r\n return;\r\n }\r\n\r\n this.scanDirectory(this.apiDir, '');\r\n }\r\n\r\n private scanDirectory(dirPath: string, routePrefix: string) {\r\n const entries = fs.readdirSync(dirPath, { withFileTypes: true });\r\n\r\n for (const entry of entries) {\r\n const fullPath = path.join(dirPath, entry.name);\r\n \r\n if (entry.isDirectory()) {\r\n // Recursively scan subdirectories\r\n this.scanDirectory(fullPath, `${routePrefix}/${entry.name}`);\r\n } else if (this.isRouteFile(entry.name)) {\r\n // Process route file\r\n const routePath = this.getRoutePath(entry.name, routePrefix);\r\n this.registerRoute(fullPath, routePath);\r\n }\r\n }\r\n }\r\n\r\n private isRouteFile(filename: string): boolean {\r\n return filename.endsWith('.js') || \r\n filename.endsWith('.ts') || \r\n filename.endsWith('.mjs');\r\n }\r\n\r\n private getRoutePath(filename: string, routePrefix: string): string {\r\n // Remove extension and handle special names\r\n const baseName = path.basename(filename, path.extname(filename));\r\n \r\n if (baseName === 'index') {\r\n return routePrefix || '/';\r\n }\r\n \r\n // Handle dynamic routes [param]\r\n const paramMatch = baseName.match(/^\\[(.+)\\]$/);\r\n if (paramMatch) {\r\n return `${routePrefix}/:${paramMatch[1]}`;\r\n }\r\n \r\n return `${routePrefix}/${baseName}`;\r\n }\r\n\r\n private async registerRoute(filePath: string, routePath: string) {\r\n try {\r\n // Ensure we have an absolute path and normalize it\r\n const absolutePath = path.isAbsolute(filePath) ? filePath : path.resolve(filePath);\r\n \r\n // Convert to proper file:// URL for Windows\r\n const fileUrl = pathToFileURL(absolutePath).href;\r\n \r\n if (process.platform === 'win32') {\r\n // Add timestamp to force reload on Windows\r\n const urlWithTimestamp = `${fileUrl}?t=${Date.now()}`;\r\n \r\n // Dynamic import the route file\r\n const routeModule = await import(urlWithTimestamp);\r\n \r\n if (!this.isValidRouteModule(routeModule)) {\r\n console.warn(`Invalid route module: ${filePath}`);\r\n return;\r\n }\r\n \r\n console.log(`Registering API route: ${routePath}`);\r\n \r\n // Register middleware if any\r\n const middleware = routeModule.middleware || [];\r\n \r\n // Register HTTP methods\r\n for (const method of ['get', 'post', 'put', 'delete', 'patch', 'options']) {\r\n const handler = routeModule[method];\r\n if (typeof handler === 'function') {\r\n const routerMethod = this.router[method];\r\n routerMethod.call(\r\n this.router,\r\n routePath, \r\n ...middleware,\r\n this.wrapHandler(handler)\r\n );\r\n }\r\n }\r\n } else {\r\n // Non-Windows platforms\r\n const routeModule = await import(fileUrl);\r\n \r\n if (!this.isValidRouteModule(routeModule)) {\r\n console.warn(`Invalid route module: ${filePath}`);\r\n return;\r\n }\r\n \r\n console.log(`Registering API route: ${routePath}`);\r\n \r\n // Register middleware if any\r\n const middleware = routeModule.middleware || [];\r\n \r\n // Register HTTP methods\r\n for (const method of ['get', 'post', 'put', 'delete', 'patch', 'options']) {\r\n const handler = routeModule[method];\r\n if (typeof handler === 'function') {\r\n const routerMethod = this.router[method];\r\n routerMethod.call(\r\n this.router,\r\n routePath, \r\n ...middleware,\r\n this.wrapHandler(handler)\r\n );\r\n }\r\n }\r\n }\r\n } catch (error) {\r\n console.error(`Error registering route (${filePath}):`, error);\r\n }\r\n }\r\n\r\n private isValidRouteModule(module: any): module is RouteModule {\r\n if (!module) return false;\r\n \r\n // Check if at least one HTTP method handler is defined\r\n return ['get', 'post', 'put', 'delete', 'patch', 'options']\r\n .some(method => typeof module[method] === 'function');\r\n }\r\n\r\n private wrapHandler(handler: RouteHandler) {\r\n return async (req: any, res: any, next: any) => {\r\n try {\r\n await handler(req, res, next);\r\n } catch (error) {\r\n next(error);\r\n }\r\n };\r\n }\r\n}\r\n", "import { Request, Response, NextFunction } from 'express';\r\n\r\nexport interface MiddlewareFunction {\r\n (req: any, res: any, next: any): void | Promise<void>;\r\n}\r\n\r\n// Common middleware functions\r\nexport const requestLogger: MiddlewareFunction = (req, res, next) => {\r\n console.log(`${new Date().toISOString()} - ${req.method} ${req.url}`);\r\n next();\r\n};\r\n\r\nexport const errorHandler = (\r\n err: Error, \r\n req: any, \r\n res: any, \r\n next: any\r\n) => {\r\n console.error(err.stack);\r\n res.status(500).json({\r\n error: {\r\n message: 'Internal Server Error',\r\n ...(process.env.NODE_ENV !== 'production' ? { details: err.message, stack: err.stack } : {})\r\n }\r\n });\r\n};\r\n\r\nexport const notFoundHandler = (req: any, res: any) => {\r\n res.status(404).json({\r\n error: {\r\n message: `Not Found - ${req.method} ${req.url}`\r\n }\r\n });\r\n};\r\n\r\n// Middleware for rate limiting\r\nexport function rateLimit(options: { windowMs: number; max: number }) {\r\n const requests = new Map<string, number[]>();\r\n \r\n return (req: any, res: any, next: any) => {\r\n const ip = req.ip || req.socket.remoteAddress || 'unknown';\r\n const now = Date.now();\r\n \r\n // Get existing requests and filter out old ones\r\n const reqTimes = (requests.get(ip) || [])\r\n .filter(time => now - time < options.windowMs);\r\n \r\n // Add current request\r\n reqTimes.push(now);\r\n requests.set(ip, reqTimes);\r\n \r\n // Check if too many requests\r\n if (reqTimes.length > options.max) {\r\n return res.status(429).json({\r\n error: {\r\n message: 'Too Many Requests',\r\n retryAfter: Math.ceil(options.windowMs / 1000)\r\n }\r\n });\r\n }\r\n \r\n return next();\r\n };\r\n}\r\n", "import crypto from 'crypto';\r\nimport fs from 'fs/promises';\r\nimport path from 'path';\r\n\r\n/**\r\n * Utility functions for server-side operations\r\n */\r\n\r\n/**\r\n * Safely parse JSON with error handling\r\n */\r\nexport function safeJsonParse<T>(json: string, fallback: T): T {\r\n try {\r\n return JSON.parse(json) as T;\r\n } catch (error) {\r\n return fallback;\r\n }\r\n}\r\n\r\n/**\r\n * Generate a secure random token\r\n */\r\nexport function generateToken(length: number = 32): string {\r\n return crypto.randomBytes(length).toString('hex');\r\n}\r\n\r\n/**\r\n * Hash a string using SHA-256\r\n */\r\nexport function hashString(input: string, salt: string = ''): string {\r\n return crypto.createHash('sha256').update(input + salt).digest('hex');\r\n}\r\n\r\n/**\r\n * Get pagination parameters from request\r\n */\r\nexport function getPagination(req: any): { page: number; limit: number; skip: number } {\r\n const page = Math.max(1, parseInt(req.query.page as string) || 1);\r\n const rawLimit = parseInt(req.query.limit as string);\r\n \r\n // If no limit is provided or limit is 0/invalid, use default of 20\r\n // If limit is provided and valid, enforce min of 1 and max of 100\r\n let limit: number;\r\n if (isNaN(rawLimit) || rawLimit <= 0) {\r\n limit = 20; // Default limit\r\n } else {\r\n limit = Math.max(1, Math.min(100, rawLimit));\r\n }\r\n \r\n const skip = (page - 1) * limit;\r\n \r\n return { page, limit, skip };\r\n}\r\n\r\n/**\r\n * Standard success response format\r\n */\r\nexport function sendSuccess<T>(res: any, data: T, message: string = 'Success'): any {\r\n return res.json({\r\n success: true,\r\n message,\r\n data\r\n });\r\n}\r\n\r\n/**\r\n * Standard error response format\r\n */\r\nexport function sendError(\r\n res: any, \r\n message: string = 'An error occurred', \r\n statusCode: number = 400,\r\n errors?: any\r\n): any {\r\n return res.status(statusCode).json({\r\n success: false,\r\n message,\r\n errors: errors || undefined\r\n });\r\n}\r\n\r\n/**\r\n * Validate required fields in request body\r\n */\r\nexport function validateFields(\r\n req: any, \r\n requiredFields: string[]\r\n): { valid: boolean; missing: string[] } {\r\n const missing = requiredFields.filter(field => {\r\n const value = req.body[field];\r\n return value === undefined || value === null || value === '';\r\n });\r\n \r\n return {\r\n valid: missing.length === 0,\r\n missing\r\n };\r\n}\r\n\r\n/**\r\n * Handle file upload validation\r\n */\r\nexport function validateFileUpload(\r\n file: any, // Using 'any' to avoid the Express.Multer dependency\r\n options: {\r\n maxSize?: number;\r\n allowedTypes?: string[];\r\n } = {}\r\n): { valid: boolean; error?: string } {\r\n if (!file) {\r\n return { valid: false, error: 'No file provided' };\r\n }\r\n \r\n // Check file size\r\n if (options.maxSize && file.size > options.maxSize) {\r\n return { \r\n valid: false, \r\n error: `File too large. Maximum size allowed is ${options.maxSize / 1024 / 1024}MB` \r\n };\r\n }\r\n \r\n // Check file type\r\n if (options.allowedTypes && options.allowedTypes.length > 0) {\r\n const fileType = file.mimetype;\r\n if (!options.allowedTypes.includes(fileType)) {\r\n return { \r\n valid: false, \r\n error: `Invalid file type. Allowed types: ${options.allowedTypes.join(', ')}` \r\n };\r\n }\r\n }\r\n \r\n return { valid: true };\r\n}\r\n\r\n/**\r\n * Get server environment information\r\n */\r\nexport function getEnvironmentInfo(): Record<string, any> {\r\n return {\r\n nodeVersion: process.version,\r\n platform: process.platform,\r\n arch: process.arch,\r\n memory: process.memoryUsage(),\r\n uptime: process.uptime(),\r\n env: process.env.NODE_ENV || 'development'\r\n };\r\n}\r\n\r\n/**\r\n * Check if a directory is empty\r\n */\r\nexport async function isDirectoryEmpty(dirPath: string): Promise<boolean> {\r\n try {\r\n const files = await fs.readdir(dirPath);\r\n return files.length === 0;\r\n } catch (error) {\r\n // Directory doesn't exist or can't be read\r\n return true;\r\n }\r\n}\r\n\r\n/**\r\n * Create directory if it doesn't exist\r\n */\r\nexport async function ensureDirectory(dirPath: string): Promise<void> {\r\n try {\r\n await fs.access(dirPath);\r\n } catch (error) {\r\n // Directory doesn't exist, create it\r\n await fs.mkdir(dirPath, { recursive: true });\r\n }\r\n}\r\n\r\n/**\r\n * Write JSON to file\r\n */\r\nexport async function writeJsonFile(filePath: string, data: any): Promise<void> {\r\n await ensureDirectory(path.dirname(filePath));\r\n await fs.writeFile(filePath, JSON.stringify(data, null, 2), 'utf8');\r\n}\r\n\r\n/**\r\n * Read JSON from file\r\n */\r\nexport async function readJsonFile<T>(filePath: string, defaultValue: T): Promise<T> {\r\n try {\r\n const data = await fs.readFile(filePath, 'utf8');\r\n return safeJsonParse<T>(data, defaultValue);\r\n } catch (error) {\r\n return defaultValue;\r\n }\r\n}\r\n", "/**\r\n * HTML template generators for server-side rendering\r\n */\r\n\r\nexport interface DocumentOptions {\r\n title?: string;\r\n description?: string;\r\n lang?: string;\r\n charset?: string;\r\n viewport?: string;\r\n scripts?: string[];\r\n styles?: string[];\r\n meta?: Record<string, string>;\r\n bodyClasses?: string;\r\n htmlAttrs?: Record<string, string>;\r\n bodyAttrs?: Record<string, string>;\r\n initialData?: any;\r\n componentName?: string;\r\n}\r\n\r\n/**\r\n * Generate a complete HTML document\r\n */\r\nexport function generateDocument(\r\n content: string, \r\n options: DocumentOptions = {}\r\n): string {\r\n const {\r\n title = 'Frontend Hamroun App',\r\n description = '',\r\n lang = 'en',\r\n charset = 'UTF-8',\r\n viewport = 'width=device-width, initial-scale=1.0',\r\n scripts = [],\r\n styles = [],\r\n meta = {},\r\n bodyClasses = '',\r\n htmlAttrs = {},\r\n bodyAttrs = {},\r\n initialData = {},\r\n componentName = ''\r\n } = options;\r\n \r\n // Generate HTML attributes\r\n const htmlAttributes = Object.entries(htmlAttrs)\r\n .map(([key, value]) => `${key}=\"${escapeHtml(value)}\"`)\r\n .join(' ');\r\n \r\n // Generate body attributes\r\n const bodyAttributes = Object.entries(bodyAttrs)\r\n .map(([key, value]) => `${key}=\"${escapeHtml(value)}\"`)\r\n .join(' ');\r\n \r\n // Generate meta tags\r\n const metaTags = [\r\n `<meta charset=\"${charset}\">`,\r\n `<meta name=\"viewport\" content=\"${viewport}\">`,\r\n description ? `<meta name=\"description\" content=\"${escapeHtml(description)}\">` : ''\r\n ];\r\n \r\n // Add custom meta tags\r\n Object.entries(meta).forEach(([name, content]) => {\r\n metaTags.push(`<meta name=\"${escapeHtml(name)}\" content=\"${escapeHtml(content)}\">`);\r\n });\r\n \r\n // Generate script tags\r\n const scriptTags = scripts.map(src => {\r\n if (src.startsWith('<script')) {\r\n return src; // Allow inline scripts\r\n }\r\n return `<script src=\"${escapeHtml(src)}\" ${src.endsWith('.js') ? 'type=\"module\"' : ''} defer></script>`;\r\n });\r\n \r\n // Generate style tags\r\n const styleTags = styles.map(href => {\r\n if (href.startsWith('<style')) {\r\n return href; // Allow inline styles\r\n }\r\n return `<link rel=\"stylesheet\" href=\"${escapeHtml(href)}\">`;\r\n });\r\n \r\n // Create initial data script\r\n const initialDataScript = Object.keys(initialData).length > 0 ? \r\n `<script id=\"__APP_DATA__\" type=\"application/json\">${escapeHtml(JSON.stringify(initialData))}</script>` : '';\r\n \r\n // Create the complete HTML document\r\n return `<!DOCTYPE html>\r\n<html lang=\"${lang}\" ${htmlAttributes}>\r\n<head>\r\n ${metaTags.filter(Boolean).join('\\n ')}\r\n <title>${escapeHtml(title)}</title>\r\n ${styleTags.join('\\n ')}\r\n</head>\r\n<body class=\"${bodyClasses}\" ${bodyAttributes}>\r\n <div id=\"app-root\" data-ssr-root${componentName ? ` data-component=\"${escapeHtml(componentName)}\"` : ''}>${content}</div>\r\n ${initialDataScript}\r\n ${scriptTags.join('\\n ')}\r\n</body>\r\n</html>`;\r\n}\r\n\r\n/**\r\n * Generate an error page\r\n */\r\nexport function generateErrorPage(\r\n statusCode: number, \r\n message: string, \r\n error?: Error\r\n): string {\r\n const errorMessages: Record<number, string> = {\r\n 400: 'Bad Request',\r\n 401: 'Unauthorized',\r\n 403: 'Forbidden',\r\n 404: 'Not Found',\r\n 500: 'Internal Server Error'\r\n };\r\n \r\n const title = `${statusCode} - ${errorMessages[statusCode] || 'Error'}`;\r\n \r\n // Generate error details (only in development)\r\n const isDev = process.env.NODE_ENV !== 'production';\r\n const errorDetails = isDev && error ? `\r\n <div class=\"error-details\">\r\n <pre>${escapeHtml(error.stack || error.message)}</pre>\r\n </div>\r\n ` : '';\r\n \r\n // Create error content\r\n const content = `\r\n <div class=\"error-container\">\r\n <h1>${statusCode}</h1>\r\n <h2>${escapeHtml(errorMessages[statusCode] || 'Error')}</h2>\r\n <p>${escapeHtml(message)}</p>\r\n ${errorDetails}\r\n <a href=\"/\" class=\"home-link\">Back to Home</a>\r\n </div>\r\n `;\r\n \r\n // Add error page styling\r\n const styles = [`<style>\r\n body {\r\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n min-height: 100vh;\r\n margin: 0;\r\n background-color: #f7f7f7;\r\n color: #333;\r\n }\r\n .error-container {\r\n text-align: center;\r\n padding: 2rem;\r\n border-radius: 8px;\r\n background-color: white;\r\n box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);\r\n max-width: 600px;\r\n width: 100%;\r\n }\r\n h1 {\r\n font-size: 6rem;\r\n margin: 0;\r\n color: #e74c3c;\r\n }\r\n h2 {\r\n margin-top: 0;\r\n margin-bottom: 1rem;\r\n color: #333;\r\n }\r\n .error-details {\r\n text-align: left;\r\n margin: 2rem 0;\r\n padding: 1rem;\r\n background-color: #f8f8f8;\r\n border-radius: 4px;\r\n overflow: auto;\r\n }\r\n pre {\r\n margin: 0;\r\n font-family: monospace;\r\n font-size: 0.85rem;\r\n white-space: pre-wrap;\r\n }\r\n .home-link {\r\n display: inline-block;\r\n margin-top: 1.5rem;\r\n padding: 0.75rem 1.5rem;\r\n background-color: #3498db;\r\n color: white;\r\n text-decoration: none;\r\n border-radius: 4px;\r\n transition: background-color 0.2s;\r\n }\r\n .home-link:hover {\r\n background-color: #2980b9;\r\n }\r\n </style>`];\r\n \r\n return generateDocument(content, {\r\n title,\r\n description: `Error ${statusCode}: ${errorMessages[statusCode] || 'Error'}`,\r\n bodyClasses: 'error-page',\r\n styles\r\n });\r\n}\r\n\r\n/**\r\n * Generate a loading page\r\n */\r\nexport function generateLoadingPage(message: string = 'Loading...'): string {\r\n const content = `\r\n <div class=\"loading-container\">\r\n <div class=\"spinner\"></div>\r\n <p>${escapeHtml(message)}</p>\r\n </div>\r\n `;\r\n \r\n const styles = [`<style>\r\n body {\r\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n min-height: 100vh;\r\n margin: 0;\r\n background-color: #f7f7f7;\r\n color: #333;\r\n }\r\n .loading-container {\r\n text-align: center;\r\n }\r\n .spinner {\r\n width: 50px;\r\n height: 50px;\r\n border: 5px solid rgba(0, 0, 0, 0.1);\r\n border-radius: 50%;\r\n border-top-color: #3498db;\r\n animation: spin 1s ease-in-out infinite;\r\n margin: 0 auto 20px;\r\n }\r\n @keyframes spin {\r\n to { transform: rotate(360deg); }\r\n }\r\n </style>`];\r\n \r\n return generateDocument(content, {\r\n title: 'Loading',\r\n bodyClasses: 'loading-page',\r\n styles\r\n });\r\n}\r\n\r\n/**\r\n * Escape HTML special characters\r\n */\r\nfunction escapeHtml(text: string): string {\r\n return String(text)\r\n .replace(/&/g, '&amp;')\r\n .replace(/</g, '&lt;')\r\n .replace(/>/g, '&gt;')\r\n .replace(/\"/g, '&quot;')\r\n .replace(/'/g, '&#039;');\r\n}\r\n", "/**\r\n * Server-side Go WASM integration for Node.js\r\n * Uses the standard Go WASM runtime (wasm_exec.js)\r\n */\r\nimport fs from 'fs/promises';\r\nimport path from 'path';\r\nimport { pathToFileURL } from 'url';\r\nimport { GoWasmInstance, GoWasmOptions } from '../server/types.js';\r\n\r\n// Global flag to ensure we only initialize WASM once\r\nlet initialized = false;\r\n\r\n/**\r\n * Initialize the Node.js environment for running Go WASM modules\r\n */\r\nexport async function initNodeWasm(): Promise<void> {\r\n if (initialized) return;\r\n \r\n try {\r\n // Global WASM environment setup for Node.js\r\n globalThis.TextEncoder = globalThis.TextEncoder || TextEncoder;\r\n globalThis.TextDecoder = globalThis.TextDecoder || TextDecoder;\r\n \r\n // Mark as initialized\r\n initialized = true;\r\n } catch (error) {\r\n console.error('[WASM] Failed to initialize Node.js WASM environment:', error);\r\n throw error;\r\n }\r\n}\r\n\r\n/**\r\n * Load Go WASM runtime from wasm_exec.js file\r\n */\r\nasync function loadGoRuntime(goWasmPath?: string): Promise<any> {\r\n if (typeof global.Go === 'function') {\r\n return global.Go;\r\n }\r\n\r\n // Try to find wasm_exec.js or wasm_exec.cjs\r\n const possiblePaths = [\r\n goWasmPath,\r\n './wasm_exec.cjs',\r\n './wasm_exec.js',\r\n './public/wasm_exec.cjs',\r\n './public/wasm_exec.js',\r\n './src/wasm_exec.cjs',\r\n './src/wasm_exec.js',\r\n path.join(process.cwd(), 'wasm_exec.cjs'),\r\n path.join(process.cwd(), 'wasm_exec.js'),\r\n path.join(process.cwd(), 'public', 'wasm_exec.cjs'),\r\n path.join(process.cwd(), 'public', 'wasm_exec.js'),\r\n path.join(process.cwd(), 'src', 'wasm_exec.cjs'),\r\n path.join(process.cwd(), 'src', 'wasm_exec.js')\r\n ].filter(Boolean);\r\n\r\n for (const wasmExecPath of possiblePaths) {\r\n try {\r\n const resolvedPath = path.resolve(wasmExecPath!);\r\n \r\n // Check if file exists using fs.stat instead of fs.access\r\n try {\r\n const stats = await fs.stat(resolvedPath);\r\n if (!stats.isFile()) {\r\n continue;\r\n }\r\n } catch (statError) {\r\n continue; // File doesn't exist, try next path\r\n }\r\n \r\n // Load the Go runtime using dynamic import with file:// URL\r\n const wasmExecUrl = pathToFileURL(resolvedPath).href;\r\n \r\n // Clear global.Go to ensure fresh import\r\n if (global.Go) {\r\n delete (global as any).Go;\r\n }\r\n \r\n // Import the module\r\n await import(wasmExecUrl);\r\n \r\n if (typeof global.Go === 'function') {\r\n console.log(`[WASM] Loaded Go runtime from: ${resolvedPath}`);\r\n return global.Go;\r\n } else {\r\n console.warn(`[WASM] File found but Go class not exported: ${resolvedPath}`);\r\n }\r\n } catch (error: any) {\r\n console.warn(`[WASM] Error loading from ${wasmExecPath}:`, error.message);\r\n continue;\r\n }\r\n }\r\n\r\n throw new Error(\r\n '[WASM] Could not find wasm_exec.js. Please ensure you have the Go WASM runtime file available.\\n' +\r\n 'You can get it from: https://github.com/golang/go/blob/master/misc/wasm/wasm_exec.js\\n' +\r\n `Searched paths: ${possiblePaths.join(', ')}`\r\n );\r\n}\r\n\r\n/**\r\n * Load a Go WASM module from a file path for server-side usage\r\n */\r\nexport async function loadGoWasmFromFile(\r\n wasmFilePath: string,\r\n options: GoWasmOptions = {}\r\n): Promise<GoWasmInstance> {\r\n try {\r\n // Initialize Node.js WASM environment\r\n await initNodeWasm();\r\n \r\n if (options.debug) {\r\n console.log('[WASM] Loading WASM from file:', wasmFilePath);\r\n }\r\n\r\n // Load the standard Go runtime\r\n const GoRuntime = await loadGoRuntime(options.goWasmPath);\r\n const go = new GoRuntime();\r\n \r\n // Load WASM binary\r\n const wasmBuffer = await fs.readFile(wasmFilePath);\r\n const wasmModule = await WebAssembly.compile(wasmBuffer);\r\n \r\n // The updated wasm_exec.js provides imports under 'gojs' instead of 'go'\r\n // Create imports object with the correct structure\r\n const baseImports = go.importObject;\r\n const finalImportObject = {\r\n ...baseImports,\r\n ...options.importObject\r\n };\r\n \r\n if (options.debug) {\r\n console.log('[WASM] Available import modules:', Object.keys(finalImportObject));\r\n \r\n // Debug each module's functions\r\n for (const [moduleName, moduleExports] of Object.entries(finalImportObject)) {\r\n if (typeof moduleExports === 'object' && moduleExports !== null) {\r\n const exportNames = Object.keys(moduleExports);\r\n console.log(`[WASM] ${moduleName} import functions:`, exportNames);\r\n }\r\n }\r\n }\r\n \r\n // Instantiate the WASM module\r\n const instance = await WebAssembly.instantiate(wasmModule, finalImportObject);\r\n \r\n if (options.debug) {\r\n console.log('[WASM] WASM instance created, starting Go runtime...');\r\n }\r\n \r\n // Initialize Go runtime - this will run the main function\r\n // The go.run() method returns a promise that resolves when the program exits\r\n const runPromise = go.run(instance);\r\n \r\n if (options.debug) {\r\n console.log('[WASM] Go runtime started, waiting for initialization...');\r\n }\r\n \r\n // Give Go runtime time to initialize and register functions\r\n // Don't wait for the program to finish, just wait for functions to be registered\r\n await new Promise(resolve => setTimeout(resolve, 2000));\r\n \r\n if (options.debug) {\r\n console.log('[WASM] Scanning global object for Go functions...');\r\n }\r\n \r\n // Extract exported functions from global scope\r\n const functions: Record<string, Function> = {};\r\n const globalObj = global as any;\r\n \r\n // Scan for Go functions\r\n const allKeys = Object.getOwnPropertyNames(globalObj);\r\n const goKeys = allKeys.filter(key => key.startsWith('go'));\r\n \r\n if (options.debug) {\r\n console.log('[WASM] All keys starting with \"go\":', goKeys);\r\n }\r\n \r\n for (const key of goKeys) {\r\n if (typeof globalObj[key] === 'function') {\r\n functions[key] = globalObj[key];\r\n if (options.debug) {\r\n console.log(`[WASM] Found function: ${key}`);\r\n }\r\n }\r\n }\r\n\r\n const wasmInstance: GoWasmInstance = {\r\n instance,\r\n module: wasmModule,\r\n exports: instance.exports,\r\n functions\r\n };\r\n \r\n // Run onLoad callback if provided\r\n if (options.onLoad) {\r\n options.onLoad(wasmInstance);\r\n }\r\n \r\n if (options.debug) {\r\n console.log(`[WASM] Module loaded successfully with ${Object.keys(functions).length} functions`);\r\n console.log('[WASM] Final function list:', Object.keys(functions));\r\n }\r\n \r\n // Don't await the runPromise - let the Go program finish in the background\r\n // The functions are already registered and available\r\n runPromise.catch((error:any)=> {\r\n if (options.debug) {\r\n console.log('[WASM] Go program finished with error:', error);\r\n }\r\n });\r\n \r\n return wasmInstance;\r\n } catch (error) {\r\n console.error('[WASM] Failed to load Go WASM module:', error);\r\n throw error;\r\n }\r\n}\r\n\r\n/**\r\n * Call a Go WASM function in Node.js environment\r\n */\r\nexport function callWasmFunction(funcName: string, ...args: any[]): any {\r\n const func = (global as any)[funcName];\r\n if (typeof func !== 'function') {\r\n throw new Error(`Function ${funcName} not found. Make sure the WASM module is loaded.`);\r\n }\r\n \r\n return func(...args);\r\n}\r\n\r\n/**\r\n * Check if Go WASM is ready in Node.js\r\n */\r\nexport function isWasmReady(): boolean {\r\n const globalObj = global as any;\r\n return Object.keys(globalObj).some(key => \r\n key.startsWith('go') && typeof globalObj[key] === 'function'\r\n );\r\n}\r\n\r\n/**\r\n * Get all available Go WASM functions in Node.js\r\n */\r\nexport function getWasmFunctions(): string[] {\r\n const globalObj = global as any;\r\n return Object.keys(globalObj).filter(key => \r\n key.startsWith('go') && typeof globalObj[key] === 'function'\r\n );\r\n}\r\n\r\n// Extend global for Go runtime\r\ndeclare global {\r\n var Go: new () => {\r\n importObject: any;\r\n run: (instance: WebAssembly.Instance) => Promise<void>;\r\n };\r\n}\r\n\r\nexport type { GoWasmInstance, GoWasmOptions };\r\n"],
5
+ "mappings": "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",
6
6
  "names": ["path", "fs", "fs", "path", "content", "fs", "path", "pathToFileURL", "path", "fs", "renderToString"]
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "baraqex",
3
- "version": "1.0.47",
3
+ "version": "1.0.48",
4
4
  "description": "A powerful server-side framework built on Frontend Hamroun",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -11,9 +11,9 @@
11
11
  "test": "echo 'No tests specified' && exit 0"
12
12
  },
13
13
  "dependencies": {
14
- "baraqex": "file:../../",
15
14
  "express": "^4.18.2",
16
- "cors": "^2.8.5"
15
+ "cors": "^2.8.5",
16
+ "frontend-hamroun": "latest"
17
17
  },
18
18
  "devDependencies": {
19
19
  "@types/express": "^4.17.17",
@@ -23,7 +23,8 @@
23
23
  "baraqex",
24
24
  "fullstack",
25
25
  "express",
26
- "api"
26
+ "api",
27
+ "ssr"
27
28
  ],
28
29
  "author": "",
29
30
  "license": "MIT"