baraqex
Version:
A powerful full-stack framework for modern web development
503 lines (500 loc) • 14.9 kB
JavaScript
// node_modules/frontend-hamroun/dist/index.mjs
var isBatching = false;
var queue = [];
function batchUpdates(fn) {
if (isBatching) {
queue.push(fn);
return;
}
isBatching = true;
try {
fn();
while (queue.length > 0) {
const nextFn = queue.shift();
nextFn == null ? void 0 : nextFn();
}
} finally {
isBatching = false;
}
}
var currentRender = 0;
var states = /* @__PURE__ */ new Map();
var stateIndices = /* @__PURE__ */ new Map();
var effects = /* @__PURE__ */ new Map();
var memos = /* @__PURE__ */ new Map();
var refs = /* @__PURE__ */ new Map();
var globalRenderCallback = null;
var globalContainer = null;
var currentElement = null;
var isServer = typeof window === "undefined";
var serverStates = /* @__PURE__ */ new Map();
function setRenderCallback(callback, element, container) {
globalRenderCallback = callback;
globalContainer = container;
currentElement = element;
}
function prepareRender() {
currentRender++;
stateIndices.set(currentRender, 0);
return currentRender;
}
function finishRender() {
if (isServer) {
serverStates.delete(currentRender);
}
currentRender = 0;
}
function useState(initial) {
if (!currentRender) {
throw new Error("useState must be called within a render");
}
if (isServer) {
if (!serverStates.has(currentRender)) {
serverStates.set(currentRender, /* @__PURE__ */ new Map());
}
const componentState = serverStates.get(currentRender);
const index2 = stateIndices.get(currentRender) || 0;
if (!componentState.has(index2)) {
componentState.set(index2, initial);
}
const state2 = componentState.get(index2);
const setState2 = (newValue) => {
};
stateIndices.set(currentRender, index2 + 1);
return [state2, setState2];
}
if (!states.has(currentRender)) {
states.set(currentRender, []);
}
const componentStates = states.get(currentRender);
const index = stateIndices.get(currentRender);
if (index >= componentStates.length) {
componentStates.push(initial);
}
const state = componentStates[index];
const setState = (newValue) => {
const nextValue = typeof newValue === "function" ? newValue(componentStates[index]) : newValue;
if (componentStates[index] === nextValue)
return;
componentStates[index] = nextValue;
if (isBatching) {
batchUpdates(() => rerender(currentRender));
} else {
rerender(currentRender);
}
};
stateIndices.set(currentRender, index + 1);
return [state, setState];
}
function useEffect(callback, deps) {
if (!currentRender)
throw new Error("useEffect must be called within a render");
const effectIndex = stateIndices.get(currentRender);
if (!effects.has(currentRender)) {
effects.set(currentRender, []);
}
const componentEffects = effects.get(currentRender);
const prevEffect = componentEffects[effectIndex];
if (!prevEffect || !deps || !prevEffect.deps || deps.some((dep, i) => dep !== prevEffect.deps[i])) {
if (prevEffect == null ? void 0 : prevEffect.cleanup) {
prevEffect.cleanup();
}
queueMicrotask(() => {
const cleanup = callback() || void 0;
componentEffects[effectIndex] = { cleanup, deps };
});
}
stateIndices.set(currentRender, effectIndex + 1);
}
function useMemo(factory, deps) {
if (!currentRender)
throw new Error("useMemo must be called within a render");
const memoIndex = stateIndices.get(currentRender);
if (!memos.has(currentRender)) {
memos.set(currentRender, []);
}
const componentMemos = memos.get(currentRender);
const prevMemo = componentMemos[memoIndex];
if (!prevMemo || deps && deps.some((dep, i) => !Object.is(dep, prevMemo.deps[i]))) {
const value = factory();
componentMemos[memoIndex] = { value, deps };
stateIndices.set(currentRender, memoIndex + 1);
return value;
}
stateIndices.set(currentRender, memoIndex + 1);
return prevMemo.value;
}
function useRef(initial) {
if (!currentRender)
throw new Error("useRef must be called within a render");
const refIndex = stateIndices.get(currentRender);
if (!refs.has(currentRender)) {
refs.set(currentRender, []);
}
const componentRefs = refs.get(currentRender);
if (refIndex >= componentRefs.length) {
const ref2 = { current: initial };
componentRefs.push(ref2);
stateIndices.set(currentRender, refIndex + 1);
return ref2;
}
const ref = componentRefs[refIndex];
stateIndices.set(currentRender, refIndex + 1);
return ref;
}
async function rerender(rendererId) {
try {
const componentEffects = effects.get(rendererId);
if (componentEffects) {
componentEffects.forEach((effect) => {
if (effect.cleanup)
effect.cleanup();
});
effects.set(rendererId, []);
}
if (globalRenderCallback && globalContainer && currentElement) {
await globalRenderCallback(currentElement, globalContainer);
}
} catch (error) {
console.error("Error during rerender:", error);
}
}
function useErrorBoundary() {
const [error, setError] = useState(null);
return [error, () => setError(null)];
}
function createContext(defaultValue) {
const context = {
Provider: ({ value, children }) => {
return children;
},
Consumer: ({ children }) => {
return children(defaultValue);
},
_id: Symbol(),
useSelector: (selector) => {
return selector(defaultValue);
}
};
return context;
}
function useContext(context) {
return context;
}
function jsx(type, props) {
console.log("JSX Transform:", { type, props });
const processedProps = { ...props };
if (arguments.length > 2) {
processedProps.children = Array.prototype.slice.call(arguments, 2);
}
return { type, props: processedProps };
}
var Fragment = ({ children }) => children;
async function createElement(vnode) {
var _a;
console.log("Creating element from:", vnode);
if (vnode == null) {
return document.createTextNode("");
}
if (typeof vnode === "boolean") {
return document.createTextNode("");
}
if (typeof vnode === "number" || typeof vnode === "string") {
return document.createTextNode(String(vnode));
}
if (Array.isArray(vnode)) {
const fragment = document.createDocumentFragment();
for (const child of vnode) {
const node = await createElement(child);
fragment.appendChild(node);
}
return fragment;
}
if ("type" in vnode && vnode.props !== void 0) {
const { type, props } = vnode;
if (typeof type === "function") {
try {
const result = await type(props || {});
const node = await createElement(result);
if (node instanceof Element) {
node.setAttribute("data-component-id", type.name || type.toString());
}
return node;
} catch (error) {
console.error("Error rendering component:", error);
return document.createTextNode("");
}
}
const element = document.createElement(type);
for (const [key, value] of Object.entries(props || {})) {
if (key === "children")
continue;
if (key.startsWith("on") && typeof value === "function") {
const eventName = key.toLowerCase().slice(2);
const existingHandler = (_a = element.__events) == null ? void 0 : _a[eventName];
if (existingHandler) {
element.removeEventListener(eventName, existingHandler);
}
element.addEventListener(eventName, value);
if (!element.__events) {
element.__events = {};
}
element.__events[eventName] = value;
} else if (key === "style" && typeof value === "object") {
Object.assign(element.style, value);
} else if (key === "className") {
element.setAttribute("class", String(value));
} else if (key !== "key" && key !== "ref") {
element.setAttribute(key, String(value));
}
}
const children = props == null ? void 0 : props.children;
if (children != null) {
const childArray = Array.isArray(children) ? children.flat() : [children];
for (const child of childArray) {
const childNode = await createElement(child);
element.appendChild(childNode);
}
}
return element;
}
return document.createTextNode(String(vnode));
}
var isHydrating = false;
async function hydrate(element, container) {
isHydrating = true;
try {
await render(element, container);
} finally {
isHydrating = false;
}
}
async function render(element, container) {
console.log("Rendering to:", container.id);
batchUpdates(async () => {
const rendererId = prepareRender();
try {
setRenderCallback(render, element, container);
const domNode = await createElement(element);
if (!isHydrating) {
container.innerHTML = "";
}
container.appendChild(domNode);
} finally {
finishRender();
}
});
}
var server = {
async getServer() {
throw new Error("Server module can only be used in Node.js environment");
}
};
// src/wasm.ts
async function loadGoWasm(wasmUrl, options = {}) {
if (typeof window === "undefined") {
throw new Error("loadGoWasm() is for browser use only. Use loadGoWasmFromFile() in Node.js.");
}
try {
if (!window.Go) {
throw new Error("Go WASM runtime not available. Make sure wasm_exec.js is loaded.");
}
if (options.debug) {
console.log("[WASM] Loading WASM from:", wasmUrl);
}
const response = await fetch(wasmUrl);
if (!response.ok) {
throw new Error(`Failed to fetch WASM file: ${response.status}`);
}
const wasmBytes = await response.arrayBuffer();
const go = new window.Go();
const wasmModule = await WebAssembly.instantiate(wasmBytes, go.importObject);
go.run(wasmModule.instance);
await new Promise((resolve) => setTimeout(resolve, 100));
if (options.debug) {
console.log("[WASM] Go program started, checking for registered functions...");
}
const functions = {};
for (const key in window) {
if (typeof window[key] === "function" && key.startsWith("go")) {
functions[key] = window[key];
if (options.debug) {
console.log(`[WASM] Found function: ${key}`);
}
}
}
const wasmInstance = {
instance: wasmModule.instance,
module: wasmModule,
exports: wasmModule.instance.exports,
functions
};
if (options.onLoad) {
options.onLoad(wasmInstance);
}
if (options.debug) {
console.log(`[WASM] Module loaded successfully with ${Object.keys(functions).length} functions`);
}
return wasmInstance;
} catch (error) {
console.error("[WASM] Error loading Go WASM module:", error);
throw error;
}
}
function callWasmFunction(funcName, ...args) {
if (typeof window === "undefined") {
throw new Error("callWasmFunction() is for browser use only.");
}
const func = window[funcName];
if (typeof func !== "function") {
throw new Error(`Function ${funcName} not found. Make sure the WASM module is loaded.`);
}
return func(...args);
}
function isWasmReady() {
if (typeof window === "undefined") {
return false;
}
return !!(window.Go && Object.keys(window).some(
(key) => key.startsWith("go") && typeof window[key] === "function"
));
}
function getWasmFunctions() {
if (typeof window === "undefined") {
return [];
}
return Object.keys(window).filter(
(key) => key.startsWith("go") && typeof window[key] === "function"
);
}
function useGoWasm(wasmUrl, options = {}) {
if (typeof window === "undefined") {
throw new Error("useGoWasm() is for browser use only.");
}
return {
loadWasm: () => loadGoWasm(wasmUrl, options),
callFunction: callWasmFunction,
isReady: isWasmReady,
getFunctions: getWasmFunctions
};
}
// src/browser.ts
var safeJsonParse = (json, fallback) => {
try {
return JSON.parse(json);
} catch {
return fallback;
}
};
var generateToken = (length = 32) => {
const array = new Uint8Array(length);
if (typeof crypto !== "undefined" && crypto.getRandomValues) {
crypto.getRandomValues(array);
} else {
for (let i = 0; i < array.length; i++) {
array[i] = Math.floor(Math.random() * 256);
}
}
return Array.from(array, (byte) => byte.toString(16).padStart(2, "0")).join("");
};
var generateDocument = (content, options = {}) => `<!DOCTYPE html><html><head><title>${options.title || "App"}</title></head><body>${content}</body></html>`;
var generateErrorPage = (code, message) => `<div>Error ${code}: ${message}</div>`;
var generateLoadingPage = (message = "Loading...") => `<div>${message}</div>`;
var renderToString = (component) => {
try {
if (typeof component === "function") {
const result = component();
return typeof result === "string" ? result : String(result || "");
}
return String(component || "");
} catch (error) {
return "<div>Error rendering component</div>";
}
};
var createServer = () => {
throw new Error("createServer is not available in browser environment");
};
var createDevServer = () => {
throw new Error("createDevServer is not available in browser environment");
};
var createProductionServer = () => {
throw new Error("createProductionServer is not available in browser environment");
};
var BaraqexServer = null;
var Database = null;
var AuthService = null;
var ApiRouter = null;
var requestLogger = null;
var errorHandler = null;
var notFoundHandler = null;
var rateLimit = null;
var initNodeWasm = null;
var loadGoWasmFromFile = null;
var hashString = null;
var getPagination = null;
var sendSuccess = null;
var sendError = null;
var validateFields = null;
var validateFileUpload = null;
var getEnvironmentInfo = null;
var isDirectoryEmpty = null;
var ensureDirectory = null;
var writeJsonFile = null;
var readJsonFile = null;
var baraqexRenderToString = null;
var renderComponent = null;
console.log("Baraqex - Browser build loaded");
export {
ApiRouter,
AuthService,
BaraqexServer,
Database,
Fragment,
baraqexRenderToString,
batchUpdates,
callWasmFunction,
createContext,
createDevServer,
createProductionServer,
createServer,
ensureDirectory,
errorHandler,
generateDocument,
generateErrorPage,
generateLoadingPage,
generateToken,
getEnvironmentInfo,
getPagination,
getWasmFunctions,
hashString,
hydrate,
initNodeWasm,
isDirectoryEmpty,
isWasmReady,
jsx,
jsx as jsxs,
loadGoWasm,
loadGoWasmFromFile,
notFoundHandler,
rateLimit,
readJsonFile,
render,
renderComponent,
renderToString,
requestLogger,
safeJsonParse,
sendError,
sendSuccess,
server,
useContext,
useEffect,
useErrorBoundary,
useGoWasm,
useMemo,
useRef,
useState,
validateFields,
validateFileUpload,
writeJsonFile
};
//# sourceMappingURL=browser.js.map