frontend-hamroun 1.2.74 → 1.2.77
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/Counter.d.ts +0 -0
- package/dist/batch/package.json +16 -0
- package/dist/client-router/package.json +16 -0
- package/dist/component/package.json +16 -0
- package/dist/context/package.json +16 -0
- package/dist/event-bus/package.json +16 -0
- package/dist/forms/package.json +16 -0
- package/dist/hooks/package.json +16 -0
- package/dist/hooks-0728361a.cjs +1 -0
- package/dist/hooks-b58f947c.js +133 -0
- package/dist/hooks.js +1 -0
- package/dist/hooks.mjs +13 -0
- package/dist/index.js +1 -384
- package/dist/index.mjs +130 -374
- package/dist/jsx-runtime/package.json +16 -0
- package/dist/jsx-runtime.js +1 -0
- package/dist/jsx-runtime.mjs +64 -0
- package/dist/lifecycle-events/package.json +16 -0
- package/dist/package.json +71 -0
- package/dist/render-component/package.json +16 -0
- package/dist/renderer/package.json +16 -0
- package/dist/renderer.js +1 -0
- package/dist/renderer.mjs +27 -0
- package/dist/router/package.json +16 -0
- package/dist/server/package.json +17 -0
- package/dist/server/src/batch.d.ts +3 -0
- package/dist/server/src/batch.js +23 -0
- package/dist/server/src/batch.js.map +1 -0
- package/dist/server/src/client-router.d.ts +60 -0
- package/dist/server/src/client-router.js +210 -0
- package/dist/server/src/client-router.js.map +1 -0
- package/dist/server/src/component.d.ts +14 -0
- package/dist/server/src/component.js +106 -0
- package/dist/server/src/component.js.map +1 -0
- package/dist/server/src/context.d.ts +13 -0
- package/dist/server/src/context.js +21 -0
- package/dist/server/src/context.js.map +1 -0
- package/dist/server/src/event-bus.d.ts +23 -0
- package/dist/server/src/event-bus.js +75 -0
- package/dist/server/src/event-bus.js.map +1 -0
- package/dist/server/src/forms.d.ts +40 -0
- package/dist/server/src/forms.js +148 -0
- package/dist/server/src/forms.js.map +1 -0
- package/dist/server/src/hooks.d.ts +12 -0
- package/dist/server/src/hooks.js +170 -0
- package/dist/server/src/hooks.js.map +1 -0
- package/dist/server/src/index.client.d.ts +12 -0
- package/dist/server/src/index.client.js +14 -0
- package/dist/server/src/index.client.js.map +1 -0
- package/dist/server/src/index.d.ts +88 -0
- package/dist/server/src/index.js +78 -0
- package/dist/server/src/index.js.map +1 -0
- package/dist/server/src/jsx-runtime/jsx-dev-runtime.d.ts +1 -0
- package/dist/server/src/jsx-runtime/jsx-dev-runtime.js +2 -0
- package/dist/server/src/jsx-runtime/jsx-dev-runtime.js.map +1 -0
- package/dist/server/src/jsx-runtime/jsx-runtime.d.ts +4 -0
- package/dist/server/src/jsx-runtime/jsx-runtime.js +41 -0
- package/dist/server/src/jsx-runtime/jsx-runtime.js.map +1 -0
- package/dist/server/src/jsx-runtime.d.ts +20 -0
- package/dist/server/src/jsx-runtime.js +105 -0
- package/dist/server/src/jsx-runtime.js.map +1 -0
- package/dist/server/src/lifecycle-events.d.ts +108 -0
- package/dist/server/src/lifecycle-events.js +177 -0
- package/dist/server/src/lifecycle-events.js.map +1 -0
- package/dist/server/src/renderComponent.d.ts +14 -0
- package/dist/server/src/renderComponent.js +25 -0
- package/dist/server/src/renderComponent.js.map +1 -0
- package/dist/server/src/renderer.d.ts +2 -0
- package/dist/server/src/renderer.js +31 -0
- package/dist/server/src/renderer.js.map +1 -0
- package/dist/server/src/router.d.ts +55 -0
- package/dist/server/src/router.js +166 -0
- package/dist/server/src/router.js.map +1 -0
- package/dist/server/src/server/api-router.d.ts +15 -0
- package/dist/server/src/server/api-router.js +111 -0
- package/dist/server/src/server/api-router.js.map +1 -0
- package/dist/server/src/server/auth.d.ts +32 -0
- package/dist/server/src/server/auth.js +80 -0
- package/dist/server/src/server/auth.js.map +1 -0
- package/dist/server/src/server/database.d.ts +24 -0
- package/dist/server/src/server/database.js +135 -0
- package/dist/server/src/server/database.js.map +1 -0
- package/dist/server/src/server/index.d.ts +127 -0
- package/dist/server/src/server/index.js +388 -0
- package/dist/server/src/server/index.js.map +1 -0
- package/dist/server/src/server/middleware.d.ts +11 -0
- package/dist/server/src/server/middleware.js +46 -0
- package/dist/server/src/server/middleware.js.map +1 -0
- package/dist/server/src/server/server.d.ts +9 -0
- package/dist/server/src/server/server.js +87 -0
- package/dist/server/src/server/server.js.map +1 -0
- package/dist/server/src/server/templates.d.ts +28 -0
- package/dist/server/src/server/templates.js +204 -0
- package/dist/server/src/server/templates.js.map +1 -0
- package/dist/server/src/server/types.d.ts +38 -0
- package/dist/server/src/server/types.js +4 -0
- package/dist/server/src/server/types.js.map +1 -0
- package/dist/server/src/server/utils.d.ts +70 -0
- package/dist/server/src/server/utils.js +156 -0
- package/dist/server/src/server/utils.js.map +1 -0
- package/dist/server/src/server/wasm.d.ts +9 -0
- package/dist/server/src/server/wasm.js +117 -0
- package/dist/server/src/server/wasm.js.map +1 -0
- package/dist/server/src/server-renderer.d.ts +5 -0
- package/dist/server/src/server-renderer.js +106 -0
- package/dist/server/src/server-renderer.js.map +1 -0
- package/dist/server/src/server-types.d.ts +42 -0
- package/dist/server/src/server-types.js +6 -0
- package/dist/server/src/server-types.js.map +1 -0
- package/dist/server/src/store.d.ts +41 -0
- package/dist/server/src/store.js +99 -0
- package/dist/server/src/store.js.map +1 -0
- package/dist/server/src/types.d.ts +19 -0
- package/dist/server/src/types.js +2 -0
- package/dist/server/src/types.js.map +1 -0
- package/dist/server/src/utils.d.ts +46 -0
- package/dist/server/src/utils.js +144 -0
- package/dist/server/src/utils.js.map +1 -0
- package/dist/server/src/vdom.d.ts +8 -0
- package/dist/server/src/vdom.js +22 -0
- package/dist/server/src/vdom.js.map +1 -0
- package/dist/server/src/wasm.d.ts +36 -0
- package/dist/server/src/wasm.js +159 -0
- package/dist/server/src/wasm.js.map +1 -0
- package/dist/server/tsconfig.server.tsbuildinfo +1 -0
- package/dist/server-renderer/package.json +16 -0
- package/dist/server-renderer.js +1 -0
- package/dist/server-renderer.mjs +64 -0
- package/dist/store/package.json +16 -0
- package/dist/types/package.json +16 -0
- package/dist/utils/package.json +16 -0
- package/dist/vdom/package.json +16 -0
- package/dist/wasm/package.json +16 -0
- package/dist/wasm.js +1 -0
- package/dist/wasm.mjs +103 -0
- package/package.json +14 -13
- package/templates/complete-app/build.js +284 -0
- package/templates/complete-app/package.json +40 -0
- package/templates/complete-app/public/styles.css +345 -0
- package/templates/complete-app/src/api/index.js +31 -0
- package/templates/complete-app/src/client.js +93 -0
- package/templates/complete-app/src/components/App.js +66 -0
- package/templates/complete-app/src/components/Footer.js +19 -0
- package/templates/complete-app/src/components/Header.js +38 -0
- package/templates/complete-app/src/pages/About.js +59 -0
- package/templates/complete-app/src/pages/Home.js +54 -0
- package/templates/complete-app/src/pages/WasmDemo.js +136 -0
- package/templates/complete-app/src/server.js +186 -0
- package/templates/complete-app/src/wasm/build.bat +16 -0
- package/templates/complete-app/src/wasm/build.sh +16 -0
- package/templates/complete-app/src/wasm/example.go +101 -0
- package/templates/fullstack-app/build/main.css +225 -15
- package/templates/fullstack-app/build/main.css.map +2 -2
- package/templates/fullstack-app/build/main.js +657 -372
- package/templates/fullstack-app/build/main.js.map +4 -4
- package/templates/fullstack-app/build.ts +3 -4
- package/templates/fullstack-app/public/styles.css +222 -15
- package/templates/fullstack-app/server.ts +46 -12
- package/templates/fullstack-app/src/components/ClientHome.tsx +0 -0
- package/templates/fullstack-app/src/components/ErrorBoundary.tsx +36 -0
- package/templates/fullstack-app/src/components/Layout.tsx +23 -26
- package/templates/fullstack-app/src/components/StateDemo.tsx +207 -0
- package/templates/fullstack-app/src/components/UserList.tsx +30 -13
- package/templates/fullstack-app/src/data/api.ts +173 -38
- package/templates/fullstack-app/src/main.tsx +88 -154
- package/templates/fullstack-app/src/middleware.ts +28 -0
- package/templates/fullstack-app/src/pages/404.tsx +28 -0
- package/templates/fullstack-app/src/pages/[id].tsx +0 -0
- package/templates/fullstack-app/src/pages/_app.tsx +11 -0
- package/templates/fullstack-app/src/pages/_document.tsx +25 -0
- package/templates/fullstack-app/src/pages/_error.tsx +45 -0
- package/templates/fullstack-app/src/pages/about.tsx +71 -0
- package/templates/fullstack-app/src/pages/api/users/[id].ts +73 -0
- package/templates/fullstack-app/src/pages/api/users/index.ts +43 -0
- package/templates/fullstack-app/src/pages/index.tsx +97 -20
- package/templates/fullstack-app/src/pages/users/[id].tsx +153 -0
- package/templates/fullstack-app/src/pages/wasm-demo.tsx +1 -0
- package/templates/go/build.sh +43 -43
- package/templates/go/example.go +99 -86
- package/templates/go-wasm-app/babel.config.js +8 -2
- package/templates/go-wasm-app/build-wasm.js +84 -84
- package/templates/go-wasm-app/build.config.js +62 -0
- package/templates/go-wasm-app/build.js +218 -0
- package/templates/go-wasm-app/package.json +21 -11
- package/templates/go-wasm-app/public/index.html +49 -53
- package/templates/go-wasm-app/server.js +56 -695
- package/templates/go-wasm-app/src/app.js +173 -0
- package/templates/go-wasm-app/vite.config.js +16 -5
- package/templates/ssr-template/client.js +54 -26
- package/templates/ssr-template/server.js +5 -28
- package/templates/ssr-template/vite.config.js +21 -5
- package/dist/index.d.ts +0 -1
- package/dist/index.js.map +0 -1
- package/dist/index.mjs.map +0 -1
package/dist/wasm.mjs
ADDED
@@ -0,0 +1,103 @@
|
|
1
|
+
const p = "/wasm_exec.js";
|
2
|
+
async function F(o, t = {}) {
|
3
|
+
const {
|
4
|
+
importObject: s = {},
|
5
|
+
goWasmPath: c = p,
|
6
|
+
loadGo: W = !0,
|
7
|
+
onLoad: _,
|
8
|
+
debug: l = !1
|
9
|
+
} = t;
|
10
|
+
typeof window < "u" && W && await y(c);
|
11
|
+
try {
|
12
|
+
const e = typeof Go < "u" ? new Go() : null;
|
13
|
+
l && console.log(`[WASM] Loading module from ${o}`);
|
14
|
+
const a = await fetch(o);
|
15
|
+
if (!a.ok)
|
16
|
+
throw new Error(`Failed to fetch WASM module: ${a.statusText}`);
|
17
|
+
const b = await a.arrayBuffer(), G = await WebAssembly.compile(b), A = e ? {
|
18
|
+
...e.importObject,
|
19
|
+
...s
|
20
|
+
} : s, w = await WebAssembly.instantiate(G, A);
|
21
|
+
e && e.run(w);
|
22
|
+
const d = w.exports, r = {};
|
23
|
+
for (const n in d)
|
24
|
+
if (typeof d[n] == "function") {
|
25
|
+
const m = d[n];
|
26
|
+
if (r[n] = (...i) => m(...i), l) {
|
27
|
+
const i = r[n];
|
28
|
+
r[n] = (...f) => {
|
29
|
+
console.log(`[WASM] Calling ${n}(${f.join(", ")})`);
|
30
|
+
const u = i(...f);
|
31
|
+
return console.log(`[WASM] ${n} returned:`, u), u;
|
32
|
+
};
|
33
|
+
}
|
34
|
+
}
|
35
|
+
if (typeof window < "u") {
|
36
|
+
for (const n in window)
|
37
|
+
if (n.startsWith("go") && typeof window[n] == "function") {
|
38
|
+
const m = window[n];
|
39
|
+
if (r[n] = (...i) => m(...i), l) {
|
40
|
+
const i = r[n];
|
41
|
+
r[n] = (...f) => {
|
42
|
+
console.log(`[WASM] Calling global ${n}(${f.join(", ")})`);
|
43
|
+
const u = i(...f);
|
44
|
+
return console.log(`[WASM] ${n} returned:`, u), u;
|
45
|
+
};
|
46
|
+
}
|
47
|
+
}
|
48
|
+
}
|
49
|
+
const g = {
|
50
|
+
instance: w,
|
51
|
+
module: G,
|
52
|
+
exports: d,
|
53
|
+
functions: r
|
54
|
+
};
|
55
|
+
return _ && _(g), g;
|
56
|
+
} catch (e) {
|
57
|
+
throw console.error("[WASM] Failed to load Go WASM module:", e), e;
|
58
|
+
}
|
59
|
+
}
|
60
|
+
async function y(o = p) {
|
61
|
+
if (!(typeof window > "u") && !(typeof window.Go < "u"))
|
62
|
+
return new Promise((t, s) => {
|
63
|
+
const c = document.createElement("script");
|
64
|
+
c.src = o, c.onload = () => t(), c.onerror = () => s(new Error(`Failed to load Go WASM runtime from ${o}`)), document.head.appendChild(c);
|
65
|
+
});
|
66
|
+
}
|
67
|
+
function S(o, t) {
|
68
|
+
if (!o.functions[t])
|
69
|
+
throw new Error(`WASM function "${t}" not found`);
|
70
|
+
return o.functions[t];
|
71
|
+
}
|
72
|
+
const M = {
|
73
|
+
// Convert JS string to Go string (returns memory pointer)
|
74
|
+
stringToGo: (o, t) => {
|
75
|
+
if (!o.functions.__stringToGo)
|
76
|
+
throw new Error("__stringToGo function not found in WASM module");
|
77
|
+
return o.functions.__stringToGo(t);
|
78
|
+
},
|
79
|
+
// Convert Go string (memory pointer) to JS string
|
80
|
+
stringFromGo: (o, t) => {
|
81
|
+
if (!o.functions.__stringFromGo)
|
82
|
+
throw new Error("__stringFromGo function not found in WASM module");
|
83
|
+
return o.functions.__stringFromGo(t);
|
84
|
+
},
|
85
|
+
// Convert JS object to Go (returns memory pointer)
|
86
|
+
objectToGo: (o, t) => {
|
87
|
+
if (!o.functions.__objectToGo)
|
88
|
+
throw new Error("__objectToGo function not found in WASM module");
|
89
|
+
return o.functions.__objectToGo(JSON.stringify(t));
|
90
|
+
},
|
91
|
+
// Convert Go object (memory pointer) to JS object
|
92
|
+
objectFromGo: (o, t) => {
|
93
|
+
if (!o.functions.__objectFromGo)
|
94
|
+
throw new Error("__objectFromGo function not found in WASM module");
|
95
|
+
const s = o.functions.__objectFromGo(t);
|
96
|
+
return JSON.parse(s);
|
97
|
+
}
|
98
|
+
};
|
99
|
+
export {
|
100
|
+
S as createTypedWasmFunction,
|
101
|
+
M as goValues,
|
102
|
+
F as loadGoWasm
|
103
|
+
};
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "frontend-hamroun",
|
3
|
-
"version": "1.2.
|
3
|
+
"version": "1.2.77",
|
4
4
|
"description": "A lightweight full-stack JavaScript framework",
|
5
5
|
"type": "module",
|
6
6
|
"main": "./dist/index.js",
|
@@ -22,62 +22,63 @@
|
|
22
22
|
},
|
23
23
|
"./server": {
|
24
24
|
"types": "./dist/server/index.d.ts",
|
25
|
-
"
|
25
|
+
"node": "./dist/server/index.js",
|
26
|
+
"import": "./dist/server/index.mjs",
|
26
27
|
"require": "./dist/server/index.js"
|
27
28
|
},
|
28
29
|
"./server/database": {
|
29
30
|
"types": "./dist/server/database.d.ts",
|
30
|
-
"import": "./dist/server/database.
|
31
|
+
"import": "./dist/server/database.mjs",
|
31
32
|
"require": "./dist/server/database.js"
|
32
33
|
},
|
33
34
|
"./server/auth": {
|
34
35
|
"types": "./dist/server/auth.d.ts",
|
35
|
-
"import": "./dist/server/auth.
|
36
|
+
"import": "./dist/server/auth.mjs",
|
36
37
|
"require": "./dist/server/auth.js"
|
37
38
|
},
|
38
39
|
"./server/middleware": {
|
39
40
|
"types": "./dist/server/middleware.d.ts",
|
40
|
-
"import": "./dist/server/middleware.
|
41
|
+
"import": "./dist/server/middleware.mjs",
|
41
42
|
"require": "./dist/server/middleware.js"
|
42
43
|
},
|
43
44
|
"./server/api-router": {
|
44
45
|
"types": "./dist/server/api-router.d.ts",
|
45
|
-
"import": "./dist/server/api-router.
|
46
|
+
"import": "./dist/server/api-router.mjs",
|
46
47
|
"require": "./dist/server/api-router.js"
|
47
48
|
},
|
48
49
|
"./server-types": {
|
49
50
|
"types": "./dist/server-types.d.ts",
|
50
|
-
"import": "./dist/server-types.
|
51
|
+
"import": "./dist/server-types.mjs",
|
51
52
|
"require": "./dist/server-types.js"
|
52
53
|
},
|
53
54
|
"./ssr": {
|
54
55
|
"types": "./dist/server-renderer.d.ts",
|
55
|
-
"import": "./dist/server-renderer.
|
56
|
+
"import": "./dist/server-renderer.mjs",
|
56
57
|
"require": "./dist/server-renderer.js"
|
57
58
|
},
|
58
59
|
"./jsx-runtime": {
|
59
60
|
"types": "./dist/jsx-runtime.d.ts",
|
60
|
-
"import": "./dist/jsx-runtime.
|
61
|
+
"import": "./dist/jsx-runtime.mjs",
|
61
62
|
"require": "./dist/jsx-runtime.js"
|
62
63
|
},
|
63
64
|
"./hooks": {
|
64
65
|
"types": "./dist/hooks.d.ts",
|
65
|
-
"import": "./dist/hooks.
|
66
|
+
"import": "./dist/hooks.mjs",
|
66
67
|
"require": "./dist/hooks.js"
|
67
68
|
},
|
68
69
|
"./renderer": {
|
69
70
|
"types": "./dist/renderer.d.ts",
|
70
|
-
"import": "./dist/renderer.
|
71
|
+
"import": "./dist/renderer.mjs",
|
71
72
|
"require": "./dist/renderer.js"
|
72
73
|
},
|
73
74
|
"./wasm": {
|
74
75
|
"types": "./dist/wasm.d.ts",
|
75
|
-
"import": "./dist/wasm.
|
76
|
+
"import": "./dist/wasm.mjs",
|
76
77
|
"require": "./dist/wasm.js"
|
77
78
|
},
|
78
79
|
"./server/wasm": {
|
79
80
|
"types": "./dist/server/wasm.d.ts",
|
80
|
-
"import": "./dist/server/wasm.
|
81
|
+
"import": "./dist/server/wasm.mjs",
|
81
82
|
"require": "./dist/server/wasm.js"
|
82
83
|
}
|
83
84
|
},
|
@@ -0,0 +1,284 @@
|
|
1
|
+
import { execSync } from 'child_process';
|
2
|
+
import path from 'path';
|
3
|
+
import fs from 'fs';
|
4
|
+
import esbuild from 'esbuild';
|
5
|
+
import http from 'http';
|
6
|
+
import { fileURLToPath } from 'url';
|
7
|
+
|
8
|
+
// Get __dirname equivalent in ESM
|
9
|
+
const __filename = fileURLToPath(import.meta.url);
|
10
|
+
const __dirname = path.dirname(__filename);
|
11
|
+
|
12
|
+
// ANSI color codes for console output
|
13
|
+
const colors = {
|
14
|
+
reset: "\x1b[0m",
|
15
|
+
bright: "\x1b[1m",
|
16
|
+
dim: "\x1b[2m",
|
17
|
+
cyan: "\x1b[36m",
|
18
|
+
green: "\x1b[32m",
|
19
|
+
yellow: "\x1b[33m",
|
20
|
+
red: "\x1b[31m"
|
21
|
+
};
|
22
|
+
|
23
|
+
// Parse command line arguments
|
24
|
+
const args = process.argv.slice(2);
|
25
|
+
const isProduction = process.env.NODE_ENV === 'production';
|
26
|
+
const wasmOnly = args.includes('--wasm-only');
|
27
|
+
const serve = args.includes('--serve');
|
28
|
+
|
29
|
+
// Helper for logging with colors
|
30
|
+
function log(message, type = 'info') {
|
31
|
+
const prefix = {
|
32
|
+
info: `${colors.bright}${colors.cyan}[INFO]${colors.reset}`,
|
33
|
+
success: `${colors.bright}${colors.green}[SUCCESS]${colors.reset}`,
|
34
|
+
warning: `${colors.bright}${colors.yellow}[WARNING]${colors.reset}`,
|
35
|
+
error: `${colors.bright}${colors.red}[ERROR]${colors.reset}`
|
36
|
+
};
|
37
|
+
|
38
|
+
console.log(`${prefix[type] || prefix.info} ${message}`);
|
39
|
+
}
|
40
|
+
|
41
|
+
// Build configuration
|
42
|
+
const config = {
|
43
|
+
// Entry points
|
44
|
+
entryPoints: {
|
45
|
+
client: 'src/client.js',
|
46
|
+
server: 'src/server.js'
|
47
|
+
},
|
48
|
+
|
49
|
+
// Output directories
|
50
|
+
outDir: {
|
51
|
+
client: 'dist/public',
|
52
|
+
server: 'dist'
|
53
|
+
},
|
54
|
+
|
55
|
+
// WASM configuration
|
56
|
+
wasm: {
|
57
|
+
dir: 'src/wasm',
|
58
|
+
buildScript: process.platform === 'win32' ? 'build.bat' : './build.sh',
|
59
|
+
outputDir: 'dist/public/wasm'
|
60
|
+
}
|
61
|
+
};
|
62
|
+
|
63
|
+
// Build WASM modules if they exist
|
64
|
+
async function buildWasmModules() {
|
65
|
+
const wasmDir = path.join(__dirname, config.wasm.dir);
|
66
|
+
|
67
|
+
if (!fs.existsSync(wasmDir)) {
|
68
|
+
log('No WASM directory found, skipping WASM build', 'warning');
|
69
|
+
return;
|
70
|
+
}
|
71
|
+
|
72
|
+
log('Building WebAssembly modules...');
|
73
|
+
|
74
|
+
try {
|
75
|
+
// Execute build script in WASM directory
|
76
|
+
execSync(config.wasm.buildScript, {
|
77
|
+
cwd: wasmDir,
|
78
|
+
stdio: 'inherit'
|
79
|
+
});
|
80
|
+
|
81
|
+
// Ensure output directory exists
|
82
|
+
const outputDir = path.join(__dirname, config.wasm.outputDir);
|
83
|
+
if (!fs.existsSync(outputDir)) {
|
84
|
+
fs.mkdirSync(outputDir, { recursive: true });
|
85
|
+
}
|
86
|
+
|
87
|
+
// Copy WASM files to output directory
|
88
|
+
const wasmFiles = fs.readdirSync(wasmDir).filter(file =>
|
89
|
+
file.endsWith('.wasm') || file === 'wasm_exec.js');
|
90
|
+
|
91
|
+
for (const file of wasmFiles) {
|
92
|
+
fs.copyFileSync(
|
93
|
+
path.join(wasmDir, file),
|
94
|
+
path.join(outputDir, file)
|
95
|
+
);
|
96
|
+
}
|
97
|
+
|
98
|
+
log(`WebAssembly modules built and copied to ${config.wasm.outputDir}`, 'success');
|
99
|
+
} catch (error) {
|
100
|
+
log(`Failed to build WebAssembly modules: ${error.message}`, 'error');
|
101
|
+
if (!wasmOnly) {
|
102
|
+
log('Continuing with rest of build...', 'warning');
|
103
|
+
} else {
|
104
|
+
process.exit(1);
|
105
|
+
}
|
106
|
+
}
|
107
|
+
}
|
108
|
+
|
109
|
+
// Build client-side code
|
110
|
+
async function buildClient() {
|
111
|
+
log('Building client bundle...');
|
112
|
+
|
113
|
+
try {
|
114
|
+
const clientOutDir = path.join(__dirname, config.outDir.client);
|
115
|
+
|
116
|
+
// Ensure output directory exists
|
117
|
+
if (!fs.existsSync(clientOutDir)) {
|
118
|
+
fs.mkdirSync(clientOutDir, { recursive: true });
|
119
|
+
}
|
120
|
+
|
121
|
+
// Bundle client code
|
122
|
+
await esbuild.build({
|
123
|
+
entryPoints: [path.join(__dirname, config.entryPoints.client)],
|
124
|
+
bundle: true,
|
125
|
+
outfile: path.join(clientOutDir, 'client.js'),
|
126
|
+
format: 'esm',
|
127
|
+
platform: 'browser',
|
128
|
+
target: ['es2020'],
|
129
|
+
minify: isProduction,
|
130
|
+
sourcemap: !isProduction,
|
131
|
+
define: {
|
132
|
+
'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV || 'development')
|
133
|
+
},
|
134
|
+
loader: {
|
135
|
+
'.js': 'jsx',
|
136
|
+
'.jsx': 'jsx'
|
137
|
+
}
|
138
|
+
});
|
139
|
+
|
140
|
+
// Copy index.html if it exists
|
141
|
+
const indexPath = path.join(__dirname, 'src/index.html');
|
142
|
+
if (fs.existsSync(indexPath)) {
|
143
|
+
fs.copyFileSync(indexPath, path.join(clientOutDir, 'index.html'));
|
144
|
+
}
|
145
|
+
|
146
|
+
log('Client bundle built successfully', 'success');
|
147
|
+
} catch (error) {
|
148
|
+
log(`Failed to build client bundle: ${error.message}`, 'error');
|
149
|
+
process.exit(1);
|
150
|
+
}
|
151
|
+
}
|
152
|
+
|
153
|
+
// Build server-side code
|
154
|
+
async function buildServer() {
|
155
|
+
log('Building server bundle...');
|
156
|
+
|
157
|
+
try {
|
158
|
+
const serverOutDir = path.join(__dirname, config.outDir.server);
|
159
|
+
|
160
|
+
// Ensure output directory exists
|
161
|
+
if (!fs.existsSync(serverOutDir)) {
|
162
|
+
fs.mkdirSync(serverOutDir, { recursive: true });
|
163
|
+
}
|
164
|
+
|
165
|
+
// Bundle server code
|
166
|
+
await esbuild.build({
|
167
|
+
entryPoints: [path.join(__dirname, config.entryPoints.server)],
|
168
|
+
bundle: true,
|
169
|
+
outfile: path.join(serverOutDir, 'server.js'),
|
170
|
+
format: 'esm',
|
171
|
+
platform: 'node',
|
172
|
+
target: ['node16'],
|
173
|
+
minify: isProduction,
|
174
|
+
sourcemap: !isProduction,
|
175
|
+
define: {
|
176
|
+
'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV || 'development')
|
177
|
+
},
|
178
|
+
loader: {
|
179
|
+
'.js': 'jsx',
|
180
|
+
'.jsx': 'jsx'
|
181
|
+
},
|
182
|
+
external: ['express', 'frontend-hamroun', 'compression', 'cors', 'path', 'fs', 'http', 'socket.io']
|
183
|
+
});
|
184
|
+
|
185
|
+
log('Server bundle built successfully', 'success');
|
186
|
+
} catch (error) {
|
187
|
+
log(`Failed to build server bundle: ${error.message}`, 'error');
|
188
|
+
process.exit(1);
|
189
|
+
}
|
190
|
+
}
|
191
|
+
|
192
|
+
// Copy static assets like CSS, images, etc.
|
193
|
+
function copyStaticAssets() {
|
194
|
+
log('Copying static assets...');
|
195
|
+
|
196
|
+
const publicDir = path.join(__dirname, 'public');
|
197
|
+
const outputDir = path.join(__dirname, config.outDir.client);
|
198
|
+
|
199
|
+
if (fs.existsSync(publicDir)) {
|
200
|
+
// Recursive function to copy directory contents
|
201
|
+
function copyDir(src, dest) {
|
202
|
+
// Create destination directory if it doesn't exist
|
203
|
+
if (!fs.existsSync(dest)) {
|
204
|
+
fs.mkdirSync(dest, { recursive: true });
|
205
|
+
}
|
206
|
+
|
207
|
+
// Read all files in source directory
|
208
|
+
const entries = fs.readdirSync(src, { withFileTypes: true });
|
209
|
+
|
210
|
+
for (const entry of entries) {
|
211
|
+
const srcPath = path.join(src, entry.name);
|
212
|
+
const destPath = path.join(dest, entry.name);
|
213
|
+
|
214
|
+
if (entry.isDirectory()) {
|
215
|
+
// Recursively copy subdirectories
|
216
|
+
copyDir(srcPath, destPath);
|
217
|
+
} else {
|
218
|
+
// Copy files
|
219
|
+
fs.copyFileSync(srcPath, destPath);
|
220
|
+
}
|
221
|
+
}
|
222
|
+
}
|
223
|
+
|
224
|
+
copyDir(publicDir, outputDir);
|
225
|
+
log('Static assets copied successfully', 'success');
|
226
|
+
} else {
|
227
|
+
log('No static assets to copy (public directory not found)', 'warning');
|
228
|
+
}
|
229
|
+
}
|
230
|
+
|
231
|
+
// Start a development server
|
232
|
+
async function startDevServer() {
|
233
|
+
log('Starting development server...');
|
234
|
+
|
235
|
+
// Import server module
|
236
|
+
try {
|
237
|
+
// Use dynamic import because this is ESM
|
238
|
+
const serverModule = await import('./dist/server.js');
|
239
|
+
log('Server started. Press Ctrl+C to stop.', 'success');
|
240
|
+
} catch (error) {
|
241
|
+
log(`Failed to start development server: ${error.message}`, 'error');
|
242
|
+
process.exit(1);
|
243
|
+
}
|
244
|
+
}
|
245
|
+
|
246
|
+
// Main build function
|
247
|
+
async function build() {
|
248
|
+
console.log('\n' + '='.repeat(60));
|
249
|
+
log(`Building ${isProduction ? 'production' : 'development'} bundle...`);
|
250
|
+
console.log('='.repeat(60) + '\n');
|
251
|
+
|
252
|
+
try {
|
253
|
+
// Build WASM first
|
254
|
+
await buildWasmModules();
|
255
|
+
|
256
|
+
// If wasm-only flag is provided, exit after building WASM
|
257
|
+
if (wasmOnly) {
|
258
|
+
log('WASM-only build completed', 'success');
|
259
|
+
return;
|
260
|
+
}
|
261
|
+
|
262
|
+
// Build client and server code
|
263
|
+
await Promise.all([
|
264
|
+
buildClient(),
|
265
|
+
buildServer()
|
266
|
+
]);
|
267
|
+
|
268
|
+
// Copy static assets
|
269
|
+
copyStaticAssets();
|
270
|
+
|
271
|
+
log('Build completed successfully', 'success');
|
272
|
+
|
273
|
+
// Start development server if requested
|
274
|
+
if (serve) {
|
275
|
+
await startDevServer();
|
276
|
+
}
|
277
|
+
} catch (error) {
|
278
|
+
log(`Build failed: ${error.message}`, 'error');
|
279
|
+
process.exit(1);
|
280
|
+
}
|
281
|
+
}
|
282
|
+
|
283
|
+
// Run the build
|
284
|
+
build();
|
@@ -0,0 +1,40 @@
|
|
1
|
+
{
|
2
|
+
"name": "complete-app",
|
3
|
+
"version": "1.0.0",
|
4
|
+
"description": "Complete Frontend Hamroun App with all features: SSR, WASM, API routes, and more",
|
5
|
+
"type": "module",
|
6
|
+
"scripts": {
|
7
|
+
"dev": "cross-env NODE_ENV=development node build.js --serve",
|
8
|
+
"build": "cross-env NODE_ENV=production node build.js",
|
9
|
+
"build:wasm": "node build.js --wasm-only",
|
10
|
+
"start": "cross-env NODE_ENV=production node dist/server.js",
|
11
|
+
"test": "vitest run",
|
12
|
+
"wasm:build": "cd src/wasm && ./build.sh"
|
13
|
+
},
|
14
|
+
"dependencies": {
|
15
|
+
"compression": "^1.7.4",
|
16
|
+
"cors": "^2.8.5",
|
17
|
+
"dotenv": "^16.3.1",
|
18
|
+
"express": "^4.18.2",
|
19
|
+
"frontend-hamroun": "latest",
|
20
|
+
"jsonwebtoken": "^9.0.2",
|
21
|
+
"socket.io": "^4.7.2"
|
22
|
+
},
|
23
|
+
"devDependencies": {
|
24
|
+
"@types/compression": "^1.7.3",
|
25
|
+
"@types/cors": "^2.8.14",
|
26
|
+
"@types/express": "^4.17.18",
|
27
|
+
"@types/jsonwebtoken": "^9.0.3",
|
28
|
+
"@types/node": "^20.8.2",
|
29
|
+
"autoprefixer": "^10.4.14",
|
30
|
+
"chokidar": "^3.5.3",
|
31
|
+
"cross-env": "^7.0.3",
|
32
|
+
"esbuild": "^0.19.5",
|
33
|
+
"postcss": "^8.4.27",
|
34
|
+
"tailwindcss": "^3.3.3",
|
35
|
+
"vitest": "^0.34.6"
|
36
|
+
},
|
37
|
+
"engines": {
|
38
|
+
"node": ">=16.0.0"
|
39
|
+
}
|
40
|
+
}
|