baraqex 1.0.69 → 1.0.71
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +18 -40
- package/dist/index.js.map +2 -2
- package/dist/server/api-router.d.ts.map +1 -1
- package/dist/server/index.js +18 -40
- package/dist/server/index.js.map +2 -2
- package/package.json +1 -1
- package/templates/fullstack-template/package-lock.json +4 -4
- package/templates/fullstack-template/package.json +1 -1
- package/templates/fullstack-template/vite.config.ts +56 -0
package/dist/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../node_modules/frontend-hamroun/src/batch.ts", "../node_modules/frontend-hamroun/src/hooks.ts", "../node_modules/frontend-hamroun/src/context.ts", "../node_modules/frontend-hamroun/src/jsx-runtime.ts", "../node_modules/frontend-hamroun/src/renderer.ts", "../node_modules/frontend-hamroun/src/server-renderer.ts", "../node_modules/frontend-hamroun/src/index.client.ts", "../src/server/database.ts", "../src/server/auth.ts", "../src/server/api-router.ts", "../src/server/middleware.ts", "../src/server/utils.ts", "../src/server/templates.ts", "../src/server/wasm.ts", "../src/server/index.ts", "../src/server-renderer.ts", "../src/index.ts", "../src/wasm.ts"],
|
|
4
|
-
"sourcesContent": ["export let isBatching = false;\r\nconst queue: Function[] = [];\r\n\r\nexport function batchUpdates(fn: Function) {\r\n if (isBatching) {\r\n queue.push(fn);\r\n return;\r\n }\r\n\r\n isBatching = true;\r\n try {\r\n fn();\r\n while (queue.length > 0) {\r\n const nextFn = queue.shift();\r\n nextFn?.();\r\n }\r\n } finally {\r\n isBatching = false;\r\n }\r\n}\r\n\r\nexport function getIsBatching() {\r\n return isBatching;\r\n}\r\n", "import { createElement } from './jsx-runtime';\r\nimport { batchUpdates, isBatching } from './batch';\r\nimport { diff } from './vdom';\r\n\r\nlet currentRender: number = 0;\r\nconst states = new Map<number, any[]>();\r\nconst stateIndices = new Map<number, number>();\r\nconst effects = new Map<number, Effect[]>();\r\nconst memos = new Map<number, { value: any; deps: any[] }[]>();\r\nconst refs = new Map<number, any[]>();\r\n\r\ninterface Effect {\r\n cleanup?: () => void;\r\n deps?: any[];\r\n}\r\n\r\n// Add at the top with other declarations\r\nlet globalRenderCallback: ((element: any, container: HTMLElement) => void) | null = null;\r\nlet globalContainer: HTMLElement | null = null;\r\nlet currentElement: any = null;\r\n\r\nconst isServer = typeof window === 'undefined';\r\nconst serverStates = new Map<number, any>();\r\n\r\nexport function setRenderCallback(\r\n callback: (element: any, container: HTMLElement) => void,\r\n element: any,\r\n container: HTMLElement\r\n) {\r\n globalRenderCallback = callback;\r\n globalContainer = container;\r\n currentElement = element;\r\n}\r\n\r\nexport function prepareRender() {\r\n currentRender++;\r\n stateIndices.set(currentRender, 0);\r\n return currentRender;\r\n}\r\n\r\nexport function finishRender() {\r\n if (isServer) {\r\n serverStates.delete(currentRender);\r\n }\r\n currentRender = 0;\r\n}\r\n\r\nexport function useState<T>(initial: T): [T, (value: T | ((prev: T) => T)) => void] {\r\n if (!currentRender) {\r\n throw new Error('useState must be called within a render');\r\n }\r\n\r\n if (isServer) {\r\n // Server-side state handling\r\n if (!serverStates.has(currentRender)) {\r\n serverStates.set(currentRender, new Map());\r\n }\r\n const componentState = serverStates.get(currentRender)!;\r\n const index = stateIndices.get(currentRender) || 0;\r\n \r\n if (!componentState.has(index)) {\r\n componentState.set(index, initial);\r\n }\r\n\r\n const state = componentState.get(index);\r\n const setState = (newValue: T | ((prev: T) => T)) => {\r\n // No-op for server-side\r\n };\r\n\r\n stateIndices.set(currentRender, index + 1);\r\n return [state, setState];\r\n }\r\n\r\n if (!states.has(currentRender)) {\r\n states.set(currentRender, []);\r\n }\r\n\r\n const componentStates = states.get(currentRender)!;\r\n const index = stateIndices.get(currentRender)!;\r\n \r\n if (index >= componentStates.length) {\r\n componentStates.push(initial);\r\n }\r\n\r\n const state = componentStates[index];\r\n const setState = (newValue: T | ((prev: T) => T)) => {\r\n const nextValue = typeof newValue === 'function' \r\n ? (newValue as Function)(componentStates[index])\r\n : newValue;\r\n\r\n if (componentStates[index] === nextValue) return; // Skip if value hasn't changed\r\n \r\n componentStates[index] = nextValue;\r\n \r\n if (isBatching) {\r\n batchUpdates(() => rerender(currentRender));\r\n } else {\r\n rerender(currentRender);\r\n }\r\n };\r\n\r\n stateIndices.set(currentRender, index + 1);\r\n return [state, setState];\r\n}\r\n\r\nexport function useEffect(callback: () => (() => void) | void, deps?: any[]) {\r\n if (!currentRender) throw new Error('useEffect must be called within a render');\r\n \r\n const effectIndex = stateIndices.get(currentRender)!;\r\n \r\n if (!effects.has(currentRender)) {\r\n effects.set(currentRender, []);\r\n }\r\n\r\n const componentEffects = effects.get(currentRender)!;\r\n const prevEffect = componentEffects[effectIndex];\r\n \r\n // Run effect if deps changed\r\n if (!prevEffect || !deps || !prevEffect.deps || \r\n deps.some((dep, i) => dep !== prevEffect.deps![i])) {\r\n \r\n // Cleanup previous effect\r\n if (prevEffect?.cleanup) {\r\n prevEffect.cleanup();\r\n }\r\n\r\n // Schedule new effect\r\n queueMicrotask(() => {\r\n const cleanup = callback() || undefined;\r\n componentEffects[effectIndex] = { cleanup: cleanup, deps };\r\n });\r\n }\r\n \r\n stateIndices.set(currentRender, effectIndex + 1);\r\n}\r\n\r\nexport function useMemo<T>(factory: () => T, deps: any[]): T {\r\n if (!currentRender) throw new Error('useMemo must be called within a render');\r\n \r\n const memoIndex = stateIndices.get(currentRender)!;\r\n \r\n if (!memos.has(currentRender)) {\r\n memos.set(currentRender, []);\r\n }\r\n\r\n const componentMemos = memos.get(currentRender)!;\r\n const prevMemo = componentMemos[memoIndex];\r\n \r\n if (!prevMemo || (deps && deps.some((dep, i) => !Object.is(dep, prevMemo.deps[i])))) {\r\n const value = factory();\r\n componentMemos[memoIndex] = { value, deps };\r\n stateIndices.set(currentRender, memoIndex + 1);\r\n return value;\r\n }\r\n\r\n stateIndices.set(currentRender, memoIndex + 1);\r\n return prevMemo.value;\r\n}\r\n\r\nexport function useRef<T>(initial: T) {\r\n if (!currentRender) throw new Error('useRef must be called within a render');\r\n \r\n const refIndex = stateIndices.get(currentRender)!;\r\n \r\n if (!refs.has(currentRender)) {\r\n refs.set(currentRender, []);\r\n }\r\n\r\n const componentRefs = refs.get(currentRender)!;\r\n if (refIndex >= componentRefs.length) {\r\n // Initialize with an object that has a current property\r\n const ref = { current: initial };\r\n componentRefs.push(ref);\r\n stateIndices.set(currentRender, refIndex + 1);\r\n return ref;\r\n }\r\n\r\n const ref = componentRefs[refIndex];\r\n stateIndices.set(currentRender, refIndex + 1);\r\n return ref;\r\n}\r\n\r\n// Add a map to track component DOM nodes\r\nconst componentNodes = new Map<Function, Node>();\r\n\r\nasync function rerender(rendererId: number) {\r\n try {\r\n // Clean up effects\r\n const componentEffects = effects.get(rendererId);\r\n if (componentEffects) {\r\n componentEffects.forEach(effect => {\r\n if (effect.cleanup) effect.cleanup();\r\n });\r\n effects.set(rendererId, []);\r\n }\r\n\r\n if (globalRenderCallback && globalContainer && currentElement) {\r\n await globalRenderCallback(currentElement, globalContainer);\r\n }\r\n } catch (error) {\r\n console.error('Error during rerender:', error);\r\n }\r\n}\r\n\r\n// Add new hook for error boundaries\r\nexport function useErrorBoundary(): [Error | null, () => void] {\r\n const [error, setError] = useState<Error | null>(null);\r\n return [error, () => setError(null)];\r\n}\r\n\r\n// Remove withHooks export\r\n", "\r\n\r\nconst contexts = new Map<symbol, any>();\r\nlet currentRender: Function | null = null;\r\n\r\nexport interface Context<T> {\r\n Provider: (props: { value: T; children?: any }) => any;\r\n Consumer: (props: { children: (value: T) => any }) => any;\r\n _id: symbol;\r\n useSelector: <S>(selector: (state: T) => S) => S;\r\n}\r\n\r\nexport function createContext<T>(defaultValue: T): Context<T> {\r\n const context = {\r\n Provider: ({ value, children }: { value: T, children?: any }) => {\r\n return children;\r\n },\r\n Consumer: ({ children }: { children: (value: T) => any }) => {\r\n return children(defaultValue);\r\n },\r\n _id: Symbol(),\r\n useSelector: <S>(selector: (state: T) => S) => {\r\n return selector(defaultValue);\r\n }\r\n };\r\n\r\n return context;\r\n}\r\n\r\nexport function useContext<T>(context: any): T {\r\n return context;\r\n}\r\n", "import type { Component } from './component';\r\n\r\ninterface VNode {\r\n type: string | Function;\r\n props: Record<string, any>;\r\n}\r\n\r\nfunction jsx(type: string | Function, props: any): VNode {\r\n console.log('JSX Transform:', { type, props });\r\n const processedProps = { ...props };\r\n \r\n // Handle children properly\r\n if (arguments.length > 2) {\r\n processedProps.children = Array.prototype.slice.call(arguments, 2);\r\n }\r\n \r\n return { type, props: processedProps };\r\n}\r\n\r\nconst Fragment = ({ children }: { children: any }) => children;\r\n\r\nasync function createElement(vnode: VNode | any): Promise<Node> {\r\n console.log('Creating element from:', vnode);\r\n\r\n // Handle primitives and null\r\n if (vnode == null) {\r\n return document.createTextNode('');\r\n }\r\n \r\n if (typeof vnode === 'boolean') {\r\n return document.createTextNode('');\r\n }\r\n\r\n if (typeof vnode === 'number' || typeof vnode === 'string') {\r\n return document.createTextNode(String(vnode));\r\n }\r\n\r\n // Handle arrays\r\n if (Array.isArray(vnode)) {\r\n const fragment = document.createDocumentFragment();\r\n for (const child of vnode) {\r\n const node = await createElement(child);\r\n fragment.appendChild(node);\r\n }\r\n return fragment;\r\n }\r\n\r\n // Handle VNode\r\n if ('type' in vnode && vnode.props !== undefined) {\r\n const { type, props } = vnode;\r\n \r\n // Handle function components\r\n if (typeof type === 'function') {\r\n try {\r\n const result = await type(props || {});\r\n const node = await createElement(result);\r\n if (node instanceof Element) {\r\n node.setAttribute('data-component-id', type.name || type.toString());\r\n }\r\n return node;\r\n } catch (error) {\r\n console.error('Error rendering component:', error);\r\n return document.createTextNode('');\r\n }\r\n }\r\n\r\n // Create DOM element\r\n const element = document.createElement(type as string);\r\n \r\n // Handle props\r\n for (const [key, value] of Object.entries(props || {})) {\r\n if (key === 'children') continue;\r\n if (key.startsWith('on') && typeof value === 'function') {\r\n const eventName = key.toLowerCase().slice(2);\r\n // Remove existing event listener if any\r\n const existingHandler = (element as any).__events?.[eventName];\r\n if (existingHandler) {\r\n element.removeEventListener(eventName, existingHandler);\r\n }\r\n \r\n // Add new event listener\r\n element.addEventListener(eventName, value as EventListener);\r\n if (!(element as any).__events) {\r\n (element as any).__events = {};\r\n }\r\n (element as any).__events[eventName] = value;\r\n } else if (key === 'style' && typeof value === 'object') {\r\n Object.assign(element.style, value);\r\n } else if (key === 'className') {\r\n element.setAttribute('class', String(value));\r\n } else if (key !== 'key' && key !== 'ref') {\r\n element.setAttribute(key, String(value));\r\n }\r\n }\r\n\r\n // Handle children\r\n const children = props?.children;\r\n if (children != null) {\r\n const childArray = Array.isArray(children) ? children.flat() : [children];\r\n for (const child of childArray) {\r\n const childNode = await createElement(child);\r\n element.appendChild(childNode);\r\n }\r\n }\r\n\r\n return element;\r\n }\r\n\r\n // Handle other objects by converting to string\r\n return document.createTextNode(String(vnode));\r\n}\r\n\r\n// Export named functions and aliases without duplicates\r\nexport {\r\n jsx,\r\n jsx as jsxs,\r\n jsx as jsxDEV,\r\n Fragment,\r\n createElement\r\n};\r\n\r\n// Named exports object\r\nconst jsxRuntime = {\r\n jsx,\r\n jsxs: jsx,\r\n jsxDEV: jsx,\r\n Fragment,\r\n createElement\r\n};\r\n\r\nexport default jsxRuntime;\r\n", "import { createElement } from './jsx-runtime';\r\nimport { prepareRender, finishRender, setRenderCallback } from './hooks';\r\nimport { batchUpdates } from './batch';\r\n\r\nlet isHydrating = false;\r\n\r\nexport async function hydrate(element: any, container: HTMLElement) {\r\n isHydrating = true;\r\n try {\r\n await render(element, container);\r\n } finally {\r\n isHydrating = false;\r\n }\r\n}\r\n\r\nexport async function render(element: any, container: HTMLElement) {\r\n console.log('Rendering to:', container.id);\r\n \r\n batchUpdates(async () => {\r\n const rendererId = prepareRender();\r\n try {\r\n setRenderCallback(render, element, container);\r\n const domNode = await createElement(element);\r\n \r\n if (!isHydrating) {\r\n container.innerHTML = '';\r\n }\r\n container.appendChild(domNode);\r\n \r\n } finally {\r\n finishRender();\r\n }\r\n });\r\n}\r\n", "import { VNode, Component } from './types';\r\nimport { prepareRender, finishRender } from './hooks';\r\n\r\n/**\r\n * Renders a virtual DOM tree to an HTML string\r\n */\r\nexport function renderToString(vnode: VNode): string {\r\n // Reset hook state for this render\r\n prepareRender();\r\n \r\n // Render the tree to HTML\r\n const html = renderNodeToString(vnode);\r\n \r\n // Clean up after rendering\r\n finishRender();\r\n \r\n return html;\r\n}\r\n\r\n/**\r\n * Internal function to convert a virtual node to an HTML string\r\n */\r\nfunction renderNodeToString(vnode: VNode | string | number | boolean | null | undefined): string {\r\n // Handle primitive values\r\n if (vnode === null || vnode === undefined) return '';\r\n if (typeof vnode === 'boolean') return '';\r\n if (typeof vnode === 'number' || typeof vnode === 'string') return escapeHtml(String(vnode));\r\n \r\n // Handle function components\r\n if (typeof vnode.type === 'function') {\r\n const Component = vnode.type as Component;\r\n const renderedNode = Component(vnode.props || {});\r\n return renderNodeToString(renderedNode);\r\n }\r\n \r\n // Handle intrinsic elements (regular HTML tags)\r\n if (typeof vnode.type === 'string') {\r\n const tag = vnode.type;\r\n let attrs = '';\r\n let children = '';\r\n \r\n // Convert props to HTML attributes\r\n if (vnode.props) {\r\n for (const [key, value] of Object.entries(vnode.props)) {\r\n // Skip children prop as we handle it separately\r\n if (key === 'children') continue;\r\n \r\n // Skip event handlers (they start with 'on')\r\n if (key.startsWith('on')) continue;\r\n \r\n // Handle the className prop specially\r\n if (key === 'className') {\r\n attrs += ` class=\"${escapeHtml(value as string)}\"`;\r\n continue;\r\n }\r\n \r\n // Handle other attributes\r\n if (typeof value === 'string' || typeof value === 'number') {\r\n attrs += ` ${key}=\"${escapeHtml(String(value))}\"`;\r\n } else if (value === true) {\r\n // Boolean attributes\r\n attrs += ` ${key}`;\r\n }\r\n }\r\n }\r\n \r\n // Process children\r\n const childrenArray = (vnode.props?.children) \r\n ? Array.isArray(vnode.props.children) \r\n ? vnode.props.children \r\n : [vnode.props.children]\r\n : [];\r\n \r\n for (const child of childrenArray) {\r\n children += renderNodeToString(child);\r\n }\r\n \r\n // Self-closing tags\r\n const selfClosing = [\r\n 'area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input',\r\n 'link', 'meta', 'param', 'source', 'track', 'wbr'\r\n ];\r\n \r\n if (selfClosing.includes(tag)) {\r\n return `<${tag}${attrs}/>`;\r\n }\r\n \r\n // Regular tags with closing\r\n return `<${tag}${attrs}>${children}</${tag}>`;\r\n }\r\n \r\n // Handle fragments\r\n if (vnode.type === Symbol.for('react.fragment')) {\r\n let fragmentOutput = '';\r\n const children = Array.isArray(vnode.props?.children)\r\n ? vnode.props.children\r\n : vnode.props?.children ? [vnode.props.children] : [];\r\n \r\n for (const child of children) {\r\n fragmentOutput += renderNodeToString(child);\r\n }\r\n \r\n return fragmentOutput;\r\n }\r\n \r\n // Fallback for unknown node types\r\n console.warn('Unknown vnode type:', vnode.type);\r\n return '';\r\n}\r\n\r\n/**\r\n * Escape HTML special characters to prevent XSS\r\n */\r\nfunction escapeHtml(text: string): string {\r\n return text\r\n .replace(/&/g, '&')\r\n .replace(/</g, '<')\r\n .replace(/>/g, '>')\r\n .replace(/\"/g, '"')\r\n .replace(/'/g, ''');\r\n}\r\n", "import { createElement } from './jsx-runtime';\r\nimport { prepareRender, finishRender, setRenderCallback } from './hooks';\r\n\r\nexport { \r\n useState, \r\n useEffect, \r\n useMemo, \r\n useRef,\r\n useErrorBoundary \r\n} from './hooks';\r\n\r\nexport { createContext, useContext } from './context';\r\nexport { batchUpdates } from './batch';\r\nexport { jsx, jsxs, Fragment } from './jsx-runtime';\r\nexport { render, hydrate } from './renderer';\r\nexport { renderToString } from './server-renderer';\r\n\r\n// Re-export types for client-side usage\r\nexport type { Context } from './context';\r\nexport type { VNode } from './types';\r\n\r\n// Export server types for type checking\r\nexport type {\r\n Server,\r\n ServerConfig,\r\n User,\r\n DbConfig,\r\n MiddlewareFunction\r\n} from './server-types';\r\n\r\n// Provide placeholder server functionality\r\nexport const server = {\r\n async getServer() {\r\n throw new Error('Server module can only be used in Node.js environment');\r\n }\r\n};\r\n\r\nlet isHydrating = false;\r\n", "export interface DbConfig {\r\n url: string;\r\n type: 'mongodb' | 'mysql' | 'postgres';\r\n}\r\n\r\nexport class Database {\r\n private config: DbConfig;\r\n private mongoClient: any = null;\r\n private mongoDb: any = null;\r\n private mysqlPool: any = null;\r\n private pgPool: any = null;\r\n\r\n constructor(config: DbConfig) {\r\n this.config = config;\r\n }\r\n\r\n async connect(): Promise<void> {\r\n switch (this.config.type) {\r\n case 'mongodb':\r\n await this.connectMongo();\r\n break;\r\n case 'mysql':\r\n await this.connectMysql();\r\n break;\r\n case 'postgres':\r\n await this.connectPostgres();\r\n break;\r\n default:\r\n throw new Error(`Unsupported database type: ${this.config.type}`);\r\n }\r\n }\r\n\r\n private async connectMongo(): Promise<void> {\r\n try {\r\n const { MongoClient } = await import('mongodb');\r\n this.mongoClient = new MongoClient(this.config.url);\r\n await this.mongoClient.connect();\r\n this.mongoDb = this.mongoClient.db();\r\n console.log('Connected to MongoDB');\r\n } catch (error: any) {\r\n if (error.code === 'MODULE_NOT_FOUND') {\r\n throw new Error('MongoDB driver not installed. Run: npm install mongodb');\r\n }\r\n console.error('MongoDB connection error:', error);\r\n throw error;\r\n }\r\n }\r\n\r\n private async connectMysql(): Promise<void> {\r\n try {\r\n const mysql = await import('mysql2/promise');\r\n this.mysqlPool = mysql.createPool(this.config.url);\r\n // Test connection\r\n await this.mysqlPool.getConnection();\r\n console.log('Connected to MySQL');\r\n } catch (error: any) {\r\n if (error.code === 'MODULE_NOT_FOUND') {\r\n throw new Error('MySQL driver not installed. Run: npm install mysql2');\r\n }\r\n console.error('MySQL connection error:', error);\r\n throw error;\r\n }\r\n }\r\n\r\n private async connectPostgres(): Promise<void> {\r\n try {\r\n const pg = await import('pg');\r\n this.pgPool = new pg.Pool({ connectionString: this.config.url });\r\n // Test connection\r\n const client = await this.pgPool.connect();\r\n client.release();\r\n console.log('Connected to PostgreSQL');\r\n } catch (error: any) {\r\n if (error.code === 'MODULE_NOT_FOUND') {\r\n throw new Error('PostgreSQL driver not installed. Run: npm install pg @types/pg');\r\n }\r\n console.error('PostgreSQL connection error:', error);\r\n throw error;\r\n }\r\n }\r\n\r\n async disconnect(): Promise<void> {\r\n if (this.mongoClient) {\r\n await this.mongoClient.close();\r\n this.mongoClient = null;\r\n this.mongoDb = null;\r\n }\r\n \r\n if (this.mysqlPool) {\r\n await this.mysqlPool.end();\r\n this.mysqlPool = null;\r\n }\r\n \r\n if (this.pgPool) {\r\n await this.pgPool.end();\r\n this.pgPool = null;\r\n }\r\n }\r\n\r\n // Database-specific methods\r\n getMongoDb(): any {\r\n return this.mongoDb;\r\n }\r\n\r\n getMysqlPool(): any {\r\n return this.mysqlPool;\r\n }\r\n\r\n getPgPool(): any {\r\n return this.pgPool;\r\n }\r\n\r\n // Generic query method\r\n async query(sql: string, values?: any[]): Promise<any> {\r\n switch (this.config.type) {\r\n case 'mongodb':\r\n throw new Error('For MongoDB, use getMongoDb() instead of query()');\r\n case 'mysql':\r\n if (!this.mysqlPool) throw new Error('MySQL not connected');\r\n const [rows] = await this.mysqlPool.execute(sql, values || []);\r\n return rows;\r\n case 'postgres':\r\n if (!this.pgPool) throw new Error('PostgreSQL not connected');\r\n const result = await this.pgPool.query(sql, values || []);\r\n return result.rows;\r\n default:\r\n throw new Error(`Unsupported database type: ${this.config.type}`);\r\n }\r\n }\r\n}\r\n", "\r\n\r\nexport interface AuthConfig {\r\n secret: string;\r\n expiresIn?: string | number;\r\n}\r\n\r\nexport interface User {\r\n id: string | number;\r\n username: string;\r\n password?: string;\r\n email?: string;\r\n roles?: string[];\r\n [key: string]: any;\r\n}\r\n\r\nexport class AuthService {\r\n private config: AuthConfig;\r\n\r\n constructor(config: AuthConfig) {\r\n this.config = {\r\n expiresIn: '24h',\r\n ...config\r\n };\r\n }\r\n\r\n async hashPassword(password: string): Promise<string> {\r\n try {\r\n const bcrypt = await import('bcryptjs');\r\n return bcrypt.hash(password, 10);\r\n } catch (error: any) {\r\n if (error.code === 'MODULE_NOT_FOUND') {\r\n throw new Error('bcryptjs not installed. Run: npm install bcryptjs @types/bcryptjs');\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n async comparePasswords(password: string, hashedPassword: string): Promise<boolean> {\r\n try {\r\n const bcrypt = await import('bcryptjs');\r\n return bcrypt.compare(password, hashedPassword);\r\n } catch (error: any) {\r\n if (error.code === 'MODULE_NOT_FOUND') {\r\n throw new Error('bcryptjs not installed. Run: npm install bcryptjs @types/bcryptjs');\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n generateToken(user: Omit<User, 'password'>): string {\r\n try {\r\n const jwt = require('jsonwebtoken');\r\n const options: any = {};\r\n \r\n if (this.config.expiresIn) {\r\n options.expiresIn = this.config.expiresIn;\r\n }\r\n \r\n return jwt.sign(\r\n { id: user.id, username: user.username, roles: user.roles || [] },\r\n this.config.secret,\r\n options\r\n );\r\n } catch (error: any) {\r\n if (error.code === 'MODULE_NOT_FOUND') {\r\n throw new Error('jsonwebtoken not installed. Run: npm install jsonwebtoken @types/jsonwebtoken');\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n verifyToken(token: string): any {\r\n try {\r\n const jwt = require('jsonwebtoken');\r\n return jwt.verify(token, this.config.secret);\r\n } catch (error: any) {\r\n if (error.code === 'MODULE_NOT_FOUND') {\r\n throw new Error('jsonwebtoken not installed. Run: npm install jsonwebtoken @types/jsonwebtoken');\r\n }\r\n return null;\r\n }\r\n }\r\n\r\n // Express middleware for authentication\r\n initialize() {\r\n return (req: any, res: any, next: any) => {\r\n const token = this.extractToken(req);\r\n if (token) {\r\n const decoded = this.verifyToken(token);\r\n if (decoded) {\r\n req.user = decoded;\r\n }\r\n }\r\n next();\r\n };\r\n }\r\n\r\n // Express middleware for requiring authentication\r\n requireAuth() {\r\n return (req: any, res: any, next: any) => {\r\n if (!req.user) {\r\n return res.status(401).json({ message: 'Unauthorized' });\r\n }\r\n return next();\r\n };\r\n }\r\n\r\n // Express middleware for requiring specific roles\r\n requireRoles(roles: string[]) {\r\n return (req: any, res: any, next: any) => {\r\n if (!req.user) {\r\n return res.status(401).json({ message: 'Unauthorized' });\r\n }\r\n \r\n const userRoles = req.user.roles || [];\r\n const hasRequiredRole = roles.some(role => userRoles.includes(role));\r\n \r\n if (!hasRequiredRole) {\r\n return res.status(403).json({ message: 'Forbidden' });\r\n }\r\n \r\n return next();\r\n };\r\n }\r\n\r\n private extractToken(req: any): string | null {\r\n if (req.headers.authorization && req.headers.authorization.startsWith('Bearer ')) {\r\n return req.headers.authorization.substring(7);\r\n }\r\n return null;\r\n }\r\n}\r\n", "import path from 'path';\r\nimport fs from 'fs';\r\nimport { AuthService } from './auth.js';\r\nimport { pathToFileURL } from 'url';\r\n\r\ninterface RouteHandler {\r\n (req: any, res: any, next?: any): void | Promise<void>;\r\n}\r\n\r\ninterface RouteModule {\r\n get?: RouteHandler;\r\n post?: RouteHandler;\r\n put?: RouteHandler;\r\n delete?: RouteHandler;\r\n patch?: RouteHandler;\r\n options?: RouteHandler;\r\n middleware?: ((req: any, res: any, next: any) => void)[];\r\n // Add index signature to allow string indexing\r\n [key: string]: RouteHandler | ((req: any, res: any, next: any) => void)[] | undefined;\r\n}\r\n\r\nexport class ApiRouter {\r\n public router: any = null;\r\n private apiDir: string;\r\n private auth: AuthService | null;\r\n private initialized: boolean = false;\r\n\r\n constructor(apiDir: string, auth: AuthService | null = null) {\r\n this.apiDir = path.resolve(process.cwd(), apiDir);\r\n this.auth = auth;\r\n // Don't call async method in constructor\r\n }\r\n\r\n async initialize(): Promise<void> {\r\n if (this.initialized && this.router) return;\r\n \r\n try {\r\n const express = await import('express');\r\n this.router = express.default.Router();\r\n this.setupRoutes();\r\n this.initialized = true;\r\n console.log('\u2705 API Router initialized successfully');\r\n } catch (error: any) {\r\n console.error('\u274C Failed to initialize API Router:', error);\r\n if (error.code === 'MODULE_NOT_FOUND') {\r\n throw new Error('Express not installed. Run: npm install express @types/express');\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n isInitialized(): boolean {\r\n return this.initialized && this.router !== null;\r\n }\r\n\r\n private setupRoutes() {\r\n if (!fs.existsSync(this.apiDir)) {\r\n console.log(`API directory not found: ${this.apiDir}`);\r\n return;\r\n }\r\n\r\n this.scanDirectory(this.apiDir, '');\r\n }\r\n\r\n private scanDirectory(dirPath: string, routePrefix: string) {\r\n const entries = fs.readdirSync(dirPath, { withFileTypes: true });\r\n\r\n for (const entry of entries) {\r\n const fullPath = path.join(dirPath, entry.name);\r\n \r\n if (entry.isDirectory()) {\r\n // Recursively scan subdirectories\r\n this.scanDirectory(fullPath, `${routePrefix}/${entry.name}`);\r\n } else if (this.isRouteFile(entry.name)) {\r\n // Process route file\r\n const routePath = this.getRoutePath(entry.name, routePrefix);\r\n this.registerRoute(fullPath, routePath);\r\n }\r\n }\r\n }\r\n\r\n private isRouteFile(filename: string): boolean {\r\n return filename.endsWith('.js') || \r\n filename.endsWith('.ts') || \r\n filename.endsWith('.mjs');\r\n }\r\n\r\n private getRoutePath(filename: string, routePrefix: string): string {\r\n // Remove extension and handle special names\r\n const baseName = path.basename(filename, path.extname(filename));\r\n \r\n if (baseName === 'index') {\r\n return routePrefix || '/';\r\n }\r\n \r\n // Handle dynamic routes [param]\r\n const paramMatch = baseName.match(/^\\[(.+)\\]$/);\r\n if (paramMatch) {\r\n return `${routePrefix}/:${paramMatch[1]}`;\r\n }\r\n \r\n return `${routePrefix}/${baseName}`;\r\n }\r\n\r\n private async registerRoute(filePath: string, routePath: string) {\r\n try {\r\n // Ensure we have an absolute path and normalize it\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", "import path from 'path';\r\nimport http from 'http';\r\nimport fs from 'fs';\r\nimport { renderToString } from 'frontend-hamroun';\r\nimport { Database } from './database.js';\r\nimport { AuthService } from './auth.js';\r\nimport { ApiRouter } from './api-router.js';\r\nimport { requestLogger, errorHandler, notFoundHandler, rateLimit } from './middleware.js';\r\n\r\n// Import the utility functions\r\nimport * as utils from './utils.js';\r\nimport * as templates from './templates.js';\r\nimport { initNodeWasm, loadGoWasmFromFile } from './wasm.js';\r\n\r\n// Helper function to get the component name from the file path\r\nfunction getComponentName(filePath: string, pagesDir: string): string {\r\n try {\r\n // Get relative path from pages directory\r\n const relativePath = path.relative(pagesDir, filePath);\r\n // Remove extension\r\n const withoutExt = relativePath.replace(/\\.[^/.]+$/, '');\r\n // Replace index with empty for clean paths\r\n const cleanPath = withoutExt.replace(/\\/index$/, '');\r\n // Convert to module path format\r\n return `/pages/${cleanPath}`;\r\n } catch (e) {\r\n return '';\r\n }\r\n}\r\n\r\nexport interface ServerConfig {\r\n port?: number;\r\n apiDir?: string;\r\n pagesDir?: string;\r\n staticDir?: string;\r\n enableCors?: boolean;\r\n corsOptions?: any;\r\n db?: {\r\n url: string;\r\n type: 'mongodb' | 'mysql' | 'postgres';\r\n };\r\n auth?: {\r\n secret: string;\r\n expiresIn?: string | number;\r\n };\r\n}\r\n\r\nexport class Server {\r\n private app: any;\r\n private server: http.Server | null = null;\r\n private config: ServerConfig;\r\n private db: Database | null = null;\r\n private auth: AuthService | null = null;\r\n private initialized: boolean = false;\r\n\r\n constructor(config: ServerConfig = {}) {\r\n this.config = {\r\n port: 3000,\r\n apiDir: './api',\r\n pagesDir: './pages',\r\n staticDir: './public',\r\n enableCors: true,\r\n ...config\r\n };\r\n\r\n // Don't call initializeApp here - call it in start() instead\r\n }\r\n\r\n private async initializeApp() {\r\n if (this.initialized) return;\r\n\r\n try {\r\n // Dynamic import of express to handle missing dependency\r\n const express = await import('express');\r\n this.app = express.default();\r\n \r\n // Basic middleware\r\n this.app.use(express.default.json());\r\n this.app.use(express.default.urlencoded({ extended: true }));\r\n \r\n // CORS setup\r\n if (this.config.enableCors) {\r\n try {\r\n const cors = await import('cors');\r\n this.app.use(cors.default(this.config.corsOptions));\r\n } catch (error) {\r\n console.warn('CORS not available - install with: npm install cors @types/cors');\r\n }\r\n }\r\n \r\n // Setup database if configured\r\n if (this.config.db) {\r\n this.db = new Database(this.config.db);\r\n }\r\n \r\n // Setup auth if configured\r\n if (this.config.auth) {\r\n this.auth = new AuthService({\r\n secret: this.config.auth.secret,\r\n expiresIn: this.config.auth.expiresIn\r\n });\r\n this.app.use(this.auth.initialize());\r\n }\r\n \r\n // Static files - setup before other routes\r\n const staticPath = path.resolve(process.cwd(), this.config.staticDir!);\r\n if (fs.existsSync(staticPath)) {\r\n this.app.use(express.default.static(staticPath));\r\n }\r\n \r\n // Setup API routes\r\n this.setupApiRoutes();\r\n \r\n // Setup page routes (for SSR)\r\n this.setupPageRoutes();\r\n \r\n // Add error handlers at the end\r\n this.app.use(notFoundHandler);\r\n this.app.use(errorHandler);\r\n \r\n this.initialized = true;\r\n \r\n } catch (error: any) {\r\n if (error.code === 'MODULE_NOT_FOUND' && error.message.includes('express')) {\r\n throw new Error('Express not installed. Run: npm install express @types/express');\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n private async setupApiRoutes() {\r\n const apiRouter = new ApiRouter(this.config.apiDir!, this.auth);\r\n \r\n // Initialize the router properly and wait for completion\r\n await apiRouter.initialize();\r\n \r\n // Double-check if router was created successfully\r\n if (!apiRouter.isInitialized() || !apiRouter.router) {\r\n console.warn('\u26A0\uFE0F API router not initialized properly - skipping API routes');\r\n return;\r\n }\r\n \r\n console.log('\u2705 Setting up API routes...');\r\n this.app.use('/api', requestLogger, apiRouter.router);\r\n \r\n // Add API documentation route\r\n this.app.get('/api-docs', (req: any, res: any) => {\r\n const apiDocs = this.generateApiDocs();\r\n res.json(apiDocs);\r\n });\r\n }\r\n\r\n private generateApiDocs() {\r\n // Generate documentation based on API routes\r\n const apiDir = path.resolve(process.cwd(), this.config.apiDir!);\r\n const docs = { endpoints: [] as any[] };\r\n \r\n if (fs.existsSync(apiDir)) {\r\n this.scanApiDirectory(apiDir, '', docs.endpoints);\r\n }\r\n \r\n return docs;\r\n }\r\n \r\n private scanApiDirectory(dirPath: string, routePrefix: string, endpoints: any[]) {\r\n const entries = fs.readdirSync(dirPath, { withFileTypes: true });\r\n \r\n for (const entry of entries) {\r\n const fullPath = path.join(dirPath, entry.name);\r\n \r\n if (entry.isDirectory()) {\r\n this.scanApiDirectory(fullPath, `${routePrefix}/${entry.name}`, endpoints);\r\n } else if (entry.name.endsWith('.js') || entry.name.endsWith('.ts')) {\r\n const routePath = this.getRoutePath(entry.name, routePrefix);\r\n endpoints.push({\r\n path: routePath,\r\n file: path.relative(process.cwd(), fullPath),\r\n methods: this.detectApiMethods(fullPath)\r\n });\r\n }\r\n }\r\n }\r\n \r\n private getRoutePath(filename: string, routePrefix: string): string {\r\n const baseName = path.basename(filename, path.extname(filename));\r\n \r\n if (baseName === 'index') {\r\n return routePrefix || '/';\r\n }\r\n \r\n const paramMatch = baseName.match(/^\\[(.+)\\]$/);\r\n if (paramMatch) {\r\n return `${routePrefix}/:${paramMatch[1]}`;\r\n }\r\n \r\n return `${routePrefix}/${baseName}`;\r\n }\r\n \r\n private detectApiMethods(filePath: string): string[] {\r\n try {\r\n const content = fs.readFileSync(filePath, 'utf8');\r\n const methods = ['get', 'post', 'put', 'delete', 'patch', 'options'];\r\n return methods.filter(method => \r\n new RegExp(`export (async )?function ${method}\\\\s*\\\\(`).test(content) ||\r\n new RegExp(`export const ${method}\\\\s*=`).test(content)\r\n );\r\n } catch (error) {\r\n return [];\r\n }\r\n }\r\n\r\n private setupPageRoutes() {\r\n const pagesPath = path.resolve(process.cwd(), this.config.pagesDir!);\r\n if (!fs.existsSync(pagesPath)) {\r\n return;\r\n }\r\n\r\n // Setup catch-all route for SSR - but only if pages directory exists\r\n this.app.get('*', async (req: { path: string; }, res: { status: (arg0: number) => { (): any; new(): any; send: { (arg0: string): void; new(): any; }; }; }) => {\r\n try {\r\n const { html, statusCode } = await this.renderPage(req.path);\r\n res.status(statusCode || 200).send(html);\r\n } catch (error) {\r\n console.error('Error rendering page:', error);\r\n const errorHtml = templates.generateErrorPage(500, 'Server Error');\r\n res.status(500).send(errorHtml);\r\n }\r\n });\r\n }\r\n\r\n private async renderPage(routePath: string): Promise<{ html: string, statusCode?: number }> {\r\n try {\r\n // Try to find the page component\r\n const pagesDir = this.config.pagesDir ? path.resolve(process.cwd(), this.config.pagesDir) : '';\r\n if (!pagesDir || !fs.existsSync(pagesDir)) {\r\n return { \r\n html: templates.generateErrorPage(404, 'Pages directory not found'), \r\n statusCode: 404 \r\n };\r\n }\r\n \r\n // Normalize the path\r\n let normalizedPath = routePath;\r\n if (!normalizedPath.startsWith('/')) {\r\n normalizedPath = '/' + normalizedPath;\r\n }\r\n \r\n // Default to index for the root\r\n if (normalizedPath === '/') {\r\n normalizedPath = '/index';\r\n }\r\n \r\n // Try to find a matching page file\r\n let pagePath = '';\r\n const possiblePaths = [\r\n path.join(pagesDir, `${normalizedPath}.js`),\r\n path.join(pagesDir, `${normalizedPath}.ts`),\r\n path.join(pagesDir, `${normalizedPath}.jsx`),\r\n path.join(pagesDir, `${normalizedPath}.tsx`),\r\n path.join(pagesDir, `${normalizedPath}/index.js`),\r\n path.join(pagesDir, `${normalizedPath}/index.ts`),\r\n path.join(pagesDir, `${normalizedPath}/index.jsx`),\r\n path.join(pagesDir, `${normalizedPath}/index.tsx`)\r\n ];\r\n \r\n for (const p of possiblePaths) {\r\n if (fs.existsSync(p)) {\r\n pagePath = p;\r\n break;\r\n }\r\n }\r\n \r\n // Handle 404 if page not found\r\n if (!pagePath) {\r\n return { \r\n html: templates.generateErrorPage(404, `Page not found: ${normalizedPath}`), \r\n statusCode: 404 \r\n };\r\n }\r\n \r\n // Import and render the page component\r\n try {\r\n 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 async start(): Promise<void> {\r\n // Initialize the app first if not already done\r\n await this.initializeApp();\r\n \r\n return new Promise((resolve) => {\r\n this.server = this.app.listen(this.config.port, () => {\r\n console.log(`Server running at http://localhost:${this.config.port}`);\r\n resolve();\r\n });\r\n });\r\n }\r\n\r\n public stop(): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n if (!this.server) {\r\n return resolve();\r\n }\r\n \r\n this.server.close((err: any) => {\r\n if (err) return reject(err);\r\n this.server = null;\r\n resolve();\r\n });\r\n });\r\n }\r\n\r\n public restart(): Promise<void> {\r\n return this.stop().then(() => this.start());\r\n }\r\n \r\n public enableSSR(options: { hydratable?: boolean } = {}): void {\r\n if (!fs.existsSync(path.resolve(process.cwd(), this.config.pagesDir!))) {\r\n fs.mkdirSync(path.resolve(process.cwd(), this.config.pagesDir!), { recursive: true });\r\n }\r\n \r\n // Set up client-side JS for hydration if needed\r\n if (options.hydratable) {\r\n const staticDir = path.resolve(process.cwd(), this.config.staticDir!);\r\n if (!fs.existsSync(staticDir)) {\r\n fs.mkdirSync(staticDir, { recursive: true });\r\n }\r\n \r\n // Generate or copy client hydration script\r\n // This is a simplified example - would need more implementation\r\n const clientJsPath = path.join(staticDir, 'client.js');\r\n if (!fs.existsSync(clientJsPath)) {\r\n const clientJsContent = `\r\n // Auto-generated hydration script\r\n import { hydrate } from '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", "/**\r\n * Server-side rendering utilities\r\n */\r\n\r\nexport function renderToString(component: any): string {\r\n try {\r\n // Basic server-side rendering - this is a simplified implementation\r\n if (typeof component === 'function') {\r\n const result = component();\r\n if (typeof result === 'string') {\r\n return result;\r\n }\r\n if (result && typeof result === 'object') {\r\n return JSON.stringify(result);\r\n }\r\n return String(result || '');\r\n }\r\n \r\n if (typeof component === 'string') {\r\n return component;\r\n }\r\n \r\n return String(component || '');\r\n } catch (error) {\r\n console.error('Error in renderToString:', error);\r\n return '<div>Error rendering component</div>';\r\n }\r\n}\r\n\r\n", "// Re-export everything from frontend-hamroun\r\nexport * from 'frontend-hamroun';\r\n\r\n// Export type definitions (safe for all environments)\r\nexport type { ServerConfig, User, DbConfig, MiddlewareFunction } from './server/types.js';\r\n\r\n// Export WASM functionality (browser-only functions)\r\nexport { loadGoWasm, callWasmFunction, isWasmReady, getWasmFunctions, useGoWasm } from './wasm.js';\r\nexport type { GoWasmOptions, GoWasmInstance } from './server/types.js';\r\n\r\n// Runtime environment detection\r\nconst isNode = typeof process !== 'undefined' && process.versions?.node;\r\nconst isBrowser = typeof window !== 'undefined';\r\n\r\n// Server functionality - only load in Node.js environment\r\nlet BaraqexServer: any = null;\r\nlet createServer: any = null;\r\nlet createDevServer: any = null;\r\nlet createProductionServer: any = null;\r\nlet renderComponent: any = null;\r\nlet Database: any = null;\r\nlet AuthService: any = null;\r\nlet ApiRouter: any = null;\r\nlet requestLogger: any = null;\r\nlet errorHandler: any = null;\r\nlet notFoundHandler: any = null;\r\nlet rateLimit: any = null;\r\nlet initNodeWasm: any = null;\r\nlet loadGoWasmFromFile: any = null;\r\nlet hashString: any = null;\r\nlet getPagination: any = null;\r\nlet sendSuccess: any = null;\r\nlet sendError: any = null;\r\nlet validateFields: any = null;\r\nlet validateFileUpload: any = null;\r\nlet getEnvironmentInfo: any = null;\r\nlet isDirectoryEmpty: any = null;\r\nlet ensureDirectory: any = null;\r\nlet writeJsonFile: any = null;\r\nlet readJsonFile: any = null;\r\nlet baraqexRenderToString: any = null;\r\n\r\n// Browser-safe utilities with fallbacks\r\nlet safeJsonParse = (json: string, fallback: any) => {\r\n try {\r\n return JSON.parse(json);\r\n } catch {\r\n return fallback;\r\n }\r\n};\r\n\r\nlet generateToken = (length: number = 32) => {\r\n const array = new Uint8Array(length);\r\n if (typeof crypto !== 'undefined' && crypto.getRandomValues) {\r\n crypto.getRandomValues(array);\r\n } else {\r\n for (let i = 0; i < array.length; i++) {\r\n array[i] = Math.floor(Math.random() * 256);\r\n }\r\n }\r\n return Array.from(array, byte => byte.toString(16).padStart(2, '0')).join('');\r\n};\r\n\r\n// Browser-safe template utilities\r\nlet generateDocument = (content: string, options: any = {}) => \r\n `<!DOCTYPE html><html><head><title>${options.title || 'App'}</title></head><body>${content}</body></html>`;\r\n\r\nlet generateErrorPage = (code: number, message: string) => \r\n `<div>Error ${code}: ${message}</div>`;\r\n\r\nlet generateLoadingPage = (message: string = 'Loading...') => \r\n `<div>${message}</div>`;\r\n\r\n// Browser-safe renderToString function\r\nlet renderToString = (component: any): string => {\r\n try {\r\n if (typeof component === 'function') {\r\n const result = component();\r\n return typeof result === 'string' ? result : String(result || '');\r\n }\r\n return String(component || '');\r\n } catch (error) {\r\n return '<div>Error rendering component</div>';\r\n }\r\n};\r\n\r\n// Initialize server modules in Node.js environment\r\nif (isNode && !isBrowser) {\r\n // Use dynamic import with IIFE to handle async initialization\r\n (async () => {\r\n try {\r\n // Check if Express is available before importing server modules\r\n try {\r\n await import('express');\r\n \r\n // Import server modules\r\n const [serverModule, utilsModule, templatesModule, rendererModule] = await Promise.all([\r\n import('./server/index.js'),\r\n import('./server/utils.js'),\r\n import('./server/templates.js'),\r\n import('./server-renderer.js')\r\n ]);\r\n \r\n // Assign server functionality\r\n BaraqexServer = serverModule.Server;\r\n createServer = serverModule.createServer;\r\n createDevServer = serverModule.createDevServer;\r\n createProductionServer = serverModule.createProductionServer;\r\n renderComponent = serverModule.renderComponent;\r\n Database = serverModule.Database;\r\n AuthService = serverModule.AuthService;\r\n ApiRouter = serverModule.ApiRouter;\r\n requestLogger = serverModule.requestLogger;\r\n errorHandler = serverModule.errorHandler;\r\n notFoundHandler = serverModule.notFoundHandler;\r\n rateLimit = serverModule.rateLimit;\r\n initNodeWasm = serverModule.initNodeWasm;\r\n loadGoWasmFromFile = serverModule.loadGoWasmFromFile;\r\n \r\n // Assign server utilities\r\n safeJsonParse = utilsModule.safeJsonParse;\r\n generateToken = utilsModule.generateToken;\r\n hashString = utilsModule.hashString;\r\n getPagination = utilsModule.getPagination;\r\n sendSuccess = utilsModule.sendSuccess;\r\n sendError = utilsModule.sendError;\r\n validateFields = utilsModule.validateFields;\r\n validateFileUpload = utilsModule.validateFileUpload;\r\n getEnvironmentInfo = utilsModule.getEnvironmentInfo;\r\n isDirectoryEmpty = utilsModule.isDirectoryEmpty;\r\n ensureDirectory = utilsModule.ensureDirectory;\r\n writeJsonFile = utilsModule.writeJsonFile;\r\n readJsonFile = utilsModule.readJsonFile;\r\n \r\n // Assign template utilities\r\n generateDocument = templatesModule.generateDocument;\r\n generateErrorPage = templatesModule.generateErrorPage;\r\n generateLoadingPage = templatesModule.generateLoadingPage;\r\n \r\n // Assign server-renderer\r\n baraqexRenderToString = rendererModule.renderToString;\r\n \r\n } catch (expressError) {\r\n console.warn('Express not available - server functionality disabled');\r\n // Set error functions\r\n createServer = () => {\r\n throw new Error('Server functionality not available. Make sure you have Express installed: npm install express @types/express');\r\n };\r\n createDevServer = () => {\r\n throw new Error('Server functionality not available. Make sure you have Express installed: npm install express @types/express');\r\n };\r\n createProductionServer = () => {\r\n throw new Error('Server functionality not available. Make sure you have Express installed: npm install express @types/express');\r\n };\r\n }\r\n } catch (error: any) {\r\n console.warn('Server modules not available:', error.message);\r\n }\r\n })();\r\n}\r\n\r\n// Export all the variables\r\nexport {\r\n BaraqexServer,\r\n createServer,\r\n createDevServer,\r\n createProductionServer,\r\n renderComponent,\r\n Database,\r\n AuthService,\r\n ApiRouter,\r\n requestLogger,\r\n errorHandler,\r\n notFoundHandler,\r\n rateLimit,\r\n initNodeWasm,\r\n loadGoWasmFromFile,\r\n safeJsonParse,\r\n generateToken,\r\n hashString,\r\n getPagination,\r\n sendSuccess,\r\n sendError,\r\n validateFields,\r\n validateFileUpload,\r\n getEnvironmentInfo,\r\n isDirectoryEmpty,\r\n ensureDirectory,\r\n writeJsonFile,\r\n readJsonFile,\r\n generateDocument,\r\n generateErrorPage,\r\n generateLoadingPage,\r\n baraqexRenderToString,\r\n renderToString\r\n};\r\n\r\nconsole.log('Baraqex - powered by Frontend Hamroun Framework with additional utilities');\r\n\r\n", "/**\r\n * WebAssembly integration for Frontend Hamroun\r\n * Works in both browser and Node.js environments\r\n */\r\n\r\nexport interface GoWasmOptions {\r\n debug?: boolean;\r\n goWasmPath?: string;\r\n importObject?: any;\r\n onLoad?: (instance: GoWasmInstance) => void;\r\n}\r\n\r\nexport interface GoWasmInstance {\r\n instance: WebAssembly.Instance;\r\n module: WebAssembly.Module;\r\n exports: WebAssembly.Exports;\r\n functions: Record<string, Function>;\r\n}\r\n\r\n/**\r\n * Load Go WASM module in the browser (like your working frontend code)\r\n */\r\nexport async function loadGoWasm(\r\n wasmUrl: string,\r\n options: GoWasmOptions = {}\r\n): Promise<GoWasmInstance> {\r\n if (typeof window === 'undefined') {\r\n throw new Error('loadGoWasm() is for browser use only. Use loadGoWasmFromFile() in Node.js.');\r\n }\r\n\r\n try {\r\n // Check if Go WASM runtime is available (like your frontend code)\r\n if (!window.Go) {\r\n throw new Error('Go WASM runtime not available. Make sure wasm_exec.js is loaded.');\r\n }\r\n\r\n if (options.debug) {\r\n console.log('[WASM] Loading WASM from:', wasmUrl);\r\n }\r\n\r\n // Fetch the WASM file (exactly like your frontend code)\r\n const response = await fetch(wasmUrl);\r\n \r\n if (!response.ok) {\r\n throw new Error(`Failed to fetch WASM file: ${response.status}`);\r\n }\r\n\r\n const wasmBytes = await response.arrayBuffer();\r\n \r\n // Initialize Go runtime (exactly like your frontend code)\r\n const go = new window.Go();\r\n const wasmModule = await WebAssembly.instantiate(wasmBytes, go.importObject);\r\n \r\n // Run the Go program (exactly like your frontend code)\r\n go.run(wasmModule.instance);\r\n \r\n // Wait a bit for Go functions to be registered (like your frontend code)\r\n await new Promise(resolve => setTimeout(resolve, 100));\r\n \r\n if (options.debug) {\r\n console.log('[WASM] Go program started, checking for registered functions...');\r\n }\r\n\r\n // Extract exported functions from global scope (like your frontend code)\r\n const functions: Record<string, Function> = {};\r\n \r\n // Look for Go functions in global scope\r\n for (const key in window) {\r\n if (typeof window[key] === 'function' && key.startsWith('go')) {\r\n functions[key] = window[key] as Function;\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: wasmModule.instance,\r\n module: wasmModule,\r\n exports: wasmModule.instance.exports,\r\n functions\r\n };\r\n\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 }\r\n\r\n return wasmInstance;\r\n\r\n } catch (error) {\r\n console.error('[WASM] Error loading Go WASM module:', error);\r\n throw error;\r\n }\r\n}\r\n\r\n/**\r\n * Call a Go WASM function (like your frontend code's callWasmFunction)\r\n */\r\nexport function callWasmFunction(funcName: string, ...args: any[]): any {\r\n if (typeof window === 'undefined') {\r\n throw new Error('callWasmFunction() is for browser use only.');\r\n }\r\n\r\n const func = (window 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 (like your frontend code's wasmReady state)\r\n */\r\nexport function isWasmReady(): boolean {\r\n if (typeof window === 'undefined') {\r\n return false;\r\n }\r\n\r\n // Check if Go runtime is available and at least one Go function exists\r\n return !!(window.Go && Object.keys(window).some(key => \r\n key.startsWith('go') && typeof window[key] === 'function'\r\n ));\r\n}\r\n\r\n/**\r\n * Get all available Go WASM functions\r\n */\r\nexport function getWasmFunctions(): string[] {\r\n if (typeof window === 'undefined') {\r\n return [];\r\n }\r\n\r\n return Object.keys(window).filter(key => \r\n key.startsWith('go') && typeof window[key] === 'function'\r\n );\r\n}\r\n\r\n/**\r\n * Hook for React components (like your frontend code's useEffect pattern)\r\n */\r\nexport function useGoWasm(wasmUrl: string, options: GoWasmOptions = {}) {\r\n if (typeof window === 'undefined') {\r\n throw new Error('useGoWasm() is for browser use only.');\r\n }\r\n\r\n // This would need to be implemented as a React hook in frontend-hamroun\r\n // For now, return the basic functionality\r\n return {\r\n loadWasm: () => loadGoWasm(wasmUrl, options),\r\n callFunction: callWasmFunction,\r\n isReady: isWasmReady,\r\n getFunctions: getWasmFunctions\r\n };\r\n}\r\n\r\n// Browser-specific type declarations\r\ndeclare global {\r\n interface Window {\r\n Go: new () => {\r\n importObject: any;\r\n run: (instance: WebAssembly.Instance) => void;\r\n };\r\n [key: string]: any;\r\n }\r\n}\r\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["export let isBatching = false;\r\nconst queue: Function[] = [];\r\n\r\nexport function batchUpdates(fn: Function) {\r\n if (isBatching) {\r\n queue.push(fn);\r\n return;\r\n }\r\n\r\n isBatching = true;\r\n try {\r\n fn();\r\n while (queue.length > 0) {\r\n const nextFn = queue.shift();\r\n nextFn?.();\r\n }\r\n } finally {\r\n isBatching = false;\r\n }\r\n}\r\n\r\nexport function getIsBatching() {\r\n return isBatching;\r\n}\r\n", "import { createElement } from './jsx-runtime';\r\nimport { batchUpdates, isBatching } from './batch';\r\nimport { diff } from './vdom';\r\n\r\nlet currentRender: number = 0;\r\nconst states = new Map<number, any[]>();\r\nconst stateIndices = new Map<number, number>();\r\nconst effects = new Map<number, Effect[]>();\r\nconst memos = new Map<number, { value: any; deps: any[] }[]>();\r\nconst refs = new Map<number, any[]>();\r\n\r\ninterface Effect {\r\n cleanup?: () => void;\r\n deps?: any[];\r\n}\r\n\r\n// Add at the top with other declarations\r\nlet globalRenderCallback: ((element: any, container: HTMLElement) => void) | null = null;\r\nlet globalContainer: HTMLElement | null = null;\r\nlet currentElement: any = null;\r\n\r\nconst isServer = typeof window === 'undefined';\r\nconst serverStates = new Map<number, any>();\r\n\r\nexport function setRenderCallback(\r\n callback: (element: any, container: HTMLElement) => void,\r\n element: any,\r\n container: HTMLElement\r\n) {\r\n globalRenderCallback = callback;\r\n globalContainer = container;\r\n currentElement = element;\r\n}\r\n\r\nexport function prepareRender() {\r\n currentRender++;\r\n stateIndices.set(currentRender, 0);\r\n return currentRender;\r\n}\r\n\r\nexport function finishRender() {\r\n if (isServer) {\r\n serverStates.delete(currentRender);\r\n }\r\n currentRender = 0;\r\n}\r\n\r\nexport function useState<T>(initial: T): [T, (value: T | ((prev: T) => T)) => void] {\r\n if (!currentRender) {\r\n throw new Error('useState must be called within a render');\r\n }\r\n\r\n if (isServer) {\r\n // Server-side state handling\r\n if (!serverStates.has(currentRender)) {\r\n serverStates.set(currentRender, new Map());\r\n }\r\n const componentState = serverStates.get(currentRender)!;\r\n const index = stateIndices.get(currentRender) || 0;\r\n \r\n if (!componentState.has(index)) {\r\n componentState.set(index, initial);\r\n }\r\n\r\n const state = componentState.get(index);\r\n const setState = (newValue: T | ((prev: T) => T)) => {\r\n // No-op for server-side\r\n };\r\n\r\n stateIndices.set(currentRender, index + 1);\r\n return [state, setState];\r\n }\r\n\r\n if (!states.has(currentRender)) {\r\n states.set(currentRender, []);\r\n }\r\n\r\n const componentStates = states.get(currentRender)!;\r\n const index = stateIndices.get(currentRender)!;\r\n \r\n if (index >= componentStates.length) {\r\n componentStates.push(initial);\r\n }\r\n\r\n const state = componentStates[index];\r\n const setState = (newValue: T | ((prev: T) => T)) => {\r\n const nextValue = typeof newValue === 'function' \r\n ? (newValue as Function)(componentStates[index])\r\n : newValue;\r\n\r\n if (componentStates[index] === nextValue) return; // Skip if value hasn't changed\r\n \r\n componentStates[index] = nextValue;\r\n \r\n if (isBatching) {\r\n batchUpdates(() => rerender(currentRender));\r\n } else {\r\n rerender(currentRender);\r\n }\r\n };\r\n\r\n stateIndices.set(currentRender, index + 1);\r\n return [state, setState];\r\n}\r\n\r\nexport function useEffect(callback: () => (() => void) | void, deps?: any[]) {\r\n if (!currentRender) throw new Error('useEffect must be called within a render');\r\n \r\n const effectIndex = stateIndices.get(currentRender)!;\r\n \r\n if (!effects.has(currentRender)) {\r\n effects.set(currentRender, []);\r\n }\r\n\r\n const componentEffects = effects.get(currentRender)!;\r\n const prevEffect = componentEffects[effectIndex];\r\n \r\n // Run effect if deps changed\r\n if (!prevEffect || !deps || !prevEffect.deps || \r\n deps.some((dep, i) => dep !== prevEffect.deps![i])) {\r\n \r\n // Cleanup previous effect\r\n if (prevEffect?.cleanup) {\r\n prevEffect.cleanup();\r\n }\r\n\r\n // Schedule new effect\r\n queueMicrotask(() => {\r\n const cleanup = callback() || undefined;\r\n componentEffects[effectIndex] = { cleanup: cleanup, deps };\r\n });\r\n }\r\n \r\n stateIndices.set(currentRender, effectIndex + 1);\r\n}\r\n\r\nexport function useMemo<T>(factory: () => T, deps: any[]): T {\r\n if (!currentRender) throw new Error('useMemo must be called within a render');\r\n \r\n const memoIndex = stateIndices.get(currentRender)!;\r\n \r\n if (!memos.has(currentRender)) {\r\n memos.set(currentRender, []);\r\n }\r\n\r\n const componentMemos = memos.get(currentRender)!;\r\n const prevMemo = componentMemos[memoIndex];\r\n \r\n if (!prevMemo || (deps && deps.some((dep, i) => !Object.is(dep, prevMemo.deps[i])))) {\r\n const value = factory();\r\n componentMemos[memoIndex] = { value, deps };\r\n stateIndices.set(currentRender, memoIndex + 1);\r\n return value;\r\n }\r\n\r\n stateIndices.set(currentRender, memoIndex + 1);\r\n return prevMemo.value;\r\n}\r\n\r\nexport function useRef<T>(initial: T) {\r\n if (!currentRender) throw new Error('useRef must be called within a render');\r\n \r\n const refIndex = stateIndices.get(currentRender)!;\r\n \r\n if (!refs.has(currentRender)) {\r\n refs.set(currentRender, []);\r\n }\r\n\r\n const componentRefs = refs.get(currentRender)!;\r\n if (refIndex >= componentRefs.length) {\r\n // Initialize with an object that has a current property\r\n const ref = { current: initial };\r\n componentRefs.push(ref);\r\n stateIndices.set(currentRender, refIndex + 1);\r\n return ref;\r\n }\r\n\r\n const ref = componentRefs[refIndex];\r\n stateIndices.set(currentRender, refIndex + 1);\r\n return ref;\r\n}\r\n\r\n// Add a map to track component DOM nodes\r\nconst componentNodes = new Map<Function, Node>();\r\n\r\nasync function rerender(rendererId: number) {\r\n try {\r\n // Clean up effects\r\n const componentEffects = effects.get(rendererId);\r\n if (componentEffects) {\r\n componentEffects.forEach(effect => {\r\n if (effect.cleanup) effect.cleanup();\r\n });\r\n effects.set(rendererId, []);\r\n }\r\n\r\n if (globalRenderCallback && globalContainer && currentElement) {\r\n await globalRenderCallback(currentElement, globalContainer);\r\n }\r\n } catch (error) {\r\n console.error('Error during rerender:', error);\r\n }\r\n}\r\n\r\n// Add new hook for error boundaries\r\nexport function useErrorBoundary(): [Error | null, () => void] {\r\n const [error, setError] = useState<Error | null>(null);\r\n return [error, () => setError(null)];\r\n}\r\n\r\n// Remove withHooks export\r\n", "\r\n\r\nconst contexts = new Map<symbol, any>();\r\nlet currentRender: Function | null = null;\r\n\r\nexport interface Context<T> {\r\n Provider: (props: { value: T; children?: any }) => any;\r\n Consumer: (props: { children: (value: T) => any }) => any;\r\n _id: symbol;\r\n useSelector: <S>(selector: (state: T) => S) => S;\r\n}\r\n\r\nexport function createContext<T>(defaultValue: T): Context<T> {\r\n const context = {\r\n Provider: ({ value, children }: { value: T, children?: any }) => {\r\n return children;\r\n },\r\n Consumer: ({ children }: { children: (value: T) => any }) => {\r\n return children(defaultValue);\r\n },\r\n _id: Symbol(),\r\n useSelector: <S>(selector: (state: T) => S) => {\r\n return selector(defaultValue);\r\n }\r\n };\r\n\r\n return context;\r\n}\r\n\r\nexport function useContext<T>(context: any): T {\r\n return context;\r\n}\r\n", "import type { Component } from './component';\r\n\r\ninterface VNode {\r\n type: string | Function;\r\n props: Record<string, any>;\r\n}\r\n\r\nfunction jsx(type: string | Function, props: any): VNode {\r\n console.log('JSX Transform:', { type, props });\r\n const processedProps = { ...props };\r\n \r\n // Handle children properly\r\n if (arguments.length > 2) {\r\n processedProps.children = Array.prototype.slice.call(arguments, 2);\r\n }\r\n \r\n return { type, props: processedProps };\r\n}\r\n\r\nconst Fragment = ({ children }: { children: any }) => children;\r\n\r\nasync function createElement(vnode: VNode | any): Promise<Node> {\r\n console.log('Creating element from:', vnode);\r\n\r\n // Handle primitives and null\r\n if (vnode == null) {\r\n return document.createTextNode('');\r\n }\r\n \r\n if (typeof vnode === 'boolean') {\r\n return document.createTextNode('');\r\n }\r\n\r\n if (typeof vnode === 'number' || typeof vnode === 'string') {\r\n return document.createTextNode(String(vnode));\r\n }\r\n\r\n // Handle arrays\r\n if (Array.isArray(vnode)) {\r\n const fragment = document.createDocumentFragment();\r\n for (const child of vnode) {\r\n const node = await createElement(child);\r\n fragment.appendChild(node);\r\n }\r\n return fragment;\r\n }\r\n\r\n // Handle VNode\r\n if ('type' in vnode && vnode.props !== undefined) {\r\n const { type, props } = vnode;\r\n \r\n // Handle function components\r\n if (typeof type === 'function') {\r\n try {\r\n const result = await type(props || {});\r\n const node = await createElement(result);\r\n if (node instanceof Element) {\r\n node.setAttribute('data-component-id', type.name || type.toString());\r\n }\r\n return node;\r\n } catch (error) {\r\n console.error('Error rendering component:', error);\r\n return document.createTextNode('');\r\n }\r\n }\r\n\r\n // Create DOM element\r\n const element = document.createElement(type as string);\r\n \r\n // Handle props\r\n for (const [key, value] of Object.entries(props || {})) {\r\n if (key === 'children') continue;\r\n if (key.startsWith('on') && typeof value === 'function') {\r\n const eventName = key.toLowerCase().slice(2);\r\n // Remove existing event listener if any\r\n const existingHandler = (element as any).__events?.[eventName];\r\n if (existingHandler) {\r\n element.removeEventListener(eventName, existingHandler);\r\n }\r\n \r\n // Add new event listener\r\n element.addEventListener(eventName, value as EventListener);\r\n if (!(element as any).__events) {\r\n (element as any).__events = {};\r\n }\r\n (element as any).__events[eventName] = value;\r\n } else if (key === 'style' && typeof value === 'object') {\r\n Object.assign(element.style, value);\r\n } else if (key === 'className') {\r\n element.setAttribute('class', String(value));\r\n } else if (key !== 'key' && key !== 'ref') {\r\n element.setAttribute(key, String(value));\r\n }\r\n }\r\n\r\n // Handle children\r\n const children = props?.children;\r\n if (children != null) {\r\n const childArray = Array.isArray(children) ? children.flat() : [children];\r\n for (const child of childArray) {\r\n const childNode = await createElement(child);\r\n element.appendChild(childNode);\r\n }\r\n }\r\n\r\n return element;\r\n }\r\n\r\n // Handle other objects by converting to string\r\n return document.createTextNode(String(vnode));\r\n}\r\n\r\n// Export named functions and aliases without duplicates\r\nexport {\r\n jsx,\r\n jsx as jsxs,\r\n jsx as jsxDEV,\r\n Fragment,\r\n createElement\r\n};\r\n\r\n// Named exports object\r\nconst jsxRuntime = {\r\n jsx,\r\n jsxs: jsx,\r\n jsxDEV: jsx,\r\n Fragment,\r\n createElement\r\n};\r\n\r\nexport default jsxRuntime;\r\n", "import { createElement } from './jsx-runtime';\r\nimport { prepareRender, finishRender, setRenderCallback } from './hooks';\r\nimport { batchUpdates } from './batch';\r\n\r\nlet isHydrating = false;\r\n\r\nexport async function hydrate(element: any, container: HTMLElement) {\r\n isHydrating = true;\r\n try {\r\n await render(element, container);\r\n } finally {\r\n isHydrating = false;\r\n }\r\n}\r\n\r\nexport async function render(element: any, container: HTMLElement) {\r\n console.log('Rendering to:', container.id);\r\n \r\n batchUpdates(async () => {\r\n const rendererId = prepareRender();\r\n try {\r\n setRenderCallback(render, element, container);\r\n const domNode = await createElement(element);\r\n \r\n if (!isHydrating) {\r\n container.innerHTML = '';\r\n }\r\n container.appendChild(domNode);\r\n \r\n } finally {\r\n finishRender();\r\n }\r\n });\r\n}\r\n", "import { VNode, Component } from './types';\r\nimport { prepareRender, finishRender } from './hooks';\r\n\r\n/**\r\n * Renders a virtual DOM tree to an HTML string\r\n */\r\nexport function renderToString(vnode: VNode): string {\r\n // Reset hook state for this render\r\n prepareRender();\r\n \r\n // Render the tree to HTML\r\n const html = renderNodeToString(vnode);\r\n \r\n // Clean up after rendering\r\n finishRender();\r\n \r\n return html;\r\n}\r\n\r\n/**\r\n * Internal function to convert a virtual node to an HTML string\r\n */\r\nfunction renderNodeToString(vnode: VNode | string | number | boolean | null | undefined): string {\r\n // Handle primitive values\r\n if (vnode === null || vnode === undefined) return '';\r\n if (typeof vnode === 'boolean') return '';\r\n if (typeof vnode === 'number' || typeof vnode === 'string') return escapeHtml(String(vnode));\r\n \r\n // Handle function components\r\n if (typeof vnode.type === 'function') {\r\n const Component = vnode.type as Component;\r\n const renderedNode = Component(vnode.props || {});\r\n return renderNodeToString(renderedNode);\r\n }\r\n \r\n // Handle intrinsic elements (regular HTML tags)\r\n if (typeof vnode.type === 'string') {\r\n const tag = vnode.type;\r\n let attrs = '';\r\n let children = '';\r\n \r\n // Convert props to HTML attributes\r\n if (vnode.props) {\r\n for (const [key, value] of Object.entries(vnode.props)) {\r\n // Skip children prop as we handle it separately\r\n if (key === 'children') continue;\r\n \r\n // Skip event handlers (they start with 'on')\r\n if (key.startsWith('on')) continue;\r\n \r\n // Handle the className prop specially\r\n if (key === 'className') {\r\n attrs += ` class=\"${escapeHtml(value as string)}\"`;\r\n continue;\r\n }\r\n \r\n // Handle other attributes\r\n if (typeof value === 'string' || typeof value === 'number') {\r\n attrs += ` ${key}=\"${escapeHtml(String(value))}\"`;\r\n } else if (value === true) {\r\n // Boolean attributes\r\n attrs += ` ${key}`;\r\n }\r\n }\r\n }\r\n \r\n // Process children\r\n const childrenArray = (vnode.props?.children) \r\n ? Array.isArray(vnode.props.children) \r\n ? vnode.props.children \r\n : [vnode.props.children]\r\n : [];\r\n \r\n for (const child of childrenArray) {\r\n children += renderNodeToString(child);\r\n }\r\n \r\n // Self-closing tags\r\n const selfClosing = [\r\n 'area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input',\r\n 'link', 'meta', 'param', 'source', 'track', 'wbr'\r\n ];\r\n \r\n if (selfClosing.includes(tag)) {\r\n return `<${tag}${attrs}/>`;\r\n }\r\n \r\n // Regular tags with closing\r\n return `<${tag}${attrs}>${children}</${tag}>`;\r\n }\r\n \r\n // Handle fragments\r\n if (vnode.type === Symbol.for('react.fragment')) {\r\n let fragmentOutput = '';\r\n const children = Array.isArray(vnode.props?.children)\r\n ? vnode.props.children\r\n : vnode.props?.children ? [vnode.props.children] : [];\r\n \r\n for (const child of children) {\r\n fragmentOutput += renderNodeToString(child);\r\n }\r\n \r\n return fragmentOutput;\r\n }\r\n \r\n // Fallback for unknown node types\r\n console.warn('Unknown vnode type:', vnode.type);\r\n return '';\r\n}\r\n\r\n/**\r\n * Escape HTML special characters to prevent XSS\r\n */\r\nfunction escapeHtml(text: string): string {\r\n return text\r\n .replace(/&/g, '&')\r\n .replace(/</g, '<')\r\n .replace(/>/g, '>')\r\n .replace(/\"/g, '"')\r\n .replace(/'/g, ''');\r\n}\r\n", "import { createElement } from './jsx-runtime';\r\nimport { prepareRender, finishRender, setRenderCallback } from './hooks';\r\n\r\nexport { \r\n useState, \r\n useEffect, \r\n useMemo, \r\n useRef,\r\n useErrorBoundary \r\n} from './hooks';\r\n\r\nexport { createContext, useContext } from './context';\r\nexport { batchUpdates } from './batch';\r\nexport { jsx, jsxs, Fragment } from './jsx-runtime';\r\nexport { render, hydrate } from './renderer';\r\nexport { renderToString } from './server-renderer';\r\n\r\n// Re-export types for client-side usage\r\nexport type { Context } from './context';\r\nexport type { VNode } from './types';\r\n\r\n// Export server types for type checking\r\nexport type {\r\n Server,\r\n ServerConfig,\r\n User,\r\n DbConfig,\r\n MiddlewareFunction\r\n} from './server-types';\r\n\r\n// Provide placeholder server functionality\r\nexport const server = {\r\n async getServer() {\r\n throw new Error('Server module can only be used in Node.js environment');\r\n }\r\n};\r\n\r\nlet isHydrating = false;\r\n", "export interface DbConfig {\r\n url: string;\r\n type: 'mongodb' | 'mysql' | 'postgres';\r\n}\r\n\r\nexport class Database {\r\n private config: DbConfig;\r\n private mongoClient: any = null;\r\n private mongoDb: any = null;\r\n private mysqlPool: any = null;\r\n private pgPool: any = null;\r\n\r\n constructor(config: DbConfig) {\r\n this.config = config;\r\n }\r\n\r\n async connect(): Promise<void> {\r\n switch (this.config.type) {\r\n case 'mongodb':\r\n await this.connectMongo();\r\n break;\r\n case 'mysql':\r\n await this.connectMysql();\r\n break;\r\n case 'postgres':\r\n await this.connectPostgres();\r\n break;\r\n default:\r\n throw new Error(`Unsupported database type: ${this.config.type}`);\r\n }\r\n }\r\n\r\n private async connectMongo(): Promise<void> {\r\n try {\r\n const { MongoClient } = await import('mongodb');\r\n this.mongoClient = new MongoClient(this.config.url);\r\n await this.mongoClient.connect();\r\n this.mongoDb = this.mongoClient.db();\r\n console.log('Connected to MongoDB');\r\n } catch (error: any) {\r\n if (error.code === 'MODULE_NOT_FOUND') {\r\n throw new Error('MongoDB driver not installed. Run: npm install mongodb');\r\n }\r\n console.error('MongoDB connection error:', error);\r\n throw error;\r\n }\r\n }\r\n\r\n private async connectMysql(): Promise<void> {\r\n try {\r\n const mysql = await import('mysql2/promise');\r\n this.mysqlPool = mysql.createPool(this.config.url);\r\n // Test connection\r\n await this.mysqlPool.getConnection();\r\n console.log('Connected to MySQL');\r\n } catch (error: any) {\r\n if (error.code === 'MODULE_NOT_FOUND') {\r\n throw new Error('MySQL driver not installed. Run: npm install mysql2');\r\n }\r\n console.error('MySQL connection error:', error);\r\n throw error;\r\n }\r\n }\r\n\r\n private async connectPostgres(): Promise<void> {\r\n try {\r\n const pg = await import('pg');\r\n this.pgPool = new pg.Pool({ connectionString: this.config.url });\r\n // Test connection\r\n const client = await this.pgPool.connect();\r\n client.release();\r\n console.log('Connected to PostgreSQL');\r\n } catch (error: any) {\r\n if (error.code === 'MODULE_NOT_FOUND') {\r\n throw new Error('PostgreSQL driver not installed. Run: npm install pg @types/pg');\r\n }\r\n console.error('PostgreSQL connection error:', error);\r\n throw error;\r\n }\r\n }\r\n\r\n async disconnect(): Promise<void> {\r\n if (this.mongoClient) {\r\n await this.mongoClient.close();\r\n this.mongoClient = null;\r\n this.mongoDb = null;\r\n }\r\n \r\n if (this.mysqlPool) {\r\n await this.mysqlPool.end();\r\n this.mysqlPool = null;\r\n }\r\n \r\n if (this.pgPool) {\r\n await this.pgPool.end();\r\n this.pgPool = null;\r\n }\r\n }\r\n\r\n // Database-specific methods\r\n getMongoDb(): any {\r\n return this.mongoDb;\r\n }\r\n\r\n getMysqlPool(): any {\r\n return this.mysqlPool;\r\n }\r\n\r\n getPgPool(): any {\r\n return this.pgPool;\r\n }\r\n\r\n // Generic query method\r\n async query(sql: string, values?: any[]): Promise<any> {\r\n switch (this.config.type) {\r\n case 'mongodb':\r\n throw new Error('For MongoDB, use getMongoDb() instead of query()');\r\n case 'mysql':\r\n if (!this.mysqlPool) throw new Error('MySQL not connected');\r\n const [rows] = await this.mysqlPool.execute(sql, values || []);\r\n return rows;\r\n case 'postgres':\r\n if (!this.pgPool) throw new Error('PostgreSQL not connected');\r\n const result = await this.pgPool.query(sql, values || []);\r\n return result.rows;\r\n default:\r\n throw new Error(`Unsupported database type: ${this.config.type}`);\r\n }\r\n }\r\n}\r\n", "\r\n\r\nexport interface AuthConfig {\r\n secret: string;\r\n expiresIn?: string | number;\r\n}\r\n\r\nexport interface User {\r\n id: string | number;\r\n username: string;\r\n password?: string;\r\n email?: string;\r\n roles?: string[];\r\n [key: string]: any;\r\n}\r\n\r\nexport class AuthService {\r\n private config: AuthConfig;\r\n\r\n constructor(config: AuthConfig) {\r\n this.config = {\r\n expiresIn: '24h',\r\n ...config\r\n };\r\n }\r\n\r\n async hashPassword(password: string): Promise<string> {\r\n try {\r\n const bcrypt = await import('bcryptjs');\r\n return bcrypt.hash(password, 10);\r\n } catch (error: any) {\r\n if (error.code === 'MODULE_NOT_FOUND') {\r\n throw new Error('bcryptjs not installed. Run: npm install bcryptjs @types/bcryptjs');\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n async comparePasswords(password: string, hashedPassword: string): Promise<boolean> {\r\n try {\r\n const bcrypt = await import('bcryptjs');\r\n return bcrypt.compare(password, hashedPassword);\r\n } catch (error: any) {\r\n if (error.code === 'MODULE_NOT_FOUND') {\r\n throw new Error('bcryptjs not installed. Run: npm install bcryptjs @types/bcryptjs');\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n generateToken(user: Omit<User, 'password'>): string {\r\n try {\r\n const jwt = require('jsonwebtoken');\r\n const options: any = {};\r\n \r\n if (this.config.expiresIn) {\r\n options.expiresIn = this.config.expiresIn;\r\n }\r\n \r\n return jwt.sign(\r\n { id: user.id, username: user.username, roles: user.roles || [] },\r\n this.config.secret,\r\n options\r\n );\r\n } catch (error: any) {\r\n if (error.code === 'MODULE_NOT_FOUND') {\r\n throw new Error('jsonwebtoken not installed. Run: npm install jsonwebtoken @types/jsonwebtoken');\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n verifyToken(token: string): any {\r\n try {\r\n const jwt = require('jsonwebtoken');\r\n return jwt.verify(token, this.config.secret);\r\n } catch (error: any) {\r\n if (error.code === 'MODULE_NOT_FOUND') {\r\n throw new Error('jsonwebtoken not installed. Run: npm install jsonwebtoken @types/jsonwebtoken');\r\n }\r\n return null;\r\n }\r\n }\r\n\r\n // Express middleware for authentication\r\n initialize() {\r\n return (req: any, res: any, next: any) => {\r\n const token = this.extractToken(req);\r\n if (token) {\r\n const decoded = this.verifyToken(token);\r\n if (decoded) {\r\n req.user = decoded;\r\n }\r\n }\r\n next();\r\n };\r\n }\r\n\r\n // Express middleware for requiring authentication\r\n requireAuth() {\r\n return (req: any, res: any, next: any) => {\r\n if (!req.user) {\r\n return res.status(401).json({ message: 'Unauthorized' });\r\n }\r\n return next();\r\n };\r\n }\r\n\r\n // Express middleware for requiring specific roles\r\n requireRoles(roles: string[]) {\r\n return (req: any, res: any, next: any) => {\r\n if (!req.user) {\r\n return res.status(401).json({ message: 'Unauthorized' });\r\n }\r\n \r\n const userRoles = req.user.roles || [];\r\n const hasRequiredRole = roles.some(role => userRoles.includes(role));\r\n \r\n if (!hasRequiredRole) {\r\n return res.status(403).json({ message: 'Forbidden' });\r\n }\r\n \r\n return next();\r\n };\r\n }\r\n\r\n private extractToken(req: any): string | null {\r\n if (req.headers.authorization && req.headers.authorization.startsWith('Bearer ')) {\r\n return req.headers.authorization.substring(7);\r\n }\r\n return null;\r\n }\r\n}\r\n", "import path from 'path';\r\nimport fs from 'fs';\r\nimport { AuthService } from './auth.js';\r\nimport { pathToFileURL } from 'url';\r\n\r\ninterface RouteHandler {\r\n (req: any, res: any, next?: any): void | Promise<void>;\r\n}\r\n\r\ninterface RouteModule {\r\n get?: RouteHandler;\r\n post?: RouteHandler;\r\n put?: RouteHandler;\r\n delete?: RouteHandler;\r\n patch?: RouteHandler;\r\n options?: RouteHandler;\r\n middleware?: ((req: any, res: any, next: any) => void)[];\r\n // Add index signature to allow string indexing\r\n [key: string]: RouteHandler | ((req: any, res: any, next: any) => void)[] | undefined;\r\n}\r\n\r\nexport class ApiRouter {\r\n public router: any = null;\r\n private apiDir: string;\r\n private auth: AuthService | null;\r\n private initialized: boolean = false;\r\n\r\n constructor(apiDir: string, auth: AuthService | null = null) {\r\n this.apiDir = path.resolve(process.cwd(), apiDir);\r\n this.auth = auth;\r\n // Don't call async method in constructor\r\n }\r\n\r\n async initialize(): Promise<void> {\r\n if (this.initialized && this.router) return;\r\n \r\n try {\r\n const express = await import('express');\r\n this.router = express.default.Router();\r\n this.setupRoutes();\r\n this.initialized = true;\r\n console.log('\u2705 API Router initialized successfully');\r\n } catch (error: any) {\r\n console.error('\u274C Failed to initialize API Router:', error);\r\n if (error.code === 'MODULE_NOT_FOUND') {\r\n throw new Error('Express not installed. Run: npm install express @types/express');\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n isInitialized(): boolean {\r\n return this.initialized && this.router !== null;\r\n }\r\n\r\n private setupRoutes() {\r\n if (!fs.existsSync(this.apiDir)) {\r\n console.log(`API directory not found: ${this.apiDir}`);\r\n return;\r\n }\r\n\r\n this.scanDirectory(this.apiDir, '');\r\n }\r\n\r\n private scanDirectory(dirPath: string, routePrefix: string) {\r\n const entries = fs.readdirSync(dirPath, { withFileTypes: true });\r\n\r\n for (const entry of entries) {\r\n const fullPath = path.join(dirPath, entry.name);\r\n \r\n if (entry.isDirectory()) {\r\n // Recursively scan subdirectories\r\n this.scanDirectory(fullPath, `${routePrefix}/${entry.name}`);\r\n } else if (this.isRouteFile(entry.name)) {\r\n // Process route file\r\n const routePath = this.getRoutePath(entry.name, routePrefix);\r\n this.registerRoute(fullPath, routePath);\r\n }\r\n }\r\n }\r\n\r\n private isRouteFile(filename: string): boolean {\r\n return filename.endsWith('.js') || \r\n filename.endsWith('.ts') || \r\n filename.endsWith('.mjs');\r\n }\r\n\r\n private getRoutePath(filename: string, routePrefix: string): string {\r\n // Remove extension and handle special names\r\n const baseName = path.basename(filename, path.extname(filename));\r\n \r\n if (baseName === 'index') {\r\n return routePrefix || '/';\r\n }\r\n \r\n // Handle dynamic routes [param]\r\n const paramMatch = baseName.match(/^\\[(.+)\\]$/);\r\n if (paramMatch) {\r\n return `${routePrefix}/:${paramMatch[1]}`;\r\n }\r\n \r\n return `${routePrefix}/${baseName}`;\r\n }\r\n\r\n private async registerRoute(filePath: string, routePath: string) {\r\n try {\r\n // Ensure we have an absolute path and normalize it for Windows\r\n const absolutePath = path.isAbsolute(filePath) ? filePath : path.resolve(filePath);\r\n \r\n // Convert to proper file:// URL - this fixes the Windows ESM issue\r\n const fileUrl = pathToFileURL(absolutePath).href;\r\n \r\n // Add cache busting parameter to force reload\r\n const urlWithTimestamp = `${fileUrl}?t=${Date.now()}`;\r\n \r\n // Dynamic import the route file\r\n const routeModule = await import(urlWithTimestamp);\r\n \r\n if (!this.isValidRouteModule(routeModule)) {\r\n console.warn(`Invalid route module: ${filePath}`);\r\n return;\r\n }\r\n \r\n console.log(`Registering API route: ${routePath}`);\r\n \r\n // Register middleware if any\r\n const middleware = routeModule.middleware || [];\r\n \r\n // Register HTTP methods\r\n for (const method of ['get', 'post', 'put', 'delete', 'patch', 'options']) {\r\n const handler = routeModule[method];\r\n if (typeof handler === 'function') {\r\n const routerMethod = this.router[method];\r\n routerMethod.call(\r\n this.router,\r\n routePath, \r\n ...middleware,\r\n this.wrapHandler(handler)\r\n );\r\n }\r\n }\r\n } catch (error) {\r\n console.error(`Error registering route (${filePath}):`, error);\r\n }\r\n }\r\n\r\n private isValidRouteModule(module: any): module is RouteModule {\r\n if (!module) return false;\r\n \r\n // Check if at least one HTTP method handler is defined\r\n return ['get', 'post', 'put', 'delete', 'patch', 'options']\r\n .some(method => typeof module[method] === 'function');\r\n }\r\n\r\n private wrapHandler(handler: RouteHandler) {\r\n return async (req: any, res: any, next: any) => {\r\n try {\r\n await handler(req, res, next);\r\n } catch (error) {\r\n next(error);\r\n }\r\n };\r\n }\r\n}\r\n", "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", "import path from 'path';\r\nimport http from 'http';\r\nimport fs from 'fs';\r\nimport { renderToString } from 'frontend-hamroun';\r\nimport { Database } from './database.js';\r\nimport { AuthService } from './auth.js';\r\nimport { ApiRouter } from './api-router.js';\r\nimport { requestLogger, errorHandler, notFoundHandler, rateLimit } from './middleware.js';\r\n\r\n// Import the utility functions\r\nimport * as utils from './utils.js';\r\nimport * as templates from './templates.js';\r\nimport { initNodeWasm, loadGoWasmFromFile } from './wasm.js';\r\n\r\n// Helper function to get the component name from the file path\r\nfunction getComponentName(filePath: string, pagesDir: string): string {\r\n try {\r\n // Get relative path from pages directory\r\n const relativePath = path.relative(pagesDir, filePath);\r\n // Remove extension\r\n const withoutExt = relativePath.replace(/\\.[^/.]+$/, '');\r\n // Replace index with empty for clean paths\r\n const cleanPath = withoutExt.replace(/\\/index$/, '');\r\n // Convert to module path format\r\n return `/pages/${cleanPath}`;\r\n } catch (e) {\r\n return '';\r\n }\r\n}\r\n\r\nexport interface ServerConfig {\r\n port?: number;\r\n apiDir?: string;\r\n pagesDir?: string;\r\n staticDir?: string;\r\n enableCors?: boolean;\r\n corsOptions?: any;\r\n db?: {\r\n url: string;\r\n type: 'mongodb' | 'mysql' | 'postgres';\r\n };\r\n auth?: {\r\n secret: string;\r\n expiresIn?: string | number;\r\n };\r\n}\r\n\r\nexport class Server {\r\n private app: any;\r\n private server: http.Server | null = null;\r\n private config: ServerConfig;\r\n private db: Database | null = null;\r\n private auth: AuthService | null = null;\r\n private initialized: boolean = false;\r\n\r\n constructor(config: ServerConfig = {}) {\r\n this.config = {\r\n port: 3000,\r\n apiDir: './api',\r\n pagesDir: './pages',\r\n staticDir: './public',\r\n enableCors: true,\r\n ...config\r\n };\r\n\r\n // Don't call initializeApp here - call it in start() instead\r\n }\r\n\r\n private async initializeApp() {\r\n if (this.initialized) return;\r\n\r\n try {\r\n // Dynamic import of express to handle missing dependency\r\n const express = await import('express');\r\n this.app = express.default();\r\n \r\n // Basic middleware\r\n this.app.use(express.default.json());\r\n this.app.use(express.default.urlencoded({ extended: true }));\r\n \r\n // CORS setup\r\n if (this.config.enableCors) {\r\n try {\r\n const cors = await import('cors');\r\n this.app.use(cors.default(this.config.corsOptions));\r\n } catch (error) {\r\n console.warn('CORS not available - install with: npm install cors @types/cors');\r\n }\r\n }\r\n \r\n // Setup database if configured\r\n if (this.config.db) {\r\n this.db = new Database(this.config.db);\r\n }\r\n \r\n // Setup auth if configured\r\n if (this.config.auth) {\r\n this.auth = new AuthService({\r\n secret: this.config.auth.secret,\r\n expiresIn: this.config.auth.expiresIn\r\n });\r\n this.app.use(this.auth.initialize());\r\n }\r\n \r\n // Static files - setup before other routes\r\n const staticPath = path.resolve(process.cwd(), this.config.staticDir!);\r\n if (fs.existsSync(staticPath)) {\r\n this.app.use(express.default.static(staticPath));\r\n }\r\n \r\n // Setup API routes\r\n this.setupApiRoutes();\r\n \r\n // Setup page routes (for SSR)\r\n this.setupPageRoutes();\r\n \r\n // Add error handlers at the end\r\n this.app.use(notFoundHandler);\r\n this.app.use(errorHandler);\r\n \r\n this.initialized = true;\r\n \r\n } catch (error: any) {\r\n if (error.code === 'MODULE_NOT_FOUND' && error.message.includes('express')) {\r\n throw new Error('Express not installed. Run: npm install express @types/express');\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n private async setupApiRoutes() {\r\n const apiRouter = new ApiRouter(this.config.apiDir!, this.auth);\r\n \r\n // Initialize the router properly and wait for completion\r\n await apiRouter.initialize();\r\n \r\n // Double-check if router was created successfully\r\n if (!apiRouter.isInitialized() || !apiRouter.router) {\r\n console.warn('\u26A0\uFE0F API router not initialized properly - skipping API routes');\r\n return;\r\n }\r\n \r\n console.log('\u2705 Setting up API routes...');\r\n this.app.use('/api', requestLogger, apiRouter.router);\r\n \r\n // Add API documentation route\r\n this.app.get('/api-docs', (req: any, res: any) => {\r\n const apiDocs = this.generateApiDocs();\r\n res.json(apiDocs);\r\n });\r\n }\r\n\r\n private generateApiDocs() {\r\n // Generate documentation based on API routes\r\n const apiDir = path.resolve(process.cwd(), this.config.apiDir!);\r\n const docs = { endpoints: [] as any[] };\r\n \r\n if (fs.existsSync(apiDir)) {\r\n this.scanApiDirectory(apiDir, '', docs.endpoints);\r\n }\r\n \r\n return docs;\r\n }\r\n \r\n private scanApiDirectory(dirPath: string, routePrefix: string, endpoints: any[]) {\r\n const entries = fs.readdirSync(dirPath, { withFileTypes: true });\r\n \r\n for (const entry of entries) {\r\n const fullPath = path.join(dirPath, entry.name);\r\n \r\n if (entry.isDirectory()) {\r\n this.scanApiDirectory(fullPath, `${routePrefix}/${entry.name}`, endpoints);\r\n } else if (entry.name.endsWith('.js') || entry.name.endsWith('.ts')) {\r\n const routePath = this.getRoutePath(entry.name, routePrefix);\r\n endpoints.push({\r\n path: routePath,\r\n file: path.relative(process.cwd(), fullPath),\r\n methods: this.detectApiMethods(fullPath)\r\n });\r\n }\r\n }\r\n }\r\n \r\n private getRoutePath(filename: string, routePrefix: string): string {\r\n const baseName = path.basename(filename, path.extname(filename));\r\n \r\n if (baseName === 'index') {\r\n return routePrefix || '/';\r\n }\r\n \r\n const paramMatch = baseName.match(/^\\[(.+)\\]$/);\r\n if (paramMatch) {\r\n return `${routePrefix}/:${paramMatch[1]}`;\r\n }\r\n \r\n return `${routePrefix}/${baseName}`;\r\n }\r\n \r\n private detectApiMethods(filePath: string): string[] {\r\n try {\r\n const content = fs.readFileSync(filePath, 'utf8');\r\n const methods = ['get', 'post', 'put', 'delete', 'patch', 'options'];\r\n return methods.filter(method => \r\n new RegExp(`export (async )?function ${method}\\\\s*\\\\(`).test(content) ||\r\n new RegExp(`export const ${method}\\\\s*=`).test(content)\r\n );\r\n } catch (error) {\r\n return [];\r\n }\r\n }\r\n\r\n private setupPageRoutes() {\r\n const pagesPath = path.resolve(process.cwd(), this.config.pagesDir!);\r\n if (!fs.existsSync(pagesPath)) {\r\n return;\r\n }\r\n\r\n // Setup catch-all route for SSR - but only if pages directory exists\r\n this.app.get('*', async (req: { path: string; }, res: { status: (arg0: number) => { (): any; new(): any; send: { (arg0: string): void; new(): any; }; }; }) => {\r\n try {\r\n const { html, statusCode } = await this.renderPage(req.path);\r\n res.status(statusCode || 200).send(html);\r\n } catch (error) {\r\n console.error('Error rendering page:', error);\r\n const errorHtml = templates.generateErrorPage(500, 'Server Error');\r\n res.status(500).send(errorHtml);\r\n }\r\n });\r\n }\r\n\r\n private async renderPage(routePath: string): Promise<{ html: string, statusCode?: number }> {\r\n try {\r\n // Try to find the page component\r\n const pagesDir = this.config.pagesDir ? path.resolve(process.cwd(), this.config.pagesDir) : '';\r\n if (!pagesDir || !fs.existsSync(pagesDir)) {\r\n return { \r\n html: templates.generateErrorPage(404, 'Pages directory not found'), \r\n statusCode: 404 \r\n };\r\n }\r\n \r\n // Normalize the path\r\n let normalizedPath = routePath;\r\n if (!normalizedPath.startsWith('/')) {\r\n normalizedPath = '/' + normalizedPath;\r\n }\r\n \r\n // Default to index for the root\r\n if (normalizedPath === '/') {\r\n normalizedPath = '/index';\r\n }\r\n \r\n // Try to find a matching page file\r\n let pagePath = '';\r\n const possiblePaths = [\r\n path.join(pagesDir, `${normalizedPath}.js`),\r\n path.join(pagesDir, `${normalizedPath}.ts`),\r\n path.join(pagesDir, `${normalizedPath}.jsx`),\r\n path.join(pagesDir, `${normalizedPath}.tsx`),\r\n path.join(pagesDir, `${normalizedPath}/index.js`),\r\n path.join(pagesDir, `${normalizedPath}/index.ts`),\r\n path.join(pagesDir, `${normalizedPath}/index.jsx`),\r\n path.join(pagesDir, `${normalizedPath}/index.tsx`)\r\n ];\r\n \r\n for (const p of possiblePaths) {\r\n if (fs.existsSync(p)) {\r\n pagePath = p;\r\n break;\r\n }\r\n }\r\n \r\n // Handle 404 if page not found\r\n if (!pagePath) {\r\n return { \r\n html: templates.generateErrorPage(404, `Page not found: ${normalizedPath}`), \r\n statusCode: 404 \r\n };\r\n }\r\n \r\n // Import and render the page component\r\n try {\r\n 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 async start(): Promise<void> {\r\n // Initialize the app first if not already done\r\n await this.initializeApp();\r\n \r\n return new Promise((resolve) => {\r\n this.server = this.app.listen(this.config.port, () => {\r\n console.log(`Server running at http://localhost:${this.config.port}`);\r\n resolve();\r\n });\r\n });\r\n }\r\n\r\n public stop(): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n if (!this.server) {\r\n return resolve();\r\n }\r\n \r\n this.server.close((err: any) => {\r\n if (err) return reject(err);\r\n this.server = null;\r\n resolve();\r\n });\r\n });\r\n }\r\n\r\n public restart(): Promise<void> {\r\n return this.stop().then(() => this.start());\r\n }\r\n \r\n public enableSSR(options: { hydratable?: boolean } = {}): void {\r\n if (!fs.existsSync(path.resolve(process.cwd(), this.config.pagesDir!))) {\r\n fs.mkdirSync(path.resolve(process.cwd(), this.config.pagesDir!), { recursive: true });\r\n }\r\n \r\n // Set up client-side JS for hydration if needed\r\n if (options.hydratable) {\r\n const staticDir = path.resolve(process.cwd(), this.config.staticDir!);\r\n if (!fs.existsSync(staticDir)) {\r\n fs.mkdirSync(staticDir, { recursive: true });\r\n }\r\n \r\n // Generate or copy client hydration script\r\n // This is a simplified example - would need more implementation\r\n const clientJsPath = path.join(staticDir, 'client.js');\r\n if (!fs.existsSync(clientJsPath)) {\r\n const clientJsContent = `\r\n // Auto-generated hydration script\r\n import { hydrate } from '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", "/**\r\n * Server-side rendering utilities\r\n */\r\n\r\nexport function renderToString(component: any): string {\r\n try {\r\n // Basic server-side rendering - this is a simplified implementation\r\n if (typeof component === 'function') {\r\n const result = component();\r\n if (typeof result === 'string') {\r\n return result;\r\n }\r\n if (result && typeof result === 'object') {\r\n return JSON.stringify(result);\r\n }\r\n return String(result || '');\r\n }\r\n \r\n if (typeof component === 'string') {\r\n return component;\r\n }\r\n \r\n return String(component || '');\r\n } catch (error) {\r\n console.error('Error in renderToString:', error);\r\n return '<div>Error rendering component</div>';\r\n }\r\n}\r\n\r\n", "// Re-export everything from frontend-hamroun\r\nexport * from 'frontend-hamroun';\r\n\r\n// Export type definitions (safe for all environments)\r\nexport type { ServerConfig, User, DbConfig, MiddlewareFunction } from './server/types.js';\r\n\r\n// Export WASM functionality (browser-only functions)\r\nexport { loadGoWasm, callWasmFunction, isWasmReady, getWasmFunctions, useGoWasm } from './wasm.js';\r\nexport type { GoWasmOptions, GoWasmInstance } from './server/types.js';\r\n\r\n// Runtime environment detection\r\nconst isNode = typeof process !== 'undefined' && process.versions?.node;\r\nconst isBrowser = typeof window !== 'undefined';\r\n\r\n// Server functionality - only load in Node.js environment\r\nlet BaraqexServer: any = null;\r\nlet createServer: any = null;\r\nlet createDevServer: any = null;\r\nlet createProductionServer: any = null;\r\nlet renderComponent: any = null;\r\nlet Database: any = null;\r\nlet AuthService: any = null;\r\nlet ApiRouter: any = null;\r\nlet requestLogger: any = null;\r\nlet errorHandler: any = null;\r\nlet notFoundHandler: any = null;\r\nlet rateLimit: any = null;\r\nlet initNodeWasm: any = null;\r\nlet loadGoWasmFromFile: any = null;\r\nlet hashString: any = null;\r\nlet getPagination: any = null;\r\nlet sendSuccess: any = null;\r\nlet sendError: any = null;\r\nlet validateFields: any = null;\r\nlet validateFileUpload: any = null;\r\nlet getEnvironmentInfo: any = null;\r\nlet isDirectoryEmpty: any = null;\r\nlet ensureDirectory: any = null;\r\nlet writeJsonFile: any = null;\r\nlet readJsonFile: any = null;\r\nlet baraqexRenderToString: any = null;\r\n\r\n// Browser-safe utilities with fallbacks\r\nlet safeJsonParse = (json: string, fallback: any) => {\r\n try {\r\n return JSON.parse(json);\r\n } catch {\r\n return fallback;\r\n }\r\n};\r\n\r\nlet generateToken = (length: number = 32) => {\r\n const array = new Uint8Array(length);\r\n if (typeof crypto !== 'undefined' && crypto.getRandomValues) {\r\n crypto.getRandomValues(array);\r\n } else {\r\n for (let i = 0; i < array.length; i++) {\r\n array[i] = Math.floor(Math.random() * 256);\r\n }\r\n }\r\n return Array.from(array, byte => byte.toString(16).padStart(2, '0')).join('');\r\n};\r\n\r\n// Browser-safe template utilities\r\nlet generateDocument = (content: string, options: any = {}) => \r\n `<!DOCTYPE html><html><head><title>${options.title || 'App'}</title></head><body>${content}</body></html>`;\r\n\r\nlet generateErrorPage = (code: number, message: string) => \r\n `<div>Error ${code}: ${message}</div>`;\r\n\r\nlet generateLoadingPage = (message: string = 'Loading...') => \r\n `<div>${message}</div>`;\r\n\r\n// Browser-safe renderToString function\r\nlet renderToString = (component: any): string => {\r\n try {\r\n if (typeof component === 'function') {\r\n const result = component();\r\n return typeof result === 'string' ? result : String(result || '');\r\n }\r\n return String(component || '');\r\n } catch (error) {\r\n return '<div>Error rendering component</div>';\r\n }\r\n};\r\n\r\n// Initialize server modules in Node.js environment\r\nif (isNode && !isBrowser) {\r\n // Use dynamic import with IIFE to handle async initialization\r\n (async () => {\r\n try {\r\n // Check if Express is available before importing server modules\r\n try {\r\n await import('express');\r\n \r\n // Import server modules\r\n const [serverModule, utilsModule, templatesModule, rendererModule] = await Promise.all([\r\n import('./server/index.js'),\r\n import('./server/utils.js'),\r\n import('./server/templates.js'),\r\n import('./server-renderer.js')\r\n ]);\r\n \r\n // Assign server functionality\r\n BaraqexServer = serverModule.Server;\r\n createServer = serverModule.createServer;\r\n createDevServer = serverModule.createDevServer;\r\n createProductionServer = serverModule.createProductionServer;\r\n renderComponent = serverModule.renderComponent;\r\n Database = serverModule.Database;\r\n AuthService = serverModule.AuthService;\r\n ApiRouter = serverModule.ApiRouter;\r\n requestLogger = serverModule.requestLogger;\r\n errorHandler = serverModule.errorHandler;\r\n notFoundHandler = serverModule.notFoundHandler;\r\n rateLimit = serverModule.rateLimit;\r\n initNodeWasm = serverModule.initNodeWasm;\r\n loadGoWasmFromFile = serverModule.loadGoWasmFromFile;\r\n \r\n // Assign server utilities\r\n safeJsonParse = utilsModule.safeJsonParse;\r\n generateToken = utilsModule.generateToken;\r\n hashString = utilsModule.hashString;\r\n getPagination = utilsModule.getPagination;\r\n sendSuccess = utilsModule.sendSuccess;\r\n sendError = utilsModule.sendError;\r\n validateFields = utilsModule.validateFields;\r\n validateFileUpload = utilsModule.validateFileUpload;\r\n getEnvironmentInfo = utilsModule.getEnvironmentInfo;\r\n isDirectoryEmpty = utilsModule.isDirectoryEmpty;\r\n ensureDirectory = utilsModule.ensureDirectory;\r\n writeJsonFile = utilsModule.writeJsonFile;\r\n readJsonFile = utilsModule.readJsonFile;\r\n \r\n // Assign template utilities\r\n generateDocument = templatesModule.generateDocument;\r\n generateErrorPage = templatesModule.generateErrorPage;\r\n generateLoadingPage = templatesModule.generateLoadingPage;\r\n \r\n // Assign server-renderer\r\n baraqexRenderToString = rendererModule.renderToString;\r\n \r\n } catch (expressError) {\r\n console.warn('Express not available - server functionality disabled');\r\n // Set error functions\r\n createServer = () => {\r\n throw new Error('Server functionality not available. Make sure you have Express installed: npm install express @types/express');\r\n };\r\n createDevServer = () => {\r\n throw new Error('Server functionality not available. Make sure you have Express installed: npm install express @types/express');\r\n };\r\n createProductionServer = () => {\r\n throw new Error('Server functionality not available. Make sure you have Express installed: npm install express @types/express');\r\n };\r\n }\r\n } catch (error: any) {\r\n console.warn('Server modules not available:', error.message);\r\n }\r\n })();\r\n}\r\n\r\n// Export all the variables\r\nexport {\r\n BaraqexServer,\r\n createServer,\r\n createDevServer,\r\n createProductionServer,\r\n renderComponent,\r\n Database,\r\n AuthService,\r\n ApiRouter,\r\n requestLogger,\r\n errorHandler,\r\n notFoundHandler,\r\n rateLimit,\r\n initNodeWasm,\r\n loadGoWasmFromFile,\r\n safeJsonParse,\r\n generateToken,\r\n hashString,\r\n getPagination,\r\n sendSuccess,\r\n sendError,\r\n validateFields,\r\n validateFileUpload,\r\n getEnvironmentInfo,\r\n isDirectoryEmpty,\r\n ensureDirectory,\r\n writeJsonFile,\r\n readJsonFile,\r\n generateDocument,\r\n generateErrorPage,\r\n generateLoadingPage,\r\n baraqexRenderToString,\r\n renderToString\r\n};\r\n\r\nconsole.log('Baraqex - powered by Frontend Hamroun Framework with additional utilities');\r\n\r\n", "/**\r\n * WebAssembly integration for Frontend Hamroun\r\n * Works in both browser and Node.js environments\r\n */\r\n\r\nexport interface GoWasmOptions {\r\n debug?: boolean;\r\n goWasmPath?: string;\r\n importObject?: any;\r\n onLoad?: (instance: GoWasmInstance) => void;\r\n}\r\n\r\nexport interface GoWasmInstance {\r\n instance: WebAssembly.Instance;\r\n module: WebAssembly.Module;\r\n exports: WebAssembly.Exports;\r\n functions: Record<string, Function>;\r\n}\r\n\r\n/**\r\n * Load Go WASM module in the browser (like your working frontend code)\r\n */\r\nexport async function loadGoWasm(\r\n wasmUrl: string,\r\n options: GoWasmOptions = {}\r\n): Promise<GoWasmInstance> {\r\n if (typeof window === 'undefined') {\r\n throw new Error('loadGoWasm() is for browser use only. Use loadGoWasmFromFile() in Node.js.');\r\n }\r\n\r\n try {\r\n // Check if Go WASM runtime is available (like your frontend code)\r\n if (!window.Go) {\r\n throw new Error('Go WASM runtime not available. Make sure wasm_exec.js is loaded.');\r\n }\r\n\r\n if (options.debug) {\r\n console.log('[WASM] Loading WASM from:', wasmUrl);\r\n }\r\n\r\n // Fetch the WASM file (exactly like your frontend code)\r\n const response = await fetch(wasmUrl);\r\n \r\n if (!response.ok) {\r\n throw new Error(`Failed to fetch WASM file: ${response.status}`);\r\n }\r\n\r\n const wasmBytes = await response.arrayBuffer();\r\n \r\n // Initialize Go runtime (exactly like your frontend code)\r\n const go = new window.Go();\r\n const wasmModule = await WebAssembly.instantiate(wasmBytes, go.importObject);\r\n \r\n // Run the Go program (exactly like your frontend code)\r\n go.run(wasmModule.instance);\r\n \r\n // Wait a bit for Go functions to be registered (like your frontend code)\r\n await new Promise(resolve => setTimeout(resolve, 100));\r\n \r\n if (options.debug) {\r\n console.log('[WASM] Go program started, checking for registered functions...');\r\n }\r\n\r\n // Extract exported functions from global scope (like your frontend code)\r\n const functions: Record<string, Function> = {};\r\n \r\n // Look for Go functions in global scope\r\n for (const key in window) {\r\n if (typeof window[key] === 'function' && key.startsWith('go')) {\r\n functions[key] = window[key] as Function;\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: wasmModule.instance,\r\n module: wasmModule,\r\n exports: wasmModule.instance.exports,\r\n functions\r\n };\r\n\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 }\r\n\r\n return wasmInstance;\r\n\r\n } catch (error) {\r\n console.error('[WASM] Error loading Go WASM module:', error);\r\n throw error;\r\n }\r\n}\r\n\r\n/**\r\n * Call a Go WASM function (like your frontend code's callWasmFunction)\r\n */\r\nexport function callWasmFunction(funcName: string, ...args: any[]): any {\r\n if (typeof window === 'undefined') {\r\n throw new Error('callWasmFunction() is for browser use only.');\r\n }\r\n\r\n const func = (window 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 (like your frontend code's wasmReady state)\r\n */\r\nexport function isWasmReady(): boolean {\r\n if (typeof window === 'undefined') {\r\n return false;\r\n }\r\n\r\n // Check if Go runtime is available and at least one Go function exists\r\n return !!(window.Go && Object.keys(window).some(key => \r\n key.startsWith('go') && typeof window[key] === 'function'\r\n ));\r\n}\r\n\r\n/**\r\n * Get all available Go WASM functions\r\n */\r\nexport function getWasmFunctions(): string[] {\r\n if (typeof window === 'undefined') {\r\n return [];\r\n }\r\n\r\n return Object.keys(window).filter(key => \r\n key.startsWith('go') && typeof window[key] === 'function'\r\n );\r\n}\r\n\r\n/**\r\n * Hook for React components (like your frontend code's useEffect pattern)\r\n */\r\nexport function useGoWasm(wasmUrl: string, options: GoWasmOptions = {}) {\r\n if (typeof window === 'undefined') {\r\n throw new Error('useGoWasm() is for browser use only.');\r\n }\r\n\r\n // This would need to be implemented as a React hook in frontend-hamroun\r\n // For now, return the basic functionality\r\n return {\r\n loadWasm: () => loadGoWasm(wasmUrl, options),\r\n callFunction: callWasmFunction,\r\n isReady: isWasmReady,\r\n getFunctions: getWasmFunctions\r\n };\r\n}\r\n\r\n// Browser-specific type declarations\r\ndeclare global {\r\n interface Window {\r\n Go: new () => {\r\n importObject: any;\r\n run: (instance: WebAssembly.Instance) => void;\r\n };\r\n [key: string]: any;\r\n }\r\n}\r\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["index", "state", "setState", "ref", "Component", "crypto", "fs", "path", "escapeHtml", "content", "fs", "path", "pathToFileURL", "path", "fs", "server", "renderToString", "createServer", "createDevServer", "createProductionServer", "renderComponent", "Database", "AuthService", "ApiRouter", "requestLogger", "errorHandler", "notFoundHandler", "rateLimit", "initNodeWasm", "loadGoWasmFromFile", "hashString", "getPagination", "sendSuccess", "sendError", "validateFields", "validateFileUpload", "getEnvironmentInfo", "isDirectoryEmpty", "ensureDirectory", "writeJsonFile", "readJsonFile", "safeJsonParse", "generateToken", "generateDocument", "generateErrorPage", "generateLoadingPage", "renderToString"]
|
|
7
7
|
}
|