frontend-hamroun 1.2.80 → 1.2.83
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.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.client.cjs +1 -1
- package/dist/index.client.js +2 -2
- package/dist/index.js +11 -7
- package/dist/index.js.map +1 -1
- package/dist/{renderer-Din1y3YM.cjs → renderer-BL3gq8cW.cjs} +2 -2
- package/dist/{renderer-Din1y3YM.cjs.map → renderer-BL3gq8cW.cjs.map} +1 -1
- package/dist/{renderer-Bo9zkUZ_.js → renderer-Dyy-o05F.js} +2 -2
- package/dist/{renderer-Bo9zkUZ_.js.map → renderer-Dyy-o05F.js.map} +1 -1
- package/dist/{server-renderer-QHt45Ip2.js → server-renderer-C1WXH-zV.js} +99 -73
- package/dist/server-renderer-C1WXH-zV.js.map +1 -0
- package/dist/server-renderer-Chs-nmJm.cjs +2 -0
- package/dist/server-renderer-Chs-nmJm.cjs.map +1 -0
- package/dist/server-renderer.cjs +1 -1
- package/dist/server-renderer.js +1 -1
- package/package.json +1 -1
- package/templates/basic-app/src/App.jsx +16 -0
- package/templates/basic-app/src/client.jsx +5 -0
- package/templates/basic-app/src/components/Counter.jsx +13 -0
- package/templates/basic-app/src/jsx-shim.js +3 -0
- package/templates/basic-app/src/jsx-shim.ts +7 -0
- package/templates/basic-app/src/main.jsx +98 -0
- package/templates/basic-app/src/server.js +47 -0
- package/templates/complete-app/api/hello.js +0 -0
- package/templates/complete-app/lib/frontend-hamroun.js +182 -0
- package/templates/complete-app/package.json +18 -0
- package/templates/complete-app/pages/about.js +119 -0
- package/templates/complete-app/pages/about.jsx +0 -0
- package/templates/complete-app/pages/index.js +157 -0
- package/templates/complete-app/pages/index.jsx +0 -0
- package/templates/complete-app/pages/wasm-demo.js +290 -0
- package/templates/complete-app/pages/wasm-demo.jsx +0 -0
- package/templates/complete-app/public/client.js +89 -0
- package/templates/complete-app/public/index.html +118 -0
- package/templates/complete-app/public/styles.css +76 -0
- package/templates/complete-app/server.js +226 -0
- package/templates/complete-app/src/App.tsx +59 -0
- package/templates/complete-app/src/client.tsx +18 -0
- package/templates/complete-app/src/server.ts +218 -0
- package/templates/complete-app/tsconfig.json +22 -0
- package/templates/complete-app/tsconfig.server.json +19 -0
- package/templates/{ssr-template → complete-app}/vite.config.js +16 -5
- package/templates/complete-app/vite.config.ts +30 -0
- package/templates/complete-app/wasm/build.bat +0 -0
- package/templates/complete-app/wasm/build.sh +0 -0
- package/templates/complete-app/wasm/example.go +0 -0
- package/templates/fullstack-app/build/main.css +874 -874
- package/templates/fullstack-app/build/main.css.map +7 -7
- package/templates/fullstack-app/build/main.js +996 -967
- package/templates/fullstack-app/build/main.js.map +7 -7
- package/templates/fullstack-app/package-lock.json +6301 -0
- package/templates/fullstack-app/public/styles.css +768 -768
- package/templates/go/example.go +154 -99
- package/templates/ssr-template/dist/client/assets/main-D-VH3xOb.js +1 -0
- package/templates/ssr-template/dist/client/index.html +23 -0
- package/templates/ssr-template/dist/client.js +951 -0
- package/templates/ssr-template/dist/server.js +739 -0
- package/templates/ssr-template/esbuild.config.js +33 -0
- package/templates/ssr-template/jsx-shim.js +1 -0
- package/templates/ssr-template/package.json +14 -8
- package/templates/ssr-template/src/App.tsx +847 -49
- package/templates/ssr-template/src/client.tsx +3 -17
- package/templates/ssr-template/src/server.ts +21 -204
- package/templates/ssr-template/tsconfig.json +9 -8
- package/templates/ssr-template/tsconfig.server.json +6 -14
- package/templates/ssr-template/vite.config.ts +19 -17
- package/templates/wasm/build-wasm.js +228 -0
- package/templates/wasm/dist/assets/index-BNqTDBdE.js +295 -0
- package/templates/wasm/dist/example.wasm +0 -0
- package/templates/wasm/dist/index.html +53 -0
- package/templates/{go-wasm-app/public/wasm → wasm/dist}/wasm_exec.js +572 -561
- package/templates/wasm/esbuild.config.js +63 -0
- package/templates/wasm/go/main.go +256 -0
- package/templates/wasm/go/wasm_exec.js +0 -0
- package/templates/wasm/index.html +97 -0
- package/templates/wasm/jsx-shim.js +9 -0
- package/templates/wasm/package-lock.json +4577 -0
- package/templates/wasm/package.json +25 -0
- package/templates/wasm/public/example.wasm +0 -0
- package/templates/wasm/public/wasm_exec.js +572 -0
- package/templates/wasm/src/App.tsx +550 -0
- package/templates/wasm/src/client.tsx +220 -0
- package/templates/wasm/src/index.tsx +21 -0
- package/templates/wasm/src/server.ts +145 -0
- package/templates/wasm/tsconfig.json +21 -0
- package/templates/wasm/tsconfig.node.json +13 -0
- package/templates/wasm/tsconfig.server.json +23 -0
- package/templates/wasm/vite.config.ts +38 -0
- package/templates/wasm/wasm-loader.js +103 -0
- package/dist/server-renderer-CqIpQ-od.cjs +0 -2
- package/dist/server-renderer-CqIpQ-od.cjs.map +0 -1
- package/dist/server-renderer-QHt45Ip2.js.map +0 -1
- package/templates/basic-app/bun.lock +0 -196
- package/templates/basic-app/docs/rapport_pfe.aux +0 -27
- package/templates/basic-app/docs/rapport_pfe.out +0 -10
- package/templates/basic-app/docs/rapport_pfe.pdf +0 -0
- package/templates/basic-app/docs/rapport_pfe.tex +0 -68
- package/templates/basic-app/docs/rapport_pfe.toc +0 -14
- package/templates/basic-app/package-lock.json +0 -4185
- package/templates/go-wasm-app/README.md +0 -38
- package/templates/go-wasm-app/babel.config.js +0 -15
- package/templates/go-wasm-app/build-client.js +0 -49
- package/templates/go-wasm-app/build-wasm.js +0 -237
- package/templates/go-wasm-app/package.json +0 -23
- package/templates/go-wasm-app/public/index.html +0 -128
- package/templates/go-wasm-app/public/styles.css +0 -197
- package/templates/go-wasm-app/public/wasm/example.wasm +0 -0
- package/templates/go-wasm-app/public/wasm/wasm_exec_node.js +0 -39
- package/templates/go-wasm-app/server.js +0 -521
- package/templates/go-wasm-app/src/App.jsx +0 -38
- package/templates/go-wasm-app/src/app.js +0 -153
- package/templates/go-wasm-app/src/client.js +0 -57
- package/templates/go-wasm-app/src/components/Footer.jsx +0 -13
- package/templates/go-wasm-app/src/components/Header.jsx +0 -19
- package/templates/go-wasm-app/src/components/WasmDemo.jsx +0 -120
- package/templates/go-wasm-app/src/main.jsx +0 -12
- package/templates/go-wasm-app/src/wasm/example.go +0 -75
- package/templates/go-wasm-app/tsconfig.server.json +0 -18
- package/templates/go-wasm-app/vite.config.js +0 -34
- package/templates/ssr-template/package-lock.json +0 -2478
- package/templates/ssr-template/public/index.html +0 -47
- package/templates/ssr-template/server.js +0 -369
- /package/templates/{ssr-template → complete-app}/client.js +0 -0
- /package/templates/{ssr-template → complete-app}/readme.md +0 -0
- /package/templates/{ssr-template → complete-app}/server.ts +0 -0
- /package/templates/{ssr-template → complete-app}/src/client.ts +0 -0
- /package/templates/{ssr-template → complete-app}/src/pages/index.tsx +0 -0
@@ -1,7 +1,7 @@
|
|
1
|
-
{
|
2
|
-
"version": 3,
|
3
|
-
"sources": ["../node_modules/frontend-hamroun/src/
|
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 a placeholder for server functionality that works in browser environments\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", "import { jsx, Fragment } from 'frontend-hamroun';\nimport { jsx } from 'frontend-hamroun';\r\n\r\nexport default function NotFound({ initialState }) {\r\n return (\r\n <div className=\"not-found-container max-w-4xl mx-auto p-6\">\r\n <div className=\"bg-gray-50 border border-gray-200 rounded-lg p-8 shadow-sm\">\r\n <h1 className=\"text-3xl font-bold text-gray-700 mb-4\">Page Not Found</h1>\r\n \r\n <p className=\"text-lg text-gray-600 mb-4\">\r\n The page you are looking for does not exist or has been moved.\r\n </p>\r\n \r\n <p className=\"text-gray-600 mb-6\">\r\n Path: <code className=\"bg-gray-100 px-2 py-1 rounded\">{initialState?.route || 'unknown'}</code>\r\n </p>\r\n \r\n <div className=\"mt-6\">\r\n <a \r\n href=\"/\"\r\n className=\"inline-block px-4 py-2 bg-blue-600 text-white rounded-md hover:bg-blue-700\"\r\n >\r\n Back to Home\r\n </a>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n", "import { jsx, Fragment } from 'frontend-hamroun';\n", "import { jsx, Fragment } from 'frontend-hamroun';\nimport { jsx } from 'frontend-hamroun';\r\n\r\ninterface LayoutProps {\r\n children: any;\r\n title?: string;\r\n}\r\n\r\nexport default function Layout({ children, title = 'Frontend Hamroun App' }: LayoutProps) {\r\n return (\r\n <div className=\"min-h-screen flex flex-col bg-gray-50\">\r\n <header className=\"bg-blue-600 text-white\">\r\n <div className=\"container mx-auto px-4 py-4 flex justify-between items-center\">\r\n <h1 className=\"text-xl font-bold\">\r\n <a href=\"/\" className=\"hover:text-blue-100\">\r\n {title}\r\n </a>\r\n </h1>\r\n \r\n <nav>\r\n <ul className=\"flex space-x-6\">\r\n <li><a href=\"/\" className=\"hover:text-blue-100\">Home</a></li>\r\n <li><a href=\"/about\" className=\"hover:text-blue-100\">About</a></li>\r\n {/* WASM demo link removed */}\r\n </ul>\r\n </nav>\r\n </div>\r\n </header>\r\n \r\n <main className=\"flex-grow container mx-auto px-4 py-8\">\r\n {children}\r\n </main>\r\n \r\n <footer className=\"bg-gray-800 text-white\">\r\n <div className=\"container mx-auto px-4 py-6\">\r\n <p className=\"text-center text-gray-400\">\r\n © {new Date().getFullYear()} Frontend Hamroun App. All rights reserved.\r\n </p>\r\n </div>\r\n </footer>\r\n </div>\r\n );\r\n}\r\n", "import { jsx, Fragment } from 'frontend-hamroun';\nimport { jsx } from 'frontend-hamroun';\r\nimport Layout from '../components/Layout';\r\n\r\n// This is the main App wrapper component similar to Next.js _app.js\r\nexport default function App({ Component, pageProps, initialState }) {\r\n return (\r\n <Layout>\r\n <Component {...pageProps} initialState={initialState} />\r\n </Layout>\r\n );\r\n}\r\n", "import { jsx, Fragment } from 'frontend-hamroun';\nimport { jsx } from 'frontend-hamroun';\r\n\r\nexport default function Document({ \r\n title = 'Frontend Hamroun App',\r\n headContent,\r\n bodyContent,\r\n scripts\r\n}) {\r\n return (\r\n <html lang=\"en\">\r\n <head>\r\n <meta charSet=\"UTF-8\" />\r\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\r\n <title>{title}</title>\r\n <link rel=\"stylesheet\" href=\"/styles.css\" />\r\n {headContent}\r\n </head>\r\n <body>\r\n <div id=\"root\">{bodyContent}</div>\r\n <script src=\"/build/main.js\" type=\"module\"></script>\r\n {scripts}\r\n </body>\r\n </html>\r\n );\r\n}\r\n", "import { jsx, Fragment } from 'frontend-hamroun';\nimport { jsx, useState, useEffect } from 'frontend-hamroun';\r\n\r\nexport default function ErrorPage({ initialState }) {\r\n const { error } = initialState || {};\r\n const [showDetails, setShowDetails] = useState(false);\r\n const isDev = process.env.NODE_ENV !== 'production';\r\n \r\n return (\r\n <div className=\"error-page-container max-w-4xl mx-auto p-6\">\r\n <div className=\"bg-red-50 border border-red-200 rounded-lg p-8 shadow-sm\">\r\n <h1 className=\"text-3xl font-bold text-red-700 mb-4\">Something went wrong</h1>\r\n \r\n <p className=\"text-lg text-red-600 mb-4\">\r\n {error?.message || \"An unexpected error occurred\"}\r\n </p>\r\n \r\n {isDev && error?.stack && (\r\n <div className=\"mt-6\">\r\n <button\r\n className=\"text-blue-600 underline mb-2\"\r\n onClick={() => setShowDetails(!showDetails)}\r\n >\r\n {showDetails ? \"Hide\" : \"Show\"} technical details\r\n </button>\r\n \r\n {showDetails && (\r\n <pre className=\"bg-gray-100 p-4 rounded-md text-sm overflow-auto max-h-96 text-gray-800\">\r\n {error.stack}\r\n </pre>\r\n )}\r\n </div>\r\n )}\r\n \r\n <div className=\"mt-6\">\r\n <a \r\n href=\"/\"\r\n className=\"inline-block px-4 py-2 bg-blue-600 text-white rounded-md hover:bg-blue-700\"\r\n >\r\n Back to Home\r\n </a>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n", "import { jsx, Fragment } from 'frontend-hamroun';\nimport { jsx } from 'frontend-hamroun';\r\nimport Layout from '../components/Layout';\r\n\r\nexport default function AboutPage({ initialState }) {\r\n return (\r\n <Layout title=\"About - Frontend Hamroun\">\r\n <div className=\"max-w-4xl mx-auto\">\r\n <h1 className=\"text-3xl font-bold text-blue-600 mb-6\">\r\n About Frontend Hamroun\r\n </h1>\r\n \r\n <div className=\"bg-white shadow-lg rounded-lg p-8 mb-8\">\r\n <h2 className=\"text-xl font-semibold text-gray-800 mb-4\">What is Frontend Hamroun?</h2>\r\n <p className=\"text-gray-600 mb-4\">\r\n Frontend Hamroun is a lightweight JavaScript framework for building modern web applications.\r\n It provides a familiar component-based architecture with hooks, JSX support, and \r\n server-side rendering capabilities.\r\n </p>\r\n <p className=\"text-gray-600 mb-4\">\r\n This framework is designed to be simple yet powerful, offering the essential features\r\n needed for web application development without the complexity of larger frameworks.\r\n </p>\r\n \r\n <h3 className=\"text-lg font-medium text-gray-700 mt-6 mb-2\">Key Features:</h3>\r\n <ul className=\"list-disc pl-6 text-gray-600 space-y-2\">\r\n <li>Component-based architecture</li>\r\n <li>JSX support</li>\r\n <li>Hooks for state and effects</li>\r\n <li>Server-side rendering</li>\r\n <li>Minimal API surface</li>\r\n <li>File-based routing</li>\r\n <li>Built-in API routes</li>\r\n </ul>\r\n </div>\r\n \r\n <div className=\"bg-white shadow-lg rounded-lg p-8\">\r\n <h2 className=\"text-xl font-semibold text-gray-800 mb-4\">Getting Started</h2>\r\n <p className=\"text-gray-600 mb-4\">\r\n This application was created using the Frontend Hamroun fullstack template,\r\n which provides a complete setup for building applications with server-side rendering,\r\n API routes, and client-side navigation.\r\n </p>\r\n \r\n <div className=\"bg-gray-50 p-4 rounded-md mt-4\">\r\n <h3 className=\"text-md font-medium text-gray-700 mb-2\">Quick Start:</h3>\r\n <pre className=\"bg-gray-800 text-gray-100 p-4 rounded overflow-x-auto\">\r\n <code>{`# Create a new application\r\nnpx frontend-hamroun create my-app\r\n\r\n# Change directory\r\ncd my-app\r\n\r\n# Start the development server\r\nnpm run dev`}</code>\r\n </pre>\r\n </div>\r\n </div>\r\n </div>\r\n </Layout>\r\n );\r\n}\r\n\r\n// Server-side data fetching\r\nexport async function getServerSideProps() {\r\n return {\r\n props: {\r\n pageTitle: 'About Frontend Hamroun',\r\n description: 'Learn more about the Frontend Hamroun framework'\r\n }\r\n };\r\n}\r\n", "import { jsx, Fragment } from 'frontend-hamroun';\nimport { jsx } from 'frontend-hamroun';\r\nimport Layout from '../../components/Layout';\r\n\r\nconst AboutPage = ({ initialState }) => {\r\n return (\r\n <Layout title=\"About This App\">\r\n <div className=\"max-w-4xl mx-auto bg-white shadow-lg rounded-lg overflow-hidden\">\r\n <div className=\"p-8\">\r\n <p className=\"text-lg text-gray-700 mb-6\">\r\n This is a frontend application built with Frontend Hamroun framework and styled with Tailwind CSS.\r\n </p>\r\n <p className=\"text-gray-600 mb-8\">\r\n It features server-side rendering, client-side navigation, and websocket-based live reloading during development.\r\n </p>\r\n \r\n <div className=\"bg-gray-50 p-6 rounded-lg border border-gray-200 mb-8\">\r\n <h2 className=\"text-xl font-semibold text-gray-800 mb-4\">Key Features</h2>\r\n <ul className=\"space-y-2 text-gray-700\">\r\n <li className=\"flex items-center\">\r\n <svg className=\"w-5 h-5 text-green-500 mr-2\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth=\"2\" d=\"M5 13l4 4L19 7\"></path>\r\n </svg>\r\n Server-side rendering\r\n </li>\r\n <li className=\"flex items-center\">\r\n <svg className=\"w-5 h-5 text-green-500 mr-2\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth=\"2\" d=\"M5 13l4 4L19 7\"></path>\r\n </svg>\r\n Client-side navigation\r\n </li>\r\n <li className=\"flex items-center\">\r\n <svg className=\"w-5 h-5 text-green-500 mr-2\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth=\"2\" d=\"M5 13l4 4L19 7\"></path>\r\n </svg>\r\n Component-based architecture\r\n </li>\r\n <li className=\"flex items-center\">\r\n <svg className=\"w-5 h-5 text-green-500 mr-2\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth=\"2\" d=\"M5 13l4 4L19 7\"></path>\r\n </svg>\r\n Integrated API backend\r\n </li>\r\n <li className=\"flex items-center\">\r\n <svg className=\"w-5 h-5 text-green-500 mr-2\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth=\"2\" d=\"M5 13l4 4L19 7\"></path>\r\n </svg>\r\n Live reload during development\r\n </li>\r\n <li className=\"flex items-center\">\r\n <svg className=\"w-5 h-5 text-green-500 mr-2\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth=\"2\" d=\"M5 13l4 4L19 7\"></path>\r\n </svg>\r\n Tailwind CSS for styling\r\n </li>\r\n </ul>\r\n </div>\r\n \r\n <a href=\"/\" className=\"inline-block px-6 py-3 bg-blue-600 text-white font-medium rounded-lg hover:bg-blue-700 transition-colors\">\r\n Back to Home\r\n </a>\r\n </div>\r\n </div>\r\n </Layout>\r\n );\r\n};\r\n\r\nexport default AboutPage;\r\n", "import { jsx, Fragment } from 'frontend-hamroun';\nimport { jsx } from 'frontend-hamroun';\r\n\r\ninterface User {\r\n id: number;\r\n name: string;\r\n email: string;\r\n}\r\n\r\ninterface UserListProps {\r\n users: User[];\r\n}\r\n\r\nexport default function UserList({ users }: UserListProps) {\r\n if (!users || users.length === 0) {\r\n return (\r\n <div className=\"empty-state p-4 text-center bg-gray-50 rounded\">\r\n <p className=\"text-gray-500\">No users available</p>\r\n </div>\r\n );\r\n }\r\n \r\n return (\r\n <div className=\"user-list\">\r\n <ul className=\"divide-y divide-gray-100\">\r\n {users.map(user => (\r\n <li key={user.id} className=\"py-3\">\r\n <div className=\"flex justify-between\">\r\n <div>\r\n <p className=\"font-medium text-gray-900\">{user.name}</p>\r\n <p className=\"text-sm text-gray-500\">{user.email}</p>\r\n </div>\r\n <a \r\n href={`/users/${user.id}`}\r\n className=\"text-blue-600 hover:underline text-sm self-center\"\r\n >\r\n View Profile\r\n </a>\r\n </div>\r\n </li>\r\n ))}\r\n </ul>\r\n </div>\r\n );\r\n}\r\n", "import { jsx, Fragment } from 'frontend-hamroun';\nimport { jsx, useState, useEffect, useMemo } from 'frontend-hamroun';\r\n\r\n// Define our state types for better type safety\r\ninterface CounterState {\r\n count: number;\r\n lastUpdated: string | null;\r\n history: number[];\r\n}\r\n\r\nexport default function StateDemo() {\r\n // More comprehensive state with history tracking\r\n const [state, setState] = useState<CounterState>({\r\n count: 0,\r\n lastUpdated: null,\r\n history: []\r\n });\r\n \r\n // Track UI state separately\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [showHistory, setShowHistory] = useState(false);\r\n \r\n // Check for server-side rendering\r\n const isSSR = typeof window === 'undefined';\r\n \r\n // Calculate derived state with useMemo for performance\r\n const stats = useMemo(() => {\r\n // Ensure we have a valid history array\r\n if (isSSR || !state || !state.history || state.history.length === 0) {\r\n return { avg: 0, max: 0, min: 0 };\r\n }\r\n \r\n try {\r\n const sum = state.history.reduce((a, b) => a + b, 0);\r\n return {\r\n avg: parseFloat((sum / state.history.length).toFixed(1)),\r\n max: Math.max(...state.history),\r\n min: Math.min(...state.history)\r\n };\r\n } catch (error) {\r\n console.error('Error calculating stats:', error);\r\n return { avg: 0, max: 0, min: 0 };\r\n }\r\n }, [state?.history]);\r\n \r\n // Handle increment with history tracking\r\n const increment = () => {\r\n if (isSSR) return;\r\n \r\n setIsLoading(true);\r\n \r\n // Simulate async operation\r\n setTimeout(() => {\r\n setState(prevState => ({\r\n count: prevState.count + 1,\r\n lastUpdated: new Date().toLocaleTimeString(),\r\n history: [...(prevState.history || []), prevState.count + 1]\r\n }));\r\n setIsLoading(false);\r\n }, 300);\r\n };\r\n \r\n // Handle decrement with bounds checking\r\n const decrement = () => {\r\n if (isSSR) return;\r\n \r\n setIsLoading(true);\r\n \r\n // Simulate async operation\r\n setTimeout(() => {\r\n setState(prevState => ({\r\n count: Math.max(0, prevState.count - 1),\r\n lastUpdated: new Date().toLocaleTimeString(),\r\n history: prevState.count > 0 ? [...(prevState.history || []), prevState.count - 1] : (prevState.history || [])\r\n }));\r\n setIsLoading(false);\r\n }, 300);\r\n };\r\n \r\n // Reset counter\r\n const reset = () => {\r\n if (isSSR) return;\r\n \r\n setState({\r\n count: 0,\r\n lastUpdated: new Date().toLocaleTimeString(),\r\n history: []\r\n });\r\n };\r\n \r\n // Toggle history visibility\r\n const toggleHistory = () => {\r\n if (isSSR) return;\r\n \r\n setShowHistory(prev => !prev);\r\n };\r\n \r\n // For SSR, return a simpler version of the component\r\n if (isSSR) {\r\n return (\r\n <div className=\"bg-white shadow-lg rounded-lg p-6 mb-8\">\r\n <h2 className=\"text-xl font-semibold text-gray-800 mb-4\">\r\n State Management Demo\r\n </h2>\r\n <div className=\"flex items-center justify-between mb-4\">\r\n <button className=\"px-4 py-2 bg-gray-200 text-gray-800 rounded-lg\">-</button>\r\n <span className=\"text-2xl font-bold mx-4\">0</span>\r\n <button className=\"px-4 py-2 bg-blue-600 text-white rounded-lg\">+</button>\r\n </div>\r\n <p className=\"text-sm text-gray-500\">Interactive counter (client-side only)</p>\r\n </div>\r\n );\r\n }\r\n \r\n // Regular client-side render\r\n return (\r\n <div className=\"bg-white shadow-lg rounded-lg p-6 mb-8\">\r\n <h2 className=\"text-xl font-semibold text-gray-800 mb-4\">\r\n State Management Demo\r\n </h2>\r\n \r\n <div className=\"mb-6\">\r\n <div className=\"flex items-center justify-between mb-4\">\r\n <button \r\n onClick={decrement}\r\n className=\"px-4 py-2 bg-gray-200 text-gray-800 rounded-lg hover:bg-gray-300 disabled:opacity-50\"\r\n disabled={state.count === 0 || isLoading}\r\n >\r\n {isLoading ? '...' : '-'}\r\n </button>\r\n \r\n <span className=\"text-2xl font-bold mx-4\">{state.count}</span>\r\n \r\n <button \r\n onClick={increment}\r\n className=\"px-4 py-2 bg-blue-600 text-white rounded-lg hover:bg-blue-700 disabled:opacity-50\"\r\n disabled={isLoading}\r\n >\r\n {isLoading ? '...' : '+'}\r\n </button>\r\n </div>\r\n \r\n <button\r\n onClick={reset}\r\n className=\"text-sm text-gray-600 hover:text-red-600\"\r\n disabled={state.count === 0 && (!state.history || state.history.length === 0)}\r\n >\r\n Reset Counter\r\n </button>\r\n </div>\r\n \r\n {state.lastUpdated && (\r\n <div className=\"mb-4\">\r\n <p className=\"text-sm text-gray-500\">\r\n Last updated: {state.lastUpdated}\r\n </p>\r\n </div>\r\n )}\r\n \r\n {state.history && state.history.length > 0 && (\r\n <div className=\"border-t pt-4 mt-4\">\r\n <div className=\"flex items-center justify-between mb-2\">\r\n <h3 className=\"text-md font-medium text-gray-700\">Statistics</h3>\r\n <button\r\n onClick={toggleHistory}\r\n className=\"text-sm text-blue-600 hover:underline\"\r\n >\r\n {showHistory ? 'Hide History' : 'Show History'}\r\n </button>\r\n </div>\r\n \r\n <div className=\"grid grid-cols-3 gap-2 mb-3\">\r\n <div className=\"bg-blue-50 p-2 rounded text-center\">\r\n <div className=\"text-xs text-gray-500\">Average</div>\r\n <div className=\"font-bold\">{stats.avg}</div>\r\n </div>\r\n <div className=\"bg-green-50 p-2 rounded text-center\">\r\n <div className=\"text-xs text-gray-500\">Maximum</div>\r\n <div className=\"font-bold\">{stats.max}</div>\r\n </div>\r\n <div className=\"bg-red-50 p-2 rounded text-center\">\r\n <div className=\"text-xs text-gray-500\">Minimum</div>\r\n <div className=\"font-bold\">{stats.min}</div>\r\n </div>\r\n </div>\r\n \r\n {showHistory && (\r\n <div className=\"mt-3\">\r\n <h4 className=\"text-sm font-medium text-gray-600 mb-1\">\r\n History ({state.history.length} events)\r\n </h4>\r\n <div className=\"bg-gray-50 p-2 rounded max-h-24 overflow-y-auto text-xs\">\r\n {state.history.map((value, index) => (\r\n <span \r\n key={index} \r\n className=\"inline-block bg-gray-200 rounded px-2 py-1 m-1\"\r\n >\r\n {value}\r\n </span>\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n", "import { jsx, Fragment } from 'frontend-hamroun';\nimport { jsx, useState, useEffect, useErrorBoundary } from 'frontend-hamroun';\r\n\r\ninterface ErrorBoundaryProps {\r\n children: any;\r\n fallback?: (error: Error, reset: () => void) => any;\r\n}\r\n\r\nexport function ErrorBoundary({ children, fallback }: ErrorBoundaryProps) {\r\n const [error, resetError] = useErrorBoundary();\r\n \r\n if (error) {\r\n if (fallback) {\r\n return fallback(error, resetError);\r\n }\r\n \r\n return (\r\n <div className=\"error-boundary p-4 border border-red-500 rounded bg-red-50\">\r\n <h3 className=\"text-lg font-medium text-red-800 mb-2\">Something went wrong</h3>\r\n <p className=\"text-red-600 mb-2\">{error.message}</p>\r\n <button\r\n onClick={resetError}\r\n className=\"px-3 py-1 bg-red-600 text-white rounded hover:bg-red-700\"\r\n >\r\n Try again\r\n </button>\r\n {process.env.NODE_ENV !== 'production' && (\r\n <pre className=\"mt-3 text-xs overflow-auto p-2 bg-gray-100\">\r\n {error.stack}\r\n </pre>\r\n )}\r\n </div>\r\n );\r\n }\r\n \r\n return children;\r\n}\r\n", "/**\r\n * API utilities for making requests to the backend\r\n */\r\nimport { batchUpdates } from 'frontend-hamroun';\r\n\r\n// Cache for API responses\r\nconst apiCache = new Map<string, { data: any, timestamp: number }>();\r\nconst CACHE_DURATION = 60000; // 1 minute cache\r\n\r\n/**\r\n * Fetch data from the API with caching\r\n */\r\nexport async function fetchApi(\r\n endpoint: string, \r\n options: RequestInit & { \r\n useCache?: boolean,\r\n forceFresh?: boolean \r\n } = {}\r\n): Promise<any> {\r\n const url = endpoint.startsWith('/') ? `/api${endpoint}` : `/api/${endpoint}`;\r\n const { useCache = true, forceFresh = false, ...fetchOptions } = options;\r\n \r\n // Check cache first if enabled\r\n if (useCache && !forceFresh) {\r\n const cached = apiCache.get(url);\r\n if (cached && Date.now() - cached.timestamp < CACHE_DURATION) {\r\n console.log(`[API] Using cached data for: ${url}`);\r\n return cached.data;\r\n }\r\n }\r\n \r\n try {\r\n console.log(`[API] Fetching data from: ${url}`);\r\n const response = await fetch(url, {\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'Accept': 'application/json',\r\n },\r\n ...fetchOptions\r\n });\r\n \r\n if (!response.ok) {\r\n throw new Error(`API request failed: ${response.status} ${response.statusText}`);\r\n }\r\n \r\n const data = await response.json();\r\n console.log(`[API] Successfully fetched data from: ${url}`);\r\n \r\n // Cache the response if caching is enabled\r\n if (useCache) {\r\n apiCache.set(url, { data, timestamp: Date.now() });\r\n }\r\n \r\n return data;\r\n } catch (error) {\r\n console.error(`[API] Error fetching from ${url}:`, error);\r\n throw error;\r\n }\r\n}\r\n\r\n/**\r\n * Clear the API cache\r\n */\r\nexport function clearApiCache(endpoint?: string): void {\r\n if (endpoint) {\r\n const url = endpoint.startsWith('/') ? `/api${endpoint}` : `/api/${endpoint}`;\r\n apiCache.delete(url);\r\n } else {\r\n apiCache.clear();\r\n }\r\n}\r\n\r\n// Sample data for development\r\nconst sampleUsers = [\r\n { id: 1, name: 'User 1', email: 'user1@example.com' },\r\n { id: 2, name: 'User 2', email: 'user2@example.com' },\r\n { id: 3, name: 'User 3', email: 'user3@example.com' }\r\n];\r\n\r\nconst samplePosts = [\r\n { id: 1, title: 'Post 1', content: 'Content for post 1', authorId: 1 },\r\n { id: 2, title: 'Post 2', content: 'Content for post 2', authorId: 2 },\r\n { id: 3, title: 'Post 3', content: 'Content for post 3', authorId: 1 }\r\n];\r\n\r\n// Helper to simulate network delay\r\nconst delay = (ms: number) => new Promise(resolve => setTimeout(resolve, ms));\r\n\r\n// User API client\r\nexport const UserApi = {\r\n // Get all users\r\n async getAll() {\r\n try {\r\n // In a real app, we'd fetch from API\r\n // const response = await fetch('/api/users');\r\n // if (!response.ok) throw new Error('Failed to fetch users');\r\n // return await response.json();\r\n \r\n // Simulate API delay\r\n await delay(300);\r\n return [...sampleUsers]; // Return a copy to avoid mutations\r\n } catch (error) {\r\n console.error('Error fetching users:', error);\r\n return [];\r\n }\r\n },\r\n \r\n // Get user by ID\r\n async getById(id: number | string) {\r\n try {\r\n // In a real app, we'd fetch from API\r\n // const response = await fetch(`/api/users/${id}`);\r\n // if (!response.ok) throw new Error('User not found');\r\n // return await response.json();\r\n \r\n // Convert ID to number if it's a string\r\n const userId = typeof id === 'string' ? parseInt(id, 10) : id;\r\n \r\n // Simulate API delay\r\n await delay(200);\r\n \r\n // Find user\r\n const user = sampleUsers.find(u => u.id === userId);\r\n if (!user) throw new Error('User not found');\r\n \r\n return { ...user }; // Return a copy to avoid mutations\r\n } catch (error) {\r\n console.error(`Error fetching user ${id}:`, error);\r\n return null;\r\n }\r\n },\r\n \r\n // Get posts (all or by author)\r\n async getPosts(authorId?: number | string) {\r\n try {\r\n // In a real app, we'd fetch from API\r\n // const url = authorId ? `/api/posts?authorId=${authorId}` : '/api/posts';\r\n // const response = await fetch(url);\r\n // if (!response.ok) throw new Error('Failed to fetch posts');\r\n // return await response.json();\r\n \r\n // Convert authorId to number if it's a string\r\n const userId = authorId ? (typeof authorId === 'string' ? parseInt(authorId, 10) : authorId) : undefined;\r\n \r\n // Simulate API delay\r\n await delay(400);\r\n \r\n // Filter posts if authorId is provided\r\n const posts = userId\r\n ? samplePosts.filter(p => p.authorId === userId)\r\n : samplePosts;\r\n \r\n return [...posts]; // Return a copy to avoid mutations\r\n } catch (error) {\r\n console.error('Error fetching posts:', error);\r\n return [];\r\n }\r\n }\r\n};\r\n\r\n// WASM API service\r\nexport const WasmApi = {\r\n calculate: (operation: 'add' | 'multiply', a: number, b: number) => \r\n fetchApi(`/wasm/calculate?op=${operation}&a=${a}&b=${b}`),\r\n \r\n processJson: (data: any) => fetchApi('/wasm/process-json', {\r\n method: 'POST',\r\n body: JSON.stringify(data),\r\n useCache: false\r\n })\r\n};\r\n\r\n// Batch multiple API calls for efficiency\r\nexport const batchApiCalls = async <T>(\r\n apiFunctions: Array<() => Promise<T>>\r\n): Promise<T[]> => {\r\n const results: T[] = [];\r\n let errors: Error[] = [];\r\n \r\n // Execute all API calls in parallel\r\n const promises = apiFunctions.map(fn => fn());\r\n \r\n try {\r\n const settledResults = await Promise.allSettled(promises);\r\n \r\n // Process results\r\n batchUpdates(() => {\r\n settledResults.forEach(result => {\r\n if (result.status === 'fulfilled') {\r\n results.push(result.value);\r\n } else {\r\n errors.push(result.reason);\r\n }\r\n });\r\n });\r\n \r\n if (errors.length) {\r\n console.error('[API] Some batch API calls failed:', errors);\r\n }\r\n \r\n return results;\r\n } catch (error) {\r\n console.error('[API] Batch API calls failed:', error);\r\n throw error;\r\n }\r\n};\r\n", "import { jsx, Fragment } from 'frontend-hamroun';\nimport { jsx, useState, useEffect, batchUpdates } from 'frontend-hamroun';\r\nimport UserList from '../components/UserList';\r\nimport StateDemo from '../components/StateDemo';\r\nimport { ErrorBoundary } from '../components/ErrorBoundary';\r\nimport { UserApi } from '../data/api';\r\n\r\n// Home Page Component with Server Side Props\r\nexport default function HomePage({ users, posts, initialState }) {\r\n const [state, setState] = useState(initialState || {});\r\n const [refreshTrigger, setRefreshTrigger] = useState(0);\r\n \r\n // Fetch data when refresh is triggered\r\n useEffect(() => {\r\n if (refreshTrigger === 0) return; // Skip initial render\r\n \r\n async function fetchData() {\r\n try {\r\n const [users, posts] = await Promise.all([\r\n UserApi.getAll(),\r\n UserApi.getPosts()\r\n ]);\r\n \r\n // Use batch updates for efficiency\r\n batchUpdates(() => {\r\n setState(prev => ({\r\n ...prev,\r\n data: {\r\n ...prev.data,\r\n users,\r\n posts\r\n },\r\n lastUpdate: new Date().toISOString()\r\n }));\r\n });\r\n } catch (error) {\r\n console.error('Error fetching data:', error);\r\n }\r\n }\r\n \r\n fetchData();\r\n }, [refreshTrigger]);\r\n \r\n const handleRefresh = () => {\r\n setRefreshTrigger(t => t + 1);\r\n };\r\n\r\n return (\r\n <div className=\"max-w-4xl mx-auto py-8\">\r\n <h1 className=\"text-3xl font-bold text-blue-600 mb-6\">\r\n Welcome to your Next-style Frontend Hamroun application!\r\n </h1>\r\n \r\n <div className=\"mb-8\">\r\n <button \r\n className=\"mb-4 px-4 py-2 bg-blue-600 text-white rounded-lg hover:bg-blue-700\"\r\n onClick={handleRefresh}\r\n >\r\n Refresh Data\r\n </button>\r\n \r\n <div className=\"bg-blue-50 p-4 rounded-lg border border-blue-100 mb-6\">\r\n <p className=\"text-blue-700\">\r\n Last updated: {state.lastUpdate || 'Never'} \r\n </p>\r\n </div>\r\n </div>\r\n \r\n <ErrorBoundary>\r\n <div className=\"bg-white shadow-lg rounded-lg p-6 mb-8\">\r\n <h2 className=\"text-xl font-semibold text-gray-800 mb-4\">User List</h2>\r\n <UserList users={users || state.data?.users || []} />\r\n </div>\r\n </ErrorBoundary>\r\n \r\n <ErrorBoundary>\r\n <StateDemo />\r\n </ErrorBoundary>\r\n \r\n <div className=\"bg-gray-50 rounded-lg p-6 border border-gray-200 mt-8\">\r\n <h3 className=\"text-lg font-medium text-gray-700 mb-3\">Application State</h3>\r\n <pre className=\"overflow-auto p-4 bg-gray-100 rounded-md text-sm text-gray-800\">\r\n {JSON.stringify({ users, posts, ...state }, null, 2)}\r\n </pre>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\n// Server-side data fetching (Next.js style)\r\nexport async function getServerSideProps() {\r\n try {\r\n const users = await UserApi.getAll();\r\n const posts = await UserApi.getPosts();\r\n \r\n return {\r\n props: {\r\n users,\r\n posts\r\n }\r\n };\r\n } catch (error) {\r\n console.error('Error fetching initial data:', error);\r\n return {\r\n props: {\r\n users: [],\r\n posts: []\r\n }\r\n };\r\n }\r\n}\r\n", "import { jsx, Fragment } from 'frontend-hamroun';\nimport { jsx } from 'frontend-hamroun';\r\nimport Layout from '../components/Layout';\r\nimport { UserApi } from '../data/api';\r\n\r\nconst UsersPage = ({ initialState }) => {\r\n const users = initialState.data?.users || [];\r\n\r\n return (\r\n <Layout title=\"User Management\">\r\n <div className=\"max-w-4xl mx-auto\">\r\n <div className=\"bg-blue-50 p-6 rounded-lg mb-8 border border-blue-100\">\r\n <h2 className=\"text-xl font-semibold text-blue-800 mb-2\">Data Fetching Demo</h2>\r\n <p className=\"text-blue-700\">This page demonstrates dynamic data fetching with the Users API.</p>\r\n </div>\r\n \r\n <div className=\"bg-white shadow-md rounded-lg overflow-hidden\">\r\n <div className=\"px-6 py-4 border-b border-gray-200\">\r\n <h2 className=\"text-xl font-semibold text-gray-800\">User List</h2>\r\n </div>\r\n \r\n {users.length === 0 ? (\r\n <div className=\"p-6 text-center text-gray-500\">\r\n <p>No users found.</p>\r\n </div>\r\n ) : (\r\n <div className=\"overflow-x-auto\">\r\n <table className=\"w-full\">\r\n <thead>\r\n <tr className=\"bg-gray-50\">\r\n <th className=\"text-left py-3 px-6 font-medium text-gray-600 text-sm uppercase tracking-wider border-b\">ID</th>\r\n <th className=\"text-left py-3 px-6 font-medium text-gray-600 text-sm uppercase tracking-wider border-b\">Name</th>\r\n <th className=\"text-left py-3 px-6 font-medium text-gray-600 text-sm uppercase tracking-wider border-b\">Email</th>\r\n </tr>\r\n </thead>\r\n <tbody className=\"divide-y divide-gray-200\">\r\n {users.map(user => (\r\n <tr key={user.id} className=\"hover:bg-gray-50\">\r\n <td className=\"py-4 px-6 text-sm text-gray-900\">{user.id}</td>\r\n <td className=\"py-4 px-6 text-sm font-medium text-gray-900\">{user.name}</td>\r\n <td className=\"py-4 px-6 text-sm text-gray-500\">{user.email}</td>\r\n </tr>\r\n ))}\r\n </tbody>\r\n </table>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n </Layout>\r\n );\r\n};\r\n\r\n// Static method to fetch initial data for this page\r\nUsersPage.getInitialData = async () => {\r\n return {\r\n users: await UserApi.getAll()\r\n };\r\n};\r\n\r\nexport default UsersPage;\r\n", "import { jsx, Fragment } from 'frontend-hamroun';\nimport { jsx, useState, useEffect } from 'frontend-hamroun';\r\nimport { UserApi } from '../../data/api';\r\n\r\nexport default function UserDetail({ user, posts, initialState }) {\r\n // State for client-side data fetching when needed\r\n const [userData, setUserData] = useState(user);\r\n const [userPosts, setUserPosts] = useState(posts || []);\r\n const [loading, setLoading] = useState(false);\r\n const [error, setError] = useState(null);\r\n \r\n // Get user ID from route params\r\n const { id } = initialState?.params || {};\r\n \r\n // Fetch user data if not provided from server\r\n useEffect(() => {\r\n if (!userData && id) {\r\n setLoading(true);\r\n \r\n Promise.all([\r\n UserApi.getById(id),\r\n UserApi.getPosts(id)\r\n ])\r\n .then(([userData, postsData]) => {\r\n setUserData(userData);\r\n setUserPosts(postsData);\r\n setLoading(false);\r\n })\r\n .catch(err => {\r\n console.error('Error fetching user data:', err);\r\n setError(err.message || 'Failed to load user data');\r\n setLoading(false);\r\n });\r\n }\r\n }, [userData, id]);\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"max-w-4xl mx-auto p-4\">\r\n <div className=\"animate-pulse rounded-md bg-gray-100 p-8\">\r\n <div className=\"h-8 bg-gray-200 rounded w-1/4 mb-4\"></div>\r\n <div className=\"h-4 bg-gray-200 rounded w-1/2 mb-2\"></div>\r\n <div className=\"h-4 bg-gray-200 rounded w-3/4 mb-4\"></div>\r\n <div className=\"h-40 bg-gray-200 rounded mb-4\"></div>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n if (error) {\r\n return (\r\n <div className=\"max-w-4xl mx-auto p-4\">\r\n <div className=\"rounded-md bg-red-50 p-4 border border-red-200\">\r\n <h2 className=\"text-lg font-bold text-red-700\">Error Loading User</h2>\r\n <p className=\"text-red-600\">{error}</p>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n if (!userData) {\r\n return (\r\n <div className=\"max-w-4xl mx-auto p-4\">\r\n <div className=\"rounded-md bg-yellow-50 p-4 border border-yellow-200\">\r\n <h2 className=\"text-lg font-bold text-yellow-700\">User Not Found</h2>\r\n <p className=\"text-yellow-600\">Could not find user with ID: {id}</p>\r\n <a href=\"/users\" className=\"text-blue-600 hover:underline mt-2 block\">\r\n Back to Users List\r\n </a>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"max-w-4xl mx-auto p-4\">\r\n <div className=\"bg-white shadow-lg rounded-lg p-6 mb-6\">\r\n <h1 className=\"text-2xl font-bold text-gray-800 mb-4\">{userData.name}</h1>\r\n <div className=\"user-info mb-6\">\r\n <p className=\"text-gray-600\">\r\n <span className=\"font-bold\">ID:</span> {userData.id}\r\n </p>\r\n <p className=\"text-gray-600\">\r\n <span className=\"font-bold\">Email:</span> {userData.email}\r\n </p>\r\n </div>\r\n \r\n <a href=\"/users\" className=\"text-blue-600 hover:underline\">\r\n Back to Users List\r\n </a>\r\n </div>\r\n \r\n {userPosts && userPosts.length > 0 ? (\r\n <div className=\"bg-white shadow-lg rounded-lg p-6\">\r\n <h2 className=\"text-xl font-bold text-gray-800 mb-4\">Posts by {userData.name}</h2>\r\n <div className=\"space-y-4\">\r\n {userPosts.map(post => (\r\n <div key={post.id} className=\"border-b pb-4\">\r\n <h3 className=\"text-lg font-semibold\">{post.title}</h3>\r\n <p className=\"text-gray-600\">{post.content}</p>\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n ) : (\r\n <div className=\"bg-white shadow-lg rounded-lg p-6\">\r\n <h2 className=\"text-xl font-bold text-gray-800 mb-4\">Posts by {userData.name}</h2>\r\n <p className=\"text-gray-500 italic\">No posts found for this user.</p>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n// Next.js style server-side data fetching\r\nexport async function getServerSideProps({ params }) {\r\n try {\r\n const userId = params.id;\r\n \r\n // Parallel data fetching\r\n const [user, posts] = await Promise.all([\r\n UserApi.getById(parseInt(userId)),\r\n UserApi.getPosts(parseInt(userId))\r\n ]);\r\n \r\n // Handle user not found\r\n if (!user) {\r\n return {\r\n notFound: true\r\n };\r\n }\r\n \r\n return {\r\n props: {\r\n user,\r\n posts\r\n }\r\n };\r\n } catch (error) {\r\n console.error(`Error fetching user ${params.id}:`, error);\r\n \r\n // Pass the error for client-side handling\r\n return {\r\n props: {\r\n error: {\r\n message: error.message,\r\n status: error.status || 500\r\n },\r\n user: null,\r\n posts: []\r\n }\r\n };\r\n }\r\n}\r\n", "import { jsx, Fragment } from 'frontend-hamroun';\n// This file will be removed as it contains WASM functionality\r\n", "import { jsx, Fragment } from 'frontend-hamroun';\nimport { render, hydrate, jsx } from 'frontend-hamroun';\r\n// Import Tailwind CSS\r\nimport './styles.css';\r\n\r\n// Type declaration for window.__INITIAL_STATE__\r\ndeclare global {\r\n interface Window {\r\n __INITIAL_STATE__?: any;\r\n }\r\n}\r\n\r\n// Get initial state from server\r\nconst initialState = window.__INITIAL_STATE__ || {\r\n route: window.location.pathname,\r\n timestamp: new Date().toISOString(),\r\n serverRendered: false,\r\n data: {\r\n users: null,\r\n posts: null\r\n }\r\n};\r\n\r\nconsole.log('[Client] Initial state:', initialState);\r\n\r\n// Create a mutable variable for hydration state\r\nlet isHydrating = document.getElementById('root')?.innerHTML.trim() !== '';\r\n\r\n// Function to handle navigation\r\nasync function handleRouteChange(path: string, isPushState = true) {\r\n try {\r\n console.log(`[Router] Navigating to: ${path}`);\r\n \r\n // Update URL if needed\r\n if (isPushState) {\r\n window.history.pushState(null, '', path);\r\n }\r\n \r\n // Dynamically load the page component based on the path\r\n const normalizedPath = path === '/' ? 'index' : path.replace(/^\\//, '');\r\n \r\n let Page;\r\n try {\r\n // Dynamic import for the page component\r\n const module = await import(`./pages/${normalizedPath}.tsx`);\r\n Page = module.default;\r\n } catch (error) {\r\n console.warn(`[Router] Could not load page for ${path}, trying index file`);\r\n try {\r\n // Try loading index file in directory\r\n const module = await import(`./pages/${normalizedPath}/index.tsx`);\r\n Page = module.default;\r\n } catch (innerError) {\r\n console.error(`[Router] Failed to load page component for ${path}`);\r\n \r\n // Try to load 404 page\r\n try {\r\n const notFoundModule = await import(`./pages/404.tsx`);\r\n Page = notFoundModule.default;\r\n } catch (notFoundError) {\r\n // If all fails, render a simple not found message\r\n const rootElement = document.getElementById('root');\r\n if (rootElement) {\r\n render(\r\n <div style={{ padding: '20px', maxWidth: '800px', margin: '0 auto' }}>\r\n <h1>Page Not Found</h1>\r\n <p>The page you requested could not be found.</p>\r\n <a href=\"/\" style={{ color: '#0066cc' }}>Go to Home</a>\r\n </div>,\r\n rootElement\r\n );\r\n }\r\n return;\r\n }\r\n }\r\n }\r\n \r\n // Get the current page props\r\n let pageProps = initialState.pageProps || {};\r\n \r\n // If the page defines getServerSideProps, fetch data\r\n if (Page.getServerSideProps) {\r\n try {\r\n const response = await fetch(`/api/__props${path}`);\r\n if (response.ok) {\r\n const data = await response.json();\r\n pageProps = data.props || {};\r\n }\r\n } catch (error) {\r\n console.error('[Router] Error fetching page props:', error);\r\n }\r\n }\r\n \r\n // Update the state with current route\r\n const updatedState = {\r\n ...initialState,\r\n route: path,\r\n pageProps\r\n };\r\n \r\n // Render the page\r\n const rootElement = document.getElementById('root');\r\n if (!rootElement) return;\r\n \r\n if (isHydrating && path === initialState.route) {\r\n console.log('[Client] Hydrating server-rendered content');\r\n hydrate(<Page {...pageProps} initialState={updatedState} />, rootElement);\r\n isHydrating = false;\r\n } else {\r\n console.log('[Client] Rendering client-side');\r\n render(<Page {...pageProps} initialState={updatedState} />, rootElement);\r\n }\r\n } catch (error) {\r\n console.error('[Router] Navigation error:', error);\r\n }\r\n}\r\n\r\n// Handle initial route\r\nhandleRouteChange(window.location.pathname, false);\r\n\r\n// Handle client-side navigation\r\ndocument.addEventListener('click', (e) => {\r\n let target = e.target as HTMLElement | null;\r\n \r\n // Find closest anchor element\r\n while (target && target.tagName !== 'A') {\r\n target = target.parentElement;\r\n if (!target) break;\r\n }\r\n \r\n if (target && \r\n target.tagName === 'A' && \r\n target.getAttribute('href') && \r\n target.getAttribute('href')?.startsWith('/') && \r\n !target.getAttribute('href')?.startsWith('//') && \r\n !target.getAttribute('target')) {\r\n \r\n e.preventDefault();\r\n const href = target.getAttribute('href') || '/';\r\n handleRouteChange(href);\r\n }\r\n});\r\n\r\n// Handle back/forward navigation\r\nwindow.addEventListener('popstate', () => {\r\n handleRouteChange(window.location.pathname, false);\r\n});\r\n\r\n// Set up socket.io for live reload in development\r\nif (typeof io !== 'undefined') {\r\n const socket = io();\r\n socket.on('reload', () => {\r\n console.log('[Dev] Reloading page due to file changes');\r\n window.location.reload();\r\n });\r\n}\r\n"],
|
5
|
-
"mappings": "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",
|
6
|
-
"names": ["index", "state", "setState", "initialState", "initialState", "initialState", "initialState", "about_exports", "AboutPage", "init_about", "initialState", "getServerSideProps", "initialState", "users", "posts", "initialState", "id_exports", "getServerSideProps", "initialState", "userData", "init_id", "isHydrating", "rootElement"]
|
7
|
-
}
|
1
|
+
{
|
2
|
+
"version": 3,
|
3
|
+
"sources": ["../node_modules/frontend-hamroun/src/jsx-runtime.ts", "../node_modules/frontend-hamroun/src/batch.ts", "../node_modules/frontend-hamroun/src/hooks.ts", "../node_modules/frontend-hamroun/src/server-renderer.ts", "../node_modules/frontend-hamroun/src/context.ts", "../node_modules/frontend-hamroun/src/renderer.ts", "../src/pages/404.tsx", "../src/pages/[id].tsx", "../src/components/Layout.tsx", "../src/pages/_app.tsx", "../src/pages/_document.tsx", "../src/pages/_error.tsx", "../src/pages/about.tsx", "../src/pages/about/index.tsx", "../src/components/UserList.tsx", "../src/components/StateDemo.tsx", "../src/components/ErrorBoundary.tsx", "../src/data/api.ts", "../src/pages/index.tsx", "../src/pages/users.tsx", "../src/pages/users/[id].tsx", "../src/pages/wasm-demo.tsx", "../src/main.tsx"],
|
4
|
+
"sourcesContent": ["import type { Component } from './component.js';\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", "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.js';\r\nimport { batchUpdates, isBatching } from './batch.js';\r\nimport { diff } from './vdom.js';\r\nimport { createContext, useContext } from './context.js';\r\n\r\n// Current render ID counter\r\nlet currentRender = 0;\r\n\r\n// State storage\r\nconst states = new Map<number, any[]>();\r\nconst stateIndices = new Map<number, number>();\r\nconst effects = new Map<number, any[]>();\r\nconst memos = new Map<number, any[]>();\r\nconst refs = new Map<number, any[]>();\r\n\r\n// Server-side rendering detection\r\nconst isServer = typeof window === 'undefined';\r\nconst serverStates = new Map<number, Map<number, any>>();\r\n\r\n// Rendering callbacks\r\nlet globalRenderCallback: any = null;\r\nlet globalContainer: any = null;\r\nlet currentElement: any = null;\r\n\r\nexport function setRenderCallback(callback: any, element: any, container: any): void {\r\n globalRenderCallback = callback;\r\n globalContainer = container;\r\n currentElement = element;\r\n}\r\n\r\nexport function prepareRender(): number {\r\n currentRender++;\r\n stateIndices.set(currentRender, 0);\r\n return currentRender;\r\n}\r\n\r\nexport function finishRender(): void {\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, (newValue: 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 // Handle server-side rendering separately\r\n if (isServer) {\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 // In SSR, setState is a no-op\r\n const setState = (_newValue: T | ((prev: T) => T)) => {};\r\n \r\n stateIndices.set(currentRender, index + 1);\r\n return [state, setState];\r\n }\r\n\r\n // Client-side implementation\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) || 0;\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 \r\n const setState = (newValue: T | ((prev: T) => T)) => {\r\n const nextValue = typeof newValue === 'function'\r\n ? (newValue as ((prev: T) => T))(componentStates[index])\r\n : newValue;\r\n \r\n if (componentStates[index] === nextValue) return;\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[]): void {\r\n if (!currentRender) throw new Error(\"useEffect must be called within a render\");\r\n\r\n // Skip effects on server\r\n if (isServer) {\r\n const effectIndex = stateIndices.get(currentRender) || 0;\r\n stateIndices.set(currentRender, effectIndex + 1);\r\n return;\r\n }\r\n\r\n const effectIndex = stateIndices.get(currentRender) || 0;\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 if (!prevEffect || !deps || !prevEffect.deps || deps.some((dep, i) => dep !== prevEffect.deps[i])) {\r\n if (prevEffect?.cleanup) {\r\n prevEffect.cleanup();\r\n }\r\n \r\n // Schedule effect execution after render is complete\r\n queueMicrotask(() => {\r\n const cleanup = callback() || undefined;\r\n componentEffects[effectIndex] = { cleanup, deps: 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) || 0;\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: 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): { current: T } {\r\n if (!currentRender) throw new Error(\"useRef must be called within a render\");\r\n \r\n const refIndex = stateIndices.get(currentRender) || 0;\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 \r\n if (refIndex >= componentRefs.length) {\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\nasync function rerender(rendererId: number): Promise<void> {\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 // Trigger re-render\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\nexport function useErrorBoundary() {\r\n const [error, setError] = useState(null);\r\n return [error, () => setError(null)];\r\n}\r\n\r\n// Re-export from context to match index.js\r\nexport { createContext, useContext };\r\n", "import { VNode } from './types.js';\r\nimport { prepareRender, finishRender } from './hooks.js';\r\n\r\ntype Component = (props: any) => any;\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", "\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 { createElement } from './jsx-runtime.js';\r\nimport { prepareRender, finishRender, setRenderCallback } from './hooks.js';\r\nimport { batchUpdates } from './batch.js';\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 { jsx, Fragment } from 'frontend-hamroun';\nimport { jsx } from 'frontend-hamroun';\r\n\r\nexport default function NotFound({ initialState }) {\r\n return (\r\n <div className=\"not-found-container max-w-4xl mx-auto p-6\">\r\n <div className=\"bg-gray-50 border border-gray-200 rounded-lg p-8 shadow-sm\">\r\n <h1 className=\"text-3xl font-bold text-gray-700 mb-4\">Page Not Found</h1>\r\n \r\n <p className=\"text-lg text-gray-600 mb-4\">\r\n The page you are looking for does not exist or has been moved.\r\n </p>\r\n \r\n <p className=\"text-gray-600 mb-6\">\r\n Path: <code className=\"bg-gray-100 px-2 py-1 rounded\">{initialState?.route || 'unknown'}</code>\r\n </p>\r\n \r\n <div className=\"mt-6\">\r\n <a \r\n href=\"/\"\r\n className=\"inline-block px-4 py-2 bg-blue-600 text-white rounded-md hover:bg-blue-700\"\r\n >\r\n Back to Home\r\n </a>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n", "import { jsx, Fragment } from 'frontend-hamroun';\n", "import { jsx, Fragment } from 'frontend-hamroun';\nimport { jsx } from 'frontend-hamroun';\r\n\r\ninterface LayoutProps {\r\n children: any;\r\n title?: string;\r\n}\r\n\r\nexport default function Layout({ children, title = 'Frontend Hamroun App' }: LayoutProps) {\r\n return (\r\n <div className=\"min-h-screen flex flex-col bg-gray-50\">\r\n <header className=\"bg-blue-600 text-white\">\r\n <div className=\"container mx-auto px-4 py-4 flex justify-between items-center\">\r\n <h1 className=\"text-xl font-bold\">\r\n <a href=\"/\" className=\"hover:text-blue-100\">\r\n {title}\r\n </a>\r\n </h1>\r\n \r\n <nav>\r\n <ul className=\"flex space-x-6\">\r\n <li><a href=\"/\" className=\"hover:text-blue-100\">Home</a></li>\r\n <li><a href=\"/about\" className=\"hover:text-blue-100\">About</a></li>\r\n {/* WASM demo link removed */}\r\n </ul>\r\n </nav>\r\n </div>\r\n </header>\r\n \r\n <main className=\"flex-grow container mx-auto px-4 py-8\">\r\n {children}\r\n </main>\r\n \r\n <footer className=\"bg-gray-800 text-white\">\r\n <div className=\"container mx-auto px-4 py-6\">\r\n <p className=\"text-center text-gray-400\">\r\n © {new Date().getFullYear()} Frontend Hamroun App. All rights reserved.\r\n </p>\r\n </div>\r\n </footer>\r\n </div>\r\n );\r\n}\r\n", "import { jsx, Fragment } from 'frontend-hamroun';\nimport { jsx } from 'frontend-hamroun';\r\nimport Layout from '../components/Layout';\r\n\r\n// This is the main App wrapper component similar to Next.js _app.js\r\nexport default function App({ Component, pageProps, initialState }) {\r\n return (\r\n <Layout>\r\n <Component {...pageProps} initialState={initialState} />\r\n </Layout>\r\n );\r\n}\r\n", "import { jsx, Fragment } from 'frontend-hamroun';\nimport { jsx } from 'frontend-hamroun';\r\n\r\nexport default function Document({ \r\n title = 'Frontend Hamroun App',\r\n headContent,\r\n bodyContent,\r\n scripts\r\n}) {\r\n return (\r\n <html lang=\"en\">\r\n <head>\r\n <meta charSet=\"UTF-8\" />\r\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\r\n <title>{title}</title>\r\n <link rel=\"stylesheet\" href=\"/styles.css\" />\r\n {headContent}\r\n </head>\r\n <body>\r\n <div id=\"root\">{bodyContent}</div>\r\n <script src=\"/build/main.js\" type=\"module\"></script>\r\n {scripts}\r\n </body>\r\n </html>\r\n );\r\n}\r\n", "import { jsx, Fragment } from 'frontend-hamroun';\nimport { jsx, useState, useEffect } from 'frontend-hamroun';\r\n\r\nexport default function ErrorPage({ initialState }) {\r\n const { error } = initialState || {};\r\n const [showDetails, setShowDetails] = useState(false);\r\n const isDev = process.env.NODE_ENV !== 'production';\r\n \r\n return (\r\n <div className=\"error-page-container max-w-4xl mx-auto p-6\">\r\n <div className=\"bg-red-50 border border-red-200 rounded-lg p-8 shadow-sm\">\r\n <h1 className=\"text-3xl font-bold text-red-700 mb-4\">Something went wrong</h1>\r\n \r\n <p className=\"text-lg text-red-600 mb-4\">\r\n {error?.message || \"An unexpected error occurred\"}\r\n </p>\r\n \r\n {isDev && error?.stack && (\r\n <div className=\"mt-6\">\r\n <button\r\n className=\"text-blue-600 underline mb-2\"\r\n onClick={() => setShowDetails(!showDetails)}\r\n >\r\n {showDetails ? \"Hide\" : \"Show\"} technical details\r\n </button>\r\n \r\n {showDetails && (\r\n <pre className=\"bg-gray-100 p-4 rounded-md text-sm overflow-auto max-h-96 text-gray-800\">\r\n {error.stack}\r\n </pre>\r\n )}\r\n </div>\r\n )}\r\n \r\n <div className=\"mt-6\">\r\n <a \r\n href=\"/\"\r\n className=\"inline-block px-4 py-2 bg-blue-600 text-white rounded-md hover:bg-blue-700\"\r\n >\r\n Back to Home\r\n </a>\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n", "import { jsx, Fragment } from 'frontend-hamroun';\nimport { jsx } from 'frontend-hamroun';\r\nimport Layout from '../components/Layout';\r\n\r\nexport default function AboutPage({ initialState }) {\r\n return (\r\n <Layout title=\"About - Frontend Hamroun\">\r\n <div className=\"max-w-4xl mx-auto\">\r\n <h1 className=\"text-3xl font-bold text-blue-600 mb-6\">\r\n About Frontend Hamroun\r\n </h1>\r\n \r\n <div className=\"bg-white shadow-lg rounded-lg p-8 mb-8\">\r\n <h2 className=\"text-xl font-semibold text-gray-800 mb-4\">What is Frontend Hamroun?</h2>\r\n <p className=\"text-gray-600 mb-4\">\r\n Frontend Hamroun is a lightweight JavaScript framework for building modern web applications.\r\n It provides a familiar component-based architecture with hooks, JSX support, and \r\n server-side rendering capabilities.\r\n </p>\r\n <p className=\"text-gray-600 mb-4\">\r\n This framework is designed to be simple yet powerful, offering the essential features\r\n needed for web application development without the complexity of larger frameworks.\r\n </p>\r\n \r\n <h3 className=\"text-lg font-medium text-gray-700 mt-6 mb-2\">Key Features:</h3>\r\n <ul className=\"list-disc pl-6 text-gray-600 space-y-2\">\r\n <li>Component-based architecture</li>\r\n <li>JSX support</li>\r\n <li>Hooks for state and effects</li>\r\n <li>Server-side rendering</li>\r\n <li>Minimal API surface</li>\r\n <li>File-based routing</li>\r\n <li>Built-in API routes</li>\r\n </ul>\r\n </div>\r\n \r\n <div className=\"bg-white shadow-lg rounded-lg p-8\">\r\n <h2 className=\"text-xl font-semibold text-gray-800 mb-4\">Getting Started</h2>\r\n <p className=\"text-gray-600 mb-4\">\r\n This application was created using the Frontend Hamroun fullstack template,\r\n which provides a complete setup for building applications with server-side rendering,\r\n API routes, and client-side navigation.\r\n </p>\r\n \r\n <div className=\"bg-gray-50 p-4 rounded-md mt-4\">\r\n <h3 className=\"text-md font-medium text-gray-700 mb-2\">Quick Start:</h3>\r\n <pre className=\"bg-gray-800 text-gray-100 p-4 rounded overflow-x-auto\">\r\n <code>{`# Create a new application\r\nnpx frontend-hamroun create my-app\r\n\r\n# Change directory\r\ncd my-app\r\n\r\n# Start the development server\r\nnpm run dev`}</code>\r\n </pre>\r\n </div>\r\n </div>\r\n </div>\r\n </Layout>\r\n );\r\n}\r\n\r\n// Server-side data fetching\r\nexport async function getServerSideProps() {\r\n return {\r\n props: {\r\n pageTitle: 'About Frontend Hamroun',\r\n description: 'Learn more about the Frontend Hamroun framework'\r\n }\r\n };\r\n}\r\n", "import { jsx, Fragment } from 'frontend-hamroun';\nimport { jsx } from 'frontend-hamroun';\r\nimport Layout from '../../components/Layout';\r\n\r\nconst AboutPage = ({ initialState }) => {\r\n return (\r\n <Layout title=\"About This App\">\r\n <div className=\"max-w-4xl mx-auto bg-white shadow-lg rounded-lg overflow-hidden\">\r\n <div className=\"p-8\">\r\n <p className=\"text-lg text-gray-700 mb-6\">\r\n This is a frontend application built with Frontend Hamroun framework and styled with Tailwind CSS.\r\n </p>\r\n <p className=\"text-gray-600 mb-8\">\r\n It features server-side rendering, client-side navigation, and websocket-based live reloading during development.\r\n </p>\r\n \r\n <div className=\"bg-gray-50 p-6 rounded-lg border border-gray-200 mb-8\">\r\n <h2 className=\"text-xl font-semibold text-gray-800 mb-4\">Key Features</h2>\r\n <ul className=\"space-y-2 text-gray-700\">\r\n <li className=\"flex items-center\">\r\n <svg className=\"w-5 h-5 text-green-500 mr-2\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth=\"2\" d=\"M5 13l4 4L19 7\"></path>\r\n </svg>\r\n Server-side rendering\r\n </li>\r\n <li className=\"flex items-center\">\r\n <svg className=\"w-5 h-5 text-green-500 mr-2\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth=\"2\" d=\"M5 13l4 4L19 7\"></path>\r\n </svg>\r\n Client-side navigation\r\n </li>\r\n <li className=\"flex items-center\">\r\n <svg className=\"w-5 h-5 text-green-500 mr-2\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth=\"2\" d=\"M5 13l4 4L19 7\"></path>\r\n </svg>\r\n Component-based architecture\r\n </li>\r\n <li className=\"flex items-center\">\r\n <svg className=\"w-5 h-5 text-green-500 mr-2\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth=\"2\" d=\"M5 13l4 4L19 7\"></path>\r\n </svg>\r\n Integrated API backend\r\n </li>\r\n <li className=\"flex items-center\">\r\n <svg className=\"w-5 h-5 text-green-500 mr-2\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth=\"2\" d=\"M5 13l4 4L19 7\"></path>\r\n </svg>\r\n Live reload during development\r\n </li>\r\n <li className=\"flex items-center\">\r\n <svg className=\"w-5 h-5 text-green-500 mr-2\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth=\"2\" d=\"M5 13l4 4L19 7\"></path>\r\n </svg>\r\n Tailwind CSS for styling\r\n </li>\r\n </ul>\r\n </div>\r\n \r\n <a href=\"/\" className=\"inline-block px-6 py-3 bg-blue-600 text-white font-medium rounded-lg hover:bg-blue-700 transition-colors\">\r\n Back to Home\r\n </a>\r\n </div>\r\n </div>\r\n </Layout>\r\n );\r\n};\r\n\r\nexport default AboutPage;\r\n", "import { jsx, Fragment } from 'frontend-hamroun';\nimport { jsx } from 'frontend-hamroun';\r\n\r\ninterface User {\r\n id: number;\r\n name: string;\r\n email: string;\r\n}\r\n\r\ninterface UserListProps {\r\n users: User[];\r\n}\r\n\r\nexport default function UserList({ users }: UserListProps) {\r\n if (!users || users.length === 0) {\r\n return (\r\n <div className=\"empty-state p-4 text-center bg-gray-50 rounded\">\r\n <p className=\"text-gray-500\">No users available</p>\r\n </div>\r\n );\r\n }\r\n \r\n return (\r\n <div className=\"user-list\">\r\n <ul className=\"divide-y divide-gray-100\">\r\n {users.map(user => (\r\n <li key={user.id} className=\"py-3\">\r\n <div className=\"flex justify-between\">\r\n <div>\r\n <p className=\"font-medium text-gray-900\">{user.name}</p>\r\n <p className=\"text-sm text-gray-500\">{user.email}</p>\r\n </div>\r\n <a \r\n href={`/users/${user.id}`}\r\n className=\"text-blue-600 hover:underline text-sm self-center\"\r\n >\r\n View Profile\r\n </a>\r\n </div>\r\n </li>\r\n ))}\r\n </ul>\r\n </div>\r\n );\r\n}\r\n", "import { jsx, Fragment } from 'frontend-hamroun';\nimport { jsx, useState, useEffect, useMemo } from 'frontend-hamroun';\r\n\r\n// Define our state types for better type safety\r\ninterface CounterState {\r\n count: number;\r\n lastUpdated: string | null;\r\n history: number[];\r\n}\r\n\r\nexport default function StateDemo() {\r\n // More comprehensive state with history tracking\r\n const [state, setState] = useState<CounterState>({\r\n count: 0,\r\n lastUpdated: null,\r\n history: []\r\n });\r\n \r\n // Track UI state separately\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [showHistory, setShowHistory] = useState(false);\r\n \r\n // Check for server-side rendering\r\n const isSSR = typeof window === 'undefined';\r\n \r\n // Calculate derived state with useMemo for performance\r\n const stats = useMemo(() => {\r\n // Ensure we have a valid history array\r\n if (isSSR || !state || !state.history || state.history.length === 0) {\r\n return { avg: 0, max: 0, min: 0 };\r\n }\r\n \r\n try {\r\n const sum = state.history.reduce((a, b) => a + b, 0);\r\n return {\r\n avg: parseFloat((sum / state.history.length).toFixed(1)),\r\n max: Math.max(...state.history),\r\n min: Math.min(...state.history)\r\n };\r\n } catch (error) {\r\n console.error('Error calculating stats:', error);\r\n return { avg: 0, max: 0, min: 0 };\r\n }\r\n }, [state?.history]);\r\n \r\n // Handle increment with history tracking\r\n const increment = () => {\r\n if (isSSR) return;\r\n \r\n setIsLoading(true);\r\n \r\n // Simulate async operation\r\n setTimeout(() => {\r\n setState(prevState => ({\r\n count: prevState.count + 1,\r\n lastUpdated: new Date().toLocaleTimeString(),\r\n history: [...(prevState.history || []), prevState.count + 1]\r\n }));\r\n setIsLoading(false);\r\n }, 300);\r\n };\r\n \r\n // Handle decrement with bounds checking\r\n const decrement = () => {\r\n if (isSSR) return;\r\n \r\n setIsLoading(true);\r\n \r\n // Simulate async operation\r\n setTimeout(() => {\r\n setState(prevState => ({\r\n count: Math.max(0, prevState.count - 1),\r\n lastUpdated: new Date().toLocaleTimeString(),\r\n history: prevState.count > 0 ? [...(prevState.history || []), prevState.count - 1] : (prevState.history || [])\r\n }));\r\n setIsLoading(false);\r\n }, 300);\r\n };\r\n \r\n // Reset counter\r\n const reset = () => {\r\n if (isSSR) return;\r\n \r\n setState({\r\n count: 0,\r\n lastUpdated: new Date().toLocaleTimeString(),\r\n history: []\r\n });\r\n };\r\n \r\n // Toggle history visibility\r\n const toggleHistory = () => {\r\n if (isSSR) return;\r\n \r\n setShowHistory(prev => !prev);\r\n };\r\n \r\n // For SSR, return a simpler version of the component\r\n if (isSSR) {\r\n return (\r\n <div className=\"bg-white shadow-lg rounded-lg p-6 mb-8\">\r\n <h2 className=\"text-xl font-semibold text-gray-800 mb-4\">\r\n State Management Demo\r\n </h2>\r\n <div className=\"flex items-center justify-between mb-4\">\r\n <button className=\"px-4 py-2 bg-gray-200 text-gray-800 rounded-lg\">-</button>\r\n <span className=\"text-2xl font-bold mx-4\">0</span>\r\n <button className=\"px-4 py-2 bg-blue-600 text-white rounded-lg\">+</button>\r\n </div>\r\n <p className=\"text-sm text-gray-500\">Interactive counter (client-side only)</p>\r\n </div>\r\n );\r\n }\r\n \r\n // Regular client-side render\r\n return (\r\n <div className=\"bg-white shadow-lg rounded-lg p-6 mb-8\">\r\n <h2 className=\"text-xl font-semibold text-gray-800 mb-4\">\r\n State Management Demo\r\n </h2>\r\n \r\n <div className=\"mb-6\">\r\n <div className=\"flex items-center justify-between mb-4\">\r\n <button \r\n onClick={decrement}\r\n className=\"px-4 py-2 bg-gray-200 text-gray-800 rounded-lg hover:bg-gray-300 disabled:opacity-50\"\r\n disabled={state.count === 0 || isLoading}\r\n >\r\n {isLoading ? '...' : '-'}\r\n </button>\r\n \r\n <span className=\"text-2xl font-bold mx-4\">{state.count}</span>\r\n \r\n <button \r\n onClick={increment}\r\n className=\"px-4 py-2 bg-blue-600 text-white rounded-lg hover:bg-blue-700 disabled:opacity-50\"\r\n disabled={isLoading}\r\n >\r\n {isLoading ? '...' : '+'}\r\n </button>\r\n </div>\r\n \r\n <button\r\n onClick={reset}\r\n className=\"text-sm text-gray-600 hover:text-red-600\"\r\n disabled={state.count === 0 && (!state.history || state.history.length === 0)}\r\n >\r\n Reset Counter\r\n </button>\r\n </div>\r\n \r\n {state.lastUpdated && (\r\n <div className=\"mb-4\">\r\n <p className=\"text-sm text-gray-500\">\r\n Last updated: {state.lastUpdated}\r\n </p>\r\n </div>\r\n )}\r\n \r\n {state.history && state.history.length > 0 && (\r\n <div className=\"border-t pt-4 mt-4\">\r\n <div className=\"flex items-center justify-between mb-2\">\r\n <h3 className=\"text-md font-medium text-gray-700\">Statistics</h3>\r\n <button\r\n onClick={toggleHistory}\r\n className=\"text-sm text-blue-600 hover:underline\"\r\n >\r\n {showHistory ? 'Hide History' : 'Show History'}\r\n </button>\r\n </div>\r\n \r\n <div className=\"grid grid-cols-3 gap-2 mb-3\">\r\n <div className=\"bg-blue-50 p-2 rounded text-center\">\r\n <div className=\"text-xs text-gray-500\">Average</div>\r\n <div className=\"font-bold\">{stats.avg}</div>\r\n </div>\r\n <div className=\"bg-green-50 p-2 rounded text-center\">\r\n <div className=\"text-xs text-gray-500\">Maximum</div>\r\n <div className=\"font-bold\">{stats.max}</div>\r\n </div>\r\n <div className=\"bg-red-50 p-2 rounded text-center\">\r\n <div className=\"text-xs text-gray-500\">Minimum</div>\r\n <div className=\"font-bold\">{stats.min}</div>\r\n </div>\r\n </div>\r\n \r\n {showHistory && (\r\n <div className=\"mt-3\">\r\n <h4 className=\"text-sm font-medium text-gray-600 mb-1\">\r\n History ({state.history.length} events)\r\n </h4>\r\n <div className=\"bg-gray-50 p-2 rounded max-h-24 overflow-y-auto text-xs\">\r\n {state.history.map((value, index) => (\r\n <span \r\n key={index} \r\n className=\"inline-block bg-gray-200 rounded px-2 py-1 m-1\"\r\n >\r\n {value}\r\n </span>\r\n ))}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n", "import { jsx, Fragment } from 'frontend-hamroun';\nimport { jsx, useState, useEffect, useErrorBoundary } from 'frontend-hamroun';\r\n\r\ninterface ErrorBoundaryProps {\r\n children: any;\r\n fallback?: (error: Error, reset: () => void) => any;\r\n}\r\n\r\nexport function ErrorBoundary({ children, fallback }: ErrorBoundaryProps) {\r\n const [error, resetError] = useErrorBoundary();\r\n \r\n if (error) {\r\n if (fallback) {\r\n return fallback(error, resetError);\r\n }\r\n \r\n return (\r\n <div className=\"error-boundary p-4 border border-red-500 rounded bg-red-50\">\r\n <h3 className=\"text-lg font-medium text-red-800 mb-2\">Something went wrong</h3>\r\n <p className=\"text-red-600 mb-2\">{error.message}</p>\r\n <button\r\n onClick={resetError}\r\n className=\"px-3 py-1 bg-red-600 text-white rounded hover:bg-red-700\"\r\n >\r\n Try again\r\n </button>\r\n {process.env.NODE_ENV !== 'production' && (\r\n <pre className=\"mt-3 text-xs overflow-auto p-2 bg-gray-100\">\r\n {error.stack}\r\n </pre>\r\n )}\r\n </div>\r\n );\r\n }\r\n \r\n return children;\r\n}\r\n", "/**\r\n * API utilities for making requests to the backend\r\n */\r\nimport { batchUpdates } from 'frontend-hamroun';\r\n\r\n// Cache for API responses\r\nconst apiCache = new Map<string, { data: any, timestamp: number }>();\r\nconst CACHE_DURATION = 60000; // 1 minute cache\r\n\r\n/**\r\n * Fetch data from the API with caching\r\n */\r\nexport async function fetchApi(\r\n endpoint: string, \r\n options: RequestInit & { \r\n useCache?: boolean,\r\n forceFresh?: boolean \r\n } = {}\r\n): Promise<any> {\r\n const url = endpoint.startsWith('/') ? `/api${endpoint}` : `/api/${endpoint}`;\r\n const { useCache = true, forceFresh = false, ...fetchOptions } = options;\r\n \r\n // Check cache first if enabled\r\n if (useCache && !forceFresh) {\r\n const cached = apiCache.get(url);\r\n if (cached && Date.now() - cached.timestamp < CACHE_DURATION) {\r\n console.log(`[API] Using cached data for: ${url}`);\r\n return cached.data;\r\n }\r\n }\r\n \r\n try {\r\n console.log(`[API] Fetching data from: ${url}`);\r\n const response = await fetch(url, {\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'Accept': 'application/json',\r\n },\r\n ...fetchOptions\r\n });\r\n \r\n if (!response.ok) {\r\n throw new Error(`API request failed: ${response.status} ${response.statusText}`);\r\n }\r\n \r\n const data = await response.json();\r\n console.log(`[API] Successfully fetched data from: ${url}`);\r\n \r\n // Cache the response if caching is enabled\r\n if (useCache) {\r\n apiCache.set(url, { data, timestamp: Date.now() });\r\n }\r\n \r\n return data;\r\n } catch (error) {\r\n console.error(`[API] Error fetching from ${url}:`, error);\r\n throw error;\r\n }\r\n}\r\n\r\n/**\r\n * Clear the API cache\r\n */\r\nexport function clearApiCache(endpoint?: string): void {\r\n if (endpoint) {\r\n const url = endpoint.startsWith('/') ? `/api${endpoint}` : `/api/${endpoint}`;\r\n apiCache.delete(url);\r\n } else {\r\n apiCache.clear();\r\n }\r\n}\r\n\r\n// Sample data for development\r\nconst sampleUsers = [\r\n { id: 1, name: 'User 1', email: 'user1@example.com' },\r\n { id: 2, name: 'User 2', email: 'user2@example.com' },\r\n { id: 3, name: 'User 3', email: 'user3@example.com' }\r\n];\r\n\r\nconst samplePosts = [\r\n { id: 1, title: 'Post 1', content: 'Content for post 1', authorId: 1 },\r\n { id: 2, title: 'Post 2', content: 'Content for post 2', authorId: 2 },\r\n { id: 3, title: 'Post 3', content: 'Content for post 3', authorId: 1 }\r\n];\r\n\r\n// Helper to simulate network delay\r\nconst delay = (ms: number) => new Promise(resolve => setTimeout(resolve, ms));\r\n\r\n// User API client\r\nexport const UserApi = {\r\n // Get all users\r\n async getAll() {\r\n try {\r\n // In a real app, we'd fetch from API\r\n // const response = await fetch('/api/users');\r\n // if (!response.ok) throw new Error('Failed to fetch users');\r\n // return await response.json();\r\n \r\n // Simulate API delay\r\n await delay(300);\r\n return [...sampleUsers]; // Return a copy to avoid mutations\r\n } catch (error) {\r\n console.error('Error fetching users:', error);\r\n return [];\r\n }\r\n },\r\n \r\n // Get user by ID\r\n async getById(id: number | string) {\r\n try {\r\n // In a real app, we'd fetch from API\r\n // const response = await fetch(`/api/users/${id}`);\r\n // if (!response.ok) throw new Error('User not found');\r\n // return await response.json();\r\n \r\n // Convert ID to number if it's a string\r\n const userId = typeof id === 'string' ? parseInt(id, 10) : id;\r\n \r\n // Simulate API delay\r\n await delay(200);\r\n \r\n // Find user\r\n const user = sampleUsers.find(u => u.id === userId);\r\n if (!user) throw new Error('User not found');\r\n \r\n return { ...user }; // Return a copy to avoid mutations\r\n } catch (error) {\r\n console.error(`Error fetching user ${id}:`, error);\r\n return null;\r\n }\r\n },\r\n \r\n // Get posts (all or by author)\r\n async getPosts(authorId?: number | string) {\r\n try {\r\n // In a real app, we'd fetch from API\r\n // const url = authorId ? `/api/posts?authorId=${authorId}` : '/api/posts';\r\n // const response = await fetch(url);\r\n // if (!response.ok) throw new Error('Failed to fetch posts');\r\n // return await response.json();\r\n \r\n // Convert authorId to number if it's a string\r\n const userId = authorId ? (typeof authorId === 'string' ? parseInt(authorId, 10) : authorId) : undefined;\r\n \r\n // Simulate API delay\r\n await delay(400);\r\n \r\n // Filter posts if authorId is provided\r\n const posts = userId\r\n ? samplePosts.filter(p => p.authorId === userId)\r\n : samplePosts;\r\n \r\n return [...posts]; // Return a copy to avoid mutations\r\n } catch (error) {\r\n console.error('Error fetching posts:', error);\r\n return [];\r\n }\r\n }\r\n};\r\n\r\n// WASM API service\r\nexport const WasmApi = {\r\n calculate: (operation: 'add' | 'multiply', a: number, b: number) => \r\n fetchApi(`/wasm/calculate?op=${operation}&a=${a}&b=${b}`),\r\n \r\n processJson: (data: any) => fetchApi('/wasm/process-json', {\r\n method: 'POST',\r\n body: JSON.stringify(data),\r\n useCache: false\r\n })\r\n};\r\n\r\n// Batch multiple API calls for efficiency\r\nexport const batchApiCalls = async <T>(\r\n apiFunctions: Array<() => Promise<T>>\r\n): Promise<T[]> => {\r\n const results: T[] = [];\r\n let errors: Error[] = [];\r\n \r\n // Execute all API calls in parallel\r\n const promises = apiFunctions.map(fn => fn());\r\n \r\n try {\r\n const settledResults = await Promise.allSettled(promises);\r\n \r\n // Process results\r\n batchUpdates(() => {\r\n settledResults.forEach(result => {\r\n if (result.status === 'fulfilled') {\r\n results.push(result.value);\r\n } else {\r\n errors.push(result.reason);\r\n }\r\n });\r\n });\r\n \r\n if (errors.length) {\r\n console.error('[API] Some batch API calls failed:', errors);\r\n }\r\n \r\n return results;\r\n } catch (error) {\r\n console.error('[API] Batch API calls failed:', error);\r\n throw error;\r\n }\r\n};\r\n", "import { jsx, Fragment } from 'frontend-hamroun';\nimport { jsx, useState, useEffect, batchUpdates } from 'frontend-hamroun';\r\nimport UserList from '../components/UserList';\r\nimport StateDemo from '../components/StateDemo';\r\nimport { ErrorBoundary } from '../components/ErrorBoundary';\r\nimport { UserApi } from '../data/api';\r\n\r\n// Home Page Component with Server Side Props\r\nexport default function HomePage({ users, posts, initialState }) {\r\n const [state, setState] = useState(initialState || {});\r\n const [refreshTrigger, setRefreshTrigger] = useState(0);\r\n \r\n // Fetch data when refresh is triggered\r\n useEffect(() => {\r\n if (refreshTrigger === 0) return; // Skip initial render\r\n \r\n async function fetchData() {\r\n try {\r\n const [users, posts] = await Promise.all([\r\n UserApi.getAll(),\r\n UserApi.getPosts()\r\n ]);\r\n \r\n // Use batch updates for efficiency\r\n batchUpdates(() => {\r\n setState(prev => ({\r\n ...prev,\r\n data: {\r\n ...prev.data,\r\n users,\r\n posts\r\n },\r\n lastUpdate: new Date().toISOString()\r\n }));\r\n });\r\n } catch (error) {\r\n console.error('Error fetching data:', error);\r\n }\r\n }\r\n \r\n fetchData();\r\n }, [refreshTrigger]);\r\n \r\n const handleRefresh = () => {\r\n setRefreshTrigger(t => t + 1);\r\n };\r\n\r\n return (\r\n <div className=\"max-w-4xl mx-auto py-8\">\r\n <h1 className=\"text-3xl font-bold text-blue-600 mb-6\">\r\n Welcome to your Next-style Frontend Hamroun application!\r\n </h1>\r\n \r\n <div className=\"mb-8\">\r\n <button \r\n className=\"mb-4 px-4 py-2 bg-blue-600 text-white rounded-lg hover:bg-blue-700\"\r\n onClick={handleRefresh}\r\n >\r\n Refresh Data\r\n </button>\r\n \r\n <div className=\"bg-blue-50 p-4 rounded-lg border border-blue-100 mb-6\">\r\n <p className=\"text-blue-700\">\r\n Last updated: {state.lastUpdate || 'Never'} \r\n </p>\r\n </div>\r\n </div>\r\n \r\n <ErrorBoundary>\r\n <div className=\"bg-white shadow-lg rounded-lg p-6 mb-8\">\r\n <h2 className=\"text-xl font-semibold text-gray-800 mb-4\">User List</h2>\r\n <UserList users={users || state.data?.users || []} />\r\n </div>\r\n </ErrorBoundary>\r\n \r\n <ErrorBoundary>\r\n <StateDemo />\r\n </ErrorBoundary>\r\n \r\n <div className=\"bg-gray-50 rounded-lg p-6 border border-gray-200 mt-8\">\r\n <h3 className=\"text-lg font-medium text-gray-700 mb-3\">Application State</h3>\r\n <pre className=\"overflow-auto p-4 bg-gray-100 rounded-md text-sm text-gray-800\">\r\n {JSON.stringify({ users, posts, ...state }, null, 2)}\r\n </pre>\r\n </div>\r\n </div>\r\n );\r\n}\r\n\r\n// Server-side data fetching (Next.js style)\r\nexport async function getServerSideProps() {\r\n try {\r\n const users = await UserApi.getAll();\r\n const posts = await UserApi.getPosts();\r\n \r\n return {\r\n props: {\r\n users,\r\n posts\r\n }\r\n };\r\n } catch (error) {\r\n console.error('Error fetching initial data:', error);\r\n return {\r\n props: {\r\n users: [],\r\n posts: []\r\n }\r\n };\r\n }\r\n}\r\n", "import { jsx, Fragment } from 'frontend-hamroun';\nimport { jsx } from 'frontend-hamroun';\r\nimport Layout from '../components/Layout';\r\nimport { UserApi } from '../data/api';\r\n\r\nconst UsersPage = ({ initialState }) => {\r\n const users = initialState.data?.users || [];\r\n\r\n return (\r\n <Layout title=\"User Management\">\r\n <div className=\"max-w-4xl mx-auto\">\r\n <div className=\"bg-blue-50 p-6 rounded-lg mb-8 border border-blue-100\">\r\n <h2 className=\"text-xl font-semibold text-blue-800 mb-2\">Data Fetching Demo</h2>\r\n <p className=\"text-blue-700\">This page demonstrates dynamic data fetching with the Users API.</p>\r\n </div>\r\n \r\n <div className=\"bg-white shadow-md rounded-lg overflow-hidden\">\r\n <div className=\"px-6 py-4 border-b border-gray-200\">\r\n <h2 className=\"text-xl font-semibold text-gray-800\">User List</h2>\r\n </div>\r\n \r\n {users.length === 0 ? (\r\n <div className=\"p-6 text-center text-gray-500\">\r\n <p>No users found.</p>\r\n </div>\r\n ) : (\r\n <div className=\"overflow-x-auto\">\r\n <table className=\"w-full\">\r\n <thead>\r\n <tr className=\"bg-gray-50\">\r\n <th className=\"text-left py-3 px-6 font-medium text-gray-600 text-sm uppercase tracking-wider border-b\">ID</th>\r\n <th className=\"text-left py-3 px-6 font-medium text-gray-600 text-sm uppercase tracking-wider border-b\">Name</th>\r\n <th className=\"text-left py-3 px-6 font-medium text-gray-600 text-sm uppercase tracking-wider border-b\">Email</th>\r\n </tr>\r\n </thead>\r\n <tbody className=\"divide-y divide-gray-200\">\r\n {users.map(user => (\r\n <tr key={user.id} className=\"hover:bg-gray-50\">\r\n <td className=\"py-4 px-6 text-sm text-gray-900\">{user.id}</td>\r\n <td className=\"py-4 px-6 text-sm font-medium text-gray-900\">{user.name}</td>\r\n <td className=\"py-4 px-6 text-sm text-gray-500\">{user.email}</td>\r\n </tr>\r\n ))}\r\n </tbody>\r\n </table>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n </Layout>\r\n );\r\n};\r\n\r\n// Static method to fetch initial data for this page\r\nUsersPage.getInitialData = async () => {\r\n return {\r\n users: await UserApi.getAll()\r\n };\r\n};\r\n\r\nexport default UsersPage;\r\n", "import { jsx, Fragment } from 'frontend-hamroun';\nimport { jsx, useState, useEffect } from 'frontend-hamroun';\r\nimport { UserApi } from '../../data/api';\r\n\r\nexport default function UserDetail({ user, posts, initialState }) {\r\n // State for client-side data fetching when needed\r\n const [userData, setUserData] = useState(user);\r\n const [userPosts, setUserPosts] = useState(posts || []);\r\n const [loading, setLoading] = useState(false);\r\n const [error, setError] = useState(null);\r\n \r\n // Get user ID from route params\r\n const { id } = initialState?.params || {};\r\n \r\n // Fetch user data if not provided from server\r\n useEffect(() => {\r\n if (!userData && id) {\r\n setLoading(true);\r\n \r\n Promise.all([\r\n UserApi.getById(id),\r\n UserApi.getPosts(id)\r\n ])\r\n .then(([userData, postsData]) => {\r\n setUserData(userData);\r\n setUserPosts(postsData);\r\n setLoading(false);\r\n })\r\n .catch(err => {\r\n console.error('Error fetching user data:', err);\r\n setError(err.message || 'Failed to load user data');\r\n setLoading(false);\r\n });\r\n }\r\n }, [userData, id]);\r\n\r\n if (loading) {\r\n return (\r\n <div className=\"max-w-4xl mx-auto p-4\">\r\n <div className=\"animate-pulse rounded-md bg-gray-100 p-8\">\r\n <div className=\"h-8 bg-gray-200 rounded w-1/4 mb-4\"></div>\r\n <div className=\"h-4 bg-gray-200 rounded w-1/2 mb-2\"></div>\r\n <div className=\"h-4 bg-gray-200 rounded w-3/4 mb-4\"></div>\r\n <div className=\"h-40 bg-gray-200 rounded mb-4\"></div>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n if (error) {\r\n return (\r\n <div className=\"max-w-4xl mx-auto p-4\">\r\n <div className=\"rounded-md bg-red-50 p-4 border border-red-200\">\r\n <h2 className=\"text-lg font-bold text-red-700\">Error Loading User</h2>\r\n <p className=\"text-red-600\">{error}</p>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n if (!userData) {\r\n return (\r\n <div className=\"max-w-4xl mx-auto p-4\">\r\n <div className=\"rounded-md bg-yellow-50 p-4 border border-yellow-200\">\r\n <h2 className=\"text-lg font-bold text-yellow-700\">User Not Found</h2>\r\n <p className=\"text-yellow-600\">Could not find user with ID: {id}</p>\r\n <a href=\"/users\" className=\"text-blue-600 hover:underline mt-2 block\">\r\n Back to Users List\r\n </a>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"max-w-4xl mx-auto p-4\">\r\n <div className=\"bg-white shadow-lg rounded-lg p-6 mb-6\">\r\n <h1 className=\"text-2xl font-bold text-gray-800 mb-4\">{userData.name}</h1>\r\n <div className=\"user-info mb-6\">\r\n <p className=\"text-gray-600\">\r\n <span className=\"font-bold\">ID:</span> {userData.id}\r\n </p>\r\n <p className=\"text-gray-600\">\r\n <span className=\"font-bold\">Email:</span> {userData.email}\r\n </p>\r\n </div>\r\n \r\n <a href=\"/users\" className=\"text-blue-600 hover:underline\">\r\n Back to Users List\r\n </a>\r\n </div>\r\n \r\n {userPosts && userPosts.length > 0 ? (\r\n <div className=\"bg-white shadow-lg rounded-lg p-6\">\r\n <h2 className=\"text-xl font-bold text-gray-800 mb-4\">Posts by {userData.name}</h2>\r\n <div className=\"space-y-4\">\r\n {userPosts.map(post => (\r\n <div key={post.id} className=\"border-b pb-4\">\r\n <h3 className=\"text-lg font-semibold\">{post.title}</h3>\r\n <p className=\"text-gray-600\">{post.content}</p>\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n ) : (\r\n <div className=\"bg-white shadow-lg rounded-lg p-6\">\r\n <h2 className=\"text-xl font-bold text-gray-800 mb-4\">Posts by {userData.name}</h2>\r\n <p className=\"text-gray-500 italic\">No posts found for this user.</p>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n// Next.js style server-side data fetching\r\nexport async function getServerSideProps({ params }) {\r\n try {\r\n const userId = params.id;\r\n \r\n // Parallel data fetching\r\n const [user, posts] = await Promise.all([\r\n UserApi.getById(parseInt(userId)),\r\n UserApi.getPosts(parseInt(userId))\r\n ]);\r\n \r\n // Handle user not found\r\n if (!user) {\r\n return {\r\n notFound: true\r\n };\r\n }\r\n \r\n return {\r\n props: {\r\n user,\r\n posts\r\n }\r\n };\r\n } catch (error) {\r\n console.error(`Error fetching user ${params.id}:`, error);\r\n \r\n // Pass the error for client-side handling\r\n return {\r\n props: {\r\n error: {\r\n message: error.message,\r\n status: error.status || 500\r\n },\r\n user: null,\r\n posts: []\r\n }\r\n };\r\n }\r\n}\r\n", "import { jsx, Fragment } from 'frontend-hamroun';\n// This file will be removed as it contains WASM functionality\r\n", "import { jsx, Fragment } from 'frontend-hamroun';\nimport { render, hydrate, jsx } from 'frontend-hamroun';\r\n// Import Tailwind CSS\r\nimport './styles.css';\r\n\r\n// Type declaration for window.__INITIAL_STATE__\r\ndeclare global {\r\n interface Window {\r\n __INITIAL_STATE__?: any;\r\n }\r\n}\r\n\r\n// Get initial state from server\r\nconst initialState = window.__INITIAL_STATE__ || {\r\n route: window.location.pathname,\r\n timestamp: new Date().toISOString(),\r\n serverRendered: false,\r\n data: {\r\n users: null,\r\n posts: null\r\n }\r\n};\r\n\r\nconsole.log('[Client] Initial state:', initialState);\r\n\r\n// Create a mutable variable for hydration state\r\nlet isHydrating = document.getElementById('root')?.innerHTML.trim() !== '';\r\n\r\n// Function to handle navigation\r\nasync function handleRouteChange(path: string, isPushState = true) {\r\n try {\r\n console.log(`[Router] Navigating to: ${path}`);\r\n \r\n // Update URL if needed\r\n if (isPushState) {\r\n window.history.pushState(null, '', path);\r\n }\r\n \r\n // Dynamically load the page component based on the path\r\n const normalizedPath = path === '/' ? 'index' : path.replace(/^\\//, '');\r\n \r\n let Page;\r\n try {\r\n // Dynamic import for the page component\r\n const module = await import(`./pages/${normalizedPath}.tsx`);\r\n Page = module.default;\r\n } catch (error) {\r\n console.warn(`[Router] Could not load page for ${path}, trying index file`);\r\n try {\r\n // Try loading index file in directory\r\n const module = await import(`./pages/${normalizedPath}/index.tsx`);\r\n Page = module.default;\r\n } catch (innerError) {\r\n console.error(`[Router] Failed to load page component for ${path}`);\r\n \r\n // Try to load 404 page\r\n try {\r\n const notFoundModule = await import(`./pages/404.tsx`);\r\n Page = notFoundModule.default;\r\n } catch (notFoundError) {\r\n // If all fails, render a simple not found message\r\n const rootElement = document.getElementById('root');\r\n if (rootElement) {\r\n render(\r\n <div style={{ padding: '20px', maxWidth: '800px', margin: '0 auto' }}>\r\n <h1>Page Not Found</h1>\r\n <p>The page you requested could not be found.</p>\r\n <a href=\"/\" style={{ color: '#0066cc' }}>Go to Home</a>\r\n </div>,\r\n rootElement\r\n );\r\n }\r\n return;\r\n }\r\n }\r\n }\r\n \r\n // Get the current page props\r\n let pageProps = initialState.pageProps || {};\r\n \r\n // If the page defines getServerSideProps, fetch data\r\n if (Page.getServerSideProps) {\r\n try {\r\n const response = await fetch(`/api/__props${path}`);\r\n if (response.ok) {\r\n const data = await response.json();\r\n pageProps = data.props || {};\r\n }\r\n } catch (error) {\r\n console.error('[Router] Error fetching page props:', error);\r\n }\r\n }\r\n \r\n // Update the state with current route\r\n const updatedState = {\r\n ...initialState,\r\n route: path,\r\n pageProps\r\n };\r\n \r\n // Render the page\r\n const rootElement = document.getElementById('root');\r\n if (!rootElement) return;\r\n \r\n if (isHydrating && path === initialState.route) {\r\n console.log('[Client] Hydrating server-rendered content');\r\n hydrate(<Page {...pageProps} initialState={updatedState} />, rootElement);\r\n isHydrating = false;\r\n } else {\r\n console.log('[Client] Rendering client-side');\r\n render(<Page {...pageProps} initialState={updatedState} />, rootElement);\r\n }\r\n } catch (error) {\r\n console.error('[Router] Navigation error:', error);\r\n }\r\n}\r\n\r\n// Handle initial route\r\nhandleRouteChange(window.location.pathname, false);\r\n\r\n// Handle client-side navigation\r\ndocument.addEventListener('click', (e) => {\r\n let target = e.target as HTMLElement | null;\r\n \r\n // Find closest anchor element\r\n while (target && target.tagName !== 'A') {\r\n target = target.parentElement;\r\n if (!target) break;\r\n }\r\n \r\n if (target && \r\n target.tagName === 'A' && \r\n target.getAttribute('href') && \r\n target.getAttribute('href')?.startsWith('/') && \r\n !target.getAttribute('href')?.startsWith('//') && \r\n !target.getAttribute('target')) {\r\n \r\n e.preventDefault();\r\n const href = target.getAttribute('href') || '/';\r\n handleRouteChange(href);\r\n }\r\n});\r\n\r\n// Handle back/forward navigation\r\nwindow.addEventListener('popstate', () => {\r\n handleRouteChange(window.location.pathname, false);\r\n});\r\n\r\n// Set up socket.io for live reload in development\r\nif (typeof io !== 'undefined') {\r\n const socket = io();\r\n socket.on('reload', () => {\r\n console.log('[Dev] Reloading page due to file changes');\r\n window.location.reload();\r\n });\r\n}\r\n"],
|
5
|
+
"mappings": "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",
|
6
|
+
"names": ["index", "state", "setState", "effectIndex", "initialState", "initialState", "initialState", "initialState", "about_exports", "AboutPage", "init_about", "initialState", "getServerSideProps", "initialState", "users", "posts", "initialState", "id_exports", "getServerSideProps", "initialState", "userData", "init_id", "isHydrating", "rootElement"]
|
7
|
+
}
|