frontend-hamroun 1.2.79 → 1.2.82

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 (259) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +129 -1513
  3. package/bin/cli.js +506 -145
  4. package/dist/index.cjs +2 -0
  5. package/dist/index.cjs.map +1 -0
  6. package/dist/index.client.cjs +2 -0
  7. package/dist/index.client.cjs.map +1 -0
  8. package/dist/index.client.js +26 -0
  9. package/dist/index.client.js.map +1 -0
  10. package/dist/index.js +299 -1
  11. package/dist/index.js.map +1 -0
  12. package/dist/jsx-runtime.cjs +2 -0
  13. package/dist/jsx-runtime.cjs.map +1 -0
  14. package/dist/jsx-runtime.js +93 -1
  15. package/dist/jsx-runtime.js.map +1 -0
  16. package/dist/renderer-Bo9zkUZ_.js +52 -0
  17. package/dist/renderer-Bo9zkUZ_.js.map +1 -0
  18. package/dist/renderer-Din1y3YM.cjs +2 -0
  19. package/dist/renderer-Din1y3YM.cjs.map +1 -0
  20. package/dist/server-renderer-CqIpQ-od.cjs +2 -0
  21. package/dist/server-renderer-CqIpQ-od.cjs.map +1 -0
  22. package/dist/server-renderer-QHt45Ip2.js +255 -0
  23. package/dist/server-renderer-QHt45Ip2.js.map +1 -0
  24. package/dist/server-renderer.cjs +2 -0
  25. package/dist/server-renderer.cjs.map +1 -0
  26. package/dist/server-renderer.js +5 -1
  27. package/dist/server-renderer.js.map +1 -0
  28. package/package.json +77 -120
  29. package/templates/basic-app/build.js +22 -0
  30. package/templates/basic-app/dev.js +27 -0
  31. package/templates/basic-app/esbuild.config.js +28 -0
  32. package/templates/basic-app/index.html +1 -1
  33. package/templates/basic-app/package.json +29 -28
  34. package/templates/basic-app/server.js +24 -0
  35. package/templates/basic-app/src/App.jsx +16 -0
  36. package/templates/basic-app/src/App.tsx +26 -0
  37. package/templates/basic-app/src/client.jsx +5 -0
  38. package/templates/basic-app/src/client.tsx +11 -0
  39. package/templates/basic-app/src/components/Counter.jsx +13 -0
  40. package/templates/basic-app/src/components/Counter.tsx +18 -0
  41. package/templates/basic-app/src/jsx-shim.js +3 -0
  42. package/templates/basic-app/src/jsx-shim.ts +11 -0
  43. package/templates/basic-app/src/main.jsx +98 -0
  44. package/templates/basic-app/src/main.tsx +0 -1
  45. package/templates/basic-app/src/server.js +47 -0
  46. package/templates/basic-app/src/server.ts +52 -0
  47. package/templates/basic-app/tsconfig.server.json +11 -0
  48. package/templates/complete-app/lib/frontend-hamroun.js +182 -0
  49. package/templates/complete-app/package.json +2 -1
  50. package/templates/complete-app/pages/about.jsx +0 -0
  51. package/templates/complete-app/pages/index.jsx +0 -0
  52. package/templates/complete-app/pages/wasm-demo.jsx +0 -0
  53. package/templates/complete-app/public/client.js +58 -49
  54. package/templates/complete-app/public/index.html +88 -17
  55. package/templates/complete-app/public/styles.css +30 -533
  56. package/templates/complete-app/server.js +31 -222
  57. package/templates/complete-app/wasm/build.bat +0 -0
  58. package/templates/complete-app/wasm/build.sh +0 -0
  59. package/templates/complete-app/wasm/example.go +0 -0
  60. package/templates/fullstack-app/build/main.js +130 -101
  61. package/templates/fullstack-app/build/main.js.map +4 -4
  62. package/templates/fullstack-app/package-lock.json +1773 -566
  63. package/templates/ssr-template/esbuild.config.js +33 -0
  64. package/templates/ssr-template/jsx-shim.js +1 -0
  65. package/templates/ssr-template/package.json +22 -16
  66. package/templates/ssr-template/src/App.tsx +12 -52
  67. package/templates/ssr-template/src/client.tsx +3 -17
  68. package/templates/ssr-template/src/server.ts +21 -204
  69. package/templates/ssr-template/tsconfig.json +10 -13
  70. package/templates/ssr-template/tsconfig.server.json +6 -14
  71. package/templates/wasm/build-wasm.js +228 -0
  72. package/templates/wasm/esbuild.config.js +63 -0
  73. package/templates/wasm/go/main.go +256 -0
  74. package/templates/wasm/go/wasm_exec.js +0 -0
  75. package/templates/wasm/index.html +97 -0
  76. package/templates/wasm/jsx-shim.js +9 -0
  77. package/templates/{go-wasm-app → wasm}/package-lock.json +5307 -3732
  78. package/templates/wasm/package.json +42 -0
  79. package/templates/wasm/public/example.wasm +0 -0
  80. package/templates/wasm/src/App.tsx +564 -0
  81. package/templates/wasm/src/client.tsx +220 -0
  82. package/templates/wasm/src/index.tsx +21 -0
  83. package/templates/wasm/src/server.ts +145 -0
  84. package/templates/wasm/tsconfig.json +21 -0
  85. package/templates/wasm/tsconfig.node.json +13 -0
  86. package/templates/wasm/tsconfig.server.json +23 -0
  87. package/templates/wasm/vite.config.ts +56 -0
  88. package/templates/wasm/wasm-loader.js +103 -0
  89. package/dist/batch/package.json +0 -16
  90. package/dist/client-router/package.json +0 -16
  91. package/dist/component/package.json +0 -16
  92. package/dist/context/package.json +0 -16
  93. package/dist/event-bus/package.json +0 -16
  94. package/dist/forms/package.json +0 -16
  95. package/dist/hooks/package.json +0 -16
  96. package/dist/hooks-0728361a.cjs +0 -1
  97. package/dist/hooks-b58f947c.js +0 -133
  98. package/dist/hooks.js +0 -1
  99. package/dist/hooks.mjs +0 -13
  100. package/dist/index.mjs +0 -137
  101. package/dist/jsx-runtime/package.json +0 -16
  102. package/dist/jsx-runtime.mjs +0 -64
  103. package/dist/lifecycle-events/package.json +0 -16
  104. package/dist/package.json +0 -71
  105. package/dist/render-component/package.json +0 -16
  106. package/dist/renderer/package.json +0 -16
  107. package/dist/renderer.js +0 -1
  108. package/dist/renderer.mjs +0 -27
  109. package/dist/router/package.json +0 -16
  110. package/dist/server/package.json +0 -17
  111. package/dist/server/src/batch.d.ts +0 -3
  112. package/dist/server/src/batch.js +0 -23
  113. package/dist/server/src/batch.js.map +0 -1
  114. package/dist/server/src/client-router.d.ts +0 -60
  115. package/dist/server/src/client-router.js +0 -210
  116. package/dist/server/src/client-router.js.map +0 -1
  117. package/dist/server/src/component.d.ts +0 -14
  118. package/dist/server/src/component.js +0 -106
  119. package/dist/server/src/component.js.map +0 -1
  120. package/dist/server/src/context.d.ts +0 -13
  121. package/dist/server/src/context.js +0 -21
  122. package/dist/server/src/context.js.map +0 -1
  123. package/dist/server/src/event-bus.d.ts +0 -23
  124. package/dist/server/src/event-bus.js +0 -75
  125. package/dist/server/src/event-bus.js.map +0 -1
  126. package/dist/server/src/forms.d.ts +0 -40
  127. package/dist/server/src/forms.js +0 -148
  128. package/dist/server/src/forms.js.map +0 -1
  129. package/dist/server/src/hooks.d.ts +0 -12
  130. package/dist/server/src/hooks.js +0 -170
  131. package/dist/server/src/hooks.js.map +0 -1
  132. package/dist/server/src/index.client.d.ts +0 -12
  133. package/dist/server/src/index.client.js +0 -14
  134. package/dist/server/src/index.client.js.map +0 -1
  135. package/dist/server/src/index.d.ts +0 -88
  136. package/dist/server/src/index.js +0 -79
  137. package/dist/server/src/index.js.map +0 -1
  138. package/dist/server/src/jsx-runtime/jsx-dev-runtime.d.ts +0 -1
  139. package/dist/server/src/jsx-runtime/jsx-dev-runtime.js +0 -2
  140. package/dist/server/src/jsx-runtime/jsx-dev-runtime.js.map +0 -1
  141. package/dist/server/src/jsx-runtime/jsx-runtime.d.ts +0 -4
  142. package/dist/server/src/jsx-runtime/jsx-runtime.js +0 -41
  143. package/dist/server/src/jsx-runtime/jsx-runtime.js.map +0 -1
  144. package/dist/server/src/jsx-runtime.d.ts +0 -20
  145. package/dist/server/src/jsx-runtime.js +0 -105
  146. package/dist/server/src/jsx-runtime.js.map +0 -1
  147. package/dist/server/src/lifecycle-events.d.ts +0 -108
  148. package/dist/server/src/lifecycle-events.js +0 -177
  149. package/dist/server/src/lifecycle-events.js.map +0 -1
  150. package/dist/server/src/renderComponent.d.ts +0 -13
  151. package/dist/server/src/renderComponent.js +0 -30
  152. package/dist/server/src/renderComponent.js.map +0 -1
  153. package/dist/server/src/renderer.d.ts +0 -2
  154. package/dist/server/src/renderer.js +0 -31
  155. package/dist/server/src/renderer.js.map +0 -1
  156. package/dist/server/src/router.d.ts +0 -55
  157. package/dist/server/src/router.js +0 -166
  158. package/dist/server/src/router.js.map +0 -1
  159. package/dist/server/src/server/api-router.d.ts +0 -15
  160. package/dist/server/src/server/api-router.js +0 -111
  161. package/dist/server/src/server/api-router.js.map +0 -1
  162. package/dist/server/src/server/auth.d.ts +0 -32
  163. package/dist/server/src/server/auth.js +0 -80
  164. package/dist/server/src/server/auth.js.map +0 -1
  165. package/dist/server/src/server/database.d.ts +0 -24
  166. package/dist/server/src/server/database.js +0 -135
  167. package/dist/server/src/server/database.js.map +0 -1
  168. package/dist/server/src/server/index.d.ts +0 -116
  169. package/dist/server/src/server/index.js +0 -508
  170. package/dist/server/src/server/index.js.map +0 -1
  171. package/dist/server/src/server/middleware.d.ts +0 -11
  172. package/dist/server/src/server/middleware.js +0 -46
  173. package/dist/server/src/server/middleware.js.map +0 -1
  174. package/dist/server/src/server/server.d.ts +0 -9
  175. package/dist/server/src/server/server.js +0 -87
  176. package/dist/server/src/server/server.js.map +0 -1
  177. package/dist/server/src/server/templates.d.ts +0 -30
  178. package/dist/server/src/server/templates.js +0 -208
  179. package/dist/server/src/server/templates.js.map +0 -1
  180. package/dist/server/src/server/types.d.ts +0 -38
  181. package/dist/server/src/server/types.js +0 -4
  182. package/dist/server/src/server/types.js.map +0 -1
  183. package/dist/server/src/server/utils.d.ts +0 -70
  184. package/dist/server/src/server/utils.js +0 -156
  185. package/dist/server/src/server/utils.js.map +0 -1
  186. package/dist/server/src/server/wasm.d.ts +0 -9
  187. package/dist/server/src/server/wasm.js +0 -117
  188. package/dist/server/src/server/wasm.js.map +0 -1
  189. package/dist/server/src/server-renderer.d.ts +0 -5
  190. package/dist/server/src/server-renderer.js +0 -106
  191. package/dist/server/src/server-renderer.js.map +0 -1
  192. package/dist/server/src/server-types.d.ts +0 -42
  193. package/dist/server/src/server-types.js +0 -6
  194. package/dist/server/src/server-types.js.map +0 -1
  195. package/dist/server/src/store.d.ts +0 -41
  196. package/dist/server/src/store.js +0 -99
  197. package/dist/server/src/store.js.map +0 -1
  198. package/dist/server/src/types.d.ts +0 -19
  199. package/dist/server/src/types.js +0 -2
  200. package/dist/server/src/types.js.map +0 -1
  201. package/dist/server/src/utils.d.ts +0 -46
  202. package/dist/server/src/utils.js +0 -144
  203. package/dist/server/src/utils.js.map +0 -1
  204. package/dist/server/src/vdom.d.ts +0 -8
  205. package/dist/server/src/vdom.js +0 -22
  206. package/dist/server/src/vdom.js.map +0 -1
  207. package/dist/server/src/wasm.d.ts +0 -36
  208. package/dist/server/src/wasm.js +0 -159
  209. package/dist/server/src/wasm.js.map +0 -1
  210. package/dist/server/tsconfig.server.tsbuildinfo +0 -1
  211. package/dist/server-renderer/package.json +0 -16
  212. package/dist/server-renderer.mjs +0 -64
  213. package/dist/store/package.json +0 -16
  214. package/dist/types/package.json +0 -16
  215. package/dist/utils/package.json +0 -16
  216. package/dist/vdom/package.json +0 -16
  217. package/dist/wasm/package.json +0 -16
  218. package/dist/wasm.js +0 -1
  219. package/dist/wasm.mjs +0 -103
  220. package/templates/basic-app/docs/rapport_pfe.aux +0 -27
  221. package/templates/basic-app/docs/rapport_pfe.log +0 -399
  222. package/templates/basic-app/docs/rapport_pfe.out +0 -10
  223. package/templates/basic-app/docs/rapport_pfe.pdf +0 -0
  224. package/templates/basic-app/docs/rapport_pfe.tex +0 -68
  225. package/templates/basic-app/docs/rapport_pfe.toc +0 -14
  226. package/templates/complete-app/package-lock.json +0 -2536
  227. package/templates/go-wasm-app/README.md +0 -38
  228. package/templates/go-wasm-app/babel.config.js +0 -21
  229. package/templates/go-wasm-app/build-client.js +0 -49
  230. package/templates/go-wasm-app/build-wasm.js +0 -237
  231. package/templates/go-wasm-app/build.config.js +0 -62
  232. package/templates/go-wasm-app/build.js +0 -218
  233. package/templates/go-wasm-app/package.json +0 -32
  234. package/templates/go-wasm-app/public/index.html +0 -128
  235. package/templates/go-wasm-app/public/styles.css +0 -197
  236. package/templates/go-wasm-app/public/wasm/example.wasm +0 -0
  237. package/templates/go-wasm-app/public/wasm/wasm_exec_node.js +0 -39
  238. package/templates/go-wasm-app/server.js +0 -70
  239. package/templates/go-wasm-app/src/App.jsx +0 -38
  240. package/templates/go-wasm-app/src/app.js +0 -173
  241. package/templates/go-wasm-app/src/client.js +0 -57
  242. package/templates/go-wasm-app/src/components/Footer.jsx +0 -13
  243. package/templates/go-wasm-app/src/components/Header.jsx +0 -19
  244. package/templates/go-wasm-app/src/components/WasmDemo.jsx +0 -120
  245. package/templates/go-wasm-app/src/main.jsx +0 -12
  246. package/templates/go-wasm-app/src/wasm/example.go +0 -75
  247. package/templates/go-wasm-app/tsconfig.server.json +0 -18
  248. package/templates/go-wasm-app/vite.config.js +0 -45
  249. package/templates/ssr-template/client.js +0 -58
  250. package/templates/ssr-template/package-lock.json +0 -2478
  251. package/templates/ssr-template/public/index.html +0 -47
  252. package/templates/ssr-template/readme.md +0 -188
  253. package/templates/ssr-template/server.js +0 -369
  254. package/templates/ssr-template/server.ts +0 -275
  255. package/templates/ssr-template/src/client.ts +0 -61
  256. package/templates/ssr-template/src/pages/index.tsx +0 -51
  257. package/templates/ssr-template/vite.config.js +0 -57
  258. /package/{dist/Counter.d.ts → templates/complete-app/api/hello.js} +0 -0
  259. /package/templates/{go-wasm-app/public/wasm → wasm/public}/wasm_exec.js +0 -0
@@ -1,46 +0,0 @@
1
- // Common middleware functions
2
- export const requestLogger = (req, res, next) => {
3
- console.log(`${new Date().toISOString()} - ${req.method} ${req.url}`);
4
- next();
5
- };
6
- export const errorHandler = (err, req, res, next) => {
7
- console.error(err.stack);
8
- res.status(500).json({
9
- error: {
10
- message: 'Internal Server Error',
11
- ...(process.env.NODE_ENV !== 'production' ? { details: err.message, stack: err.stack } : {})
12
- }
13
- });
14
- };
15
- export const notFoundHandler = (req, res) => {
16
- res.status(404).json({
17
- error: {
18
- message: `Not Found - ${req.method} ${req.url}`
19
- }
20
- });
21
- };
22
- // Middleware for rate limiting
23
- export function rateLimit(options) {
24
- const requests = new Map();
25
- return (req, res, next) => {
26
- const ip = req.ip || 'unknown';
27
- const now = Date.now();
28
- // Get existing requests and filter out old ones
29
- const reqTimes = (requests.get(ip) || [])
30
- .filter(time => now - time < options.windowMs);
31
- // Add current request
32
- reqTimes.push(now);
33
- requests.set(ip, reqTimes);
34
- // Check if too many requests
35
- if (reqTimes.length > options.max) {
36
- return res.status(429).json({
37
- error: {
38
- message: 'Too Many Requests',
39
- retryAfter: Math.ceil(options.windowMs / 1000)
40
- }
41
- });
42
- }
43
- return next();
44
- };
45
- }
46
- //# sourceMappingURL=middleware.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../../../src/server/middleware.ts"],"names":[],"mappings":"AAMA,8BAA8B;AAC9B,MAAM,CAAC,MAAM,aAAa,GAAuB,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;IAClE,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,MAAM,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;IACtE,IAAI,EAAE,CAAC;AACT,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,CAC1B,GAAU,EACV,GAAY,EACZ,GAAa,EACb,IAAkB,EAClB,EAAE;IACF,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACzB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;QACnB,KAAK,EAAE;YACL,OAAO,EAAE,uBAAuB;YAChC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC7F;KACF,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,GAAY,EAAE,GAAa,EAAE,EAAE;IAC7D,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;QACnB,KAAK,EAAE;YACL,OAAO,EAAE,eAAe,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,GAAG,EAAE;SAChD;KACF,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,+BAA+B;AAC/B,MAAM,UAAU,SAAS,CAAC,OAA0C;IAClE,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAoB,CAAC;IAE7C,OAAO,CAAC,GAAY,EAAE,GAAa,EAAE,IAAkB,EAAE,EAAE;QACzD,MAAM,EAAE,GAAG,GAAG,CAAC,EAAE,IAAI,SAAS,CAAC;QAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAEvB,gDAAgD;QAChD,MAAM,QAAQ,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;aACtC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,GAAG,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;QAEjD,sBAAsB;QACtB,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACnB,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;QAE3B,6BAA6B;QAC7B,IAAI,QAAQ,CAAC,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;YAClC,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBAC1B,KAAK,EAAE;oBACL,OAAO,EAAE,mBAAmB;oBAC5B,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;iBAC/C;aACF,CAAC,CAAC;QACL,CAAC;QAED,OAAO,IAAI,EAAE,CAAC;IAChB,CAAC,CAAC;AACJ,CAAC"}
@@ -1,9 +0,0 @@
1
- declare class Server {
2
- private config;
3
- constructor(config: {
4
- pagesDir?: string;
5
- });
6
- private renderPage;
7
- private pathMatchesPattern;
8
- }
9
- export default Server;
@@ -1,87 +0,0 @@
1
- import fs from 'fs';
2
- import path from 'path';
3
- import { renderComponent } from '../renderComponent'; // Fixed import path with .js extension
4
- class Server {
5
- constructor(config) {
6
- Object.defineProperty(this, "config", {
7
- enumerable: true,
8
- configurable: true,
9
- writable: true,
10
- value: void 0
11
- });
12
- this.config = config;
13
- }
14
- async renderPage(urlPath) {
15
- try {
16
- // Try to find the page component
17
- const pagesDir = path.resolve(process.cwd(), this.config.pagesDir);
18
- // Check various file patterns
19
- let pagePath = '';
20
- const possiblePagePaths = [
21
- `${pagesDir}${path}.jsx`,
22
- `${pagesDir}${path}.tsx`,
23
- `${pagesDir}${path}/index.jsx`,
24
- `${pagesDir}${path}/index.tsx`,
25
- // For dynamic routes
26
- ...fs.readdirSync(pagesDir, { recursive: true })
27
- .filter((file) => typeof file === 'string')
28
- .filter((file) => file.endsWith('.jsx') || file.endsWith('.tsx'))
29
- .map((file) => path.join(pagesDir, file))
30
- .filter((file) => {
31
- const routePattern = file
32
- .replace(pagesDir, '')
33
- .replace(/\.[jt]sx$/, '')
34
- .replace(/\/index$/, '/')
35
- .replace(/\[([^\]]+)\]/g, ':$1');
36
- // Create Express-like path matcher
37
- return this.pathMatchesPattern(urlPath, routePattern);
38
- })
39
- ];
40
- for (const possiblePath of possiblePagePaths) {
41
- if (fs.existsSync(possiblePath)) {
42
- pagePath = possiblePath;
43
- break;
44
- }
45
- }
46
- if (!pagePath) {
47
- return {
48
- html: `<!DOCTYPE html><html><body><h1>404 - Page Not Found</h1></body></html>`,
49
- statusCode: 404
50
- };
51
- }
52
- // Import and render the page component
53
- const { default: PageComponent } = await import(pagePath);
54
- if (!PageComponent || typeof PageComponent !== 'function') {
55
- throw new Error(`Invalid page component: ${pagePath}`);
56
- }
57
- const { html } = await renderComponent(PageComponent);
58
- // Add DOCTYPE and wrap in html/body if not present
59
- let finalHtml = html;
60
- if (!finalHtml.includes('<!DOCTYPE')) {
61
- finalHtml = `<!DOCTYPE html><html><head>
62
- <meta charset="UTF-8">
63
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
64
- <script type="module" src="/client.js"></script>
65
- </head><body>${finalHtml}</body></html>`;
66
- }
67
- return { html: finalHtml, statusCode: 200 };
68
- }
69
- catch (error) {
70
- console.error('Error rendering page:', error);
71
- return {
72
- html: `<!DOCTYPE html><html><body><h1>500 - Server Error</h1><pre>${error}</pre></body></html>`,
73
- statusCode: 500
74
- };
75
- }
76
- }
77
- pathMatchesPattern(path, pattern) {
78
- // Convert Express-like pattern to regex
79
- const regexPattern = pattern
80
- .replace(/\//g, '\\/') // Escape slashes
81
- .replace(/:([^\/]+)/g, '([^\\/]+)'); // Convert :param to regex group
82
- const regex = new RegExp(`^${regexPattern}$`);
83
- return regex.test(path);
84
- }
85
- }
86
- export default Server;
87
- //# sourceMappingURL=server.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../../../../src/server/server.ts"],"names":[],"mappings":"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"}
@@ -1,30 +0,0 @@
1
- /**
2
- * HTML template generators for server-side rendering
3
- */
4
- export interface DocumentOptions {
5
- title?: string;
6
- description?: string;
7
- lang?: string;
8
- charset?: string;
9
- viewport?: string;
10
- scripts?: string[];
11
- styles?: string[];
12
- meta?: Record<string, string>;
13
- bodyClasses?: string;
14
- htmlAttrs?: Record<string, string>;
15
- bodyAttrs?: Record<string, string>;
16
- initialData?: any;
17
- componentName?: string;
18
- }
19
- /**
20
- * Generate a complete HTML document
21
- */
22
- export declare function generateDocument(content: string, options?: DocumentOptions): string;
23
- /**
24
- * Generate an error page
25
- */
26
- export declare function generateErrorPage(statusCode: number, message: string, error?: Error): string;
27
- /**
28
- * Generate a loading page
29
- */
30
- export declare function generateLoadingPage(message?: string): string;
@@ -1,208 +0,0 @@
1
- /**
2
- * HTML template generators for server-side rendering
3
- */
4
- /**
5
- * Generate a complete HTML document
6
- */
7
- export function generateDocument(content, options = {}) {
8
- const { title = 'Frontend Hamroun App', description = '', lang = 'en', charset = 'UTF-8', viewport = 'width=device-width, initial-scale=1.0', scripts = [], styles = [], meta = {}, bodyClasses = '', htmlAttrs = {}, bodyAttrs = {}, initialData = {}, componentName = '' } = options;
9
- // Generate HTML attributes
10
- const htmlAttributes = Object.entries(htmlAttrs)
11
- .map(([key, value]) => `${key}="${escapeHtml(value)}"`)
12
- .join(' ');
13
- // Generate body attributes
14
- const bodyAttributes = Object.entries(bodyAttrs)
15
- .map(([key, value]) => `${key}="${escapeHtml(value)}"`)
16
- .join(' ');
17
- // Generate meta tags
18
- const metaTags = [
19
- `<meta charset="${charset}">`,
20
- `<meta name="viewport" content="${viewport}">`,
21
- description ? `<meta name="description" content="${escapeHtml(description)}">` : ''
22
- ];
23
- // Add custom meta tags
24
- Object.entries(meta).forEach(([name, content]) => {
25
- metaTags.push(`<meta name="${escapeHtml(name)}" content="${escapeHtml(content)}">`);
26
- });
27
- // Generate script tags
28
- const scriptTags = scripts.map(src => {
29
- if (src.startsWith('<script')) {
30
- return src; // Allow inline scripts
31
- }
32
- return `<script src="${escapeHtml(src)}" ${src.endsWith('.js') ? 'type="module"' : ''} defer></script>`;
33
- });
34
- // Generate style tags
35
- const styleTags = styles.map(href => {
36
- if (href.startsWith('<style')) {
37
- return href; // Allow inline styles
38
- }
39
- return `<link rel="stylesheet" href="${escapeHtml(href)}">`;
40
- });
41
- // Create initial data script
42
- const initialDataScript = Object.keys(initialData).length > 0 ?
43
- `<script id="__APP_DATA__" type="application/json">${escapeHtml(JSON.stringify(initialData))}</script>` : '';
44
- // Create the complete HTML document
45
- return `<!DOCTYPE html>
46
- <html lang="${lang}" ${htmlAttributes}>
47
- <head>
48
- ${metaTags.filter(Boolean).join('\n ')}
49
- <title>${escapeHtml(title)}</title>
50
- ${styleTags.join('\n ')}
51
- </head>
52
- <body class="${bodyClasses}" ${bodyAttributes}>
53
- <div id="app-root" data-ssr-root${componentName ? ` data-component="${escapeHtml(componentName)}"` : ''}>${content}</div>
54
- ${initialDataScript}
55
- ${scriptTags.join('\n ')}
56
- </body>
57
- </html>`;
58
- }
59
- /**
60
- * Generate an error page
61
- */
62
- export function generateErrorPage(statusCode, message, error) {
63
- const errorMessages = {
64
- 400: 'Bad Request',
65
- 401: 'Unauthorized',
66
- 403: 'Forbidden',
67
- 404: 'Not Found',
68
- 500: 'Internal Server Error'
69
- };
70
- const title = `${statusCode} - ${errorMessages[statusCode] || 'Error'}`;
71
- // Generate error details (only in development)
72
- const isDev = process.env.NODE_ENV !== 'production';
73
- const errorDetails = isDev && error ? `
74
- <div class="error-details">
75
- <pre>${escapeHtml(error.stack || error.message)}</pre>
76
- </div>
77
- ` : '';
78
- // Create error content
79
- const content = `
80
- <div class="error-container">
81
- <h1>${statusCode}</h1>
82
- <h2>${escapeHtml(errorMessages[statusCode] || 'Error')}</h2>
83
- <p>${escapeHtml(message)}</p>
84
- ${errorDetails}
85
- <a href="/" class="home-link">Back to Home</a>
86
- </div>
87
- `;
88
- // Add error page styling
89
- const styles = [`<style>
90
- body {
91
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
92
- display: flex;
93
- justify-content: center;
94
- align-items: center;
95
- min-height: 100vh;
96
- margin: 0;
97
- background-color: #f7f7f7;
98
- color: #333;
99
- }
100
- .error-container {
101
- text-align: center;
102
- padding: 2rem;
103
- border-radius: 8px;
104
- background-color: white;
105
- box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
106
- max-width: 600px;
107
- width: 100%;
108
- }
109
- h1 {
110
- font-size: 6rem;
111
- margin: 0;
112
- color: #e74c3c;
113
- }
114
- h2 {
115
- margin-top: 0;
116
- margin-bottom: 1rem;
117
- color: #333;
118
- }
119
- .error-details {
120
- text-align: left;
121
- margin: 2rem 0;
122
- padding: 1rem;
123
- background-color: #f8f8f8;
124
- border-radius: 4px;
125
- overflow: auto;
126
- }
127
- pre {
128
- margin: 0;
129
- font-family: monospace;
130
- font-size: 0.85rem;
131
- white-space: pre-wrap;
132
- }
133
- .home-link {
134
- display: inline-block;
135
- margin-top: 1.5rem;
136
- padding: 0.75rem 1.5rem;
137
- background-color: #3498db;
138
- color: white;
139
- text-decoration: none;
140
- border-radius: 4px;
141
- transition: background-color 0.2s;
142
- }
143
- .home-link:hover {
144
- background-color: #2980b9;
145
- }
146
- </style>`];
147
- return generateDocument(content, {
148
- title,
149
- description: `Error ${statusCode}: ${errorMessages[statusCode] || 'Error'}`,
150
- bodyClasses: 'error-page',
151
- styles
152
- });
153
- }
154
- /**
155
- * Generate a loading page
156
- */
157
- export function generateLoadingPage(message = 'Loading...') {
158
- const content = `
159
- <div class="loading-container">
160
- <div class="spinner"></div>
161
- <p>${escapeHtml(message)}</p>
162
- </div>
163
- `;
164
- const styles = [`<style>
165
- body {
166
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
167
- display: flex;
168
- justify-content: center;
169
- align-items: center;
170
- min-height: 100vh;
171
- margin: 0;
172
- background-color: #f7f7f7;
173
- color: #333;
174
- }
175
- .loading-container {
176
- text-align: center;
177
- }
178
- .spinner {
179
- width: 50px;
180
- height: 50px;
181
- border: 5px solid rgba(0, 0, 0, 0.1);
182
- border-radius: 50%;
183
- border-top-color: #3498db;
184
- animation: spin 1s ease-in-out infinite;
185
- margin: 0 auto 20px;
186
- }
187
- @keyframes spin {
188
- to { transform: rotate(360deg); }
189
- }
190
- </style>`];
191
- return generateDocument(content, {
192
- title: 'Loading',
193
- bodyClasses: 'loading-page',
194
- styles
195
- });
196
- }
197
- /**
198
- * Escape HTML special characters
199
- */
200
- function escapeHtml(text) {
201
- return String(text)
202
- .replace(/&/g, '&amp;')
203
- .replace(/</g, '&lt;')
204
- .replace(/>/g, '&gt;')
205
- .replace(/"/g, '&quot;')
206
- .replace(/'/g, '&#039;');
207
- }
208
- //# sourceMappingURL=templates.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"templates.js","sourceRoot":"","sources":["../../../../src/server/templates.ts"],"names":[],"mappings":"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"}
@@ -1,38 +0,0 @@
1
- export interface ServerConfig {
2
- port?: number;
3
- apiDir?: string;
4
- pagesDir?: string;
5
- staticDir?: string;
6
- enableCors?: boolean;
7
- corsOptions?: any;
8
- db?: {
9
- url: string;
10
- type: 'mongodb' | 'mysql' | 'postgres';
11
- };
12
- auth?: {
13
- secret: string;
14
- expiresIn?: string;
15
- };
16
- }
17
- export interface Server {
18
- start(): Promise<void>;
19
- stop(): Promise<void>;
20
- getExpressApp(): any;
21
- getDatabase(): any;
22
- getAuth(): any;
23
- }
24
- export interface User {
25
- id: string | number;
26
- username: string;
27
- password?: string;
28
- email?: string;
29
- roles?: string[];
30
- [key: string]: any;
31
- }
32
- export interface DbConfig {
33
- url: string;
34
- type: 'mongodb' | 'mysql' | 'postgres';
35
- }
36
- export interface MiddlewareFunction {
37
- (req: any, res: any, next: any): void | Promise<void>;
38
- }
@@ -1,4 +0,0 @@
1
- // Type definitions without actual implementation
2
- // These can be safely imported in any environment
3
- export {};
4
- //# sourceMappingURL=types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/server/types.ts"],"names":[],"mappings":"AAAA,iDAAiD;AACjD,kDAAkD"}
@@ -1,70 +0,0 @@
1
- import { Request, Response } from 'express';
2
- /**
3
- * Utility functions for server-side operations
4
- */
5
- /**
6
- * Safely parse JSON with error handling
7
- */
8
- export declare function safeJsonParse<T>(json: string, fallback: T): T;
9
- /**
10
- * Generate a secure random token
11
- */
12
- export declare function generateToken(length?: number): string;
13
- /**
14
- * Hash a string using SHA-256
15
- */
16
- export declare function hashString(input: string, salt?: string): string;
17
- /**
18
- * Get pagination parameters from request
19
- */
20
- export declare function getPagination(req: Request): {
21
- page: number;
22
- limit: number;
23
- skip: number;
24
- };
25
- /**
26
- * Standard success response format
27
- */
28
- export declare function sendSuccess<T>(res: Response, data: T, message?: string): Response;
29
- /**
30
- * Standard error response format
31
- */
32
- export declare function sendError(res: Response, message?: string, statusCode?: number, errors?: any): Response;
33
- /**
34
- * Validate required fields in request body
35
- */
36
- export declare function validateFields(req: Request, requiredFields: string[]): {
37
- valid: boolean;
38
- missing: string[];
39
- };
40
- /**
41
- * Handle file upload validation
42
- */
43
- export declare function validateFileUpload(file: any, // Using 'any' to avoid the Express.Multer dependency
44
- options?: {
45
- maxSize?: number;
46
- allowedTypes?: string[];
47
- }): {
48
- valid: boolean;
49
- error?: string;
50
- };
51
- /**
52
- * Get server environment information
53
- */
54
- export declare function getEnvironmentInfo(): Record<string, any>;
55
- /**
56
- * Check if a directory is empty
57
- */
58
- export declare function isDirectoryEmpty(dirPath: string): Promise<boolean>;
59
- /**
60
- * Create directory if it doesn't exist
61
- */
62
- export declare function ensureDirectory(dirPath: string): Promise<void>;
63
- /**
64
- * Write JSON to file
65
- */
66
- export declare function writeJsonFile(filePath: string, data: any): Promise<void>;
67
- /**
68
- * Read JSON from file
69
- */
70
- export declare function readJsonFile<T>(filePath: string, defaultValue: T): Promise<T>;
@@ -1,156 +0,0 @@
1
- import crypto from 'crypto';
2
- import fs from 'fs/promises';
3
- import path from 'path';
4
- /**
5
- * Utility functions for server-side operations
6
- */
7
- /**
8
- * Safely parse JSON with error handling
9
- */
10
- export function safeJsonParse(json, fallback) {
11
- try {
12
- return JSON.parse(json);
13
- }
14
- catch (error) {
15
- return fallback;
16
- }
17
- }
18
- /**
19
- * Generate a secure random token
20
- */
21
- export function generateToken(length = 32) {
22
- return crypto.randomBytes(length).toString('hex');
23
- }
24
- /**
25
- * Hash a string using SHA-256
26
- */
27
- export function hashString(input, salt = '') {
28
- return crypto.createHash('sha256').update(input + salt).digest('hex');
29
- }
30
- /**
31
- * Get pagination parameters from request
32
- */
33
- export function getPagination(req) {
34
- const page = Math.max(1, parseInt(req.query.page) || 1);
35
- const limit = Math.max(1, Math.min(100, parseInt(req.query.limit) || 20));
36
- const skip = (page - 1) * limit;
37
- return { page, limit, skip };
38
- }
39
- /**
40
- * Standard success response format
41
- */
42
- export function sendSuccess(res, data, message = 'Success') {
43
- return res.json({
44
- success: true,
45
- message,
46
- data
47
- });
48
- }
49
- /**
50
- * Standard error response format
51
- */
52
- export function sendError(res, message = 'An error occurred', statusCode = 400, errors) {
53
- return res.status(statusCode).json({
54
- success: false,
55
- message,
56
- errors: errors || undefined
57
- });
58
- }
59
- /**
60
- * Validate required fields in request body
61
- */
62
- export function validateFields(req, requiredFields) {
63
- const missing = requiredFields.filter(field => {
64
- const value = req.body[field];
65
- return value === undefined || value === null || value === '';
66
- });
67
- return {
68
- valid: missing.length === 0,
69
- missing
70
- };
71
- }
72
- /**
73
- * Handle file upload validation
74
- */
75
- export function validateFileUpload(file, // Using 'any' to avoid the Express.Multer dependency
76
- options = {}) {
77
- if (!file) {
78
- return { valid: false, error: 'No file provided' };
79
- }
80
- // Check file size
81
- if (options.maxSize && file.size > options.maxSize) {
82
- return {
83
- valid: false,
84
- error: `File too large. Maximum size allowed is ${options.maxSize / 1024 / 1024}MB`
85
- };
86
- }
87
- // Check file type
88
- if (options.allowedTypes && options.allowedTypes.length > 0) {
89
- const fileType = file.mimetype;
90
- if (!options.allowedTypes.includes(fileType)) {
91
- return {
92
- valid: false,
93
- error: `Invalid file type. Allowed types: ${options.allowedTypes.join(', ')}`
94
- };
95
- }
96
- }
97
- return { valid: true };
98
- }
99
- /**
100
- * Get server environment information
101
- */
102
- export function getEnvironmentInfo() {
103
- return {
104
- nodeVersion: process.version,
105
- platform: process.platform,
106
- arch: process.arch,
107
- memory: process.memoryUsage(),
108
- uptime: process.uptime(),
109
- env: process.env.NODE_ENV || 'development'
110
- };
111
- }
112
- /**
113
- * Check if a directory is empty
114
- */
115
- export async function isDirectoryEmpty(dirPath) {
116
- try {
117
- const files = await fs.readdir(dirPath);
118
- return files.length === 0;
119
- }
120
- catch (error) {
121
- // Directory doesn't exist or can't be read
122
- return true;
123
- }
124
- }
125
- /**
126
- * Create directory if it doesn't exist
127
- */
128
- export async function ensureDirectory(dirPath) {
129
- try {
130
- await fs.access(dirPath);
131
- }
132
- catch (error) {
133
- // Directory doesn't exist, create it
134
- await fs.mkdir(dirPath, { recursive: true });
135
- }
136
- }
137
- /**
138
- * Write JSON to file
139
- */
140
- export async function writeJsonFile(filePath, data) {
141
- await ensureDirectory(path.dirname(filePath));
142
- await fs.writeFile(filePath, JSON.stringify(data, null, 2), 'utf8');
143
- }
144
- /**
145
- * Read JSON from file
146
- */
147
- export async function readJsonFile(filePath, defaultValue) {
148
- try {
149
- const data = await fs.readFile(filePath, 'utf8');
150
- return safeJsonParse(data, defaultValue);
151
- }
152
- catch (error) {
153
- return defaultValue;
154
- }
155
- }
156
- //# sourceMappingURL=utils.js.map