baraqex 2.0.2 → 2.0.4
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.
- package/dist/browser.js +11 -9
- package/dist/browser.js.map +2 -2
- package/dist/core/jsx-runtime.d.ts +1 -1
- package/dist/core/jsx-runtime.d.ts.map +1 -1
- package/dist/index.js +12 -10
- package/dist/index.js.map +2 -2
- package/dist/server/index.js +1 -1
- package/dist/server/index.js.map +2 -2
- package/package.json +1 -1
- package/templates/fullstack-app/README.md +62 -37
- package/templates/fullstack-app/build-wasm.js +80 -0
- package/templates/fullstack-app/build.mjs +133 -0
- package/templates/fullstack-app/go/main.go +53 -0
- package/templates/fullstack-app/index.html +16 -36
- package/templates/fullstack-app/package.json +41 -35
- package/templates/fullstack-app/postcss.config.js +6 -6
- package/templates/fullstack-app/public/wasm/.gitkeep +1 -0
- package/templates/fullstack-app/server.ts +220 -474
- package/templates/fullstack-app/src/App.tsx +77 -0
- package/templates/fullstack-app/src/main.tsx +31 -155
- package/templates/fullstack-app/src/pages/About.tsx +40 -0
- package/templates/fullstack-app/src/pages/Home.tsx +67 -0
- package/templates/fullstack-app/src/pages/WasmDemo.tsx +81 -0
- package/templates/fullstack-app/src/styles.css +12 -5
- package/templates/fullstack-app/tailwind.config.js +8 -11
- package/templates/fullstack-app/tsconfig.json +18 -18
- package/templates/fullstack-app/api/hello.js +0 -11
- package/templates/fullstack-app/api/hello.ts +0 -18
- package/templates/fullstack-app/api/users/[id].ts +0 -73
- package/templates/fullstack-app/api/users/index.ts +0 -32
- package/templates/fullstack-app/build/main.css +0 -874
- package/templates/fullstack-app/build/main.css.map +0 -7
- package/templates/fullstack-app/build/main.js +0 -967
- package/templates/fullstack-app/build/main.js.map +0 -7
- package/templates/fullstack-app/build.ts +0 -210
- package/templates/fullstack-app/process-tailwind.js +0 -45
- package/templates/fullstack-app/public/_redirects +0 -1
- package/templates/fullstack-app/public/route-handler.js +0 -47
- package/templates/fullstack-app/public/spa-fix.html +0 -17
- package/templates/fullstack-app/public/styles.css +0 -975
- package/templates/fullstack-app/public/tailwind.css +0 -15
- package/templates/fullstack-app/server.js +0 -267
- package/templates/fullstack-app/src/README.md +0 -55
- package/templates/fullstack-app/src/client.js +0 -87
- package/templates/fullstack-app/src/components/ClientHome.tsx +0 -0
- package/templates/fullstack-app/src/components/ErrorBoundary.tsx +0 -36
- package/templates/fullstack-app/src/components/Layout.tsx +0 -42
- package/templates/fullstack-app/src/components/StateDemo.tsx +0 -207
- package/templates/fullstack-app/src/components/UserList.tsx +0 -44
- package/templates/fullstack-app/src/config.ts +0 -42
- package/templates/fullstack-app/src/data/api.ts +0 -206
- package/templates/fullstack-app/src/middleware.ts +0 -28
- package/templates/fullstack-app/src/pages/404.tsx +0 -28
- package/templates/fullstack-app/src/pages/[id].tsx +0 -0
- package/templates/fullstack-app/src/pages/_app.tsx +0 -11
- package/templates/fullstack-app/src/pages/_document.tsx +0 -25
- package/templates/fullstack-app/src/pages/_error.tsx +0 -45
- package/templates/fullstack-app/src/pages/about/index.tsx +0 -67
- package/templates/fullstack-app/src/pages/about.tsx +0 -71
- package/templates/fullstack-app/src/pages/api/users/[id].ts +0 -73
- package/templates/fullstack-app/src/pages/api/users/index.ts +0 -43
- package/templates/fullstack-app/src/pages/index.tsx +0 -110
- package/templates/fullstack-app/src/pages/users/[id].tsx +0 -153
- package/templates/fullstack-app/src/pages/users.tsx +0 -60
- package/templates/fullstack-app/src/pages/wasm-demo.tsx +0 -1
- package/templates/fullstack-app/src/router.ts +0 -255
- package/templates/fullstack-app/vite.config.js +0 -87
package/dist/server/index.js
CHANGED
|
@@ -1062,7 +1062,7 @@ var Server = class {
|
|
|
1062
1062
|
if (fs4.existsSync(staticPath)) {
|
|
1063
1063
|
this.app.use(express.default.static(staticPath));
|
|
1064
1064
|
}
|
|
1065
|
-
this.setupApiRoutes();
|
|
1065
|
+
await this.setupApiRoutes();
|
|
1066
1066
|
this.setupPageRoutes();
|
|
1067
1067
|
this.app.use(notFoundHandler);
|
|
1068
1068
|
this.app.use(errorHandler);
|
package/dist/server/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/server/index.ts", "../../src/core/hooks.ts", "../../src/core/server-renderer.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 '../core/server-renderer.js';\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\nimport { pathToFileURL } from 'url';\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 here - call it in start() instead\r\n }\r\n\r\n private async initializeApp() {\r\n if (this.initialized) return;\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 \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 async setupApiRoutes() {\r\n const apiRouter = new ApiRouter(this.config.apiDir!, this.auth);\r\n \r\n // Initialize the router properly and wait for completion\r\n await apiRouter.initialize();\r\n \r\n // Double-check if router was created successfully\r\n if (!apiRouter.isInitialized() || !apiRouter.router) {\r\n console.warn('\u26A0\uFE0F API router not initialized properly - skipping API routes');\r\n return;\r\n }\r\n \r\n console.log('\u2705 Setting up API routes...');\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 // Fix the Windows ESM import issue by using pathToFileURL\r\n const absolutePath = path.isAbsolute(pagePath) ? pagePath : path.resolve(pagePath);\r\n const fileUrl = pathToFileURL(absolutePath).href;\r\n const urlWithTimestamp = `${fileUrl}?t=${Date.now()}`;\r\n \r\n const pageModule = await import(urlWithTimestamp);\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 // Render the component to HTML\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 (it's already a string)\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 await this.initializeApp();\r\n \r\n return new Promise((resolve) => {\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 }\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 'baraqex';\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 return synchronous result\r\nexport const renderComponent = (Component: any, props: any = {}) => {\r\n try {\r\n // Create HTML string from component using synchronous renderToString\r\n const html = renderToString(Component(props));\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</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", "/**\n * Hooks Implementation\n *\n * Each render root maintains its own isolated state via a RootState object.\n * The module-level currentRoot/currentComponentId/hookIndex are set before\n * each render call so hooks can find their data.\n */\n\nimport { createContext, useContext } from './context.js';\n\n// ---------------------------------------------------------------------------\n// Root-scoped state store\n// ---------------------------------------------------------------------------\n\nexport interface ComponentState {\n states: any[];\n effects: { callback: () => void | (() => void); deps?: any[]; cleanup?: () => void }[];\n memos: { value: any; deps?: any[] }[];\n refs: { current: any }[];\n}\n\nexport interface RootState {\n id: number;\n components: Map<number, ComponentState>;\n nextComponentId: number;\n renderCallback: ((element: any, container: HTMLElement) => Promise<void>) | null;\n container: HTMLElement | null;\n currentElement: any;\n}\n\nlet rootIdCounter = 0;\n\nexport function createRootState(): RootState {\n return {\n id: ++rootIdCounter,\n components: new Map(),\n nextComponentId: 0,\n renderCallback: null,\n container: null,\n currentElement: null\n };\n}\n\n// ---------------------------------------------------------------------------\n// Current render context (set per render call)\n// ---------------------------------------------------------------------------\n\nlet currentRoot: RootState | null = null;\nlet currentComponentId: number | null = null;\nlet hookIndex = 0;\n\nconst isServer = typeof window === 'undefined';\n\n// ---------------------------------------------------------------------------\n// Render lifecycle helpers\n// ---------------------------------------------------------------------------\n\nexport function prepareRender(root?: RootState, componentId?: number): number {\n if (root) {\n currentRoot = root;\n }\n if (componentId !== undefined) {\n currentComponentId = componentId;\n } else if (currentRoot) {\n currentComponentId = ++currentRoot.nextComponentId;\n }\n hookIndex = 0;\n return currentComponentId || 0;\n}\n\nexport function finishRender(): void {\n currentComponentId = null;\n}\n\nexport function getCurrentRoot(): RootState | null {\n return currentRoot;\n}\n\nexport function setCurrentRoot(root: RootState | null): void {\n currentRoot = root;\n}\n\nexport function getComponentState(root: RootState, compId: number): ComponentState {\n let state = root.components.get(compId);\n if (!state) {\n state = { states: [], effects: [], memos: [], refs: [] };\n root.components.set(compId, state);\n }\n return state;\n}\n\n// ---------------------------------------------------------------------------\n// setRenderCallback \u2014 bind a root to a re-render function\n// ---------------------------------------------------------------------------\n\nexport function setRenderCallback(\n callback: (element: any, container: HTMLElement) => Promise<void>,\n element: any,\n container: HTMLElement\n): void {\n if (!currentRoot) return;\n currentRoot.renderCallback = callback;\n currentRoot.currentElement = element;\n currentRoot.container = container;\n}\n\nexport function getCurrentRender(): number {\n return currentComponentId || 0;\n}\n\n// ---------------------------------------------------------------------------\n// Hooks\n// ---------------------------------------------------------------------------\n\n/**\n * useState \u2014 manages component state\n */\nexport function useState<T>(initial: T): [T, (newValue: T | ((prev: T) => T)) => void] {\n const root = currentRoot;\n const compId = currentComponentId;\n\n if (!root || compId === null) {\n if (isServer) {\n // During SSR, return the initial value with a no-op setter\n return [initial, () => {}];\n }\n console.warn('useState called outside of render context');\n return [initial, () => {}];\n }\n\n const compState = getComponentState(root, compId);\n const currentIndex = hookIndex;\n hookIndex++;\n\n if (currentIndex >= compState.states.length) {\n compState.states.push(initial);\n }\n\n const state = compState.states[currentIndex];\n\n const setState = (newValue: T | ((prev: T) => T)) => {\n const currentState = compState.states[currentIndex];\n const value = typeof newValue === 'function'\n ? (newValue as (prev: T) => T)(currentState)\n : newValue;\n\n if (Object.is(currentState, value)) return;\n\n compState.states[currentIndex] = value;\n\n // Trigger re-render via root's callback\n if (root.renderCallback && root.container && root.currentElement) {\n root.renderCallback(root.currentElement, root.container);\n }\n };\n\n return [state, setState];\n}\n\n/**\n * useEffect \u2014 handles side effects, runs after render\n */\nexport function useEffect(callback: () => void | (() => void), deps?: any[]): void {\n const root = currentRoot;\n const compId = currentComponentId;\n if (!root || compId === null || isServer) return;\n\n const compState = getComponentState(root, compId);\n const currentIndex = hookIndex;\n hookIndex++;\n\n const prevEffect = compState.effects[currentIndex];\n\n const shouldRun = !prevEffect || !deps || !prevEffect.deps ||\n deps.some((dep, i) => !Object.is(dep, prevEffect.deps?.[i]));\n\n if (shouldRun) {\n if (prevEffect?.cleanup) {\n prevEffect.cleanup();\n }\n\n queueMicrotask(() => {\n const cleanup = callback();\n compState.effects[currentIndex] = {\n callback,\n deps,\n cleanup: typeof cleanup === 'function' ? cleanup : undefined\n };\n });\n }\n\n if (!prevEffect) {\n compState.effects.push({ callback, deps });\n }\n}\n\n/**\n * useLayoutEffect \u2014 runs synchronously after DOM mutations (client only)\n */\nexport function useLayoutEffect(callback: () => void | (() => void), deps?: any[]): void {\n if (isServer) return;\n\n const root = currentRoot;\n const compId = currentComponentId;\n if (!root || compId === null) return;\n\n const compState = getComponentState(root, compId);\n const currentIndex = hookIndex;\n hookIndex++;\n\n const prevEffect = compState.effects[currentIndex];\n\n const shouldRun = !prevEffect || !deps || !prevEffect.deps ||\n deps.some((dep, i) => !Object.is(dep, prevEffect.deps?.[i]));\n\n if (shouldRun) {\n if (prevEffect?.cleanup) {\n prevEffect.cleanup();\n }\n\n // Run synchronously (unlike useEffect which uses queueMicrotask)\n const cleanup = callback();\n compState.effects[currentIndex] = {\n callback,\n deps,\n cleanup: typeof cleanup === 'function' ? cleanup : undefined\n };\n }\n\n if (!prevEffect) {\n compState.effects.push({ callback, deps });\n }\n}\n\n/**\n * useMemo \u2014 memoizes expensive computations\n */\nexport function useMemo<T>(factory: () => T, deps?: any[]): T {\n const root = currentRoot;\n const compId = currentComponentId;\n\n if (!root || compId === null) {\n return factory();\n }\n\n const compState = getComponentState(root, compId);\n const currentIndex = hookIndex;\n hookIndex++;\n\n const prevMemo = compState.memos[currentIndex];\n\n const shouldRecalculate = !prevMemo || !deps || !prevMemo.deps ||\n deps.some((dep, i) => !Object.is(dep, prevMemo.deps?.[i]));\n\n if (shouldRecalculate) {\n const value = factory();\n compState.memos[currentIndex] = { value, deps };\n return value;\n }\n\n return prevMemo.value;\n}\n\n/**\n * useCallback \u2014 memoizes callbacks\n */\nexport function useCallback<T extends (...args: any[]) => any>(\n callback: T,\n deps: any[]\n): T {\n return useMemo(() => callback, deps);\n}\n\n/**\n * useRef \u2014 creates a mutable ref object\n */\nexport function useRef<T>(initial: T): { current: T } {\n const root = currentRoot;\n const compId = currentComponentId;\n\n if (!root || compId === null) {\n return { current: initial };\n }\n\n const compState = getComponentState(root, compId);\n const currentIndex = hookIndex;\n hookIndex++;\n\n if (compState.refs[currentIndex] === undefined) {\n compState.refs[currentIndex] = { current: initial };\n }\n\n return compState.refs[currentIndex];\n}\n\n/**\n * useReducer \u2014 manages complex state with a reducer\n */\nexport function useReducer<S, A>(\n reducer: (state: S, action: A) => S,\n initialState: S\n): [S, (action: A) => void] {\n const [state, setState] = useState(initialState);\n\n const dispatch = (action: A) => {\n setState((prevState) => reducer(prevState, action));\n };\n\n return [state, dispatch];\n}\n\n/**\n * useErrorBoundary \u2014 catches errors in child components\n */\nexport function useErrorBoundary(): [Error | null, () => void] {\n const [error, setError] = useState<Error | null>(null);\n const resetError = () => setError(null);\n return [error, resetError];\n}\n\n/**\n * useId \u2014 generates stable unique IDs\n */\nlet idCounter = 0;\nexport function useId(): string {\n const ref = useRef<string | null>(null);\n if (ref.current === null) {\n ref.current = `baraqex-id-${++idCounter}`;\n }\n return ref.current;\n}\n\n/**\n * Cleanup all hook state for a component within a root\n */\nexport function cleanupHooks(root: RootState, compId: number): void {\n const compState = root.components.get(compId);\n if (compState) {\n compState.effects.forEach(effect => {\n if (effect.cleanup) effect.cleanup();\n });\n root.components.delete(compId);\n }\n}\n\n/**\n * Cleanup all state for an entire root\n */\nexport function cleanupRoot(root: RootState): void {\n root.components.forEach((compState) => {\n compState.effects.forEach(effect => {\n if (effect.cleanup) effect.cleanup();\n });\n });\n root.components.clear();\n}\n\n// Re-export context hooks\nexport { createContext, useContext };\n", "/**\r\n * Server-side rendering - converts virtual DOM to HTML strings\r\n */\r\n\r\nimport { VNode } from './types.js';\r\nimport { prepareRender, finishRender } from './hooks.js';\r\n\r\ntype Component = (props: any) => any;\r\n\r\n// Self-closing HTML tags\r\nconst VOID_ELEMENTS = new Set([\r\n 'area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input',\r\n 'link', 'meta', 'param', 'source', 'track', 'wbr'\r\n]);\r\n\r\n/**\r\n * Renders a virtual DOM tree to an HTML string\r\n */\r\nexport function renderToString(vnode: VNode | any): string {\r\n // Reset hook state for this render\r\n prepareRender();\r\n \r\n try {\r\n // Render the tree to HTML\r\n return renderNodeToString(vnode);\r\n } finally {\r\n // Clean up after rendering\r\n finishRender();\r\n }\r\n}\r\n\r\n/**\r\n * Renders to string with data for hydration\r\n */\r\nexport function renderToStringWithData(vnode: VNode | any): { html: string; data: any } {\r\n const html = renderToString(vnode);\r\n return { html, data: {} };\r\n}\r\n\r\n/**\r\n * Stream rendering for large pages\r\n */\r\nexport async function* renderToStream(vnode: VNode | any): AsyncGenerator<string> {\r\n yield renderToString(vnode);\r\n}\r\n\r\n/**\r\n * Internal function to convert a virtual node to an HTML string\r\n */\r\nfunction renderNodeToString(vnode: VNode | string | number | boolean | null | undefined | any[]): string {\r\n // Handle primitive values\r\n if (vnode === null || vnode === undefined) return '';\r\n if (typeof vnode === 'boolean') return '';\r\n if (typeof vnode === 'number' || typeof vnode === 'string') return escapeHtml(String(vnode));\r\n \r\n // Handle arrays\r\n if (Array.isArray(vnode)) {\r\n return vnode.map(child => renderNodeToString(child)).join('');\r\n }\r\n \r\n // Handle objects without type (not VNode)\r\n if (typeof vnode !== 'object' || vnode.type === undefined) {\r\n return escapeHtml(String(vnode));\r\n }\r\n \r\n const { type, props } = vnode;\r\n \r\n // Handle function components\r\n if (typeof type === 'function') {\r\n // Handle Fragment\r\n if (type.name === 'Fragment' || (type as unknown) === Symbol.for('react.fragment')) {\r\n const children = props?.children;\r\n if (children == null) return '';\r\n return Array.isArray(children)\r\n ? children.map(child => renderNodeToString(child)).join('')\r\n : renderNodeToString(children);\r\n }\r\n \r\n const Component = type as Component;\r\n try {\r\n const renderedNode = Component(props || {});\r\n return renderNodeToString(renderedNode);\r\n } catch (error) {\r\n console.error('Error rendering component:', error);\r\n return `<!-- Error rendering component: ${escapeHtml(String(error))} -->`;\r\n }\r\n }\r\n \r\n // Handle intrinsic elements (regular HTML tags)\r\n if (typeof type === 'string') {\r\n const tag = type;\r\n let attrs = '';\r\n \r\n // Convert props to HTML attributes\r\n if (props) {\r\n for (const [key, value] of Object.entries(props)) {\r\n if (key === 'children') continue;\r\n if (key === 'dangerouslySetInnerHTML') continue;\r\n if (key === 'ref') continue;\r\n if (value === undefined || value === null || value === false) continue;\r\n \r\n let attrName = key;\r\n let attrValue = value;\r\n \r\n // Handle special attribute names\r\n if (key === 'className') attrName = 'class';\r\n else if (key === 'htmlFor') attrName = 'for';\r\n else if (key === 'tabIndex') attrName = 'tabindex';\r\n \r\n // Skip event handlers\r\n if (attrName.startsWith('on') && typeof value === 'function') continue;\r\n \r\n // Handle style object\r\n if (attrName === 'style' && typeof value === 'object') {\r\n attrValue = Object.entries(value)\r\n .map(([prop, val]) => {\r\n const cssProperty = prop.replace(/([A-Z])/g, '-$1').toLowerCase();\r\n return `${cssProperty}: ${val}`;\r\n })\r\n .join('; ');\r\n }\r\n \r\n // Handle boolean attributes\r\n if (value === true) {\r\n attrs += ` ${attrName}`;\r\n } else {\r\n attrs += ` ${attrName}=\"${escapeHtml(String(attrValue))}\"`;\r\n }\r\n }\r\n }\r\n \r\n // Self-closing tags\r\n if (VOID_ELEMENTS.has(tag)) {\r\n return `<${tag}${attrs} />`;\r\n }\r\n \r\n // Handle dangerouslySetInnerHTML\r\n if (props?.dangerouslySetInnerHTML?.__html) {\r\n return `<${tag}${attrs}>${props.dangerouslySetInnerHTML.__html}</${tag}>`;\r\n }\r\n \r\n // Process children\r\n let children = '';\r\n const childrenArray = props?.children \r\n ? Array.isArray(props.children) ? props.children : [props.children]\r\n : [];\r\n \r\n for (const child of childrenArray) {\r\n children += renderNodeToString(child);\r\n }\r\n \r\n return `<${tag}${attrs}>${children}</${tag}>`;\r\n }\r\n \r\n // Handle Fragment symbol\r\n if (type === Symbol.for('react.fragment')) {\r\n const children = props?.children;\r\n if (children == null) return '';\r\n return Array.isArray(children)\r\n ? children.map(child => renderNodeToString(child)).join('')\r\n : renderNodeToString(children);\r\n }\r\n \r\n // Fallback for unknown node types\r\n console.warn('Unknown vnode type:', type);\r\n return '';\r\n}\r\n\r\n/**\r\n * Escape HTML special characters to prevent XSS\r\n */\r\nfunction escapeHtml(text: string): string {\r\n return text\r\n .replace(/&/g, '&')\r\n .replace(/</g, '<')\r\n .replace(/>/g, '>')\r\n .replace(/\"/g, '"')\r\n .replace(/'/g, ''');\r\n}\r\n\r\nexport default {\r\n renderToString,\r\n renderToStringWithData,\r\n renderToStream\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", "/**\n * Authentication service \u2014 JWT tokens, password hashing, Express middleware\n */\n\nexport interface AuthConfig {\n secret: string;\n expiresIn?: string | number;\n}\n\nexport interface User {\n id: string | number;\n username: string;\n password?: string;\n email?: string;\n roles?: string[];\n [key: string]: any;\n}\n\nexport class AuthService {\n private config: AuthConfig;\n private jwtPromise: Promise<typeof import('jsonwebtoken')> | null = null;\n\n constructor(config: AuthConfig) {\n this.config = {\n expiresIn: '24h',\n ...config\n };\n }\n\n private async getJwt(): Promise<typeof import('jsonwebtoken')> {\n if (!this.jwtPromise) {\n this.jwtPromise = import('jsonwebtoken').catch((error: any) => {\n this.jwtPromise = null;\n if (error.code === 'MODULE_NOT_FOUND') {\n throw new Error(\n 'jsonwebtoken not installed. Run: npm install jsonwebtoken @types/jsonwebtoken'\n );\n }\n throw error;\n });\n }\n return this.jwtPromise;\n }\n\n async hashPassword(password: string): Promise<string> {\n try {\n const bcrypt = await import('bcryptjs');\n return bcrypt.hash(password, 10);\n } catch (error: any) {\n if (error.code === 'MODULE_NOT_FOUND') {\n throw new Error('bcryptjs not installed. Run: npm install bcryptjs @types/bcryptjs');\n }\n throw error;\n }\n }\n\n async comparePasswords(password: string, hashedPassword: string): Promise<boolean> {\n try {\n const bcrypt = await import('bcryptjs');\n return bcrypt.compare(password, hashedPassword);\n } catch (error: any) {\n if (error.code === 'MODULE_NOT_FOUND') {\n throw new Error('bcryptjs not installed. Run: npm install bcryptjs @types/bcryptjs');\n }\n throw error;\n }\n }\n\n async generateToken(user: Omit<User, 'password'>): Promise<string> {\n const jwt = await this.getJwt();\n const options: any = {};\n\n if (this.config.expiresIn) {\n options.expiresIn = this.config.expiresIn;\n }\n\n return jwt.sign(\n { id: user.id, username: user.username, roles: user.roles || [] },\n this.config.secret,\n options\n );\n }\n\n async verifyToken(token: string): Promise<any> {\n try {\n const jwt = await this.getJwt();\n return jwt.verify(token, this.config.secret);\n } catch {\n return null;\n }\n }\n\n initialize() {\n return async (req: any, res: any, next: any) => {\n const token = this.extractToken(req);\n if (token) {\n const decoded = await this.verifyToken(token);\n if (decoded) {\n req.user = decoded;\n }\n }\n next();\n };\n }\n\n requireAuth() {\n return (req: any, res: any, next: any) => {\n if (!req.user) {\n return res.status(401).json({ message: 'Unauthorized' });\n }\n return next();\n };\n }\n\n requireRoles(roles: string[]) {\n return (req: any, res: any, next: any) => {\n if (!req.user) {\n return res.status(401).json({ message: 'Unauthorized' });\n }\n\n const userRoles = req.user.roles || [];\n const hasRequiredRole = roles.some(role => userRoles.includes(role));\n\n if (!hasRequiredRole) {\n return res.status(403).json({ message: 'Forbidden' });\n }\n\n return next();\n };\n }\n\n private extractToken(req: any): string | null {\n if (req.headers.authorization && req.headers.authorization.startsWith('Bearer ')) {\n return req.headers.authorization.substring(7);\n }\n return null;\n }\n}\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 = null;\r\n private apiDir: string;\r\n private auth: AuthService | null;\r\n private initialized: boolean = false;\r\n\r\n constructor(apiDir: string, auth: AuthService | null = null) {\r\n this.apiDir = path.resolve(process.cwd(), apiDir);\r\n this.auth = auth;\r\n // Don't call async method in constructor\r\n }\r\n\r\n async initialize(): Promise<void> {\r\n if (this.initialized && this.router) return;\r\n \r\n try {\r\n const express = await import('express');\r\n this.router = express.default.Router();\r\n this.setupRoutes();\r\n this.initialized = true;\r\n console.log('\u2705 API Router initialized successfully');\r\n } catch (error: any) {\r\n console.error('\u274C Failed to initialize API Router:', error);\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 isInitialized(): boolean {\r\n return this.initialized && this.router !== null;\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 for Windows\r\n const absolutePath = path.isAbsolute(filePath) ? filePath : path.resolve(filePath);\r\n \r\n // Convert to proper file:// URL - this fixes the Windows ESM issue\r\n const fileUrl = pathToFileURL(absolutePath).href;\r\n \r\n // Add cache busting parameter to force reload\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 } 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", "/**\n * Express middleware utilities\n */\n\nexport interface MiddlewareFunction {\n (req: any, res: any, next: any): void | Promise<void>;\n}\n\nexport const requestLogger: MiddlewareFunction = (req, res, next) => {\n console.log(`${new Date().toISOString()} - ${req.method} ${req.url}`);\n next();\n};\n\nexport const errorHandler = (\n err: Error,\n req: any,\n res: any,\n _next: any\n) => {\n console.error(err.stack);\n res.status(500).json({\n error: {\n message: 'Internal Server Error',\n ...(process.env.NODE_ENV !== 'production'\n ? { details: err.message, stack: err.stack }\n : {})\n }\n });\n};\n\nexport const notFoundHandler = (req: any, res: any) => {\n res.status(404).json({\n error: {\n message: `Not Found - ${req.method} ${req.url}`\n }\n });\n};\n\n/**\n * Rate limiting middleware with automatic cleanup.\n *\n * Uses a sliding-window counter per IP. Old entries are pruned on every\n * request and a periodic interval cleans up idle IPs.\n */\nexport function rateLimit(options: { windowMs: number; max: number }) {\n const requests = new Map<string, number[]>();\n\n // Periodic cleanup to prevent memory leak from abandoned IPs\n const cleanupInterval = setInterval(() => {\n const now = Date.now();\n for (const [ip, times] of requests) {\n const valid = times.filter(t => now - t < options.windowMs);\n if (valid.length === 0) {\n requests.delete(ip);\n } else {\n requests.set(ip, valid);\n }\n }\n }, options.windowMs);\n\n // Allow the timer to not keep the process alive\n if (cleanupInterval.unref) {\n cleanupInterval.unref();\n }\n\n return (req: any, res: any, next: any) => {\n const ip = req.ip || req.socket?.remoteAddress || 'unknown';\n const now = Date.now();\n\n const reqTimes = (requests.get(ip) || [])\n .filter(time => now - time < options.windowMs);\n\n reqTimes.push(now);\n requests.set(ip, reqTimes);\n\n if (reqTimes.length > options.max) {\n return res.status(429).json({\n error: {\n message: 'Too Many Requests',\n retryAfter: Math.ceil(options.windowMs / 1000)\n }\n });\n }\n\n return next();\n };\n}\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 = 'Baraqex 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, '&')\r\n .replace(/</g, '<')\r\n .replace(/>/g, '>')\r\n .replace(/\"/g, '"')\r\n .replace(/'/g, ''');\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(new Uint8Array(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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",
|
|
4
|
+
"sourcesContent": ["import path from 'path';\r\nimport http from 'http';\r\nimport fs from 'fs';\r\nimport { renderToString } from '../core/server-renderer.js';\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\nimport { pathToFileURL } from 'url';\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 here - call it in start() instead\r\n }\r\n\r\n private async initializeApp() {\r\n if (this.initialized) return;\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 await 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 \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 async setupApiRoutes() {\r\n const apiRouter = new ApiRouter(this.config.apiDir!, this.auth);\r\n \r\n // Initialize the router properly and wait for completion\r\n await apiRouter.initialize();\r\n \r\n // Double-check if router was created successfully\r\n if (!apiRouter.isInitialized() || !apiRouter.router) {\r\n console.warn('\u26A0\uFE0F API router not initialized properly - skipping API routes');\r\n return;\r\n }\r\n \r\n console.log('\u2705 Setting up API routes...');\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 // Fix the Windows ESM import issue by using pathToFileURL\r\n const absolutePath = path.isAbsolute(pagePath) ? pagePath : path.resolve(pagePath);\r\n const fileUrl = pathToFileURL(absolutePath).href;\r\n const urlWithTimestamp = `${fileUrl}?t=${Date.now()}`;\r\n \r\n const pageModule = await import(urlWithTimestamp);\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 // Render the component to HTML\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 (it's already a string)\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 await this.initializeApp();\r\n \r\n return new Promise((resolve) => {\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 }\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 'baraqex';\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 return synchronous result\r\nexport const renderComponent = (Component: any, props: any = {}) => {\r\n try {\r\n // Create HTML string from component using synchronous renderToString\r\n const html = renderToString(Component(props));\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</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", "/**\n * Hooks Implementation\n *\n * Each render root maintains its own isolated state via a RootState object.\n * The module-level currentRoot/currentComponentId/hookIndex are set before\n * each render call so hooks can find their data.\n */\n\nimport { createContext, useContext } from './context.js';\n\n// ---------------------------------------------------------------------------\n// Root-scoped state store\n// ---------------------------------------------------------------------------\n\nexport interface ComponentState {\n states: any[];\n effects: { callback: () => void | (() => void); deps?: any[]; cleanup?: () => void }[];\n memos: { value: any; deps?: any[] }[];\n refs: { current: any }[];\n}\n\nexport interface RootState {\n id: number;\n components: Map<number, ComponentState>;\n nextComponentId: number;\n renderCallback: ((element: any, container: HTMLElement) => Promise<void>) | null;\n container: HTMLElement | null;\n currentElement: any;\n}\n\nlet rootIdCounter = 0;\n\nexport function createRootState(): RootState {\n return {\n id: ++rootIdCounter,\n components: new Map(),\n nextComponentId: 0,\n renderCallback: null,\n container: null,\n currentElement: null\n };\n}\n\n// ---------------------------------------------------------------------------\n// Current render context (set per render call)\n// ---------------------------------------------------------------------------\n\nlet currentRoot: RootState | null = null;\nlet currentComponentId: number | null = null;\nlet hookIndex = 0;\n\nconst isServer = typeof window === 'undefined';\n\n// ---------------------------------------------------------------------------\n// Render lifecycle helpers\n// ---------------------------------------------------------------------------\n\nexport function prepareRender(root?: RootState, componentId?: number): number {\n if (root) {\n currentRoot = root;\n }\n if (componentId !== undefined) {\n currentComponentId = componentId;\n } else if (currentRoot) {\n currentComponentId = ++currentRoot.nextComponentId;\n }\n hookIndex = 0;\n return currentComponentId || 0;\n}\n\nexport function finishRender(): void {\n currentComponentId = null;\n}\n\nexport function getCurrentRoot(): RootState | null {\n return currentRoot;\n}\n\nexport function setCurrentRoot(root: RootState | null): void {\n currentRoot = root;\n}\n\nexport function getComponentState(root: RootState, compId: number): ComponentState {\n let state = root.components.get(compId);\n if (!state) {\n state = { states: [], effects: [], memos: [], refs: [] };\n root.components.set(compId, state);\n }\n return state;\n}\n\n// ---------------------------------------------------------------------------\n// setRenderCallback \u2014 bind a root to a re-render function\n// ---------------------------------------------------------------------------\n\nexport function setRenderCallback(\n callback: (element: any, container: HTMLElement) => Promise<void>,\n element: any,\n container: HTMLElement\n): void {\n if (!currentRoot) return;\n currentRoot.renderCallback = callback;\n currentRoot.currentElement = element;\n currentRoot.container = container;\n}\n\nexport function getCurrentRender(): number {\n return currentComponentId || 0;\n}\n\n// ---------------------------------------------------------------------------\n// Hooks\n// ---------------------------------------------------------------------------\n\n/**\n * useState \u2014 manages component state\n */\nexport function useState<T>(initial: T): [T, (newValue: T | ((prev: T) => T)) => void] {\n const root = currentRoot;\n const compId = currentComponentId;\n\n if (!root || compId === null) {\n if (isServer) {\n // During SSR, return the initial value with a no-op setter\n return [initial, () => {}];\n }\n console.warn('useState called outside of render context');\n return [initial, () => {}];\n }\n\n const compState = getComponentState(root, compId);\n const currentIndex = hookIndex;\n hookIndex++;\n\n if (currentIndex >= compState.states.length) {\n compState.states.push(initial);\n }\n\n const state = compState.states[currentIndex];\n\n const setState = (newValue: T | ((prev: T) => T)) => {\n const currentState = compState.states[currentIndex];\n const value = typeof newValue === 'function'\n ? (newValue as (prev: T) => T)(currentState)\n : newValue;\n\n if (Object.is(currentState, value)) return;\n\n compState.states[currentIndex] = value;\n\n // Trigger re-render via root's callback\n if (root.renderCallback && root.container && root.currentElement) {\n root.renderCallback(root.currentElement, root.container);\n }\n };\n\n return [state, setState];\n}\n\n/**\n * useEffect \u2014 handles side effects, runs after render\n */\nexport function useEffect(callback: () => void | (() => void), deps?: any[]): void {\n const root = currentRoot;\n const compId = currentComponentId;\n if (!root || compId === null || isServer) return;\n\n const compState = getComponentState(root, compId);\n const currentIndex = hookIndex;\n hookIndex++;\n\n const prevEffect = compState.effects[currentIndex];\n\n const shouldRun = !prevEffect || !deps || !prevEffect.deps ||\n deps.some((dep, i) => !Object.is(dep, prevEffect.deps?.[i]));\n\n if (shouldRun) {\n if (prevEffect?.cleanup) {\n prevEffect.cleanup();\n }\n\n queueMicrotask(() => {\n const cleanup = callback();\n compState.effects[currentIndex] = {\n callback,\n deps,\n cleanup: typeof cleanup === 'function' ? cleanup : undefined\n };\n });\n }\n\n if (!prevEffect) {\n compState.effects.push({ callback, deps });\n }\n}\n\n/**\n * useLayoutEffect \u2014 runs synchronously after DOM mutations (client only)\n */\nexport function useLayoutEffect(callback: () => void | (() => void), deps?: any[]): void {\n if (isServer) return;\n\n const root = currentRoot;\n const compId = currentComponentId;\n if (!root || compId === null) return;\n\n const compState = getComponentState(root, compId);\n const currentIndex = hookIndex;\n hookIndex++;\n\n const prevEffect = compState.effects[currentIndex];\n\n const shouldRun = !prevEffect || !deps || !prevEffect.deps ||\n deps.some((dep, i) => !Object.is(dep, prevEffect.deps?.[i]));\n\n if (shouldRun) {\n if (prevEffect?.cleanup) {\n prevEffect.cleanup();\n }\n\n // Run synchronously (unlike useEffect which uses queueMicrotask)\n const cleanup = callback();\n compState.effects[currentIndex] = {\n callback,\n deps,\n cleanup: typeof cleanup === 'function' ? cleanup : undefined\n };\n }\n\n if (!prevEffect) {\n compState.effects.push({ callback, deps });\n }\n}\n\n/**\n * useMemo \u2014 memoizes expensive computations\n */\nexport function useMemo<T>(factory: () => T, deps?: any[]): T {\n const root = currentRoot;\n const compId = currentComponentId;\n\n if (!root || compId === null) {\n return factory();\n }\n\n const compState = getComponentState(root, compId);\n const currentIndex = hookIndex;\n hookIndex++;\n\n const prevMemo = compState.memos[currentIndex];\n\n const shouldRecalculate = !prevMemo || !deps || !prevMemo.deps ||\n deps.some((dep, i) => !Object.is(dep, prevMemo.deps?.[i]));\n\n if (shouldRecalculate) {\n const value = factory();\n compState.memos[currentIndex] = { value, deps };\n return value;\n }\n\n return prevMemo.value;\n}\n\n/**\n * useCallback \u2014 memoizes callbacks\n */\nexport function useCallback<T extends (...args: any[]) => any>(\n callback: T,\n deps: any[]\n): T {\n return useMemo(() => callback, deps);\n}\n\n/**\n * useRef \u2014 creates a mutable ref object\n */\nexport function useRef<T>(initial: T): { current: T } {\n const root = currentRoot;\n const compId = currentComponentId;\n\n if (!root || compId === null) {\n return { current: initial };\n }\n\n const compState = getComponentState(root, compId);\n const currentIndex = hookIndex;\n hookIndex++;\n\n if (compState.refs[currentIndex] === undefined) {\n compState.refs[currentIndex] = { current: initial };\n }\n\n return compState.refs[currentIndex];\n}\n\n/**\n * useReducer \u2014 manages complex state with a reducer\n */\nexport function useReducer<S, A>(\n reducer: (state: S, action: A) => S,\n initialState: S\n): [S, (action: A) => void] {\n const [state, setState] = useState(initialState);\n\n const dispatch = (action: A) => {\n setState((prevState) => reducer(prevState, action));\n };\n\n return [state, dispatch];\n}\n\n/**\n * useErrorBoundary \u2014 catches errors in child components\n */\nexport function useErrorBoundary(): [Error | null, () => void] {\n const [error, setError] = useState<Error | null>(null);\n const resetError = () => setError(null);\n return [error, resetError];\n}\n\n/**\n * useId \u2014 generates stable unique IDs\n */\nlet idCounter = 0;\nexport function useId(): string {\n const ref = useRef<string | null>(null);\n if (ref.current === null) {\n ref.current = `baraqex-id-${++idCounter}`;\n }\n return ref.current;\n}\n\n/**\n * Cleanup all hook state for a component within a root\n */\nexport function cleanupHooks(root: RootState, compId: number): void {\n const compState = root.components.get(compId);\n if (compState) {\n compState.effects.forEach(effect => {\n if (effect.cleanup) effect.cleanup();\n });\n root.components.delete(compId);\n }\n}\n\n/**\n * Cleanup all state for an entire root\n */\nexport function cleanupRoot(root: RootState): void {\n root.components.forEach((compState) => {\n compState.effects.forEach(effect => {\n if (effect.cleanup) effect.cleanup();\n });\n });\n root.components.clear();\n}\n\n// Re-export context hooks\nexport { createContext, useContext };\n", "/**\r\n * Server-side rendering - converts virtual DOM to HTML strings\r\n */\r\n\r\nimport { VNode } from './types.js';\r\nimport { prepareRender, finishRender } from './hooks.js';\r\n\r\ntype Component = (props: any) => any;\r\n\r\n// Self-closing HTML tags\r\nconst VOID_ELEMENTS = new Set([\r\n 'area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input',\r\n 'link', 'meta', 'param', 'source', 'track', 'wbr'\r\n]);\r\n\r\n/**\r\n * Renders a virtual DOM tree to an HTML string\r\n */\r\nexport function renderToString(vnode: VNode | any): string {\r\n // Reset hook state for this render\r\n prepareRender();\r\n \r\n try {\r\n // Render the tree to HTML\r\n return renderNodeToString(vnode);\r\n } finally {\r\n // Clean up after rendering\r\n finishRender();\r\n }\r\n}\r\n\r\n/**\r\n * Renders to string with data for hydration\r\n */\r\nexport function renderToStringWithData(vnode: VNode | any): { html: string; data: any } {\r\n const html = renderToString(vnode);\r\n return { html, data: {} };\r\n}\r\n\r\n/**\r\n * Stream rendering for large pages\r\n */\r\nexport async function* renderToStream(vnode: VNode | any): AsyncGenerator<string> {\r\n yield renderToString(vnode);\r\n}\r\n\r\n/**\r\n * Internal function to convert a virtual node to an HTML string\r\n */\r\nfunction renderNodeToString(vnode: VNode | string | number | boolean | null | undefined | any[]): string {\r\n // Handle primitive values\r\n if (vnode === null || vnode === undefined) return '';\r\n if (typeof vnode === 'boolean') return '';\r\n if (typeof vnode === 'number' || typeof vnode === 'string') return escapeHtml(String(vnode));\r\n \r\n // Handle arrays\r\n if (Array.isArray(vnode)) {\r\n return vnode.map(child => renderNodeToString(child)).join('');\r\n }\r\n \r\n // Handle objects without type (not VNode)\r\n if (typeof vnode !== 'object' || vnode.type === undefined) {\r\n return escapeHtml(String(vnode));\r\n }\r\n \r\n const { type, props } = vnode;\r\n \r\n // Handle function components\r\n if (typeof type === 'function') {\r\n // Handle Fragment\r\n if (type.name === 'Fragment' || (type as unknown) === Symbol.for('react.fragment')) {\r\n const children = props?.children;\r\n if (children == null) return '';\r\n return Array.isArray(children)\r\n ? children.map(child => renderNodeToString(child)).join('')\r\n : renderNodeToString(children);\r\n }\r\n \r\n const Component = type as Component;\r\n try {\r\n const renderedNode = Component(props || {});\r\n return renderNodeToString(renderedNode);\r\n } catch (error) {\r\n console.error('Error rendering component:', error);\r\n return `<!-- Error rendering component: ${escapeHtml(String(error))} -->`;\r\n }\r\n }\r\n \r\n // Handle intrinsic elements (regular HTML tags)\r\n if (typeof type === 'string') {\r\n const tag = type;\r\n let attrs = '';\r\n \r\n // Convert props to HTML attributes\r\n if (props) {\r\n for (const [key, value] of Object.entries(props)) {\r\n if (key === 'children') continue;\r\n if (key === 'dangerouslySetInnerHTML') continue;\r\n if (key === 'ref') continue;\r\n if (value === undefined || value === null || value === false) continue;\r\n \r\n let attrName = key;\r\n let attrValue = value;\r\n \r\n // Handle special attribute names\r\n if (key === 'className') attrName = 'class';\r\n else if (key === 'htmlFor') attrName = 'for';\r\n else if (key === 'tabIndex') attrName = 'tabindex';\r\n \r\n // Skip event handlers\r\n if (attrName.startsWith('on') && typeof value === 'function') continue;\r\n \r\n // Handle style object\r\n if (attrName === 'style' && typeof value === 'object') {\r\n attrValue = Object.entries(value)\r\n .map(([prop, val]) => {\r\n const cssProperty = prop.replace(/([A-Z])/g, '-$1').toLowerCase();\r\n return `${cssProperty}: ${val}`;\r\n })\r\n .join('; ');\r\n }\r\n \r\n // Handle boolean attributes\r\n if (value === true) {\r\n attrs += ` ${attrName}`;\r\n } else {\r\n attrs += ` ${attrName}=\"${escapeHtml(String(attrValue))}\"`;\r\n }\r\n }\r\n }\r\n \r\n // Self-closing tags\r\n if (VOID_ELEMENTS.has(tag)) {\r\n return `<${tag}${attrs} />`;\r\n }\r\n \r\n // Handle dangerouslySetInnerHTML\r\n if (props?.dangerouslySetInnerHTML?.__html) {\r\n return `<${tag}${attrs}>${props.dangerouslySetInnerHTML.__html}</${tag}>`;\r\n }\r\n \r\n // Process children\r\n let children = '';\r\n const childrenArray = props?.children \r\n ? Array.isArray(props.children) ? props.children : [props.children]\r\n : [];\r\n \r\n for (const child of childrenArray) {\r\n children += renderNodeToString(child);\r\n }\r\n \r\n return `<${tag}${attrs}>${children}</${tag}>`;\r\n }\r\n \r\n // Handle Fragment symbol\r\n if (type === Symbol.for('react.fragment')) {\r\n const children = props?.children;\r\n if (children == null) return '';\r\n return Array.isArray(children)\r\n ? children.map(child => renderNodeToString(child)).join('')\r\n : renderNodeToString(children);\r\n }\r\n \r\n // Fallback for unknown node types\r\n console.warn('Unknown vnode type:', type);\r\n return '';\r\n}\r\n\r\n/**\r\n * Escape HTML special characters to prevent XSS\r\n */\r\nfunction escapeHtml(text: string): string {\r\n return text\r\n .replace(/&/g, '&')\r\n .replace(/</g, '<')\r\n .replace(/>/g, '>')\r\n .replace(/\"/g, '"')\r\n .replace(/'/g, ''');\r\n}\r\n\r\nexport default {\r\n renderToString,\r\n renderToStringWithData,\r\n renderToStream\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", "/**\n * Authentication service \u2014 JWT tokens, password hashing, Express middleware\n */\n\nexport interface AuthConfig {\n secret: string;\n expiresIn?: string | number;\n}\n\nexport interface User {\n id: string | number;\n username: string;\n password?: string;\n email?: string;\n roles?: string[];\n [key: string]: any;\n}\n\nexport class AuthService {\n private config: AuthConfig;\n private jwtPromise: Promise<typeof import('jsonwebtoken')> | null = null;\n\n constructor(config: AuthConfig) {\n this.config = {\n expiresIn: '24h',\n ...config\n };\n }\n\n private async getJwt(): Promise<typeof import('jsonwebtoken')> {\n if (!this.jwtPromise) {\n this.jwtPromise = import('jsonwebtoken').catch((error: any) => {\n this.jwtPromise = null;\n if (error.code === 'MODULE_NOT_FOUND') {\n throw new Error(\n 'jsonwebtoken not installed. Run: npm install jsonwebtoken @types/jsonwebtoken'\n );\n }\n throw error;\n });\n }\n return this.jwtPromise;\n }\n\n async hashPassword(password: string): Promise<string> {\n try {\n const bcrypt = await import('bcryptjs');\n return bcrypt.hash(password, 10);\n } catch (error: any) {\n if (error.code === 'MODULE_NOT_FOUND') {\n throw new Error('bcryptjs not installed. Run: npm install bcryptjs @types/bcryptjs');\n }\n throw error;\n }\n }\n\n async comparePasswords(password: string, hashedPassword: string): Promise<boolean> {\n try {\n const bcrypt = await import('bcryptjs');\n return bcrypt.compare(password, hashedPassword);\n } catch (error: any) {\n if (error.code === 'MODULE_NOT_FOUND') {\n throw new Error('bcryptjs not installed. Run: npm install bcryptjs @types/bcryptjs');\n }\n throw error;\n }\n }\n\n async generateToken(user: Omit<User, 'password'>): Promise<string> {\n const jwt = await this.getJwt();\n const options: any = {};\n\n if (this.config.expiresIn) {\n options.expiresIn = this.config.expiresIn;\n }\n\n return jwt.sign(\n { id: user.id, username: user.username, roles: user.roles || [] },\n this.config.secret,\n options\n );\n }\n\n async verifyToken(token: string): Promise<any> {\n try {\n const jwt = await this.getJwt();\n return jwt.verify(token, this.config.secret);\n } catch {\n return null;\n }\n }\n\n initialize() {\n return async (req: any, res: any, next: any) => {\n const token = this.extractToken(req);\n if (token) {\n const decoded = await this.verifyToken(token);\n if (decoded) {\n req.user = decoded;\n }\n }\n next();\n };\n }\n\n requireAuth() {\n return (req: any, res: any, next: any) => {\n if (!req.user) {\n return res.status(401).json({ message: 'Unauthorized' });\n }\n return next();\n };\n }\n\n requireRoles(roles: string[]) {\n return (req: any, res: any, next: any) => {\n if (!req.user) {\n return res.status(401).json({ message: 'Unauthorized' });\n }\n\n const userRoles = req.user.roles || [];\n const hasRequiredRole = roles.some(role => userRoles.includes(role));\n\n if (!hasRequiredRole) {\n return res.status(403).json({ message: 'Forbidden' });\n }\n\n return next();\n };\n }\n\n private extractToken(req: any): string | null {\n if (req.headers.authorization && req.headers.authorization.startsWith('Bearer ')) {\n return req.headers.authorization.substring(7);\n }\n return null;\n }\n}\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 = null;\r\n private apiDir: string;\r\n private auth: AuthService | null;\r\n private initialized: boolean = false;\r\n\r\n constructor(apiDir: string, auth: AuthService | null = null) {\r\n this.apiDir = path.resolve(process.cwd(), apiDir);\r\n this.auth = auth;\r\n // Don't call async method in constructor\r\n }\r\n\r\n async initialize(): Promise<void> {\r\n if (this.initialized && this.router) return;\r\n \r\n try {\r\n const express = await import('express');\r\n this.router = express.default.Router();\r\n this.setupRoutes();\r\n this.initialized = true;\r\n console.log('\u2705 API Router initialized successfully');\r\n } catch (error: any) {\r\n console.error('\u274C Failed to initialize API Router:', error);\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 isInitialized(): boolean {\r\n return this.initialized && this.router !== null;\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 for Windows\r\n const absolutePath = path.isAbsolute(filePath) ? filePath : path.resolve(filePath);\r\n \r\n // Convert to proper file:// URL - this fixes the Windows ESM issue\r\n const fileUrl = pathToFileURL(absolutePath).href;\r\n \r\n // Add cache busting parameter to force reload\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 } 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", "/**\n * Express middleware utilities\n */\n\nexport interface MiddlewareFunction {\n (req: any, res: any, next: any): void | Promise<void>;\n}\n\nexport const requestLogger: MiddlewareFunction = (req, res, next) => {\n console.log(`${new Date().toISOString()} - ${req.method} ${req.url}`);\n next();\n};\n\nexport const errorHandler = (\n err: Error,\n req: any,\n res: any,\n _next: any\n) => {\n console.error(err.stack);\n res.status(500).json({\n error: {\n message: 'Internal Server Error',\n ...(process.env.NODE_ENV !== 'production'\n ? { details: err.message, stack: err.stack }\n : {})\n }\n });\n};\n\nexport const notFoundHandler = (req: any, res: any) => {\n res.status(404).json({\n error: {\n message: `Not Found - ${req.method} ${req.url}`\n }\n });\n};\n\n/**\n * Rate limiting middleware with automatic cleanup.\n *\n * Uses a sliding-window counter per IP. Old entries are pruned on every\n * request and a periodic interval cleans up idle IPs.\n */\nexport function rateLimit(options: { windowMs: number; max: number }) {\n const requests = new Map<string, number[]>();\n\n // Periodic cleanup to prevent memory leak from abandoned IPs\n const cleanupInterval = setInterval(() => {\n const now = Date.now();\n for (const [ip, times] of requests) {\n const valid = times.filter(t => now - t < options.windowMs);\n if (valid.length === 0) {\n requests.delete(ip);\n } else {\n requests.set(ip, valid);\n }\n }\n }, options.windowMs);\n\n // Allow the timer to not keep the process alive\n if (cleanupInterval.unref) {\n cleanupInterval.unref();\n }\n\n return (req: any, res: any, next: any) => {\n const ip = req.ip || req.socket?.remoteAddress || 'unknown';\n const now = Date.now();\n\n const reqTimes = (requests.get(ip) || [])\n .filter(time => now - time < options.windowMs);\n\n reqTimes.push(now);\n requests.set(ip, reqTimes);\n\n if (reqTimes.length > options.max) {\n return res.status(429).json({\n error: {\n message: 'Too Many Requests',\n retryAfter: Math.ceil(options.windowMs / 1000)\n }\n });\n }\n\n return next();\n };\n}\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 = 'Baraqex 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, '&')\r\n .replace(/</g, '<')\r\n .replace(/>/g, '>')\r\n .replace(/\"/g, '"')\r\n .replace(/'/g, ''');\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(new Uint8Array(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;;;AC6Cf,IAAI,cAAgC;AACpC,IAAI,qBAAoC;AACxC,IAAI,YAAY;AAQT,SAAS,cAAc,MAAkB,aAA8B;AAC5E,MAAI,MAAM;AACR,kBAAc;AAAA,EAChB;AACA,MAAI,gBAAgB,QAAW;AAC7B,yBAAqB;AAAA,EACvB,WAAW,aAAa;AACtB,yBAAqB,EAAE,YAAY;AAAA,EACrC;AACA,cAAY;AACZ,SAAO,sBAAsB;AAC/B;AAEO,SAAS,eAAqB;AACnC,uBAAqB;AACvB;;;AC9DA,IAAM,gBAAgB,oBAAI,IAAI;AAAA,EAC5B;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAM;AAAA,EAAO;AAAA,EAAS;AAAA,EAAM;AAAA,EAAO;AAAA,EACnD;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAS;AAAA,EAAU;AAAA,EAAS;AAC9C,CAAC;AAKM,SAAS,eAAe,OAA4B;AAEzD,gBAAc;AAEd,MAAI;AAEF,WAAO,mBAAmB,KAAK;AAAA,EACjC,UAAE;AAEA,iBAAa;AAAA,EACf;AACF;AAoBA,SAAS,mBAAmB,OAA6E;AAEvG,MAAI,UAAU,QAAQ,UAAU;AAAW,WAAO;AAClD,MAAI,OAAO,UAAU;AAAW,WAAO;AACvC,MAAI,OAAO,UAAU,YAAY,OAAO,UAAU;AAAU,WAAO,WAAW,OAAO,KAAK,CAAC;AAG3F,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,MAAM,IAAI,WAAS,mBAAmB,KAAK,CAAC,EAAE,KAAK,EAAE;AAAA,EAC9D;AAGA,MAAI,OAAO,UAAU,YAAY,MAAM,SAAS,QAAW;AACzD,WAAO,WAAW,OAAO,KAAK,CAAC;AAAA,EACjC;AAEA,QAAM,EAAE,MAAM,MAAM,IAAI;AAGxB,MAAI,OAAO,SAAS,YAAY;AAE9B,QAAI,KAAK,SAAS,cAAe,SAAqB,OAAO,IAAI,gBAAgB,GAAG;AAClF,YAAM,WAAW,OAAO;AACxB,UAAI,YAAY;AAAM,eAAO;AAC7B,aAAO,MAAM,QAAQ,QAAQ,IACzB,SAAS,IAAI,WAAS,mBAAmB,KAAK,CAAC,EAAE,KAAK,EAAE,IACxD,mBAAmB,QAAQ;AAAA,IACjC;AAEA,UAAM,YAAY;AAClB,QAAI;AACF,YAAM,eAAe,UAAU,SAAS,CAAC,CAAC;AAC1C,aAAO,mBAAmB,YAAY;AAAA,IACxC,SAAS,OAAO;AACd,cAAQ,MAAM,8BAA8B,KAAK;AACjD,aAAO,mCAAmC,WAAW,OAAO,KAAK,CAAC,CAAC;AAAA,IACrE;AAAA,EACF;AAGA,MAAI,OAAO,SAAS,UAAU;AAC5B,UAAM,MAAM;AACZ,QAAI,QAAQ;AAGZ,QAAI,OAAO;AACT,iBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,GAAG;AAChD,YAAI,QAAQ;AAAY;AACxB,YAAI,QAAQ;AAA2B;AACvC,YAAI,QAAQ;AAAO;AACnB,YAAI,UAAU,UAAa,UAAU,QAAQ,UAAU;AAAO;AAE9D,YAAI,WAAW;AACf,YAAI,YAAY;AAGhB,YAAI,QAAQ;AAAa,qBAAW;AAAA,iBAC3B,QAAQ;AAAW,qBAAW;AAAA,iBAC9B,QAAQ;AAAY,qBAAW;AAGxC,YAAI,SAAS,WAAW,IAAI,KAAK,OAAO,UAAU;AAAY;AAG9D,YAAI,aAAa,WAAW,OAAO,UAAU,UAAU;AACrD,sBAAY,OAAO,QAAQ,KAAK,EAC7B,IAAI,CAAC,CAAC,MAAM,GAAG,MAAM;AACpB,kBAAM,cAAc,KAAK,QAAQ,YAAY,KAAK,EAAE,YAAY;AAChE,mBAAO,GAAG,WAAW,KAAK,GAAG;AAAA,UAC/B,CAAC,EACA,KAAK,IAAI;AAAA,QACd;AAGA,YAAI,UAAU,MAAM;AAClB,mBAAS,IAAI,QAAQ;AAAA,QACvB,OAAO;AACL,mBAAS,IAAI,QAAQ,KAAK,WAAW,OAAO,SAAS,CAAC,CAAC;AAAA,QACzD;AAAA,MACF;AAAA,IACF;AAGA,QAAI,cAAc,IAAI,GAAG,GAAG;AAC1B,aAAO,IAAI,GAAG,GAAG,KAAK;AAAA,IACxB;AAGA,QAAI,OAAO,yBAAyB,QAAQ;AAC1C,aAAO,IAAI,GAAG,GAAG,KAAK,IAAI,MAAM,wBAAwB,MAAM,KAAK,GAAG;AAAA,IACxE;AAGA,QAAI,WAAW;AACf,UAAM,gBAAgB,OAAO,WACzB,MAAM,QAAQ,MAAM,QAAQ,IAAI,MAAM,WAAW,CAAC,MAAM,QAAQ,IAChE,CAAC;AAEL,eAAW,SAAS,eAAe;AACjC,kBAAY,mBAAmB,KAAK;AAAA,IACtC;AAEA,WAAO,IAAI,GAAG,GAAG,KAAK,IAAI,QAAQ,KAAK,GAAG;AAAA,EAC5C;AAGA,MAAI,SAAS,OAAO,IAAI,gBAAgB,GAAG;AACzC,UAAM,WAAW,OAAO;AACxB,QAAI,YAAY;AAAM,aAAO;AAC7B,WAAO,MAAM,QAAQ,QAAQ,IACzB,SAAS,IAAI,WAAS,mBAAmB,KAAK,CAAC,EAAE,KAAK,EAAE,IACxD,mBAAmB,QAAQ;AAAA,EACjC;AAGA,UAAQ,KAAK,uBAAuB,IAAI;AACxC,SAAO;AACT;AAKA,SAAS,WAAW,MAAsB;AACxC,SAAO,KACJ,QAAQ,MAAM,OAAO,EACrB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,QAAQ,EACtB,QAAQ,MAAM,QAAQ;AAC3B;;;AC7KO,IAAM,WAAN,MAAe;AAAA,EAOpB,YAAY,QAAkB;AAN9B,wBAAQ;AACR,wBAAQ,eAAmB;AAC3B,wBAAQ,WAAe;AACvB,wBAAQ,aAAiB;AACzB,wBAAQ,UAAc;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;;;AC/GO,IAAM,cAAN,MAAkB;AAAA,EAIvB,YAAY,QAAoB;AAHhC,wBAAQ;AACR,wBAAQ,cAA4D;AAGlE,SAAK,SAAS;AAAA,MACZ,WAAW;AAAA,MACX,GAAG;AAAA,IACL;AAAA,EACF;AAAA,EAEA,MAAc,SAAiD;AAC7D,QAAI,CAAC,KAAK,YAAY;AACpB,WAAK,aAAa,OAAO,cAAc,EAAE,MAAM,CAAC,UAAe;AAC7D,aAAK,aAAa;AAClB,YAAI,MAAM,SAAS,oBAAoB;AACrC,gBAAM,IAAI;AAAA,YACR;AAAA,UACF;AAAA,QACF;AACA,cAAM;AAAA,MACR,CAAC;AAAA,IACH;AACA,WAAO,KAAK;AAAA,EACd;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,MAAM,cAAc,MAA+C;AACjE,UAAM,MAAM,MAAM,KAAK,OAAO;AAC9B,UAAM,UAAe,CAAC;AAEtB,QAAI,KAAK,OAAO,WAAW;AACzB,cAAQ,YAAY,KAAK,OAAO;AAAA,IAClC;AAEA,WAAO,IAAI;AAAA,MACT,EAAE,IAAI,KAAK,IAAI,UAAU,KAAK,UAAU,OAAO,KAAK,SAAS,CAAC,EAAE;AAAA,MAChE,KAAK,OAAO;AAAA,MACZ;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,YAAY,OAA6B;AAC7C,QAAI;AACF,YAAM,MAAM,MAAM,KAAK,OAAO;AAC9B,aAAO,IAAI,OAAO,OAAO,KAAK,OAAO,MAAM;AAAA,IAC7C,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,aAAa;AACX,WAAO,OAAO,KAAU,KAAU,SAAc;AAC9C,YAAM,QAAQ,KAAK,aAAa,GAAG;AACnC,UAAI,OAAO;AACT,cAAM,UAAU,MAAM,KAAK,YAAY,KAAK;AAC5C,YAAI,SAAS;AACX,cAAI,OAAO;AAAA,QACb;AAAA,MACF;AACA,WAAK;AAAA,IACP;AAAA,EACF;AAAA,EAEA,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,EAEA,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;;;ACzIA,OAAO,UAAU;AACjB,OAAO,QAAQ;AAEf,SAAS,qBAAqB;AAkBvB,IAAM,YAAN,MAAgB;AAAA,EAMrB,YAAY,QAAgB,OAA2B,MAAM;AAL7D,wBAAO,UAAc;AACrB,wBAAQ;AACR,wBAAQ;AACR,wBAAQ,eAAuB;AAG7B,SAAK,SAAS,KAAK,QAAQ,QAAQ,IAAI,GAAG,MAAM;AAChD,SAAK,OAAO;AAAA,EAEd;AAAA,EAEA,MAAM,aAA4B;AAChC,QAAI,KAAK,eAAe,KAAK;AAAQ;AAErC,QAAI;AACF,YAAM,UAAU,MAAM,OAAO,SAAS;AACtC,WAAK,SAAS,QAAQ,QAAQ,OAAO;AACrC,WAAK,YAAY;AACjB,WAAK,cAAc;AACnB,cAAQ,IAAI,4CAAuC;AAAA,IACrD,SAAS,OAAY;AACnB,cAAQ,MAAM,2CAAsC,KAAK;AACzD,UAAI,MAAM,SAAS,oBAAoB;AACrC,cAAM,IAAI,MAAM,gEAAgE;AAAA,MAClF;AACA,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,gBAAyB;AACvB,WAAO,KAAK,eAAe,KAAK,WAAW;AAAA,EAC7C;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;AAG5C,YAAM,mBAAmB,GAAG,OAAO,MAAM,KAAK,IAAI,CAAC;AAGnD,YAAM,cAAc,MAAM,OAAO;AAEjC,UAAI,CAAC,KAAK,mBAAmB,WAAW,GAAG;AACzC,gBAAQ,KAAK,yBAAyB,QAAQ,EAAE;AAChD;AAAA,MACF;AAEA,cAAQ,IAAI,0BAA0B,SAAS,EAAE;AAGjD,YAAM,aAAa,YAAY,cAAc,CAAC;AAG9C,iBAAW,UAAU,CAAC,OAAO,QAAQ,OAAO,UAAU,SAAS,SAAS,GAAG;AACzE,cAAM,UAAU,YAAY,MAAM;AAClC,YAAI,OAAO,YAAY,YAAY;AACjC,gBAAM,eAAe,KAAK,OAAO,MAAM;AACvC,uBAAa;AAAA,YACX,KAAK;AAAA,YACL;AAAA,YACA,GAAG;AAAA,YACH,KAAK,YAAY,OAAO;AAAA,UAC1B;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;;;AC3JO,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,UACG;AACH,UAAQ,MAAM,IAAI,KAAK;AACvB,MAAI,OAAO,GAAG,EAAE,KAAK;AAAA,IACnB,OAAO;AAAA,MACL,SAAS;AAAA,MACT,GAAI,QAAQ,IAAI,aAAa,eACzB,EAAE,SAAS,IAAI,SAAS,OAAO,IAAI,MAAM,IACzC,CAAC;AAAA,IACP;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;AAQO,SAAS,UAAU,SAA4C;AACpE,QAAM,WAAW,oBAAI,IAAsB;AAG3C,QAAM,kBAAkB,YAAY,MAAM;AACxC,UAAM,MAAM,KAAK,IAAI;AACrB,eAAW,CAAC,IAAI,KAAK,KAAK,UAAU;AAClC,YAAM,QAAQ,MAAM,OAAO,OAAK,MAAM,IAAI,QAAQ,QAAQ;AAC1D,UAAI,MAAM,WAAW,GAAG;AACtB,iBAAS,OAAO,EAAE;AAAA,MACpB,OAAO;AACL,iBAAS,IAAI,IAAI,KAAK;AAAA,MACxB;AAAA,IACF;AAAA,EACF,GAAG,QAAQ,QAAQ;AAGnB,MAAI,gBAAgB,OAAO;AACzB,oBAAgB,MAAM;AAAA,EACxB;AAEA,SAAO,CAAC,KAAU,KAAU,SAAc;AACxC,UAAM,KAAK,IAAI,MAAM,IAAI,QAAQ,iBAAiB;AAClD,UAAM,MAAM,KAAK,IAAI;AAErB,UAAM,YAAY,SAAS,IAAI,EAAE,KAAK,CAAC,GACpC,OAAO,UAAQ,MAAM,OAAO,QAAQ,QAAQ;AAE/C,aAAS,KAAK,GAAG;AACjB,aAAS,IAAI,IAAI,QAAQ;AAEzB,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;;;ACtFA;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,KAAKE,YAAW,KAAK,CAAC,GAAG,EACrD,KAAK,GAAG;AAGX,QAAM,iBAAiB,OAAO,QAAQ,SAAS,EAC5C,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,GAAG,GAAG,KAAKA,YAAW,KAAK,CAAC,GAAG,EACrD,KAAK,GAAG;AAGX,QAAM,WAAW;AAAA,IACf,kBAAkB,OAAO;AAAA,IACzB,kCAAkC,QAAQ;AAAA,IAC1C,cAAc,qCAAqCA,YAAW,WAAW,CAAC,OAAO;AAAA,EACnF;AAGA,SAAO,QAAQ,IAAI,EAAE,QAAQ,CAAC,CAAC,MAAMC,QAAO,MAAM;AAChD,aAAS,KAAK,eAAeD,YAAW,IAAI,CAAC,cAAcA,YAAWC,QAAO,CAAC,IAAI;AAAA,EACpF,CAAC;AAGD,QAAM,aAAa,QAAQ,IAAI,SAAO;AACpC,QAAI,IAAI,WAAW,SAAS,GAAG;AAC7B,aAAO;AAAA,IACT;AACA,WAAO,gBAAgBD,YAAW,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,gCAAgCA,YAAW,IAAI,CAAC;AAAA,EACzD,CAAC;AAGD,QAAM,oBAAoB,OAAO,KAAK,WAAW,EAAE,SAAS,IAC1D,qDAAqDA,YAAW,KAAK,UAAU,WAAW,CAAC,CAAC,cAAc;AAG5G,SAAO;AAAA,cACK,IAAI,KAAK,cAAc;AAAA;AAAA,IAEjC,SAAS,OAAO,OAAO,EAAE,KAAK,MAAM,CAAC;AAAA,WAC9BA,YAAW,KAAK,CAAC;AAAA,IACxB,UAAU,KAAK,MAAM,CAAC;AAAA;AAAA,eAEX,WAAW,KAAK,cAAc;AAAA,oCACT,gBAAgB,oBAAoBA,YAAW,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,aAE3BA,YAAW,MAAM,SAAS,MAAM,OAAO,CAAC;AAAA;AAAA,MAE/C;AAGJ,QAAM,UAAU;AAAA;AAAA,YAEN,UAAU;AAAA,YACVA,YAAW,cAAc,UAAU,KAAK,OAAO,CAAC;AAAA,WACjDA,YAAW,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,WAGPA,YAAW,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,SAASA,YAAW,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,OAAOE,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,IAAI,WAAW,UAAU,CAAC;AAIvE,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;;;AT5MA,SAAS,iBAAAG,sBAAqB;AAG9B,SAAS,iBAAiB,UAAkB,UAA0B;AACpE,MAAI;AAEF,UAAM,eAAeC,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;AAPvC,wBAAQ;AACR,wBAAQ,UAA6B;AACrC,wBAAQ;AACR,wBAAQ,MAAsB;AAC9B,wBAAQ,QAA2B;AACnC,wBAAQ,eAAuB;AAG7B,SAAK,SAAS;AAAA,MACZ,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,GAAG;AAAA,IACL;AAAA,EAGF;AAAA,EAEA,MAAc,gBAAgB;AAC5B,QAAI,KAAK;AAAa;AAEtB,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,YAAM,KAAK,eAAe;AAG1B,WAAK,gBAAgB;AAGrB,WAAK,IAAI,IAAI,eAAe;AAC5B,WAAK,IAAI,IAAI,YAAY;AAEzB,WAAK,cAAc;AAAA,IAErB,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,EAEA,MAAc,iBAAiB;AAC7B,UAAM,YAAY,IAAI,UAAU,KAAK,OAAO,QAAS,KAAK,IAAI;AAG9D,UAAM,UAAU,WAAW;AAG3B,QAAI,CAAC,UAAU,cAAc,KAAK,CAAC,UAAU,QAAQ;AACnD,cAAQ,KAAK,wEAA8D;AAC3E;AAAA,IACF;AAEA,YAAQ,IAAI,iCAA4B;AACxC,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;AAEF,cAAM,eAAeD,MAAK,WAAW,QAAQ,IAAI,WAAWA,MAAK,QAAQ,QAAQ;AACjF,cAAM,UAAUE,eAAc,YAAY,EAAE;AAC5C,cAAM,mBAAmB,GAAG,OAAO,MAAM,KAAK,IAAI,CAAC;AAEnD,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,UAAM,KAAK,cAAc;AAEzB,WAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,WAAK,SAAS,KAAK,IAAI,OAAO,KAAK,OAAO,MAAM,MAAM;AACpD,gBAAQ,IAAI,sCAAsC,KAAK,OAAO,IAAI,EAAE;AACpE,gBAAQ;AAAA,MACV,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,CAACD,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,CAAC,WAAgB,QAAa,CAAC,MAAM;AAClE,MAAI;AAEF,UAAM,OAAO,eAAe,UAAU,KAAK,CAAC;AAC5C,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;AAAA,MACN,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;",
|
|
6
6
|
"names": ["path", "fs", "fs", "path", "escapeHtml", "content", "fs", "path", "pathToFileURL", "pathToFileURL", "path", "fs", "pathToFileURL"]
|
|
7
7
|
}
|