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
@@ -0,0 +1,345 @@
|
|
1
|
+
/* Base styles */
|
2
|
+
:root {
|
3
|
+
--primary-color: #4a89dc;
|
4
|
+
--secondary-color: #5d9cec;
|
5
|
+
--accent-color: #967adc;
|
6
|
+
--success-color: #8cc152;
|
7
|
+
--error-color: #da4453;
|
8
|
+
--background-color: #f5f7fa;
|
9
|
+
--text-color: #434a54;
|
10
|
+
--border-color: #e6e9ed;
|
11
|
+
}
|
12
|
+
|
13
|
+
* {
|
14
|
+
box-sizing: border-box;
|
15
|
+
margin: 0;
|
16
|
+
padding: 0;
|
17
|
+
}
|
18
|
+
|
19
|
+
body {
|
20
|
+
font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
|
21
|
+
line-height: 1.5;
|
22
|
+
color: var(--text-color);
|
23
|
+
background-color: var(--background-color);
|
24
|
+
}
|
25
|
+
|
26
|
+
a {
|
27
|
+
color: var(--primary-color);
|
28
|
+
text-decoration: none;
|
29
|
+
}
|
30
|
+
|
31
|
+
a:hover {
|
32
|
+
text-decoration: underline;
|
33
|
+
}
|
34
|
+
|
35
|
+
button {
|
36
|
+
cursor: pointer;
|
37
|
+
background-color: var(--primary-color);
|
38
|
+
color: white;
|
39
|
+
border: none;
|
40
|
+
padding: 0.5rem 1rem;
|
41
|
+
border-radius: 4px;
|
42
|
+
font-size: 1rem;
|
43
|
+
transition: background-color 0.2s;
|
44
|
+
}
|
45
|
+
|
46
|
+
button:hover {
|
47
|
+
background-color: var(--secondary-color);
|
48
|
+
}
|
49
|
+
|
50
|
+
input, textarea {
|
51
|
+
padding: 0.5rem;
|
52
|
+
border: 1px solid var(--border-color);
|
53
|
+
border-radius: 4px;
|
54
|
+
font-size: 1rem;
|
55
|
+
width: 100%;
|
56
|
+
}
|
57
|
+
|
58
|
+
/* Layout */
|
59
|
+
.app {
|
60
|
+
display: flex;
|
61
|
+
flex-direction: column;
|
62
|
+
min-height: 100vh;
|
63
|
+
}
|
64
|
+
|
65
|
+
.content {
|
66
|
+
flex: 1;
|
67
|
+
padding: 2rem;
|
68
|
+
max-width: 1200px;
|
69
|
+
margin: 0 auto;
|
70
|
+
width: 100%;
|
71
|
+
}
|
72
|
+
|
73
|
+
/* Header */
|
74
|
+
.app-header {
|
75
|
+
background-color: white;
|
76
|
+
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
|
77
|
+
padding: 1rem 2rem;
|
78
|
+
display: flex;
|
79
|
+
justify-content: space-between;
|
80
|
+
align-items: center;
|
81
|
+
}
|
82
|
+
|
83
|
+
.logo h1 {
|
84
|
+
font-size: 1.5rem;
|
85
|
+
color: var(--primary-color);
|
86
|
+
}
|
87
|
+
|
88
|
+
.main-nav ul {
|
89
|
+
display: flex;
|
90
|
+
list-style: none;
|
91
|
+
gap: 2rem;
|
92
|
+
}
|
93
|
+
|
94
|
+
.main-nav a {
|
95
|
+
color: var(--text-color);
|
96
|
+
font-weight: 500;
|
97
|
+
}
|
98
|
+
|
99
|
+
.main-nav a:hover {
|
100
|
+
color: var(--primary-color);
|
101
|
+
}
|
102
|
+
|
103
|
+
/* Footer */
|
104
|
+
.app-footer {
|
105
|
+
background-color: white;
|
106
|
+
box-shadow: 0 -2px 4px rgba(0, 0, 0, 0.05);
|
107
|
+
padding: 1.5rem 2rem;
|
108
|
+
margin-top: 2rem;
|
109
|
+
}
|
110
|
+
|
111
|
+
.footer-content {
|
112
|
+
display: flex;
|
113
|
+
justify-content: space-between;
|
114
|
+
align-items: center;
|
115
|
+
max-width: 1200px;
|
116
|
+
margin: 0 auto;
|
117
|
+
}
|
118
|
+
|
119
|
+
.footer-links {
|
120
|
+
display: flex;
|
121
|
+
gap: 1rem;
|
122
|
+
}
|
123
|
+
|
124
|
+
/* Home page */
|
125
|
+
.hero {
|
126
|
+
text-align: center;
|
127
|
+
margin-bottom: 3rem;
|
128
|
+
}
|
129
|
+
|
130
|
+
.hero h1 {
|
131
|
+
font-size: 2.5rem;
|
132
|
+
margin-bottom: 0.5rem;
|
133
|
+
color: var(--primary-color);
|
134
|
+
}
|
135
|
+
|
136
|
+
.subtitle {
|
137
|
+
font-size: 1.2rem;
|
138
|
+
color: #666;
|
139
|
+
margin-bottom: 2rem;
|
140
|
+
}
|
141
|
+
|
142
|
+
.features {
|
143
|
+
display: grid;
|
144
|
+
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
|
145
|
+
gap: 2rem;
|
146
|
+
margin-top: 3rem;
|
147
|
+
}
|
148
|
+
|
149
|
+
.feature {
|
150
|
+
background-color: white;
|
151
|
+
border-radius: 8px;
|
152
|
+
padding: 1.5rem;
|
153
|
+
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);
|
154
|
+
transition: transform 0.2s, box-shadow 0.2s;
|
155
|
+
}
|
156
|
+
|
157
|
+
.feature:hover {
|
158
|
+
transform: translateY(-5px);
|
159
|
+
box-shadow: 0 5px 15px rgba(0, 0, 0, 0.1);
|
160
|
+
}
|
161
|
+
|
162
|
+
.feature h3 {
|
163
|
+
margin-bottom: 1rem;
|
164
|
+
color: var(--primary-color);
|
165
|
+
}
|
166
|
+
|
167
|
+
.counter {
|
168
|
+
display: flex;
|
169
|
+
align-items: center;
|
170
|
+
justify-content: center;
|
171
|
+
gap: 1rem;
|
172
|
+
margin-top: 1rem;
|
173
|
+
}
|
174
|
+
|
175
|
+
.counter button {
|
176
|
+
width: 40px;
|
177
|
+
height: 40px;
|
178
|
+
font-size: 1.2rem;
|
179
|
+
display: flex;
|
180
|
+
align-items: center;
|
181
|
+
justify-content: center;
|
182
|
+
padding: 0;
|
183
|
+
}
|
184
|
+
|
185
|
+
.counter span {
|
186
|
+
font-size: 1.5rem;
|
187
|
+
min-width: 40px;
|
188
|
+
text-align: center;
|
189
|
+
}
|
190
|
+
|
191
|
+
.api-button {
|
192
|
+
margin-top: 1rem;
|
193
|
+
width: 100%;
|
194
|
+
}
|
195
|
+
|
196
|
+
/* About page */
|
197
|
+
.about-page {
|
198
|
+
max-width: 800px;
|
199
|
+
margin: 0 auto;
|
200
|
+
}
|
201
|
+
|
202
|
+
.about-page h1 {
|
203
|
+
margin-bottom: 2rem;
|
204
|
+
color: var(--primary-color);
|
205
|
+
}
|
206
|
+
|
207
|
+
.about-section {
|
208
|
+
margin-bottom: 2rem;
|
209
|
+
}
|
210
|
+
|
211
|
+
.about-section h2 {
|
212
|
+
margin-bottom: 1rem;
|
213
|
+
color: var(--secondary-color);
|
214
|
+
font-size: 1.5rem;
|
215
|
+
}
|
216
|
+
|
217
|
+
.about-section ul {
|
218
|
+
margin-left: 1.5rem;
|
219
|
+
margin-top: 0.5rem;
|
220
|
+
}
|
221
|
+
|
222
|
+
.about-section li {
|
223
|
+
margin-bottom: 0.5rem;
|
224
|
+
}
|
225
|
+
|
226
|
+
/* WASM Demo page */
|
227
|
+
.wasm-demo-page {
|
228
|
+
max-width: 800px;
|
229
|
+
margin: 0 auto;
|
230
|
+
}
|
231
|
+
|
232
|
+
.wasm-demo-page h1 {
|
233
|
+
margin-bottom: 2rem;
|
234
|
+
color: var(--primary-color);
|
235
|
+
}
|
236
|
+
|
237
|
+
.wasm-status {
|
238
|
+
padding: 1rem;
|
239
|
+
border-radius: 4px;
|
240
|
+
margin-bottom: 2rem;
|
241
|
+
}
|
242
|
+
|
243
|
+
.wasm-status.error {
|
244
|
+
background-color: #ffeeee;
|
245
|
+
border: 1px solid var(--error-color);
|
246
|
+
}
|
247
|
+
|
248
|
+
.wasm-status.success {
|
249
|
+
background-color: #eeffee;
|
250
|
+
border: 1px solid var(--success-color);
|
251
|
+
}
|
252
|
+
|
253
|
+
.demo-section {
|
254
|
+
background-color: white;
|
255
|
+
border-radius: 8px;
|
256
|
+
padding: 2rem;
|
257
|
+
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
|
258
|
+
}
|
259
|
+
|
260
|
+
.demo-section h2 {
|
261
|
+
margin-bottom: 1rem;
|
262
|
+
color: var(--secondary-color);
|
263
|
+
font-size: 1.5rem;
|
264
|
+
}
|
265
|
+
|
266
|
+
.calculator {
|
267
|
+
display: flex;
|
268
|
+
gap: 1rem;
|
269
|
+
align-items: center;
|
270
|
+
margin-bottom: 2rem;
|
271
|
+
flex-wrap: wrap;
|
272
|
+
}
|
273
|
+
|
274
|
+
.calculator input {
|
275
|
+
width: 80px;
|
276
|
+
}
|
277
|
+
|
278
|
+
.result {
|
279
|
+
background-color: #f7f7f7;
|
280
|
+
padding: 0.5rem 1rem;
|
281
|
+
border-radius: 4px;
|
282
|
+
margin-top: 1rem;
|
283
|
+
}
|
284
|
+
|
285
|
+
.json-parser {
|
286
|
+
margin-bottom: 2rem;
|
287
|
+
}
|
288
|
+
|
289
|
+
.json-parser textarea {
|
290
|
+
width: 100%;
|
291
|
+
margin-bottom: 1rem;
|
292
|
+
font-family: monospace;
|
293
|
+
}
|
294
|
+
|
295
|
+
.json-result {
|
296
|
+
background-color: #f7f7f7;
|
297
|
+
padding: 1rem;
|
298
|
+
border-radius: 4px;
|
299
|
+
margin-top: 1rem;
|
300
|
+
font-family: monospace;
|
301
|
+
overflow-x: auto;
|
302
|
+
}
|
303
|
+
|
304
|
+
.function-list {
|
305
|
+
list-style: none;
|
306
|
+
display: grid;
|
307
|
+
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
|
308
|
+
gap: 0.5rem;
|
309
|
+
}
|
310
|
+
|
311
|
+
.function-list li {
|
312
|
+
background-color: #f7f7f7;
|
313
|
+
padding: 0.5rem;
|
314
|
+
border-radius: 4px;
|
315
|
+
font-family: monospace;
|
316
|
+
}
|
317
|
+
|
318
|
+
/* Responsive adjustments */
|
319
|
+
@media (max-width: 768px) {
|
320
|
+
.app-header {
|
321
|
+
flex-direction: column;
|
322
|
+
gap: 1rem;
|
323
|
+
text-align: center;
|
324
|
+
}
|
325
|
+
|
326
|
+
.main-nav ul {
|
327
|
+
justify-content: center;
|
328
|
+
flex-wrap: wrap;
|
329
|
+
gap: 1rem;
|
330
|
+
}
|
331
|
+
|
332
|
+
.footer-content {
|
333
|
+
flex-direction: column;
|
334
|
+
gap: 1rem;
|
335
|
+
text-align: center;
|
336
|
+
}
|
337
|
+
|
338
|
+
.footer-links {
|
339
|
+
justify-content: center;
|
340
|
+
}
|
341
|
+
|
342
|
+
.content {
|
343
|
+
padding: 1rem;
|
344
|
+
}
|
345
|
+
}
|
@@ -0,0 +1,31 @@
|
|
1
|
+
import express from 'express';
|
2
|
+
|
3
|
+
// Create API router
|
4
|
+
const ApiRouter = express.Router();
|
5
|
+
|
6
|
+
// Random data endpoint
|
7
|
+
ApiRouter.get('/random', (req, res) => {
|
8
|
+
const value = Math.floor(Math.random() * 1000);
|
9
|
+
res.json({ value });
|
10
|
+
});
|
11
|
+
|
12
|
+
// Echo endpoint
|
13
|
+
ApiRouter.post('/echo', (req, res) => {
|
14
|
+
res.json({
|
15
|
+
method: 'POST',
|
16
|
+
body: req.body,
|
17
|
+
timestamp: new Date().toISOString()
|
18
|
+
});
|
19
|
+
});
|
20
|
+
|
21
|
+
// Status endpoint
|
22
|
+
ApiRouter.get('/status', (req, res) => {
|
23
|
+
res.json({
|
24
|
+
status: 'ok',
|
25
|
+
timestamp: new Date().toISOString(),
|
26
|
+
environment: process.env.NODE_ENV || 'development',
|
27
|
+
uptime: process.uptime()
|
28
|
+
});
|
29
|
+
});
|
30
|
+
|
31
|
+
export { ApiRouter };
|
@@ -0,0 +1,93 @@
|
|
1
|
+
// Support both ESM and CommonJS importing styles
|
2
|
+
const frontendHamroun =
|
3
|
+
typeof require !== 'undefined'
|
4
|
+
? require('frontend-hamroun')
|
5
|
+
: await import('frontend-hamroun');
|
6
|
+
|
7
|
+
// Destructure the imports from either ESM or CJS modules
|
8
|
+
const {
|
9
|
+
hydrate,
|
10
|
+
render,
|
11
|
+
jsx,
|
12
|
+
useState,
|
13
|
+
useEffect,
|
14
|
+
loadGoWasm,
|
15
|
+
createContext,
|
16
|
+
useContext
|
17
|
+
} = frontendHamroun;
|
18
|
+
|
19
|
+
// Import components
|
20
|
+
import App from './components/App.js';
|
21
|
+
|
22
|
+
// Initialize the app
|
23
|
+
async function initApp() {
|
24
|
+
console.log('Initializing client-side app...');
|
25
|
+
|
26
|
+
// Check if we need to hydrate (SSR) or do a fresh render
|
27
|
+
const rootElement = document.getElementById('app');
|
28
|
+
const shouldHydrate = rootElement.hasAttribute('data-ssr');
|
29
|
+
|
30
|
+
try {
|
31
|
+
// Pre-load any WASM modules if needed
|
32
|
+
let wasmModule = null;
|
33
|
+
try {
|
34
|
+
wasmModule = await loadGoWasm('/wasm/example.wasm', {
|
35
|
+
debug: false,
|
36
|
+
goWasmPath: '/wasm/wasm_exec.js'
|
37
|
+
});
|
38
|
+
console.log('WASM module loaded successfully');
|
39
|
+
} catch (error) {
|
40
|
+
console.warn('WASM module loading skipped:', error.message);
|
41
|
+
}
|
42
|
+
|
43
|
+
// Create initial state from SSR data if available
|
44
|
+
const initialDataElement = document.getElementById('__INITIAL_DATA__');
|
45
|
+
const initialData = initialDataElement
|
46
|
+
? JSON.parse(initialDataElement.textContent || '{}')
|
47
|
+
: {};
|
48
|
+
|
49
|
+
// Setup global context values
|
50
|
+
const appContext = {
|
51
|
+
wasm: wasmModule,
|
52
|
+
initialData,
|
53
|
+
// Add any other global values
|
54
|
+
};
|
55
|
+
|
56
|
+
// Render or hydrate the app
|
57
|
+
if (shouldHydrate) {
|
58
|
+
console.log('Hydrating app from server-rendered HTML');
|
59
|
+
await hydrate(<App context={appContext} />, rootElement);
|
60
|
+
} else {
|
61
|
+
console.log('Rendering app from scratch (client-only)');
|
62
|
+
await render(<App context={appContext} />, rootElement);
|
63
|
+
}
|
64
|
+
|
65
|
+
console.log('App initialization complete');
|
66
|
+
} catch (error) {
|
67
|
+
console.error('Failed to initialize app:', error);
|
68
|
+
|
69
|
+
// Fallback to basic error display
|
70
|
+
rootElement.innerHTML = `
|
71
|
+
<div style="color: red; padding: 20px; border: 1px solid red; margin: 20px;">
|
72
|
+
<h2>Error Initializing App</h2>
|
73
|
+
<pre>${error.message}\n${error.stack}</pre>
|
74
|
+
</div>
|
75
|
+
`;
|
76
|
+
}
|
77
|
+
}
|
78
|
+
|
79
|
+
// Start the app when the DOM is ready
|
80
|
+
if (document.readyState === 'loading') {
|
81
|
+
document.addEventListener('DOMContentLoaded', initApp);
|
82
|
+
} else {
|
83
|
+
initApp();
|
84
|
+
}
|
85
|
+
|
86
|
+
// Export key utilities for components
|
87
|
+
export {
|
88
|
+
jsx,
|
89
|
+
useState,
|
90
|
+
useEffect,
|
91
|
+
createContext,
|
92
|
+
useContext
|
93
|
+
};
|
@@ -0,0 +1,66 @@
|
|
1
|
+
import { jsx, useState, useEffect, createContext, useContext } from '../client.js';
|
2
|
+
import Header from './Header.js';
|
3
|
+
import Footer from './Footer.js';
|
4
|
+
import Home from '../pages/Home.js';
|
5
|
+
import About from '../pages/About.js';
|
6
|
+
import WasmDemo from '../pages/WasmDemo.js';
|
7
|
+
|
8
|
+
// Create context for global state
|
9
|
+
export const AppContext = createContext({});
|
10
|
+
|
11
|
+
// Simple router implementation
|
12
|
+
function useRouter() {
|
13
|
+
const { initialData } = useContext(AppContext);
|
14
|
+
const [path, setPath] = useState(initialData?.path || '/');
|
15
|
+
|
16
|
+
useEffect(() => {
|
17
|
+
// Update path when URL changes
|
18
|
+
const handlePopState = () => {
|
19
|
+
setPath(window.location.pathname);
|
20
|
+
};
|
21
|
+
|
22
|
+
// Listen for navigation events
|
23
|
+
window.addEventListener('popstate', handlePopState);
|
24
|
+
|
25
|
+
// Cleanup
|
26
|
+
return () => {
|
27
|
+
window.removeEventListener('popstate', handlePopState);
|
28
|
+
};
|
29
|
+
}, []);
|
30
|
+
|
31
|
+
// Navigation function
|
32
|
+
const navigate = (to) => {
|
33
|
+
window.history.pushState(null, '', to);
|
34
|
+
setPath(to);
|
35
|
+
};
|
36
|
+
|
37
|
+
return { path, navigate };
|
38
|
+
}
|
39
|
+
|
40
|
+
// Define available routes
|
41
|
+
const routes = {
|
42
|
+
'/': Home,
|
43
|
+
'/about': About,
|
44
|
+
'/wasm': WasmDemo
|
45
|
+
};
|
46
|
+
|
47
|
+
// Main App component
|
48
|
+
export default function App({ context }) {
|
49
|
+
// Get current path from router
|
50
|
+
const { path, navigate } = useRouter();
|
51
|
+
|
52
|
+
// Find the component for the current route
|
53
|
+
const PageComponent = routes[path] || routes['/'];
|
54
|
+
|
55
|
+
return (
|
56
|
+
<AppContext.Provider value={{ ...context, navigate }}>
|
57
|
+
<div className="app">
|
58
|
+
<Header />
|
59
|
+
<main className="content">
|
60
|
+
<PageComponent />
|
61
|
+
</main>
|
62
|
+
<Footer />
|
63
|
+
</div>
|
64
|
+
</AppContext.Provider>
|
65
|
+
);
|
66
|
+
}
|
@@ -0,0 +1,19 @@
|
|
1
|
+
import { jsx } from '../client.js';
|
2
|
+
|
3
|
+
export default function Footer() {
|
4
|
+
return (
|
5
|
+
<footer className="app-footer">
|
6
|
+
<div className="footer-content">
|
7
|
+
<p>© {new Date().getFullYear()} Baraqex Framework</p>
|
8
|
+
<div className="footer-links">
|
9
|
+
<a href="https://github.com/hamroun/frontend-hamroun" target="_blank" rel="noopener">
|
10
|
+
GitHub
|
11
|
+
</a>
|
12
|
+
<a href="https://pfe-documantation-mohamedx2s-projects.vercel.app/" target="_blank" rel="noopener">
|
13
|
+
Documentation
|
14
|
+
</a>
|
15
|
+
</div>
|
16
|
+
</div>
|
17
|
+
</footer>
|
18
|
+
);
|
19
|
+
}
|
@@ -0,0 +1,38 @@
|
|
1
|
+
import { jsx } from '../client.js';
|
2
|
+
import { AppContext } from './App.js';
|
3
|
+
|
4
|
+
export default function Header() {
|
5
|
+
const { navigate } = AppContext;
|
6
|
+
|
7
|
+
const handleNavClick = (e, path) => {
|
8
|
+
e.preventDefault();
|
9
|
+
navigate(path);
|
10
|
+
};
|
11
|
+
|
12
|
+
return (
|
13
|
+
<header className="app-header">
|
14
|
+
<div className="logo">
|
15
|
+
<h1>Baraqex Complete App</h1>
|
16
|
+
</div>
|
17
|
+
<nav className="main-nav">
|
18
|
+
<ul>
|
19
|
+
<li>
|
20
|
+
<a href="/" onClick={(e) => handleNavClick(e, '/')}>
|
21
|
+
Home
|
22
|
+
</a>
|
23
|
+
</li>
|
24
|
+
<li>
|
25
|
+
<a href="/about" onClick={(e) => handleNavClick(e, '/about')}>
|
26
|
+
About
|
27
|
+
</a>
|
28
|
+
</li>
|
29
|
+
<li>
|
30
|
+
<a href="/wasm" onClick={(e) => handleNavClick(e, '/wasm')}>
|
31
|
+
WASM Demo
|
32
|
+
</a>
|
33
|
+
</li>
|
34
|
+
</ul>
|
35
|
+
</nav>
|
36
|
+
</header>
|
37
|
+
);
|
38
|
+
}
|
@@ -0,0 +1,59 @@
|
|
1
|
+
import { jsx, useEffect } from '../client.js';
|
2
|
+
|
3
|
+
export default function About() {
|
4
|
+
useEffect(() => {
|
5
|
+
document.title = 'About - Baraqex Complete App';
|
6
|
+
}, []);
|
7
|
+
|
8
|
+
return (
|
9
|
+
<div className="about-page">
|
10
|
+
<h1>About Baraqex Framework</h1>
|
11
|
+
|
12
|
+
<section className="about-section">
|
13
|
+
<h2>Framework Architecture</h2>
|
14
|
+
<p>
|
15
|
+
Baraqex is a lightweight full-stack JavaScript framework designed for modern web applications.
|
16
|
+
It features a virtual DOM implementation, hooks-based state management, server-side rendering,
|
17
|
+
and WebAssembly integration.
|
18
|
+
</p>
|
19
|
+
</section>
|
20
|
+
|
21
|
+
<section className="about-section">
|
22
|
+
<h2>Key Features</h2>
|
23
|
+
<ul>
|
24
|
+
<li>
|
25
|
+
<strong>Virtual DOM:</strong> Efficient DOM updates through a lightweight virtual DOM implementation.
|
26
|
+
</li>
|
27
|
+
<li>
|
28
|
+
<strong>Hooks:</strong> React-like hooks including useState, useEffect, useContext, and more.
|
29
|
+
</li>
|
30
|
+
<li>
|
31
|
+
<strong>Server-Side Rendering:</strong> Improve SEO and initial load performance with SSR.
|
32
|
+
</li>
|
33
|
+
<li>
|
34
|
+
<strong>WebAssembly Integration:</strong> Run high-performance Go code in the browser.
|
35
|
+
</li>
|
36
|
+
<li>
|
37
|
+
<strong>API Routing:</strong> Express-based API with file-based routing.
|
38
|
+
</li>
|
39
|
+
<li>
|
40
|
+
<strong>Development Tools:</strong> CLI tools for project scaffolding and component generation.
|
41
|
+
</li>
|
42
|
+
</ul>
|
43
|
+
</section>
|
44
|
+
|
45
|
+
<section className="about-section">
|
46
|
+
<h2>Use Cases</h2>
|
47
|
+
<p>
|
48
|
+
Baraqex is ideal for:
|
49
|
+
</p>
|
50
|
+
<ul>
|
51
|
+
<li>Web applications requiring high performance</li>
|
52
|
+
<li>Projects that need SEO optimization</li>
|
53
|
+
<li>Applications with computation-heavy features</li>
|
54
|
+
<li>Full-stack JavaScript applications</li>
|
55
|
+
</ul>
|
56
|
+
</section>
|
57
|
+
</div>
|
58
|
+
);
|
59
|
+
}
|
@@ -0,0 +1,54 @@
|
|
1
|
+
import { jsx, useState, useEffect, useContext } from '../client.js';
|
2
|
+
import { AppContext } from '../components/App.js';
|
3
|
+
|
4
|
+
export default function Home() {
|
5
|
+
const { initialData } = useContext(AppContext);
|
6
|
+
const [count, setCount] = useState(0);
|
7
|
+
|
8
|
+
useEffect(() => {
|
9
|
+
document.title = 'Home - Baraqex Complete App';
|
10
|
+
}, []);
|
11
|
+
|
12
|
+
return (
|
13
|
+
<div className="home-page">
|
14
|
+
<section className="hero">
|
15
|
+
<h1>Welcome to Baraqex Framework</h1>
|
16
|
+
<p className="subtitle">A complete JavaScript framework for modern web applications</p>
|
17
|
+
|
18
|
+
<div className="features">
|
19
|
+
<div className="feature">
|
20
|
+
<h3>Server-Side Rendering</h3>
|
21
|
+
<p>Initial page was rendered on the server at: {initialData?.timestamp}</p>
|
22
|
+
</div>
|
23
|
+
|
24
|
+
<div className="feature">
|
25
|
+
<h3>State Management</h3>
|
26
|
+
<div className="counter">
|
27
|
+
<button onClick={() => setCount(c => c - 1)}>-</button>
|
28
|
+
<span>{count}</span>
|
29
|
+
<button onClick={() => setCount(c => c + 1)}>+</button>
|
30
|
+
</div>
|
31
|
+
</div>
|
32
|
+
|
33
|
+
<div className="feature">
|
34
|
+
<h3>API Integration</h3>
|
35
|
+
<button className="api-button" onClick={fetchRandomData}>
|
36
|
+
Fetch Random Data
|
37
|
+
</button>
|
38
|
+
</div>
|
39
|
+
</div>
|
40
|
+
</section>
|
41
|
+
</div>
|
42
|
+
);
|
43
|
+
|
44
|
+
async function fetchRandomData() {
|
45
|
+
try {
|
46
|
+
const response = await fetch('/api/random');
|
47
|
+
const data = await response.json();
|
48
|
+
alert(`Random value: ${data.value}`);
|
49
|
+
} catch (error) {
|
50
|
+
console.error('Error fetching data:', error);
|
51
|
+
alert('Failed to fetch data. See console for details.');
|
52
|
+
}
|
53
|
+
}
|
54
|
+
}
|