baraqex 1.0.36 → 1.0.38
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/api/hello.d.ts +3 -0
- package/dist/api/hello.d.ts.map +1 -0
- package/dist/api/users/[id].d.ts +5 -0
- package/dist/api/users/[id].d.ts.map +1 -0
- package/dist/browser.d.ts +14 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.js.map +1 -1
- package/dist/frontend/components/WasmLoader.d.ts +2 -0
- package/dist/frontend/components/WasmLoader.d.ts.map +1 -0
- package/dist/frontend/hooks/useWasm.d.ts +2 -0
- package/dist/frontend/hooks/useWasm.d.ts.map +1 -0
- package/dist/frontend/index.d.ts +2 -0
- package/dist/frontend/index.d.ts.map +1 -0
- package/dist/index.d.ts +35 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/renderComponent.d.ts +9 -0
- package/dist/renderComponent.d.ts.map +1 -0
- package/dist/server/api-router.d.ts +16 -0
- package/dist/server/api-router.d.ts.map +1 -0
- package/dist/server/auth.d.ts +25 -0
- package/dist/server/auth.d.ts.map +1 -0
- package/dist/server/database.d.ts +22 -0
- package/dist/server/database.d.ts.map +1 -0
- package/dist/server/index.d.ts +115 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/middleware.d.ts +11 -0
- package/dist/server/middleware.d.ts.map +1 -0
- package/dist/server/templates.d.ts +31 -0
- package/dist/server/templates.d.ts.map +1 -0
- package/dist/server/types.d.ts +69 -0
- package/dist/server/types.d.ts.map +1 -0
- package/dist/server/utils.d.ts +70 -0
- package/dist/server/utils.d.ts.map +1 -0
- package/dist/server/wasm.d.ts +29 -0
- package/dist/server/wasm.d.ts.map +1 -0
- package/dist/server-renderer.d.ts +5 -0
- package/dist/server-renderer.d.ts.map +1 -0
- package/dist/wasm.d.ts +51 -0
- package/dist/wasm.d.ts.map +1 -0
- package/package.json +10 -15
- package/templates/ssr-template/esbuild.config.js +1 -5
- package/templates/ssr-template/package-lock.json +41 -17
- package/templates/ssr-template/package.json +1 -1
- package/templates/ssr-template/src/App.tsx +10 -10
- package/templates/ssr-template/src/client.tsx +3 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hello.d.ts","sourceRoot":"","sources":["../../src/api/hello.js"],"names":[],"mappings":"AAAA,8CAOC;AAED,+CAQC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"[id].d.ts","sourceRoot":"","sources":["../../../src/api/users/[id].js"],"names":[],"mappings":"AAOA,6CAeC;AAED,6CAmBC;AAED,iDAkBC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser-only entry point for baraqex
|
|
3
|
+
* This file excludes all server dependencies to ensure browser compatibility
|
|
4
|
+
*/
|
|
5
|
+
export * from 'frontend-hamroun';
|
|
6
|
+
export { loadGoWasm, callWasmFunction, isWasmReady, getWasmFunctions, useGoWasm } from './wasm.js';
|
|
7
|
+
export type { GoWasmOptions, GoWasmInstance } from './wasm.js';
|
|
8
|
+
export { generateDocument, generateErrorPage, generateLoadingPage } from './server/templates.js';
|
|
9
|
+
export declare function renderToString(content: any): Promise<string>;
|
|
10
|
+
export declare function generateToken(length?: number): string;
|
|
11
|
+
export declare function safeJsonParse<T>(json: string, fallback: T): T;
|
|
12
|
+
export declare const isBrowser: boolean;
|
|
13
|
+
export declare const isNode = false;
|
|
14
|
+
//# sourceMappingURL=browser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,cAAc,kBAAkB,CAAC;AAGjC,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,WAAW,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAGnG,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAG/D,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAGjG,wBAAgB,cAAc,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CAa5D;AAGD,wBAAgB,aAAa,CAAC,MAAM,GAAE,MAAW,GAAG,MAAM,CAWzD;AAED,wBAAgB,aAAa,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,CAAC,CAM7D;AAGD,eAAO,MAAM,SAAS,SAAgC,CAAC;AACvD,eAAO,MAAM,MAAM,QAAQ,CAAC"}
|
package/dist/browser.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../node_modules/frontend-hamroun/src/batch.ts", "../node_modules/frontend-hamroun/src/hooks.ts", "../node_modules/frontend-hamroun/src/context.ts", "../node_modules/frontend-hamroun/src/jsx-runtime.ts", "../node_modules/frontend-hamroun/src/renderer.ts", "../node_modules/frontend-hamroun/src/server-renderer.ts", "../node_modules/frontend-hamroun/src/index.client.ts", "../src/wasm.ts", "../src/server/templates.ts", "../src/browser.ts"],
|
|
4
|
-
"sourcesContent": ["export let isBatching = false;\r\nconst queue: Function[] = [];\r\n\r\nexport function batchUpdates(fn: Function) {\r\n if (isBatching) {\r\n queue.push(fn);\r\n return;\r\n }\r\n\r\n isBatching = true;\r\n try {\r\n fn();\r\n while (queue.length > 0) {\r\n const nextFn = queue.shift();\r\n nextFn?.();\r\n }\r\n } finally {\r\n isBatching = false;\r\n }\r\n}\r\n\r\nexport function getIsBatching() {\r\n return isBatching;\r\n}\r\n", "import { createElement } from './jsx-runtime';\r\nimport { batchUpdates, isBatching } from './batch';\r\nimport { diff } from './vdom';\r\n\r\nlet currentRender: number = 0;\r\nconst states = new Map<number, any[]>();\r\nconst stateIndices = new Map<number, number>();\r\nconst effects = new Map<number, Effect[]>();\r\nconst memos = new Map<number, { value: any; deps: any[] }[]>();\r\nconst refs = new Map<number, any[]>();\r\n\r\ninterface Effect {\r\n cleanup?: () => void;\r\n deps?: any[];\r\n}\r\n\r\n// Add at the top with other declarations\r\nlet globalRenderCallback: ((element: any, container: HTMLElement) => void) | null = null;\r\nlet globalContainer: HTMLElement | null = null;\r\nlet currentElement: any = null;\r\n\r\nconst isServer = typeof window === 'undefined';\r\nconst serverStates = new Map<number, any>();\r\n\r\nexport function setRenderCallback(\r\n callback: (element: any, container: HTMLElement) => void,\r\n element: any,\r\n container: HTMLElement\r\n) {\r\n globalRenderCallback = callback;\r\n globalContainer = container;\r\n currentElement = element;\r\n}\r\n\r\nexport function prepareRender() {\r\n currentRender++;\r\n stateIndices.set(currentRender, 0);\r\n return currentRender;\r\n}\r\n\r\nexport function finishRender() {\r\n if (isServer) {\r\n serverStates.delete(currentRender);\r\n }\r\n currentRender = 0;\r\n}\r\n\r\nexport function useState<T>(initial: T): [T, (value: T | ((prev: T) => T)) => void] {\r\n if (!currentRender) {\r\n throw new Error('useState must be called within a render');\r\n }\r\n\r\n if (isServer) {\r\n // Server-side state handling\r\n if (!serverStates.has(currentRender)) {\r\n serverStates.set(currentRender, new Map());\r\n }\r\n const componentState = serverStates.get(currentRender)!;\r\n const index = stateIndices.get(currentRender) || 0;\r\n \r\n if (!componentState.has(index)) {\r\n componentState.set(index, initial);\r\n }\r\n\r\n const state = componentState.get(index);\r\n const setState = (newValue: T | ((prev: T) => T)) => {\r\n // No-op for server-side\r\n };\r\n\r\n stateIndices.set(currentRender, index + 1);\r\n return [state, setState];\r\n }\r\n\r\n if (!states.has(currentRender)) {\r\n states.set(currentRender, []);\r\n }\r\n\r\n const componentStates = states.get(currentRender)!;\r\n const index = stateIndices.get(currentRender)!;\r\n \r\n if (index >= componentStates.length) {\r\n componentStates.push(initial);\r\n }\r\n\r\n const state = componentStates[index];\r\n const setState = (newValue: T | ((prev: T) => T)) => {\r\n const nextValue = typeof newValue === 'function' \r\n ? (newValue as Function)(componentStates[index])\r\n : newValue;\r\n\r\n if (componentStates[index] === nextValue) return; // Skip if value hasn't changed\r\n \r\n componentStates[index] = nextValue;\r\n \r\n if (isBatching) {\r\n batchUpdates(() => rerender(currentRender));\r\n } else {\r\n rerender(currentRender);\r\n }\r\n };\r\n\r\n stateIndices.set(currentRender, index + 1);\r\n return [state, setState];\r\n}\r\n\r\nexport function useEffect(callback: () => (() => void) | void, deps?: any[]) {\r\n if (!currentRender) throw new Error('useEffect must be called within a render');\r\n \r\n const effectIndex = stateIndices.get(currentRender)!;\r\n \r\n if (!effects.has(currentRender)) {\r\n effects.set(currentRender, []);\r\n }\r\n\r\n const componentEffects = effects.get(currentRender)!;\r\n const prevEffect = componentEffects[effectIndex];\r\n \r\n // Run effect if deps changed\r\n if (!prevEffect || !deps || !prevEffect.deps || \r\n deps.some((dep, i) => dep !== prevEffect.deps![i])) {\r\n \r\n // Cleanup previous effect\r\n if (prevEffect?.cleanup) {\r\n prevEffect.cleanup();\r\n }\r\n\r\n // Schedule new effect\r\n queueMicrotask(() => {\r\n const cleanup = callback() || undefined;\r\n componentEffects[effectIndex] = { cleanup: cleanup, deps };\r\n });\r\n }\r\n \r\n stateIndices.set(currentRender, effectIndex + 1);\r\n}\r\n\r\nexport function useMemo<T>(factory: () => T, deps: any[]): T {\r\n if (!currentRender) throw new Error('useMemo must be called within a render');\r\n \r\n const memoIndex = stateIndices.get(currentRender)!;\r\n \r\n if (!memos.has(currentRender)) {\r\n memos.set(currentRender, []);\r\n }\r\n\r\n const componentMemos = memos.get(currentRender)!;\r\n const prevMemo = componentMemos[memoIndex];\r\n \r\n if (!prevMemo || (deps && deps.some((dep, i) => !Object.is(dep, prevMemo.deps[i])))) {\r\n const value = factory();\r\n componentMemos[memoIndex] = { value, deps };\r\n stateIndices.set(currentRender, memoIndex + 1);\r\n return value;\r\n }\r\n\r\n stateIndices.set(currentRender, memoIndex + 1);\r\n return prevMemo.value;\r\n}\r\n\r\nexport function useRef<T>(initial: T) {\r\n if (!currentRender) throw new Error('useRef must be called within a render');\r\n \r\n const refIndex = stateIndices.get(currentRender)!;\r\n \r\n if (!refs.has(currentRender)) {\r\n refs.set(currentRender, []);\r\n }\r\n\r\n const componentRefs = refs.get(currentRender)!;\r\n if (refIndex >= componentRefs.length) {\r\n // Initialize with an object that has a current property\r\n const ref = { current: initial };\r\n componentRefs.push(ref);\r\n stateIndices.set(currentRender, refIndex + 1);\r\n return ref;\r\n }\r\n\r\n const ref = componentRefs[refIndex];\r\n stateIndices.set(currentRender, refIndex + 1);\r\n return ref;\r\n}\r\n\r\n// Add a map to track component DOM nodes\r\nconst componentNodes = new Map<Function, Node>();\r\n\r\nasync function rerender(rendererId: number) {\r\n try {\r\n // Clean up effects\r\n const componentEffects = effects.get(rendererId);\r\n if (componentEffects) {\r\n componentEffects.forEach(effect => {\r\n if (effect.cleanup) effect.cleanup();\r\n });\r\n effects.set(rendererId, []);\r\n }\r\n\r\n if (globalRenderCallback && globalContainer && currentElement) {\r\n await globalRenderCallback(currentElement, globalContainer);\r\n }\r\n } catch (error) {\r\n console.error('Error during rerender:', error);\r\n }\r\n}\r\n\r\n// Add new hook for error boundaries\r\nexport function useErrorBoundary(): [Error | null, () => void] {\r\n const [error, setError] = useState<Error | null>(null);\r\n return [error, () => setError(null)];\r\n}\r\n\r\n// Remove withHooks export\r\n", "\r\n\r\nconst contexts = new Map<symbol, any>();\r\nlet currentRender: Function | null = null;\r\n\r\nexport interface Context<T> {\r\n Provider: (props: { value: T; children?: any }) => any;\r\n Consumer: (props: { children: (value: T) => any }) => any;\r\n _id: symbol;\r\n useSelector: <S>(selector: (state: T) => S) => S;\r\n}\r\n\r\nexport function createContext<T>(defaultValue: T): Context<T> {\r\n const context = {\r\n Provider: ({ value, children }: { value: T, children?: any }) => {\r\n return children;\r\n },\r\n Consumer: ({ children }: { children: (value: T) => any }) => {\r\n return children(defaultValue);\r\n },\r\n _id: Symbol(),\r\n useSelector: <S>(selector: (state: T) => S) => {\r\n return selector(defaultValue);\r\n }\r\n };\r\n\r\n return context;\r\n}\r\n\r\nexport function useContext<T>(context: any): T {\r\n return context;\r\n}\r\n", "import type { Component } from './component';\r\n\r\ninterface VNode {\r\n type: string | Function;\r\n props: Record<string, any>;\r\n}\r\n\r\nfunction jsx(type: string | Function, props: any): VNode {\r\n console.log('JSX Transform:', { type, props });\r\n const processedProps = { ...props };\r\n \r\n // Handle children properly\r\n if (arguments.length > 2) {\r\n processedProps.children = Array.prototype.slice.call(arguments, 2);\r\n }\r\n \r\n return { type, props: processedProps };\r\n}\r\n\r\nconst Fragment = ({ children }: { children: any }) => children;\r\n\r\nasync function createElement(vnode: VNode | any): Promise<Node> {\r\n console.log('Creating element from:', vnode);\r\n\r\n // Handle primitives and null\r\n if (vnode == null) {\r\n return document.createTextNode('');\r\n }\r\n \r\n if (typeof vnode === 'boolean') {\r\n return document.createTextNode('');\r\n }\r\n\r\n if (typeof vnode === 'number' || typeof vnode === 'string') {\r\n return document.createTextNode(String(vnode));\r\n }\r\n\r\n // Handle arrays\r\n if (Array.isArray(vnode)) {\r\n const fragment = document.createDocumentFragment();\r\n for (const child of vnode) {\r\n const node = await createElement(child);\r\n fragment.appendChild(node);\r\n }\r\n return fragment;\r\n }\r\n\r\n // Handle VNode\r\n if ('type' in vnode && vnode.props !== undefined) {\r\n const { type, props } = vnode;\r\n \r\n // Handle function components\r\n if (typeof type === 'function') {\r\n try {\r\n const result = await type(props || {});\r\n const node = await createElement(result);\r\n if (node instanceof Element) {\r\n node.setAttribute('data-component-id', type.name || type.toString());\r\n }\r\n return node;\r\n } catch (error) {\r\n console.error('Error rendering component:', error);\r\n return document.createTextNode('');\r\n }\r\n }\r\n\r\n // Create DOM element\r\n const element = document.createElement(type as string);\r\n \r\n // Handle props\r\n for (const [key, value] of Object.entries(props || {})) {\r\n if (key === 'children') continue;\r\n if (key.startsWith('on') && typeof value === 'function') {\r\n const eventName = key.toLowerCase().slice(2);\r\n // Remove existing event listener if any\r\n const existingHandler = (element as any).__events?.[eventName];\r\n if (existingHandler) {\r\n element.removeEventListener(eventName, existingHandler);\r\n }\r\n \r\n // Add new event listener\r\n element.addEventListener(eventName, value as EventListener);\r\n if (!(element as any).__events) {\r\n (element as any).__events = {};\r\n }\r\n (element as any).__events[eventName] = value;\r\n } else if (key === 'style' && typeof value === 'object') {\r\n Object.assign(element.style, value);\r\n } else if (key === 'className') {\r\n element.setAttribute('class', String(value));\r\n } else if (key !== 'key' && key !== 'ref') {\r\n element.setAttribute(key, String(value));\r\n }\r\n }\r\n\r\n // Handle children\r\n const children = props?.children;\r\n if (children != null) {\r\n const childArray = Array.isArray(children) ? children.flat() : [children];\r\n for (const child of childArray) {\r\n const childNode = await createElement(child);\r\n element.appendChild(childNode);\r\n }\r\n }\r\n\r\n return element;\r\n }\r\n\r\n // Handle other objects by converting to string\r\n return document.createTextNode(String(vnode));\r\n}\r\n\r\n// Export named functions and aliases without duplicates\r\nexport {\r\n jsx,\r\n jsx as jsxs,\r\n jsx as jsxDEV,\r\n Fragment,\r\n createElement\r\n};\r\n\r\n// Named exports object\r\nconst jsxRuntime = {\r\n jsx,\r\n jsxs: jsx,\r\n jsxDEV: jsx,\r\n Fragment,\r\n createElement\r\n};\r\n\r\nexport default jsxRuntime;\r\n", "import { createElement } from './jsx-runtime';\r\nimport { prepareRender, finishRender, setRenderCallback } from './hooks';\r\nimport { batchUpdates } from './batch';\r\n\r\nlet isHydrating = false;\r\n\r\nexport async function hydrate(element: any, container: HTMLElement) {\r\n isHydrating = true;\r\n try {\r\n await render(element, container);\r\n } finally {\r\n isHydrating = false;\r\n }\r\n}\r\n\r\nexport async function render(element: any, container: HTMLElement) {\r\n console.log('Rendering to:', container.id);\r\n \r\n batchUpdates(async () => {\r\n const rendererId = prepareRender();\r\n try {\r\n setRenderCallback(render, element, container);\r\n const domNode = await createElement(element);\r\n \r\n if (!isHydrating) {\r\n container.innerHTML = '';\r\n }\r\n container.appendChild(domNode);\r\n \r\n } finally {\r\n finishRender();\r\n }\r\n });\r\n}\r\n", "import { VNode, Component } from './types';\r\nimport { prepareRender, finishRender } from './hooks';\r\n\r\n/**\r\n * Renders a virtual DOM tree to an HTML string\r\n */\r\nexport function renderToString(vnode: VNode): string {\r\n // Reset hook state for this render\r\n prepareRender();\r\n \r\n // Render the tree to HTML\r\n const html = renderNodeToString(vnode);\r\n \r\n // Clean up after rendering\r\n finishRender();\r\n \r\n return html;\r\n}\r\n\r\n/**\r\n * Internal function to convert a virtual node to an HTML string\r\n */\r\nfunction renderNodeToString(vnode: VNode | string | number | boolean | null | undefined): string {\r\n // Handle primitive values\r\n if (vnode === null || vnode === undefined) return '';\r\n if (typeof vnode === 'boolean') return '';\r\n if (typeof vnode === 'number' || typeof vnode === 'string') return escapeHtml(String(vnode));\r\n \r\n // Handle function components\r\n if (typeof vnode.type === 'function') {\r\n const Component = vnode.type as Component;\r\n const renderedNode = Component(vnode.props || {});\r\n return renderNodeToString(renderedNode);\r\n }\r\n \r\n // Handle intrinsic elements (regular HTML tags)\r\n if (typeof vnode.type === 'string') {\r\n const tag = vnode.type;\r\n let attrs = '';\r\n let children = '';\r\n \r\n // Convert props to HTML attributes\r\n if (vnode.props) {\r\n for (const [key, value] of Object.entries(vnode.props)) {\r\n // Skip children prop as we handle it separately\r\n if (key === 'children') continue;\r\n \r\n // Skip event handlers (they start with 'on')\r\n if (key.startsWith('on')) continue;\r\n \r\n // Handle the className prop specially\r\n if (key === 'className') {\r\n attrs += ` class=\"${escapeHtml(value as string)}\"`;\r\n continue;\r\n }\r\n \r\n // Handle other attributes\r\n if (typeof value === 'string' || typeof value === 'number') {\r\n attrs += ` ${key}=\"${escapeHtml(String(value))}\"`;\r\n } else if (value === true) {\r\n // Boolean attributes\r\n attrs += ` ${key}`;\r\n }\r\n }\r\n }\r\n \r\n // Process children\r\n const childrenArray = (vnode.props?.children) \r\n ? Array.isArray(vnode.props.children) \r\n ? vnode.props.children \r\n : [vnode.props.children]\r\n : [];\r\n \r\n for (const child of childrenArray) {\r\n children += renderNodeToString(child);\r\n }\r\n \r\n // Self-closing tags\r\n const selfClosing = [\r\n 'area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input',\r\n 'link', 'meta', 'param', 'source', 'track', 'wbr'\r\n ];\r\n \r\n if (selfClosing.includes(tag)) {\r\n return `<${tag}${attrs}/>`;\r\n }\r\n \r\n // Regular tags with closing\r\n return `<${tag}${attrs}>${children}</${tag}>`;\r\n }\r\n \r\n // Handle fragments\r\n if (vnode.type === Symbol.for('react.fragment')) {\r\n let fragmentOutput = '';\r\n const children = Array.isArray(vnode.props?.children)\r\n ? vnode.props.children\r\n : vnode.props?.children ? [vnode.props.children] : [];\r\n \r\n for (const child of children) {\r\n fragmentOutput += renderNodeToString(child);\r\n }\r\n \r\n return fragmentOutput;\r\n }\r\n \r\n // Fallback for unknown node types\r\n console.warn('Unknown vnode type:', vnode.type);\r\n return '';\r\n}\r\n\r\n/**\r\n * Escape HTML special characters to prevent XSS\r\n */\r\nfunction escapeHtml(text: string): string {\r\n return text\r\n .replace(/&/g, '&')\r\n .replace(/</g, '<')\r\n .replace(/>/g, '>')\r\n .replace(/\"/g, '"')\r\n .replace(/'/g, ''');\r\n}\r\n", "import { createElement } from './jsx-runtime';\r\nimport { prepareRender, finishRender, setRenderCallback } from './hooks';\r\n\r\nexport { \r\n useState, \r\n useEffect, \r\n useMemo, \r\n useRef,\r\n useErrorBoundary \r\n} from './hooks';\r\n\r\nexport { createContext, useContext } from './context';\r\nexport { batchUpdates } from './batch';\r\nexport { jsx, jsxs, Fragment } from './jsx-runtime';\r\nexport { render, hydrate } from './renderer';\r\nexport { renderToString } from './server-renderer';\r\n\r\n// Re-export types for client-side usage\r\nexport type { Context } from './context';\r\nexport type { VNode } from './types';\r\n\r\n// Export server types for type checking\r\nexport type {\r\n Server,\r\n ServerConfig,\r\n User,\r\n DbConfig,\r\n MiddlewareFunction\r\n} from './server-types';\r\n\r\n// Provide placeholder server functionality\r\nexport const server = {\r\n async getServer() {\r\n throw new Error('Server module can only be used in Node.js environment');\r\n }\r\n};\r\n\r\nlet isHydrating = false;\r\n", "/**\r\n * WebAssembly integration for Frontend Hamroun\r\n * Works in both browser and Node.js environments\r\n */\r\n\r\nexport interface GoWasmOptions {\r\n debug?: boolean;\r\n goWasmPath?: string;\r\n importObject?: any;\r\n onLoad?: (instance: GoWasmInstance) => void;\r\n}\r\n\r\nexport interface GoWasmInstance {\r\n instance: WebAssembly.Instance;\r\n module: WebAssembly.Module;\r\n exports: WebAssembly.Exports;\r\n functions: Record<string, Function>;\r\n}\r\n\r\n/**\r\n * Load Go WASM module in the browser (like your working frontend code)\r\n */\r\nexport async function loadGoWasm(\r\n wasmUrl: string,\r\n options: GoWasmOptions = {}\r\n): Promise<GoWasmInstance> {\r\n if (typeof window === 'undefined') {\r\n throw new Error('loadGoWasm() is for browser use only. Use loadGoWasmFromFile() in Node.js.');\r\n }\r\n\r\n try {\r\n // Check if Go WASM runtime is available (like your frontend code)\r\n if (!window.Go) {\r\n throw new Error('Go WASM runtime not available. Make sure wasm_exec.js is loaded.');\r\n }\r\n\r\n if (options.debug) {\r\n console.log('[WASM] Loading WASM from:', wasmUrl);\r\n }\r\n\r\n // Fetch the WASM file (exactly like your frontend code)\r\n const response = await fetch(wasmUrl);\r\n \r\n if (!response.ok) {\r\n throw new Error(`Failed to fetch WASM file: ${response.status}`);\r\n }\r\n\r\n const wasmBytes = await response.arrayBuffer();\r\n \r\n // Initialize Go runtime (exactly like your frontend code)\r\n const go = new window.Go();\r\n const wasmModule = await WebAssembly.instantiate(wasmBytes, go.importObject);\r\n \r\n // Run the Go program (exactly like your frontend code)\r\n go.run(wasmModule.instance);\r\n \r\n // Wait a bit for Go functions to be registered (like your frontend code)\r\n await new Promise(resolve => setTimeout(resolve, 100));\r\n \r\n if (options.debug) {\r\n console.log('[WASM] Go program started, checking for registered functions...');\r\n }\r\n\r\n // Extract exported functions from global scope (like your frontend code)\r\n const functions: Record<string, Function> = {};\r\n \r\n // Look for Go functions in global scope\r\n for (const key in window) {\r\n if (typeof window[key] === 'function' && key.startsWith('go')) {\r\n functions[key] = window[key] as Function;\r\n if (options.debug) {\r\n console.log(`[WASM] Found function: ${key}`);\r\n }\r\n }\r\n }\r\n\r\n const wasmInstance: GoWasmInstance = {\r\n instance: wasmModule.instance,\r\n module: wasmModule,\r\n exports: wasmModule.instance.exports,\r\n functions\r\n };\r\n\r\n if (options.onLoad) {\r\n options.onLoad(wasmInstance);\r\n }\r\n\r\n if (options.debug) {\r\n console.log(`[WASM] Module loaded successfully with ${Object.keys(functions).length} functions`);\r\n }\r\n\r\n return wasmInstance;\r\n\r\n } catch (error) {\r\n console.error('[WASM] Error loading Go WASM module:', error);\r\n throw error;\r\n }\r\n}\r\n\r\n/**\r\n * Call a Go WASM function (like your frontend code's callWasmFunction)\r\n */\r\nexport function callWasmFunction(funcName: string, ...args: any[]): any {\r\n if (typeof window === 'undefined') {\r\n throw new Error('callWasmFunction() is for browser use only.');\r\n }\r\n\r\n const func = (window as any)[funcName];\r\n if (typeof func !== 'function') {\r\n throw new Error(`Function ${funcName} not found. Make sure the WASM module is loaded.`);\r\n }\r\n \r\n return func(...args);\r\n}\r\n\r\n/**\r\n * Check if Go WASM is ready (like your frontend code's wasmReady state)\r\n */\r\nexport function isWasmReady(): boolean {\r\n if (typeof window === 'undefined') {\r\n return false;\r\n }\r\n\r\n // Check if Go runtime is available and at least one Go function exists\r\n return !!(window.Go && Object.keys(window).some(key => \r\n key.startsWith('go') && typeof window[key] === 'function'\r\n ));\r\n}\r\n\r\n/**\r\n * Get all available Go WASM functions\r\n */\r\nexport function getWasmFunctions(): string[] {\r\n if (typeof window === 'undefined') {\r\n return [];\r\n }\r\n\r\n return Object.keys(window).filter(key => \r\n key.startsWith('go') && typeof window[key] === 'function'\r\n );\r\n}\r\n\r\n/**\r\n * Hook for React components (like your frontend code's useEffect pattern)\r\n */\r\nexport function useGoWasm(wasmUrl: string, options: GoWasmOptions = {}) {\r\n if (typeof window === 'undefined') {\r\n throw new Error('useGoWasm() is for browser use only.');\r\n }\r\n\r\n // This would need to be implemented as a React hook in frontend-hamroun\r\n // For now, return the basic functionality\r\n return {\r\n loadWasm: () => loadGoWasm(wasmUrl, options),\r\n callFunction: callWasmFunction,\r\n isReady: isWasmReady,\r\n getFunctions: getWasmFunctions\r\n };\r\n}\r\n\r\n// Browser-specific type declarations\r\ndeclare global {\r\n interface Window {\r\n Go: new () => {\r\n importObject: any;\r\n run: (instance: WebAssembly.Instance) => void;\r\n };\r\n [key: string]: any;\r\n }\r\n}\r\n", "/**\r\n * HTML template generators for server-side rendering\r\n */\r\n\r\nexport interface DocumentOptions {\r\n title?: string;\r\n description?: string;\r\n lang?: string;\r\n charset?: string;\r\n viewport?: string;\r\n scripts?: string[];\r\n styles?: string[];\r\n meta?: Record<string, string>;\r\n bodyClasses?: string;\r\n htmlAttrs?: Record<string, string>;\r\n bodyAttrs?: Record<string, string>;\r\n initialData?: any;\r\n componentName?: string;\r\n}\r\n\r\n/**\r\n * Generate a complete HTML document\r\n */\r\nexport function generateDocument(\r\n content: string, \r\n options: DocumentOptions = {}\r\n): string {\r\n const {\r\n title = 'Frontend Hamroun App',\r\n description = '',\r\n lang = 'en',\r\n charset = 'UTF-8',\r\n viewport = 'width=device-width, initial-scale=1.0',\r\n scripts = [],\r\n styles = [],\r\n meta = {},\r\n bodyClasses = '',\r\n htmlAttrs = {},\r\n bodyAttrs = {},\r\n initialData = {},\r\n componentName = ''\r\n } = options;\r\n \r\n // Generate HTML attributes\r\n const htmlAttributes = Object.entries(htmlAttrs)\r\n .map(([key, value]) => `${key}=\"${escapeHtml(value)}\"`)\r\n .join(' ');\r\n \r\n // Generate body attributes\r\n const bodyAttributes = Object.entries(bodyAttrs)\r\n .map(([key, value]) => `${key}=\"${escapeHtml(value)}\"`)\r\n .join(' ');\r\n \r\n // Generate meta tags\r\n const metaTags = [\r\n `<meta charset=\"${charset}\">`,\r\n `<meta name=\"viewport\" content=\"${viewport}\">`,\r\n description ? `<meta name=\"description\" content=\"${escapeHtml(description)}\">` : ''\r\n ];\r\n \r\n // Add custom meta tags\r\n Object.entries(meta).forEach(([name, content]) => {\r\n metaTags.push(`<meta name=\"${escapeHtml(name)}\" content=\"${escapeHtml(content)}\">`);\r\n });\r\n \r\n // Generate script tags\r\n const scriptTags = scripts.map(src => {\r\n if (src.startsWith('<script')) {\r\n return src; // Allow inline scripts\r\n }\r\n return `<script src=\"${escapeHtml(src)}\" ${src.endsWith('.js') ? 'type=\"module\"' : ''} defer></script>`;\r\n });\r\n \r\n // Generate style tags\r\n const styleTags = styles.map(href => {\r\n if (href.startsWith('<style')) {\r\n return href; // Allow inline styles\r\n }\r\n return `<link rel=\"stylesheet\" href=\"${escapeHtml(href)}\">`;\r\n });\r\n \r\n // Create initial data script\r\n const initialDataScript = Object.keys(initialData).length > 0 ? \r\n `<script id=\"__APP_DATA__\" type=\"application/json\">${escapeHtml(JSON.stringify(initialData))}</script>` : '';\r\n \r\n // Create the complete HTML document\r\n return `<!DOCTYPE html>\r\n<html lang=\"${lang}\" ${htmlAttributes}>\r\n<head>\r\n ${metaTags.filter(Boolean).join('\\n ')}\r\n <title>${escapeHtml(title)}</title>\r\n ${styleTags.join('\\n ')}\r\n</head>\r\n<body class=\"${bodyClasses}\" ${bodyAttributes}>\r\n <div id=\"app-root\" data-ssr-root${componentName ? ` data-component=\"${escapeHtml(componentName)}\"` : ''}>${content}</div>\r\n ${initialDataScript}\r\n ${scriptTags.join('\\n ')}\r\n</body>\r\n</html>`;\r\n}\r\n\r\n/**\r\n * Generate an error page\r\n */\r\nexport function generateErrorPage(\r\n statusCode: number, \r\n message: string, \r\n error?: Error\r\n): string {\r\n const errorMessages: Record<number, string> = {\r\n 400: 'Bad Request',\r\n 401: 'Unauthorized',\r\n 403: 'Forbidden',\r\n 404: 'Not Found',\r\n 500: 'Internal Server Error'\r\n };\r\n \r\n const title = `${statusCode} - ${errorMessages[statusCode] || 'Error'}`;\r\n \r\n // Generate error details (only in development)\r\n const isDev = process.env.NODE_ENV !== 'production';\r\n const errorDetails = isDev && error ? `\r\n <div class=\"error-details\">\r\n <pre>${escapeHtml(error.stack || error.message)}</pre>\r\n </div>\r\n ` : '';\r\n \r\n // Create error content\r\n const content = `\r\n <div class=\"error-container\">\r\n <h1>${statusCode}</h1>\r\n <h2>${escapeHtml(errorMessages[statusCode] || 'Error')}</h2>\r\n <p>${escapeHtml(message)}</p>\r\n ${errorDetails}\r\n <a href=\"/\" class=\"home-link\">Back to Home</a>\r\n </div>\r\n `;\r\n \r\n // Add error page styling\r\n const styles = [`<style>\r\n body {\r\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n min-height: 100vh;\r\n margin: 0;\r\n background-color: #f7f7f7;\r\n color: #333;\r\n }\r\n .error-container {\r\n text-align: center;\r\n padding: 2rem;\r\n border-radius: 8px;\r\n background-color: white;\r\n box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);\r\n max-width: 600px;\r\n width: 100%;\r\n }\r\n h1 {\r\n font-size: 6rem;\r\n margin: 0;\r\n color: #e74c3c;\r\n }\r\n h2 {\r\n margin-top: 0;\r\n margin-bottom: 1rem;\r\n color: #333;\r\n }\r\n .error-details {\r\n text-align: left;\r\n margin: 2rem 0;\r\n padding: 1rem;\r\n background-color: #f8f8f8;\r\n border-radius: 4px;\r\n overflow: auto;\r\n }\r\n pre {\r\n margin: 0;\r\n font-family: monospace;\r\n font-size: 0.85rem;\r\n white-space: pre-wrap;\r\n }\r\n .home-link {\r\n display: inline-block;\r\n margin-top: 1.5rem;\r\n padding: 0.75rem 1.5rem;\r\n background-color: #3498db;\r\n color: white;\r\n text-decoration: none;\r\n border-radius: 4px;\r\n transition: background-color 0.2s;\r\n }\r\n .home-link:hover {\r\n background-color: #2980b9;\r\n }\r\n </style>`];\r\n \r\n return generateDocument(content, {\r\n title,\r\n description: `Error ${statusCode}: ${errorMessages[statusCode] || 'Error'}`,\r\n bodyClasses: 'error-page',\r\n styles\r\n });\r\n}\r\n\r\n/**\r\n * Generate a loading page\r\n */\r\nexport function generateLoadingPage(message: string = 'Loading...'): string {\r\n const content = `\r\n <div class=\"loading-container\">\r\n <div class=\"spinner\"></div>\r\n <p>${escapeHtml(message)}</p>\r\n </div>\r\n `;\r\n \r\n const styles = [`<style>\r\n body {\r\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n min-height: 100vh;\r\n margin: 0;\r\n background-color: #f7f7f7;\r\n color: #333;\r\n }\r\n .loading-container {\r\n text-align: center;\r\n }\r\n .spinner {\r\n width: 50px;\r\n height: 50px;\r\n border: 5px solid rgba(0, 0, 0, 0.1);\r\n border-radius: 50%;\r\n border-top-color: #3498db;\r\n animation: spin 1s ease-in-out infinite;\r\n margin: 0 auto 20px;\r\n }\r\n @keyframes spin {\r\n to { transform: rotate(360deg); }\r\n }\r\n </style>`];\r\n \r\n return generateDocument(content, {\r\n title: 'Loading',\r\n bodyClasses: 'loading-page',\r\n styles\r\n });\r\n}\r\n\r\n/**\r\n * Escape HTML special characters\r\n */\r\nfunction escapeHtml(text: string): string {\r\n return String(text)\r\n .replace(/&/g, '&')\r\n .replace(/</g, '<')\r\n .replace(/>/g, '>')\r\n .replace(/\"/g, '"')\r\n .replace(/'/g, ''');\r\n}\r\n", "/**\r\n * Browser-only entry point for baraqex\r\n * This file excludes all server dependencies to ensure browser compatibility\r\n */\r\n\r\n// Re-export everything from frontend-hamroun\r\nexport * from 'frontend-hamroun';\r\n\r\n// Export browser-compatible WASM functionality\r\nexport { loadGoWasm, callWasmFunction, isWasmReady, getWasmFunctions, useGoWasm } from './wasm.js';\r\n\r\n// Export type definitions (safe for all environments)\r\nexport type { GoWasmOptions, GoWasmInstance } from './server/types.js';\r\n\r\n// Export basic template utilities (no server dependencies)\r\nexport { generateDocument, generateErrorPage, generateLoadingPage } from './server/templates.js';\r\n\r\n// Simple renderToString function for browser SSR compatibility\r\nexport function renderToString(content: any): Promise<string> {\r\n if (typeof content === 'string') {\r\n return Promise.resolve(content);\r\n }\r\n if (typeof content === 'function') {\r\n try {\r\n const result = content();\r\n return Promise.resolve(String(result));\r\n } catch (error) {\r\n return Promise.resolve(`<!-- Error rendering: ${error} -->`);\r\n }\r\n }\r\n return Promise.resolve(String(content));\r\n}\r\n\r\n// Browser-compatible utility functions\r\nexport function generateToken(length: number = 32): string {\r\n const array = new Uint8Array(length);\r\n if (typeof crypto !== 'undefined' && crypto.getRandomValues) {\r\n crypto.getRandomValues(array);\r\n } else {\r\n // Fallback for environments without crypto\r\n for (let i = 0; i < array.length; i++) {\r\n array[i] = Math.floor(Math.random() * 256);\r\n }\r\n }\r\n return Array.from(array, byte => byte.toString(16).padStart(2, '0')).join('');\r\n}\r\n\r\nexport function safeJsonParse<T>(json: string, fallback: T): T {\r\n try {\r\n return JSON.parse(json) as T;\r\n } catch (error) {\r\n return fallback;\r\n }\r\n}\r\n\r\n// Browser environment detection\r\nexport const isBrowser = typeof window !== 'undefined';\r\nexport const isNode = false; // Always false in browser build\r\n\r\nconsole.log('Baraqex - Browser version loaded');\r\n"],
|
|
4
|
+
"sourcesContent": ["export let isBatching = false;\r\nconst queue: Function[] = [];\r\n\r\nexport function batchUpdates(fn: Function) {\r\n if (isBatching) {\r\n queue.push(fn);\r\n return;\r\n }\r\n\r\n isBatching = true;\r\n try {\r\n fn();\r\n while (queue.length > 0) {\r\n const nextFn = queue.shift();\r\n nextFn?.();\r\n }\r\n } finally {\r\n isBatching = false;\r\n }\r\n}\r\n\r\nexport function getIsBatching() {\r\n return isBatching;\r\n}\r\n", "import { createElement } from './jsx-runtime';\r\nimport { batchUpdates, isBatching } from './batch';\r\nimport { diff } from './vdom';\r\n\r\nlet currentRender: number = 0;\r\nconst states = new Map<number, any[]>();\r\nconst stateIndices = new Map<number, number>();\r\nconst effects = new Map<number, Effect[]>();\r\nconst memos = new Map<number, { value: any; deps: any[] }[]>();\r\nconst refs = new Map<number, any[]>();\r\n\r\ninterface Effect {\r\n cleanup?: () => void;\r\n deps?: any[];\r\n}\r\n\r\n// Add at the top with other declarations\r\nlet globalRenderCallback: ((element: any, container: HTMLElement) => void) | null = null;\r\nlet globalContainer: HTMLElement | null = null;\r\nlet currentElement: any = null;\r\n\r\nconst isServer = typeof window === 'undefined';\r\nconst serverStates = new Map<number, any>();\r\n\r\nexport function setRenderCallback(\r\n callback: (element: any, container: HTMLElement) => void,\r\n element: any,\r\n container: HTMLElement\r\n) {\r\n globalRenderCallback = callback;\r\n globalContainer = container;\r\n currentElement = element;\r\n}\r\n\r\nexport function prepareRender() {\r\n currentRender++;\r\n stateIndices.set(currentRender, 0);\r\n return currentRender;\r\n}\r\n\r\nexport function finishRender() {\r\n if (isServer) {\r\n serverStates.delete(currentRender);\r\n }\r\n currentRender = 0;\r\n}\r\n\r\nexport function useState<T>(initial: T): [T, (value: T | ((prev: T) => T)) => void] {\r\n if (!currentRender) {\r\n throw new Error('useState must be called within a render');\r\n }\r\n\r\n if (isServer) {\r\n // Server-side state handling\r\n if (!serverStates.has(currentRender)) {\r\n serverStates.set(currentRender, new Map());\r\n }\r\n const componentState = serverStates.get(currentRender)!;\r\n const index = stateIndices.get(currentRender) || 0;\r\n \r\n if (!componentState.has(index)) {\r\n componentState.set(index, initial);\r\n }\r\n\r\n const state = componentState.get(index);\r\n const setState = (newValue: T | ((prev: T) => T)) => {\r\n // No-op for server-side\r\n };\r\n\r\n stateIndices.set(currentRender, index + 1);\r\n return [state, setState];\r\n }\r\n\r\n if (!states.has(currentRender)) {\r\n states.set(currentRender, []);\r\n }\r\n\r\n const componentStates = states.get(currentRender)!;\r\n const index = stateIndices.get(currentRender)!;\r\n \r\n if (index >= componentStates.length) {\r\n componentStates.push(initial);\r\n }\r\n\r\n const state = componentStates[index];\r\n const setState = (newValue: T | ((prev: T) => T)) => {\r\n const nextValue = typeof newValue === 'function' \r\n ? (newValue as Function)(componentStates[index])\r\n : newValue;\r\n\r\n if (componentStates[index] === nextValue) return; // Skip if value hasn't changed\r\n \r\n componentStates[index] = nextValue;\r\n \r\n if (isBatching) {\r\n batchUpdates(() => rerender(currentRender));\r\n } else {\r\n rerender(currentRender);\r\n }\r\n };\r\n\r\n stateIndices.set(currentRender, index + 1);\r\n return [state, setState];\r\n}\r\n\r\nexport function useEffect(callback: () => (() => void) | void, deps?: any[]) {\r\n if (!currentRender) throw new Error('useEffect must be called within a render');\r\n \r\n const effectIndex = stateIndices.get(currentRender)!;\r\n \r\n if (!effects.has(currentRender)) {\r\n effects.set(currentRender, []);\r\n }\r\n\r\n const componentEffects = effects.get(currentRender)!;\r\n const prevEffect = componentEffects[effectIndex];\r\n \r\n // Run effect if deps changed\r\n if (!prevEffect || !deps || !prevEffect.deps || \r\n deps.some((dep, i) => dep !== prevEffect.deps![i])) {\r\n \r\n // Cleanup previous effect\r\n if (prevEffect?.cleanup) {\r\n prevEffect.cleanup();\r\n }\r\n\r\n // Schedule new effect\r\n queueMicrotask(() => {\r\n const cleanup = callback() || undefined;\r\n componentEffects[effectIndex] = { cleanup: cleanup, deps };\r\n });\r\n }\r\n \r\n stateIndices.set(currentRender, effectIndex + 1);\r\n}\r\n\r\nexport function useMemo<T>(factory: () => T, deps: any[]): T {\r\n if (!currentRender) throw new Error('useMemo must be called within a render');\r\n \r\n const memoIndex = stateIndices.get(currentRender)!;\r\n \r\n if (!memos.has(currentRender)) {\r\n memos.set(currentRender, []);\r\n }\r\n\r\n const componentMemos = memos.get(currentRender)!;\r\n const prevMemo = componentMemos[memoIndex];\r\n \r\n if (!prevMemo || (deps && deps.some((dep, i) => !Object.is(dep, prevMemo.deps[i])))) {\r\n const value = factory();\r\n componentMemos[memoIndex] = { value, deps };\r\n stateIndices.set(currentRender, memoIndex + 1);\r\n return value;\r\n }\r\n\r\n stateIndices.set(currentRender, memoIndex + 1);\r\n return prevMemo.value;\r\n}\r\n\r\nexport function useRef<T>(initial: T) {\r\n if (!currentRender) throw new Error('useRef must be called within a render');\r\n \r\n const refIndex = stateIndices.get(currentRender)!;\r\n \r\n if (!refs.has(currentRender)) {\r\n refs.set(currentRender, []);\r\n }\r\n\r\n const componentRefs = refs.get(currentRender)!;\r\n if (refIndex >= componentRefs.length) {\r\n // Initialize with an object that has a current property\r\n const ref = { current: initial };\r\n componentRefs.push(ref);\r\n stateIndices.set(currentRender, refIndex + 1);\r\n return ref;\r\n }\r\n\r\n const ref = componentRefs[refIndex];\r\n stateIndices.set(currentRender, refIndex + 1);\r\n return ref;\r\n}\r\n\r\n// Add a map to track component DOM nodes\r\nconst componentNodes = new Map<Function, Node>();\r\n\r\nasync function rerender(rendererId: number) {\r\n try {\r\n // Clean up effects\r\n const componentEffects = effects.get(rendererId);\r\n if (componentEffects) {\r\n componentEffects.forEach(effect => {\r\n if (effect.cleanup) effect.cleanup();\r\n });\r\n effects.set(rendererId, []);\r\n }\r\n\r\n if (globalRenderCallback && globalContainer && currentElement) {\r\n await globalRenderCallback(currentElement, globalContainer);\r\n }\r\n } catch (error) {\r\n console.error('Error during rerender:', error);\r\n }\r\n}\r\n\r\n// Add new hook for error boundaries\r\nexport function useErrorBoundary(): [Error | null, () => void] {\r\n const [error, setError] = useState<Error | null>(null);\r\n return [error, () => setError(null)];\r\n}\r\n\r\n// Remove withHooks export\r\n", "\r\n\r\nconst contexts = new Map<symbol, any>();\r\nlet currentRender: Function | null = null;\r\n\r\nexport interface Context<T> {\r\n Provider: (props: { value: T; children?: any }) => any;\r\n Consumer: (props: { children: (value: T) => any }) => any;\r\n _id: symbol;\r\n useSelector: <S>(selector: (state: T) => S) => S;\r\n}\r\n\r\nexport function createContext<T>(defaultValue: T): Context<T> {\r\n const context = {\r\n Provider: ({ value, children }: { value: T, children?: any }) => {\r\n return children;\r\n },\r\n Consumer: ({ children }: { children: (value: T) => any }) => {\r\n return children(defaultValue);\r\n },\r\n _id: Symbol(),\r\n useSelector: <S>(selector: (state: T) => S) => {\r\n return selector(defaultValue);\r\n }\r\n };\r\n\r\n return context;\r\n}\r\n\r\nexport function useContext<T>(context: any): T {\r\n return context;\r\n}\r\n", "import type { Component } from './component';\r\n\r\ninterface VNode {\r\n type: string | Function;\r\n props: Record<string, any>;\r\n}\r\n\r\nfunction jsx(type: string | Function, props: any): VNode {\r\n console.log('JSX Transform:', { type, props });\r\n const processedProps = { ...props };\r\n \r\n // Handle children properly\r\n if (arguments.length > 2) {\r\n processedProps.children = Array.prototype.slice.call(arguments, 2);\r\n }\r\n \r\n return { type, props: processedProps };\r\n}\r\n\r\nconst Fragment = ({ children }: { children: any }) => children;\r\n\r\nasync function createElement(vnode: VNode | any): Promise<Node> {\r\n console.log('Creating element from:', vnode);\r\n\r\n // Handle primitives and null\r\n if (vnode == null) {\r\n return document.createTextNode('');\r\n }\r\n \r\n if (typeof vnode === 'boolean') {\r\n return document.createTextNode('');\r\n }\r\n\r\n if (typeof vnode === 'number' || typeof vnode === 'string') {\r\n return document.createTextNode(String(vnode));\r\n }\r\n\r\n // Handle arrays\r\n if (Array.isArray(vnode)) {\r\n const fragment = document.createDocumentFragment();\r\n for (const child of vnode) {\r\n const node = await createElement(child);\r\n fragment.appendChild(node);\r\n }\r\n return fragment;\r\n }\r\n\r\n // Handle VNode\r\n if ('type' in vnode && vnode.props !== undefined) {\r\n const { type, props } = vnode;\r\n \r\n // Handle function components\r\n if (typeof type === 'function') {\r\n try {\r\n const result = await type(props || {});\r\n const node = await createElement(result);\r\n if (node instanceof Element) {\r\n node.setAttribute('data-component-id', type.name || type.toString());\r\n }\r\n return node;\r\n } catch (error) {\r\n console.error('Error rendering component:', error);\r\n return document.createTextNode('');\r\n }\r\n }\r\n\r\n // Create DOM element\r\n const element = document.createElement(type as string);\r\n \r\n // Handle props\r\n for (const [key, value] of Object.entries(props || {})) {\r\n if (key === 'children') continue;\r\n if (key.startsWith('on') && typeof value === 'function') {\r\n const eventName = key.toLowerCase().slice(2);\r\n // Remove existing event listener if any\r\n const existingHandler = (element as any).__events?.[eventName];\r\n if (existingHandler) {\r\n element.removeEventListener(eventName, existingHandler);\r\n }\r\n \r\n // Add new event listener\r\n element.addEventListener(eventName, value as EventListener);\r\n if (!(element as any).__events) {\r\n (element as any).__events = {};\r\n }\r\n (element as any).__events[eventName] = value;\r\n } else if (key === 'style' && typeof value === 'object') {\r\n Object.assign(element.style, value);\r\n } else if (key === 'className') {\r\n element.setAttribute('class', String(value));\r\n } else if (key !== 'key' && key !== 'ref') {\r\n element.setAttribute(key, String(value));\r\n }\r\n }\r\n\r\n // Handle children\r\n const children = props?.children;\r\n if (children != null) {\r\n const childArray = Array.isArray(children) ? children.flat() : [children];\r\n for (const child of childArray) {\r\n const childNode = await createElement(child);\r\n element.appendChild(childNode);\r\n }\r\n }\r\n\r\n return element;\r\n }\r\n\r\n // Handle other objects by converting to string\r\n return document.createTextNode(String(vnode));\r\n}\r\n\r\n// Export named functions and aliases without duplicates\r\nexport {\r\n jsx,\r\n jsx as jsxs,\r\n jsx as jsxDEV,\r\n Fragment,\r\n createElement\r\n};\r\n\r\n// Named exports object\r\nconst jsxRuntime = {\r\n jsx,\r\n jsxs: jsx,\r\n jsxDEV: jsx,\r\n Fragment,\r\n createElement\r\n};\r\n\r\nexport default jsxRuntime;\r\n", "import { createElement } from './jsx-runtime';\r\nimport { prepareRender, finishRender, setRenderCallback } from './hooks';\r\nimport { batchUpdates } from './batch';\r\n\r\nlet isHydrating = false;\r\n\r\nexport async function hydrate(element: any, container: HTMLElement) {\r\n isHydrating = true;\r\n try {\r\n await render(element, container);\r\n } finally {\r\n isHydrating = false;\r\n }\r\n}\r\n\r\nexport async function render(element: any, container: HTMLElement) {\r\n console.log('Rendering to:', container.id);\r\n \r\n batchUpdates(async () => {\r\n const rendererId = prepareRender();\r\n try {\r\n setRenderCallback(render, element, container);\r\n const domNode = await createElement(element);\r\n \r\n if (!isHydrating) {\r\n container.innerHTML = '';\r\n }\r\n container.appendChild(domNode);\r\n \r\n } finally {\r\n finishRender();\r\n }\r\n });\r\n}\r\n", "import { VNode, Component } from './types';\r\nimport { prepareRender, finishRender } from './hooks';\r\n\r\n/**\r\n * Renders a virtual DOM tree to an HTML string\r\n */\r\nexport function renderToString(vnode: VNode): string {\r\n // Reset hook state for this render\r\n prepareRender();\r\n \r\n // Render the tree to HTML\r\n const html = renderNodeToString(vnode);\r\n \r\n // Clean up after rendering\r\n finishRender();\r\n \r\n return html;\r\n}\r\n\r\n/**\r\n * Internal function to convert a virtual node to an HTML string\r\n */\r\nfunction renderNodeToString(vnode: VNode | string | number | boolean | null | undefined): string {\r\n // Handle primitive values\r\n if (vnode === null || vnode === undefined) return '';\r\n if (typeof vnode === 'boolean') return '';\r\n if (typeof vnode === 'number' || typeof vnode === 'string') return escapeHtml(String(vnode));\r\n \r\n // Handle function components\r\n if (typeof vnode.type === 'function') {\r\n const Component = vnode.type as Component;\r\n const renderedNode = Component(vnode.props || {});\r\n return renderNodeToString(renderedNode);\r\n }\r\n \r\n // Handle intrinsic elements (regular HTML tags)\r\n if (typeof vnode.type === 'string') {\r\n const tag = vnode.type;\r\n let attrs = '';\r\n let children = '';\r\n \r\n // Convert props to HTML attributes\r\n if (vnode.props) {\r\n for (const [key, value] of Object.entries(vnode.props)) {\r\n // Skip children prop as we handle it separately\r\n if (key === 'children') continue;\r\n \r\n // Skip event handlers (they start with 'on')\r\n if (key.startsWith('on')) continue;\r\n \r\n // Handle the className prop specially\r\n if (key === 'className') {\r\n attrs += ` class=\"${escapeHtml(value as string)}\"`;\r\n continue;\r\n }\r\n \r\n // Handle other attributes\r\n if (typeof value === 'string' || typeof value === 'number') {\r\n attrs += ` ${key}=\"${escapeHtml(String(value))}\"`;\r\n } else if (value === true) {\r\n // Boolean attributes\r\n attrs += ` ${key}`;\r\n }\r\n }\r\n }\r\n \r\n // Process children\r\n const childrenArray = (vnode.props?.children) \r\n ? Array.isArray(vnode.props.children) \r\n ? vnode.props.children \r\n : [vnode.props.children]\r\n : [];\r\n \r\n for (const child of childrenArray) {\r\n children += renderNodeToString(child);\r\n }\r\n \r\n // Self-closing tags\r\n const selfClosing = [\r\n 'area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input',\r\n 'link', 'meta', 'param', 'source', 'track', 'wbr'\r\n ];\r\n \r\n if (selfClosing.includes(tag)) {\r\n return `<${tag}${attrs}/>`;\r\n }\r\n \r\n // Regular tags with closing\r\n return `<${tag}${attrs}>${children}</${tag}>`;\r\n }\r\n \r\n // Handle fragments\r\n if (vnode.type === Symbol.for('react.fragment')) {\r\n let fragmentOutput = '';\r\n const children = Array.isArray(vnode.props?.children)\r\n ? vnode.props.children\r\n : vnode.props?.children ? [vnode.props.children] : [];\r\n \r\n for (const child of children) {\r\n fragmentOutput += renderNodeToString(child);\r\n }\r\n \r\n return fragmentOutput;\r\n }\r\n \r\n // Fallback for unknown node types\r\n console.warn('Unknown vnode type:', vnode.type);\r\n return '';\r\n}\r\n\r\n/**\r\n * Escape HTML special characters to prevent XSS\r\n */\r\nfunction escapeHtml(text: string): string {\r\n return text\r\n .replace(/&/g, '&')\r\n .replace(/</g, '<')\r\n .replace(/>/g, '>')\r\n .replace(/\"/g, '"')\r\n .replace(/'/g, ''');\r\n}\r\n", "import { createElement } from './jsx-runtime';\r\nimport { prepareRender, finishRender, setRenderCallback } from './hooks';\r\n\r\nexport { \r\n useState, \r\n useEffect, \r\n useMemo, \r\n useRef,\r\n useErrorBoundary \r\n} from './hooks';\r\n\r\nexport { createContext, useContext } from './context';\r\nexport { batchUpdates } from './batch';\r\nexport { jsx, jsxs, Fragment } from './jsx-runtime';\r\nexport { render, hydrate } from './renderer';\r\nexport { renderToString } from './server-renderer';\r\n\r\n// Re-export types for client-side usage\r\nexport type { Context } from './context';\r\nexport type { VNode } from './types';\r\n\r\n// Export server types for type checking\r\nexport type {\r\n Server,\r\n ServerConfig,\r\n User,\r\n DbConfig,\r\n MiddlewareFunction\r\n} from './server-types';\r\n\r\n// Provide placeholder server functionality\r\nexport const server = {\r\n async getServer() {\r\n throw new Error('Server module can only be used in Node.js environment');\r\n }\r\n};\r\n\r\nlet isHydrating = false;\r\n", "/**\r\n * WebAssembly integration for Frontend Hamroun\r\n * Works in both browser and Node.js environments\r\n */\r\n\r\nexport interface GoWasmOptions {\r\n debug?: boolean;\r\n goWasmPath?: string;\r\n importObject?: any;\r\n onLoad?: (instance: GoWasmInstance) => void;\r\n}\r\n\r\nexport interface GoWasmInstance {\r\n instance: WebAssembly.Instance;\r\n module: WebAssembly.Module;\r\n exports: WebAssembly.Exports;\r\n functions: Record<string, Function>;\r\n}\r\n\r\n/**\r\n * Load Go WASM module in the browser (like your working frontend code)\r\n */\r\nexport async function loadGoWasm(\r\n wasmUrl: string,\r\n options: GoWasmOptions = {}\r\n): Promise<GoWasmInstance> {\r\n if (typeof window === 'undefined') {\r\n throw new Error('loadGoWasm() is for browser use only. Use loadGoWasmFromFile() in Node.js.');\r\n }\r\n\r\n try {\r\n // Check if Go WASM runtime is available (like your frontend code)\r\n if (!window.Go) {\r\n throw new Error('Go WASM runtime not available. Make sure wasm_exec.js is loaded.');\r\n }\r\n\r\n if (options.debug) {\r\n console.log('[WASM] Loading WASM from:', wasmUrl);\r\n }\r\n\r\n // Fetch the WASM file (exactly like your frontend code)\r\n const response = await fetch(wasmUrl);\r\n \r\n if (!response.ok) {\r\n throw new Error(`Failed to fetch WASM file: ${response.status}`);\r\n }\r\n\r\n const wasmBytes = await response.arrayBuffer();\r\n \r\n // Initialize Go runtime (exactly like your frontend code)\r\n const go = new window.Go();\r\n const wasmModule = await WebAssembly.instantiate(wasmBytes, go.importObject);\r\n \r\n // Run the Go program (exactly like your frontend code)\r\n go.run(wasmModule.instance);\r\n \r\n // Wait a bit for Go functions to be registered (like your frontend code)\r\n await new Promise(resolve => setTimeout(resolve, 100));\r\n \r\n if (options.debug) {\r\n console.log('[WASM] Go program started, checking for registered functions...');\r\n }\r\n\r\n // Extract exported functions from global scope (like your frontend code)\r\n const functions: Record<string, Function> = {};\r\n \r\n // Look for Go functions in global scope\r\n for (const key in window) {\r\n if (typeof window[key] === 'function' && key.startsWith('go')) {\r\n functions[key] = window[key] as Function;\r\n if (options.debug) {\r\n console.log(`[WASM] Found function: ${key}`);\r\n }\r\n }\r\n }\r\n\r\n const wasmInstance: GoWasmInstance = {\r\n instance: wasmModule.instance,\r\n module: wasmModule,\r\n exports: wasmModule.instance.exports,\r\n functions\r\n };\r\n\r\n if (options.onLoad) {\r\n options.onLoad(wasmInstance);\r\n }\r\n\r\n if (options.debug) {\r\n console.log(`[WASM] Module loaded successfully with ${Object.keys(functions).length} functions`);\r\n }\r\n\r\n return wasmInstance;\r\n\r\n } catch (error) {\r\n console.error('[WASM] Error loading Go WASM module:', error);\r\n throw error;\r\n }\r\n}\r\n\r\n/**\r\n * Call a Go WASM function (like your frontend code's callWasmFunction)\r\n */\r\nexport function callWasmFunction(funcName: string, ...args: any[]): any {\r\n if (typeof window === 'undefined') {\r\n throw new Error('callWasmFunction() is for browser use only.');\r\n }\r\n\r\n const func = (window as any)[funcName];\r\n if (typeof func !== 'function') {\r\n throw new Error(`Function ${funcName} not found. Make sure the WASM module is loaded.`);\r\n }\r\n \r\n return func(...args);\r\n}\r\n\r\n/**\r\n * Check if Go WASM is ready (like your frontend code's wasmReady state)\r\n */\r\nexport function isWasmReady(): boolean {\r\n if (typeof window === 'undefined') {\r\n return false;\r\n }\r\n\r\n // Check if Go runtime is available and at least one Go function exists\r\n return !!(window.Go && Object.keys(window).some(key => \r\n key.startsWith('go') && typeof window[key] === 'function'\r\n ));\r\n}\r\n\r\n/**\r\n * Get all available Go WASM functions\r\n */\r\nexport function getWasmFunctions(): string[] {\r\n if (typeof window === 'undefined') {\r\n return [];\r\n }\r\n\r\n return Object.keys(window).filter(key => \r\n key.startsWith('go') && typeof window[key] === 'function'\r\n );\r\n}\r\n\r\n/**\r\n * Hook for React components (like your frontend code's useEffect pattern)\r\n */\r\nexport function useGoWasm(wasmUrl: string, options: GoWasmOptions = {}) {\r\n if (typeof window === 'undefined') {\r\n throw new Error('useGoWasm() is for browser use only.');\r\n }\r\n\r\n // This would need to be implemented as a React hook in frontend-hamroun\r\n // For now, return the basic functionality\r\n return {\r\n loadWasm: () => loadGoWasm(wasmUrl, options),\r\n callFunction: callWasmFunction,\r\n isReady: isWasmReady,\r\n getFunctions: getWasmFunctions\r\n };\r\n}\r\n\r\n// Browser-specific type declarations\r\ndeclare global {\r\n interface Window {\r\n Go: new () => {\r\n importObject: any;\r\n run: (instance: WebAssembly.Instance) => void;\r\n };\r\n [key: string]: any;\r\n }\r\n}\r\n", "/**\r\n * HTML template generators for server-side rendering\r\n */\r\n\r\nexport interface DocumentOptions {\r\n title?: string;\r\n description?: string;\r\n lang?: string;\r\n charset?: string;\r\n viewport?: string;\r\n scripts?: string[];\r\n styles?: string[];\r\n meta?: Record<string, string>;\r\n bodyClasses?: string;\r\n htmlAttrs?: Record<string, string>;\r\n bodyAttrs?: Record<string, string>;\r\n initialData?: any;\r\n componentName?: string;\r\n}\r\n\r\n/**\r\n * Generate a complete HTML document\r\n */\r\nexport function generateDocument(\r\n content: string, \r\n options: DocumentOptions = {}\r\n): string {\r\n const {\r\n title = 'Frontend Hamroun App',\r\n description = '',\r\n lang = 'en',\r\n charset = 'UTF-8',\r\n viewport = 'width=device-width, initial-scale=1.0',\r\n scripts = [],\r\n styles = [],\r\n meta = {},\r\n bodyClasses = '',\r\n htmlAttrs = {},\r\n bodyAttrs = {},\r\n initialData = {},\r\n componentName = ''\r\n } = options;\r\n \r\n // Generate HTML attributes\r\n const htmlAttributes = Object.entries(htmlAttrs)\r\n .map(([key, value]) => `${key}=\"${escapeHtml(value)}\"`)\r\n .join(' ');\r\n \r\n // Generate body attributes\r\n const bodyAttributes = Object.entries(bodyAttrs)\r\n .map(([key, value]) => `${key}=\"${escapeHtml(value)}\"`)\r\n .join(' ');\r\n \r\n // Generate meta tags\r\n const metaTags = [\r\n `<meta charset=\"${charset}\">`,\r\n `<meta name=\"viewport\" content=\"${viewport}\">`,\r\n description ? `<meta name=\"description\" content=\"${escapeHtml(description)}\">` : ''\r\n ];\r\n \r\n // Add custom meta tags\r\n Object.entries(meta).forEach(([name, content]) => {\r\n metaTags.push(`<meta name=\"${escapeHtml(name)}\" content=\"${escapeHtml(content)}\">`);\r\n });\r\n \r\n // Generate script tags\r\n const scriptTags = scripts.map(src => {\r\n if (src.startsWith('<script')) {\r\n return src; // Allow inline scripts\r\n }\r\n return `<script src=\"${escapeHtml(src)}\" ${src.endsWith('.js') ? 'type=\"module\"' : ''} defer></script>`;\r\n });\r\n \r\n // Generate style tags\r\n const styleTags = styles.map(href => {\r\n if (href.startsWith('<style')) {\r\n return href; // Allow inline styles\r\n }\r\n return `<link rel=\"stylesheet\" href=\"${escapeHtml(href)}\">`;\r\n });\r\n \r\n // Create initial data script\r\n const initialDataScript = Object.keys(initialData).length > 0 ? \r\n `<script id=\"__APP_DATA__\" type=\"application/json\">${escapeHtml(JSON.stringify(initialData))}</script>` : '';\r\n \r\n // Create the complete HTML document\r\n return `<!DOCTYPE html>\r\n<html lang=\"${lang}\" ${htmlAttributes}>\r\n<head>\r\n ${metaTags.filter(Boolean).join('\\n ')}\r\n <title>${escapeHtml(title)}</title>\r\n ${styleTags.join('\\n ')}\r\n</head>\r\n<body class=\"${bodyClasses}\" ${bodyAttributes}>\r\n <div id=\"app-root\" data-ssr-root${componentName ? ` data-component=\"${escapeHtml(componentName)}\"` : ''}>${content}</div>\r\n ${initialDataScript}\r\n ${scriptTags.join('\\n ')}\r\n</body>\r\n</html>`;\r\n}\r\n\r\n/**\r\n * Generate an error page\r\n */\r\nexport function generateErrorPage(\r\n statusCode: number, \r\n message: string, \r\n error?: Error\r\n): string {\r\n const errorMessages: Record<number, string> = {\r\n 400: 'Bad Request',\r\n 401: 'Unauthorized',\r\n 403: 'Forbidden',\r\n 404: 'Not Found',\r\n 500: 'Internal Server Error'\r\n };\r\n \r\n const title = `${statusCode} - ${errorMessages[statusCode] || 'Error'}`;\r\n \r\n // Generate error details (only in development)\r\n const isDev = process.env.NODE_ENV !== 'production';\r\n const errorDetails = isDev && error ? `\r\n <div class=\"error-details\">\r\n <pre>${escapeHtml(error.stack || error.message)}</pre>\r\n </div>\r\n ` : '';\r\n \r\n // Create error content\r\n const content = `\r\n <div class=\"error-container\">\r\n <h1>${statusCode}</h1>\r\n <h2>${escapeHtml(errorMessages[statusCode] || 'Error')}</h2>\r\n <p>${escapeHtml(message)}</p>\r\n ${errorDetails}\r\n <a href=\"/\" class=\"home-link\">Back to Home</a>\r\n </div>\r\n `;\r\n \r\n // Add error page styling\r\n const styles = [`<style>\r\n body {\r\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n min-height: 100vh;\r\n margin: 0;\r\n background-color: #f7f7f7;\r\n color: #333;\r\n }\r\n .error-container {\r\n text-align: center;\r\n padding: 2rem;\r\n border-radius: 8px;\r\n background-color: white;\r\n box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);\r\n max-width: 600px;\r\n width: 100%;\r\n }\r\n h1 {\r\n font-size: 6rem;\r\n margin: 0;\r\n color: #e74c3c;\r\n }\r\n h2 {\r\n margin-top: 0;\r\n margin-bottom: 1rem;\r\n color: #333;\r\n }\r\n .error-details {\r\n text-align: left;\r\n margin: 2rem 0;\r\n padding: 1rem;\r\n background-color: #f8f8f8;\r\n border-radius: 4px;\r\n overflow: auto;\r\n }\r\n pre {\r\n margin: 0;\r\n font-family: monospace;\r\n font-size: 0.85rem;\r\n white-space: pre-wrap;\r\n }\r\n .home-link {\r\n display: inline-block;\r\n margin-top: 1.5rem;\r\n padding: 0.75rem 1.5rem;\r\n background-color: #3498db;\r\n color: white;\r\n text-decoration: none;\r\n border-radius: 4px;\r\n transition: background-color 0.2s;\r\n }\r\n .home-link:hover {\r\n background-color: #2980b9;\r\n }\r\n </style>`];\r\n \r\n return generateDocument(content, {\r\n title,\r\n description: `Error ${statusCode}: ${errorMessages[statusCode] || 'Error'}`,\r\n bodyClasses: 'error-page',\r\n styles\r\n });\r\n}\r\n\r\n/**\r\n * Generate a loading page\r\n */\r\nexport function generateLoadingPage(message: string = 'Loading...'): string {\r\n const content = `\r\n <div class=\"loading-container\">\r\n <div class=\"spinner\"></div>\r\n <p>${escapeHtml(message)}</p>\r\n </div>\r\n `;\r\n \r\n const styles = [`<style>\r\n body {\r\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n min-height: 100vh;\r\n margin: 0;\r\n background-color: #f7f7f7;\r\n color: #333;\r\n }\r\n .loading-container {\r\n text-align: center;\r\n }\r\n .spinner {\r\n width: 50px;\r\n height: 50px;\r\n border: 5px solid rgba(0, 0, 0, 0.1);\r\n border-radius: 50%;\r\n border-top-color: #3498db;\r\n animation: spin 1s ease-in-out infinite;\r\n margin: 0 auto 20px;\r\n }\r\n @keyframes spin {\r\n to { transform: rotate(360deg); }\r\n }\r\n </style>`];\r\n \r\n return generateDocument(content, {\r\n title: 'Loading',\r\n bodyClasses: 'loading-page',\r\n styles\r\n });\r\n}\r\n\r\n/**\r\n * Escape HTML special characters\r\n */\r\nfunction escapeHtml(text: string): string {\r\n return String(text)\r\n .replace(/&/g, '&')\r\n .replace(/</g, '<')\r\n .replace(/>/g, '>')\r\n .replace(/\"/g, '"')\r\n .replace(/'/g, ''');\r\n}\r\n", "/**\r\n * Browser-only entry point for baraqex\r\n * This file excludes all server dependencies to ensure browser compatibility\r\n */\r\n\r\n// Re-export everything from frontend-hamroun\r\nexport * from 'frontend-hamroun';\r\n\r\n// Export browser-compatible WASM functionality\r\nexport { loadGoWasm, callWasmFunction, isWasmReady, getWasmFunctions, useGoWasm } from './wasm.js';\r\n\r\n// Export type definitions (safe for all environments)\r\nexport type { GoWasmOptions, GoWasmInstance } from './wasm.js';\r\n\r\n// Export basic template utilities (no server dependencies)\r\nexport { generateDocument, generateErrorPage, generateLoadingPage } from './server/templates.js';\r\n\r\n// Simple renderToString function for browser SSR compatibility\r\nexport function renderToString(content: any): Promise<string> {\r\n if (typeof content === 'string') {\r\n return Promise.resolve(content);\r\n }\r\n if (typeof content === 'function') {\r\n try {\r\n const result = content();\r\n return Promise.resolve(String(result));\r\n } catch (error) {\r\n return Promise.resolve(`<!-- Error rendering: ${error} -->`);\r\n }\r\n }\r\n return Promise.resolve(String(content));\r\n}\r\n\r\n// Browser-compatible utility functions\r\nexport function generateToken(length: number = 32): string {\r\n const array = new Uint8Array(length);\r\n if (typeof crypto !== 'undefined' && crypto.getRandomValues) {\r\n crypto.getRandomValues(array);\r\n } else {\r\n // Fallback for environments without crypto\r\n for (let i = 0; i < array.length; i++) {\r\n array[i] = Math.floor(Math.random() * 256);\r\n }\r\n }\r\n return Array.from(array, byte => byte.toString(16).padStart(2, '0')).join('');\r\n}\r\n\r\nexport function safeJsonParse<T>(json: string, fallback: T): T {\r\n try {\r\n return JSON.parse(json) as T;\r\n } catch (error) {\r\n return fallback;\r\n }\r\n}\r\n\r\n// Browser environment detection\r\nexport const isBrowser = typeof window !== 'undefined';\r\nexport const isNode = false; // Always false in browser build\r\n\r\nconsole.log('Baraqex - Browser version loaded');\r\n"],
|
|
5
5
|
"mappings": "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",
|
|
6
6
|
"names": ["index", "state", "setState", "ref", "content"]
|
|
7
7
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WasmLoader.d.ts","sourceRoot":"","sources":["../../../src/frontend/components/WasmLoader.tsx"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useWasm.d.ts","sourceRoot":"","sources":["../../../src/frontend/hooks/useWasm.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/frontend/index.ts"],"names":[],"mappings":""}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export * from 'frontend-hamroun';
|
|
2
|
+
export type { ServerConfig, User, DbConfig, MiddlewareFunction } from './server/types.js';
|
|
3
|
+
export { loadGoWasm, callWasmFunction, isWasmReady, getWasmFunctions, useGoWasm } from './wasm.js';
|
|
4
|
+
export type { GoWasmOptions, GoWasmInstance } from './server/types.js';
|
|
5
|
+
export { generateDocument, generateErrorPage, generateLoadingPage } from './server/templates.js';
|
|
6
|
+
export declare let BaraqexServer: any;
|
|
7
|
+
export declare let createServer: any;
|
|
8
|
+
export declare let createDevServer: any;
|
|
9
|
+
export declare let createProductionServer: any;
|
|
10
|
+
export declare let renderComponent: any;
|
|
11
|
+
export declare let Database: any;
|
|
12
|
+
export declare let AuthService: any;
|
|
13
|
+
export declare let ApiRouter: any;
|
|
14
|
+
export declare let requestLogger: any;
|
|
15
|
+
export declare let errorHandler: any;
|
|
16
|
+
export declare let notFoundHandler: any;
|
|
17
|
+
export declare let rateLimit: any;
|
|
18
|
+
export declare let initNodeWasm: any;
|
|
19
|
+
export declare let loadGoWasmFromFile: any;
|
|
20
|
+
export declare let safeJsonParse: any;
|
|
21
|
+
export declare let generateToken: any;
|
|
22
|
+
export declare let hashString: any;
|
|
23
|
+
export declare let getPagination: any;
|
|
24
|
+
export declare let sendSuccess: any;
|
|
25
|
+
export declare let sendError: any;
|
|
26
|
+
export declare let validateFields: any;
|
|
27
|
+
export declare let validateFileUpload: any;
|
|
28
|
+
export declare let getEnvironmentInfo: any;
|
|
29
|
+
export declare let isDirectoryEmpty: any;
|
|
30
|
+
export declare let ensureDirectory: any;
|
|
31
|
+
export declare let writeJsonFile: any;
|
|
32
|
+
export declare let readJsonFile: any;
|
|
33
|
+
export declare let baraqexRenderToString: any;
|
|
34
|
+
export declare function renderToString(content: any): Promise<string>;
|
|
35
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,kBAAkB,CAAC;AAGjC,YAAY,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAG1F,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,WAAW,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACnG,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAGvE,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAOjG,eAAO,IAAI,aAAa,EAAE,GAAU,CAAC;AACrC,eAAO,IAAI,YAAY,EAAE,GAAU,CAAC;AACpC,eAAO,IAAI,eAAe,EAAE,GAAU,CAAC;AACvC,eAAO,IAAI,sBAAsB,EAAE,GAAU,CAAC;AAC9C,eAAO,IAAI,eAAe,EAAE,GAAU,CAAC;AACvC,eAAO,IAAI,QAAQ,EAAE,GAAU,CAAC;AAChC,eAAO,IAAI,WAAW,EAAE,GAAU,CAAC;AACnC,eAAO,IAAI,SAAS,EAAE,GAAU,CAAC;AACjC,eAAO,IAAI,aAAa,EAAE,GAAU,CAAC;AACrC,eAAO,IAAI,YAAY,EAAE,GAAU,CAAC;AACpC,eAAO,IAAI,eAAe,EAAE,GAAU,CAAC;AACvC,eAAO,IAAI,SAAS,EAAE,GAAU,CAAC;AACjC,eAAO,IAAI,YAAY,EAAE,GAAU,CAAC;AACpC,eAAO,IAAI,kBAAkB,EAAE,GAAU,CAAC;AAC1C,eAAO,IAAI,aAAa,EAAE,GAMzB,CAAC;AACF,eAAO,IAAI,aAAa,EAAE,GAUzB,CAAC;AACF,eAAO,IAAI,UAAU,EAAE,GAAU,CAAC;AAClC,eAAO,IAAI,aAAa,EAAE,GAAU,CAAC;AACrC,eAAO,IAAI,WAAW,EAAE,GAAU,CAAC;AACnC,eAAO,IAAI,SAAS,EAAE,GAAU,CAAC;AACjC,eAAO,IAAI,cAAc,EAAE,GAAU,CAAC;AACtC,eAAO,IAAI,kBAAkB,EAAE,GAAU,CAAC;AAC1C,eAAO,IAAI,kBAAkB,EAAE,GAAU,CAAC;AAC1C,eAAO,IAAI,gBAAgB,EAAE,GAAU,CAAC;AACxC,eAAO,IAAI,eAAe,EAAE,GAAU,CAAC;AACvC,eAAO,IAAI,aAAa,EAAE,GAAU,CAAC;AACrC,eAAO,IAAI,YAAY,EAAE,GAAU,CAAC;AACpC,eAAO,IAAI,qBAAqB,EAAE,GAAU,CAAC;AA4D7C,wBAAgB,cAAc,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CAa5D"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"renderComponent.d.ts","sourceRoot":"","sources":["../src/renderComponent.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,wBAAsB,eAAe,CACnC,SAAS,EAAE,GAAG,EACd,KAAK,GAAE,GAAQ,GACd,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,KAAK,CAAA;CAAE,CAAC,CAiC5D"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { AuthService } from './auth.js';
|
|
2
|
+
export declare class ApiRouter {
|
|
3
|
+
router: any;
|
|
4
|
+
private apiDir;
|
|
5
|
+
private auth;
|
|
6
|
+
constructor(apiDir: string, auth?: AuthService | null);
|
|
7
|
+
private initializeRouter;
|
|
8
|
+
private setupRoutes;
|
|
9
|
+
private scanDirectory;
|
|
10
|
+
private isRouteFile;
|
|
11
|
+
private getRoutePath;
|
|
12
|
+
private registerRoute;
|
|
13
|
+
private isValidRouteModule;
|
|
14
|
+
private wrapHandler;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=api-router.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-router.d.ts","sourceRoot":"","sources":["../../src/server/api-router.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAmBxC,qBAAa,SAAS;IACb,MAAM,EAAE,GAAG,CAAC;IACnB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,IAAI,CAAqB;gBAErB,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,WAAW,GAAG,IAAW;YAQ7C,gBAAgB;IAa9B,OAAO,CAAC,WAAW;IASnB,OAAO,CAAC,aAAa;IAiBrB,OAAO,CAAC,WAAW;IAMnB,OAAO,CAAC,YAAY;YAiBN,aAAa;IAuE3B,OAAO,CAAC,kBAAkB;IAQ1B,OAAO,CAAC,WAAW;CASpB"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export interface AuthConfig {
|
|
2
|
+
secret: string;
|
|
3
|
+
expiresIn?: string | number;
|
|
4
|
+
}
|
|
5
|
+
export interface User {
|
|
6
|
+
id: string | number;
|
|
7
|
+
username: string;
|
|
8
|
+
password?: string;
|
|
9
|
+
email?: string;
|
|
10
|
+
roles?: string[];
|
|
11
|
+
[key: string]: any;
|
|
12
|
+
}
|
|
13
|
+
export declare class AuthService {
|
|
14
|
+
private config;
|
|
15
|
+
constructor(config: AuthConfig);
|
|
16
|
+
hashPassword(password: string): Promise<string>;
|
|
17
|
+
comparePasswords(password: string, hashedPassword: string): Promise<boolean>;
|
|
18
|
+
generateToken(user: Omit<User, 'password'>): string;
|
|
19
|
+
verifyToken(token: string): any;
|
|
20
|
+
initialize(): (req: any, res: any, next: any) => void;
|
|
21
|
+
requireAuth(): (req: any, res: any, next: any) => any;
|
|
22
|
+
requireRoles(roles: string[]): (req: any, res: any, next: any) => any;
|
|
23
|
+
private extractToken;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/server/auth.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAa;gBAEf,MAAM,EAAE,UAAU;IAOxB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAY/C,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAYlF,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,GAAG,MAAM;IAsBnD,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG;IAa/B,UAAU,KACA,KAAK,GAAG,EAAE,KAAK,GAAG,EAAE,MAAM,GAAG;IAavC,WAAW,KACD,KAAK,GAAG,EAAE,KAAK,GAAG,EAAE,MAAM,GAAG;IASvC,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,IAClB,KAAK,GAAG,EAAE,KAAK,GAAG,EAAE,MAAM,GAAG;IAgBvC,OAAO,CAAC,YAAY;CAMrB"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export interface DbConfig {
|
|
2
|
+
url: string;
|
|
3
|
+
type: 'mongodb' | 'mysql' | 'postgres';
|
|
4
|
+
}
|
|
5
|
+
export declare class Database {
|
|
6
|
+
private config;
|
|
7
|
+
private mongoClient;
|
|
8
|
+
private mongoDb;
|
|
9
|
+
private mysqlPool;
|
|
10
|
+
private pgPool;
|
|
11
|
+
constructor(config: DbConfig);
|
|
12
|
+
connect(): Promise<void>;
|
|
13
|
+
private connectMongo;
|
|
14
|
+
private connectMysql;
|
|
15
|
+
private connectPostgres;
|
|
16
|
+
disconnect(): Promise<void>;
|
|
17
|
+
getMongoDb(): any;
|
|
18
|
+
getMysqlPool(): any;
|
|
19
|
+
getPgPool(): any;
|
|
20
|
+
query(sql: string, values?: any[]): Promise<any>;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=database.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../src/server/database.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,QAAQ;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,SAAS,GAAG,OAAO,GAAG,UAAU,CAAC;CACxC;AAED,qBAAa,QAAQ;IACnB,OAAO,CAAC,MAAM,CAAW;IACzB,OAAO,CAAC,WAAW,CAAa;IAChC,OAAO,CAAC,OAAO,CAAa;IAC5B,OAAO,CAAC,SAAS,CAAa;IAC9B,OAAO,CAAC,MAAM,CAAa;gBAEf,MAAM,EAAE,QAAQ;IAItB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;YAgBhB,YAAY;YAgBZ,YAAY;YAgBZ,eAAe;IAiBvB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAmBjC,UAAU,IAAI,GAAG;IAIjB,YAAY,IAAI,GAAG;IAInB,SAAS,IAAI,GAAG;IAKV,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC;CAgBvD"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { renderToString } from 'frontend-hamroun';
|
|
2
|
+
import { Database } from './database.js';
|
|
3
|
+
import { AuthService } from './auth.js';
|
|
4
|
+
import { ApiRouter } from './api-router.js';
|
|
5
|
+
import { rateLimit } from './middleware.js';
|
|
6
|
+
import * as utils from './utils.js';
|
|
7
|
+
import * as templates from './templates.js';
|
|
8
|
+
import { loadGoWasmFromFile } from './wasm.js';
|
|
9
|
+
export interface ServerConfig {
|
|
10
|
+
port?: number;
|
|
11
|
+
apiDir?: string;
|
|
12
|
+
pagesDir?: string;
|
|
13
|
+
staticDir?: string;
|
|
14
|
+
enableCors?: boolean;
|
|
15
|
+
corsOptions?: any;
|
|
16
|
+
db?: {
|
|
17
|
+
url: string;
|
|
18
|
+
type: 'mongodb' | 'mysql' | 'postgres';
|
|
19
|
+
};
|
|
20
|
+
auth?: {
|
|
21
|
+
secret: string;
|
|
22
|
+
expiresIn?: string | number;
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
export declare class Server {
|
|
26
|
+
private app;
|
|
27
|
+
private server;
|
|
28
|
+
private config;
|
|
29
|
+
private db;
|
|
30
|
+
private auth;
|
|
31
|
+
constructor(config?: ServerConfig);
|
|
32
|
+
private initializeApp;
|
|
33
|
+
private setupApiRoutes;
|
|
34
|
+
private generateApiDocs;
|
|
35
|
+
private scanApiDirectory;
|
|
36
|
+
private getRoutePath;
|
|
37
|
+
private detectApiMethods;
|
|
38
|
+
private setupPageRoutes;
|
|
39
|
+
private renderPage;
|
|
40
|
+
getExpressApp(): any;
|
|
41
|
+
getDatabase(): Database | null;
|
|
42
|
+
getAuth(): AuthService | null;
|
|
43
|
+
start(): Promise<void>;
|
|
44
|
+
stop(): Promise<void>;
|
|
45
|
+
restart(): Promise<void>;
|
|
46
|
+
enableSSR(options?: {
|
|
47
|
+
hydratable?: boolean;
|
|
48
|
+
}): void;
|
|
49
|
+
registerPlugin(plugin: (server: Server) => void): void;
|
|
50
|
+
addShutdownHandler(): void;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Creates and configures a new server instance
|
|
54
|
+
*/
|
|
55
|
+
export declare function createServer(config?: ServerConfig): Server;
|
|
56
|
+
/**
|
|
57
|
+
* Creates a new server with sensible defaults for development
|
|
58
|
+
*/
|
|
59
|
+
export declare function createDevServer(options?: {
|
|
60
|
+
port?: number;
|
|
61
|
+
enableCors?: boolean;
|
|
62
|
+
}): Server;
|
|
63
|
+
/**
|
|
64
|
+
* Creates a production-ready server with optimized settings
|
|
65
|
+
*/
|
|
66
|
+
export declare function createProductionServer(config: ServerConfig): Server;
|
|
67
|
+
export declare function getRequestIp(req: any): string;
|
|
68
|
+
export declare function parseCookies(req: any): Record<string, string>;
|
|
69
|
+
export declare const renderComponent: (Component: any, props?: any) => Promise<{
|
|
70
|
+
html: string;
|
|
71
|
+
success: boolean;
|
|
72
|
+
error?: undefined;
|
|
73
|
+
} | {
|
|
74
|
+
html: string;
|
|
75
|
+
success: boolean;
|
|
76
|
+
error: unknown;
|
|
77
|
+
}>;
|
|
78
|
+
export { initNodeWasm, loadGoWasmFromFile } from './wasm.js';
|
|
79
|
+
export * from './utils.js';
|
|
80
|
+
export * from './templates.js';
|
|
81
|
+
export { Database } from './database.js';
|
|
82
|
+
export { AuthService } from './auth.js';
|
|
83
|
+
export { ApiRouter } from './api-router.js';
|
|
84
|
+
export { requestLogger, errorHandler, notFoundHandler, rateLimit } from './middleware.js';
|
|
85
|
+
export { renderToString };
|
|
86
|
+
declare const _default: {
|
|
87
|
+
Server: typeof Server;
|
|
88
|
+
createServer: typeof createServer;
|
|
89
|
+
createDevServer: typeof createDevServer;
|
|
90
|
+
createProductionServer: typeof createProductionServer;
|
|
91
|
+
rateLimit: typeof rateLimit;
|
|
92
|
+
requestLogger: import("./middleware.js").MiddlewareFunction;
|
|
93
|
+
errorHandler: (err: Error, req: any, res: any, next: any) => void;
|
|
94
|
+
notFoundHandler: (req: any, res: any) => void;
|
|
95
|
+
loadGoWasmFromFile: typeof loadGoWasmFromFile;
|
|
96
|
+
templates: typeof templates;
|
|
97
|
+
utils: typeof utils;
|
|
98
|
+
renderComponent: (Component: any, props?: any) => Promise<{
|
|
99
|
+
html: string;
|
|
100
|
+
success: boolean;
|
|
101
|
+
error?: undefined;
|
|
102
|
+
} | {
|
|
103
|
+
html: string;
|
|
104
|
+
success: boolean;
|
|
105
|
+
error: unknown;
|
|
106
|
+
}>;
|
|
107
|
+
renderToString: typeof renderToString;
|
|
108
|
+
getRequestIp: typeof getRequestIp;
|
|
109
|
+
parseCookies: typeof parseCookies;
|
|
110
|
+
Database: typeof Database;
|
|
111
|
+
AuthService: typeof AuthService;
|
|
112
|
+
ApiRouter: typeof ApiRouter;
|
|
113
|
+
};
|
|
114
|
+
export default _default;
|
|
115
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface MiddlewareFunction {
|
|
2
|
+
(req: any, res: any, next: any): void | Promise<void>;
|
|
3
|
+
}
|
|
4
|
+
export declare const requestLogger: MiddlewareFunction;
|
|
5
|
+
export declare const errorHandler: (err: Error, req: any, res: any, next: any) => void;
|
|
6
|
+
export declare const notFoundHandler: (req: any, res: any) => void;
|
|
7
|
+
export declare function rateLimit(options: {
|
|
8
|
+
windowMs: number;
|
|
9
|
+
max: number;
|
|
10
|
+
}): (req: any, res: any, next: any) => any;
|
|
11
|
+
//# sourceMappingURL=middleware.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../src/server/middleware.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,kBAAkB;IACjC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACvD;AAGD,eAAO,MAAM,aAAa,EAAE,kBAG3B,CAAC;AAEF,eAAO,MAAM,YAAY,GACvB,KAAK,KAAK,EACV,KAAK,GAAG,EACR,KAAK,GAAG,EACR,MAAM,GAAG,SASV,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,KAAK,GAAG,EAAE,KAAK,GAAG,SAMjD,CAAC;AAGF,wBAAgB,SAAS,CAAC,OAAO,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,IAG1D,KAAK,GAAG,EAAE,KAAK,GAAG,EAAE,MAAM,GAAG,SAwBtC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTML template generators for server-side rendering
|
|
3
|
+
*/
|
|
4
|
+
export interface DocumentOptions {
|
|
5
|
+
title?: string;
|
|
6
|
+
description?: string;
|
|
7
|
+
lang?: string;
|
|
8
|
+
charset?: string;
|
|
9
|
+
viewport?: string;
|
|
10
|
+
scripts?: string[];
|
|
11
|
+
styles?: string[];
|
|
12
|
+
meta?: Record<string, string>;
|
|
13
|
+
bodyClasses?: string;
|
|
14
|
+
htmlAttrs?: Record<string, string>;
|
|
15
|
+
bodyAttrs?: Record<string, string>;
|
|
16
|
+
initialData?: any;
|
|
17
|
+
componentName?: string;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Generate a complete HTML document
|
|
21
|
+
*/
|
|
22
|
+
export declare function generateDocument(content: string, options?: DocumentOptions): string;
|
|
23
|
+
/**
|
|
24
|
+
* Generate an error page
|
|
25
|
+
*/
|
|
26
|
+
export declare function generateErrorPage(statusCode: number, message: string, error?: Error): string;
|
|
27
|
+
/**
|
|
28
|
+
* Generate a loading page
|
|
29
|
+
*/
|
|
30
|
+
export declare function generateLoadingPage(message?: string): string;
|
|
31
|
+
//# sourceMappingURL=templates.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/server/templates.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,WAAW,CAAC,EAAE,GAAG,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,eAAoB,GAC5B,MAAM,CAyER;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,EACf,KAAK,CAAC,EAAE,KAAK,GACZ,MAAM,CAgGR;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,GAAE,MAAqB,GAAG,MAAM,CAyC1E"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
export interface ServerConfig {
|
|
2
|
+
port?: number;
|
|
3
|
+
apiDir?: string;
|
|
4
|
+
pagesDir?: string;
|
|
5
|
+
staticDir?: string;
|
|
6
|
+
enableCors?: boolean;
|
|
7
|
+
corsOptions?: {
|
|
8
|
+
origin?: string | string[] | boolean;
|
|
9
|
+
credentials?: boolean;
|
|
10
|
+
methods?: string[];
|
|
11
|
+
allowedHeaders?: string[];
|
|
12
|
+
};
|
|
13
|
+
db?: {
|
|
14
|
+
url: string;
|
|
15
|
+
type: 'mongodb' | 'mysql' | 'postgres';
|
|
16
|
+
};
|
|
17
|
+
auth?: {
|
|
18
|
+
secret: string;
|
|
19
|
+
expiresIn?: string | number;
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
export interface Server {
|
|
23
|
+
start(): Promise<void>;
|
|
24
|
+
stop(): Promise<void>;
|
|
25
|
+
getExpressApp(): any;
|
|
26
|
+
getDatabase(): any;
|
|
27
|
+
getAuth(): any;
|
|
28
|
+
}
|
|
29
|
+
export interface User {
|
|
30
|
+
id: string | number;
|
|
31
|
+
username: string;
|
|
32
|
+
password?: string;
|
|
33
|
+
email?: string;
|
|
34
|
+
roles?: string[];
|
|
35
|
+
[key: string]: any;
|
|
36
|
+
}
|
|
37
|
+
export interface DbConfig {
|
|
38
|
+
url: string;
|
|
39
|
+
type: 'mongodb' | 'mysql' | 'postgres';
|
|
40
|
+
}
|
|
41
|
+
export interface MiddlewareFunction {
|
|
42
|
+
(req: any, res: any, next: any): void | Promise<void>;
|
|
43
|
+
}
|
|
44
|
+
export interface Todo {
|
|
45
|
+
id: number;
|
|
46
|
+
text: string;
|
|
47
|
+
completed: boolean;
|
|
48
|
+
}
|
|
49
|
+
export interface TodoItemProps {
|
|
50
|
+
todo: Todo;
|
|
51
|
+
onToggle: (id: number) => void;
|
|
52
|
+
onDelete: (id: number) => void;
|
|
53
|
+
}
|
|
54
|
+
export interface GoWasmInstance {
|
|
55
|
+
instance: WebAssembly.Instance;
|
|
56
|
+
module: WebAssembly.Module;
|
|
57
|
+
exports: WebAssembly.Exports;
|
|
58
|
+
functions: Record<string, Function>;
|
|
59
|
+
}
|
|
60
|
+
export interface GoWasmOptions {
|
|
61
|
+
debug?: boolean;
|
|
62
|
+
goWasmPath?: string;
|
|
63
|
+
importObject?: Record<string, any>;
|
|
64
|
+
onLoad?: (instance: GoWasmInstance) => void;
|
|
65
|
+
}
|
|
66
|
+
export declare const isBrowser: boolean;
|
|
67
|
+
export declare const isNode: string | false;
|
|
68
|
+
export declare const createConditionalExport: <T>(browserImpl: () => T, nodeImpl: () => T, fallback?: T) => T;
|
|
69
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/server/types.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,WAAW,CAAC,EAAE;QACZ,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,OAAO,CAAC;QACrC,WAAW,CAAC,EAAE,OAAO,CAAC;QACtB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;QACnB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;KAC3B,CAAC;IACF,EAAE,CAAC,EAAE;QACH,GAAG,EAAE,MAAM,CAAC;QACZ,IAAI,EAAE,SAAS,GAAG,OAAO,GAAG,UAAU,CAAC;KACxC,CAAC;IACF,IAAI,CAAC,EAAE;QACL,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;KAC7B,CAAC;CACH;AAGD,MAAM,WAAW,MAAM;IACrB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,aAAa,IAAI,GAAG,CAAC;IACrB,WAAW,IAAI,GAAG,CAAC;IACnB,OAAO,IAAI,GAAG,CAAC;CAChB;AAED,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,MAAM,WAAW,QAAQ;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,SAAS,GAAG,OAAO,GAAG,UAAU,CAAC;CACxC;AAED,MAAM,WAAW,kBAAkB;IACjC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACvD;AAED,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,IAAI,CAAC;IACX,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;CAChC;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,WAAW,CAAC,QAAQ,CAAC;IAC/B,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC;IAC3B,OAAO,EAAE,WAAW,CAAC,OAAO,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;CACrC;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACnC,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,cAAc,KAAK,IAAI,CAAC;CAC7C;AAGD,eAAO,MAAM,SAAS,SAAgC,CAAC;AACvD,eAAO,MAAM,MAAM,gBAA2D,CAAC;AAG/E,eAAO,MAAM,uBAAuB,GAAI,CAAC,EACvC,aAAa,MAAM,CAAC,EACpB,UAAU,MAAM,CAAC,EACjB,WAAW,CAAC,KACX,CAYF,CAAC"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utility functions for server-side operations
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Safely parse JSON with error handling
|
|
6
|
+
*/
|
|
7
|
+
export declare function safeJsonParse<T>(json: string, fallback: T): T;
|
|
8
|
+
/**
|
|
9
|
+
* Generate a secure random token
|
|
10
|
+
*/
|
|
11
|
+
export declare function generateToken(length?: number): string;
|
|
12
|
+
/**
|
|
13
|
+
* Hash a string using SHA-256
|
|
14
|
+
*/
|
|
15
|
+
export declare function hashString(input: string, salt?: string): string;
|
|
16
|
+
/**
|
|
17
|
+
* Get pagination parameters from request
|
|
18
|
+
*/
|
|
19
|
+
export declare function getPagination(req: any): {
|
|
20
|
+
page: number;
|
|
21
|
+
limit: number;
|
|
22
|
+
skip: number;
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* Standard success response format
|
|
26
|
+
*/
|
|
27
|
+
export declare function sendSuccess<T>(res: any, data: T, message?: string): any;
|
|
28
|
+
/**
|
|
29
|
+
* Standard error response format
|
|
30
|
+
*/
|
|
31
|
+
export declare function sendError(res: any, message?: string, statusCode?: number, errors?: any): any;
|
|
32
|
+
/**
|
|
33
|
+
* Validate required fields in request body
|
|
34
|
+
*/
|
|
35
|
+
export declare function validateFields(req: any, requiredFields: string[]): {
|
|
36
|
+
valid: boolean;
|
|
37
|
+
missing: string[];
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
40
|
+
* Handle file upload validation
|
|
41
|
+
*/
|
|
42
|
+
export declare function validateFileUpload(file: any, // Using 'any' to avoid the Express.Multer dependency
|
|
43
|
+
options?: {
|
|
44
|
+
maxSize?: number;
|
|
45
|
+
allowedTypes?: string[];
|
|
46
|
+
}): {
|
|
47
|
+
valid: boolean;
|
|
48
|
+
error?: string;
|
|
49
|
+
};
|
|
50
|
+
/**
|
|
51
|
+
* Get server environment information
|
|
52
|
+
*/
|
|
53
|
+
export declare function getEnvironmentInfo(): Record<string, any>;
|
|
54
|
+
/**
|
|
55
|
+
* Check if a directory is empty
|
|
56
|
+
*/
|
|
57
|
+
export declare function isDirectoryEmpty(dirPath: string): Promise<boolean>;
|
|
58
|
+
/**
|
|
59
|
+
* Create directory if it doesn't exist
|
|
60
|
+
*/
|
|
61
|
+
export declare function ensureDirectory(dirPath: string): Promise<void>;
|
|
62
|
+
/**
|
|
63
|
+
* Write JSON to file
|
|
64
|
+
*/
|
|
65
|
+
export declare function writeJsonFile(filePath: string, data: any): Promise<void>;
|
|
66
|
+
/**
|
|
67
|
+
* Read JSON from file
|
|
68
|
+
*/
|
|
69
|
+
export declare function readJsonFile<T>(filePath: string, defaultValue: T): Promise<T>;
|
|
70
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/server/utils.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH;;GAEG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,CAAC,CAM7D;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,GAAE,MAAW,GAAG,MAAM,CAEzD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,GAAE,MAAW,GAAG,MAAM,CAEnE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,GAAG,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAgBrF;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,GAAE,MAAkB,GAAG,GAAG,CAMlF;AAED;;GAEG;AACH,wBAAgB,SAAS,CACvB,GAAG,EAAE,GAAG,EACR,OAAO,GAAE,MAA4B,EACrC,UAAU,GAAE,MAAY,EACxB,MAAM,CAAC,EAAE,GAAG,GACX,GAAG,CAML;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,GAAG,EAAE,GAAG,EACR,cAAc,EAAE,MAAM,EAAE,GACvB;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAUvC;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,GAAG,EAAE,qDAAqD;AAChE,OAAO,GAAE;IACP,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB,GACL;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAyBpC;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CASxD;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAQxE;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAOpE;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAG9E;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAOnF"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { GoWasmInstance, GoWasmOptions } from '../server/types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Initialize the Node.js environment for running Go WASM modules
|
|
4
|
+
*/
|
|
5
|
+
export declare function initNodeWasm(): Promise<void>;
|
|
6
|
+
/**
|
|
7
|
+
* Load a Go WASM module from a file path for server-side usage
|
|
8
|
+
*/
|
|
9
|
+
export declare function loadGoWasmFromFile(wasmFilePath: string, options?: GoWasmOptions): Promise<GoWasmInstance>;
|
|
10
|
+
/**
|
|
11
|
+
* Call a Go WASM function in Node.js environment
|
|
12
|
+
*/
|
|
13
|
+
export declare function callWasmFunction(funcName: string, ...args: any[]): any;
|
|
14
|
+
/**
|
|
15
|
+
* Check if Go WASM is ready in Node.js
|
|
16
|
+
*/
|
|
17
|
+
export declare function isWasmReady(): boolean;
|
|
18
|
+
/**
|
|
19
|
+
* Get all available Go WASM functions in Node.js
|
|
20
|
+
*/
|
|
21
|
+
export declare function getWasmFunctions(): string[];
|
|
22
|
+
declare global {
|
|
23
|
+
var Go: new () => {
|
|
24
|
+
importObject: any;
|
|
25
|
+
run: (instance: WebAssembly.Instance) => Promise<void>;
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
export type { GoWasmInstance, GoWasmOptions };
|
|
29
|
+
//# sourceMappingURL=wasm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wasm.d.ts","sourceRoot":"","sources":["../../src/server/wasm.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAKnE;;GAEG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAclD;AAuED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,YAAY,EAAE,MAAM,EACpB,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,cAAc,CAAC,CA+GzB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,GAAG,CAOtE;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,OAAO,CAKrC;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,EAAE,CAK3C;AAGD,OAAO,CAAC,MAAM,CAAC;IACb,IAAI,EAAE,EAAE,UAAU;QAChB,YAAY,EAAE,GAAG,CAAC;QAClB,GAAG,EAAE,CAAC,QAAQ,EAAE,WAAW,CAAC,QAAQ,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;KACxD,CAAC;CACH;AAED,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-renderer.d.ts","sourceRoot":"","sources":["../src/server-renderer.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,wBAAgB,cAAc,CAAC,SAAS,EAAE,GAAG,GAAG,MAAM,CAuBrD"}
|
package/dist/wasm.d.ts
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WebAssembly integration for Frontend Hamroun
|
|
3
|
+
* Works in both browser and Node.js environments
|
|
4
|
+
*/
|
|
5
|
+
export interface GoWasmOptions {
|
|
6
|
+
debug?: boolean;
|
|
7
|
+
goWasmPath?: string;
|
|
8
|
+
importObject?: any;
|
|
9
|
+
onLoad?: (instance: GoWasmInstance) => void;
|
|
10
|
+
}
|
|
11
|
+
export interface GoWasmInstance {
|
|
12
|
+
instance: WebAssembly.Instance;
|
|
13
|
+
module: WebAssembly.Module;
|
|
14
|
+
exports: WebAssembly.Exports;
|
|
15
|
+
functions: Record<string, Function>;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Load Go WASM module in the browser (like your working frontend code)
|
|
19
|
+
*/
|
|
20
|
+
export declare function loadGoWasm(wasmUrl: string, options?: GoWasmOptions): Promise<GoWasmInstance>;
|
|
21
|
+
/**
|
|
22
|
+
* Call a Go WASM function (like your frontend code's callWasmFunction)
|
|
23
|
+
*/
|
|
24
|
+
export declare function callWasmFunction(funcName: string, ...args: any[]): any;
|
|
25
|
+
/**
|
|
26
|
+
* Check if Go WASM is ready (like your frontend code's wasmReady state)
|
|
27
|
+
*/
|
|
28
|
+
export declare function isWasmReady(): boolean;
|
|
29
|
+
/**
|
|
30
|
+
* Get all available Go WASM functions
|
|
31
|
+
*/
|
|
32
|
+
export declare function getWasmFunctions(): string[];
|
|
33
|
+
/**
|
|
34
|
+
* Hook for React components (like your frontend code's useEffect pattern)
|
|
35
|
+
*/
|
|
36
|
+
export declare function useGoWasm(wasmUrl: string, options?: GoWasmOptions): {
|
|
37
|
+
loadWasm: () => Promise<GoWasmInstance>;
|
|
38
|
+
callFunction: typeof callWasmFunction;
|
|
39
|
+
isReady: typeof isWasmReady;
|
|
40
|
+
getFunctions: typeof getWasmFunctions;
|
|
41
|
+
};
|
|
42
|
+
declare global {
|
|
43
|
+
interface Window {
|
|
44
|
+
Go: new () => {
|
|
45
|
+
importObject: any;
|
|
46
|
+
run: (instance: WebAssembly.Instance) => void;
|
|
47
|
+
};
|
|
48
|
+
[key: string]: any;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=wasm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wasm.d.ts","sourceRoot":"","sources":["../src/wasm.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,GAAG,CAAC;IACnB,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,cAAc,KAAK,IAAI,CAAC;CAC7C;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,WAAW,CAAC,QAAQ,CAAC;IAC/B,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC;IAC3B,OAAO,EAAE,WAAW,CAAC,OAAO,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;CACrC;AAED;;GAEG;AACH,wBAAsB,UAAU,CAC9B,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,cAAc,CAAC,CAwEzB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,GAAG,CAWtE;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,OAAO,CASrC;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,EAAE,CAQ3C;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB;;;;;EAarE;AAGD,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,EAAE,EAAE,UAAU;YACZ,YAAY,EAAE,GAAG,CAAC;YAClB,GAAG,EAAE,CAAC,QAAQ,EAAE,WAAW,CAAC,QAAQ,KAAK,IAAI,CAAC;SAC/C,CAAC;QACF,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;KACpB;CACF"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "baraqex",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.38",
|
|
4
4
|
"description": "A powerful full-stack framework built on top of frontend-hamroun",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -50,7 +50,7 @@
|
|
|
50
50
|
"baraqex": "./bin/baraqex.js"
|
|
51
51
|
},
|
|
52
52
|
"scripts": {
|
|
53
|
-
"build": "npm run clean && npm run build:
|
|
53
|
+
"build": "npm run clean && npm run build:esm",
|
|
54
54
|
"build:types": "tsc --emitDeclarationOnly",
|
|
55
55
|
"build:esm": "node build.mjs",
|
|
56
56
|
"clean": "rimraf dist",
|
|
@@ -74,8 +74,8 @@
|
|
|
74
74
|
"frontend-hamroun": "^1.0.0"
|
|
75
75
|
},
|
|
76
76
|
"peerDependencies": {
|
|
77
|
-
"
|
|
78
|
-
"
|
|
77
|
+
"express": "^4.18.0",
|
|
78
|
+
"cors": "^2.8.5"
|
|
79
79
|
},
|
|
80
80
|
"peerDependenciesMeta": {
|
|
81
81
|
"express": {
|
|
@@ -101,24 +101,19 @@
|
|
|
101
101
|
}
|
|
102
102
|
},
|
|
103
103
|
"devDependencies": {
|
|
104
|
-
"@types/bcryptjs": "^2.4.6",
|
|
105
|
-
"@types/cors": "^2.8.18",
|
|
106
|
-
"@types/express": "^5.0.2",
|
|
107
|
-
"@types/jsonwebtoken": "^9.0.9",
|
|
108
104
|
"@types/node": "^20.0.0",
|
|
109
|
-
"
|
|
110
|
-
"esbuild": "^0.19.0",
|
|
105
|
+
"typescript": "^5.0.0",
|
|
111
106
|
"jest": "^29.0.0",
|
|
112
107
|
"rimraf": "^5.0.0",
|
|
113
|
-
"
|
|
108
|
+
"esbuild": "^0.19.0"
|
|
114
109
|
},
|
|
115
110
|
"optionalDependencies": {
|
|
116
|
-
"bcryptjs": "^2.4.3",
|
|
117
|
-
"cors": "^2.8.5",
|
|
118
111
|
"express": "^4.18.0",
|
|
119
|
-
"
|
|
112
|
+
"cors": "^2.8.5",
|
|
120
113
|
"mongodb": "^6.0.0",
|
|
121
114
|
"mysql2": "^3.6.0",
|
|
122
|
-
"pg": "^8.11.0"
|
|
115
|
+
"pg": "^8.11.0",
|
|
116
|
+
"bcryptjs": "^2.4.3",
|
|
117
|
+
"jsonwebtoken": "^9.0.0"
|
|
123
118
|
}
|
|
124
119
|
}
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
"name": "ssr-version",
|
|
9
9
|
"version": "0.0.0",
|
|
10
10
|
"dependencies": {
|
|
11
|
-
"baraqex": "^1.0.
|
|
11
|
+
"baraqex": "^1.0.37",
|
|
12
12
|
"express": "^4.18.2",
|
|
13
13
|
"frontend-hamroun": "latest"
|
|
14
14
|
},
|
|
@@ -713,23 +713,51 @@
|
|
|
713
713
|
}
|
|
714
714
|
},
|
|
715
715
|
"node_modules/baraqex": {
|
|
716
|
-
"version": "1.0.
|
|
717
|
-
"resolved": "https://registry.npmjs.org/baraqex/-/baraqex-1.0.
|
|
718
|
-
"integrity": "sha512-
|
|
719
|
-
"license": "
|
|
716
|
+
"version": "1.0.37",
|
|
717
|
+
"resolved": "https://registry.npmjs.org/baraqex/-/baraqex-1.0.37.tgz",
|
|
718
|
+
"integrity": "sha512-tHwlloLM2ErQt2wbypaxnbsJEeVb/P/tsBpy4ZNaguBcQmdn3g0IfsdMMCN2d65m2+dAOUgjBrKvkm+uLn46Ew==",
|
|
719
|
+
"license": "MIT",
|
|
720
720
|
"dependencies": {
|
|
721
|
+
"frontend-hamroun": "^1.2.35"
|
|
722
|
+
},
|
|
723
|
+
"bin": {
|
|
724
|
+
"baraqex": "bin/baraqex.js"
|
|
725
|
+
},
|
|
726
|
+
"optionalDependencies": {
|
|
721
727
|
"bcryptjs": "^2.4.3",
|
|
722
728
|
"cors": "^2.8.5",
|
|
723
|
-
"crypto": "^1.0.1",
|
|
724
729
|
"express": "^4.18.0",
|
|
725
|
-
"frontend-hamroun": "^1.2.35",
|
|
726
730
|
"jsonwebtoken": "^9.0.0",
|
|
727
731
|
"mongodb": "^6.0.0",
|
|
728
732
|
"mysql2": "^3.6.0",
|
|
729
733
|
"pg": "^8.11.0"
|
|
730
734
|
},
|
|
731
|
-
"
|
|
732
|
-
"
|
|
735
|
+
"peerDependencies": {
|
|
736
|
+
"cors": "^2.8.5",
|
|
737
|
+
"express": "^4.18.0"
|
|
738
|
+
},
|
|
739
|
+
"peerDependenciesMeta": {
|
|
740
|
+
"bcryptjs": {
|
|
741
|
+
"optional": true
|
|
742
|
+
},
|
|
743
|
+
"cors": {
|
|
744
|
+
"optional": true
|
|
745
|
+
},
|
|
746
|
+
"express": {
|
|
747
|
+
"optional": true
|
|
748
|
+
},
|
|
749
|
+
"jsonwebtoken": {
|
|
750
|
+
"optional": true
|
|
751
|
+
},
|
|
752
|
+
"mongodb": {
|
|
753
|
+
"optional": true
|
|
754
|
+
},
|
|
755
|
+
"mysql2": {
|
|
756
|
+
"optional": true
|
|
757
|
+
},
|
|
758
|
+
"pg": {
|
|
759
|
+
"optional": true
|
|
760
|
+
}
|
|
733
761
|
}
|
|
734
762
|
},
|
|
735
763
|
"node_modules/base64-js": {
|
|
@@ -756,7 +784,8 @@
|
|
|
756
784
|
"version": "2.4.3",
|
|
757
785
|
"resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz",
|
|
758
786
|
"integrity": "sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ==",
|
|
759
|
-
"license": "MIT"
|
|
787
|
+
"license": "MIT",
|
|
788
|
+
"optional": true
|
|
760
789
|
},
|
|
761
790
|
"node_modules/bl": {
|
|
762
791
|
"version": "5.1.0",
|
|
@@ -1081,6 +1110,7 @@
|
|
|
1081
1110
|
"resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
|
|
1082
1111
|
"integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
|
|
1083
1112
|
"license": "MIT",
|
|
1113
|
+
"optional": true,
|
|
1084
1114
|
"dependencies": {
|
|
1085
1115
|
"object-assign": "^4",
|
|
1086
1116
|
"vary": "^1"
|
|
@@ -1089,13 +1119,6 @@
|
|
|
1089
1119
|
"node": ">= 0.10"
|
|
1090
1120
|
}
|
|
1091
1121
|
},
|
|
1092
|
-
"node_modules/crypto": {
|
|
1093
|
-
"version": "1.0.1",
|
|
1094
|
-
"resolved": "https://registry.npmjs.org/crypto/-/crypto-1.0.1.tgz",
|
|
1095
|
-
"integrity": "sha512-VxBKmeNcqQdiUQUW2Tzq0t377b54N2bMtXO/qiLa+6eRRmmC4qT3D4OnTGoT/U6O9aklQ/jTwbOtRMTTY8G0Ig==",
|
|
1096
|
-
"deprecated": "This package is no longer supported. It's now a built-in Node module. If you've depended on crypto, you should switch to the one that's built-in.",
|
|
1097
|
-
"license": "ISC"
|
|
1098
|
-
},
|
|
1099
1122
|
"node_modules/debug": {
|
|
1100
1123
|
"version": "2.6.9",
|
|
1101
1124
|
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
|
|
@@ -2755,6 +2778,7 @@
|
|
|
2755
2778
|
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
|
|
2756
2779
|
"integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
|
|
2757
2780
|
"license": "MIT",
|
|
2781
|
+
"optional": true,
|
|
2758
2782
|
"engines": {
|
|
2759
2783
|
"node": ">=0.10.0"
|
|
2760
2784
|
}
|
|
@@ -10,7 +10,7 @@ function useTimer(initialTime = 0) {
|
|
|
10
10
|
if (!isRunning) {
|
|
11
11
|
setIsRunning(true);
|
|
12
12
|
intervalRef.current = setInterval(() => {
|
|
13
|
-
setTime(prev => prev + 1);
|
|
13
|
+
setTime((prev: number) => prev + 1);
|
|
14
14
|
}, 1000);
|
|
15
15
|
}
|
|
16
16
|
};
|
|
@@ -50,8 +50,8 @@ function useTimer(initialTime = 0) {
|
|
|
50
50
|
function useCounter(initialValue = 0, step = 1) {
|
|
51
51
|
const [count, setCount] = useState(initialValue);
|
|
52
52
|
|
|
53
|
-
const increment = () => setCount(prev => prev + step);
|
|
54
|
-
const decrement = () => setCount(prev => prev - step);
|
|
53
|
+
const increment = () => setCount((prev: number) => prev + step);
|
|
54
|
+
const decrement = () => setCount((prev: number) => prev - step);
|
|
55
55
|
const reset = () => setCount(initialValue);
|
|
56
56
|
const setValue = (value: number | ((prev: number) => number)) => setCount(value);
|
|
57
57
|
|
|
@@ -71,7 +71,7 @@ function useTodos() {
|
|
|
71
71
|
// Ensure text is a string and handle null/undefined
|
|
72
72
|
const textString = String(text || '');
|
|
73
73
|
if (textString.trim()) {
|
|
74
|
-
setTodos(prev => [...prev, {
|
|
74
|
+
setTodos((prev: any) => [...prev, {
|
|
75
75
|
id: Date.now(),
|
|
76
76
|
text: textString.trim(),
|
|
77
77
|
completed: false
|
|
@@ -80,13 +80,13 @@ function useTodos() {
|
|
|
80
80
|
};
|
|
81
81
|
|
|
82
82
|
const toggleTodo = (id: number) => {
|
|
83
|
-
setTodos(prev => prev.map(todo =>
|
|
83
|
+
setTodos((prev: any[]) => prev.map((todo: { id: number; completed: any; }) =>
|
|
84
84
|
todo.id === id ? { ...todo, completed: !todo.completed } : todo
|
|
85
85
|
));
|
|
86
86
|
};
|
|
87
87
|
|
|
88
88
|
const deleteTodo = (id: number) => {
|
|
89
|
-
setTodos(prev => prev.filter(todo => todo.id !== id));
|
|
89
|
+
setTodos((prev: any[]) => prev.filter((todo: { id: number; }) => todo.id !== id));
|
|
90
90
|
};
|
|
91
91
|
|
|
92
92
|
const filteredTodos = useMemo(() => {
|
|
@@ -127,7 +127,7 @@ function useTheme() {
|
|
|
127
127
|
const [theme, setTheme] = useState('light');
|
|
128
128
|
|
|
129
129
|
const toggleTheme = () => {
|
|
130
|
-
setTheme(prev => prev === 'light' ? 'dark' : 'light');
|
|
130
|
+
setTheme((prev: string) => prev === 'light' ? 'dark' : 'light');
|
|
131
131
|
};
|
|
132
132
|
|
|
133
133
|
const themeColors = useMemo(() => {
|
|
@@ -438,7 +438,7 @@ export function App() {
|
|
|
438
438
|
min="1"
|
|
439
439
|
max="10"
|
|
440
440
|
value={step}
|
|
441
|
-
onChange={(e) => setStep(parseInt(e.target.value))}
|
|
441
|
+
onChange={(e: { target: { value: string; }; }) => setStep(parseInt(e.target.value))}
|
|
442
442
|
style={{ width: '100%' }}
|
|
443
443
|
/>
|
|
444
444
|
</div>
|
|
@@ -479,7 +479,7 @@ export function App() {
|
|
|
479
479
|
background: colors.bg,
|
|
480
480
|
color: colors.text
|
|
481
481
|
}}
|
|
482
|
-
onKeyPress={(e) => {
|
|
482
|
+
onKeyPress={(e: { key: string; target: { value: string; }; }) => {
|
|
483
483
|
if (e.key === 'Enter') {
|
|
484
484
|
setValue(parseInt(e.target.value) || 0);
|
|
485
485
|
e.target.value = '';
|
|
@@ -715,7 +715,7 @@ export function App() {
|
|
|
715
715
|
'🎉 No completed todos yet!'}
|
|
716
716
|
</div>
|
|
717
717
|
) : (
|
|
718
|
-
todos.map(todo => (
|
|
718
|
+
todos.map((todo: { id: any; }) => (
|
|
719
719
|
<TodoItem
|
|
720
720
|
key={todo.id}
|
|
721
721
|
todo={todo}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { hydrate, jsx } from 'frontend-hamroun';
|
|
1
|
+
import { hydrate, jsx, render } from 'frontend-hamroun';
|
|
2
2
|
import { App } from './App.js';
|
|
3
3
|
|
|
4
|
-
hydrate(jsx(App, {}), document.getElementById('root')!);
|
|
4
|
+
await hydrate(jsx(App, {}), document.getElementById('root')!);
|
|
5
|
+
await render(jsx(App, {}), document.getElementById('root')!);
|