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
package/package.json CHANGED
@@ -1,159 +1,112 @@
1
1
  {
2
2
  "name": "frontend-hamroun",
3
- "version": "1.2.79",
3
+ "version": "1.2.82",
4
4
  "description": "A lightweight full-stack JavaScript framework",
5
5
  "type": "module",
6
- "main": "./dist/index.js",
7
- "module": "./dist/index.mjs",
8
- "types": "./dist/index.d.ts",
9
- "files": [
10
- "dist",
11
- "README.md",
12
- "LICENSE",
13
- "bin",
14
- "templates"
15
- ],
6
+ "main": "dist/index.cjs",
7
+ "module": "dist/index.js",
8
+ "types": "dist/index.d.ts",
16
9
  "exports": {
17
10
  ".": {
18
- "types": "./dist/index.d.ts",
19
- "import": "./dist/index.mjs",
20
- "require": "./dist/index.js",
21
- "default": "./dist/index.js"
22
- },
23
- "./server": {
24
- "types": "./dist/server/index.d.ts",
25
- "node": "./dist/server/index.js",
26
- "import": "./dist/server/index.mjs",
27
- "require": "./dist/server/index.js"
11
+ "import": "./dist/index.js",
12
+ "require": "./dist/index.cjs",
13
+ "types": "./dist/index.d.ts"
28
14
  },
29
- "./server/database": {
30
- "types": "./dist/server/database.d.ts",
31
- "import": "./dist/server/database.mjs",
32
- "require": "./dist/server/database.js"
15
+ "./client": {
16
+ "import": "./dist/index.client.js",
17
+ "require": "./dist/index.client.cjs",
18
+ "types": "./dist/index.client.d.ts"
33
19
  },
34
- "./server/auth": {
35
- "types": "./dist/server/auth.d.ts",
36
- "import": "./dist/server/auth.mjs",
37
- "require": "./dist/server/auth.js"
38
- },
39
- "./server/middleware": {
40
- "types": "./dist/server/middleware.d.ts",
41
- "import": "./dist/server/middleware.mjs",
42
- "require": "./dist/server/middleware.js"
43
- },
44
- "./server/api-router": {
45
- "types": "./dist/server/api-router.d.ts",
46
- "import": "./dist/server/api-router.mjs",
47
- "require": "./dist/server/api-router.js"
48
- },
49
- "./server-types": {
50
- "types": "./dist/server-types.d.ts",
51
- "import": "./dist/server-types.mjs",
52
- "require": "./dist/server-types.js"
53
- },
54
- "./ssr": {
55
- "types": "./dist/server-renderer.d.ts",
56
- "import": "./dist/server-renderer.mjs",
57
- "require": "./dist/server-renderer.js"
20
+ "./server": {
21
+ "import": "./dist/server-renderer.js",
22
+ "require": "./dist/server-renderer.cjs",
23
+ "types": "./dist/server-renderer.d.ts"
58
24
  },
59
25
  "./jsx-runtime": {
60
- "types": "./dist/jsx-runtime.d.ts",
61
- "import": "./dist/jsx-runtime.mjs",
62
- "require": "./dist/jsx-runtime.js"
63
- },
64
- "./hooks": {
65
- "types": "./dist/hooks.d.ts",
66
- "import": "./dist/hooks.mjs",
67
- "require": "./dist/hooks.js"
68
- },
69
- "./renderer": {
70
- "types": "./dist/renderer.d.ts",
71
- "import": "./dist/renderer.mjs",
72
- "require": "./dist/renderer.js"
73
- },
74
- "./wasm": {
75
- "types": "./dist/wasm.d.ts",
76
- "import": "./dist/wasm.mjs",
77
- "require": "./dist/wasm.js"
78
- },
79
- "./server/wasm": {
80
- "types": "./dist/server/wasm.d.ts",
81
- "import": "./dist/server/wasm.mjs",
82
- "require": "./dist/server/wasm.js"
26
+ "import": "./dist/jsx-runtime.js",
27
+ "require": "./dist/jsx-runtime.cjs",
28
+ "types": "./dist/jsx-runtime.d.ts"
83
29
  }
84
30
  },
85
31
  "bin": {
86
- "frontend-hamroun": "./bin/cli.js",
87
- "create-frontend-app": "./bin/cli.js"
32
+ "frontend-hamroun": "./bin/cli.js"
88
33
  },
34
+ "files": [
35
+ "dist",
36
+ "bin",
37
+ "templates",
38
+ "README.md",
39
+ "LICENSE"
40
+ ],
89
41
  "scripts": {
90
- "build:client": "vite build",
91
- "build:server": "node build-server.js",
92
- "build": "npm run build:server && npm run build:client",
93
- "clean": "node -e \"if(require('fs').existsSync('dist')) require('fs').rmSync('dist',{recursive:true})\"",
94
- "prepublishOnly": "npm run clean && npm run build",
42
+ "build": "tsc && vite build",
95
43
  "dev": "vite",
96
- "test": "node --loader ts-node/esm tests/run-tests.ts",
97
- "test:watch": "nodemon --watch src --watch tests --ext ts,tsx --exec 'npm test'",
98
- "generate-test-report": "node --loader ts-node/esm tests/generate-report.ts"
44
+ "test": "jest",
45
+ "test:watch": "jest --watch",
46
+ "test:coverage": "jest --coverage",
47
+ "lint": "eslint src --ext .ts,.tsx",
48
+ "lint:fix": "eslint src --ext .ts,.tsx --fix",
49
+ "format": "prettier --write src/**/*.{ts,tsx}",
50
+ "type-check": "tsc --noEmit",
51
+ "prepublishOnly": "npm run build",
52
+ "clean": "rimraf dist"
99
53
  },
100
54
  "keywords": [
55
+ "javascript",
101
56
  "frontend",
102
57
  "framework",
103
- "jsx",
104
- "hooks",
105
- "virtual-dom",
106
- "fullstack",
107
- "express",
108
- "api"
58
+ "ssr",
59
+ "reactive",
60
+ "lightweight"
109
61
  ],
110
62
  "author": "Hamroun",
111
63
  "license": "MIT",
112
64
  "repository": {
113
65
  "type": "git",
114
- "url": "your-repo-url"
66
+ "url": "https://github.com/hamroun/frontend-hamroun.git"
115
67
  },
116
- "devDependencies": {
117
- "@types/bcryptjs": "^2.4.4",
118
- "@types/cors": "^2.8.14",
119
- "@types/express": "^4.17.18",
120
- "@types/jsonwebtoken": "^9.0.3",
121
- "@types/mongodb": "^4.0.7",
122
- "@types/node": "^18.16.19",
123
- "@types/pg": "^8.10.2",
124
- "@types/react": "^19.0.8",
125
- "@vitejs/plugin-react": "^4.0.4",
126
- "nanospinner": "^1.1.0",
127
- "terser": "^5.38.1",
128
- "typescript": "^5.0.0",
129
- "vite": "^4.4.9",
130
- "vite-plugin-dts": "^4.5.0",
131
- "vitest": "^0.34.0"
68
+ "bugs": {
69
+ "url": "https://github.com/hamroun/frontend-hamroun/issues"
132
70
  },
133
- "publishConfig": {
134
- "access": "public",
135
- "registry": "https://registry.npmjs.org/"
71
+ "homepage": "https://github.com/hamroun/frontend-hamroun#readme",
72
+ "devDependencies": {
73
+ "@types/cors": "^2.8.18",
74
+ "@types/express": "^5.0.2",
75
+ "@types/jest": "^29.5.5",
76
+ "@types/jsonwebtoken": "^9.0.9",
77
+ "@types/node": "^20.6.3",
78
+ "@types/pg": "^8.15.2",
79
+ "@typescript-eslint/eslint-plugin": "^6.7.2",
80
+ "@typescript-eslint/parser": "^6.7.2",
81
+ "eslint": "^8.49.0",
82
+ "eslint-config-prettier": "^9.0.0",
83
+ "eslint-plugin-prettier": "^5.0.0",
84
+ "jest": "^29.7.0",
85
+ "prettier": "^3.0.3",
86
+ "rimraf": "^5.0.1",
87
+ "terser": "^5.19.4",
88
+ "ts-jest": "^29.1.1",
89
+ "typescript": "^5.2.2",
90
+ "vite": "^5.0.0"
136
91
  },
137
92
  "dependencies": {
138
- "bcryptjs": "^2.4.3",
93
+ "bcryptjs": "^3.0.2",
139
94
  "boxen": "^7.1.1",
140
95
  "chalk": "^5.3.0",
141
96
  "commander": "^11.0.0",
142
- "cors": "^2.8.5",
143
- "express": "^4.18.2",
144
- "figlet": "^1.7.0",
97
+ "express": "^5.1.0",
98
+ "figlet": "^1.6.0",
145
99
  "fs-extra": "^11.1.1",
146
- "gradient-string": "^3.0.0",
147
- "inquirer": "^9.2.10",
100
+ "gradient-string": "^2.0.2",
101
+ "inquirer": "^9.2.11",
148
102
  "jsonwebtoken": "^9.0.2",
149
- "mongodb": "^5.7.0",
150
- "mysql2": "^3.6.1",
103
+ "mongodb": "^6.16.0",
104
+ "mysql2": "^3.14.1",
151
105
  "nanospinner": "^1.1.0",
152
106
  "ora": "^7.0.1",
153
- "pg": "^8.11.3",
107
+ "pg": "^8.16.0",
154
108
  "terminal-link": "^3.0.0",
155
- "ts-node": "^10.9.2",
156
- "update-notifier": "^6.0.2"
109
+ "update-notifier": "^7.0.0"
157
110
  },
158
111
  "peerDependencies": {
159
112
  "react": ">=16.8.0",
@@ -166,5 +119,9 @@
166
119
  "react-dom": {
167
120
  "optional": true
168
121
  }
122
+ },
123
+ "engines": {
124
+ "node": ">=18.0.0",
125
+ "npm": ">=8.0.0"
169
126
  }
170
- }
127
+ }
@@ -0,0 +1,22 @@
1
+ import * as esbuild from 'esbuild';
2
+
3
+ await esbuild.build({
4
+ entryPoints: ['src/main.tsx'],
5
+ bundle: true,
6
+ outfile: 'dist/bundle.js',
7
+ format: 'esm',
8
+ platform: 'browser',
9
+ minify: true,
10
+ sourcemap: true,
11
+ loader: {
12
+ '.tsx': 'tsx',
13
+ '.ts': 'tsx',
14
+ },
15
+ jsxFactory: '_jsx',
16
+ jsxFragment: '_Fragment',
17
+ banner: {
18
+ js: `import { jsx as _jsx, Fragment as _Fragment } from 'frontend-hamroun';`,
19
+ },
20
+ });
21
+
22
+ console.log('Build complete');
@@ -0,0 +1,27 @@
1
+ import * as esbuild from 'esbuild';
2
+
3
+ const ctx = await esbuild.context({
4
+ entryPoints: ['src/main.tsx'],
5
+ bundle: true,
6
+ outfile: 'dist/bundle.js',
7
+ format: 'esm',
8
+ platform: 'browser',
9
+ sourcemap: true,
10
+ loader: {
11
+ '.tsx': 'tsx',
12
+ '.ts': 'tsx',
13
+ },
14
+ jsxFactory: '_jsx',
15
+ jsxFragment: '_Fragment',
16
+ banner: {
17
+ js: `import { jsx as _jsx, Fragment as _Fragment } from 'frontend-hamroun';`,
18
+ },
19
+ });
20
+
21
+ await ctx.watch();
22
+ await ctx.serve({
23
+ servedir: '.',
24
+ port: 3000,
25
+ });
26
+
27
+ console.log('Development server running on http://localhost:3000');
@@ -0,0 +1,28 @@
1
+ import * as esbuild from 'esbuild';
2
+
3
+ const isWatch = process.argv.includes('--watch');
4
+
5
+ const config = {
6
+ entryPoints: ['src/main.tsx'],
7
+ bundle: true,
8
+ outfile: 'dist/bundle.js',
9
+ loader: { '.tsx': 'tsx' },
10
+ jsxFactory: 'createElement',
11
+ jsxFragment: 'null',
12
+ platform: 'browser',
13
+ target: 'es2020',
14
+ minify: true,
15
+ inject: ['./src/jsx-shim.ts'],
16
+ define: {
17
+ 'Fragment': 'null'
18
+ }
19
+ };
20
+
21
+ if (isWatch) {
22
+ const ctx = await esbuild.context(config);
23
+ await ctx.watch();
24
+ console.log('Watching...');
25
+ } else {
26
+ await esbuild.build(config);
27
+ console.log('Build complete');
28
+ }
@@ -5,7 +5,7 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
6
  <title>My Frontend App</title>
7
7
  </head>
8
- <body class="bg-gray-100 min-h-screen">
8
+ <body>
9
9
  <div id="root"></div>
10
10
  <script type="module" src="/src/main.tsx"></script>
11
11
  </body>
@@ -1,28 +1,29 @@
1
- {
2
- "name": "my-app",
3
- "private": true,
4
- "version": "0.0.0",
5
- "type": "module",
6
- "scripts": {
7
- "dev": "vite",
8
- "build": "tsc && vite build",
9
- "preview": "vite preview",
10
- "lint": "eslint src --ext ts,tsx --report-unused-disable-directives --max-warnings 0",
11
- "lint:fix": "eslint src --ext ts,tsx --fix"
12
- },
13
- "dependencies": {
14
- "frontend-hamroun": "latest"
15
- },
16
- "devDependencies": {
17
- "typescript": "^5.0.0",
18
- "vite": "^4.4.9",
19
- "@typescript-eslint/eslint-plugin": "^6.0.0",
20
- "@typescript-eslint/parser": "^6.0.0",
21
- "eslint": "^8.45.0",
22
- "eslint-plugin-react-hooks": "^4.6.0",
23
- "eslint-plugin-react-refresh": "^0.4.3",
24
- "tailwindcss": "^3.3.3",
25
- "postcss": "^8.4.27",
26
- "autoprefixer": "^10.4.14"
27
- }
28
- }
1
+ {
2
+ "name": "create",
3
+ "private": true,
4
+ "version": "0.0.0",
5
+ "type": "module",
6
+ "scripts": {
7
+ "dev": "vite",
8
+ "build": "tsc && vite build",
9
+ "preview": "vite preview",
10
+ "lint": "eslint src --ext ts,tsx --report-unused-disable-directives --max-warnings 0",
11
+ "lint:fix": "eslint src --ext ts,tsx --fix"
12
+ },
13
+ "dependencies": {
14
+ "frontend-hamroun": "latest"
15
+ },
16
+ "devDependencies": {
17
+ "@types/express": "^4.17.17",
18
+ "@types/node": "^20.5.0",
19
+ "@typescript-eslint/eslint-plugin": "^6.0.0",
20
+ "@typescript-eslint/parser": "^6.0.0",
21
+ "autoprefixer": "^10.4.16",
22
+ "eslint": "^8.45.0",
23
+ "eslint-plugin-react-hooks": "^4.6.0",
24
+ "eslint-plugin-react-refresh": "^0.4.3",
25
+ "tailwindcss": "^3.4.17",
26
+ "typescript": "^5.0.0",
27
+ "vite": "^4.4.9"
28
+ }
29
+ }
@@ -0,0 +1,24 @@
1
+ import { spawn } from 'child_process';
2
+ import sirv from 'sirv';
3
+ import http from 'http';
4
+
5
+ // Start esbuild in watch mode
6
+ const esbuild = spawn('node', ['esbuild.config.js', '--watch'], {
7
+ stdio: 'inherit'
8
+ });
9
+
10
+ // Create simple static server
11
+ const serve = sirv('.', {
12
+ dev: true,
13
+ single: true
14
+ });
15
+
16
+ const server = http.createServer(serve);
17
+ server.listen(3000);
18
+ console.log('Server running at http://localhost:3000');
19
+
20
+ process.on('SIGTERM', () => {
21
+ esbuild.kill();
22
+ server.close();
23
+ process.exit();
24
+ });
@@ -0,0 +1,16 @@
1
+ import { useState } from 'frontend-hamroun';
2
+ export function App() {
3
+ // Initialize with a default state that works on both server and client
4
+ const [count, setCount] = useState(0);
5
+ return (<div>
6
+ <h1>Server-Side Rendered App</h1>
7
+ <div>
8
+ <button onClick={() => setCount(count - 1)} data-action="decrement">-</button>
9
+ <span style={{ margin: '0 10px' }}>{count}</span>
10
+ <button onClick={() => setCount(count + 1)} data-action="increment">+</button>
11
+ </div>
12
+ <script dangerouslySetInnerHTML={{
13
+ __html: `window.__INITIAL_STATE__ = ${JSON.stringify({ count: 0 })};`
14
+ }}/>
15
+ </div>);
16
+ }
@@ -0,0 +1,26 @@
1
+ import { useState } from 'frontend-hamroun';
2
+
3
+ export function App() {
4
+ // Initialize with a default state that works on both server and client
5
+ const [count, setCount] = useState(0);
6
+
7
+ return (
8
+ <div>
9
+ <h1>Server-Side Rendered App</h1>
10
+ <div>
11
+ <button
12
+ onClick={() => setCount(count - 1)}
13
+ data-action="decrement"
14
+ >-</button>
15
+ <span style={{ margin: '0 10px' }}>{count}</span>
16
+ <button
17
+ onClick={() => setCount(count + 1)}
18
+ data-action="increment"
19
+ >+</button>
20
+ </div>
21
+ <script dangerouslySetInnerHTML={{
22
+ __html: `window.__INITIAL_STATE__ = ${JSON.stringify({ count: 0 })};`
23
+ }} />
24
+ </div>
25
+ );
26
+ }
@@ -0,0 +1,5 @@
1
+ import { hydrate } from 'frontend-hamroun';
2
+ import { App } from './App';
3
+ document.addEventListener('DOMContentLoaded', () => {
4
+ hydrate(<App />, document.getElementById('root'));
5
+ });
@@ -0,0 +1,11 @@
1
+ import { hydrate } from 'frontend-hamroun';
2
+ import { App } from './App';
3
+
4
+
5
+
6
+ document.addEventListener('DOMContentLoaded', () => {
7
+ hydrate(
8
+ <App />,
9
+ document.getElementById('root')!
10
+ );
11
+ });
@@ -0,0 +1,13 @@
1
+ import { useState, useEffect } from 'frontend-hamroun';
2
+ export function Counter({ initial = 0 }) {
3
+ const [count, setCount] = useState(initial);
4
+ useEffect(() => {
5
+ document.title = `Count: ${count}`;
6
+ }, [count]);
7
+ return (<div>
8
+ <h2>Counter Component</h2>
9
+ <button onClick={() => setCount(count - 1)}>-</button>
10
+ <span style={{ margin: '0 10px' }}>{count}</span>
11
+ <button onClick={() => setCount(count + 1)}>+</button>
12
+ </div>);
13
+ }
@@ -0,0 +1,18 @@
1
+ import { useState, useEffect } from 'frontend-hamroun';
2
+
3
+ export function Counter({ initial = 0 }) {
4
+ const [count, setCount] = useState(initial);
5
+
6
+ useEffect(() => {
7
+ document.title = `Count: ${count}`;
8
+ }, [count]);
9
+
10
+ return (
11
+ <div>
12
+ <h2>Counter Component</h2>
13
+ <button onClick={() => setCount(count - 1)}>-</button>
14
+ <span style={{ margin: '0 10px' }}>{count}</span>
15
+ <button onClick={() => setCount(count + 1)}>+</button>
16
+ </div>
17
+ );
18
+ }
@@ -0,0 +1,3 @@
1
+ import { jsx as createElement, Fragment } from 'frontend-hamroun';
2
+ window.createElement = createElement;
3
+ window.Fragment = Fragment;
@@ -0,0 +1,11 @@
1
+ import { jsx as createElement, Fragment } from 'frontend-hamroun';
2
+
3
+ declare global {
4
+ interface Window {
5
+ createElement: typeof createElement;
6
+ Fragment: typeof Fragment;
7
+ }
8
+ }
9
+
10
+ window.createElement = createElement;
11
+ window.Fragment = Fragment;
@@ -0,0 +1,98 @@
1
+ import { render, useState, useEffect, useMemo, useRef, useErrorBoundary, createContext, useContext } from 'frontend-hamroun';
2
+ import './main.css';
3
+ // Create a theme context
4
+ const ThemeContext = createContext('light');
5
+ // Create a component that will throw an error when clicked
6
+ function BuggyComponent() {
7
+ const [shouldError, setShouldError] = useState(false);
8
+ if (shouldError) {
9
+ throw new Error("Test error from BuggyComponent");
10
+ }
11
+ return (<button onClick={() => setShouldError(true)} className="bg-red-600 text-white px-4 py-2 rounded mt-4 hover:bg-red-700">
12
+ Trigger Error
13
+ </button>);
14
+ }
15
+ function App() {
16
+ const [count, setCount] = useState(0);
17
+ const [theme, setTheme] = useState('light');
18
+ const renderCount = useRef(0);
19
+ const [error, resetError] = useErrorBoundary();
20
+ // Demonstrate useEffect
21
+ useEffect(() => {
22
+ document.title = `Count: ${count}`;
23
+ renderCount.current += 1;
24
+ return () => {
25
+ console.log('Cleanup effect');
26
+ };
27
+ }, [count]);
28
+ // Demonstrate useMemo
29
+ const doubled = useMemo(() => count * 2, [count]);
30
+ if (error) {
31
+ return (<div className="p-8 max-w-md mx-auto bg-red-50 rounded-lg shadow-lg">
32
+ <h1 className="text-2xl font-bold text-red-600 mb-4">Something went wrong!</h1>
33
+ <button onClick={resetError} className="bg-blue-500 hover:bg-blue-600 text-white px-4 py-2 rounded">
34
+ Try again
35
+ </button>
36
+ </div>);
37
+ }
38
+ return (<ThemeContext.Provider value={theme}>
39
+ <div className={`p-8 max-w-4xl mx-auto rounded-lg shadow-lg transition-colors ${theme === 'dark'
40
+ ? 'bg-gray-800 text-white'
41
+ : 'bg-white text-gray-900'}`}>
42
+ <h1 className="text-3xl font-bold mb-6">Welcome to Frontend Hamroun</h1>
43
+
44
+ <div className="mb-6">
45
+ <button onClick={() => setCount(count - 1)} className="bg-blue-500 hover:bg-blue-600 text-white px-4 py-2 rounded">-</button>
46
+ <span className="mx-4 text-xl">{count}</span>
47
+ <button onClick={() => setCount(count + 1)} className="bg-blue-500 hover:bg-blue-600 text-white px-4 py-2 rounded">+</button>
48
+ </div>
49
+
50
+ <p className="mb-2 text-lg">Doubled value: <span className="font-semibold">{doubled}</span></p>
51
+ <p className="mb-4 text-lg">Render count: <span className="font-semibold">{renderCount.current}</span></p>
52
+
53
+ <button onClick={() => setTheme(theme === 'light' ? 'dark' : 'light')} className={`px-4 py-2 rounded mb-8 ${theme === 'dark'
54
+ ? 'bg-yellow-400 text-gray-900 hover:bg-yellow-300'
55
+ : 'bg-gray-800 text-white hover:bg-gray-700'}`}>
56
+ Toggle Theme ({theme})
57
+ </button>
58
+
59
+ <div className="mt-8 border-t pt-6">
60
+ <h2 className="text-2xl font-bold mb-4">Test Error Boundary</h2>
61
+ <BuggyComponent />
62
+ </div>
63
+
64
+ <div className="mt-8 border-t pt-6">
65
+ <h2 className="text-2xl font-bold mb-4">Test Context</h2>
66
+ <ContextConsumer />
67
+ </div>
68
+ </div>
69
+ </ThemeContext.Provider>);
70
+ }
71
+ // Component to test context
72
+ function ContextConsumer() {
73
+ // Get the full context object for debugging
74
+ const themeContext = useContext(ThemeContext);
75
+ console.log('Theme context object:', themeContext);
76
+ // Access the current theme from the parent component instead
77
+ // This is a workaround until context is properly implemented
78
+ return (<div className={`mt-4 p-4 rounded-md border ${themeContext === 'dark' ? 'border-gray-600' : 'border-gray-300'}`}>
79
+ <p className="mb-2"><strong>Note:</strong> Context API needs a fix in the framework.</p>
80
+ <p className="mb-1">Context object type: {typeof themeContext}</p>
81
+ <p className="mb-4">Context object keys: {Object.keys(themeContext).join(', ') || 'none'}</p>
82
+
83
+ <button onClick={() => {
84
+ // Since we can't get the value directly from context,
85
+ // Let's add a button to demonstrate we can still use the Provider
86
+ const newTheme = document.body.style.backgroundColor === 'rgb(51, 51, 51)'
87
+ ? 'light' : 'dark';
88
+ console.log('Manually changing theme to:', newTheme);
89
+ // This won't work yet, but demonstrates the intent
90
+ if (ThemeContext) {
91
+ console.log('Provider exists, would set value to:', newTheme);
92
+ }
93
+ }} className="bg-purple-500 hover:bg-purple-600 text-white px-4 py-2 rounded">
94
+ Check Context Implementation
95
+ </button>
96
+ </div>);
97
+ }
98
+ render(<App />, document.getElementById('root'));
@@ -1,6 +1,5 @@
1
1
  import { render, useState, useEffect, useMemo, useRef, useErrorBoundary, createContext, useContext } from 'frontend-hamroun';
2
2
  import './main.css';
3
-
4
3
  // Create a theme context
5
4
  const ThemeContext = createContext<'light' | 'dark'>('light');
6
5