baraqex 1.0.43 → 1.0.45
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/README_WASM.md +472 -0
- package/bin/baraqex.js +1 -1
- package/dist/browser.js +1 -1067
- package/dist/browser.js.map +4 -4
- package/dist/index.js +28 -1087
- package/dist/index.js.map +4 -4
- package/dist/{server/index.js → server.js} +21 -249
- package/dist/server.js.map +7 -0
- package/package.json +49 -58
- package/templates/ssr-template/index.html +35 -0
- package/templates/ssr-template/package-lock.json +2665 -446
- package/templates/ssr-template/package.json +20 -14
- package/templates/ssr-template/src/App.tsx +65 -42
- package/templates/ssr-template/src/client.tsx +2 -10
- package/templates/wasm/package-lock.json +3169 -2710
- package/templates/wasm/package.json +9 -12
- package/templates/wasm/src/App.tsx +50 -19
- package/templates/wasm/vite.config.ts +24 -59
- package/dist/api/hello.d.ts +0 -3
- package/dist/api/hello.d.ts.map +0 -1
- package/dist/api/users/[id].d.ts +0 -5
- package/dist/api/users/[id].d.ts.map +0 -1
- package/dist/browser.d.ts +0 -29
- package/dist/browser.d.ts.map +0 -1
- package/dist/browser.package.json +0 -4
- package/dist/frontend/components/WasmLoader.d.ts +0 -2
- package/dist/frontend/components/WasmLoader.d.ts.map +0 -1
- package/dist/frontend/hooks/useWasm.d.ts +0 -2
- package/dist/frontend/hooks/useWasm.d.ts.map +0 -1
- package/dist/frontend/index.d.ts +0 -2
- package/dist/frontend/index.d.ts.map +0 -1
- package/dist/index.d.ts +0 -34
- package/dist/index.d.ts.map +0 -1
- package/dist/renderComponent.d.ts +0 -9
- package/dist/renderComponent.d.ts.map +0 -1
- package/dist/server/api-router.d.ts +0 -16
- package/dist/server/api-router.d.ts.map +0 -1
- package/dist/server/auth.d.ts +0 -25
- package/dist/server/auth.d.ts.map +0 -1
- package/dist/server/database.d.ts +0 -22
- package/dist/server/database.d.ts.map +0 -1
- package/dist/server/index.d.ts +0 -115
- package/dist/server/index.d.ts.map +0 -1
- package/dist/server/index.js.map +0 -7
- package/dist/server/middleware.d.ts +0 -11
- package/dist/server/middleware.d.ts.map +0 -1
- package/dist/server/package.json +0 -4
- package/dist/server/templates.d.ts +0 -31
- package/dist/server/templates.d.ts.map +0 -1
- package/dist/server/types.d.ts +0 -69
- package/dist/server/types.d.ts.map +0 -1
- package/dist/server/utils.d.ts +0 -70
- package/dist/server/utils.d.ts.map +0 -1
- package/dist/server/wasm.d.ts +0 -29
- package/dist/server/wasm.d.ts.map +0 -1
- package/dist/server-renderer.d.ts +0 -5
- package/dist/server-renderer.d.ts.map +0 -1
- package/dist/wasm.d.ts +0 -51
- package/dist/wasm.d.ts.map +0 -1
- package/templates/wasm/src/index.html +0 -14
- package/templates/wasm/src/main.tsx +0 -5
- package/templates/wasm/src/wasm-loader.ts +0 -119
package/dist/server/index.js.map
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/server/index.ts", "../../node_modules/frontend-hamroun/dist/index.js", "../../src/server/database.ts", "../../src/server/auth.ts", "../../src/server/api-router.ts", "../../src/server/middleware.ts", "../../src/server/utils.ts", "../../src/server/templates.ts", "../../src/server/wasm.ts"],
|
|
4
|
-
"sourcesContent": ["import path from 'path';\r\nimport http from 'http';\r\nimport fs from 'fs';\r\nimport { renderToString } from 'frontend-hamroun';\r\nimport { Database } from './database.js';\r\nimport { AuthService } from './auth.js';\r\nimport { ApiRouter } from './api-router.js';\r\nimport { requestLogger, errorHandler, notFoundHandler, rateLimit } from './middleware.js';\r\n\r\n// Import the utility functions\r\nimport * as utils from './utils.js';\r\nimport * as templates from './templates.js';\r\nimport { initNodeWasm, loadGoWasmFromFile } from './wasm.js';\r\n\r\n// Helper function to get the component name from the file path\r\nfunction getComponentName(filePath: string, pagesDir: string): string {\r\n try {\r\n // Get relative path from pages directory\r\n const relativePath = path.relative(pagesDir, filePath);\r\n // Remove extension\r\n const withoutExt = relativePath.replace(/\\.[^/.]+$/, '');\r\n // Replace index with empty for clean paths\r\n const cleanPath = withoutExt.replace(/\\/index$/, '');\r\n // Convert to module path format\r\n return `/pages/${cleanPath}`;\r\n } catch (e) {\r\n return '';\r\n }\r\n}\r\n\r\nexport interface ServerConfig {\r\n port?: number;\r\n apiDir?: string;\r\n pagesDir?: string;\r\n staticDir?: string;\r\n enableCors?: boolean;\r\n corsOptions?: any;\r\n db?: {\r\n url: string;\r\n type: 'mongodb' | 'mysql' | 'postgres';\r\n };\r\n auth?: {\r\n secret: string;\r\n expiresIn?: string | number;\r\n };\r\n}\r\n\r\nexport class Server {\r\n private app: any;\r\n private server: http.Server | null = null;\r\n private config: ServerConfig;\r\n private db: Database | null = null;\r\n private auth: AuthService | null = null;\r\n\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 this.initializeApp();\r\n }\r\n\r\n private async initializeApp() {\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 } catch (error: any) {\r\n if (error.code === 'MODULE_NOT_FOUND' && error.message.includes('express')) {\r\n throw new Error('Express not installed. Run: npm install express @types/express');\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n private setupApiRoutes() {\r\n const apiRouter = new ApiRouter(this.config.apiDir!, this.auth);\r\n this.app.use('/api', requestLogger, apiRouter.router);\r\n \r\n // Add API documentation route\r\n this.app.get('/api-docs', (req: any, res: any) => {\r\n const apiDocs = this.generateApiDocs();\r\n res.json(apiDocs);\r\n });\r\n }\r\n\r\n private generateApiDocs() {\r\n // Generate documentation based on API routes\r\n const apiDir = path.resolve(process.cwd(), this.config.apiDir!);\r\n const docs = { endpoints: [] as any[] };\r\n \r\n if (fs.existsSync(apiDir)) {\r\n this.scanApiDirectory(apiDir, '', docs.endpoints);\r\n }\r\n \r\n return docs;\r\n }\r\n \r\n private scanApiDirectory(dirPath: string, routePrefix: string, endpoints: any[]) {\r\n const entries = fs.readdirSync(dirPath, { withFileTypes: true });\r\n \r\n for (const entry of entries) {\r\n const fullPath = path.join(dirPath, entry.name);\r\n \r\n if (entry.isDirectory()) {\r\n this.scanApiDirectory(fullPath, `${routePrefix}/${entry.name}`, endpoints);\r\n } else if (entry.name.endsWith('.js') || entry.name.endsWith('.ts')) {\r\n const routePath = this.getRoutePath(entry.name, routePrefix);\r\n endpoints.push({\r\n path: routePath,\r\n file: path.relative(process.cwd(), fullPath),\r\n methods: this.detectApiMethods(fullPath)\r\n });\r\n }\r\n }\r\n }\r\n \r\n private getRoutePath(filename: string, routePrefix: string): string {\r\n const baseName = path.basename(filename, path.extname(filename));\r\n \r\n if (baseName === 'index') {\r\n return routePrefix || '/';\r\n }\r\n \r\n const paramMatch = baseName.match(/^\\[(.+)\\]$/);\r\n if (paramMatch) {\r\n return `${routePrefix}/:${paramMatch[1]}`;\r\n }\r\n \r\n return `${routePrefix}/${baseName}`;\r\n }\r\n \r\n private detectApiMethods(filePath: string): string[] {\r\n try {\r\n const content = fs.readFileSync(filePath, 'utf8');\r\n const methods = ['get', 'post', 'put', 'delete', 'patch', 'options'];\r\n return methods.filter(method => \r\n new RegExp(`export (async )?function ${method}\\\\s*\\\\(`).test(content) ||\r\n new RegExp(`export const ${method}\\\\s*=`).test(content)\r\n );\r\n } catch (error) {\r\n return [];\r\n }\r\n }\r\n\r\n private setupPageRoutes() {\r\n const pagesPath = path.resolve(process.cwd(), this.config.pagesDir!);\r\n if (!fs.existsSync(pagesPath)) {\r\n return;\r\n }\r\n\r\n // Setup catch-all route for SSR - but only if pages directory exists\r\n this.app.get('*', async (req: { path: string; }, res: { status: (arg0: number) => { (): any; new(): any; send: { (arg0: string): void; new(): any; }; }; }) => {\r\n try {\r\n const { html, statusCode } = await this.renderPage(req.path);\r\n res.status(statusCode || 200).send(html);\r\n } catch (error) {\r\n console.error('Error rendering page:', error);\r\n const errorHtml = templates.generateErrorPage(500, 'Server Error');\r\n res.status(500).send(errorHtml);\r\n }\r\n });\r\n }\r\n\r\n private async renderPage(routePath: string): Promise<{ html: string, statusCode?: number }> {\r\n try {\r\n // Try to find the page component\r\n const pagesDir = this.config.pagesDir ? path.resolve(process.cwd(), this.config.pagesDir) : '';\r\n if (!pagesDir || !fs.existsSync(pagesDir)) {\r\n return { \r\n html: templates.generateErrorPage(404, 'Pages directory not found'), \r\n statusCode: 404 \r\n };\r\n }\r\n \r\n // Normalize the path\r\n let normalizedPath = routePath;\r\n if (!normalizedPath.startsWith('/')) {\r\n normalizedPath = '/' + normalizedPath;\r\n }\r\n \r\n // Default to index for the root\r\n if (normalizedPath === '/') {\r\n normalizedPath = '/index';\r\n }\r\n \r\n // Try to find a matching page file\r\n let pagePath = '';\r\n const possiblePaths = [\r\n path.join(pagesDir, `${normalizedPath}.js`),\r\n path.join(pagesDir, `${normalizedPath}.ts`),\r\n path.join(pagesDir, `${normalizedPath}.jsx`),\r\n path.join(pagesDir, `${normalizedPath}.tsx`),\r\n path.join(pagesDir, `${normalizedPath}/index.js`),\r\n path.join(pagesDir, `${normalizedPath}/index.ts`),\r\n path.join(pagesDir, `${normalizedPath}/index.jsx`),\r\n path.join(pagesDir, `${normalizedPath}/index.tsx`)\r\n ];\r\n \r\n for (const p of possiblePaths) {\r\n if (fs.existsSync(p)) {\r\n pagePath = p;\r\n break;\r\n }\r\n }\r\n \r\n // Handle 404 if page not found\r\n if (!pagePath) {\r\n return { \r\n html: templates.generateErrorPage(404, `Page not found: ${normalizedPath}`), \r\n statusCode: 404 \r\n };\r\n }\r\n \r\n // Import and render the page component\r\n try {\r\n const pageModule = await import(pagePath);\r\n if (!pageModule || !pageModule.default) {\r\n throw new Error(`No default export found in ${pagePath}`);\r\n }\r\n \r\n const PageComponent = pageModule.default;\r\n const initialProps = {\r\n // Provide any initial props here\r\n path: normalizedPath,\r\n query: {}, // Could be parsed from URL\r\n api: { serverTime: new Date().toISOString() }\r\n };\r\n \r\n // 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 start(): Promise<void> {\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 'frontend-hamroun';\r\n \r\n // Find SSR content and hydrate it\r\n document.addEventListener('DOMContentLoaded', () => {\r\n const ssrRoots = document.querySelectorAll('[data-ssr-root]');\r\n ssrRoots.forEach(root => {\r\n const componentPath = root.getAttribute('data-component');\r\n if (componentPath) {\r\n import(componentPath).then(module => {\r\n hydrate(module.default, root);\r\n });\r\n }\r\n });\r\n });\r\n `;\r\n fs.writeFileSync(clientJsPath, clientJsContent);\r\n }\r\n }\r\n }\r\n\r\n public registerPlugin(plugin: (server: Server) => void): void {\r\n plugin(this);\r\n }\r\n \r\n public addShutdownHandler(): void {\r\n // Handle graceful shutdown\r\n const gracefulShutdown = async () => {\r\n console.log('Received shutdown signal, closing server...');\r\n try {\r\n await this.stop();\r\n if (this.db) {\r\n await this.db.disconnect();\r\n }\r\n console.log('Server shut down gracefully');\r\n process.exit(0);\r\n } catch (error) {\r\n console.error('Error during shutdown:', error);\r\n process.exit(1);\r\n }\r\n };\r\n \r\n // Listen for termination signals\r\n process.on('SIGTERM', gracefulShutdown);\r\n process.on('SIGINT', gracefulShutdown);\r\n }\r\n}\r\n\r\n// Add server utility functions\r\n\r\n/**\r\n * Creates and configures a new server instance\r\n */\r\nexport function createServer(config: ServerConfig = {}): Server {\r\n return new Server(config);\r\n}\r\n\r\n/**\r\n * Creates a new server with sensible defaults for development\r\n */\r\nexport function createDevServer(options: {\r\n port?: number;\r\n enableCors?: boolean;\r\n} = {}): Server {\r\n return new Server({\r\n port: options.port || 3000,\r\n enableCors: options.enableCors !== false,\r\n apiDir: './src/api',\r\n pagesDir: './src/pages',\r\n staticDir: './public'\r\n });\r\n}\r\n\r\n/**\r\n * Creates a production-ready server with optimized settings\r\n */\r\nexport function createProductionServer(config: ServerConfig): Server {\r\n const server = new Server({\r\n ...config,\r\n // Fix the PORT parsing\r\n port: config.port || (process.env.PORT ? parseInt(process.env.PORT) : 8080)\r\n });\r\n \r\n // Add shutdown handler for production environments\r\n server.addShutdownHandler();\r\n \r\n return server;\r\n}\r\n\r\n// Export additional utility functions\r\nexport function getRequestIp(req: any): string {\r\n return req.ip || \r\n (req.headers['x-forwarded-for'] as string)?.split(',')[0].trim() || \r\n req.socket.remoteAddress || \r\n '';\r\n}\r\n\r\nexport function parseCookies(req: any): Record<string, string> {\r\n const cookies: Record<string, string> = {};\r\n const cookieHeader = req.headers.cookie;\r\n \r\n if (cookieHeader) {\r\n cookieHeader.split(';').forEach((cookie: string) => {\r\n const [name, value] = cookie.split('=').map(c => c.trim());\r\n cookies[name] = value;\r\n });\r\n }\r\n \r\n return cookies;\r\n}\r\n\r\n// Fix the renderComponent function to 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", "function jsx(type, props) {\n console.log('JSX Transform:', { type, props });\n const processedProps = { ...props };\n // Handle children properly\n if (arguments.length > 2) {\n processedProps.children = Array.prototype.slice.call(arguments, 2);\n }\n return { type, props: processedProps };\n}\nconst Fragment = ({ children }) => children;\nasync function createElement(vnode) {\n console.log('Creating element from:', vnode);\n // Handle primitives and null\n if (vnode == null) {\n return document.createTextNode('');\n }\n if (typeof vnode === 'boolean') {\n return document.createTextNode('');\n }\n if (typeof vnode === 'number' || typeof vnode === 'string') {\n return document.createTextNode(String(vnode));\n }\n // Handle arrays\n if (Array.isArray(vnode)) {\n const fragment = document.createDocumentFragment();\n for (const child of vnode) {\n const node = await createElement(child);\n fragment.appendChild(node);\n }\n return fragment;\n }\n // Handle VNode\n if ('type' in vnode && vnode.props !== undefined) {\n const { type, props } = vnode;\n // Handle function components\n if (typeof type === 'function') {\n try {\n const result = await type(props || {});\n const node = await createElement(result);\n if (node instanceof Element) {\n node.setAttribute('data-component-id', type.name || type.toString());\n }\n return node;\n }\n catch (error) {\n console.error('Error rendering component:', error);\n return document.createTextNode('');\n }\n }\n // Create DOM element\n const element = document.createElement(type);\n // Handle props\n for (const [key, value] of Object.entries(props || {})) {\n if (key === 'children')\n continue;\n if (key.startsWith('on') && typeof value === 'function') {\n const eventName = key.toLowerCase().slice(2);\n // Remove existing event listener if any\n const existingHandler = element.__events?.[eventName];\n if (existingHandler) {\n element.removeEventListener(eventName, existingHandler);\n }\n // Add new event listener\n element.addEventListener(eventName, value);\n if (!element.__events) {\n element.__events = {};\n }\n element.__events[eventName] = value;\n }\n else if (key === 'style' && typeof value === 'object') {\n Object.assign(element.style, value);\n }\n else if (key === 'className') {\n element.setAttribute('class', String(value));\n }\n else if (key !== 'key' && key !== 'ref') {\n element.setAttribute(key, String(value));\n }\n }\n // Handle children\n const children = props?.children;\n if (children != null) {\n const childArray = Array.isArray(children) ? children.flat() : [children];\n for (const child of childArray) {\n const childNode = await createElement(child);\n element.appendChild(childNode);\n }\n }\n return element;\n }\n // Handle other objects by converting to string\n return document.createTextNode(String(vnode));\n}\n\nlet isBatching = false;\nconst queue = [];\nfunction batchUpdates(fn) {\n if (isBatching) {\n queue.push(fn);\n return;\n }\n isBatching = true;\n try {\n fn();\n while (queue.length > 0) {\n const nextFn = queue.shift();\n nextFn?.();\n }\n }\n finally {\n isBatching = false;\n }\n}\n\nconst contexts = new Map();\nfunction createContext(defaultValue) {\n const contextId = Symbol('context');\n const Provider = ({ value, children }) => {\n contexts.set(contextId, value);\n return children;\n };\n const Consumer = ({ children }) => {\n const value = contexts.get(contextId) ?? defaultValue;\n return children(value);\n };\n const context = {\n Provider,\n Consumer,\n displayName: 'Context'\n };\n return context;\n}\nfunction useContext(context) {\n // In a real implementation, this would access the context value from the component tree\n // For now, returning a default value to satisfy TypeScript\n return {};\n}\n\n// Current render ID counter\nlet currentRender = 0;\nlet isSSR = false;\n// State storage\nconst states = new Map();\nconst stateIndices = new Map();\nconst effects = new Map();\nconst memos = new Map();\nconst refs = new Map();\n// Rendering callbacks\nlet globalRenderCallback = null;\nlet globalContainer = null;\nlet currentElement = null;\nfunction setRenderCallback(callback, element, container) {\n globalRenderCallback = callback;\n globalContainer = container;\n currentElement = element;\n}\nfunction prepareRender(component = null, isServerSideRender = false) {\n currentRender++;\n isSSR = isServerSideRender;\n stateIndices.set(currentRender, 0);\n // Initialize state array for this render if it doesn't exist\n if (!states.has(currentRender)) {\n states.set(currentRender, []);\n }\n return currentRender;\n}\nfunction finishRender() {\n // Don't reset currentRender to 0 immediately to preserve state\n // currentRender = 0;\n}\nfunction useState(initial) {\n if (!currentRender) {\n throw new Error(\"useState must be called within a render\");\n }\n if (!states.has(currentRender)) {\n states.set(currentRender, []);\n }\n const componentStates = states.get(currentRender);\n const index = stateIndices.get(currentRender) || 0;\n if (index >= componentStates.length) {\n componentStates.push(initial);\n }\n const state = componentStates[index];\n const setState = (newValue) => {\n // For SSR, don't actually update state\n if (isSSR) {\n return;\n }\n const nextValue = typeof newValue === 'function'\n ? newValue(componentStates[index])\n : newValue;\n if (componentStates[index] === nextValue)\n return;\n componentStates[index] = nextValue;\n if (isBatching) {\n batchUpdates(() => rerender(currentRender));\n }\n else {\n rerender(currentRender);\n }\n };\n stateIndices.set(currentRender, index + 1);\n return [state, setState];\n}\nfunction useEffect(callback, deps) {\n if (!currentRender)\n throw new Error(\"useEffect must be called within a render\");\n // Skip effects during SSR\n if (isSSR) {\n const effectIndex = stateIndices.get(currentRender) || 0;\n stateIndices.set(currentRender, effectIndex + 1);\n return;\n }\n const effectIndex = stateIndices.get(currentRender) || 0;\n if (!effects.has(currentRender)) {\n effects.set(currentRender, []);\n }\n const componentEffects = effects.get(currentRender);\n const prevEffect = componentEffects[effectIndex];\n if (!prevEffect || !deps || !prevEffect.deps || deps.some((dep, i) => dep !== prevEffect.deps[i])) {\n if (prevEffect?.cleanup) {\n prevEffect.cleanup();\n }\n // Schedule effect execution after render is complete\n queueMicrotask(() => {\n const cleanup = callback() || undefined;\n componentEffects[effectIndex] = { cleanup, deps: deps || [] };\n });\n }\n stateIndices.set(currentRender, effectIndex + 1);\n}\nfunction useMemo(factory, deps) {\n if (!currentRender)\n throw new Error(\"useMemo must be called within a render\");\n const memoIndex = stateIndices.get(currentRender) || 0;\n if (!memos.has(currentRender)) {\n memos.set(currentRender, []);\n }\n const componentMemos = memos.get(currentRender);\n const prevMemo = componentMemos[memoIndex];\n if (!prevMemo || (deps && deps.some((dep, i) => !Object.is(dep, prevMemo.deps[i])))) {\n const value = factory();\n componentMemos[memoIndex] = { value, deps: deps || [] };\n stateIndices.set(currentRender, memoIndex + 1);\n return value;\n }\n stateIndices.set(currentRender, memoIndex + 1);\n return prevMemo.value;\n}\nfunction useRef(initial) {\n if (!currentRender)\n throw new Error(\"useRef must be called within a render\");\n const refIndex = stateIndices.get(currentRender) || 0;\n if (!refs.has(currentRender)) {\n refs.set(currentRender, []);\n }\n const componentRefs = refs.get(currentRender);\n if (refIndex >= componentRefs.length) {\n const ref = { current: initial };\n componentRefs.push(ref);\n stateIndices.set(currentRender, refIndex + 1);\n return ref;\n }\n const ref = componentRefs[refIndex];\n stateIndices.set(currentRender, refIndex + 1);\n return ref;\n}\nasync function rerender(rendererId) {\n try {\n // Skip rerender during SSR\n if (isSSR) {\n return;\n }\n // Clean up effects\n const componentEffects = effects.get(rendererId);\n if (componentEffects) {\n componentEffects.forEach(effect => {\n if (effect.cleanup)\n effect.cleanup();\n });\n effects.set(rendererId, []);\n }\n // Trigger re-render\n if (globalRenderCallback && globalContainer && currentElement) {\n await globalRenderCallback(currentElement, globalContainer);\n }\n }\n catch (error) {\n console.error('Error during rerender:', error);\n }\n}\nfunction useErrorBoundary() {\n const [error, setError] = useState(null);\n return [error, () => setError(null)];\n}\n\n// Render function for client-side rendering\nasync function render(element, container) {\n try {\n // Set up render callback for state updates\n setRenderCallback(render, element, container);\n // Prepare render context\n const renderId = prepareRender(element);\n // Create DOM nodes from virtual elements\n const domNode = await createElement(element);\n // Clear container and append new content\n // Handle both Element and DocumentFragment cases\n if (container instanceof Element) {\n container.innerHTML = '';\n }\n else {\n // For DocumentFragment, clear all children\n while (container.firstChild) {\n container.removeChild(container.firstChild);\n }\n }\n container.appendChild(domNode);\n // Finish render\n finishRender();\n console.log('Render completed successfully');\n }\n catch (error) {\n console.error('Error during render:', error);\n throw error;\n }\n}\n// Hydrate function for client-side hydration of SSR content\nasync function hydrate(element, container) {\n try {\n console.log('Starting hydration...');\n // For now, hydrate works the same as render\n // In a more advanced implementation, this would preserve existing DOM\n // and only attach event listeners and initialize state\n await render(element, container);\n console.log('Hydration completed successfully');\n }\n catch (error) {\n console.error('Error during hydration:', error);\n throw error;\n }\n}\n\nasync function renderToString(element) {\n prepareRender(element); // Pass the element to establish render context\n try {\n const html = await renderNodeToString(element);\n return html;\n }\n finally {\n }\n}\nasync function renderNodeToString(node) {\n // Handle null, undefined, boolean\n if (node == null || typeof node === 'boolean') {\n return '';\n }\n // Handle primitives\n if (typeof node === 'string' || typeof node === 'number') {\n return escapeHtml(String(node));\n }\n // Handle arrays\n if (Array.isArray(node)) {\n const results = await Promise.all(node.map(child => renderNodeToString(child)));\n return results.join('');\n }\n // Handle objects with type and props (React-like elements)\n if (node && typeof node === 'object' && 'type' in node) {\n const { type, props = {} } = node;\n // Handle function components\n if (typeof type === 'function') {\n try {\n // Set up a new render context for this component\n const componentRenderId = prepareRender(type);\n try {\n const result = await type(props);\n return await renderNodeToString(result);\n }\n finally {\n finishRender();\n }\n }\n catch (error) {\n console.error('Error rendering component:', error);\n return `<!-- Error rendering component: ${error.message} -->`;\n }\n }\n // Handle DOM elements\n if (typeof type === 'string') {\n return await renderDOMElement(type, props);\n }\n }\n // Fallback for other objects\n if (typeof node === 'object') {\n return escapeHtml(JSON.stringify(node));\n }\n return escapeHtml(String(node));\n}\nasync function renderDOMElement(tagName, props) {\n const { children, ...attrs } = props;\n // Self-closing tags\n const voidElements = new Set([\n 'area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input',\n 'link', 'meta', 'param', 'source', 'track', 'wbr'\n ]);\n // Build attributes string\n const attributeString = Object.entries(attrs)\n .filter(([key, value]) => {\n // Filter out React-specific props and event handlers\n if (key.startsWith('on') || key === 'key' || key === 'ref')\n return false;\n if (value == null || value === false)\n return false;\n return true;\n })\n .map(([key, value]) => {\n // Handle className -> class\n if (key === 'className')\n key = 'class';\n // Handle boolean attributes\n if (value === true)\n return key;\n // Handle style objects\n if (key === 'style' && typeof value === 'object' && value !== null) {\n const styleString = Object.entries(value)\n .map(([prop, val]) => `${kebabCase(prop)}:${val}`)\n .join(';');\n return `style=\"${escapeHtml(styleString)}\"`;\n }\n return `${key}=\"${escapeHtml(String(value))}\"`;\n })\n .join(' ');\n const openTag = `<${tagName}${attributeString ? ' ' + attributeString : ''}>`;\n // Self-closing elements\n if (voidElements.has(tagName)) {\n return openTag.slice(0, -1) + '/>';\n }\n // Elements with children\n const closeTag = `</${tagName}>`;\n if (children != null) {\n const childrenString = await renderNodeToString(children);\n return openTag + childrenString + closeTag;\n }\n return openTag + closeTag;\n}\nfunction escapeHtml(text) {\n const htmlEscapes = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": ''',\n '/': '/'\n };\n return text.replace(/[&<>\"'/]/g, (match) => htmlEscapes[match]);\n}\nfunction kebabCase(str) {\n return str.replace(/[A-Z]/g, (match) => `-${match.toLowerCase()}`);\n}\n\nfunction arePropsEqual(oldProps, newProps) {\n const oldKeys = Object.keys(oldProps).filter(k => k !== 'children');\n const newKeys = Object.keys(newProps).filter(k => k !== 'children');\n if (oldKeys.length !== newKeys.length)\n return false;\n return oldKeys.every(key => oldProps[key] === newProps[key]);\n}\nfunction diff(oldNode, newNode) {\n if (oldNode == null || newNode == null)\n return oldNode !== newNode;\n if (typeof oldNode !== typeof newNode)\n return true;\n if (typeof newNode === 'string' || typeof newNode === 'number')\n return oldNode !== newNode;\n if (newNode.type !== oldNode.type)\n return true;\n return !arePropsEqual(oldNode.props, newNode.props);\n}\nfunction shouldComponentUpdate(oldProps, newProps) {\n return !arePropsEqual(oldProps, newProps);\n}\n\nclass Component {\n constructor(props = {}) {\n this.state = {};\n this.element = null;\n this._mounted = false;\n this.props = props;\n }\n componentDidMount() {\n // Hook for after component is mounted\n }\n async setState(newState) {\n const prevState = { ...this.state };\n this.state = { ...prevState, ...newState };\n console.log(`${this.constructor.name} state updated:`, {\n prev: prevState,\n next: this.state\n });\n await Promise.resolve(); // Ensure state is updated before re-render\n if (this._mounted) {\n await this.update();\n }\n else {\n await this.update();\n }\n }\n _replayEvents(oldElement, newElement) {\n const oldEvents = oldElement.__events || {};\n Object.entries(oldEvents).forEach(([event, handler]) => {\n newElement.addEventListener(event, handler);\n });\n newElement.__events = oldEvents;\n }\n _deepCloneWithEvents(node) {\n const clone = node.cloneNode(false);\n // Copy events from original element\n const events = node.__events || {};\n clone.__events = events;\n Object.entries(events).forEach(([event, handler]) => {\n clone.addEventListener(event, handler);\n });\n // Clone children\n Array.from(node.childNodes).forEach(child => {\n if (child instanceof HTMLElement) {\n clone.appendChild(this._deepCloneWithEvents(child));\n }\n else {\n clone.appendChild(child.cloneNode(true));\n }\n });\n return clone;\n }\n async update() {\n const vdom = this.render();\n if (!vdom)\n return document.createTextNode('');\n const rendered = await createElement(vdom);\n if (rendered instanceof HTMLElement) {\n return this._updateElement(rendered);\n }\n const wrapper = document.createElement('div');\n wrapper.appendChild(rendered);\n return this._updateElement(wrapper);\n }\n async _updateElement(rendered) {\n const newElement = this._deepCloneWithEvents(rendered);\n newElement.__instance = this;\n if (!this.element) {\n this.element = newElement;\n if (!this._mounted) {\n this._mounted = true;\n queueMicrotask(() => this.componentDidMount());\n }\n }\n else if (this.element.parentNode) {\n this.element.parentNode.replaceChild(newElement, this.element);\n this.element = newElement;\n }\n return this.element;\n }\n render() {\n throw new Error('Component must implement render() method');\n }\n}\n\n/**\n * Client-side router for single-page applications\n */\n// Create context for router\nconst RouterContext = createContext({\n location: {\n pathname: '/',\n search: '',\n hash: ''\n },\n params: {},\n navigate: () => { },\n match: () => false\n});\n// Parse path pattern into regex\nfunction parsePath(path) {\n // Convert :param syntax to capture groups\n const pattern = path\n .replace(/\\/+$/, '') // Remove trailing slashes\n .replace(/^\\/+/, '/') // Ensure leading slash\n .replace(/\\/:([^/]+)/g, '/([^/]+)');\n // Get param names\n const paramNames = [];\n path.replace(/\\/:([^/]+)/g, (_, paramName) => {\n paramNames.push(paramName);\n return '';\n });\n return { pattern, paramNames };\n}\n// Match a path against a pattern\nfunction matchPath(pathname, route) {\n const { path, exact = false } = route;\n const { pattern, paramNames } = parsePath(path);\n // Create regex with or without exact matching\n const regex = new RegExp(`^${pattern}${exact ? '$' : ''}`);\n const match = pathname.match(regex);\n if (!match)\n return null;\n // Extract params\n const params = {};\n paramNames.forEach((name, index) => {\n params[name] = match[index + 1];\n });\n return params;\n}\n// Router Provider component\nfunction RouterProvider({ routes, children }) {\n // Get initial location from window if available\n const getInitialLocation = () => {\n if (typeof window === 'undefined') {\n return { pathname: '/', search: '', hash: '' };\n }\n return {\n pathname: window.location.pathname,\n search: window.location.search,\n hash: window.location.hash\n };\n };\n // Fix: Call the function to get the initial value instead of passing the function itself\n const [location, setLocation] = useState(getInitialLocation());\n const [params, setParams] = useState({});\n // Update params when location changes\n useEffect(() => {\n for (const route of routes) {\n const matchedParams = matchPath(location.pathname, route);\n if (matchedParams) {\n setParams(matchedParams);\n break;\n }\n }\n }, [location, routes]);\n // Listen for popstate events\n useEffect(() => {\n if (typeof window === 'undefined')\n return;\n const handlePopState = () => {\n setLocation({\n pathname: window.location.pathname,\n search: window.location.search,\n hash: window.location.hash\n });\n };\n window.addEventListener('popstate', handlePopState);\n return () => window.removeEventListener('popstate', handlePopState);\n }, []);\n // Navigation function\n const navigate = (to, options = {}) => {\n if (typeof window === 'undefined')\n return;\n const { replace = false, state = null } = options;\n if (replace) {\n window.history.replaceState(state, '', to);\n }\n else {\n window.history.pushState(state, '', to);\n }\n // Update location\n setLocation({\n pathname: window.location.pathname,\n search: window.location.search,\n hash: window.location.hash\n });\n };\n // Match function to test if a path matches the current location\n const match = (path) => {\n const { pattern } = parsePath(path);\n const regex = new RegExp(`^${pattern}`);\n return regex.test(location.pathname);\n };\n // Router context value\n const routerValue = {\n location: {\n pathname: location.pathname,\n search: location.search,\n hash: location.hash\n },\n params,\n navigate,\n match\n };\n return jsx(RouterContext.Provider, { value: routerValue, children });\n}\n// Route component\nfunction Route({ path, component: Component, props = {} }) {\n const context = useContext();\n const params = context.params;\n const locationPathname = context.location.pathname;\n const routeToMatch = { path, component: Component };\n const match = matchPath(locationPathname, routeToMatch);\n if (!match)\n return null;\n return jsx(Component, { ...props, params });\n}\n// Switch component\nfunction Switch({ children }) {\n const context = useContext();\n const locationPathname = context.location.pathname;\n // Find the first matching route\n const child = Array.isArray(children)\n ? children.find(child => {\n if (!child || typeof child.type !== 'function' || !child.props.path)\n return false;\n const routeObj = {\n path: child.props.path,\n component: child.type,\n exact: child.props.exact || false\n };\n return matchPath(locationPathname, routeObj);\n })\n : children;\n return child || null;\n}\n// Link component\nfunction Link({ to, replace = false, state = null, className = '', activeClassName = '', children, ...rest }) {\n const context = useContext();\n const navigate = context.navigate;\n const match = context.match;\n const handleClick = (e) => {\n e.preventDefault();\n navigate(to, { replace, state });\n };\n const isActive = match(to);\n const classes = [\n className,\n isActive ? activeClassName : ''\n ].filter(Boolean).join(' ');\n return jsx('a', {\n href: to,\n className: classes || undefined,\n onClick: handleClick,\n ...rest,\n children\n });\n}\n// Redirect component\nfunction Redirect({ to, replace = true }) {\n const context = useContext();\n const navigate = context.navigate;\n useEffect(() => {\n navigate(to, { replace });\n }, [to]);\n return null;\n}\n// Hooks\nfunction useLocation() {\n const context = useContext();\n return context.location;\n}\nfunction useParams() {\n const context = useContext();\n return context.params;\n}\nfunction useNavigate() {\n const context = useContext();\n return context.navigate;\n}\n\n/**\n * Form handling utilities for the framework\n */\nfunction useForm(options) {\n const { initialValues, validate, onSubmit } = options;\n const [values, setValues] = useState(initialValues);\n const [errors, setErrors] = useState({});\n const [touched, setTouched] = useState({});\n const [dirty, setDirty] = useState({});\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [submitCount, setSubmitCount] = useState(0);\n // Track form validity and dirty state\n const isValid = Object.keys(errors).length === 0;\n const isDirty = Object.values(dirty).some(Boolean);\n // Validate form when values or validate function changes\n useEffect(() => {\n if (validate) {\n const validationErrors = validate(values);\n setErrors(validationErrors || {});\n }\n }, [values, validate]);\n // Handle form input changes\n const handleChange = (e) => {\n const { name, value, type, checked } = e.target;\n const fieldValue = type === 'checkbox' ? checked : value;\n setValues(prev => ({\n ...prev,\n [name]: fieldValue\n }));\n setDirty(prev => ({\n ...prev,\n [name]: true\n }));\n };\n // Handle field blur\n const handleBlur = (e) => {\n const { name } = e.target;\n setTouched(prev => ({\n ...prev,\n [name]: true\n }));\n };\n // Set field value programmatically\n const setFieldValue = (field, value) => {\n setValues(prev => ({\n ...prev,\n [field]: value\n }));\n setDirty(prev => ({\n ...prev,\n [field]: true\n }));\n };\n // Set field error programmatically\n const setFieldError = (field, error) => {\n setErrors(prev => ({\n ...prev,\n [field]: error\n }));\n };\n // Update multiple values at once\n const updateValues = (newValues) => {\n setValues(prev => ({\n ...prev,\n ...newValues\n }));\n // Mark changed fields as dirty\n const dirtyFields = {};\n Object.keys(newValues).forEach(key => {\n dirtyFields[key] = true;\n });\n setDirty(prev => ({\n ...prev,\n ...dirtyFields\n }));\n };\n // Reset form to initial state\n const resetForm = () => {\n setValues(initialValues);\n setErrors({});\n setTouched({});\n setDirty({});\n setIsSubmitting(false);\n };\n // Handle form submission\n const handleSubmit = async (e) => {\n e.preventDefault();\n // Mark all fields as touched\n const allTouched = {};\n Object.keys(values).forEach(key => {\n allTouched[key] = true;\n });\n setTouched(allTouched);\n // Validate before submission\n let validationErrors = {};\n if (validate) {\n validationErrors = validate(values);\n setErrors(validationErrors || {});\n }\n // Only proceed if valid\n if (Object.keys(validationErrors).length === 0 && onSubmit) {\n setIsSubmitting(true);\n setSubmitCount(count => count + 1);\n try {\n await onSubmit(values, {\n fields: Object.keys(values).reduce((acc, key) => {\n acc[key] = {\n value: values[key],\n error: errors[key],\n touched: touched[key] || false,\n dirty: dirty[key] || false\n };\n return acc;\n }, {}),\n isValid,\n isDirty,\n isSubmitting: true,\n submitCount: submitCount + 1\n });\n }\n finally {\n setIsSubmitting(false);\n }\n }\n };\n return {\n values,\n errors,\n touched,\n dirty,\n isValid,\n isDirty,\n isSubmitting,\n submitCount,\n handleChange,\n handleBlur,\n handleSubmit,\n setFieldValue,\n setFieldError,\n setValues: updateValues,\n resetForm\n };\n}\n\nfunction createEventBus() {\n const events = new Map();\n const onceHandlers = new WeakMap();\n const on = (event, handler) => {\n if (!events.has(event)) {\n events.set(event, new Set());\n }\n events.get(event).add(handler);\n // Return a function to remove this handler\n return () => off(event, handler);\n };\n const once = (event, handler) => {\n // Create a wrapper that will call the handler and remove itself\n const onceWrapper = (...args) => {\n off(event, onceWrapper);\n handler(...args);\n };\n // Store the mapping between the original handler and the wrapper\n onceHandlers.set(handler, onceWrapper);\n // Register the wrapper\n return on(event, onceWrapper);\n };\n const off = (event, handler) => {\n // If no handler is provided, remove all handlers for the event\n if (!handler) {\n events.delete(event);\n return;\n }\n // Check if it's a once handler wrapper\n const wrappedHandler = onceHandlers.get(handler);\n const handlerToRemove = wrappedHandler || handler;\n if (events.has(event)) {\n events.get(event).delete(handlerToRemove);\n // Clean up empty event sets\n if (events.get(event).size === 0) {\n events.delete(event);\n }\n }\n };\n const emit = (event, ...args) => {\n if (!events.has(event)) {\n return;\n }\n // Create a copy of the handlers to avoid issues if handlers modify the set\n const handlers = Array.from(events.get(event));\n // Call each handler with the arguments\n for (const handler of handlers) {\n handler(...args);\n }\n };\n const clear = (event) => {\n if (event) {\n events.delete(event);\n }\n else {\n events.clear();\n }\n };\n return { on, once, off, emit, clear };\n}\n// Create a global event bus instance\nconst globalEventBus = createEventBus();\n// Hook to use the event bus in components\nfunction useEvent(event, handler, options = {}) {\n return options.once\n ? globalEventBus.once(event, handler)\n : globalEventBus.on(event, handler);\n}\n\n/**\n * Global state management solution similar to Redux\n */\nfunction createStore(reducer, initialState, middlewares = []) {\n let state = initialState;\n let listeners = [];\n // Apply middlewares\n let dispatch = (action) => {\n state = reducer(state, action);\n listeners.forEach(listener => listener());\n return action;\n };\n // Chain middlewares\n if (middlewares.length > 0) {\n const middlewareAPI = {\n getState: () => state,\n dispatch: (action) => dispatch(action),\n subscribe: (listener) => subscribe(listener)\n };\n const chain = middlewares.map(middleware => middleware(middlewareAPI));\n dispatch = chain.reduce((a, b) => (next) => a(b(next)))(dispatch);\n }\n // Subscribe to store changes\n function subscribe(listener) {\n listeners.push(listener);\n return function unsubscribe() {\n listeners = listeners.filter(l => l !== listener);\n };\n }\n // Initialize store with default state\n dispatch({ type: '@@INIT' });\n return {\n getState: () => state,\n dispatch,\n subscribe\n };\n}\nconst StoreContext = createContext({\n store: {\n getState: () => ({}),\n dispatch: () => { },\n subscribe: () => () => { }\n },\n state: {}\n});\nfunction StoreProvider({ store, children }) {\n const [state, setState] = useState(store.getState());\n useEffect(() => {\n const unsubscribe = store.subscribe(() => {\n setState(store.getState());\n });\n return unsubscribe;\n }, [store]);\n return jsx(StoreContext.Provider, {\n value: { store, state },\n children\n });\n}\nfunction useSelector(selector) {\n const context = useContext();\n return selector(context.state);\n}\nfunction useDispatch() {\n const context = useContext();\n return context.store.dispatch;\n}\nfunction useStore() {\n const context = useContext();\n return context.store;\n}\n// Common middlewares\nconst logger = (store) => (next) => (action) => {\n console.group(action.type);\n console.log('Previous state:', store.getState());\n console.log('Action:', action);\n const result = next(action);\n console.log('Next state:', store.getState());\n console.groupEnd();\n return result;\n};\nconst thunk = (store) => (next) => (action) => {\n if (typeof action === 'function') {\n return action(store.dispatch, store.getState);\n }\n return next(action);\n};\n\n/**\n * Lifecycle events for components and application\n */\nvar LifecycleEvents;\n(function (LifecycleEvents) {\n LifecycleEvents[\"APP_INIT\"] = \"app:init\";\n LifecycleEvents[\"APP_MOUNTED\"] = \"app:mounted\";\n LifecycleEvents[\"APP_UPDATED\"] = \"app:updated\";\n LifecycleEvents[\"APP_ERROR\"] = \"app:error\";\n LifecycleEvents[\"APP_DESTROYED\"] = \"app:destroyed\";\n LifecycleEvents[\"COMPONENT_CREATED\"] = \"component:created\";\n LifecycleEvents[\"COMPONENT_MOUNTED\"] = \"component:mounted\";\n LifecycleEvents[\"COMPONENT_UPDATED\"] = \"component:updated\";\n LifecycleEvents[\"COMPONENT_ERROR\"] = \"component:error\";\n LifecycleEvents[\"COMPONENT_UNMOUNTED\"] = \"component:unmounted\";\n LifecycleEvents[\"ROUTER_BEFORE_CHANGE\"] = \"router:before-change\";\n LifecycleEvents[\"ROUTER_AFTER_CHANGE\"] = \"router:after-change\";\n LifecycleEvents[\"ROUTER_ERROR\"] = \"router:error\";\n LifecycleEvents[\"STORE_INITIALIZED\"] = \"store:initialized\";\n LifecycleEvents[\"STORE_BEFORE_ACTION\"] = \"store:before-action\";\n LifecycleEvents[\"STORE_AFTER_ACTION\"] = \"store:after-action\";\n LifecycleEvents[\"STORE_ERROR\"] = \"store:error\";\n})(LifecycleEvents || (LifecycleEvents = {}));\n// Event emitters\nfunction emitAppInit(data) {\n globalEventBus.emit(LifecycleEvents.APP_INIT, data);\n}\nfunction emitAppMounted(rootElement) {\n globalEventBus.emit(LifecycleEvents.APP_MOUNTED, rootElement);\n}\nfunction emitAppUpdated() {\n globalEventBus.emit(LifecycleEvents.APP_UPDATED);\n}\nfunction emitAppError(error) {\n globalEventBus.emit(LifecycleEvents.APP_ERROR, error);\n}\nfunction emitAppDestroyed() {\n globalEventBus.emit(LifecycleEvents.APP_DESTROYED);\n}\nfunction emitComponentCreated(info) {\n globalEventBus.emit(LifecycleEvents.COMPONENT_CREATED, info);\n}\nfunction emitComponentMounted(info, element) {\n globalEventBus.emit(LifecycleEvents.COMPONENT_MOUNTED, info, element);\n}\nfunction emitComponentUpdated(info, prevProps, newProps) {\n globalEventBus.emit(LifecycleEvents.COMPONENT_UPDATED, info, prevProps, newProps);\n}\nfunction emitComponentError(info, error) {\n globalEventBus.emit(LifecycleEvents.COMPONENT_ERROR, info, error);\n}\nfunction emitComponentUnmounted(info) {\n globalEventBus.emit(LifecycleEvents.COMPONENT_UNMOUNTED, info);\n}\n// Event listeners\nfunction onAppInit(handler) {\n return globalEventBus.on(LifecycleEvents.APP_INIT, handler);\n}\nfunction onAppMounted(handler) {\n return globalEventBus.on(LifecycleEvents.APP_MOUNTED, handler);\n}\nfunction onAppUpdated(handler) {\n return globalEventBus.on(LifecycleEvents.APP_UPDATED, handler);\n}\nfunction onAppError(handler) {\n return globalEventBus.on(LifecycleEvents.APP_ERROR, handler);\n}\nfunction onAppDestroyed(handler) {\n return globalEventBus.on(LifecycleEvents.APP_DESTROYED, handler);\n}\nfunction onComponentCreated(handler) {\n return globalEventBus.on(LifecycleEvents.COMPONENT_CREATED, handler);\n}\nfunction onComponentMounted(handler) {\n return globalEventBus.on(LifecycleEvents.COMPONENT_MOUNTED, handler);\n}\nfunction onComponentUpdated(handler) {\n return globalEventBus.on(LifecycleEvents.COMPONENT_UPDATED, handler);\n}\nfunction onComponentError(handler) {\n return globalEventBus.on(LifecycleEvents.COMPONENT_ERROR, handler);\n}\nfunction onComponentUnmounted(handler) {\n return globalEventBus.on(LifecycleEvents.COMPONENT_UNMOUNTED, handler);\n}\n\n// Core JSX and rendering functions\n// Default export object for compatibility\nconst frontendHamroun = {\n // JSX\n jsx,\n jsxs: jsx,\n jsxDEV: jsx,\n Fragment,\n createElement,\n // Rendering\n render,\n hydrate,\n renderToString,\n // Hooks\n useState,\n useEffect,\n useMemo,\n useRef,\n useContext,\n useErrorBoundary,\n // Context\n createContext,\n // Utilities\n batchUpdates,\n diff,\n shouldComponentUpdate,\n // Component class\n Component,\n // Router\n RouterProvider,\n Route,\n Switch,\n Link,\n Redirect,\n useLocation,\n useParams,\n useNavigate,\n // Forms\n useForm,\n // Event bus\n createEventBus,\n useEvent,\n eventBus: globalEventBus\n};\n\nexport { Component, Fragment, LifecycleEvents, Link, Redirect, Route, RouterProvider, StoreProvider, Switch, batchUpdates, createContext, createElement, createEventBus, createStore, frontendHamroun as default, diff, emitAppDestroyed, emitAppError, emitAppInit, emitAppMounted, emitAppUpdated, emitComponentCreated, emitComponentError, emitComponentMounted, emitComponentUnmounted, emitComponentUpdated, globalEventBus as eventBus, hydrate, jsx, jsx as jsxDEV, jsx as jsxs, logger, onAppDestroyed, onAppError, onAppInit, onAppMounted, onAppUpdated, onComponentCreated, onComponentError, onComponentMounted, onComponentUnmounted, onComponentUpdated, render, renderToString, shouldComponentUpdate, thunk, useContext, useDispatch, useEffect, useErrorBoundary, useEvent, useForm, useLocation, useMemo, useNavigate, useParams, useRef, useSelector, useState, useStore };\n//# sourceMappingURL=index.js.map\n", "export interface DbConfig {\r\n url: string;\r\n type: 'mongodb' | 'mysql' | 'postgres';\r\n}\r\n\r\nexport class Database {\r\n private config: DbConfig;\r\n private mongoClient: any = null;\r\n private mongoDb: any = null;\r\n private mysqlPool: any = null;\r\n private pgPool: any = null;\r\n\r\n constructor(config: DbConfig) {\r\n this.config = config;\r\n }\r\n\r\n async connect(): Promise<void> {\r\n switch (this.config.type) {\r\n case 'mongodb':\r\n await this.connectMongo();\r\n break;\r\n case 'mysql':\r\n await this.connectMysql();\r\n break;\r\n case 'postgres':\r\n await this.connectPostgres();\r\n break;\r\n default:\r\n throw new Error(`Unsupported database type: ${this.config.type}`);\r\n }\r\n }\r\n\r\n private async connectMongo(): Promise<void> {\r\n try {\r\n const { MongoClient } = await import('mongodb');\r\n this.mongoClient = new MongoClient(this.config.url);\r\n await this.mongoClient.connect();\r\n this.mongoDb = this.mongoClient.db();\r\n console.log('Connected to MongoDB');\r\n } catch (error: any) {\r\n if (error.code === 'MODULE_NOT_FOUND') {\r\n throw new Error('MongoDB driver not installed. Run: npm install mongodb');\r\n }\r\n console.error('MongoDB connection error:', error);\r\n throw error;\r\n }\r\n }\r\n\r\n private async connectMysql(): Promise<void> {\r\n try {\r\n const mysql = await import('mysql2/promise');\r\n this.mysqlPool = mysql.createPool(this.config.url);\r\n // Test connection\r\n await this.mysqlPool.getConnection();\r\n console.log('Connected to MySQL');\r\n } catch (error: any) {\r\n if (error.code === 'MODULE_NOT_FOUND') {\r\n throw new Error('MySQL driver not installed. Run: npm install mysql2');\r\n }\r\n console.error('MySQL connection error:', error);\r\n throw error;\r\n }\r\n }\r\n\r\n private async connectPostgres(): Promise<void> {\r\n try {\r\n const pg = await import('pg');\r\n this.pgPool = new pg.Pool({ connectionString: this.config.url });\r\n // Test connection\r\n const client = await this.pgPool.connect();\r\n client.release();\r\n console.log('Connected to PostgreSQL');\r\n } catch (error: any) {\r\n if (error.code === 'MODULE_NOT_FOUND') {\r\n throw new Error('PostgreSQL driver not installed. Run: npm install pg @types/pg');\r\n }\r\n console.error('PostgreSQL connection error:', error);\r\n throw error;\r\n }\r\n }\r\n\r\n async disconnect(): Promise<void> {\r\n if (this.mongoClient) {\r\n await this.mongoClient.close();\r\n this.mongoClient = null;\r\n this.mongoDb = null;\r\n }\r\n \r\n if (this.mysqlPool) {\r\n await this.mysqlPool.end();\r\n this.mysqlPool = null;\r\n }\r\n \r\n if (this.pgPool) {\r\n await this.pgPool.end();\r\n this.pgPool = null;\r\n }\r\n }\r\n\r\n // Database-specific methods\r\n getMongoDb(): any {\r\n return this.mongoDb;\r\n }\r\n\r\n getMysqlPool(): any {\r\n return this.mysqlPool;\r\n }\r\n\r\n getPgPool(): any {\r\n return this.pgPool;\r\n }\r\n\r\n // Generic query method\r\n async query(sql: string, values?: any[]): Promise<any> {\r\n switch (this.config.type) {\r\n case 'mongodb':\r\n throw new Error('For MongoDB, use getMongoDb() instead of query()');\r\n case 'mysql':\r\n if (!this.mysqlPool) throw new Error('MySQL not connected');\r\n const [rows] = await this.mysqlPool.execute(sql, values || []);\r\n return rows;\r\n case 'postgres':\r\n if (!this.pgPool) throw new Error('PostgreSQL not connected');\r\n const result = await this.pgPool.query(sql, values || []);\r\n return result.rows;\r\n default:\r\n throw new Error(`Unsupported database type: ${this.config.type}`);\r\n }\r\n }\r\n}\r\n", "\r\n\r\nexport interface AuthConfig {\r\n secret: string;\r\n expiresIn?: string | number;\r\n}\r\n\r\nexport interface User {\r\n id: string | number;\r\n username: string;\r\n password?: string;\r\n email?: string;\r\n roles?: string[];\r\n [key: string]: any;\r\n}\r\n\r\nexport class AuthService {\r\n private config: AuthConfig;\r\n\r\n constructor(config: AuthConfig) {\r\n this.config = {\r\n expiresIn: '24h',\r\n ...config\r\n };\r\n }\r\n\r\n async hashPassword(password: string): Promise<string> {\r\n try {\r\n const bcrypt = await import('bcryptjs');\r\n return bcrypt.hash(password, 10);\r\n } catch (error: any) {\r\n if (error.code === 'MODULE_NOT_FOUND') {\r\n throw new Error('bcryptjs not installed. Run: npm install bcryptjs @types/bcryptjs');\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n async comparePasswords(password: string, hashedPassword: string): Promise<boolean> {\r\n try {\r\n const bcrypt = await import('bcryptjs');\r\n return bcrypt.compare(password, hashedPassword);\r\n } catch (error: any) {\r\n if (error.code === 'MODULE_NOT_FOUND') {\r\n throw new Error('bcryptjs not installed. Run: npm install bcryptjs @types/bcryptjs');\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n generateToken(user: Omit<User, 'password'>): string {\r\n try {\r\n const jwt = require('jsonwebtoken');\r\n const options: any = {};\r\n \r\n if (this.config.expiresIn) {\r\n options.expiresIn = this.config.expiresIn;\r\n }\r\n \r\n return jwt.sign(\r\n { id: user.id, username: user.username, roles: user.roles || [] },\r\n this.config.secret,\r\n options\r\n );\r\n } catch (error: any) {\r\n if (error.code === 'MODULE_NOT_FOUND') {\r\n throw new Error('jsonwebtoken not installed. Run: npm install jsonwebtoken @types/jsonwebtoken');\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n verifyToken(token: string): any {\r\n try {\r\n const jwt = require('jsonwebtoken');\r\n return jwt.verify(token, this.config.secret);\r\n } catch (error: any) {\r\n if (error.code === 'MODULE_NOT_FOUND') {\r\n throw new Error('jsonwebtoken not installed. Run: npm install jsonwebtoken @types/jsonwebtoken');\r\n }\r\n return null;\r\n }\r\n }\r\n\r\n // Express middleware for authentication\r\n initialize() {\r\n return (req: any, res: any, next: any) => {\r\n const token = this.extractToken(req);\r\n if (token) {\r\n const decoded = this.verifyToken(token);\r\n if (decoded) {\r\n req.user = decoded;\r\n }\r\n }\r\n next();\r\n };\r\n }\r\n\r\n // Express middleware for requiring authentication\r\n requireAuth() {\r\n return (req: any, res: any, next: any) => {\r\n if (!req.user) {\r\n return res.status(401).json({ message: 'Unauthorized' });\r\n }\r\n return next();\r\n };\r\n }\r\n\r\n // Express middleware for requiring specific roles\r\n requireRoles(roles: string[]) {\r\n return (req: any, res: any, next: any) => {\r\n if (!req.user) {\r\n return res.status(401).json({ message: 'Unauthorized' });\r\n }\r\n \r\n const userRoles = req.user.roles || [];\r\n const hasRequiredRole = roles.some(role => userRoles.includes(role));\r\n \r\n if (!hasRequiredRole) {\r\n return res.status(403).json({ message: 'Forbidden' });\r\n }\r\n \r\n return next();\r\n };\r\n }\r\n\r\n private extractToken(req: any): string | null {\r\n if (req.headers.authorization && req.headers.authorization.startsWith('Bearer ')) {\r\n return req.headers.authorization.substring(7);\r\n }\r\n return null;\r\n }\r\n}\r\n", "import path from 'path';\r\nimport fs from 'fs';\r\nimport { AuthService } from './auth.js';\r\nimport { pathToFileURL } from 'url';\r\n\r\ninterface RouteHandler {\r\n (req: any, res: any, next?: any): void | Promise<void>;\r\n}\r\n\r\ninterface RouteModule {\r\n get?: RouteHandler;\r\n post?: RouteHandler;\r\n put?: RouteHandler;\r\n delete?: RouteHandler;\r\n patch?: RouteHandler;\r\n options?: RouteHandler;\r\n middleware?: ((req: any, res: any, next: any) => void)[];\r\n // Add index signature to allow string indexing\r\n [key: string]: RouteHandler | ((req: any, res: any, next: any) => void)[] | undefined;\r\n}\r\n\r\nexport class ApiRouter {\r\n public router: any;\r\n private apiDir: string;\r\n private auth: AuthService | null;\r\n\r\n constructor(apiDir: string, auth: AuthService | null = null) {\r\n this.router = null;\r\n this.apiDir = path.resolve(process.cwd(), apiDir);\r\n this.auth = auth;\r\n \r\n this.initializeRouter();\r\n }\r\n\r\n private async initializeRouter() {\r\n try {\r\n const express = await import('express');\r\n this.router = express.default.Router();\r\n this.setupRoutes();\r\n } catch (error: any) {\r\n if (error.code === 'MODULE_NOT_FOUND') {\r\n throw new Error('Express not installed. Run: npm install express @types/express');\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n private setupRoutes() {\r\n if (!fs.existsSync(this.apiDir)) {\r\n console.log(`API directory not found: ${this.apiDir}`);\r\n return;\r\n }\r\n\r\n this.scanDirectory(this.apiDir, '');\r\n }\r\n\r\n private scanDirectory(dirPath: string, routePrefix: string) {\r\n const entries = fs.readdirSync(dirPath, { withFileTypes: true });\r\n\r\n for (const entry of entries) {\r\n const fullPath = path.join(dirPath, entry.name);\r\n \r\n if (entry.isDirectory()) {\r\n // Recursively scan subdirectories\r\n this.scanDirectory(fullPath, `${routePrefix}/${entry.name}`);\r\n } else if (this.isRouteFile(entry.name)) {\r\n // Process route file\r\n const routePath = this.getRoutePath(entry.name, routePrefix);\r\n this.registerRoute(fullPath, routePath);\r\n }\r\n }\r\n }\r\n\r\n private isRouteFile(filename: string): boolean {\r\n return filename.endsWith('.js') || \r\n filename.endsWith('.ts') || \r\n filename.endsWith('.mjs');\r\n }\r\n\r\n private getRoutePath(filename: string, routePrefix: string): string {\r\n // Remove extension and handle special names\r\n const baseName = path.basename(filename, path.extname(filename));\r\n \r\n if (baseName === 'index') {\r\n return routePrefix || '/';\r\n }\r\n \r\n // Handle dynamic routes [param]\r\n const paramMatch = baseName.match(/^\\[(.+)\\]$/);\r\n if (paramMatch) {\r\n return `${routePrefix}/:${paramMatch[1]}`;\r\n }\r\n \r\n return `${routePrefix}/${baseName}`;\r\n }\r\n\r\n private async registerRoute(filePath: string, routePath: string) {\r\n try {\r\n // Ensure we have an absolute path and normalize it\r\n const absolutePath = path.isAbsolute(filePath) ? filePath : path.resolve(filePath);\r\n \r\n // Convert to proper file:// URL for Windows\r\n const fileUrl = pathToFileURL(absolutePath).href;\r\n \r\n if (process.platform === 'win32') {\r\n // Add timestamp to force reload on Windows\r\n const urlWithTimestamp = `${fileUrl}?t=${Date.now()}`;\r\n \r\n // Dynamic import the route file\r\n const routeModule = await import(urlWithTimestamp);\r\n \r\n if (!this.isValidRouteModule(routeModule)) {\r\n console.warn(`Invalid route module: ${filePath}`);\r\n return;\r\n }\r\n \r\n console.log(`Registering API route: ${routePath}`);\r\n \r\n // Register middleware if any\r\n const middleware = routeModule.middleware || [];\r\n \r\n // Register HTTP methods\r\n for (const method of ['get', 'post', 'put', 'delete', 'patch', 'options']) {\r\n const handler = routeModule[method];\r\n if (typeof handler === 'function') {\r\n const routerMethod = this.router[method];\r\n routerMethod.call(\r\n this.router,\r\n routePath, \r\n ...middleware,\r\n this.wrapHandler(handler)\r\n );\r\n }\r\n }\r\n } else {\r\n // Non-Windows platforms\r\n const routeModule = await import(fileUrl);\r\n \r\n if (!this.isValidRouteModule(routeModule)) {\r\n console.warn(`Invalid route module: ${filePath}`);\r\n return;\r\n }\r\n \r\n console.log(`Registering API route: ${routePath}`);\r\n \r\n // Register middleware if any\r\n const middleware = routeModule.middleware || [];\r\n \r\n // Register HTTP methods\r\n for (const method of ['get', 'post', 'put', 'delete', 'patch', 'options']) {\r\n const handler = routeModule[method];\r\n if (typeof handler === 'function') {\r\n const routerMethod = this.router[method];\r\n routerMethod.call(\r\n this.router,\r\n routePath, \r\n ...middleware,\r\n this.wrapHandler(handler)\r\n );\r\n }\r\n }\r\n }\r\n } catch (error) {\r\n console.error(`Error registering route (${filePath}):`, error);\r\n }\r\n }\r\n\r\n private isValidRouteModule(module: any): module is RouteModule {\r\n if (!module) return false;\r\n \r\n // Check if at least one HTTP method handler is defined\r\n return ['get', 'post', 'put', 'delete', 'patch', 'options']\r\n .some(method => typeof module[method] === 'function');\r\n }\r\n\r\n private wrapHandler(handler: RouteHandler) {\r\n return async (req: any, res: any, next: any) => {\r\n try {\r\n await handler(req, res, next);\r\n } catch (error) {\r\n next(error);\r\n }\r\n };\r\n }\r\n}\r\n", "import { Request, Response, NextFunction } from 'express';\r\n\r\nexport interface MiddlewareFunction {\r\n (req: any, res: any, next: any): void | Promise<void>;\r\n}\r\n\r\n// Common middleware functions\r\nexport const requestLogger: MiddlewareFunction = (req, res, next) => {\r\n console.log(`${new Date().toISOString()} - ${req.method} ${req.url}`);\r\n next();\r\n};\r\n\r\nexport const errorHandler = (\r\n err: Error, \r\n req: any, \r\n res: any, \r\n next: any\r\n) => {\r\n console.error(err.stack);\r\n res.status(500).json({\r\n error: {\r\n message: 'Internal Server Error',\r\n ...(process.env.NODE_ENV !== 'production' ? { details: err.message, stack: err.stack } : {})\r\n }\r\n });\r\n};\r\n\r\nexport const notFoundHandler = (req: any, res: any) => {\r\n res.status(404).json({\r\n error: {\r\n message: `Not Found - ${req.method} ${req.url}`\r\n }\r\n });\r\n};\r\n\r\n// Middleware for rate limiting\r\nexport function rateLimit(options: { windowMs: number; max: number }) {\r\n const requests = new Map<string, number[]>();\r\n \r\n return (req: any, res: any, next: any) => {\r\n const ip = req.ip || req.socket.remoteAddress || 'unknown';\r\n const now = Date.now();\r\n \r\n // Get existing requests and filter out old ones\r\n const reqTimes = (requests.get(ip) || [])\r\n .filter(time => now - time < options.windowMs);\r\n \r\n // Add current request\r\n reqTimes.push(now);\r\n requests.set(ip, reqTimes);\r\n \r\n // Check if too many requests\r\n if (reqTimes.length > options.max) {\r\n return res.status(429).json({\r\n error: {\r\n message: 'Too Many Requests',\r\n retryAfter: Math.ceil(options.windowMs / 1000)\r\n }\r\n });\r\n }\r\n \r\n return next();\r\n };\r\n}\r\n", "import crypto from 'crypto';\r\nimport fs from 'fs/promises';\r\nimport path from 'path';\r\n\r\n/**\r\n * Utility functions for server-side operations\r\n */\r\n\r\n/**\r\n * Safely parse JSON with error handling\r\n */\r\nexport function safeJsonParse<T>(json: string, fallback: T): T {\r\n try {\r\n return JSON.parse(json) as T;\r\n } catch (error) {\r\n return fallback;\r\n }\r\n}\r\n\r\n/**\r\n * Generate a secure random token\r\n */\r\nexport function generateToken(length: number = 32): string {\r\n return crypto.randomBytes(length).toString('hex');\r\n}\r\n\r\n/**\r\n * Hash a string using SHA-256\r\n */\r\nexport function hashString(input: string, salt: string = ''): string {\r\n return crypto.createHash('sha256').update(input + salt).digest('hex');\r\n}\r\n\r\n/**\r\n * Get pagination parameters from request\r\n */\r\nexport function getPagination(req: any): { page: number; limit: number; skip: number } {\r\n const page = Math.max(1, parseInt(req.query.page as string) || 1);\r\n const rawLimit = parseInt(req.query.limit as string);\r\n \r\n // If no limit is provided or limit is 0/invalid, use default of 20\r\n // If limit is provided and valid, enforce min of 1 and max of 100\r\n let limit: number;\r\n if (isNaN(rawLimit) || rawLimit <= 0) {\r\n limit = 20; // Default limit\r\n } else {\r\n limit = Math.max(1, Math.min(100, rawLimit));\r\n }\r\n \r\n const skip = (page - 1) * limit;\r\n \r\n return { page, limit, skip };\r\n}\r\n\r\n/**\r\n * Standard success response format\r\n */\r\nexport function sendSuccess<T>(res: any, data: T, message: string = 'Success'): any {\r\n return res.json({\r\n success: true,\r\n message,\r\n data\r\n });\r\n}\r\n\r\n/**\r\n * Standard error response format\r\n */\r\nexport function sendError(\r\n res: any, \r\n message: string = 'An error occurred', \r\n statusCode: number = 400,\r\n errors?: any\r\n): any {\r\n return res.status(statusCode).json({\r\n success: false,\r\n message,\r\n errors: errors || undefined\r\n });\r\n}\r\n\r\n/**\r\n * Validate required fields in request body\r\n */\r\nexport function validateFields(\r\n req: any, \r\n requiredFields: string[]\r\n): { valid: boolean; missing: string[] } {\r\n const missing = requiredFields.filter(field => {\r\n const value = req.body[field];\r\n return value === undefined || value === null || value === '';\r\n });\r\n \r\n return {\r\n valid: missing.length === 0,\r\n missing\r\n };\r\n}\r\n\r\n/**\r\n * Handle file upload validation\r\n */\r\nexport function validateFileUpload(\r\n file: any, // Using 'any' to avoid the Express.Multer dependency\r\n options: {\r\n maxSize?: number;\r\n allowedTypes?: string[];\r\n } = {}\r\n): { valid: boolean; error?: string } {\r\n if (!file) {\r\n return { valid: false, error: 'No file provided' };\r\n }\r\n \r\n // Check file size\r\n if (options.maxSize && file.size > options.maxSize) {\r\n return { \r\n valid: false, \r\n error: `File too large. Maximum size allowed is ${options.maxSize / 1024 / 1024}MB` \r\n };\r\n }\r\n \r\n // Check file type\r\n if (options.allowedTypes && options.allowedTypes.length > 0) {\r\n const fileType = file.mimetype;\r\n if (!options.allowedTypes.includes(fileType)) {\r\n return { \r\n valid: false, \r\n error: `Invalid file type. Allowed types: ${options.allowedTypes.join(', ')}` \r\n };\r\n }\r\n }\r\n \r\n return { valid: true };\r\n}\r\n\r\n/**\r\n * Get server environment information\r\n */\r\nexport function getEnvironmentInfo(): Record<string, any> {\r\n return {\r\n nodeVersion: process.version,\r\n platform: process.platform,\r\n arch: process.arch,\r\n memory: process.memoryUsage(),\r\n uptime: process.uptime(),\r\n env: process.env.NODE_ENV || 'development'\r\n };\r\n}\r\n\r\n/**\r\n * Check if a directory is empty\r\n */\r\nexport async function isDirectoryEmpty(dirPath: string): Promise<boolean> {\r\n try {\r\n const files = await fs.readdir(dirPath);\r\n return files.length === 0;\r\n } catch (error) {\r\n // Directory doesn't exist or can't be read\r\n return true;\r\n }\r\n}\r\n\r\n/**\r\n * Create directory if it doesn't exist\r\n */\r\nexport async function ensureDirectory(dirPath: string): Promise<void> {\r\n try {\r\n await fs.access(dirPath);\r\n } catch (error) {\r\n // Directory doesn't exist, create it\r\n await fs.mkdir(dirPath, { recursive: true });\r\n }\r\n}\r\n\r\n/**\r\n * Write JSON to file\r\n */\r\nexport async function writeJsonFile(filePath: string, data: any): Promise<void> {\r\n await ensureDirectory(path.dirname(filePath));\r\n await fs.writeFile(filePath, JSON.stringify(data, null, 2), 'utf8');\r\n}\r\n\r\n/**\r\n * Read JSON from file\r\n */\r\nexport async function readJsonFile<T>(filePath: string, defaultValue: T): Promise<T> {\r\n try {\r\n const data = await fs.readFile(filePath, 'utf8');\r\n return safeJsonParse<T>(data, defaultValue);\r\n } catch (error) {\r\n return defaultValue;\r\n }\r\n}\r\n", "/**\r\n * HTML template generators for server-side rendering\r\n */\r\n\r\nexport interface DocumentOptions {\r\n title?: string;\r\n description?: string;\r\n lang?: string;\r\n charset?: string;\r\n viewport?: string;\r\n scripts?: string[];\r\n styles?: string[];\r\n meta?: Record<string, string>;\r\n bodyClasses?: string;\r\n htmlAttrs?: Record<string, string>;\r\n bodyAttrs?: Record<string, string>;\r\n initialData?: any;\r\n componentName?: string;\r\n}\r\n\r\n/**\r\n * Generate a complete HTML document\r\n */\r\nexport function generateDocument(\r\n content: string, \r\n options: DocumentOptions = {}\r\n): string {\r\n const {\r\n title = 'Frontend Hamroun App',\r\n description = '',\r\n lang = 'en',\r\n charset = 'UTF-8',\r\n viewport = 'width=device-width, initial-scale=1.0',\r\n scripts = [],\r\n styles = [],\r\n meta = {},\r\n bodyClasses = '',\r\n htmlAttrs = {},\r\n bodyAttrs = {},\r\n initialData = {},\r\n componentName = ''\r\n } = options;\r\n \r\n // Generate HTML attributes\r\n const htmlAttributes = Object.entries(htmlAttrs)\r\n .map(([key, value]) => `${key}=\"${escapeHtml(value)}\"`)\r\n .join(' ');\r\n \r\n // Generate body attributes\r\n const bodyAttributes = Object.entries(bodyAttrs)\r\n .map(([key, value]) => `${key}=\"${escapeHtml(value)}\"`)\r\n .join(' ');\r\n \r\n // Generate meta tags\r\n const metaTags = [\r\n `<meta charset=\"${charset}\">`,\r\n `<meta name=\"viewport\" content=\"${viewport}\">`,\r\n description ? `<meta name=\"description\" content=\"${escapeHtml(description)}\">` : ''\r\n ];\r\n \r\n // Add custom meta tags\r\n Object.entries(meta).forEach(([name, content]) => {\r\n metaTags.push(`<meta name=\"${escapeHtml(name)}\" content=\"${escapeHtml(content)}\">`);\r\n });\r\n \r\n // Generate script tags\r\n const scriptTags = scripts.map(src => {\r\n if (src.startsWith('<script')) {\r\n return src; // Allow inline scripts\r\n }\r\n return `<script src=\"${escapeHtml(src)}\" ${src.endsWith('.js') ? 'type=\"module\"' : ''} defer></script>`;\r\n });\r\n \r\n // Generate style tags\r\n const styleTags = styles.map(href => {\r\n if (href.startsWith('<style')) {\r\n return href; // Allow inline styles\r\n }\r\n return `<link rel=\"stylesheet\" href=\"${escapeHtml(href)}\">`;\r\n });\r\n \r\n // Create initial data script\r\n const initialDataScript = Object.keys(initialData).length > 0 ? \r\n `<script id=\"__APP_DATA__\" type=\"application/json\">${escapeHtml(JSON.stringify(initialData))}</script>` : '';\r\n \r\n // Create the complete HTML document\r\n return `<!DOCTYPE html>\r\n<html lang=\"${lang}\" ${htmlAttributes}>\r\n<head>\r\n ${metaTags.filter(Boolean).join('\\n ')}\r\n <title>${escapeHtml(title)}</title>\r\n ${styleTags.join('\\n ')}\r\n</head>\r\n<body class=\"${bodyClasses}\" ${bodyAttributes}>\r\n <div id=\"app-root\" data-ssr-root${componentName ? ` data-component=\"${escapeHtml(componentName)}\"` : ''}>${content}</div>\r\n ${initialDataScript}\r\n ${scriptTags.join('\\n ')}\r\n</body>\r\n</html>`;\r\n}\r\n\r\n/**\r\n * Generate an error page\r\n */\r\nexport function generateErrorPage(\r\n statusCode: number, \r\n message: string, \r\n error?: Error\r\n): string {\r\n const errorMessages: Record<number, string> = {\r\n 400: 'Bad Request',\r\n 401: 'Unauthorized',\r\n 403: 'Forbidden',\r\n 404: 'Not Found',\r\n 500: 'Internal Server Error'\r\n };\r\n \r\n const title = `${statusCode} - ${errorMessages[statusCode] || 'Error'}`;\r\n \r\n // Generate error details (only in development)\r\n const isDev = process.env.NODE_ENV !== 'production';\r\n const errorDetails = isDev && error ? `\r\n <div class=\"error-details\">\r\n <pre>${escapeHtml(error.stack || error.message)}</pre>\r\n </div>\r\n ` : '';\r\n \r\n // Create error content\r\n const content = `\r\n <div class=\"error-container\">\r\n <h1>${statusCode}</h1>\r\n <h2>${escapeHtml(errorMessages[statusCode] || 'Error')}</h2>\r\n <p>${escapeHtml(message)}</p>\r\n ${errorDetails}\r\n <a href=\"/\" class=\"home-link\">Back to Home</a>\r\n </div>\r\n `;\r\n \r\n // Add error page styling\r\n const styles = [`<style>\r\n body {\r\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n min-height: 100vh;\r\n margin: 0;\r\n background-color: #f7f7f7;\r\n color: #333;\r\n }\r\n .error-container {\r\n text-align: center;\r\n padding: 2rem;\r\n border-radius: 8px;\r\n background-color: white;\r\n box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);\r\n max-width: 600px;\r\n width: 100%;\r\n }\r\n h1 {\r\n font-size: 6rem;\r\n margin: 0;\r\n color: #e74c3c;\r\n }\r\n h2 {\r\n margin-top: 0;\r\n margin-bottom: 1rem;\r\n color: #333;\r\n }\r\n .error-details {\r\n text-align: left;\r\n margin: 2rem 0;\r\n padding: 1rem;\r\n background-color: #f8f8f8;\r\n border-radius: 4px;\r\n overflow: auto;\r\n }\r\n pre {\r\n margin: 0;\r\n font-family: monospace;\r\n font-size: 0.85rem;\r\n white-space: pre-wrap;\r\n }\r\n .home-link {\r\n display: inline-block;\r\n margin-top: 1.5rem;\r\n padding: 0.75rem 1.5rem;\r\n background-color: #3498db;\r\n color: white;\r\n text-decoration: none;\r\n border-radius: 4px;\r\n transition: background-color 0.2s;\r\n }\r\n .home-link:hover {\r\n background-color: #2980b9;\r\n }\r\n </style>`];\r\n \r\n return generateDocument(content, {\r\n title,\r\n description: `Error ${statusCode}: ${errorMessages[statusCode] || 'Error'}`,\r\n bodyClasses: 'error-page',\r\n styles\r\n });\r\n}\r\n\r\n/**\r\n * Generate a loading page\r\n */\r\nexport function generateLoadingPage(message: string = 'Loading...'): string {\r\n const content = `\r\n <div class=\"loading-container\">\r\n <div class=\"spinner\"></div>\r\n <p>${escapeHtml(message)}</p>\r\n </div>\r\n `;\r\n \r\n const styles = [`<style>\r\n body {\r\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n min-height: 100vh;\r\n margin: 0;\r\n background-color: #f7f7f7;\r\n color: #333;\r\n }\r\n .loading-container {\r\n text-align: center;\r\n }\r\n .spinner {\r\n width: 50px;\r\n height: 50px;\r\n border: 5px solid rgba(0, 0, 0, 0.1);\r\n border-radius: 50%;\r\n border-top-color: #3498db;\r\n animation: spin 1s ease-in-out infinite;\r\n margin: 0 auto 20px;\r\n }\r\n @keyframes spin {\r\n to { transform: rotate(360deg); }\r\n }\r\n </style>`];\r\n \r\n return generateDocument(content, {\r\n title: 'Loading',\r\n bodyClasses: 'loading-page',\r\n styles\r\n });\r\n}\r\n\r\n/**\r\n * Escape HTML special characters\r\n */\r\nfunction escapeHtml(text: string): string {\r\n return String(text)\r\n .replace(/&/g, '&')\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(wasmBuffer);\r\n \r\n // The updated wasm_exec.js provides imports under 'gojs' instead of 'go'\r\n // Create imports object with the correct structure\r\n const baseImports = go.importObject;\r\n const finalImportObject = {\r\n ...baseImports,\r\n ...options.importObject\r\n };\r\n \r\n if (options.debug) {\r\n console.log('[WASM] Available import modules:', Object.keys(finalImportObject));\r\n \r\n // Debug each module's functions\r\n for (const [moduleName, moduleExports] of Object.entries(finalImportObject)) {\r\n if (typeof moduleExports === 'object' && moduleExports !== null) {\r\n const exportNames = Object.keys(moduleExports);\r\n console.log(`[WASM] ${moduleName} import functions:`, exportNames);\r\n }\r\n }\r\n }\r\n \r\n // Instantiate the WASM module\r\n const instance = await WebAssembly.instantiate(wasmModule, finalImportObject);\r\n \r\n if (options.debug) {\r\n console.log('[WASM] WASM instance created, starting Go runtime...');\r\n }\r\n \r\n // Initialize Go runtime - this will run the main function\r\n // The go.run() method returns a promise that resolves when the program exits\r\n const runPromise = go.run(instance);\r\n \r\n if (options.debug) {\r\n console.log('[WASM] Go runtime started, waiting for initialization...');\r\n }\r\n \r\n // Give Go runtime time to initialize and register functions\r\n // Don't wait for the program to finish, just wait for functions to be registered\r\n await new Promise(resolve => setTimeout(resolve, 2000));\r\n \r\n if (options.debug) {\r\n console.log('[WASM] Scanning global object for Go functions...');\r\n }\r\n \r\n // Extract exported functions from global scope\r\n const functions: Record<string, Function> = {};\r\n const globalObj = global as any;\r\n \r\n // Scan for Go functions\r\n const allKeys = Object.getOwnPropertyNames(globalObj);\r\n const goKeys = allKeys.filter(key => key.startsWith('go'));\r\n \r\n if (options.debug) {\r\n console.log('[WASM] All keys starting with \"go\":', goKeys);\r\n }\r\n \r\n for (const key of goKeys) {\r\n if (typeof globalObj[key] === 'function') {\r\n functions[key] = globalObj[key];\r\n if (options.debug) {\r\n console.log(`[WASM] Found function: ${key}`);\r\n }\r\n }\r\n }\r\n\r\n const wasmInstance: GoWasmInstance = {\r\n instance,\r\n module: wasmModule,\r\n exports: instance.exports,\r\n functions\r\n };\r\n \r\n // Run onLoad callback if provided\r\n if (options.onLoad) {\r\n options.onLoad(wasmInstance);\r\n }\r\n \r\n if (options.debug) {\r\n console.log(`[WASM] Module loaded successfully with ${Object.keys(functions).length} functions`);\r\n console.log('[WASM] Final function list:', Object.keys(functions));\r\n }\r\n \r\n // Don't await the runPromise - let the Go program finish in the background\r\n // The functions are already registered and available\r\n runPromise.catch((error:any)=> {\r\n if (options.debug) {\r\n console.log('[WASM] Go program finished with error:', error);\r\n }\r\n });\r\n \r\n return wasmInstance;\r\n } catch (error) {\r\n console.error('[WASM] Failed to load Go WASM module:', error);\r\n throw error;\r\n }\r\n}\r\n\r\n/**\r\n * Call a Go WASM function in Node.js environment\r\n */\r\nexport function callWasmFunction(funcName: string, ...args: any[]): any {\r\n const func = (global as any)[funcName];\r\n if (typeof func !== 'function') {\r\n throw new Error(`Function ${funcName} not found. Make sure the WASM module is loaded.`);\r\n }\r\n \r\n return func(...args);\r\n}\r\n\r\n/**\r\n * Check if Go WASM is ready in Node.js\r\n */\r\nexport function isWasmReady(): boolean {\r\n const globalObj = global as any;\r\n return Object.keys(globalObj).some(key => \r\n key.startsWith('go') && typeof globalObj[key] === 'function'\r\n );\r\n}\r\n\r\n/**\r\n * Get all available Go WASM functions in Node.js\r\n */\r\nexport function getWasmFunctions(): string[] {\r\n const globalObj = global as any;\r\n return Object.keys(globalObj).filter(key => \r\n key.startsWith('go') && typeof globalObj[key] === 'function'\r\n );\r\n}\r\n\r\n// Extend global for Go runtime\r\ndeclare global {\r\n var Go: new () => {\r\n importObject: any;\r\n run: (instance: WebAssembly.Instance) => Promise<void>;\r\n };\r\n}\r\n\r\nexport type { GoWasmInstance, GoWasmOptions };\r\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["path", "fs", "LifecycleEvents", "fs", "path", "escapeHtml", "content", "fs", "path", "pathToFileURL", "path", "fs"]
|
|
7
|
-
}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
export interface MiddlewareFunction {
|
|
2
|
-
(req: any, res: any, next: any): void | Promise<void>;
|
|
3
|
-
}
|
|
4
|
-
export declare const requestLogger: MiddlewareFunction;
|
|
5
|
-
export declare const errorHandler: (err: Error, req: any, res: any, next: any) => void;
|
|
6
|
-
export declare const notFoundHandler: (req: any, res: any) => void;
|
|
7
|
-
export declare function rateLimit(options: {
|
|
8
|
-
windowMs: number;
|
|
9
|
-
max: number;
|
|
10
|
-
}): (req: any, res: any, next: any) => any;
|
|
11
|
-
//# sourceMappingURL=middleware.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../src/server/middleware.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,kBAAkB;IACjC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACvD;AAGD,eAAO,MAAM,aAAa,EAAE,kBAG3B,CAAC;AAEF,eAAO,MAAM,YAAY,GACvB,KAAK,KAAK,EACV,KAAK,GAAG,EACR,KAAK,GAAG,EACR,MAAM,GAAG,SASV,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,KAAK,GAAG,EAAE,KAAK,GAAG,SAMjD,CAAC;AAGF,wBAAgB,SAAS,CAAC,OAAO,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,IAG1D,KAAK,GAAG,EAAE,KAAK,GAAG,EAAE,MAAM,GAAG,SAwBtC"}
|
package/dist/server/package.json
DELETED
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* HTML template generators for server-side rendering
|
|
3
|
-
*/
|
|
4
|
-
export interface DocumentOptions {
|
|
5
|
-
title?: string;
|
|
6
|
-
description?: string;
|
|
7
|
-
lang?: string;
|
|
8
|
-
charset?: string;
|
|
9
|
-
viewport?: string;
|
|
10
|
-
scripts?: string[];
|
|
11
|
-
styles?: string[];
|
|
12
|
-
meta?: Record<string, string>;
|
|
13
|
-
bodyClasses?: string;
|
|
14
|
-
htmlAttrs?: Record<string, string>;
|
|
15
|
-
bodyAttrs?: Record<string, string>;
|
|
16
|
-
initialData?: any;
|
|
17
|
-
componentName?: string;
|
|
18
|
-
}
|
|
19
|
-
/**
|
|
20
|
-
* Generate a complete HTML document
|
|
21
|
-
*/
|
|
22
|
-
export declare function generateDocument(content: string, options?: DocumentOptions): string;
|
|
23
|
-
/**
|
|
24
|
-
* Generate an error page
|
|
25
|
-
*/
|
|
26
|
-
export declare function generateErrorPage(statusCode: number, message: string, error?: Error): string;
|
|
27
|
-
/**
|
|
28
|
-
* Generate a loading page
|
|
29
|
-
*/
|
|
30
|
-
export declare function generateLoadingPage(message?: string): string;
|
|
31
|
-
//# sourceMappingURL=templates.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/server/templates.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,WAAW,CAAC,EAAE,GAAG,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,eAAoB,GAC5B,MAAM,CAyER;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,EACf,KAAK,CAAC,EAAE,KAAK,GACZ,MAAM,CAgGR;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,GAAE,MAAqB,GAAG,MAAM,CAyC1E"}
|
package/dist/server/types.d.ts
DELETED
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
export interface ServerConfig {
|
|
2
|
-
port?: number;
|
|
3
|
-
apiDir?: string;
|
|
4
|
-
pagesDir?: string;
|
|
5
|
-
staticDir?: string;
|
|
6
|
-
enableCors?: boolean;
|
|
7
|
-
corsOptions?: {
|
|
8
|
-
origin?: string | string[] | boolean;
|
|
9
|
-
credentials?: boolean;
|
|
10
|
-
methods?: string[];
|
|
11
|
-
allowedHeaders?: string[];
|
|
12
|
-
};
|
|
13
|
-
db?: {
|
|
14
|
-
url: string;
|
|
15
|
-
type: 'mongodb' | 'mysql' | 'postgres';
|
|
16
|
-
};
|
|
17
|
-
auth?: {
|
|
18
|
-
secret: string;
|
|
19
|
-
expiresIn?: string | number;
|
|
20
|
-
};
|
|
21
|
-
}
|
|
22
|
-
export interface Server {
|
|
23
|
-
start(): Promise<void>;
|
|
24
|
-
stop(): Promise<void>;
|
|
25
|
-
getExpressApp(): any;
|
|
26
|
-
getDatabase(): any;
|
|
27
|
-
getAuth(): any;
|
|
28
|
-
}
|
|
29
|
-
export interface User {
|
|
30
|
-
id: string | number;
|
|
31
|
-
username: string;
|
|
32
|
-
password?: string;
|
|
33
|
-
email?: string;
|
|
34
|
-
roles?: string[];
|
|
35
|
-
[key: string]: any;
|
|
36
|
-
}
|
|
37
|
-
export interface DbConfig {
|
|
38
|
-
url: string;
|
|
39
|
-
type: 'mongodb' | 'mysql' | 'postgres';
|
|
40
|
-
}
|
|
41
|
-
export interface MiddlewareFunction {
|
|
42
|
-
(req: any, res: any, next: any): void | Promise<void>;
|
|
43
|
-
}
|
|
44
|
-
export interface Todo {
|
|
45
|
-
id: number;
|
|
46
|
-
text: string;
|
|
47
|
-
completed: boolean;
|
|
48
|
-
}
|
|
49
|
-
export interface TodoItemProps {
|
|
50
|
-
todo: Todo;
|
|
51
|
-
onToggle: (id: number) => void;
|
|
52
|
-
onDelete: (id: number) => void;
|
|
53
|
-
}
|
|
54
|
-
export interface GoWasmInstance {
|
|
55
|
-
instance: WebAssembly.Instance;
|
|
56
|
-
module: WebAssembly.Module;
|
|
57
|
-
exports: WebAssembly.Exports;
|
|
58
|
-
functions: Record<string, Function>;
|
|
59
|
-
}
|
|
60
|
-
export interface GoWasmOptions {
|
|
61
|
-
debug?: boolean;
|
|
62
|
-
goWasmPath?: string;
|
|
63
|
-
importObject?: Record<string, any>;
|
|
64
|
-
onLoad?: (instance: GoWasmInstance) => void;
|
|
65
|
-
}
|
|
66
|
-
export declare const isBrowser: boolean;
|
|
67
|
-
export declare const isNode: string | false;
|
|
68
|
-
export declare const createConditionalExport: <T>(browserImpl: () => T, nodeImpl: () => T, fallback?: T) => T;
|
|
69
|
-
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/server/types.ts"],"names":[],"mappings":"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"}
|
package/dist/server/utils.d.ts
DELETED
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Utility functions for server-side operations
|
|
3
|
-
*/
|
|
4
|
-
/**
|
|
5
|
-
* Safely parse JSON with error handling
|
|
6
|
-
*/
|
|
7
|
-
export declare function safeJsonParse<T>(json: string, fallback: T): T;
|
|
8
|
-
/**
|
|
9
|
-
* Generate a secure random token
|
|
10
|
-
*/
|
|
11
|
-
export declare function generateToken(length?: number): string;
|
|
12
|
-
/**
|
|
13
|
-
* Hash a string using SHA-256
|
|
14
|
-
*/
|
|
15
|
-
export declare function hashString(input: string, salt?: string): string;
|
|
16
|
-
/**
|
|
17
|
-
* Get pagination parameters from request
|
|
18
|
-
*/
|
|
19
|
-
export declare function getPagination(req: any): {
|
|
20
|
-
page: number;
|
|
21
|
-
limit: number;
|
|
22
|
-
skip: number;
|
|
23
|
-
};
|
|
24
|
-
/**
|
|
25
|
-
* Standard success response format
|
|
26
|
-
*/
|
|
27
|
-
export declare function sendSuccess<T>(res: any, data: T, message?: string): any;
|
|
28
|
-
/**
|
|
29
|
-
* Standard error response format
|
|
30
|
-
*/
|
|
31
|
-
export declare function sendError(res: any, message?: string, statusCode?: number, errors?: any): any;
|
|
32
|
-
/**
|
|
33
|
-
* Validate required fields in request body
|
|
34
|
-
*/
|
|
35
|
-
export declare function validateFields(req: any, requiredFields: string[]): {
|
|
36
|
-
valid: boolean;
|
|
37
|
-
missing: string[];
|
|
38
|
-
};
|
|
39
|
-
/**
|
|
40
|
-
* Handle file upload validation
|
|
41
|
-
*/
|
|
42
|
-
export declare function validateFileUpload(file: any, // Using 'any' to avoid the Express.Multer dependency
|
|
43
|
-
options?: {
|
|
44
|
-
maxSize?: number;
|
|
45
|
-
allowedTypes?: string[];
|
|
46
|
-
}): {
|
|
47
|
-
valid: boolean;
|
|
48
|
-
error?: string;
|
|
49
|
-
};
|
|
50
|
-
/**
|
|
51
|
-
* Get server environment information
|
|
52
|
-
*/
|
|
53
|
-
export declare function getEnvironmentInfo(): Record<string, any>;
|
|
54
|
-
/**
|
|
55
|
-
* Check if a directory is empty
|
|
56
|
-
*/
|
|
57
|
-
export declare function isDirectoryEmpty(dirPath: string): Promise<boolean>;
|
|
58
|
-
/**
|
|
59
|
-
* Create directory if it doesn't exist
|
|
60
|
-
*/
|
|
61
|
-
export declare function ensureDirectory(dirPath: string): Promise<void>;
|
|
62
|
-
/**
|
|
63
|
-
* Write JSON to file
|
|
64
|
-
*/
|
|
65
|
-
export declare function writeJsonFile(filePath: string, data: any): Promise<void>;
|
|
66
|
-
/**
|
|
67
|
-
* Read JSON from file
|
|
68
|
-
*/
|
|
69
|
-
export declare function readJsonFile<T>(filePath: string, defaultValue: T): Promise<T>;
|
|
70
|
-
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/server/utils.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH;;GAEG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,CAAC,CAM7D;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,GAAE,MAAW,GAAG,MAAM,CAEzD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,GAAE,MAAW,GAAG,MAAM,CAEnE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,GAAG,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAgBrF;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,GAAE,MAAkB,GAAG,GAAG,CAMlF;AAED;;GAEG;AACH,wBAAgB,SAAS,CACvB,GAAG,EAAE,GAAG,EACR,OAAO,GAAE,MAA4B,EACrC,UAAU,GAAE,MAAY,EACxB,MAAM,CAAC,EAAE,GAAG,GACX,GAAG,CAML;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,GAAG,EAAE,GAAG,EACR,cAAc,EAAE,MAAM,EAAE,GACvB;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAUvC;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,GAAG,EAAE,qDAAqD;AAChE,OAAO,GAAE;IACP,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB,GACL;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAyBpC;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CASxD;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAQxE;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAOpE;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAG9E;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAOnF"}
|
package/dist/server/wasm.d.ts
DELETED
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import { GoWasmInstance, GoWasmOptions } from '../server/types.js';
|
|
2
|
-
/**
|
|
3
|
-
* Initialize the Node.js environment for running Go WASM modules
|
|
4
|
-
*/
|
|
5
|
-
export declare function initNodeWasm(): Promise<void>;
|
|
6
|
-
/**
|
|
7
|
-
* Load a Go WASM module from a file path for server-side usage
|
|
8
|
-
*/
|
|
9
|
-
export declare function loadGoWasmFromFile(wasmFilePath: string, options?: GoWasmOptions): Promise<GoWasmInstance>;
|
|
10
|
-
/**
|
|
11
|
-
* Call a Go WASM function in Node.js environment
|
|
12
|
-
*/
|
|
13
|
-
export declare function callWasmFunction(funcName: string, ...args: any[]): any;
|
|
14
|
-
/**
|
|
15
|
-
* Check if Go WASM is ready in Node.js
|
|
16
|
-
*/
|
|
17
|
-
export declare function isWasmReady(): boolean;
|
|
18
|
-
/**
|
|
19
|
-
* Get all available Go WASM functions in Node.js
|
|
20
|
-
*/
|
|
21
|
-
export declare function getWasmFunctions(): string[];
|
|
22
|
-
declare global {
|
|
23
|
-
var Go: new () => {
|
|
24
|
-
importObject: any;
|
|
25
|
-
run: (instance: WebAssembly.Instance) => Promise<void>;
|
|
26
|
-
};
|
|
27
|
-
}
|
|
28
|
-
export type { GoWasmInstance, GoWasmOptions };
|
|
29
|
-
//# sourceMappingURL=wasm.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"wasm.d.ts","sourceRoot":"","sources":["../../src/server/wasm.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAKnE;;GAEG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAclD;AAuED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,YAAY,EAAE,MAAM,EACpB,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,cAAc,CAAC,CA+GzB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,GAAG,CAOtE;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,OAAO,CAKrC;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,EAAE,CAK3C;AAGD,OAAO,CAAC,MAAM,CAAC;IACb,IAAI,EAAE,EAAE,UAAU;QAChB,YAAY,EAAE,GAAG,CAAC;QAClB,GAAG,EAAE,CAAC,QAAQ,EAAE,WAAW,CAAC,QAAQ,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;KACxD,CAAC;CACH;AAED,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"server-renderer.d.ts","sourceRoot":"","sources":["../src/server-renderer.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,wBAAgB,cAAc,CAAC,SAAS,EAAE,GAAG,GAAG,MAAM,CAuBrD"}
|