x4js 1.6.5 → 2.0.2

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 (292) hide show
  1. package/README.md +3 -14
  2. package/lib/README.txt +3 -14
  3. package/lib/esm/x4.css +1 -0
  4. package/lib/esm/x4.js +1 -0
  5. package/lib/src/assets/house-light.svg +1 -0
  6. package/lib/src/assets/radio.svg +4 -0
  7. package/lib/src/components/base.scss +26 -0
  8. package/lib/src/components/boxes/boxes.module.scss +37 -0
  9. package/lib/src/components/boxes/boxes.ts +125 -0
  10. package/lib/src/components/btngroup/btngroup.module.scss +29 -0
  11. package/lib/src/components/btngroup/btngroup.ts +106 -0
  12. package/lib/src/components/button/button.module.scss +154 -0
  13. package/lib/src/components/button/button.ts +117 -0
  14. package/lib/src/components/calendar/calendar-check-sharp-light.svg +1 -0
  15. package/lib/src/components/calendar/calendar.module.scss +163 -0
  16. package/lib/src/{calendar.ts → components/calendar/calendar.ts} +81 -83
  17. package/lib/src/components/calendar/chevron-left-sharp-light.svg +1 -0
  18. package/lib/src/components/calendar/chevron-right-sharp-light.svg +1 -0
  19. package/lib/src/components/checkbox/check.svg +4 -0
  20. package/lib/src/components/checkbox/checkbox.module.scss +142 -0
  21. package/lib/src/components/checkbox/checkbox.ts +125 -0
  22. package/lib/src/components/colorinput/colorinput.module.scss +65 -0
  23. package/lib/src/components/colorinput/colorinput.ts +88 -0
  24. package/lib/src/components/colorinput/crosshairs-simple-sharp-light.svg +1 -0
  25. package/lib/src/components/colorpicker/colorpicker.module.scss +133 -0
  26. package/lib/src/components/colorpicker/colorpicker.ts +477 -0
  27. package/lib/src/components/combobox/combobox.module.scss +121 -0
  28. package/lib/src/components/combobox/combobox.ts +190 -0
  29. package/lib/src/components/combobox/updown.svg +4 -0
  30. package/lib/src/components/dialog/dialog.module.scss +71 -0
  31. package/lib/src/components/dialog/dialog.ts +91 -0
  32. package/lib/src/components/dialog/xmark-sharp-light.svg +1 -0
  33. package/lib/src/components/form/form.module.scss +34 -0
  34. package/lib/src/components/form/form.ts +36 -0
  35. package/lib/src/components/header/header.module.scss +40 -0
  36. package/lib/src/components/header/header.ts +124 -0
  37. package/lib/src/components/icon/icon.module.scss +30 -0
  38. package/lib/src/components/icon/icon.ts +134 -0
  39. package/lib/src/components/image/image.module.scss +21 -0
  40. package/lib/src/components/image/image.ts +67 -0
  41. package/lib/src/components/input/input.module.scss +69 -0
  42. package/lib/src/components/input/input.ts +274 -0
  43. package/lib/src/components/label/label.module.scss +52 -0
  44. package/lib/src/components/label/label.ts +55 -0
  45. package/lib/src/components/listbox/listbox.module.scss +103 -0
  46. package/lib/src/components/listbox/listbox.ts +427 -0
  47. package/lib/src/components/menu/caret-right-solid.svg +1 -0
  48. package/lib/src/components/menu/menu.module.scss +108 -0
  49. package/lib/src/components/menu/menu.ts +168 -0
  50. package/lib/src/components/messages/circle-exclamation.svg +1 -0
  51. package/lib/src/components/messages/messages.module.scss +47 -0
  52. package/lib/src/components/messages/messages.ts +64 -0
  53. package/lib/src/components/normalize.scss +386 -0
  54. package/lib/src/components/notification/circle-check-solid.svg +1 -0
  55. package/lib/src/components/notification/circle-exclamation-solid.svg +1 -0
  56. package/lib/src/components/notification/circle-notch-light.svg +1 -0
  57. package/lib/src/components/notification/notification.module.scss +82 -0
  58. package/lib/src/components/notification/notification.ts +108 -0
  59. package/lib/src/components/notification/xmark-sharp-light.svg +1 -0
  60. package/lib/src/components/panel/panel.module.scss +48 -0
  61. package/lib/src/components/panel/panel.ts +57 -0
  62. package/lib/src/components/popup/popup.module.scss +43 -0
  63. package/lib/src/components/popup/popup.ts +395 -0
  64. package/lib/src/components/progress/progress.module.scss +57 -0
  65. package/lib/src/components/progress/progress.ts +43 -0
  66. package/lib/src/components/rating/rating.module.scss +23 -0
  67. package/lib/src/components/rating/rating.ts +125 -0
  68. package/lib/src/components/rating/star-sharp-light.svg +1 -0
  69. package/lib/src/components/rating/star-sharp-solid.svg +1 -0
  70. package/lib/src/components/shared.scss +76 -0
  71. package/lib/src/components/sizers/sizer.module.scss +90 -0
  72. package/lib/src/components/sizers/sizer.ts +120 -0
  73. package/lib/src/components/slider/slider.module.scss +71 -0
  74. package/lib/src/components/slider/slider.ts +143 -0
  75. package/lib/src/components/switch/switch.module.scss +127 -0
  76. package/lib/src/components/switch/switch.ts +56 -0
  77. package/lib/src/components/tabs/tabs.module.scss +46 -0
  78. package/lib/src/components/tabs/tabs.ts +157 -0
  79. package/lib/src/components/textarea/textarea.module.scss +59 -0
  80. package/lib/src/components/textarea/textarea.ts +54 -0
  81. package/lib/src/components/textedit/textedit.module.scss +114 -0
  82. package/lib/src/components/textedit/textedit.ts +82 -0
  83. package/lib/src/components/themes.scss +77 -0
  84. package/lib/src/components/tooltips/circle-info-sharp-light.svg +1 -0
  85. package/lib/src/components/tooltips/tooltips.scss +51 -0
  86. package/lib/src/components/tooltips/tooltips.ts +103 -0
  87. package/lib/src/components/treeview/chevron-down-light.svg +1 -0
  88. package/lib/src/components/treeview/treeview.module.scss +116 -0
  89. package/lib/src/components/treeview/treeview.ts +403 -0
  90. package/lib/src/components/viewport/viewport.module.scss +25 -0
  91. package/lib/src/components/viewport/viewport.ts +38 -0
  92. package/lib/src/core/component.ts +979 -0
  93. package/lib/src/core/core_colors.ts +250 -0
  94. package/lib/src/{dom_events.ts → core/core_dom.ts} +195 -39
  95. package/lib/src/{drag_manager.ts → core/core_dragdrop.ts} +29 -44
  96. package/lib/src/core/core_element.ts +98 -0
  97. package/lib/src/core/core_events.ts +149 -0
  98. package/lib/src/{i18n.ts → core/core_i18n.ts} +43 -42
  99. package/lib/src/{router.ts → core/core_router.ts} +27 -40
  100. package/lib/src/core/core_styles.ts +215 -0
  101. package/lib/src/core/core_svg.ts +550 -0
  102. package/lib/src/core/core_tools.ts +673 -0
  103. package/lib/src/demo/assets/house-light.svg +1 -0
  104. package/lib/src/demo/assets/radio.svg +4 -0
  105. package/lib/src/demo/index.html +12 -0
  106. package/lib/src/demo/main.scss +21 -0
  107. package/lib/src/demo/main.tsx +323 -0
  108. package/lib/src/main.scss +21 -0
  109. package/lib/src/main.tsx +323 -0
  110. package/lib/src/x4.scss +19 -0
  111. package/lib/src/x4.ts +60 -0
  112. package/lib/types/x4.d.ts +26548 -0
  113. package/package.json +68 -59
  114. package/scripts/build.mjs +351 -0
  115. package/scripts/prepack.mjs +43 -0
  116. package/src/components/base.scss +26 -0
  117. package/src/components/boxes/boxes.module.scss +37 -0
  118. package/src/components/boxes/boxes.ts +125 -0
  119. package/src/components/btngroup/btngroup.module.scss +29 -0
  120. package/src/components/btngroup/btngroup.ts +106 -0
  121. package/src/components/button/button.module.scss +154 -0
  122. package/src/components/button/button.ts +117 -0
  123. package/src/components/calendar/calendar-check-sharp-light.svg +1 -0
  124. package/src/components/calendar/calendar.module.scss +163 -0
  125. package/src/components/calendar/calendar.ts +326 -0
  126. package/src/components/calendar/chevron-left-sharp-light.svg +1 -0
  127. package/src/components/calendar/chevron-right-sharp-light.svg +1 -0
  128. package/src/components/checkbox/check.svg +4 -0
  129. package/src/components/checkbox/checkbox.module.scss +142 -0
  130. package/src/components/checkbox/checkbox.ts +125 -0
  131. package/src/components/colorinput/colorinput.module.scss +65 -0
  132. package/src/components/colorinput/colorinput.ts +88 -0
  133. package/src/components/colorinput/crosshairs-simple-sharp-light.svg +1 -0
  134. package/src/components/colorpicker/colorpicker.module.scss +133 -0
  135. package/src/components/colorpicker/colorpicker.ts +477 -0
  136. package/src/components/combobox/combobox.module.scss +121 -0
  137. package/src/components/combobox/combobox.ts +190 -0
  138. package/src/components/combobox/updown.svg +4 -0
  139. package/src/components/dialog/dialog.module.scss +71 -0
  140. package/src/components/dialog/dialog.ts +91 -0
  141. package/src/components/dialog/xmark-sharp-light.svg +1 -0
  142. package/src/components/form/form.module.scss +34 -0
  143. package/src/components/form/form.ts +36 -0
  144. package/src/components/header/header.module.scss +40 -0
  145. package/src/components/header/header.ts +124 -0
  146. package/src/components/icon/icon.module.scss +30 -0
  147. package/src/components/icon/icon.ts +134 -0
  148. package/src/components/image/image.module.scss +21 -0
  149. package/src/components/image/image.ts +67 -0
  150. package/src/components/input/input.module.scss +69 -0
  151. package/src/components/input/input.ts +274 -0
  152. package/src/components/label/label.module.scss +52 -0
  153. package/src/components/label/label.ts +55 -0
  154. package/src/components/listbox/listbox.module.scss +103 -0
  155. package/src/components/listbox/listbox.ts +427 -0
  156. package/src/components/menu/caret-right-solid.svg +1 -0
  157. package/src/components/menu/menu.module.scss +108 -0
  158. package/src/components/menu/menu.ts +168 -0
  159. package/src/components/messages/circle-exclamation.svg +1 -0
  160. package/src/components/messages/messages.module.scss +47 -0
  161. package/src/components/messages/messages.ts +64 -0
  162. package/src/components/normalize.scss +386 -0
  163. package/src/components/notification/circle-check-solid.svg +1 -0
  164. package/src/components/notification/circle-exclamation-solid.svg +1 -0
  165. package/src/components/notification/circle-notch-light.svg +1 -0
  166. package/src/components/notification/notification.module.scss +82 -0
  167. package/src/components/notification/notification.ts +108 -0
  168. package/src/components/notification/xmark-sharp-light.svg +1 -0
  169. package/src/components/panel/panel.module.scss +48 -0
  170. package/src/components/panel/panel.ts +57 -0
  171. package/src/components/popup/popup.module.scss +43 -0
  172. package/src/components/popup/popup.ts +395 -0
  173. package/src/components/progress/progress.module.scss +57 -0
  174. package/src/components/progress/progress.ts +43 -0
  175. package/src/components/rating/rating.module.scss +23 -0
  176. package/src/components/rating/rating.ts +125 -0
  177. package/src/components/rating/star-sharp-light.svg +1 -0
  178. package/src/components/rating/star-sharp-solid.svg +1 -0
  179. package/src/components/shared.scss +76 -0
  180. package/src/components/sizers/sizer.module.scss +90 -0
  181. package/src/components/sizers/sizer.ts +120 -0
  182. package/src/components/slider/slider.module.scss +71 -0
  183. package/src/components/slider/slider.ts +143 -0
  184. package/src/components/switch/switch.module.scss +127 -0
  185. package/src/components/switch/switch.ts +56 -0
  186. package/src/components/tabs/tabs.module.scss +46 -0
  187. package/src/components/tabs/tabs.ts +157 -0
  188. package/src/components/textarea/textarea.module.scss +59 -0
  189. package/src/components/textarea/textarea.ts +54 -0
  190. package/src/components/textedit/textedit.module.scss +114 -0
  191. package/src/components/textedit/textedit.ts +82 -0
  192. package/src/components/themes.scss +77 -0
  193. package/src/components/tooltips/circle-info-sharp-light.svg +1 -0
  194. package/src/components/tooltips/tooltips.scss +51 -0
  195. package/src/components/tooltips/tooltips.ts +103 -0
  196. package/src/components/treeview/chevron-down-light.svg +1 -0
  197. package/src/components/treeview/treeview.module.scss +116 -0
  198. package/src/components/treeview/treeview.ts +403 -0
  199. package/src/components/viewport/viewport.module.scss +25 -0
  200. package/src/components/viewport/viewport.ts +38 -0
  201. package/src/core/component.ts +979 -0
  202. package/src/core/core_colors.ts +250 -0
  203. package/src/core/core_dom.ts +471 -0
  204. package/src/core/core_dragdrop.ts +201 -0
  205. package/src/core/core_element.ts +98 -0
  206. package/src/core/core_events.ts +149 -0
  207. package/src/core/core_i18n.ts +377 -0
  208. package/src/core/core_router.ts +221 -0
  209. package/src/core/core_styles.ts +215 -0
  210. package/src/core/core_svg.ts +550 -0
  211. package/src/core/core_tools.ts +673 -0
  212. package/src/demo/assets/house-light.svg +1 -0
  213. package/src/demo/assets/radio.svg +4 -0
  214. package/src/demo/index.html +12 -0
  215. package/src/demo/main.scss +21 -0
  216. package/src/demo/main.tsx +323 -0
  217. package/src/x4.scss +19 -0
  218. package/src/x4.ts +60 -0
  219. package/tsconfig.json +14 -0
  220. package/types/scss.d.ts +4 -0
  221. package/types/svg.d.ts +4 -0
  222. package/types/x4react.d.ts +9 -0
  223. package/lib/changelog.txt +0 -23
  224. package/lib/cjs/x4js.js +0 -39
  225. package/lib/cjs/x4js.js.map +0 -7
  226. package/lib/esm/x4js.mjs +0 -15972
  227. package/lib/esm/x4js.mjs.map +0 -7
  228. package/lib/licence.md +0 -21
  229. package/lib/src/MIT-license.md +0 -14
  230. package/lib/src/action.ts +0 -88
  231. package/lib/src/alpha.jpg +0 -0
  232. package/lib/src/app_sockets.ts +0 -81
  233. package/lib/src/application.ts +0 -262
  234. package/lib/src/autocomplete.ts +0 -232
  235. package/lib/src/base64.ts +0 -166
  236. package/lib/src/base_component.ts +0 -152
  237. package/lib/src/button.ts +0 -355
  238. package/lib/src/canvas.ts +0 -510
  239. package/lib/src/cardview.ts +0 -228
  240. package/lib/src/checkbox.ts +0 -188
  241. package/lib/src/color.ts +0 -752
  242. package/lib/src/colorpicker.ts +0 -1649
  243. package/lib/src/combobox.ts +0 -512
  244. package/lib/src/component.ts +0 -2367
  245. package/lib/src/copyright.txt +0 -27
  246. package/lib/src/datastore.ts +0 -1302
  247. package/lib/src/dialog.ts +0 -656
  248. package/lib/src/drawtext.ts +0 -355
  249. package/lib/src/fileupload.ts +0 -213
  250. package/lib/src/form.ts +0 -413
  251. package/lib/src/formatters.ts +0 -105
  252. package/lib/src/gridview.ts +0 -1185
  253. package/lib/src/icon.ts +0 -362
  254. package/lib/src/image.ts +0 -225
  255. package/lib/src/index.ts +0 -89
  256. package/lib/src/input.ts +0 -297
  257. package/lib/src/label.ts +0 -153
  258. package/lib/src/layout.ts +0 -442
  259. package/lib/src/link.ts +0 -86
  260. package/lib/src/listview.ts +0 -765
  261. package/lib/src/md5.ts +0 -438
  262. package/lib/src/menu.ts +0 -425
  263. package/lib/src/messagebox.ts +0 -224
  264. package/lib/src/panel.ts +0 -86
  265. package/lib/src/popup.ts +0 -494
  266. package/lib/src/property_editor.ts +0 -337
  267. package/lib/src/radiobtn.ts +0 -197
  268. package/lib/src/rating.ts +0 -135
  269. package/lib/src/request.ts +0 -300
  270. package/lib/src/settings.ts +0 -77
  271. package/lib/src/sidebarview.ts +0 -108
  272. package/lib/src/spreadsheet.ts +0 -1449
  273. package/lib/src/styles.ts +0 -343
  274. package/lib/src/svgcomponent.ts +0 -592
  275. package/lib/src/tabbar.ts +0 -151
  276. package/lib/src/tabview.ts +0 -110
  277. package/lib/src/textarea.ts +0 -235
  278. package/lib/src/textedit.ts +0 -533
  279. package/lib/src/toaster.ts +0 -80
  280. package/lib/src/tools.ts +0 -1473
  281. package/lib/src/tooltips.ts +0 -191
  282. package/lib/src/treeview.ts +0 -716
  283. package/lib/src/version.ts +0 -30
  284. package/lib/src/x4.less +0 -2242
  285. package/lib/src/x4dom.ts +0 -57
  286. package/lib/src/x4events.ts +0 -585
  287. package/lib/src/x4js.ts +0 -89
  288. package/lib/src/x4react.ts +0 -90
  289. package/lib/styles/x4.css +0 -1785
  290. package/lib/styles/x4.less +0 -2242
  291. package/lib/types/x4js.d.ts +0 -6728
  292. package/license.md +0 -21
package/package.json CHANGED
@@ -1,59 +1,68 @@
1
- {
2
- "name": "x4js",
3
- "version": "1.6.5",
4
- "description": "X4js core files",
5
- "main": "lib/cjs/x4js.js",
6
- "types": "lib/types/x4js.d.ts",
7
- "style": "lib/x4.css",
8
- "files": [
9
- "lib/**/*"
10
- ],
11
- "repository": {
12
- "type": "git",
13
- "url": "git+https://github.com/rlibre/x4js.git"
14
- },
15
- "keywords": [
16
- "typescript",
17
- "framework",
18
- "sap",
19
- "web",
20
- "desktop",
21
- "application"
22
- ],
23
- "scripts": {
24
- "build": "node ./build.js",
25
- "build-dts": "dts-generator --project . --out lib/types/x4js.d.ts",
26
- "mkdoc": "typedoc --tsconfig tsconfig.json --readme none",
27
- "prepack": "node ./build.js"
28
- },
29
- "author": "etienne cochard",
30
- "license": "MIT",
31
- "bugs": {
32
- "url": "https://github.com/rlibre/x4js/issues"
33
- },
34
- "homepage": "https://x4js.org",
35
- "module": "lib/esm/x4js.js",
36
- "exports": {
37
- ".": {
38
- "import": {
39
- "types": "./lib/types/x4js.d.ts",
40
- "default": "./lib/esm/x4js.mjs"
41
- },
42
- "require": {
43
- "types": "./lib/types/x4js.d.ts",
44
- "default": "./lib/cjs/x4js.js"
45
- }
46
- }
47
- },
48
- "devDependencies": {
49
- "dts-generator": "^3.0.0",
50
- "esbuild": "^0.17.8",
51
- "fs-extra": "^11.1.0",
52
- "less": "^4.1.3",
53
- "typescript": "^4.9.5"
54
- },
55
- "dependencies": {
56
- "global": "^4.4.0",
57
- "typedoc": "^0.25.3"
58
- }
59
- }
1
+ {
2
+ "name": "x4js",
3
+ "version": "2.0.2",
4
+ "description": "X4 framework",
5
+ "author": "etienne cochard",
6
+ "main": "src/x4.js",
7
+ "types": "lib/types/x4.d.ts",
8
+ "license": "MIT",
9
+ "repository": {
10
+ "type": "git",
11
+ "url": "git+https://github.com/rlibre/x4.git"
12
+ },
13
+ "bugs": {
14
+ "url": "https://github.com/rlibre/x4/issues"
15
+ },
16
+ "keywords": [
17
+ "typescript",
18
+ "framework",
19
+ "sap",
20
+ "web",
21
+ "desktop",
22
+ "application"
23
+ ],
24
+ "scripts": {
25
+ "build": "node scripts/build.mjs --watch --hmr --serve",
26
+ "build-release": "node scripts/build.mjs --release",
27
+ "build-dts": "dts-generator --project . --out lib/types/x4.d.ts",
28
+ "prepack": "node scripts/prepack.mjs"
29
+ },
30
+ "homepage": "https://x4js.org",
31
+ "module": "lib/esm/x4js.js",
32
+ "exports": {
33
+ ".": {
34
+ "import": {
35
+ "types": "./lib/types/x4js.d.ts",
36
+ "default": "./lib/esm/x4js.mjs"
37
+ },
38
+ "require": {
39
+ "types": "./lib/types/x4js.d.ts",
40
+ "default": "./lib/cjs/x4js.js"
41
+ }
42
+ }
43
+ },
44
+ "devDependencies": {
45
+ "chalk": "^5.3.0",
46
+ "dts-generator": "^3.0.0",
47
+ "esbuild": "^0.24.0",
48
+ "esbuild-sass-plugin": "^3.3.1",
49
+ "typescript": "^5.6.2",
50
+ "watcher": "^2.3.1",
51
+ "ws": "^8.18.0"
52
+ },
53
+ "x4build": {
54
+ "entryPoints": [
55
+ "src/x4.ts"
56
+ ],
57
+ "outdir": "lib/esm",
58
+ "copy": [
59
+ {
60
+ "from": "src/assets",
61
+ "to": "assets"
62
+ }
63
+ ]
64
+ },
65
+ "dependencies": {
66
+ "@fontsource/montserrat": "^5.1.0"
67
+ }
68
+ }
@@ -0,0 +1,351 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * @file build.mjs
5
+ * @author Etienne Cochard
6
+ * @copyright (c) 2024 R-libre ingenierie, all rights reserved.
7
+ * @version 1.2
8
+ **/
9
+
10
+ import * as fs from "node:fs"
11
+ import * as path from "node:path"
12
+ import * as url from "node:url"
13
+ import * as http from "node:http"
14
+
15
+ import chalk from "chalk"
16
+ import esbuild from "esbuild"
17
+ import { WebSocketServer } from 'ws';
18
+ import Watcher from "watcher"
19
+
20
+ import { sassPlugin } from "esbuild-sass-plugin";
21
+ //import { hostname } from 'node:os'
22
+
23
+ console.log( chalk.green("\n\n-- X4Build 1.2 -------------------") );
24
+
25
+ const releaseMode = process.argv.some(a => a == "--release")
26
+ const hmrMode = process.argv.some(a => a == "--hmr") // hot module replacement
27
+ const watchMode = process.argv.some(a => a == "--watch" ) // watch modifications
28
+ const serveMode = process.argv.some(a => a == "--serve") // watch modifications
29
+
30
+
31
+ function readPackage() {
32
+
33
+ let cpath = process.cwd();
34
+
35
+ // check here
36
+ let pth = path.join(cpath, "package.json");
37
+ if (fs.existsSync(pth)) {
38
+ const raw = fs.readFileSync(pth, "utf-8");
39
+ return JSON.parse(raw);
40
+ }
41
+
42
+ throw new Error("cannot find package.json");
43
+ }
44
+
45
+ const def_settings = {
46
+ "entryPoints": ["src/main.ts"],
47
+ "outdir": "./bin",
48
+ "copy": [],
49
+ };
50
+
51
+ const pkg_settings = readPackage();
52
+ const settings = { ...def_settings, ...pkg_settings.x4build };
53
+
54
+ console.log( chalk.green(" release mode ..", releaseMode ) );
55
+ console.log( chalk.green(" hmr ...........", hmrMode ) );
56
+ console.log( chalk.green(" watching ......", watchMode ) );
57
+ console.log( chalk.green(" serve files ...", serveMode ) );
58
+ console.log( chalk.green(" output dir ....", settings.outdir ) );
59
+ console.log( chalk.green(" entry point ...", settings.entryPoints ) );
60
+ console.log( chalk.green(" copying .......", settings.copy ) );
61
+
62
+ console.log( chalk.green("----------------------------------") );
63
+
64
+
65
+
66
+
67
+ const js_hmr = ` // X4 Hot Module Replacement v1.1
68
+ {
69
+ const ws = new WebSocket( "ws://127.0.0.1:9998", "hmr" );
70
+
71
+ ws.onmessage = ( ev ) => {
72
+ if( ev.data=="reload-css" ) {
73
+ const gen_id = Date.now( );
74
+ document.querySelectorAll( "link[rel=stylesheet]").forEach( link => {
75
+ link.href = link.href.replace(/\\?.*|$/, "?" + gen_id)
76
+ } );
77
+ }
78
+ else {
79
+ location.reload();
80
+ }
81
+ }
82
+ }`
83
+
84
+ /** custom plugin to copy element after the build */
85
+
86
+ const post_plugin = {
87
+ name: 'post-cmd',
88
+ setup(build) {
89
+
90
+ build.onEnd(result => {
91
+ if (result.errors.length) {
92
+ console.error(`build ended with ${result.errors.length} errors`)
93
+ }
94
+ else {
95
+ settings.copy?.forEach((desc) => {
96
+ const { from, to } = desc;
97
+
98
+ if (fs.existsSync(from)) {
99
+ fs.cpSync(from, path.join(settings.outdir, to), { recursive: true });
100
+ }
101
+ });
102
+ }
103
+ })
104
+ },
105
+ }
106
+
107
+ let buildcnt = 1;
108
+
109
+ async function build() {
110
+
111
+ console.log(chalk.cyan(`building (${buildcnt++})...`));
112
+
113
+ try {
114
+ /** @type {esbuild.BuildOptions} */
115
+ const options = {
116
+ target: "node12",
117
+ logLevel: "error",
118
+ entryPoints: settings.entryPoints,
119
+ bundle: true,
120
+ charset: "utf8",
121
+ outdir: settings.outdir,
122
+ keepNames: true,
123
+ platform: "node",
124
+ format: "esm",
125
+ minify: releaseMode,
126
+ plugins: [
127
+ sassPlugin( {
128
+ type: "css",
129
+ filter: /\.scss$/,
130
+ }),
131
+ post_plugin
132
+ ],
133
+ assetNames: "assets/[name]-[hash]",
134
+ loader: {
135
+ ".svg": "dataurl",
136
+ ".jpg": "file",
137
+ ".png": "file",
138
+ ".woff": "file",
139
+ ".woff2": "file",
140
+ }
141
+ }
142
+
143
+ if (!releaseMode) {
144
+ options.sourcemap = "inline";
145
+ }
146
+
147
+ if (hmrMode) {
148
+ options.banner = { js: js_hmr }
149
+ }
150
+
151
+ await esbuild.build(options);
152
+ }
153
+ catch (e) {
154
+ console.error(chalk.bgRed.white("build failure, waiting for correction"));
155
+ console.log(e.message);
156
+ }
157
+ }
158
+
159
+ // :: WEBSOCKET SERVER FOR HRM ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
160
+
161
+ if (watchMode) {
162
+
163
+ const wsServer = new WebSocketServer({
164
+ port: 9998
165
+ });
166
+
167
+ // all connected clients (1)
168
+ const clients = [];
169
+
170
+ wsServer.on('connection', (ws) => {
171
+ clients.push(ws);
172
+
173
+ wsServer.on('error', (err) => {
174
+ });
175
+
176
+ wsServer.on('message', function message(data) {
177
+ console.log('received: %s', data);
178
+ });
179
+ });
180
+
181
+ const sendClientMessage = (msg) => {
182
+ clients.forEach(ws => {
183
+ ws.send(msg);
184
+ });
185
+ }
186
+
187
+ // file watcher ------------------------------------------
188
+ const selfPath = url.fileURLToPath(import.meta.url);
189
+ const cPath = process.cwd();
190
+
191
+ const watcher = new Watcher("./", {
192
+ recursive: true,
193
+ ignoreInitial: true,
194
+ ignore: (targetPath) => {
195
+ if (targetPath.startsWith(cPath)) {
196
+ targetPath = path.join(".", targetPath.substring(cPath.length));
197
+ targetPath = path.normalize(targetPath);
198
+ }
199
+
200
+ if (targetPath.startsWith("bin") || targetPath.startsWith("node_modules") ) {
201
+ //console.log("skip watch", targetPath);
202
+ return true;
203
+ }
204
+
205
+ return false;
206
+ }
207
+ });
208
+
209
+
210
+ watcher.on('all', async (event, targetPath, targetPathNext) => {
211
+
212
+ if (event == "change" || event == "add") {
213
+ // one of our copy path ?
214
+ if (targetPath.startsWith(cPath)) {
215
+ let pth = "." + targetPath.substring(cPath.length);
216
+ pth = path.normalize(pth);
217
+
218
+ //console.log( targetPath );
219
+ if (settings.copy?.some(desc => {
220
+ const from = path.normalize(desc.from);
221
+ if (pth == from || pth.startsWith(from)) {
222
+ return true;
223
+ }
224
+ })) {
225
+ await build();
226
+ return;
227
+ }
228
+ }
229
+ }
230
+
231
+ if (event == "change") {
232
+ // somebody changed this file, so leave
233
+ if (targetPath == selfPath) {
234
+ process.exit(0);
235
+ }
236
+
237
+ // depending of the extension, we send the correct type of refresh
238
+ switch (path.extname(targetPath)) {
239
+ case ".svg":
240
+ case ".css":
241
+ case ".scss": {
242
+ await build();
243
+ sendClientMessage("reload-css");
244
+ break;
245
+ }
246
+
247
+ case ".html":
248
+ case ".ts":
249
+ case ".js":
250
+ case ".jsx":
251
+ case ".tsx": {
252
+ await build();
253
+ sendClientMessage("reload-js");
254
+ break;
255
+ }
256
+
257
+ case ".json": {
258
+ if (path.basename(targetPath) == 'package.json') {
259
+ build();
260
+ }
261
+ break;
262
+ }
263
+ }
264
+
265
+ //console.log ( event ); // => could be any target event: 'add', 'addDir', 'change', 'rename', 'renameDir', 'unlink' or 'unlinkDir'
266
+ //console.log ( targetPath ); // => the file system path where the event took place, this is always provided
267
+ }
268
+ });
269
+ }
270
+
271
+ // :: WEB SERVER ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
272
+
273
+ function serve() {
274
+
275
+ // maps file extention to MIME types
276
+ // full list can be found here: https://www.freeformatter.com/mime-types-list.html
277
+ const mimeType = {
278
+ '.ico': 'image/x-icon',
279
+ '.html': 'text/html',
280
+ '.js': 'text/javascript',
281
+ '.json': 'application/json',
282
+ '.css': 'text/css',
283
+ '.png': 'image/png',
284
+ '.jpg': 'image/jpeg',
285
+ '.wav': 'audio/wav',
286
+ '.mp3': 'audio/mpeg',
287
+ '.svg': 'image/svg+xml',
288
+ '.pdf': 'application/pdf',
289
+ '.zip': 'application/zip',
290
+ '.doc': 'application/msword',
291
+ '.eot': 'application/vnd.ms-fontobject',
292
+ '.ttf': 'application/x-font-ttf',
293
+ };
294
+
295
+ const server = http.createServer( {
296
+ hostname: "127.0.0.1"
297
+ });
298
+
299
+ server.on('request', (req, res) => {
300
+ //console.log(`${req.method} ${req.url}`);
301
+
302
+ // parse URL
303
+ const parsedUrl = url.parse(req.url);
304
+
305
+ // extract URL path
306
+ // Avoid https://en.wikipedia.org/wiki/Directory_traversal_attack
307
+ // e.g curl --path-as-is http://localhost:9000/../fileInDanger.txt
308
+ // by limiting the path to current directory only
309
+ const sanitizePath = path.normalize(parsedUrl.pathname).replace(/^(\.\.[\/\\])+/, '');
310
+ let pathname = path.join(settings.outdir, sanitizePath);
311
+
312
+ if( fs.existsSync(pathname) ) {
313
+ // if is a directory, then look for index.html
314
+ if (fs.statSync(pathname).isDirectory()) {
315
+ pathname = path.join( pathname, 'index.html' );
316
+ }
317
+
318
+ // read file from file system
319
+ fs.readFile(pathname, function (err, data) {
320
+ if (err) {
321
+ res.statusCode = 500;
322
+ res.end(`Error getting the file: ${err}.`);
323
+ }
324
+ else {
325
+ // based on the URL path, extract the file extention. e.g. .js, .doc, ...
326
+ const ext = path.parse(pathname).ext;
327
+ // if the file is found, set Content-type and send data
328
+ res.setHeader('Content-type', mimeType[ext] || 'text/plain');
329
+ res.end(data);
330
+ }
331
+ });
332
+ }
333
+ else {
334
+ // if the file is not found, return 404
335
+ res.statusCode = 404;
336
+ res.end(`File ${pathname} not found!`);
337
+ return;
338
+ }
339
+ });
340
+
341
+ server.listen(3000);
342
+ console.log( chalk.yellow("listening on http://127.0.0.1:3000") );
343
+ }
344
+
345
+ build();
346
+
347
+ if( serveMode ) {
348
+ serve();
349
+ }
350
+
351
+
@@ -0,0 +1,43 @@
1
+ import * as fs from 'node:fs';
2
+ import * as path from "node:path"
3
+ import chalk from "chalk"
4
+
5
+ import { execSync } from "node:child_process";
6
+
7
+ function readPackage() {
8
+
9
+ let cpath = process.cwd();
10
+
11
+ // check here
12
+ let pth = path.join(cpath, "package.json");
13
+ if (fs.existsSync(pth)) {
14
+ const raw = fs.readFileSync(pth, "utf-8");
15
+ return JSON.parse(raw);
16
+ }
17
+
18
+ throw new Error("cannot find package.json");
19
+ }
20
+
21
+ async function main( ) {
22
+
23
+ const pkg = readPackage( );
24
+
25
+ console.log( chalk.yellow("-- prepack ------------------------"))
26
+
27
+ console.log( chalk.green("building...") );
28
+ execSync( pkg.scripts["build-release" ]);
29
+
30
+ console.log( chalk.green("creating .d.ts...") );
31
+ execSync( `npx ${pkg.scripts["build-dts"]}` );
32
+
33
+ console.log( chalk.green("copying dependencies...") );
34
+ fs.mkdirSync( 'lib/src', { recursive: true} );
35
+ fs.mkdirSync( 'lib/types', { recursive: true} );
36
+
37
+ fs.cpSync( 'src/', 'lib/src/', { recursive: true} );
38
+ fs.cpSync( 'README.md', 'lib/README.txt' );
39
+
40
+ console.log( chalk.yellow("-----------------------------------"))
41
+ }
42
+
43
+ main( );
@@ -0,0 +1,26 @@
1
+ /**
2
+ * ___ ___ __
3
+ * \ \/ / / _
4
+ * \ / /_| |_
5
+ * / \____ _|
6
+ * /__/\__\ |_|
7
+ *
8
+ * @file base.scss
9
+ * @author Etienne Cochard
10
+ *
11
+ * @copyright (c) 2024 R-libre ingenierie
12
+ *
13
+ * Use of this source code is governed by an MIT-style license
14
+ * that can be found in the LICENSE file or at https://opensource.org/licenses/MIT.
15
+ **/
16
+
17
+ @use "./shared.scss";
18
+
19
+ .x4box {
20
+ @extend .box;
21
+ }
22
+
23
+ .x4flex {
24
+ @extend .flex;
25
+ }
26
+
@@ -0,0 +1,37 @@
1
+ /**
2
+ * ___ ___ __
3
+ * \ \/ / / _
4
+ * \ / /_| |_
5
+ * / \____ _|
6
+ * /__/\__\ |_|
7
+ *
8
+ * @file boxes.module.scss
9
+ * @author Etienne Cochard
10
+ *
11
+ * @copyright (c) 2024 R-libre ingenierie
12
+ *
13
+ * Use of this source code is governed by an MIT-style license
14
+ * that can be found in the LICENSE file or at https://opensource.org/licenses/MIT.
15
+ **/
16
+
17
+ @use "../shared.scss";
18
+
19
+ .x4hbox {
20
+ @extend .hbox;
21
+ }
22
+
23
+ .x4vbox {
24
+ @extend .vbox;
25
+ }
26
+
27
+ .x4stackbox {
28
+ &>* {
29
+ @extend .fit;
30
+ position: relative !important;
31
+ }
32
+
33
+ &>*:not(.selected) {
34
+ display: none;
35
+ }
36
+ }
37
+