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.
- package/dist/browser.js +635 -0
- package/dist/browser.js.map +7 -0
- package/dist/browser.package.json +4 -0
- package/dist/index.js +2024 -33
- package/dist/index.js.map +7 -1
- package/dist/server/index.js +1357 -432
- package/dist/server/index.js.map +7 -1
- package/dist/server/package.json +4 -0
- package/dist/wasm.js +86 -104
- package/dist/wasm.js.map +7 -1
- package/package.json +102 -86
- package/templates/ssr-template/esbuild.config.js +32 -3
- package/templates/ssr-template/package-lock.json +33 -1018
- package/templates/ssr-template/package.json +1 -0
- package/templates/ssr-template/src/App.tsx +1 -1
- package/dist/frontend/components/WasmLoader.d.ts +0 -1
- package/dist/frontend/components/WasmLoader.d.ts.map +0 -1
- package/dist/frontend/components/WasmLoader.js +0 -2
- package/dist/frontend/components/WasmLoader.js.map +0 -1
- package/dist/frontend/hooks/useWasm.d.ts +0 -1
- package/dist/frontend/hooks/useWasm.d.ts.map +0 -1
- package/dist/frontend/hooks/useWasm.js +0 -2
- package/dist/frontend/hooks/useWasm.js.map +0 -1
- package/dist/frontend/index.d.ts +0 -1
- package/dist/frontend/index.d.ts.map +0 -1
- package/dist/frontend/index.js +0 -2
- package/dist/frontend/index.js.map +0 -1
- package/dist/index.d.ts +0 -12
- package/dist/index.d.ts.map +0 -1
- package/dist/renderComponent.d.ts +0 -9
- package/dist/renderComponent.d.ts.map +0 -1
- package/dist/renderComponent.js +0 -39
- package/dist/renderComponent.js.map +0 -1
- package/dist/server/api-router.d.ts +0 -16
- package/dist/server/api-router.d.ts.map +0 -1
- package/dist/server/api-router.js +0 -121
- package/dist/server/api-router.js.map +0 -1
- package/dist/server/auth.d.ts +0 -33
- package/dist/server/auth.d.ts.map +0 -1
- package/dist/server/auth.js +0 -74
- package/dist/server/auth.js.map +0 -1
- package/dist/server/database.d.ts +0 -25
- package/dist/server/database.d.ts.map +0 -1
- package/dist/server/database.js +0 -109
- package/dist/server/database.js.map +0 -1
- package/dist/server/index.d.ts +0 -117
- package/dist/server/index.d.ts.map +0 -1
- package/dist/server/middleware.d.ts +0 -12
- package/dist/server/middleware.d.ts.map +0 -1
- package/dist/server/middleware.js +0 -46
- package/dist/server/middleware.js.map +0 -1
- package/dist/server/server.d.ts +0 -10
- package/dist/server/server.d.ts.map +0 -1
- package/dist/server/server.js +0 -81
- package/dist/server/server.js.map +0 -1
- package/dist/server/templates.d.ts +0 -31
- package/dist/server/templates.d.ts.map +0 -1
- package/dist/server/templates.js +0 -208
- package/dist/server/templates.js.map +0 -1
- package/dist/server/types.d.ts +0 -67
- package/dist/server/types.d.ts.map +0 -1
- package/dist/server/types.js +0 -2
- package/dist/server/types.js.map +0 -1
- package/dist/server/utils.d.ts +0 -71
- package/dist/server/utils.d.ts.map +0 -1
- package/dist/server/utils.js +0 -165
- package/dist/server/utils.js.map +0 -1
- package/dist/server/wasm.d.ts +0 -29
- package/dist/server/wasm.d.ts.map +0 -1
- package/dist/server/wasm.js +0 -208
- package/dist/server/wasm.js.map +0 -1
- package/dist/server-renderer.d.ts +0 -5
- package/dist/server-renderer.d.ts.map +0 -1
- package/dist/server-renderer.js +0 -27
- package/dist/server-renderer.js.map +0 -1
- package/dist/wasm.d.ts +0 -51
- package/dist/wasm.d.ts.map +0 -1
package/dist/browser.js
ADDED
|
@@ -0,0 +1,635 @@
|
|
|
1
|
+
// node_modules/frontend-hamroun/dist/index.mjs
|
|
2
|
+
var isBatching = false;
|
|
3
|
+
var queue = [];
|
|
4
|
+
function batchUpdates(fn) {
|
|
5
|
+
if (isBatching) {
|
|
6
|
+
queue.push(fn);
|
|
7
|
+
return;
|
|
8
|
+
}
|
|
9
|
+
isBatching = true;
|
|
10
|
+
try {
|
|
11
|
+
fn();
|
|
12
|
+
while (queue.length > 0) {
|
|
13
|
+
const nextFn = queue.shift();
|
|
14
|
+
nextFn == null ? void 0 : nextFn();
|
|
15
|
+
}
|
|
16
|
+
} finally {
|
|
17
|
+
isBatching = false;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
var currentRender = 0;
|
|
21
|
+
var states = /* @__PURE__ */ new Map();
|
|
22
|
+
var stateIndices = /* @__PURE__ */ new Map();
|
|
23
|
+
var effects = /* @__PURE__ */ new Map();
|
|
24
|
+
var memos = /* @__PURE__ */ new Map();
|
|
25
|
+
var refs = /* @__PURE__ */ new Map();
|
|
26
|
+
var globalRenderCallback = null;
|
|
27
|
+
var globalContainer = null;
|
|
28
|
+
var currentElement = null;
|
|
29
|
+
var isServer = typeof window === "undefined";
|
|
30
|
+
var serverStates = /* @__PURE__ */ new Map();
|
|
31
|
+
function setRenderCallback(callback, element, container) {
|
|
32
|
+
globalRenderCallback = callback;
|
|
33
|
+
globalContainer = container;
|
|
34
|
+
currentElement = element;
|
|
35
|
+
}
|
|
36
|
+
function prepareRender() {
|
|
37
|
+
currentRender++;
|
|
38
|
+
stateIndices.set(currentRender, 0);
|
|
39
|
+
return currentRender;
|
|
40
|
+
}
|
|
41
|
+
function finishRender() {
|
|
42
|
+
if (isServer) {
|
|
43
|
+
serverStates.delete(currentRender);
|
|
44
|
+
}
|
|
45
|
+
currentRender = 0;
|
|
46
|
+
}
|
|
47
|
+
function useState(initial) {
|
|
48
|
+
if (!currentRender) {
|
|
49
|
+
throw new Error("useState must be called within a render");
|
|
50
|
+
}
|
|
51
|
+
if (isServer) {
|
|
52
|
+
if (!serverStates.has(currentRender)) {
|
|
53
|
+
serverStates.set(currentRender, /* @__PURE__ */ new Map());
|
|
54
|
+
}
|
|
55
|
+
const componentState = serverStates.get(currentRender);
|
|
56
|
+
const index2 = stateIndices.get(currentRender) || 0;
|
|
57
|
+
if (!componentState.has(index2)) {
|
|
58
|
+
componentState.set(index2, initial);
|
|
59
|
+
}
|
|
60
|
+
const state2 = componentState.get(index2);
|
|
61
|
+
const setState2 = (newValue) => {
|
|
62
|
+
};
|
|
63
|
+
stateIndices.set(currentRender, index2 + 1);
|
|
64
|
+
return [state2, setState2];
|
|
65
|
+
}
|
|
66
|
+
if (!states.has(currentRender)) {
|
|
67
|
+
states.set(currentRender, []);
|
|
68
|
+
}
|
|
69
|
+
const componentStates = states.get(currentRender);
|
|
70
|
+
const index = stateIndices.get(currentRender);
|
|
71
|
+
if (index >= componentStates.length) {
|
|
72
|
+
componentStates.push(initial);
|
|
73
|
+
}
|
|
74
|
+
const state = componentStates[index];
|
|
75
|
+
const setState = (newValue) => {
|
|
76
|
+
const nextValue = typeof newValue === "function" ? newValue(componentStates[index]) : newValue;
|
|
77
|
+
if (componentStates[index] === nextValue)
|
|
78
|
+
return;
|
|
79
|
+
componentStates[index] = nextValue;
|
|
80
|
+
if (isBatching) {
|
|
81
|
+
batchUpdates(() => rerender(currentRender));
|
|
82
|
+
} else {
|
|
83
|
+
rerender(currentRender);
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
stateIndices.set(currentRender, index + 1);
|
|
87
|
+
return [state, setState];
|
|
88
|
+
}
|
|
89
|
+
function useEffect(callback, deps) {
|
|
90
|
+
if (!currentRender)
|
|
91
|
+
throw new Error("useEffect must be called within a render");
|
|
92
|
+
const effectIndex = stateIndices.get(currentRender);
|
|
93
|
+
if (!effects.has(currentRender)) {
|
|
94
|
+
effects.set(currentRender, []);
|
|
95
|
+
}
|
|
96
|
+
const componentEffects = effects.get(currentRender);
|
|
97
|
+
const prevEffect = componentEffects[effectIndex];
|
|
98
|
+
if (!prevEffect || !deps || !prevEffect.deps || deps.some((dep, i) => dep !== prevEffect.deps[i])) {
|
|
99
|
+
if (prevEffect == null ? void 0 : prevEffect.cleanup) {
|
|
100
|
+
prevEffect.cleanup();
|
|
101
|
+
}
|
|
102
|
+
queueMicrotask(() => {
|
|
103
|
+
const cleanup = callback() || void 0;
|
|
104
|
+
componentEffects[effectIndex] = { cleanup, deps };
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
stateIndices.set(currentRender, effectIndex + 1);
|
|
108
|
+
}
|
|
109
|
+
function useMemo(factory, deps) {
|
|
110
|
+
if (!currentRender)
|
|
111
|
+
throw new Error("useMemo must be called within a render");
|
|
112
|
+
const memoIndex = stateIndices.get(currentRender);
|
|
113
|
+
if (!memos.has(currentRender)) {
|
|
114
|
+
memos.set(currentRender, []);
|
|
115
|
+
}
|
|
116
|
+
const componentMemos = memos.get(currentRender);
|
|
117
|
+
const prevMemo = componentMemos[memoIndex];
|
|
118
|
+
if (!prevMemo || deps && deps.some((dep, i) => !Object.is(dep, prevMemo.deps[i]))) {
|
|
119
|
+
const value = factory();
|
|
120
|
+
componentMemos[memoIndex] = { value, deps };
|
|
121
|
+
stateIndices.set(currentRender, memoIndex + 1);
|
|
122
|
+
return value;
|
|
123
|
+
}
|
|
124
|
+
stateIndices.set(currentRender, memoIndex + 1);
|
|
125
|
+
return prevMemo.value;
|
|
126
|
+
}
|
|
127
|
+
function useRef(initial) {
|
|
128
|
+
if (!currentRender)
|
|
129
|
+
throw new Error("useRef must be called within a render");
|
|
130
|
+
const refIndex = stateIndices.get(currentRender);
|
|
131
|
+
if (!refs.has(currentRender)) {
|
|
132
|
+
refs.set(currentRender, []);
|
|
133
|
+
}
|
|
134
|
+
const componentRefs = refs.get(currentRender);
|
|
135
|
+
if (refIndex >= componentRefs.length) {
|
|
136
|
+
const ref2 = { current: initial };
|
|
137
|
+
componentRefs.push(ref2);
|
|
138
|
+
stateIndices.set(currentRender, refIndex + 1);
|
|
139
|
+
return ref2;
|
|
140
|
+
}
|
|
141
|
+
const ref = componentRefs[refIndex];
|
|
142
|
+
stateIndices.set(currentRender, refIndex + 1);
|
|
143
|
+
return ref;
|
|
144
|
+
}
|
|
145
|
+
async function rerender(rendererId) {
|
|
146
|
+
try {
|
|
147
|
+
const componentEffects = effects.get(rendererId);
|
|
148
|
+
if (componentEffects) {
|
|
149
|
+
componentEffects.forEach((effect) => {
|
|
150
|
+
if (effect.cleanup)
|
|
151
|
+
effect.cleanup();
|
|
152
|
+
});
|
|
153
|
+
effects.set(rendererId, []);
|
|
154
|
+
}
|
|
155
|
+
if (globalRenderCallback && globalContainer && currentElement) {
|
|
156
|
+
await globalRenderCallback(currentElement, globalContainer);
|
|
157
|
+
}
|
|
158
|
+
} catch (error) {
|
|
159
|
+
console.error("Error during rerender:", error);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
function useErrorBoundary() {
|
|
163
|
+
const [error, setError] = useState(null);
|
|
164
|
+
return [error, () => setError(null)];
|
|
165
|
+
}
|
|
166
|
+
function createContext(defaultValue) {
|
|
167
|
+
const context = {
|
|
168
|
+
Provider: ({ value, children }) => {
|
|
169
|
+
return children;
|
|
170
|
+
},
|
|
171
|
+
Consumer: ({ children }) => {
|
|
172
|
+
return children(defaultValue);
|
|
173
|
+
},
|
|
174
|
+
_id: Symbol(),
|
|
175
|
+
useSelector: (selector) => {
|
|
176
|
+
return selector(defaultValue);
|
|
177
|
+
}
|
|
178
|
+
};
|
|
179
|
+
return context;
|
|
180
|
+
}
|
|
181
|
+
function useContext(context) {
|
|
182
|
+
return context;
|
|
183
|
+
}
|
|
184
|
+
function jsx(type, props) {
|
|
185
|
+
console.log("JSX Transform:", { type, props });
|
|
186
|
+
const processedProps = { ...props };
|
|
187
|
+
if (arguments.length > 2) {
|
|
188
|
+
processedProps.children = Array.prototype.slice.call(arguments, 2);
|
|
189
|
+
}
|
|
190
|
+
return { type, props: processedProps };
|
|
191
|
+
}
|
|
192
|
+
var Fragment = ({ children }) => children;
|
|
193
|
+
async function createElement(vnode) {
|
|
194
|
+
var _a;
|
|
195
|
+
console.log("Creating element from:", vnode);
|
|
196
|
+
if (vnode == null) {
|
|
197
|
+
return document.createTextNode("");
|
|
198
|
+
}
|
|
199
|
+
if (typeof vnode === "boolean") {
|
|
200
|
+
return document.createTextNode("");
|
|
201
|
+
}
|
|
202
|
+
if (typeof vnode === "number" || typeof vnode === "string") {
|
|
203
|
+
return document.createTextNode(String(vnode));
|
|
204
|
+
}
|
|
205
|
+
if (Array.isArray(vnode)) {
|
|
206
|
+
const fragment = document.createDocumentFragment();
|
|
207
|
+
for (const child of vnode) {
|
|
208
|
+
const node = await createElement(child);
|
|
209
|
+
fragment.appendChild(node);
|
|
210
|
+
}
|
|
211
|
+
return fragment;
|
|
212
|
+
}
|
|
213
|
+
if ("type" in vnode && vnode.props !== void 0) {
|
|
214
|
+
const { type, props } = vnode;
|
|
215
|
+
if (typeof type === "function") {
|
|
216
|
+
try {
|
|
217
|
+
const result = await type(props || {});
|
|
218
|
+
const node = await createElement(result);
|
|
219
|
+
if (node instanceof Element) {
|
|
220
|
+
node.setAttribute("data-component-id", type.name || type.toString());
|
|
221
|
+
}
|
|
222
|
+
return node;
|
|
223
|
+
} catch (error) {
|
|
224
|
+
console.error("Error rendering component:", error);
|
|
225
|
+
return document.createTextNode("");
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
const element = document.createElement(type);
|
|
229
|
+
for (const [key, value] of Object.entries(props || {})) {
|
|
230
|
+
if (key === "children")
|
|
231
|
+
continue;
|
|
232
|
+
if (key.startsWith("on") && typeof value === "function") {
|
|
233
|
+
const eventName = key.toLowerCase().slice(2);
|
|
234
|
+
const existingHandler = (_a = element.__events) == null ? void 0 : _a[eventName];
|
|
235
|
+
if (existingHandler) {
|
|
236
|
+
element.removeEventListener(eventName, existingHandler);
|
|
237
|
+
}
|
|
238
|
+
element.addEventListener(eventName, value);
|
|
239
|
+
if (!element.__events) {
|
|
240
|
+
element.__events = {};
|
|
241
|
+
}
|
|
242
|
+
element.__events[eventName] = value;
|
|
243
|
+
} else if (key === "style" && typeof value === "object") {
|
|
244
|
+
Object.assign(element.style, value);
|
|
245
|
+
} else if (key === "className") {
|
|
246
|
+
element.setAttribute("class", String(value));
|
|
247
|
+
} else if (key !== "key" && key !== "ref") {
|
|
248
|
+
element.setAttribute(key, String(value));
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
const children = props == null ? void 0 : props.children;
|
|
252
|
+
if (children != null) {
|
|
253
|
+
const childArray = Array.isArray(children) ? children.flat() : [children];
|
|
254
|
+
for (const child of childArray) {
|
|
255
|
+
const childNode = await createElement(child);
|
|
256
|
+
element.appendChild(childNode);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
return element;
|
|
260
|
+
}
|
|
261
|
+
return document.createTextNode(String(vnode));
|
|
262
|
+
}
|
|
263
|
+
var isHydrating = false;
|
|
264
|
+
async function hydrate(element, container) {
|
|
265
|
+
isHydrating = true;
|
|
266
|
+
try {
|
|
267
|
+
await render(element, container);
|
|
268
|
+
} finally {
|
|
269
|
+
isHydrating = false;
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
async function render(element, container) {
|
|
273
|
+
console.log("Rendering to:", container.id);
|
|
274
|
+
batchUpdates(async () => {
|
|
275
|
+
const rendererId = prepareRender();
|
|
276
|
+
try {
|
|
277
|
+
setRenderCallback(render, element, container);
|
|
278
|
+
const domNode = await createElement(element);
|
|
279
|
+
if (!isHydrating) {
|
|
280
|
+
container.innerHTML = "";
|
|
281
|
+
}
|
|
282
|
+
container.appendChild(domNode);
|
|
283
|
+
} finally {
|
|
284
|
+
finishRender();
|
|
285
|
+
}
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
var server = {
|
|
289
|
+
async getServer() {
|
|
290
|
+
throw new Error("Server module can only be used in Node.js environment");
|
|
291
|
+
}
|
|
292
|
+
};
|
|
293
|
+
|
|
294
|
+
// src/wasm.ts
|
|
295
|
+
async function loadGoWasm(wasmUrl, options = {}) {
|
|
296
|
+
if (typeof window === "undefined") {
|
|
297
|
+
throw new Error("loadGoWasm() is for browser use only. Use loadGoWasmFromFile() in Node.js.");
|
|
298
|
+
}
|
|
299
|
+
try {
|
|
300
|
+
if (!window.Go) {
|
|
301
|
+
throw new Error("Go WASM runtime not available. Make sure wasm_exec.js is loaded.");
|
|
302
|
+
}
|
|
303
|
+
if (options.debug) {
|
|
304
|
+
console.log("[WASM] Loading WASM from:", wasmUrl);
|
|
305
|
+
}
|
|
306
|
+
const response = await fetch(wasmUrl);
|
|
307
|
+
if (!response.ok) {
|
|
308
|
+
throw new Error(`Failed to fetch WASM file: ${response.status}`);
|
|
309
|
+
}
|
|
310
|
+
const wasmBytes = await response.arrayBuffer();
|
|
311
|
+
const go = new window.Go();
|
|
312
|
+
const wasmModule = await WebAssembly.instantiate(wasmBytes, go.importObject);
|
|
313
|
+
go.run(wasmModule.instance);
|
|
314
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
315
|
+
if (options.debug) {
|
|
316
|
+
console.log("[WASM] Go program started, checking for registered functions...");
|
|
317
|
+
}
|
|
318
|
+
const functions = {};
|
|
319
|
+
for (const key in window) {
|
|
320
|
+
if (typeof window[key] === "function" && key.startsWith("go")) {
|
|
321
|
+
functions[key] = window[key];
|
|
322
|
+
if (options.debug) {
|
|
323
|
+
console.log(`[WASM] Found function: ${key}`);
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
const wasmInstance = {
|
|
328
|
+
instance: wasmModule.instance,
|
|
329
|
+
module: wasmModule,
|
|
330
|
+
exports: wasmModule.instance.exports,
|
|
331
|
+
functions
|
|
332
|
+
};
|
|
333
|
+
if (options.onLoad) {
|
|
334
|
+
options.onLoad(wasmInstance);
|
|
335
|
+
}
|
|
336
|
+
if (options.debug) {
|
|
337
|
+
console.log(`[WASM] Module loaded successfully with ${Object.keys(functions).length} functions`);
|
|
338
|
+
}
|
|
339
|
+
return wasmInstance;
|
|
340
|
+
} catch (error) {
|
|
341
|
+
console.error("[WASM] Error loading Go WASM module:", error);
|
|
342
|
+
throw error;
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
function callWasmFunction(funcName, ...args) {
|
|
346
|
+
if (typeof window === "undefined") {
|
|
347
|
+
throw new Error("callWasmFunction() is for browser use only.");
|
|
348
|
+
}
|
|
349
|
+
const func = window[funcName];
|
|
350
|
+
if (typeof func !== "function") {
|
|
351
|
+
throw new Error(`Function ${funcName} not found. Make sure the WASM module is loaded.`);
|
|
352
|
+
}
|
|
353
|
+
return func(...args);
|
|
354
|
+
}
|
|
355
|
+
function isWasmReady() {
|
|
356
|
+
if (typeof window === "undefined") {
|
|
357
|
+
return false;
|
|
358
|
+
}
|
|
359
|
+
return !!(window.Go && Object.keys(window).some(
|
|
360
|
+
(key) => key.startsWith("go") && typeof window[key] === "function"
|
|
361
|
+
));
|
|
362
|
+
}
|
|
363
|
+
function getWasmFunctions() {
|
|
364
|
+
if (typeof window === "undefined") {
|
|
365
|
+
return [];
|
|
366
|
+
}
|
|
367
|
+
return Object.keys(window).filter(
|
|
368
|
+
(key) => key.startsWith("go") && typeof window[key] === "function"
|
|
369
|
+
);
|
|
370
|
+
}
|
|
371
|
+
function useGoWasm(wasmUrl, options = {}) {
|
|
372
|
+
if (typeof window === "undefined") {
|
|
373
|
+
throw new Error("useGoWasm() is for browser use only.");
|
|
374
|
+
}
|
|
375
|
+
return {
|
|
376
|
+
loadWasm: () => loadGoWasm(wasmUrl, options),
|
|
377
|
+
callFunction: callWasmFunction,
|
|
378
|
+
isReady: isWasmReady,
|
|
379
|
+
getFunctions: getWasmFunctions
|
|
380
|
+
};
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
// src/server/templates.ts
|
|
384
|
+
function generateDocument(content, options = {}) {
|
|
385
|
+
const {
|
|
386
|
+
title = "Frontend Hamroun App",
|
|
387
|
+
description = "",
|
|
388
|
+
lang = "en",
|
|
389
|
+
charset = "UTF-8",
|
|
390
|
+
viewport = "width=device-width, initial-scale=1.0",
|
|
391
|
+
scripts = [],
|
|
392
|
+
styles = [],
|
|
393
|
+
meta = {},
|
|
394
|
+
bodyClasses = "",
|
|
395
|
+
htmlAttrs = {},
|
|
396
|
+
bodyAttrs = {},
|
|
397
|
+
initialData = {},
|
|
398
|
+
componentName = ""
|
|
399
|
+
} = options;
|
|
400
|
+
const htmlAttributes = Object.entries(htmlAttrs).map(([key, value]) => `${key}="${escapeHtml(value)}"`).join(" ");
|
|
401
|
+
const bodyAttributes = Object.entries(bodyAttrs).map(([key, value]) => `${key}="${escapeHtml(value)}"`).join(" ");
|
|
402
|
+
const metaTags = [
|
|
403
|
+
`<meta charset="${charset}">`,
|
|
404
|
+
`<meta name="viewport" content="${viewport}">`,
|
|
405
|
+
description ? `<meta name="description" content="${escapeHtml(description)}">` : ""
|
|
406
|
+
];
|
|
407
|
+
Object.entries(meta).forEach(([name, content2]) => {
|
|
408
|
+
metaTags.push(`<meta name="${escapeHtml(name)}" content="${escapeHtml(content2)}">`);
|
|
409
|
+
});
|
|
410
|
+
const scriptTags = scripts.map((src) => {
|
|
411
|
+
if (src.startsWith("<script")) {
|
|
412
|
+
return src;
|
|
413
|
+
}
|
|
414
|
+
return `<script src="${escapeHtml(src)}" ${src.endsWith(".js") ? 'type="module"' : ""} defer><\/script>`;
|
|
415
|
+
});
|
|
416
|
+
const styleTags = styles.map((href) => {
|
|
417
|
+
if (href.startsWith("<style")) {
|
|
418
|
+
return href;
|
|
419
|
+
}
|
|
420
|
+
return `<link rel="stylesheet" href="${escapeHtml(href)}">`;
|
|
421
|
+
});
|
|
422
|
+
const initialDataScript = Object.keys(initialData).length > 0 ? `<script id="__APP_DATA__" type="application/json">${escapeHtml(JSON.stringify(initialData))}<\/script>` : "";
|
|
423
|
+
return `<!DOCTYPE html>
|
|
424
|
+
<html lang="${lang}" ${htmlAttributes}>
|
|
425
|
+
<head>
|
|
426
|
+
${metaTags.filter(Boolean).join("\n ")}
|
|
427
|
+
<title>${escapeHtml(title)}</title>
|
|
428
|
+
${styleTags.join("\n ")}
|
|
429
|
+
</head>
|
|
430
|
+
<body class="${bodyClasses}" ${bodyAttributes}>
|
|
431
|
+
<div id="app-root" data-ssr-root${componentName ? ` data-component="${escapeHtml(componentName)}"` : ""}>${content}</div>
|
|
432
|
+
${initialDataScript}
|
|
433
|
+
${scriptTags.join("\n ")}
|
|
434
|
+
</body>
|
|
435
|
+
</html>`;
|
|
436
|
+
}
|
|
437
|
+
function generateErrorPage(statusCode, message, error) {
|
|
438
|
+
const errorMessages = {
|
|
439
|
+
400: "Bad Request",
|
|
440
|
+
401: "Unauthorized",
|
|
441
|
+
403: "Forbidden",
|
|
442
|
+
404: "Not Found",
|
|
443
|
+
500: "Internal Server Error"
|
|
444
|
+
};
|
|
445
|
+
const title = `${statusCode} - ${errorMessages[statusCode] || "Error"}`;
|
|
446
|
+
const isDev = false;
|
|
447
|
+
const errorDetails = isDev && error ? `
|
|
448
|
+
<div class="error-details">
|
|
449
|
+
<pre>${escapeHtml(error.stack || error.message)}</pre>
|
|
450
|
+
</div>
|
|
451
|
+
` : "";
|
|
452
|
+
const content = `
|
|
453
|
+
<div class="error-container">
|
|
454
|
+
<h1>${statusCode}</h1>
|
|
455
|
+
<h2>${escapeHtml(errorMessages[statusCode] || "Error")}</h2>
|
|
456
|
+
<p>${escapeHtml(message)}</p>
|
|
457
|
+
${errorDetails}
|
|
458
|
+
<a href="/" class="home-link">Back to Home</a>
|
|
459
|
+
</div>
|
|
460
|
+
`;
|
|
461
|
+
const styles = [`<style>
|
|
462
|
+
body {
|
|
463
|
+
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
|
|
464
|
+
display: flex;
|
|
465
|
+
justify-content: center;
|
|
466
|
+
align-items: center;
|
|
467
|
+
min-height: 100vh;
|
|
468
|
+
margin: 0;
|
|
469
|
+
background-color: #f7f7f7;
|
|
470
|
+
color: #333;
|
|
471
|
+
}
|
|
472
|
+
.error-container {
|
|
473
|
+
text-align: center;
|
|
474
|
+
padding: 2rem;
|
|
475
|
+
border-radius: 8px;
|
|
476
|
+
background-color: white;
|
|
477
|
+
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
|
|
478
|
+
max-width: 600px;
|
|
479
|
+
width: 100%;
|
|
480
|
+
}
|
|
481
|
+
h1 {
|
|
482
|
+
font-size: 6rem;
|
|
483
|
+
margin: 0;
|
|
484
|
+
color: #e74c3c;
|
|
485
|
+
}
|
|
486
|
+
h2 {
|
|
487
|
+
margin-top: 0;
|
|
488
|
+
margin-bottom: 1rem;
|
|
489
|
+
color: #333;
|
|
490
|
+
}
|
|
491
|
+
.error-details {
|
|
492
|
+
text-align: left;
|
|
493
|
+
margin: 2rem 0;
|
|
494
|
+
padding: 1rem;
|
|
495
|
+
background-color: #f8f8f8;
|
|
496
|
+
border-radius: 4px;
|
|
497
|
+
overflow: auto;
|
|
498
|
+
}
|
|
499
|
+
pre {
|
|
500
|
+
margin: 0;
|
|
501
|
+
font-family: monospace;
|
|
502
|
+
font-size: 0.85rem;
|
|
503
|
+
white-space: pre-wrap;
|
|
504
|
+
}
|
|
505
|
+
.home-link {
|
|
506
|
+
display: inline-block;
|
|
507
|
+
margin-top: 1.5rem;
|
|
508
|
+
padding: 0.75rem 1.5rem;
|
|
509
|
+
background-color: #3498db;
|
|
510
|
+
color: white;
|
|
511
|
+
text-decoration: none;
|
|
512
|
+
border-radius: 4px;
|
|
513
|
+
transition: background-color 0.2s;
|
|
514
|
+
}
|
|
515
|
+
.home-link:hover {
|
|
516
|
+
background-color: #2980b9;
|
|
517
|
+
}
|
|
518
|
+
</style>`];
|
|
519
|
+
return generateDocument(content, {
|
|
520
|
+
title,
|
|
521
|
+
description: `Error ${statusCode}: ${errorMessages[statusCode] || "Error"}`,
|
|
522
|
+
bodyClasses: "error-page",
|
|
523
|
+
styles
|
|
524
|
+
});
|
|
525
|
+
}
|
|
526
|
+
function generateLoadingPage(message = "Loading...") {
|
|
527
|
+
const content = `
|
|
528
|
+
<div class="loading-container">
|
|
529
|
+
<div class="spinner"></div>
|
|
530
|
+
<p>${escapeHtml(message)}</p>
|
|
531
|
+
</div>
|
|
532
|
+
`;
|
|
533
|
+
const styles = [`<style>
|
|
534
|
+
body {
|
|
535
|
+
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
|
|
536
|
+
display: flex;
|
|
537
|
+
justify-content: center;
|
|
538
|
+
align-items: center;
|
|
539
|
+
min-height: 100vh;
|
|
540
|
+
margin: 0;
|
|
541
|
+
background-color: #f7f7f7;
|
|
542
|
+
color: #333;
|
|
543
|
+
}
|
|
544
|
+
.loading-container {
|
|
545
|
+
text-align: center;
|
|
546
|
+
}
|
|
547
|
+
.spinner {
|
|
548
|
+
width: 50px;
|
|
549
|
+
height: 50px;
|
|
550
|
+
border: 5px solid rgba(0, 0, 0, 0.1);
|
|
551
|
+
border-radius: 50%;
|
|
552
|
+
border-top-color: #3498db;
|
|
553
|
+
animation: spin 1s ease-in-out infinite;
|
|
554
|
+
margin: 0 auto 20px;
|
|
555
|
+
}
|
|
556
|
+
@keyframes spin {
|
|
557
|
+
to { transform: rotate(360deg); }
|
|
558
|
+
}
|
|
559
|
+
</style>`];
|
|
560
|
+
return generateDocument(content, {
|
|
561
|
+
title: "Loading",
|
|
562
|
+
bodyClasses: "loading-page",
|
|
563
|
+
styles
|
|
564
|
+
});
|
|
565
|
+
}
|
|
566
|
+
function escapeHtml(text) {
|
|
567
|
+
return String(text).replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """).replace(/'/g, "'");
|
|
568
|
+
}
|
|
569
|
+
|
|
570
|
+
// src/browser.ts
|
|
571
|
+
function renderToString(content) {
|
|
572
|
+
if (typeof content === "string") {
|
|
573
|
+
return Promise.resolve(content);
|
|
574
|
+
}
|
|
575
|
+
if (typeof content === "function") {
|
|
576
|
+
try {
|
|
577
|
+
const result = content();
|
|
578
|
+
return Promise.resolve(String(result));
|
|
579
|
+
} catch (error) {
|
|
580
|
+
return Promise.resolve(`<!-- Error rendering: ${error} -->`);
|
|
581
|
+
}
|
|
582
|
+
}
|
|
583
|
+
return Promise.resolve(String(content));
|
|
584
|
+
}
|
|
585
|
+
function generateToken(length = 32) {
|
|
586
|
+
const array = new Uint8Array(length);
|
|
587
|
+
if (typeof crypto !== "undefined" && crypto.getRandomValues) {
|
|
588
|
+
crypto.getRandomValues(array);
|
|
589
|
+
} else {
|
|
590
|
+
for (let i = 0; i < array.length; i++) {
|
|
591
|
+
array[i] = Math.floor(Math.random() * 256);
|
|
592
|
+
}
|
|
593
|
+
}
|
|
594
|
+
return Array.from(array, (byte) => byte.toString(16).padStart(2, "0")).join("");
|
|
595
|
+
}
|
|
596
|
+
function safeJsonParse(json, fallback) {
|
|
597
|
+
try {
|
|
598
|
+
return JSON.parse(json);
|
|
599
|
+
} catch (error) {
|
|
600
|
+
return fallback;
|
|
601
|
+
}
|
|
602
|
+
}
|
|
603
|
+
var isBrowser = typeof window !== "undefined";
|
|
604
|
+
var isNode = false;
|
|
605
|
+
console.log("Baraqex - Browser version loaded");
|
|
606
|
+
export {
|
|
607
|
+
Fragment,
|
|
608
|
+
batchUpdates,
|
|
609
|
+
callWasmFunction,
|
|
610
|
+
createContext,
|
|
611
|
+
generateDocument,
|
|
612
|
+
generateErrorPage,
|
|
613
|
+
generateLoadingPage,
|
|
614
|
+
generateToken,
|
|
615
|
+
getWasmFunctions,
|
|
616
|
+
hydrate,
|
|
617
|
+
isBrowser,
|
|
618
|
+
isNode,
|
|
619
|
+
isWasmReady,
|
|
620
|
+
jsx,
|
|
621
|
+
jsx as jsxs,
|
|
622
|
+
loadGoWasm,
|
|
623
|
+
render,
|
|
624
|
+
renderToString,
|
|
625
|
+
safeJsonParse,
|
|
626
|
+
server,
|
|
627
|
+
useContext,
|
|
628
|
+
useEffect,
|
|
629
|
+
useErrorBoundary,
|
|
630
|
+
useGoWasm,
|
|
631
|
+
useMemo,
|
|
632
|
+
useRef,
|
|
633
|
+
useState
|
|
634
|
+
};
|
|
635
|
+
//# sourceMappingURL=browser.js.map
|