baraqex 1.0.35 → 1.0.36

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.
Files changed (77) hide show
  1. package/dist/browser.js +635 -0
  2. package/dist/browser.js.map +7 -0
  3. package/dist/browser.package.json +4 -0
  4. package/dist/index.js +2024 -33
  5. package/dist/index.js.map +7 -1
  6. package/dist/server/index.js +1357 -432
  7. package/dist/server/index.js.map +7 -1
  8. package/dist/server/package.json +4 -0
  9. package/dist/wasm.js +86 -104
  10. package/dist/wasm.js.map +7 -1
  11. package/package.json +102 -86
  12. package/templates/ssr-template/esbuild.config.js +32 -3
  13. package/templates/ssr-template/package-lock.json +33 -1018
  14. package/templates/ssr-template/package.json +1 -0
  15. package/templates/ssr-template/src/App.tsx +1 -1
  16. package/dist/frontend/components/WasmLoader.d.ts +0 -1
  17. package/dist/frontend/components/WasmLoader.d.ts.map +0 -1
  18. package/dist/frontend/components/WasmLoader.js +0 -2
  19. package/dist/frontend/components/WasmLoader.js.map +0 -1
  20. package/dist/frontend/hooks/useWasm.d.ts +0 -1
  21. package/dist/frontend/hooks/useWasm.d.ts.map +0 -1
  22. package/dist/frontend/hooks/useWasm.js +0 -2
  23. package/dist/frontend/hooks/useWasm.js.map +0 -1
  24. package/dist/frontend/index.d.ts +0 -1
  25. package/dist/frontend/index.d.ts.map +0 -1
  26. package/dist/frontend/index.js +0 -2
  27. package/dist/frontend/index.js.map +0 -1
  28. package/dist/index.d.ts +0 -12
  29. package/dist/index.d.ts.map +0 -1
  30. package/dist/renderComponent.d.ts +0 -9
  31. package/dist/renderComponent.d.ts.map +0 -1
  32. package/dist/renderComponent.js +0 -39
  33. package/dist/renderComponent.js.map +0 -1
  34. package/dist/server/api-router.d.ts +0 -16
  35. package/dist/server/api-router.d.ts.map +0 -1
  36. package/dist/server/api-router.js +0 -121
  37. package/dist/server/api-router.js.map +0 -1
  38. package/dist/server/auth.d.ts +0 -33
  39. package/dist/server/auth.d.ts.map +0 -1
  40. package/dist/server/auth.js +0 -74
  41. package/dist/server/auth.js.map +0 -1
  42. package/dist/server/database.d.ts +0 -25
  43. package/dist/server/database.d.ts.map +0 -1
  44. package/dist/server/database.js +0 -109
  45. package/dist/server/database.js.map +0 -1
  46. package/dist/server/index.d.ts +0 -117
  47. package/dist/server/index.d.ts.map +0 -1
  48. package/dist/server/middleware.d.ts +0 -12
  49. package/dist/server/middleware.d.ts.map +0 -1
  50. package/dist/server/middleware.js +0 -46
  51. package/dist/server/middleware.js.map +0 -1
  52. package/dist/server/server.d.ts +0 -10
  53. package/dist/server/server.d.ts.map +0 -1
  54. package/dist/server/server.js +0 -81
  55. package/dist/server/server.js.map +0 -1
  56. package/dist/server/templates.d.ts +0 -31
  57. package/dist/server/templates.d.ts.map +0 -1
  58. package/dist/server/templates.js +0 -208
  59. package/dist/server/templates.js.map +0 -1
  60. package/dist/server/types.d.ts +0 -67
  61. package/dist/server/types.d.ts.map +0 -1
  62. package/dist/server/types.js +0 -2
  63. package/dist/server/types.js.map +0 -1
  64. package/dist/server/utils.d.ts +0 -71
  65. package/dist/server/utils.d.ts.map +0 -1
  66. package/dist/server/utils.js +0 -165
  67. package/dist/server/utils.js.map +0 -1
  68. package/dist/server/wasm.d.ts +0 -29
  69. package/dist/server/wasm.d.ts.map +0 -1
  70. package/dist/server/wasm.js +0 -208
  71. package/dist/server/wasm.js.map +0 -1
  72. package/dist/server-renderer.d.ts +0 -5
  73. package/dist/server-renderer.d.ts.map +0 -1
  74. package/dist/server-renderer.js +0 -27
  75. package/dist/server-renderer.js.map +0 -1
  76. package/dist/wasm.d.ts +0 -51
  77. package/dist/wasm.d.ts.map +0 -1
package/dist/index.js CHANGED
@@ -1,33 +1,2024 @@
1
- // Re-export everything from frontend-hamroun
2
- export * from 'frontend-hamroun';
3
- // Also export as default for compatibility
4
- // Export server functionality that actually exists and compiles
5
- export { generateDocument, generateErrorPage, generateLoadingPage } from './server/templates.js';
6
- export { safeJsonParse, generateToken, hashString, getPagination, sendSuccess, sendError, validateFields, validateFileUpload, getEnvironmentInfo, isDirectoryEmpty, ensureDirectory, writeJsonFile, readJsonFile } from './server/utils.js';
7
- // Export server-renderer functions
8
- export { renderToString as baraqexRenderToString } from './server-renderer.js';
9
- // Export middleware functions
10
- export { requestLogger, errorHandler, notFoundHandler, rateLimit } from './server/middleware.js';
11
- // Export WASM functionality (browser-only functions)
12
- export { loadGoWasm, callWasmFunction, isWasmReady, getWasmFunctions, useGoWasm } from './wasm.js';
13
- export { Server as BaraqexServer } from './server/index.js';
14
- // Export server functionality
15
- export { createDevServer, createServer, createProductionServer } from './server/index.js';
16
- // Simple renderToString function for SSR compatibility
17
- export function renderToString(content) {
18
- if (typeof content === 'string') {
19
- return Promise.resolve(content);
20
- }
21
- if (typeof content === 'function') {
22
- try {
23
- const result = content();
24
- return Promise.resolve(String(result));
25
- }
26
- catch (error) {
27
- return Promise.resolve(`<!-- Error rendering: ${error} -->`);
28
- }
29
- }
30
- return Promise.resolve(String(content));
31
- }
32
- console.log('Baraqex - powered by Frontend Hamroun Framework with additional utilities');
33
- //# sourceMappingURL=index.js.map
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropNames = Object.getOwnPropertyNames;
3
+ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
4
+ get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
5
+ }) : x)(function(x) {
6
+ if (typeof require !== "undefined")
7
+ return require.apply(this, arguments);
8
+ throw Error('Dynamic require of "' + x + '" is not supported');
9
+ });
10
+ var __esm = (fn, res) => function __init() {
11
+ return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
12
+ };
13
+ var __export = (target, all) => {
14
+ for (var name in all)
15
+ __defProp(target, name, { get: all[name], enumerable: true });
16
+ };
17
+
18
+ // node_modules/frontend-hamroun/dist/index.mjs
19
+ function batchUpdates(fn) {
20
+ if (isBatching) {
21
+ queue.push(fn);
22
+ return;
23
+ }
24
+ isBatching = true;
25
+ try {
26
+ fn();
27
+ while (queue.length > 0) {
28
+ const nextFn = queue.shift();
29
+ nextFn == null ? void 0 : nextFn();
30
+ }
31
+ } finally {
32
+ isBatching = false;
33
+ }
34
+ }
35
+ function setRenderCallback(callback, element, container) {
36
+ globalRenderCallback = callback;
37
+ globalContainer = container;
38
+ currentElement = element;
39
+ }
40
+ function prepareRender() {
41
+ currentRender++;
42
+ stateIndices.set(currentRender, 0);
43
+ return currentRender;
44
+ }
45
+ function finishRender() {
46
+ if (isServer) {
47
+ serverStates.delete(currentRender);
48
+ }
49
+ currentRender = 0;
50
+ }
51
+ function useState(initial) {
52
+ if (!currentRender) {
53
+ throw new Error("useState must be called within a render");
54
+ }
55
+ if (isServer) {
56
+ if (!serverStates.has(currentRender)) {
57
+ serverStates.set(currentRender, /* @__PURE__ */ new Map());
58
+ }
59
+ const componentState = serverStates.get(currentRender);
60
+ const index2 = stateIndices.get(currentRender) || 0;
61
+ if (!componentState.has(index2)) {
62
+ componentState.set(index2, initial);
63
+ }
64
+ const state2 = componentState.get(index2);
65
+ const setState2 = (newValue) => {
66
+ };
67
+ stateIndices.set(currentRender, index2 + 1);
68
+ return [state2, setState2];
69
+ }
70
+ if (!states.has(currentRender)) {
71
+ states.set(currentRender, []);
72
+ }
73
+ const componentStates = states.get(currentRender);
74
+ const index = stateIndices.get(currentRender);
75
+ if (index >= componentStates.length) {
76
+ componentStates.push(initial);
77
+ }
78
+ const state = componentStates[index];
79
+ const setState = (newValue) => {
80
+ const nextValue = typeof newValue === "function" ? newValue(componentStates[index]) : newValue;
81
+ if (componentStates[index] === nextValue)
82
+ return;
83
+ componentStates[index] = nextValue;
84
+ if (isBatching) {
85
+ batchUpdates(() => rerender(currentRender));
86
+ } else {
87
+ rerender(currentRender);
88
+ }
89
+ };
90
+ stateIndices.set(currentRender, index + 1);
91
+ return [state, setState];
92
+ }
93
+ function useEffect(callback, deps) {
94
+ if (!currentRender)
95
+ throw new Error("useEffect must be called within a render");
96
+ const effectIndex = stateIndices.get(currentRender);
97
+ if (!effects.has(currentRender)) {
98
+ effects.set(currentRender, []);
99
+ }
100
+ const componentEffects = effects.get(currentRender);
101
+ const prevEffect = componentEffects[effectIndex];
102
+ if (!prevEffect || !deps || !prevEffect.deps || deps.some((dep, i) => dep !== prevEffect.deps[i])) {
103
+ if (prevEffect == null ? void 0 : prevEffect.cleanup) {
104
+ prevEffect.cleanup();
105
+ }
106
+ queueMicrotask(() => {
107
+ const cleanup = callback() || void 0;
108
+ componentEffects[effectIndex] = { cleanup, deps };
109
+ });
110
+ }
111
+ stateIndices.set(currentRender, effectIndex + 1);
112
+ }
113
+ function useMemo(factory, deps) {
114
+ if (!currentRender)
115
+ throw new Error("useMemo must be called within a render");
116
+ const memoIndex = stateIndices.get(currentRender);
117
+ if (!memos.has(currentRender)) {
118
+ memos.set(currentRender, []);
119
+ }
120
+ const componentMemos = memos.get(currentRender);
121
+ const prevMemo = componentMemos[memoIndex];
122
+ if (!prevMemo || deps && deps.some((dep, i) => !Object.is(dep, prevMemo.deps[i]))) {
123
+ const value = factory();
124
+ componentMemos[memoIndex] = { value, deps };
125
+ stateIndices.set(currentRender, memoIndex + 1);
126
+ return value;
127
+ }
128
+ stateIndices.set(currentRender, memoIndex + 1);
129
+ return prevMemo.value;
130
+ }
131
+ function useRef(initial) {
132
+ if (!currentRender)
133
+ throw new Error("useRef must be called within a render");
134
+ const refIndex = stateIndices.get(currentRender);
135
+ if (!refs.has(currentRender)) {
136
+ refs.set(currentRender, []);
137
+ }
138
+ const componentRefs = refs.get(currentRender);
139
+ if (refIndex >= componentRefs.length) {
140
+ const ref2 = { current: initial };
141
+ componentRefs.push(ref2);
142
+ stateIndices.set(currentRender, refIndex + 1);
143
+ return ref2;
144
+ }
145
+ const ref = componentRefs[refIndex];
146
+ stateIndices.set(currentRender, refIndex + 1);
147
+ return ref;
148
+ }
149
+ async function rerender(rendererId) {
150
+ try {
151
+ const componentEffects = effects.get(rendererId);
152
+ if (componentEffects) {
153
+ componentEffects.forEach((effect) => {
154
+ if (effect.cleanup)
155
+ effect.cleanup();
156
+ });
157
+ effects.set(rendererId, []);
158
+ }
159
+ if (globalRenderCallback && globalContainer && currentElement) {
160
+ await globalRenderCallback(currentElement, globalContainer);
161
+ }
162
+ } catch (error) {
163
+ console.error("Error during rerender:", error);
164
+ }
165
+ }
166
+ function useErrorBoundary() {
167
+ const [error, setError] = useState(null);
168
+ return [error, () => setError(null)];
169
+ }
170
+ function createContext(defaultValue) {
171
+ const context = {
172
+ Provider: ({ value, children }) => {
173
+ return children;
174
+ },
175
+ Consumer: ({ children }) => {
176
+ return children(defaultValue);
177
+ },
178
+ _id: Symbol(),
179
+ useSelector: (selector) => {
180
+ return selector(defaultValue);
181
+ }
182
+ };
183
+ return context;
184
+ }
185
+ function useContext(context) {
186
+ return context;
187
+ }
188
+ function jsx(type, props) {
189
+ console.log("JSX Transform:", { type, props });
190
+ const processedProps = { ...props };
191
+ if (arguments.length > 2) {
192
+ processedProps.children = Array.prototype.slice.call(arguments, 2);
193
+ }
194
+ return { type, props: processedProps };
195
+ }
196
+ async function createElement(vnode) {
197
+ var _a;
198
+ console.log("Creating element from:", vnode);
199
+ if (vnode == null) {
200
+ return document.createTextNode("");
201
+ }
202
+ if (typeof vnode === "boolean") {
203
+ return document.createTextNode("");
204
+ }
205
+ if (typeof vnode === "number" || typeof vnode === "string") {
206
+ return document.createTextNode(String(vnode));
207
+ }
208
+ if (Array.isArray(vnode)) {
209
+ const fragment = document.createDocumentFragment();
210
+ for (const child of vnode) {
211
+ const node = await createElement(child);
212
+ fragment.appendChild(node);
213
+ }
214
+ return fragment;
215
+ }
216
+ if ("type" in vnode && vnode.props !== void 0) {
217
+ const { type, props } = vnode;
218
+ if (typeof type === "function") {
219
+ try {
220
+ const result = await type(props || {});
221
+ const node = await createElement(result);
222
+ if (node instanceof Element) {
223
+ node.setAttribute("data-component-id", type.name || type.toString());
224
+ }
225
+ return node;
226
+ } catch (error) {
227
+ console.error("Error rendering component:", error);
228
+ return document.createTextNode("");
229
+ }
230
+ }
231
+ const element = document.createElement(type);
232
+ for (const [key, value] of Object.entries(props || {})) {
233
+ if (key === "children")
234
+ continue;
235
+ if (key.startsWith("on") && typeof value === "function") {
236
+ const eventName = key.toLowerCase().slice(2);
237
+ const existingHandler = (_a = element.__events) == null ? void 0 : _a[eventName];
238
+ if (existingHandler) {
239
+ element.removeEventListener(eventName, existingHandler);
240
+ }
241
+ element.addEventListener(eventName, value);
242
+ if (!element.__events) {
243
+ element.__events = {};
244
+ }
245
+ element.__events[eventName] = value;
246
+ } else if (key === "style" && typeof value === "object") {
247
+ Object.assign(element.style, value);
248
+ } else if (key === "className") {
249
+ element.setAttribute("class", String(value));
250
+ } else if (key !== "key" && key !== "ref") {
251
+ element.setAttribute(key, String(value));
252
+ }
253
+ }
254
+ const children = props == null ? void 0 : props.children;
255
+ if (children != null) {
256
+ const childArray = Array.isArray(children) ? children.flat() : [children];
257
+ for (const child of childArray) {
258
+ const childNode = await createElement(child);
259
+ element.appendChild(childNode);
260
+ }
261
+ }
262
+ return element;
263
+ }
264
+ return document.createTextNode(String(vnode));
265
+ }
266
+ async function hydrate(element, container) {
267
+ isHydrating = true;
268
+ try {
269
+ await render(element, container);
270
+ } finally {
271
+ isHydrating = false;
272
+ }
273
+ }
274
+ async function render(element, container) {
275
+ console.log("Rendering to:", container.id);
276
+ batchUpdates(async () => {
277
+ const rendererId = prepareRender();
278
+ try {
279
+ setRenderCallback(render, element, container);
280
+ const domNode = await createElement(element);
281
+ if (!isHydrating) {
282
+ container.innerHTML = "";
283
+ }
284
+ container.appendChild(domNode);
285
+ } finally {
286
+ finishRender();
287
+ }
288
+ });
289
+ }
290
+ function renderToString(vnode) {
291
+ prepareRender();
292
+ const html = renderNodeToString(vnode);
293
+ finishRender();
294
+ return html;
295
+ }
296
+ function renderNodeToString(vnode) {
297
+ var _a, _b, _c;
298
+ if (vnode === null || vnode === void 0)
299
+ return "";
300
+ if (typeof vnode === "boolean")
301
+ return "";
302
+ if (typeof vnode === "number" || typeof vnode === "string")
303
+ return escapeHtml(String(vnode));
304
+ if (typeof vnode.type === "function") {
305
+ const Component2 = vnode.type;
306
+ const renderedNode = Component2(vnode.props || {});
307
+ return renderNodeToString(renderedNode);
308
+ }
309
+ if (typeof vnode.type === "string") {
310
+ const tag = vnode.type;
311
+ let attrs = "";
312
+ let children = "";
313
+ if (vnode.props) {
314
+ for (const [key, value] of Object.entries(vnode.props)) {
315
+ if (key === "children")
316
+ continue;
317
+ if (key.startsWith("on"))
318
+ continue;
319
+ if (key === "className") {
320
+ attrs += ` class="${escapeHtml(value)}"`;
321
+ continue;
322
+ }
323
+ if (typeof value === "string" || typeof value === "number") {
324
+ attrs += ` ${key}="${escapeHtml(String(value))}"`;
325
+ } else if (value === true) {
326
+ attrs += ` ${key}`;
327
+ }
328
+ }
329
+ }
330
+ const childrenArray = ((_a = vnode.props) == null ? void 0 : _a.children) ? Array.isArray(vnode.props.children) ? vnode.props.children : [vnode.props.children] : [];
331
+ for (const child of childrenArray) {
332
+ children += renderNodeToString(child);
333
+ }
334
+ const selfClosing = [
335
+ "area",
336
+ "base",
337
+ "br",
338
+ "col",
339
+ "embed",
340
+ "hr",
341
+ "img",
342
+ "input",
343
+ "link",
344
+ "meta",
345
+ "param",
346
+ "source",
347
+ "track",
348
+ "wbr"
349
+ ];
350
+ if (selfClosing.includes(tag)) {
351
+ return `<${tag}${attrs}/>`;
352
+ }
353
+ return `<${tag}${attrs}>${children}</${tag}>`;
354
+ }
355
+ if (vnode.type === Symbol.for("react.fragment")) {
356
+ let fragmentOutput = "";
357
+ const children = Array.isArray((_b = vnode.props) == null ? void 0 : _b.children) ? vnode.props.children : ((_c = vnode.props) == null ? void 0 : _c.children) ? [vnode.props.children] : [];
358
+ for (const child of children) {
359
+ fragmentOutput += renderNodeToString(child);
360
+ }
361
+ return fragmentOutput;
362
+ }
363
+ console.warn("Unknown vnode type:", vnode.type);
364
+ return "";
365
+ }
366
+ function escapeHtml(text) {
367
+ return text.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&#039;");
368
+ }
369
+ var isBatching, queue, currentRender, states, stateIndices, effects, memos, refs, globalRenderCallback, globalContainer, currentElement, isServer, serverStates, Fragment, isHydrating, server;
370
+ var init_dist = __esm({
371
+ "node_modules/frontend-hamroun/dist/index.mjs"() {
372
+ isBatching = false;
373
+ queue = [];
374
+ currentRender = 0;
375
+ states = /* @__PURE__ */ new Map();
376
+ stateIndices = /* @__PURE__ */ new Map();
377
+ effects = /* @__PURE__ */ new Map();
378
+ memos = /* @__PURE__ */ new Map();
379
+ refs = /* @__PURE__ */ new Map();
380
+ globalRenderCallback = null;
381
+ globalContainer = null;
382
+ currentElement = null;
383
+ isServer = typeof window === "undefined";
384
+ serverStates = /* @__PURE__ */ new Map();
385
+ Fragment = ({ children }) => children;
386
+ isHydrating = false;
387
+ server = {
388
+ async getServer() {
389
+ throw new Error("Server module can only be used in Node.js environment");
390
+ }
391
+ };
392
+ }
393
+ });
394
+
395
+ // src/server/templates.ts
396
+ var templates_exports = {};
397
+ __export(templates_exports, {
398
+ generateDocument: () => generateDocument,
399
+ generateErrorPage: () => generateErrorPage,
400
+ generateLoadingPage: () => generateLoadingPage
401
+ });
402
+ function generateDocument(content, options = {}) {
403
+ const {
404
+ title = "Frontend Hamroun App",
405
+ description = "",
406
+ lang = "en",
407
+ charset = "UTF-8",
408
+ viewport = "width=device-width, initial-scale=1.0",
409
+ scripts = [],
410
+ styles = [],
411
+ meta = {},
412
+ bodyClasses = "",
413
+ htmlAttrs = {},
414
+ bodyAttrs = {},
415
+ initialData = {},
416
+ componentName = ""
417
+ } = options;
418
+ const htmlAttributes = Object.entries(htmlAttrs).map(([key, value]) => `${key}="${escapeHtml2(value)}"`).join(" ");
419
+ const bodyAttributes = Object.entries(bodyAttrs).map(([key, value]) => `${key}="${escapeHtml2(value)}"`).join(" ");
420
+ const metaTags = [
421
+ `<meta charset="${charset}">`,
422
+ `<meta name="viewport" content="${viewport}">`,
423
+ description ? `<meta name="description" content="${escapeHtml2(description)}">` : ""
424
+ ];
425
+ Object.entries(meta).forEach(([name, content2]) => {
426
+ metaTags.push(`<meta name="${escapeHtml2(name)}" content="${escapeHtml2(content2)}">`);
427
+ });
428
+ const scriptTags = scripts.map((src) => {
429
+ if (src.startsWith("<script")) {
430
+ return src;
431
+ }
432
+ return `<script src="${escapeHtml2(src)}" ${src.endsWith(".js") ? 'type="module"' : ""} defer></script>`;
433
+ });
434
+ const styleTags = styles.map((href) => {
435
+ if (href.startsWith("<style")) {
436
+ return href;
437
+ }
438
+ return `<link rel="stylesheet" href="${escapeHtml2(href)}">`;
439
+ });
440
+ const initialDataScript = Object.keys(initialData).length > 0 ? `<script id="__APP_DATA__" type="application/json">${escapeHtml2(JSON.stringify(initialData))}</script>` : "";
441
+ return `<!DOCTYPE html>
442
+ <html lang="${lang}" ${htmlAttributes}>
443
+ <head>
444
+ ${metaTags.filter(Boolean).join("\n ")}
445
+ <title>${escapeHtml2(title)}</title>
446
+ ${styleTags.join("\n ")}
447
+ </head>
448
+ <body class="${bodyClasses}" ${bodyAttributes}>
449
+ <div id="app-root" data-ssr-root${componentName ? ` data-component="${escapeHtml2(componentName)}"` : ""}>${content}</div>
450
+ ${initialDataScript}
451
+ ${scriptTags.join("\n ")}
452
+ </body>
453
+ </html>`;
454
+ }
455
+ function generateErrorPage(statusCode, message, error) {
456
+ const errorMessages = {
457
+ 400: "Bad Request",
458
+ 401: "Unauthorized",
459
+ 403: "Forbidden",
460
+ 404: "Not Found",
461
+ 500: "Internal Server Error"
462
+ };
463
+ const title = `${statusCode} - ${errorMessages[statusCode] || "Error"}`;
464
+ const isDev = process.env.NODE_ENV !== "production";
465
+ const errorDetails = isDev && error ? `
466
+ <div class="error-details">
467
+ <pre>${escapeHtml2(error.stack || error.message)}</pre>
468
+ </div>
469
+ ` : "";
470
+ const content = `
471
+ <div class="error-container">
472
+ <h1>${statusCode}</h1>
473
+ <h2>${escapeHtml2(errorMessages[statusCode] || "Error")}</h2>
474
+ <p>${escapeHtml2(message)}</p>
475
+ ${errorDetails}
476
+ <a href="/" class="home-link">Back to Home</a>
477
+ </div>
478
+ `;
479
+ const styles = [`<style>
480
+ body {
481
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
482
+ display: flex;
483
+ justify-content: center;
484
+ align-items: center;
485
+ min-height: 100vh;
486
+ margin: 0;
487
+ background-color: #f7f7f7;
488
+ color: #333;
489
+ }
490
+ .error-container {
491
+ text-align: center;
492
+ padding: 2rem;
493
+ border-radius: 8px;
494
+ background-color: white;
495
+ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
496
+ max-width: 600px;
497
+ width: 100%;
498
+ }
499
+ h1 {
500
+ font-size: 6rem;
501
+ margin: 0;
502
+ color: #e74c3c;
503
+ }
504
+ h2 {
505
+ margin-top: 0;
506
+ margin-bottom: 1rem;
507
+ color: #333;
508
+ }
509
+ .error-details {
510
+ text-align: left;
511
+ margin: 2rem 0;
512
+ padding: 1rem;
513
+ background-color: #f8f8f8;
514
+ border-radius: 4px;
515
+ overflow: auto;
516
+ }
517
+ pre {
518
+ margin: 0;
519
+ font-family: monospace;
520
+ font-size: 0.85rem;
521
+ white-space: pre-wrap;
522
+ }
523
+ .home-link {
524
+ display: inline-block;
525
+ margin-top: 1.5rem;
526
+ padding: 0.75rem 1.5rem;
527
+ background-color: #3498db;
528
+ color: white;
529
+ text-decoration: none;
530
+ border-radius: 4px;
531
+ transition: background-color 0.2s;
532
+ }
533
+ .home-link:hover {
534
+ background-color: #2980b9;
535
+ }
536
+ </style>`];
537
+ return generateDocument(content, {
538
+ title,
539
+ description: `Error ${statusCode}: ${errorMessages[statusCode] || "Error"}`,
540
+ bodyClasses: "error-page",
541
+ styles
542
+ });
543
+ }
544
+ function generateLoadingPage(message = "Loading...") {
545
+ const content = `
546
+ <div class="loading-container">
547
+ <div class="spinner"></div>
548
+ <p>${escapeHtml2(message)}</p>
549
+ </div>
550
+ `;
551
+ const styles = [`<style>
552
+ body {
553
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
554
+ display: flex;
555
+ justify-content: center;
556
+ align-items: center;
557
+ min-height: 100vh;
558
+ margin: 0;
559
+ background-color: #f7f7f7;
560
+ color: #333;
561
+ }
562
+ .loading-container {
563
+ text-align: center;
564
+ }
565
+ .spinner {
566
+ width: 50px;
567
+ height: 50px;
568
+ border: 5px solid rgba(0, 0, 0, 0.1);
569
+ border-radius: 50%;
570
+ border-top-color: #3498db;
571
+ animation: spin 1s ease-in-out infinite;
572
+ margin: 0 auto 20px;
573
+ }
574
+ @keyframes spin {
575
+ to { transform: rotate(360deg); }
576
+ }
577
+ </style>`];
578
+ return generateDocument(content, {
579
+ title: "Loading",
580
+ bodyClasses: "loading-page",
581
+ styles
582
+ });
583
+ }
584
+ function escapeHtml2(text) {
585
+ return String(text).replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&#039;");
586
+ }
587
+ var init_templates = __esm({
588
+ "src/server/templates.ts"() {
589
+ "use strict";
590
+ }
591
+ });
592
+
593
+ // src/server/database.ts
594
+ var Database;
595
+ var init_database = __esm({
596
+ "src/server/database.ts"() {
597
+ "use strict";
598
+ Database = class {
599
+ constructor(config) {
600
+ this.mongoClient = null;
601
+ this.mongoDb = null;
602
+ this.mysqlPool = null;
603
+ this.pgPool = null;
604
+ this.config = config;
605
+ }
606
+ async connect() {
607
+ switch (this.config.type) {
608
+ case "mongodb":
609
+ await this.connectMongo();
610
+ break;
611
+ case "mysql":
612
+ await this.connectMysql();
613
+ break;
614
+ case "postgres":
615
+ await this.connectPostgres();
616
+ break;
617
+ default:
618
+ throw new Error(`Unsupported database type: ${this.config.type}`);
619
+ }
620
+ }
621
+ async connectMongo() {
622
+ try {
623
+ const { MongoClient } = await import("mongodb");
624
+ this.mongoClient = new MongoClient(this.config.url);
625
+ await this.mongoClient.connect();
626
+ this.mongoDb = this.mongoClient.db();
627
+ console.log("Connected to MongoDB");
628
+ } catch (error) {
629
+ if (error.code === "MODULE_NOT_FOUND") {
630
+ throw new Error("MongoDB driver not installed. Run: npm install mongodb");
631
+ }
632
+ console.error("MongoDB connection error:", error);
633
+ throw error;
634
+ }
635
+ }
636
+ async connectMysql() {
637
+ try {
638
+ const mysql = await import("mysql2/promise");
639
+ this.mysqlPool = mysql.createPool(this.config.url);
640
+ await this.mysqlPool.getConnection();
641
+ console.log("Connected to MySQL");
642
+ } catch (error) {
643
+ if (error.code === "MODULE_NOT_FOUND") {
644
+ throw new Error("MySQL driver not installed. Run: npm install mysql2");
645
+ }
646
+ console.error("MySQL connection error:", error);
647
+ throw error;
648
+ }
649
+ }
650
+ async connectPostgres() {
651
+ try {
652
+ const pg = await import("pg");
653
+ this.pgPool = new pg.Pool({ connectionString: this.config.url });
654
+ const client = await this.pgPool.connect();
655
+ client.release();
656
+ console.log("Connected to PostgreSQL");
657
+ } catch (error) {
658
+ if (error.code === "MODULE_NOT_FOUND") {
659
+ throw new Error("PostgreSQL driver not installed. Run: npm install pg @types/pg");
660
+ }
661
+ console.error("PostgreSQL connection error:", error);
662
+ throw error;
663
+ }
664
+ }
665
+ async disconnect() {
666
+ if (this.mongoClient) {
667
+ await this.mongoClient.close();
668
+ this.mongoClient = null;
669
+ this.mongoDb = null;
670
+ }
671
+ if (this.mysqlPool) {
672
+ await this.mysqlPool.end();
673
+ this.mysqlPool = null;
674
+ }
675
+ if (this.pgPool) {
676
+ await this.pgPool.end();
677
+ this.pgPool = null;
678
+ }
679
+ }
680
+ // Database-specific methods
681
+ getMongoDb() {
682
+ return this.mongoDb;
683
+ }
684
+ getMysqlPool() {
685
+ return this.mysqlPool;
686
+ }
687
+ getPgPool() {
688
+ return this.pgPool;
689
+ }
690
+ // Generic query method
691
+ async query(sql, values) {
692
+ switch (this.config.type) {
693
+ case "mongodb":
694
+ throw new Error("For MongoDB, use getMongoDb() instead of query()");
695
+ case "mysql":
696
+ if (!this.mysqlPool)
697
+ throw new Error("MySQL not connected");
698
+ const [rows] = await this.mysqlPool.execute(sql, values || []);
699
+ return rows;
700
+ case "postgres":
701
+ if (!this.pgPool)
702
+ throw new Error("PostgreSQL not connected");
703
+ const result = await this.pgPool.query(sql, values || []);
704
+ return result.rows;
705
+ default:
706
+ throw new Error(`Unsupported database type: ${this.config.type}`);
707
+ }
708
+ }
709
+ };
710
+ }
711
+ });
712
+
713
+ // src/server/auth.ts
714
+ var AuthService;
715
+ var init_auth = __esm({
716
+ "src/server/auth.ts"() {
717
+ "use strict";
718
+ AuthService = class {
719
+ constructor(config) {
720
+ this.config = {
721
+ expiresIn: "24h",
722
+ ...config
723
+ };
724
+ }
725
+ async hashPassword(password) {
726
+ try {
727
+ const bcrypt = await import("bcryptjs");
728
+ return bcrypt.hash(password, 10);
729
+ } catch (error) {
730
+ if (error.code === "MODULE_NOT_FOUND") {
731
+ throw new Error("bcryptjs not installed. Run: npm install bcryptjs @types/bcryptjs");
732
+ }
733
+ throw error;
734
+ }
735
+ }
736
+ async comparePasswords(password, hashedPassword) {
737
+ try {
738
+ const bcrypt = await import("bcryptjs");
739
+ return bcrypt.compare(password, hashedPassword);
740
+ } catch (error) {
741
+ if (error.code === "MODULE_NOT_FOUND") {
742
+ throw new Error("bcryptjs not installed. Run: npm install bcryptjs @types/bcryptjs");
743
+ }
744
+ throw error;
745
+ }
746
+ }
747
+ generateToken(user) {
748
+ try {
749
+ const jwt = __require("jsonwebtoken");
750
+ const options = {};
751
+ if (this.config.expiresIn) {
752
+ options.expiresIn = this.config.expiresIn;
753
+ }
754
+ return jwt.sign(
755
+ { id: user.id, username: user.username, roles: user.roles || [] },
756
+ this.config.secret,
757
+ options
758
+ );
759
+ } catch (error) {
760
+ if (error.code === "MODULE_NOT_FOUND") {
761
+ throw new Error("jsonwebtoken not installed. Run: npm install jsonwebtoken @types/jsonwebtoken");
762
+ }
763
+ throw error;
764
+ }
765
+ }
766
+ verifyToken(token) {
767
+ try {
768
+ const jwt = __require("jsonwebtoken");
769
+ return jwt.verify(token, this.config.secret);
770
+ } catch (error) {
771
+ if (error.code === "MODULE_NOT_FOUND") {
772
+ throw new Error("jsonwebtoken not installed. Run: npm install jsonwebtoken @types/jsonwebtoken");
773
+ }
774
+ return null;
775
+ }
776
+ }
777
+ // Express middleware for authentication
778
+ initialize() {
779
+ return (req, res, next) => {
780
+ const token = this.extractToken(req);
781
+ if (token) {
782
+ const decoded = this.verifyToken(token);
783
+ if (decoded) {
784
+ req.user = decoded;
785
+ }
786
+ }
787
+ next();
788
+ };
789
+ }
790
+ // Express middleware for requiring authentication
791
+ requireAuth() {
792
+ return (req, res, next) => {
793
+ if (!req.user) {
794
+ return res.status(401).json({ message: "Unauthorized" });
795
+ }
796
+ return next();
797
+ };
798
+ }
799
+ // Express middleware for requiring specific roles
800
+ requireRoles(roles) {
801
+ return (req, res, next) => {
802
+ if (!req.user) {
803
+ return res.status(401).json({ message: "Unauthorized" });
804
+ }
805
+ const userRoles = req.user.roles || [];
806
+ const hasRequiredRole = roles.some((role) => userRoles.includes(role));
807
+ if (!hasRequiredRole) {
808
+ return res.status(403).json({ message: "Forbidden" });
809
+ }
810
+ return next();
811
+ };
812
+ }
813
+ extractToken(req) {
814
+ if (req.headers.authorization && req.headers.authorization.startsWith("Bearer ")) {
815
+ return req.headers.authorization.substring(7);
816
+ }
817
+ return null;
818
+ }
819
+ };
820
+ }
821
+ });
822
+
823
+ // src/server/api-router.ts
824
+ import path from "path";
825
+ import fs from "fs";
826
+ import { pathToFileURL } from "url";
827
+ var ApiRouter;
828
+ var init_api_router = __esm({
829
+ "src/server/api-router.ts"() {
830
+ "use strict";
831
+ ApiRouter = class {
832
+ constructor(apiDir, auth = null) {
833
+ this.router = null;
834
+ this.apiDir = path.resolve(process.cwd(), apiDir);
835
+ this.auth = auth;
836
+ this.initializeRouter();
837
+ }
838
+ async initializeRouter() {
839
+ try {
840
+ const express = await import("express");
841
+ this.router = express.default.Router();
842
+ this.setupRoutes();
843
+ } catch (error) {
844
+ if (error.code === "MODULE_NOT_FOUND") {
845
+ throw new Error("Express not installed. Run: npm install express @types/express");
846
+ }
847
+ throw error;
848
+ }
849
+ }
850
+ setupRoutes() {
851
+ if (!fs.existsSync(this.apiDir)) {
852
+ console.log(`API directory not found: ${this.apiDir}`);
853
+ return;
854
+ }
855
+ this.scanDirectory(this.apiDir, "");
856
+ }
857
+ scanDirectory(dirPath, routePrefix) {
858
+ const entries = fs.readdirSync(dirPath, { withFileTypes: true });
859
+ for (const entry of entries) {
860
+ const fullPath = path.join(dirPath, entry.name);
861
+ if (entry.isDirectory()) {
862
+ this.scanDirectory(fullPath, `${routePrefix}/${entry.name}`);
863
+ } else if (this.isRouteFile(entry.name)) {
864
+ const routePath = this.getRoutePath(entry.name, routePrefix);
865
+ this.registerRoute(fullPath, routePath);
866
+ }
867
+ }
868
+ }
869
+ isRouteFile(filename) {
870
+ return filename.endsWith(".js") || filename.endsWith(".ts") || filename.endsWith(".mjs");
871
+ }
872
+ getRoutePath(filename, routePrefix) {
873
+ const baseName = path.basename(filename, path.extname(filename));
874
+ if (baseName === "index") {
875
+ return routePrefix || "/";
876
+ }
877
+ const paramMatch = baseName.match(/^\[(.+)\]$/);
878
+ if (paramMatch) {
879
+ return `${routePrefix}/:${paramMatch[1]}`;
880
+ }
881
+ return `${routePrefix}/${baseName}`;
882
+ }
883
+ async registerRoute(filePath, routePath) {
884
+ try {
885
+ const absolutePath = path.isAbsolute(filePath) ? filePath : path.resolve(filePath);
886
+ const fileUrl = pathToFileURL(absolutePath).href;
887
+ if (process.platform === "win32") {
888
+ const urlWithTimestamp = `${fileUrl}?t=${Date.now()}`;
889
+ const routeModule = await import(urlWithTimestamp);
890
+ if (!this.isValidRouteModule(routeModule)) {
891
+ console.warn(`Invalid route module: ${filePath}`);
892
+ return;
893
+ }
894
+ console.log(`Registering API route: ${routePath}`);
895
+ const middleware = routeModule.middleware || [];
896
+ for (const method of ["get", "post", "put", "delete", "patch", "options"]) {
897
+ const handler = routeModule[method];
898
+ if (typeof handler === "function") {
899
+ const routerMethod = this.router[method];
900
+ routerMethod.call(
901
+ this.router,
902
+ routePath,
903
+ ...middleware,
904
+ this.wrapHandler(handler)
905
+ );
906
+ }
907
+ }
908
+ } else {
909
+ const routeModule = await import(fileUrl);
910
+ if (!this.isValidRouteModule(routeModule)) {
911
+ console.warn(`Invalid route module: ${filePath}`);
912
+ return;
913
+ }
914
+ console.log(`Registering API route: ${routePath}`);
915
+ const middleware = routeModule.middleware || [];
916
+ for (const method of ["get", "post", "put", "delete", "patch", "options"]) {
917
+ const handler = routeModule[method];
918
+ if (typeof handler === "function") {
919
+ const routerMethod = this.router[method];
920
+ routerMethod.call(
921
+ this.router,
922
+ routePath,
923
+ ...middleware,
924
+ this.wrapHandler(handler)
925
+ );
926
+ }
927
+ }
928
+ }
929
+ } catch (error) {
930
+ console.error(`Error registering route (${filePath}):`, error);
931
+ }
932
+ }
933
+ isValidRouteModule(module) {
934
+ if (!module)
935
+ return false;
936
+ return ["get", "post", "put", "delete", "patch", "options"].some((method) => typeof module[method] === "function");
937
+ }
938
+ wrapHandler(handler) {
939
+ return async (req, res, next) => {
940
+ try {
941
+ await handler(req, res, next);
942
+ } catch (error) {
943
+ next(error);
944
+ }
945
+ };
946
+ }
947
+ };
948
+ }
949
+ });
950
+
951
+ // src/server/middleware.ts
952
+ function rateLimit(options) {
953
+ const requests = /* @__PURE__ */ new Map();
954
+ return (req, res, next) => {
955
+ const ip = req.ip || req.socket.remoteAddress || "unknown";
956
+ const now = Date.now();
957
+ const reqTimes = (requests.get(ip) || []).filter((time) => now - time < options.windowMs);
958
+ reqTimes.push(now);
959
+ requests.set(ip, reqTimes);
960
+ if (reqTimes.length > options.max) {
961
+ return res.status(429).json({
962
+ error: {
963
+ message: "Too Many Requests",
964
+ retryAfter: Math.ceil(options.windowMs / 1e3)
965
+ }
966
+ });
967
+ }
968
+ return next();
969
+ };
970
+ }
971
+ var requestLogger, errorHandler, notFoundHandler;
972
+ var init_middleware = __esm({
973
+ "src/server/middleware.ts"() {
974
+ "use strict";
975
+ requestLogger = (req, res, next) => {
976
+ console.log(`${(/* @__PURE__ */ new Date()).toISOString()} - ${req.method} ${req.url}`);
977
+ next();
978
+ };
979
+ errorHandler = (err, req, res, next) => {
980
+ console.error(err.stack);
981
+ res.status(500).json({
982
+ error: {
983
+ message: "Internal Server Error",
984
+ ...process.env.NODE_ENV !== "production" ? { details: err.message, stack: err.stack } : {}
985
+ }
986
+ });
987
+ };
988
+ notFoundHandler = (req, res) => {
989
+ res.status(404).json({
990
+ error: {
991
+ message: `Not Found - ${req.method} ${req.url}`
992
+ }
993
+ });
994
+ };
995
+ }
996
+ });
997
+
998
+ // src/server/utils.ts
999
+ var utils_exports = {};
1000
+ __export(utils_exports, {
1001
+ ensureDirectory: () => ensureDirectory,
1002
+ generateToken: () => generateToken,
1003
+ getEnvironmentInfo: () => getEnvironmentInfo,
1004
+ getPagination: () => getPagination,
1005
+ hashString: () => hashString,
1006
+ isDirectoryEmpty: () => isDirectoryEmpty,
1007
+ readJsonFile: () => readJsonFile,
1008
+ safeJsonParse: () => safeJsonParse,
1009
+ sendError: () => sendError,
1010
+ sendSuccess: () => sendSuccess,
1011
+ validateFields: () => validateFields,
1012
+ validateFileUpload: () => validateFileUpload,
1013
+ writeJsonFile: () => writeJsonFile
1014
+ });
1015
+ import crypto2 from "crypto";
1016
+ import fs2 from "fs/promises";
1017
+ import path2 from "path";
1018
+ function safeJsonParse(json, fallback) {
1019
+ try {
1020
+ return JSON.parse(json);
1021
+ } catch (error) {
1022
+ return fallback;
1023
+ }
1024
+ }
1025
+ function generateToken(length = 32) {
1026
+ return crypto2.randomBytes(length).toString("hex");
1027
+ }
1028
+ function hashString(input, salt = "") {
1029
+ return crypto2.createHash("sha256").update(input + salt).digest("hex");
1030
+ }
1031
+ function getPagination(req) {
1032
+ const page = Math.max(1, parseInt(req.query.page) || 1);
1033
+ const rawLimit = parseInt(req.query.limit);
1034
+ let limit;
1035
+ if (isNaN(rawLimit) || rawLimit <= 0) {
1036
+ limit = 20;
1037
+ } else {
1038
+ limit = Math.max(1, Math.min(100, rawLimit));
1039
+ }
1040
+ const skip = (page - 1) * limit;
1041
+ return { page, limit, skip };
1042
+ }
1043
+ function sendSuccess(res, data, message = "Success") {
1044
+ return res.json({
1045
+ success: true,
1046
+ message,
1047
+ data
1048
+ });
1049
+ }
1050
+ function sendError(res, message = "An error occurred", statusCode = 400, errors) {
1051
+ return res.status(statusCode).json({
1052
+ success: false,
1053
+ message,
1054
+ errors: errors || void 0
1055
+ });
1056
+ }
1057
+ function validateFields(req, requiredFields) {
1058
+ const missing = requiredFields.filter((field) => {
1059
+ const value = req.body[field];
1060
+ return value === void 0 || value === null || value === "";
1061
+ });
1062
+ return {
1063
+ valid: missing.length === 0,
1064
+ missing
1065
+ };
1066
+ }
1067
+ function validateFileUpload(file, options = {}) {
1068
+ if (!file) {
1069
+ return { valid: false, error: "No file provided" };
1070
+ }
1071
+ if (options.maxSize && file.size > options.maxSize) {
1072
+ return {
1073
+ valid: false,
1074
+ error: `File too large. Maximum size allowed is ${options.maxSize / 1024 / 1024}MB`
1075
+ };
1076
+ }
1077
+ if (options.allowedTypes && options.allowedTypes.length > 0) {
1078
+ const fileType = file.mimetype;
1079
+ if (!options.allowedTypes.includes(fileType)) {
1080
+ return {
1081
+ valid: false,
1082
+ error: `Invalid file type. Allowed types: ${options.allowedTypes.join(", ")}`
1083
+ };
1084
+ }
1085
+ }
1086
+ return { valid: true };
1087
+ }
1088
+ function getEnvironmentInfo() {
1089
+ return {
1090
+ nodeVersion: process.version,
1091
+ platform: process.platform,
1092
+ arch: process.arch,
1093
+ memory: process.memoryUsage(),
1094
+ uptime: process.uptime(),
1095
+ env: process.env.NODE_ENV || "development"
1096
+ };
1097
+ }
1098
+ async function isDirectoryEmpty(dirPath) {
1099
+ try {
1100
+ const files = await fs2.readdir(dirPath);
1101
+ return files.length === 0;
1102
+ } catch (error) {
1103
+ return true;
1104
+ }
1105
+ }
1106
+ async function ensureDirectory(dirPath) {
1107
+ try {
1108
+ await fs2.access(dirPath);
1109
+ } catch (error) {
1110
+ await fs2.mkdir(dirPath, { recursive: true });
1111
+ }
1112
+ }
1113
+ async function writeJsonFile(filePath, data) {
1114
+ await ensureDirectory(path2.dirname(filePath));
1115
+ await fs2.writeFile(filePath, JSON.stringify(data, null, 2), "utf8");
1116
+ }
1117
+ async function readJsonFile(filePath, defaultValue) {
1118
+ try {
1119
+ const data = await fs2.readFile(filePath, "utf8");
1120
+ return safeJsonParse(data, defaultValue);
1121
+ } catch (error) {
1122
+ return defaultValue;
1123
+ }
1124
+ }
1125
+ var init_utils = __esm({
1126
+ "src/server/utils.ts"() {
1127
+ "use strict";
1128
+ }
1129
+ });
1130
+
1131
+ // src/server/wasm.ts
1132
+ import fs3 from "fs/promises";
1133
+ import path3 from "path";
1134
+ import { pathToFileURL as pathToFileURL2 } from "url";
1135
+ async function initNodeWasm() {
1136
+ if (initialized)
1137
+ return;
1138
+ try {
1139
+ globalThis.TextEncoder = globalThis.TextEncoder || TextEncoder;
1140
+ globalThis.TextDecoder = globalThis.TextDecoder || TextDecoder;
1141
+ initialized = true;
1142
+ } catch (error) {
1143
+ console.error("[WASM] Failed to initialize Node.js WASM environment:", error);
1144
+ throw error;
1145
+ }
1146
+ }
1147
+ async function loadGoRuntime(goWasmPath) {
1148
+ if (typeof globalThis.Go === "function") {
1149
+ return globalThis.Go;
1150
+ }
1151
+ const possiblePaths = [
1152
+ goWasmPath,
1153
+ "./wasm_exec.cjs",
1154
+ "./wasm_exec.js",
1155
+ "./public/wasm_exec.cjs",
1156
+ "./public/wasm_exec.js",
1157
+ "./src/wasm_exec.cjs",
1158
+ "./src/wasm_exec.js",
1159
+ path3.join(process.cwd(), "wasm_exec.cjs"),
1160
+ path3.join(process.cwd(), "wasm_exec.js"),
1161
+ path3.join(process.cwd(), "public", "wasm_exec.cjs"),
1162
+ path3.join(process.cwd(), "public", "wasm_exec.js"),
1163
+ path3.join(process.cwd(), "src", "wasm_exec.cjs"),
1164
+ path3.join(process.cwd(), "src", "wasm_exec.js")
1165
+ ].filter(Boolean);
1166
+ for (const wasmExecPath of possiblePaths) {
1167
+ try {
1168
+ const resolvedPath = path3.resolve(wasmExecPath);
1169
+ try {
1170
+ const stats = await fs3.stat(resolvedPath);
1171
+ if (!stats.isFile()) {
1172
+ continue;
1173
+ }
1174
+ } catch (statError) {
1175
+ continue;
1176
+ }
1177
+ const wasmExecUrl = pathToFileURL2(resolvedPath).href;
1178
+ if (globalThis.Go) {
1179
+ delete globalThis.Go;
1180
+ }
1181
+ await import(wasmExecUrl);
1182
+ if (typeof globalThis.Go === "function") {
1183
+ console.log(`[WASM] Loaded Go runtime from: ${resolvedPath}`);
1184
+ return globalThis.Go;
1185
+ } else {
1186
+ console.warn(`[WASM] File found but Go class not exported: ${resolvedPath}`);
1187
+ }
1188
+ } catch (error) {
1189
+ console.warn(`[WASM] Error loading from ${wasmExecPath}:`, error.message);
1190
+ continue;
1191
+ }
1192
+ }
1193
+ throw new Error(
1194
+ `[WASM] Could not find wasm_exec.js. Please ensure you have the Go WASM runtime file available.
1195
+ You can get it from: https://github.com/golang/go/blob/master/misc/wasm/wasm_exec.js
1196
+ Searched paths: ${possiblePaths.join(", ")}`
1197
+ );
1198
+ }
1199
+ async function loadGoWasmFromFile(wasmFilePath, options = {}) {
1200
+ try {
1201
+ await initNodeWasm();
1202
+ if (options.debug) {
1203
+ console.log("[WASM] Loading WASM from file:", wasmFilePath);
1204
+ }
1205
+ const GoRuntime = await loadGoRuntime(options.goWasmPath);
1206
+ const go = new GoRuntime();
1207
+ const wasmBuffer = await fs3.readFile(wasmFilePath);
1208
+ const wasmModule = await WebAssembly.compile(wasmBuffer);
1209
+ const baseImports = go.importObject;
1210
+ const finalImportObject = {
1211
+ ...baseImports,
1212
+ ...options.importObject
1213
+ };
1214
+ if (options.debug) {
1215
+ console.log("[WASM] Available import modules:", Object.keys(finalImportObject));
1216
+ for (const [moduleName, moduleExports] of Object.entries(finalImportObject)) {
1217
+ if (typeof moduleExports === "object" && moduleExports !== null) {
1218
+ const exportNames = Object.keys(moduleExports);
1219
+ console.log(`[WASM] ${moduleName} import functions:`, exportNames);
1220
+ }
1221
+ }
1222
+ }
1223
+ const instance = await WebAssembly.instantiate(wasmModule, finalImportObject);
1224
+ if (options.debug) {
1225
+ console.log("[WASM] WASM instance created, starting Go runtime...");
1226
+ }
1227
+ const runPromise = go.run(instance);
1228
+ if (options.debug) {
1229
+ console.log("[WASM] Go runtime started, waiting for initialization...");
1230
+ }
1231
+ await new Promise((resolve) => setTimeout(resolve, 2e3));
1232
+ if (options.debug) {
1233
+ console.log("[WASM] Scanning global object for Go functions...");
1234
+ }
1235
+ const functions = {};
1236
+ const globalObj = globalThis;
1237
+ const allKeys = Object.getOwnPropertyNames(globalObj);
1238
+ const goKeys = allKeys.filter((key) => key.startsWith("go"));
1239
+ if (options.debug) {
1240
+ console.log('[WASM] All keys starting with "go":', goKeys);
1241
+ }
1242
+ for (const key of goKeys) {
1243
+ if (typeof globalObj[key] === "function") {
1244
+ functions[key] = globalObj[key];
1245
+ if (options.debug) {
1246
+ console.log(`[WASM] Found function: ${key}`);
1247
+ }
1248
+ }
1249
+ }
1250
+ const wasmInstance = {
1251
+ instance,
1252
+ module: wasmModule,
1253
+ exports: instance.exports,
1254
+ functions
1255
+ };
1256
+ if (options.onLoad) {
1257
+ options.onLoad(wasmInstance);
1258
+ }
1259
+ if (options.debug) {
1260
+ console.log(`[WASM] Module loaded successfully with ${Object.keys(functions).length} functions`);
1261
+ console.log("[WASM] Final function list:", Object.keys(functions));
1262
+ }
1263
+ runPromise.catch((error) => {
1264
+ if (options.debug) {
1265
+ console.log("[WASM] Go program finished with error:", error);
1266
+ }
1267
+ });
1268
+ return wasmInstance;
1269
+ } catch (error) {
1270
+ console.error("[WASM] Failed to load Go WASM module:", error);
1271
+ throw error;
1272
+ }
1273
+ }
1274
+ var initialized;
1275
+ var init_wasm = __esm({
1276
+ "src/server/wasm.ts"() {
1277
+ "use strict";
1278
+ initialized = false;
1279
+ }
1280
+ });
1281
+
1282
+ // src/server/index.ts
1283
+ var server_exports = {};
1284
+ __export(server_exports, {
1285
+ ApiRouter: () => ApiRouter,
1286
+ AuthService: () => AuthService,
1287
+ Database: () => Database,
1288
+ Server: () => Server,
1289
+ createDevServer: () => createDevServer,
1290
+ createProductionServer: () => createProductionServer,
1291
+ createServer: () => createServer,
1292
+ default: () => server_default,
1293
+ ensureDirectory: () => ensureDirectory,
1294
+ errorHandler: () => errorHandler,
1295
+ generateDocument: () => generateDocument,
1296
+ generateErrorPage: () => generateErrorPage,
1297
+ generateLoadingPage: () => generateLoadingPage,
1298
+ generateToken: () => generateToken,
1299
+ getEnvironmentInfo: () => getEnvironmentInfo,
1300
+ getPagination: () => getPagination,
1301
+ getRequestIp: () => getRequestIp,
1302
+ hashString: () => hashString,
1303
+ initNodeWasm: () => initNodeWasm,
1304
+ isDirectoryEmpty: () => isDirectoryEmpty,
1305
+ loadGoWasmFromFile: () => loadGoWasmFromFile,
1306
+ notFoundHandler: () => notFoundHandler,
1307
+ parseCookies: () => parseCookies,
1308
+ rateLimit: () => rateLimit,
1309
+ readJsonFile: () => readJsonFile,
1310
+ renderComponent: () => renderComponent,
1311
+ renderToString: () => renderToString,
1312
+ requestLogger: () => requestLogger,
1313
+ safeJsonParse: () => safeJsonParse,
1314
+ sendError: () => sendError,
1315
+ sendSuccess: () => sendSuccess,
1316
+ validateFields: () => validateFields,
1317
+ validateFileUpload: () => validateFileUpload,
1318
+ writeJsonFile: () => writeJsonFile
1319
+ });
1320
+ import path4 from "path";
1321
+ import fs4 from "fs";
1322
+ function getComponentName(filePath, pagesDir) {
1323
+ try {
1324
+ const relativePath = path4.relative(pagesDir, filePath);
1325
+ const withoutExt = relativePath.replace(/\.[^/.]+$/, "");
1326
+ const cleanPath = withoutExt.replace(/\/index$/, "");
1327
+ return `/pages/${cleanPath}`;
1328
+ } catch (e) {
1329
+ return "";
1330
+ }
1331
+ }
1332
+ function createServer(config = {}) {
1333
+ return new Server(config);
1334
+ }
1335
+ function createDevServer(options = {}) {
1336
+ return new Server({
1337
+ port: options.port || 3e3,
1338
+ enableCors: options.enableCors !== false,
1339
+ apiDir: "./src/api",
1340
+ pagesDir: "./src/pages",
1341
+ staticDir: "./public"
1342
+ });
1343
+ }
1344
+ function createProductionServer(config) {
1345
+ const server2 = new Server({
1346
+ ...config,
1347
+ // Fix the PORT parsing
1348
+ port: config.port || (process.env.PORT ? parseInt(process.env.PORT) : 8080)
1349
+ });
1350
+ server2.addShutdownHandler();
1351
+ return server2;
1352
+ }
1353
+ function getRequestIp(req) {
1354
+ return req.ip || req.headers["x-forwarded-for"]?.split(",")[0].trim() || req.socket.remoteAddress || "";
1355
+ }
1356
+ function parseCookies(req) {
1357
+ const cookies = {};
1358
+ const cookieHeader = req.headers.cookie;
1359
+ if (cookieHeader) {
1360
+ cookieHeader.split(";").forEach((cookie) => {
1361
+ const [name, value] = cookie.split("=").map((c) => c.trim());
1362
+ cookies[name] = value;
1363
+ });
1364
+ }
1365
+ return cookies;
1366
+ }
1367
+ var Server, renderComponent, server_default;
1368
+ var init_server = __esm({
1369
+ "src/server/index.ts"() {
1370
+ "use strict";
1371
+ init_dist();
1372
+ init_database();
1373
+ init_auth();
1374
+ init_api_router();
1375
+ init_middleware();
1376
+ init_utils();
1377
+ init_templates();
1378
+ init_wasm();
1379
+ init_wasm();
1380
+ init_utils();
1381
+ init_templates();
1382
+ init_database();
1383
+ init_auth();
1384
+ init_api_router();
1385
+ init_middleware();
1386
+ Server = class {
1387
+ constructor(config = {}) {
1388
+ this.server = null;
1389
+ this.db = null;
1390
+ this.auth = null;
1391
+ this.config = {
1392
+ port: 3e3,
1393
+ apiDir: "./api",
1394
+ pagesDir: "./pages",
1395
+ staticDir: "./public",
1396
+ enableCors: true,
1397
+ ...config
1398
+ };
1399
+ this.initializeApp();
1400
+ }
1401
+ async initializeApp() {
1402
+ try {
1403
+ const express = await import("express");
1404
+ this.app = express.default();
1405
+ this.app.use(express.default.json());
1406
+ this.app.use(express.default.urlencoded({ extended: true }));
1407
+ if (this.config.enableCors) {
1408
+ try {
1409
+ const cors = await import("cors");
1410
+ this.app.use(cors.default(this.config.corsOptions));
1411
+ } catch (error) {
1412
+ console.warn("CORS not available - install with: npm install cors @types/cors");
1413
+ }
1414
+ }
1415
+ if (this.config.db) {
1416
+ this.db = new Database(this.config.db);
1417
+ }
1418
+ if (this.config.auth) {
1419
+ this.auth = new AuthService({
1420
+ secret: this.config.auth.secret,
1421
+ expiresIn: this.config.auth.expiresIn
1422
+ });
1423
+ this.app.use(this.auth.initialize());
1424
+ }
1425
+ const staticPath = path4.resolve(process.cwd(), this.config.staticDir);
1426
+ if (fs4.existsSync(staticPath)) {
1427
+ this.app.use(express.default.static(staticPath));
1428
+ }
1429
+ this.setupApiRoutes();
1430
+ this.setupPageRoutes();
1431
+ this.app.use(notFoundHandler);
1432
+ this.app.use(errorHandler);
1433
+ } catch (error) {
1434
+ if (error.code === "MODULE_NOT_FOUND" && error.message.includes("express")) {
1435
+ throw new Error("Express not installed. Run: npm install express @types/express");
1436
+ }
1437
+ throw error;
1438
+ }
1439
+ }
1440
+ setupApiRoutes() {
1441
+ const apiRouter = new ApiRouter(this.config.apiDir, this.auth);
1442
+ this.app.use("/api", requestLogger, apiRouter.router);
1443
+ this.app.get("/api-docs", (req, res) => {
1444
+ const apiDocs = this.generateApiDocs();
1445
+ res.json(apiDocs);
1446
+ });
1447
+ }
1448
+ generateApiDocs() {
1449
+ const apiDir = path4.resolve(process.cwd(), this.config.apiDir);
1450
+ const docs = { endpoints: [] };
1451
+ if (fs4.existsSync(apiDir)) {
1452
+ this.scanApiDirectory(apiDir, "", docs.endpoints);
1453
+ }
1454
+ return docs;
1455
+ }
1456
+ scanApiDirectory(dirPath, routePrefix, endpoints) {
1457
+ const entries = fs4.readdirSync(dirPath, { withFileTypes: true });
1458
+ for (const entry of entries) {
1459
+ const fullPath = path4.join(dirPath, entry.name);
1460
+ if (entry.isDirectory()) {
1461
+ this.scanApiDirectory(fullPath, `${routePrefix}/${entry.name}`, endpoints);
1462
+ } else if (entry.name.endsWith(".js") || entry.name.endsWith(".ts")) {
1463
+ const routePath = this.getRoutePath(entry.name, routePrefix);
1464
+ endpoints.push({
1465
+ path: routePath,
1466
+ file: path4.relative(process.cwd(), fullPath),
1467
+ methods: this.detectApiMethods(fullPath)
1468
+ });
1469
+ }
1470
+ }
1471
+ }
1472
+ getRoutePath(filename, routePrefix) {
1473
+ const baseName = path4.basename(filename, path4.extname(filename));
1474
+ if (baseName === "index") {
1475
+ return routePrefix || "/";
1476
+ }
1477
+ const paramMatch = baseName.match(/^\[(.+)\]$/);
1478
+ if (paramMatch) {
1479
+ return `${routePrefix}/:${paramMatch[1]}`;
1480
+ }
1481
+ return `${routePrefix}/${baseName}`;
1482
+ }
1483
+ detectApiMethods(filePath) {
1484
+ try {
1485
+ const content = fs4.readFileSync(filePath, "utf8");
1486
+ const methods = ["get", "post", "put", "delete", "patch", "options"];
1487
+ return methods.filter(
1488
+ (method) => new RegExp(`export (async )?function ${method}\\s*\\(`).test(content) || new RegExp(`export const ${method}\\s*=`).test(content)
1489
+ );
1490
+ } catch (error) {
1491
+ return [];
1492
+ }
1493
+ }
1494
+ setupPageRoutes() {
1495
+ const pagesPath = path4.resolve(process.cwd(), this.config.pagesDir);
1496
+ if (!fs4.existsSync(pagesPath)) {
1497
+ return;
1498
+ }
1499
+ this.app.get("*", async (req, res) => {
1500
+ try {
1501
+ const { html, statusCode } = await this.renderPage(req.path);
1502
+ res.status(statusCode || 200).send(html);
1503
+ } catch (error) {
1504
+ console.error("Error rendering page:", error);
1505
+ const errorHtml = generateErrorPage(500, "Server Error");
1506
+ res.status(500).send(errorHtml);
1507
+ }
1508
+ });
1509
+ }
1510
+ async renderPage(routePath) {
1511
+ try {
1512
+ const pagesDir = this.config.pagesDir ? path4.resolve(process.cwd(), this.config.pagesDir) : "";
1513
+ if (!pagesDir || !fs4.existsSync(pagesDir)) {
1514
+ return {
1515
+ html: generateErrorPage(404, "Pages directory not found"),
1516
+ statusCode: 404
1517
+ };
1518
+ }
1519
+ let normalizedPath = routePath;
1520
+ if (!normalizedPath.startsWith("/")) {
1521
+ normalizedPath = "/" + normalizedPath;
1522
+ }
1523
+ if (normalizedPath === "/") {
1524
+ normalizedPath = "/index";
1525
+ }
1526
+ let pagePath = "";
1527
+ const possiblePaths = [
1528
+ path4.join(pagesDir, `${normalizedPath}.js`),
1529
+ path4.join(pagesDir, `${normalizedPath}.ts`),
1530
+ path4.join(pagesDir, `${normalizedPath}.jsx`),
1531
+ path4.join(pagesDir, `${normalizedPath}.tsx`),
1532
+ path4.join(pagesDir, `${normalizedPath}/index.js`),
1533
+ path4.join(pagesDir, `${normalizedPath}/index.ts`),
1534
+ path4.join(pagesDir, `${normalizedPath}/index.jsx`),
1535
+ path4.join(pagesDir, `${normalizedPath}/index.tsx`)
1536
+ ];
1537
+ for (const p of possiblePaths) {
1538
+ if (fs4.existsSync(p)) {
1539
+ pagePath = p;
1540
+ break;
1541
+ }
1542
+ }
1543
+ if (!pagePath) {
1544
+ return {
1545
+ html: generateErrorPage(404, `Page not found: ${normalizedPath}`),
1546
+ statusCode: 404
1547
+ };
1548
+ }
1549
+ try {
1550
+ const pageModule = await import(pagePath);
1551
+ if (!pageModule || !pageModule.default) {
1552
+ throw new Error(`No default export found in ${pagePath}`);
1553
+ }
1554
+ const PageComponent = pageModule.default;
1555
+ const initialProps = {
1556
+ // Provide any initial props here
1557
+ path: normalizedPath,
1558
+ query: {},
1559
+ // Could be parsed from URL
1560
+ api: { serverTime: (/* @__PURE__ */ new Date()).toISOString() }
1561
+ };
1562
+ const { html, success, error } = await renderComponent(PageComponent, initialProps);
1563
+ if (!success) {
1564
+ return {
1565
+ html: generateErrorPage(500, "Failed to render page", error instanceof Error ? error : new Error("Unknown error")),
1566
+ statusCode: 500
1567
+ };
1568
+ }
1569
+ let pageTitle = "My App";
1570
+ try {
1571
+ if (typeof PageComponent.getTitle === "function") {
1572
+ pageTitle = PageComponent.getTitle(initialProps);
1573
+ } else if (PageComponent.title) {
1574
+ pageTitle = PageComponent.title;
1575
+ }
1576
+ } catch (e) {
1577
+ }
1578
+ const componentName = getComponentName(pagePath, pagesDir);
1579
+ const fullHtml = generateDocument(html, {
1580
+ title: pageTitle,
1581
+ // Get description from component if available
1582
+ description: typeof PageComponent.getDescription === "function" ? PageComponent.getDescription(initialProps) : PageComponent.description || "",
1583
+ // Add scripts for client-side hydration
1584
+ scripts: ["/client.js"],
1585
+ // Add any custom meta tags
1586
+ meta: typeof PageComponent.getMeta === "function" ? PageComponent.getMeta(initialProps) : {},
1587
+ // Add custom styles
1588
+ styles: ["/styles.css"],
1589
+ // Add initial data for client-side hydration
1590
+ initialData: initialProps,
1591
+ // Add component information for hydration
1592
+ componentName
1593
+ });
1594
+ return { html: fullHtml, statusCode: 200 };
1595
+ } catch (error) {
1596
+ console.error("Error rendering page:", error);
1597
+ return {
1598
+ html: generateErrorPage(500, "Error rendering page", error instanceof Error ? error : new Error("Unknown error")),
1599
+ statusCode: 500
1600
+ };
1601
+ }
1602
+ } catch (error) {
1603
+ console.error("Error finding page:", error);
1604
+ return {
1605
+ html: generateErrorPage(500, "Server error", error instanceof Error ? error : new Error("Unknown error")),
1606
+ statusCode: 500
1607
+ };
1608
+ }
1609
+ }
1610
+ getExpressApp() {
1611
+ return this.app;
1612
+ }
1613
+ getDatabase() {
1614
+ return this.db;
1615
+ }
1616
+ getAuth() {
1617
+ return this.auth;
1618
+ }
1619
+ start() {
1620
+ return new Promise((resolve) => {
1621
+ this.server = this.app.listen(this.config.port, () => {
1622
+ console.log(`Server running at http://localhost:${this.config.port}`);
1623
+ resolve();
1624
+ });
1625
+ });
1626
+ }
1627
+ stop() {
1628
+ return new Promise((resolve, reject) => {
1629
+ if (!this.server) {
1630
+ return resolve();
1631
+ }
1632
+ this.server.close((err) => {
1633
+ if (err)
1634
+ return reject(err);
1635
+ this.server = null;
1636
+ resolve();
1637
+ });
1638
+ });
1639
+ }
1640
+ restart() {
1641
+ return this.stop().then(() => this.start());
1642
+ }
1643
+ enableSSR(options = {}) {
1644
+ if (!fs4.existsSync(path4.resolve(process.cwd(), this.config.pagesDir))) {
1645
+ fs4.mkdirSync(path4.resolve(process.cwd(), this.config.pagesDir), { recursive: true });
1646
+ }
1647
+ if (options.hydratable) {
1648
+ const staticDir = path4.resolve(process.cwd(), this.config.staticDir);
1649
+ if (!fs4.existsSync(staticDir)) {
1650
+ fs4.mkdirSync(staticDir, { recursive: true });
1651
+ }
1652
+ const clientJsPath = path4.join(staticDir, "client.js");
1653
+ if (!fs4.existsSync(clientJsPath)) {
1654
+ const clientJsContent = `
1655
+ // Auto-generated hydration script
1656
+ import { hydrate } from 'frontend-hamroun';
1657
+
1658
+ // Find SSR content and hydrate it
1659
+ document.addEventListener('DOMContentLoaded', () => {
1660
+ const ssrRoots = document.querySelectorAll('[data-ssr-root]');
1661
+ ssrRoots.forEach(root => {
1662
+ const componentPath = root.getAttribute('data-component');
1663
+ if (componentPath) {
1664
+ import(componentPath).then(module => {
1665
+ hydrate(module.default, root);
1666
+ });
1667
+ }
1668
+ });
1669
+ });
1670
+ `;
1671
+ fs4.writeFileSync(clientJsPath, clientJsContent);
1672
+ }
1673
+ }
1674
+ }
1675
+ registerPlugin(plugin) {
1676
+ plugin(this);
1677
+ }
1678
+ addShutdownHandler() {
1679
+ const gracefulShutdown = async () => {
1680
+ console.log("Received shutdown signal, closing server...");
1681
+ try {
1682
+ await this.stop();
1683
+ if (this.db) {
1684
+ await this.db.disconnect();
1685
+ }
1686
+ console.log("Server shut down gracefully");
1687
+ process.exit(0);
1688
+ } catch (error) {
1689
+ console.error("Error during shutdown:", error);
1690
+ process.exit(1);
1691
+ }
1692
+ };
1693
+ process.on("SIGTERM", gracefulShutdown);
1694
+ process.on("SIGINT", gracefulShutdown);
1695
+ }
1696
+ };
1697
+ renderComponent = async (Component, props = {}) => {
1698
+ try {
1699
+ const html = renderToString(Component(props));
1700
+ return {
1701
+ html,
1702
+ success: true
1703
+ };
1704
+ } catch (error) {
1705
+ console.error("Error rendering component:", error);
1706
+ return {
1707
+ html: `<div class="error">Error rendering component</div>`,
1708
+ success: false,
1709
+ error
1710
+ };
1711
+ }
1712
+ };
1713
+ server_default = {
1714
+ Server,
1715
+ createServer,
1716
+ createDevServer,
1717
+ createProductionServer,
1718
+ rateLimit,
1719
+ requestLogger,
1720
+ errorHandler,
1721
+ notFoundHandler,
1722
+ loadGoWasmFromFile,
1723
+ // Template utilities
1724
+ templates: templates_exports,
1725
+ // Server utilities
1726
+ utils: utils_exports,
1727
+ // Additional exports
1728
+ renderComponent,
1729
+ renderToString,
1730
+ getRequestIp,
1731
+ parseCookies,
1732
+ Database,
1733
+ AuthService,
1734
+ ApiRouter
1735
+ };
1736
+ }
1737
+ });
1738
+
1739
+ // src/server-renderer.ts
1740
+ var server_renderer_exports = {};
1741
+ __export(server_renderer_exports, {
1742
+ renderToString: () => renderToString2
1743
+ });
1744
+ function renderToString2(component) {
1745
+ try {
1746
+ if (typeof component === "function") {
1747
+ const result = component();
1748
+ if (typeof result === "string") {
1749
+ return result;
1750
+ }
1751
+ if (result && typeof result === "object") {
1752
+ return JSON.stringify(result);
1753
+ }
1754
+ return String(result || "");
1755
+ }
1756
+ if (typeof component === "string") {
1757
+ return component;
1758
+ }
1759
+ return String(component || "");
1760
+ } catch (error) {
1761
+ console.error("Error in renderToString:", error);
1762
+ return "<div>Error rendering component</div>";
1763
+ }
1764
+ }
1765
+ var init_server_renderer = __esm({
1766
+ "src/server-renderer.ts"() {
1767
+ "use strict";
1768
+ }
1769
+ });
1770
+
1771
+ // src/index.ts
1772
+ init_dist();
1773
+
1774
+ // src/wasm.ts
1775
+ async function loadGoWasm(wasmUrl, options = {}) {
1776
+ if (typeof window === "undefined") {
1777
+ throw new Error("loadGoWasm() is for browser use only. Use loadGoWasmFromFile() in Node.js.");
1778
+ }
1779
+ try {
1780
+ if (!window.Go) {
1781
+ throw new Error("Go WASM runtime not available. Make sure wasm_exec.js is loaded.");
1782
+ }
1783
+ if (options.debug) {
1784
+ console.log("[WASM] Loading WASM from:", wasmUrl);
1785
+ }
1786
+ const response = await fetch(wasmUrl);
1787
+ if (!response.ok) {
1788
+ throw new Error(`Failed to fetch WASM file: ${response.status}`);
1789
+ }
1790
+ const wasmBytes = await response.arrayBuffer();
1791
+ const go = new window.Go();
1792
+ const wasmModule = await WebAssembly.instantiate(wasmBytes, go.importObject);
1793
+ go.run(wasmModule.instance);
1794
+ await new Promise((resolve) => setTimeout(resolve, 100));
1795
+ if (options.debug) {
1796
+ console.log("[WASM] Go program started, checking for registered functions...");
1797
+ }
1798
+ const functions = {};
1799
+ for (const key in window) {
1800
+ if (typeof window[key] === "function" && key.startsWith("go")) {
1801
+ functions[key] = window[key];
1802
+ if (options.debug) {
1803
+ console.log(`[WASM] Found function: ${key}`);
1804
+ }
1805
+ }
1806
+ }
1807
+ const wasmInstance = {
1808
+ instance: wasmModule.instance,
1809
+ module: wasmModule,
1810
+ exports: wasmModule.instance.exports,
1811
+ functions
1812
+ };
1813
+ if (options.onLoad) {
1814
+ options.onLoad(wasmInstance);
1815
+ }
1816
+ if (options.debug) {
1817
+ console.log(`[WASM] Module loaded successfully with ${Object.keys(functions).length} functions`);
1818
+ }
1819
+ return wasmInstance;
1820
+ } catch (error) {
1821
+ console.error("[WASM] Error loading Go WASM module:", error);
1822
+ throw error;
1823
+ }
1824
+ }
1825
+ function callWasmFunction(funcName, ...args) {
1826
+ if (typeof window === "undefined") {
1827
+ throw new Error("callWasmFunction() is for browser use only.");
1828
+ }
1829
+ const func = window[funcName];
1830
+ if (typeof func !== "function") {
1831
+ throw new Error(`Function ${funcName} not found. Make sure the WASM module is loaded.`);
1832
+ }
1833
+ return func(...args);
1834
+ }
1835
+ function isWasmReady() {
1836
+ if (typeof window === "undefined") {
1837
+ return false;
1838
+ }
1839
+ return !!(window.Go && Object.keys(window).some(
1840
+ (key) => key.startsWith("go") && typeof window[key] === "function"
1841
+ ));
1842
+ }
1843
+ function getWasmFunctions() {
1844
+ if (typeof window === "undefined") {
1845
+ return [];
1846
+ }
1847
+ return Object.keys(window).filter(
1848
+ (key) => key.startsWith("go") && typeof window[key] === "function"
1849
+ );
1850
+ }
1851
+ function useGoWasm(wasmUrl, options = {}) {
1852
+ if (typeof window === "undefined") {
1853
+ throw new Error("useGoWasm() is for browser use only.");
1854
+ }
1855
+ return {
1856
+ loadWasm: () => loadGoWasm(wasmUrl, options),
1857
+ callFunction: callWasmFunction,
1858
+ isReady: isWasmReady,
1859
+ getFunctions: getWasmFunctions
1860
+ };
1861
+ }
1862
+
1863
+ // src/index.ts
1864
+ init_templates();
1865
+ var isNode = typeof process !== "undefined" && process.versions?.node;
1866
+ var isBrowser = typeof window !== "undefined";
1867
+ var BaraqexServer = null;
1868
+ var createServer2 = null;
1869
+ var createDevServer2 = null;
1870
+ var createProductionServer2 = null;
1871
+ var renderComponent2 = null;
1872
+ var Database2 = null;
1873
+ var AuthService2 = null;
1874
+ var ApiRouter2 = null;
1875
+ var requestLogger2 = null;
1876
+ var errorHandler2 = null;
1877
+ var notFoundHandler2 = null;
1878
+ var rateLimit2 = null;
1879
+ var initNodeWasm3 = null;
1880
+ var loadGoWasmFromFile2 = null;
1881
+ var safeJsonParse2 = (json, fallback) => {
1882
+ try {
1883
+ return JSON.parse(json);
1884
+ } catch {
1885
+ return fallback;
1886
+ }
1887
+ };
1888
+ var generateToken2 = (length = 32) => {
1889
+ const array = new Uint8Array(length);
1890
+ if (typeof crypto !== "undefined" && crypto.getRandomValues) {
1891
+ crypto.getRandomValues(array);
1892
+ } else {
1893
+ for (let i = 0; i < array.length; i++) {
1894
+ array[i] = Math.floor(Math.random() * 256);
1895
+ }
1896
+ }
1897
+ return Array.from(array, (byte) => byte.toString(16).padStart(2, "0")).join("");
1898
+ };
1899
+ var hashString2 = null;
1900
+ var getPagination2 = null;
1901
+ var sendSuccess2 = null;
1902
+ var sendError2 = null;
1903
+ var validateFields2 = null;
1904
+ var validateFileUpload2 = null;
1905
+ var getEnvironmentInfo2 = null;
1906
+ var isDirectoryEmpty2 = null;
1907
+ var ensureDirectory2 = null;
1908
+ var writeJsonFile2 = null;
1909
+ var readJsonFile2 = null;
1910
+ var baraqexRenderToString = null;
1911
+ if (isNode && !isBrowser) {
1912
+ Promise.resolve().then(async () => {
1913
+ try {
1914
+ try {
1915
+ await import("express");
1916
+ } catch {
1917
+ console.warn("Express not available - server functionality disabled");
1918
+ return;
1919
+ }
1920
+ const serverModule = await Promise.resolve().then(() => (init_server(), server_exports));
1921
+ BaraqexServer = serverModule.Server;
1922
+ createServer2 = serverModule.createServer;
1923
+ createDevServer2 = serverModule.createDevServer;
1924
+ createProductionServer2 = serverModule.createProductionServer;
1925
+ renderComponent2 = serverModule.renderComponent;
1926
+ Database2 = serverModule.Database;
1927
+ AuthService2 = serverModule.AuthService;
1928
+ ApiRouter2 = serverModule.ApiRouter;
1929
+ requestLogger2 = serverModule.requestLogger;
1930
+ errorHandler2 = serverModule.errorHandler;
1931
+ notFoundHandler2 = serverModule.notFoundHandler;
1932
+ rateLimit2 = serverModule.rateLimit;
1933
+ initNodeWasm3 = serverModule.initNodeWasm;
1934
+ loadGoWasmFromFile2 = serverModule.loadGoWasmFromFile;
1935
+ const utilsModule = await Promise.resolve().then(() => (init_utils(), utils_exports));
1936
+ safeJsonParse2 = utilsModule.safeJsonParse;
1937
+ generateToken2 = utilsModule.generateToken;
1938
+ hashString2 = utilsModule.hashString;
1939
+ getPagination2 = utilsModule.getPagination;
1940
+ sendSuccess2 = utilsModule.sendSuccess;
1941
+ sendError2 = utilsModule.sendError;
1942
+ validateFields2 = utilsModule.validateFields;
1943
+ validateFileUpload2 = utilsModule.validateFileUpload;
1944
+ getEnvironmentInfo2 = utilsModule.getEnvironmentInfo;
1945
+ isDirectoryEmpty2 = utilsModule.isDirectoryEmpty;
1946
+ ensureDirectory2 = utilsModule.ensureDirectory;
1947
+ writeJsonFile2 = utilsModule.writeJsonFile;
1948
+ readJsonFile2 = utilsModule.readJsonFile;
1949
+ const rendererModule = await Promise.resolve().then(() => (init_server_renderer(), server_renderer_exports));
1950
+ baraqexRenderToString = rendererModule.renderToString;
1951
+ } catch (error) {
1952
+ console.warn("Server modules not available:", error.message);
1953
+ }
1954
+ });
1955
+ }
1956
+ function renderToString3(content) {
1957
+ if (typeof content === "string") {
1958
+ return Promise.resolve(content);
1959
+ }
1960
+ if (typeof content === "function") {
1961
+ try {
1962
+ const result = content();
1963
+ return Promise.resolve(String(result));
1964
+ } catch (error) {
1965
+ return Promise.resolve(`<!-- Error rendering: ${error} -->`);
1966
+ }
1967
+ }
1968
+ return Promise.resolve(String(content));
1969
+ }
1970
+ console.log("Baraqex - powered by Frontend Hamroun Framework with additional utilities");
1971
+ export {
1972
+ ApiRouter2 as ApiRouter,
1973
+ AuthService2 as AuthService,
1974
+ BaraqexServer,
1975
+ Database2 as Database,
1976
+ Fragment,
1977
+ baraqexRenderToString,
1978
+ batchUpdates,
1979
+ callWasmFunction,
1980
+ createContext,
1981
+ createDevServer2 as createDevServer,
1982
+ createProductionServer2 as createProductionServer,
1983
+ createServer2 as createServer,
1984
+ ensureDirectory2 as ensureDirectory,
1985
+ errorHandler2 as errorHandler,
1986
+ generateDocument,
1987
+ generateErrorPage,
1988
+ generateLoadingPage,
1989
+ generateToken2 as generateToken,
1990
+ getEnvironmentInfo2 as getEnvironmentInfo,
1991
+ getPagination2 as getPagination,
1992
+ getWasmFunctions,
1993
+ hashString2 as hashString,
1994
+ hydrate,
1995
+ initNodeWasm3 as initNodeWasm,
1996
+ isDirectoryEmpty2 as isDirectoryEmpty,
1997
+ isWasmReady,
1998
+ jsx,
1999
+ jsx as jsxs,
2000
+ loadGoWasm,
2001
+ loadGoWasmFromFile2 as loadGoWasmFromFile,
2002
+ notFoundHandler2 as notFoundHandler,
2003
+ rateLimit2 as rateLimit,
2004
+ readJsonFile2 as readJsonFile,
2005
+ render,
2006
+ renderComponent2 as renderComponent,
2007
+ renderToString3 as renderToString,
2008
+ requestLogger2 as requestLogger,
2009
+ safeJsonParse2 as safeJsonParse,
2010
+ sendError2 as sendError,
2011
+ sendSuccess2 as sendSuccess,
2012
+ server,
2013
+ useContext,
2014
+ useEffect,
2015
+ useErrorBoundary,
2016
+ useGoWasm,
2017
+ useMemo,
2018
+ useRef,
2019
+ useState,
2020
+ validateFields2 as validateFields,
2021
+ validateFileUpload2 as validateFileUpload,
2022
+ writeJsonFile2 as writeJsonFile
2023
+ };
2024
+ //# sourceMappingURL=index.js.map