cyberia 3.2.5 → 3.2.12

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 (381) hide show
  1. package/.github/workflows/engine-cyberia.cd.yml +8 -2
  2. package/.github/workflows/npmpkg.ci.yml +1 -0
  3. package/.github/workflows/pwa-microservices-template-test.ci.yml +1 -1
  4. package/.github/workflows/release.cd.yml +2 -2
  5. package/.vscode/extensions.json +9 -9
  6. package/.vscode/settings.json +20 -4
  7. package/CHANGELOG.md +563 -1
  8. package/CLI-HELP.md +130 -34
  9. package/Dockerfile +0 -4
  10. package/README.md +194 -607
  11. package/bin/build.js +42 -12
  12. package/bin/build.template.js +187 -0
  13. package/bin/cyberia.js +1367 -281
  14. package/bin/deploy.js +582 -3
  15. package/bin/index.js +1367 -281
  16. package/bump.config.js +26 -0
  17. package/conf.js +195 -111
  18. package/deployment.yaml +6 -222
  19. package/hardhat/package-lock.json +118 -149
  20. package/hardhat/package.json +5 -4
  21. package/jsconfig.json +1 -1
  22. package/manifests/cronjobs/dd-cron/dd-cron-backup.yaml +2 -2
  23. package/manifests/cronjobs/dd-cron/dd-cron-dns.yaml +2 -2
  24. package/manifests/deployment/dd-cyberia-development/deployment.yaml +6 -222
  25. package/manifests/deployment/dd-cyberia-development/proxy.yaml +10 -118
  26. package/manifests/deployment/dd-default-development/deployment.yaml +2 -6
  27. package/manifests/deployment/dd-test-development/deployment.yaml +138 -66
  28. package/manifests/deployment/dd-test-development/proxy.yaml +41 -5
  29. package/manifests/kind-config-dev.yaml +8 -0
  30. package/manifests/lxd/lxd-admin-profile.yaml +12 -3
  31. package/manifests/mongodb/pv-pvc.yaml +44 -8
  32. package/manifests/mongodb/statefulset.yaml +55 -68
  33. package/manifests/mongodb-4.4/headless-service.yaml +10 -0
  34. package/manifests/mongodb-4.4/kustomization.yaml +3 -1
  35. package/manifests/mongodb-4.4/mongodb-nodeport.yaml +17 -0
  36. package/manifests/mongodb-4.4/pv-pvc.yaml +10 -14
  37. package/manifests/mongodb-4.4/statefulset.yaml +79 -0
  38. package/manifests/mongodb-4.4/storage-class.yaml +9 -0
  39. package/manifests/valkey/statefulset.yaml +1 -1
  40. package/manifests/valkey/valkey-nodeport.yaml +17 -0
  41. package/package.json +45 -24
  42. package/proxy.yaml +10 -118
  43. package/scripts/ipxe-setup.sh +52 -49
  44. package/scripts/k3s-node-setup.sh +83 -48
  45. package/scripts/lxd-vm-setup.sh +193 -8
  46. package/scripts/maas-nat-firewalld.sh +145 -0
  47. package/scripts/nat-iptables.sh +103 -18
  48. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.controller.js +18 -18
  49. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.model.js +7 -14
  50. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.router.js +38 -33
  51. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.service.js +91 -36
  52. package/src/api/core/core.controller.js +10 -10
  53. package/src/api/core/core.router.js +19 -14
  54. package/src/api/core/core.service.js +15 -15
  55. package/src/api/crypto/crypto.controller.js +8 -8
  56. package/src/api/crypto/crypto.router.js +18 -12
  57. package/src/api/crypto/crypto.service.js +11 -11
  58. package/src/api/cyberia-action/cyberia-action.controller.js +74 -0
  59. package/src/api/cyberia-action/cyberia-action.model.js +87 -0
  60. package/src/api/cyberia-action/cyberia-action.router.js +31 -0
  61. package/src/api/cyberia-action/cyberia-action.service.js +42 -0
  62. package/src/api/cyberia-client-hints/cyberia-client-hints.controller.js +74 -0
  63. package/src/api/cyberia-client-hints/cyberia-client-hints.model.js +99 -0
  64. package/src/api/cyberia-client-hints/cyberia-client-hints.router.js +98 -0
  65. package/src/api/cyberia-client-hints/cyberia-client-hints.service.js +152 -0
  66. package/src/api/cyberia-dialogue/cyberia-dialogue.controller.js +13 -13
  67. package/src/api/cyberia-dialogue/cyberia-dialogue.model.js +11 -11
  68. package/src/api/cyberia-dialogue/cyberia-dialogue.router.js +25 -20
  69. package/src/api/cyberia-dialogue/cyberia-dialogue.service.js +22 -22
  70. package/src/api/cyberia-entity/cyberia-entity.controller.js +10 -10
  71. package/src/api/cyberia-entity/cyberia-entity.router.js +22 -18
  72. package/src/api/cyberia-entity/cyberia-entity.service.js +15 -15
  73. package/src/api/cyberia-instance/cyberia-fallback-world.js +83 -198
  74. package/src/api/cyberia-instance/cyberia-instance.controller.js +14 -14
  75. package/src/api/cyberia-instance/cyberia-instance.model.js +3 -0
  76. package/src/api/cyberia-instance/cyberia-instance.router.js +57 -52
  77. package/src/api/cyberia-instance/cyberia-instance.service.js +32 -67
  78. package/src/api/cyberia-instance/cyberia-portal-connector.js +20 -246
  79. package/src/api/cyberia-instance/cyberia-world-generator.js +505 -0
  80. package/src/api/cyberia-instance-conf/cyberia-instance-conf.controller.js +10 -10
  81. package/src/api/cyberia-instance-conf/cyberia-instance-conf.model.js +18 -49
  82. package/src/api/cyberia-instance-conf/cyberia-instance-conf.router.js +22 -18
  83. package/src/api/cyberia-instance-conf/cyberia-instance-conf.service.js +19 -15
  84. package/src/api/cyberia-map/cyberia-map.controller.js +10 -10
  85. package/src/api/cyberia-map/cyberia-map.router.js +35 -30
  86. package/src/api/cyberia-map/cyberia-map.service.js +17 -17
  87. package/src/api/cyberia-quest/cyberia-quest.controller.js +74 -0
  88. package/src/api/cyberia-quest/cyberia-quest.model.js +67 -0
  89. package/src/api/cyberia-quest/cyberia-quest.router.js +31 -0
  90. package/src/api/cyberia-quest/cyberia-quest.service.js +42 -0
  91. package/src/api/cyberia-quest-progress/cyberia-quest-progress.controller.js +74 -0
  92. package/src/api/cyberia-quest-progress/cyberia-quest-progress.model.js +49 -0
  93. package/src/api/cyberia-quest-progress/cyberia-quest-progress.router.js +31 -0
  94. package/src/api/cyberia-quest-progress/cyberia-quest-progress.service.js +42 -0
  95. package/src/api/cyberia-server-defaults/cyberia-server-defaults.js +451 -0
  96. package/src/api/default/default.controller.js +10 -10
  97. package/src/api/default/default.router.js +22 -18
  98. package/src/api/default/default.service.js +15 -15
  99. package/src/api/document/document.controller.js +12 -12
  100. package/src/api/document/document.model.js +10 -16
  101. package/src/api/document/document.router.js +28 -23
  102. package/src/api/document/document.service.js +100 -23
  103. package/src/api/file/file.controller.js +8 -8
  104. package/src/api/file/file.model.js +10 -10
  105. package/src/api/file/file.router.js +19 -13
  106. package/src/api/file/file.service.js +45 -43
  107. package/src/api/instance/instance.controller.js +10 -10
  108. package/src/api/instance/instance.model.js +4 -10
  109. package/src/api/instance/instance.router.js +29 -24
  110. package/src/api/instance/instance.service.js +16 -16
  111. package/src/api/ipfs/ipfs.controller.js +12 -12
  112. package/src/api/ipfs/ipfs.model.js +4 -13
  113. package/src/api/ipfs/ipfs.router.js +21 -16
  114. package/src/api/ipfs/ipfs.service.js +22 -36
  115. package/src/api/object-layer/object-layer.controller.js +12 -12
  116. package/src/api/object-layer/object-layer.model.js +4 -17
  117. package/src/api/object-layer/object-layer.router.js +512 -507
  118. package/src/api/object-layer/object-layer.service.js +29 -26
  119. package/src/api/object-layer-render-frames/object-layer-render-frames.controller.js +10 -10
  120. package/src/api/object-layer-render-frames/object-layer-render-frames.model.js +6 -16
  121. package/src/api/object-layer-render-frames/object-layer-render-frames.router.js +22 -18
  122. package/src/api/object-layer-render-frames/object-layer-render-frames.service.js +19 -15
  123. package/src/api/test/test.controller.js +8 -8
  124. package/src/api/test/test.router.js +17 -12
  125. package/src/api/test/test.service.js +8 -8
  126. package/src/api/types.js +24 -0
  127. package/src/api/user/guest.service.js +100 -0
  128. package/src/api/user/user.controller.js +6 -6
  129. package/src/api/user/user.model.js +8 -13
  130. package/src/api/user/user.router.js +297 -288
  131. package/src/api/user/user.service.js +103 -55
  132. package/src/cli/baremetal.js +132 -101
  133. package/src/cli/cluster.js +732 -217
  134. package/src/cli/db.js +106 -62
  135. package/src/cli/deploy.js +260 -149
  136. package/src/cli/fs.js +90 -9
  137. package/src/cli/image.js +43 -1
  138. package/src/cli/index.js +106 -16
  139. package/src/cli/ipfs.js +4 -6
  140. package/src/cli/kubectl.js +4 -1
  141. package/src/cli/lxd.js +1099 -223
  142. package/src/cli/monitor.js +9 -3
  143. package/src/cli/release.js +336 -86
  144. package/src/cli/repository.js +136 -53
  145. package/src/cli/run.js +599 -76
  146. package/src/cli/secrets.js +11 -2
  147. package/src/cli/ssh.js +1 -1
  148. package/src/cli/static.js +43 -115
  149. package/src/cli/test.js +9 -3
  150. package/src/client/Cryptokoyn.index.js +18 -21
  151. package/src/client/CyberiaPortal.index.js +19 -23
  152. package/src/client/Default.index.js +30 -36
  153. package/src/client/Itemledger.index.js +20 -26
  154. package/src/client/Underpost.index.js +19 -23
  155. package/src/client/components/core/404.js +4 -4
  156. package/src/client/components/core/500.js +4 -4
  157. package/src/client/components/core/Account.js +73 -60
  158. package/src/client/components/core/AgGrid.js +23 -33
  159. package/src/client/components/core/Alert.js +12 -13
  160. package/src/client/components/core/AppStore.js +1 -1
  161. package/src/client/components/core/Auth.js +40 -37
  162. package/src/client/components/core/Badge.js +7 -13
  163. package/src/client/components/core/BtnIcon.js +15 -17
  164. package/src/client/components/core/CalendarCore.js +42 -63
  165. package/src/client/components/core/Chat.js +13 -15
  166. package/src/client/components/core/ClientEvents.js +163 -0
  167. package/src/client/components/core/ColorPaletteElement.js +309 -0
  168. package/src/client/components/core/Content.js +17 -14
  169. package/src/client/components/core/Css.js +15 -71
  170. package/src/client/components/core/CssCore.js +12 -16
  171. package/src/client/components/core/D3Chart.js +4 -4
  172. package/src/client/components/core/Docs.js +64 -91
  173. package/src/client/components/core/DropDown.js +69 -91
  174. package/src/client/components/core/EventBus.js +96 -0
  175. package/src/client/components/core/EventsUI.js +14 -17
  176. package/src/client/components/core/FileExplorer.js +96 -228
  177. package/src/client/components/core/FullScreen.js +47 -75
  178. package/src/client/components/core/Input.js +24 -69
  179. package/src/client/components/core/Keyboard.js +25 -18
  180. package/src/client/components/core/KeyboardAvoidance.js +145 -0
  181. package/src/client/components/core/LoadingAnimation.js +25 -31
  182. package/src/client/components/core/LogIn.js +41 -41
  183. package/src/client/components/core/LogOut.js +23 -14
  184. package/src/client/components/core/Modal.js +544 -219
  185. package/src/client/components/core/NotificationManager.js +14 -18
  186. package/src/client/components/core/Panel.js +54 -50
  187. package/src/client/components/core/PanelForm.js +81 -177
  188. package/src/client/components/core/Polyhedron.js +110 -214
  189. package/src/client/components/core/PublicProfile.js +39 -32
  190. package/src/client/components/core/Recover.js +48 -44
  191. package/src/client/components/core/Responsive.js +88 -32
  192. package/src/client/components/core/RichText.js +9 -18
  193. package/src/client/components/core/Router.js +24 -3
  194. package/src/client/components/core/SearchBox.js +37 -37
  195. package/src/client/components/core/SignUp.js +39 -30
  196. package/src/client/components/core/SocketIo.js +31 -2
  197. package/src/client/components/core/SocketIoHandler.js +6 -6
  198. package/src/client/components/core/ToggleSwitch.js +8 -20
  199. package/src/client/components/core/ToolTip.js +5 -17
  200. package/src/client/components/core/Translate.js +56 -59
  201. package/src/client/components/core/Validator.js +26 -16
  202. package/src/client/components/core/Wallet.js +15 -26
  203. package/src/client/components/core/Worker.js +211 -276
  204. package/src/client/components/core/windowGetDimensions.js +7 -7
  205. package/src/client/components/cryptokoyn/{MenuCryptokoyn.js → AppShellCryptokoyn.js} +57 -57
  206. package/src/client/components/cryptokoyn/CssCryptokoyn.js +15 -15
  207. package/src/client/components/cryptokoyn/LogInCryptokoyn.js +6 -4
  208. package/src/client/components/cryptokoyn/LogOutCryptokoyn.js +6 -4
  209. package/src/client/components/cryptokoyn/RouterCryptokoyn.js +37 -0
  210. package/src/client/components/cryptokoyn/SettingsCryptokoyn.js +4 -4
  211. package/src/client/components/cryptokoyn/SignUpCryptokoyn.js +6 -4
  212. package/src/client/components/cyberia/InstanceEngineCyberia.js +141 -60
  213. package/src/client/components/cyberia/MapEngineCyberia.js +691 -214
  214. package/src/client/components/cyberia/ObjectLayerEngine.js +19 -0
  215. package/src/client/components/cyberia/ObjectLayerEngineModal.js +1204 -94
  216. package/src/client/components/cyberia/ObjectLayerEngineViewer.js +196 -298
  217. package/src/client/components/cyberia/SharedDefaultsCyberia.js +330 -0
  218. package/src/client/components/cyberia-portal/{MenuCyberiaPortal.js → AppShellCyberiaPortal.js} +102 -102
  219. package/src/client/components/cyberia-portal/CssCyberiaPortal.js +15 -15
  220. package/src/client/components/cyberia-portal/LogInCyberiaPortal.js +6 -4
  221. package/src/client/components/cyberia-portal/LogOutCyberiaPortal.js +6 -4
  222. package/src/client/components/cyberia-portal/MainBodyCyberiaPortal.js +4 -4
  223. package/src/client/components/cyberia-portal/RouterCyberiaPortal.js +60 -0
  224. package/src/client/components/cyberia-portal/SettingsCyberiaPortal.js +4 -4
  225. package/src/client/components/cyberia-portal/SignUpCyberiaPortal.js +6 -4
  226. package/src/client/components/cyberia-portal/TranslateCyberiaPortal.js +4 -4
  227. package/src/client/components/default/{MenuDefault.js → AppShellDefault.js} +87 -87
  228. package/src/client/components/default/CssDefault.js +12 -12
  229. package/src/client/components/default/LogInDefault.js +6 -4
  230. package/src/client/components/default/LogOutDefault.js +6 -4
  231. package/src/client/components/default/RouterDefault.js +47 -0
  232. package/src/client/components/default/SettingsDefault.js +4 -4
  233. package/src/client/components/default/SignUpDefault.js +6 -4
  234. package/src/client/components/default/TranslateDefault.js +3 -3
  235. package/src/client/components/itemledger/{MenuItemledger.js → AppShellItemledger.js} +57 -57
  236. package/src/client/components/itemledger/CssItemledger.js +15 -15
  237. package/src/client/components/itemledger/LogInItemledger.js +6 -4
  238. package/src/client/components/itemledger/LogOutItemledger.js +6 -4
  239. package/src/client/components/itemledger/RouterItemledger.js +38 -0
  240. package/src/client/components/itemledger/SettingsItemledger.js +4 -4
  241. package/src/client/components/itemledger/SignUpItemledger.js +6 -4
  242. package/src/client/components/itemledger/TranslateItemledger.js +3 -3
  243. package/src/client/components/underpost/{MenuUnderpost.js → AppShellUnderpost.js} +88 -88
  244. package/src/client/components/underpost/CssUnderpost.js +14 -14
  245. package/src/client/components/underpost/CyberpunkBloggerUnderpost.js +4 -4
  246. package/src/client/components/underpost/DocumentSearchProvider.js +1 -1
  247. package/src/client/components/underpost/LabGalleryUnderpost.js +12 -15
  248. package/src/client/components/underpost/LogInUnderpost.js +6 -4
  249. package/src/client/components/underpost/LogOutUnderpost.js +6 -4
  250. package/src/client/components/underpost/RouterUnderpost.js +45 -0
  251. package/src/client/components/underpost/SettingsUnderpost.js +4 -4
  252. package/src/client/components/underpost/SignUpUnderpost.js +6 -4
  253. package/src/client/components/underpost/TranslateUnderpost.js +4 -4
  254. package/src/client/public/cyberia-docs/ACTION-SYSTEM.md +235 -0
  255. package/src/client/public/cyberia-docs/ARCHITECTURE.md +83 -0
  256. package/src/client/public/cyberia-docs/CYBERIA-CLI.md +204 -0
  257. package/src/client/public/cyberia-docs/CYBERIA-CLIENT.md +291 -0
  258. package/src/client/public/cyberia-docs/CYBERIA-SERVER.md +278 -0
  259. package/src/client/public/cyberia-docs/CYBERIA.md +259 -0
  260. package/src/client/public/cyberia-docs/ENTITY-PROFILE.md +241 -0
  261. package/src/client/public/cyberia-docs/HARDHAT-MODULE.md +300 -0
  262. package/src/client/public/cyberia-docs/OFF-CHAIN-ECONOMY.md +279 -0
  263. package/src/client/public/cyberia-docs/QUEST-SYSTEM.md +206 -0
  264. package/src/client/public/cyberia-docs/ROADMAP.md +240 -0
  265. package/src/client/public/cyberia-docs/UNDERPOST-PLATFORM.md +106 -0
  266. package/src/client/public/cyberia-docs/WHITE-PAPER.md +732 -0
  267. package/src/client/services/atlas-sprite-sheet/atlas-sprite-sheet.service.js +14 -20
  268. package/src/client/services/core/core.service.js +17 -49
  269. package/src/client/services/crypto/crypto.service.js +8 -13
  270. package/src/client/services/cyberia-action/cyberia-action.service.js +99 -0
  271. package/src/client/services/cyberia-client-hints/cyberia-client-hints.service.js +99 -0
  272. package/src/client/services/cyberia-dialogue/cyberia-dialogue.service.js +10 -16
  273. package/src/client/services/cyberia-entity/cyberia-entity.management.js +5 -5
  274. package/src/client/services/cyberia-entity/cyberia-entity.service.js +10 -16
  275. package/src/client/services/cyberia-instance/cyberia-instance.management.js +6 -6
  276. package/src/client/services/cyberia-instance/cyberia-instance.service.js +12 -18
  277. package/src/client/services/cyberia-instance-conf/cyberia-instance-conf.service.js +10 -16
  278. package/src/client/services/cyberia-map/cyberia-map.management.js +6 -6
  279. package/src/client/services/cyberia-map/cyberia-map.service.js +12 -18
  280. package/src/client/services/cyberia-quest/cyberia-quest.service.js +99 -0
  281. package/src/client/services/cyberia-quest-progress/cyberia-quest-progress.service.js +99 -0
  282. package/src/client/services/default/default.management.js +159 -267
  283. package/src/client/services/default/default.service.js +10 -16
  284. package/src/client/services/document/document.service.js +14 -19
  285. package/src/client/services/file/file.service.js +8 -13
  286. package/src/client/services/instance/instance.management.js +5 -5
  287. package/src/client/services/instance/instance.service.js +10 -15
  288. package/src/client/services/ipfs/ipfs.service.js +12 -18
  289. package/src/client/services/object-layer/object-layer.management.js +12 -12
  290. package/src/client/services/object-layer/object-layer.service.js +20 -26
  291. package/src/client/services/object-layer-render-frames/object-layer-render-frames.service.js +10 -16
  292. package/src/client/services/test/test.service.js +8 -13
  293. package/src/client/services/user/guest.service.js +86 -0
  294. package/src/client/services/user/user.management.js +5 -5
  295. package/src/client/services/user/user.service.js +14 -20
  296. package/src/client/ssr/body/404.js +3 -3
  297. package/src/client/ssr/body/500.js +3 -3
  298. package/src/client/ssr/body/CacheControl.js +5 -2
  299. package/src/client/ssr/body/DefaultSplashScreen.js +19 -12
  300. package/src/client/ssr/body/UnderpostDefaultSplashScreen.js +13 -6
  301. package/src/client/ssr/head/PwaItemledger.js +197 -60
  302. package/src/client/ssr/mailer/DefaultRecoverEmail.js +19 -20
  303. package/src/client/ssr/mailer/DefaultVerifyEmail.js +15 -16
  304. package/src/client/ssr/views/CyberiaServerMetrics.js +982 -0
  305. package/src/client/ssr/{offline → views}/Maintenance.js +12 -11
  306. package/src/client/ssr/{offline → views}/NoNetworkConnection.js +3 -3
  307. package/src/client/ssr/{pages → views}/Test.js +2 -2
  308. package/src/client/sw/core.sw.js +274 -0
  309. package/src/db/DataBaseProvider.js +115 -15
  310. package/src/db/mariadb/MariaDB.js +2 -1
  311. package/src/db/mongo/MongoBootstrap.js +657 -0
  312. package/src/db/mongo/MongooseDB.js +129 -21
  313. package/src/grpc/cyberia/grpc-server.js +185 -105
  314. package/src/index.js +1 -1
  315. package/src/runtime/cyberia-client/Dockerfile +101 -0
  316. package/src/runtime/cyberia-client/Dockerfile.dev +82 -0
  317. package/src/runtime/cyberia-server/Dockerfile +62 -0
  318. package/src/runtime/cyberia-server/Dockerfile.dev +71 -0
  319. package/src/runtime/express/Dockerfile +4 -4
  320. package/src/runtime/express/Express.js +2 -2
  321. package/src/runtime/lampp/Dockerfile +8 -7
  322. package/src/runtime/wp/Dockerfile +11 -17
  323. package/src/runtime/wp/Wp.js +8 -5
  324. package/src/server/atlas-sprite-sheet-generator.js +4 -2
  325. package/src/server/auth.js +2 -2
  326. package/src/server/client-build-docs.js +46 -47
  327. package/src/server/client-build.js +371 -132
  328. package/src/server/client-formatted.js +47 -16
  329. package/src/server/conf.js +91 -87
  330. package/src/server/data-query.js +32 -20
  331. package/src/server/dns.js +22 -0
  332. package/src/server/ipfs-client.js +232 -91
  333. package/src/server/object-layer.js +1 -6
  334. package/src/server/process.js +192 -45
  335. package/src/server/proxy.js +9 -2
  336. package/src/server/runtime.js +1 -1
  337. package/src/server/semantic-layer-generator-floor.js +11 -51
  338. package/src/server/semantic-layer-generator-resource.js +259 -0
  339. package/src/server/semantic-layer-generator-skin.js +41 -171
  340. package/src/server/semantic-layer-generator.js +122 -14
  341. package/src/server/shape-generator.js +108 -0
  342. package/src/server/start.js +34 -8
  343. package/src/server/valkey.js +143 -235
  344. package/src/ws/IoInterface.js +16 -16
  345. package/src/ws/core/channels/core.ws.chat.js +11 -11
  346. package/src/ws/core/channels/core.ws.mailer.js +29 -29
  347. package/src/ws/core/channels/core.ws.stream.js +19 -19
  348. package/src/ws/core/core.ws.connection.js +8 -8
  349. package/src/ws/core/core.ws.server.js +6 -5
  350. package/src/ws/default/channels/default.ws.main.js +10 -10
  351. package/src/ws/default/default.ws.connection.js +4 -4
  352. package/src/ws/default/default.ws.server.js +4 -3
  353. package/tsconfig.docs.json +15 -0
  354. package/typedoc.dd-cyberia.json +29 -0
  355. package/typedoc.json +29 -0
  356. package/WHITE-PAPER.md +0 -1540
  357. package/bin/file.js +0 -196
  358. package/bin/vs.js +0 -74
  359. package/bin/zed.js +0 -84
  360. package/hardhat/README.md +0 -531
  361. package/hardhat/WHITE-PAPER.md +0 -1540
  362. package/jsdoc.dd-cyberia.json +0 -68
  363. package/jsdoc.json +0 -68
  364. package/src/api/cyberia-instance-conf/cyberia-instance-conf.defaults.js +0 -413
  365. package/src/api/object-layer/README.md +0 -672
  366. package/src/client/components/core/ColorPalette.js +0 -5267
  367. package/src/client/components/core/JoyStick.js +0 -80
  368. package/src/client/components/cryptokoyn/RoutesCryptokoyn.js +0 -39
  369. package/src/client/components/cyberia-portal/CommonCyberiaPortal.js +0 -223
  370. package/src/client/components/cyberia-portal/RoutesCyberiaPortal.js +0 -62
  371. package/src/client/components/cyberia-portal/ServerCyberiaPortal.js +0 -136
  372. package/src/client/components/default/RoutesDefault.js +0 -49
  373. package/src/client/components/itemledger/RoutesItemledger.js +0 -40
  374. package/src/client/components/underpost/RoutesUnderpost.js +0 -47
  375. package/src/client/ssr/email/DefaultRecoverEmail.js +0 -21
  376. package/src/client/ssr/email/DefaultVerifyEmail.js +0 -17
  377. package/src/client/ssr/pages/CyberiaServerMetrics.js +0 -461
  378. package/src/client/sw/default.sw.js +0 -127
  379. package/src/client/sw/template.sw.js +0 -84
  380. package/src/grpc/cyberia/OFF_CHAIN_ECONOMY.md +0 -305
  381. package/src/grpc/cyberia/README.md +0 -326
@@ -38,6 +38,8 @@ import { ssrFactory } from './ssr.js';
38
38
  * @memberof clientBuild
39
39
  */
40
40
  const copyNonExistingFiles = (src, dest) => {
41
+ if (dir.basename(src) === '.git') return;
42
+
41
43
  // Ensure source exists
42
44
  if (!fs.existsSync(src)) {
43
45
  throw new Error(`Source directory does not exist: ${src}`);
@@ -74,6 +76,224 @@ const copyNonExistingFiles = (src, dest) => {
74
76
  }
75
77
  };
76
78
 
79
+ const splitFileByMb = ({ filePath, partSizeMb, logger }) => {
80
+ const partSizeBytes = Math.floor(Number(partSizeMb) * 1024 * 1024);
81
+ if (!Number.isFinite(partSizeBytes) || partSizeBytes <= 0) {
82
+ throw new Error(`Invalid --split value: ${partSizeMb}`);
83
+ }
84
+
85
+ // Clean ALL stale part files (any naming variant) before writing new ones
86
+ const zipDir = dir.dirname(filePath);
87
+ const zipBase = dir.basename(filePath);
88
+ if (fs.existsSync(zipDir)) {
89
+ fs.readdirSync(zipDir)
90
+ .filter((name) => name.startsWith(`${zipBase}.part`) || name.startsWith(`${zipBase}-part`))
91
+ .forEach((name) => fs.removeSync(dir.join(zipDir, name)));
92
+ }
93
+
94
+ const fileBuffer = fs.readFileSync(filePath);
95
+ const partPaths = [];
96
+
97
+ for (let offset = 0, partIndex = 0; offset < fileBuffer.length; offset += partSizeBytes, partIndex++) {
98
+ const partBuffer = fileBuffer.subarray(offset, offset + partSizeBytes);
99
+ const partPath = `${filePath}.part${String(partIndex + 1).padStart(3, '0')}`;
100
+ fs.writeFileSync(partPath, partBuffer);
101
+ partPaths.push(partPath);
102
+ }
103
+
104
+ logger.warn('split zip', {
105
+ filePath,
106
+ partSizeMb: Number(partSizeMb),
107
+ parts: partPaths.length,
108
+ });
109
+
110
+ return partPaths;
111
+ };
112
+
113
+ const getZipPartPaths = (zipPath) => {
114
+ const zipDir = dir.dirname(zipPath);
115
+ const zipBase = dir.basename(zipPath);
116
+ const partPrefixDot = `${zipBase}.part`;
117
+ const partPrefixDash = `${zipBase}-part`;
118
+
119
+ const parsePartIndex = (rawSuffix) => {
120
+ // Strip optional .zip suffix added by pull/download (e.g. '001.zip' → '001')
121
+ const digits = rawSuffix.replace(/\.zip$/i, '');
122
+ return /^\d+$/.test(digits) ? Number(digits) : NaN;
123
+ };
124
+
125
+ const getPartIndex = (name) => {
126
+ if (name.startsWith(partPrefixDot)) return parsePartIndex(name.slice(partPrefixDot.length));
127
+ if (name.startsWith(partPrefixDash)) return parsePartIndex(name.slice(partPrefixDash.length));
128
+ return NaN;
129
+ };
130
+
131
+ return fs
132
+ .readdirSync(zipDir)
133
+ .filter((name) => Number.isFinite(getPartIndex(name)))
134
+ .sort((a, b) => getPartIndex(a) - getPartIndex(b))
135
+ .map((name) => dir.join(zipDir, name));
136
+ };
137
+
138
+ const resolveClientBuildZip = (buildPrefix) => {
139
+ const normalizedPrefix = buildPrefix.replace(/\.zip(?:[.-]part\d+|[.-]part\*)?$/, '').replace(/[.-]part\*$/, '');
140
+ const candidatePrefixes = uniqueArray([
141
+ normalizedPrefix,
142
+ normalizedPrefix.endsWith('-') ? normalizedPrefix : `${normalizedPrefix}-`,
143
+ ]);
144
+
145
+ for (const prefix of candidatePrefixes) {
146
+ const zipPath = `${prefix}.zip`;
147
+ if (fs.existsSync(zipPath)) {
148
+ return {
149
+ buildPrefix: prefix,
150
+ zipPath,
151
+ partPaths: [],
152
+ };
153
+ }
154
+
155
+ const partPaths = fs.existsSync(dir.dirname(zipPath)) ? getZipPartPaths(zipPath) : [];
156
+ if (partPaths.length > 0) {
157
+ return {
158
+ buildPrefix: prefix,
159
+ zipPath,
160
+ partPaths,
161
+ };
162
+ }
163
+ }
164
+
165
+ const searchDir = dir.dirname(normalizedPrefix);
166
+ const prefixBase = dir.basename(normalizedPrefix);
167
+ if (!fs.existsSync(searchDir)) {
168
+ throw new Error(`Build directory not found: ${searchDir}`);
169
+ }
170
+
171
+ const matches = uniqueArray(
172
+ fs
173
+ .readdirSync(searchDir)
174
+ .filter((name) => name.startsWith(prefixBase) && /\.zip(?:[.-]part\d+)?$/.test(name))
175
+ .map((name) => name.replace(/[.-]part\d+$/, '')),
176
+ );
177
+
178
+ if (matches.length === 1) {
179
+ const zipPath = dir.join(searchDir, matches[0]);
180
+ const partPaths = getZipPartPaths(zipPath);
181
+ return {
182
+ buildPrefix: zipPath.replace(/\.zip$/, ''),
183
+ zipPath,
184
+ partPaths,
185
+ };
186
+ }
187
+
188
+ if (matches.length > 1) {
189
+ throw new Error(
190
+ `Multiple build zip matches found for '${buildPrefix}': ${matches.join(', ')}. Use a more specific --unzip path.`,
191
+ );
192
+ }
193
+
194
+ throw new Error(`No build zip or split parts found for: ${buildPrefix}`);
195
+ };
196
+
197
+ /**
198
+ * Merges split ZIP parts back into a single ZIP file.
199
+ * @param {object} options
200
+ * @param {string} options.buildPrefix - The build prefix path (e.g. build/underpost.net/underpost.net-).
201
+ * @param {object} options.logger - Logger instance.
202
+ * @returns {{ zipPath: string, partPaths: string[], mergedBytes: number }}
203
+ */
204
+ const mergeClientBuildZip = ({ buildPrefix, logger }) => {
205
+ // Normalize to get the zip path, then look for parts directly (bypassing resolveClientBuildZip
206
+ // which prefers an existing monolithic zip over parts).
207
+ const normalizedPrefix = buildPrefix.replace(/\.zip(?:[.-]part\d+)?$/, '').replace(/[-.]$/, '') + '-';
208
+ const candidatePrefixes = uniqueArray([buildPrefix, buildPrefix.endsWith('-') ? buildPrefix : `${buildPrefix}-`]);
209
+
210
+ let zipPath;
211
+ let partPaths = [];
212
+
213
+ for (const prefix of candidatePrefixes) {
214
+ const candidate = prefix.endsWith('.zip') ? prefix : `${prefix}.zip`;
215
+ const parts = getZipPartPaths(candidate);
216
+ if (parts.length > 0) {
217
+ zipPath = candidate;
218
+ partPaths = parts;
219
+ break;
220
+ }
221
+ }
222
+
223
+ if (partPaths.length === 0) {
224
+ // Fall back to resolveClientBuildZip for the zipPath
225
+ const resolved = resolveClientBuildZip(buildPrefix);
226
+ zipPath = resolved.zipPath;
227
+ logger.warn('merge-zip: no split parts found, nothing to merge', { buildPrefix, zipPath });
228
+ return { zipPath, partPaths, mergedBytes: 0 };
229
+ }
230
+
231
+ // For each part, extract raw bytes: if the part file is a Cloudinary wrapper zip
232
+ // (downloaded via pull without --omit-unzip or with --omit-unzip keeping the .zip),
233
+ // extract the inner entry rather than using the wrapper bytes.
234
+ const readPartBytes = (partPath) => {
235
+ const rawBytes = fs.readFileSync(partPath);
236
+ // Check for ZIP magic bytes (PK\x03\x04)
237
+ if (rawBytes[0] === 0x50 && rawBytes[1] === 0x4b && rawBytes[2] === 0x03 && rawBytes[3] === 0x04) {
238
+ try {
239
+ const wrapperZip = new AdmZip(rawBytes);
240
+ const entries = wrapperZip.getEntries();
241
+ // The inner entry is the original part file (without the outer .zip wrapper)
242
+ const partBase = dir.basename(partPath).replace(/\.zip$/i, '');
243
+ const entry = entries.find((e) => e.entryName === partBase || e.entryName.endsWith('/' + partBase));
244
+ if (entry) {
245
+ return entry.getData();
246
+ }
247
+ // Fallback: single-entry archive
248
+ if (entries.length === 1) {
249
+ return entries[0].getData();
250
+ }
251
+ } catch (_) {
252
+ // Not a valid zip or extraction failed — use raw bytes
253
+ }
254
+ }
255
+ return rawBytes;
256
+ };
257
+
258
+ const mergedBuffer = Buffer.concat(partPaths.map(readPartBytes));
259
+ fs.writeFileSync(zipPath, mergedBuffer);
260
+
261
+ logger.warn('merge-zip: merged split parts into zip', {
262
+ zipPath,
263
+ parts: partPaths.length,
264
+ mergedBytes: mergedBuffer.length,
265
+ });
266
+
267
+ return { zipPath, partPaths, mergedBytes: mergedBuffer.length };
268
+ };
269
+
270
+ const unzipClientBuild = ({ buildPrefix, logger }) => {
271
+ const { zipPath, partPaths, buildPrefix: resolvedBuildPrefix } = resolveClientBuildZip(buildPrefix);
272
+ const outputPath = resolvedBuildPrefix.replace(/-$/, '');
273
+
274
+ fs.removeSync(outputPath);
275
+ fs.mkdirSync(outputPath, { recursive: true });
276
+
277
+ const zip =
278
+ partPaths.length > 0
279
+ ? new AdmZip(Buffer.concat(partPaths.map((partPath) => fs.readFileSync(partPath))))
280
+ : new AdmZip(zipPath);
281
+
282
+ zip.extractAllTo(outputPath, true);
283
+
284
+ logger.warn('unzip build', {
285
+ source: partPaths.length > 0 ? partPaths : [zipPath],
286
+ outputPath,
287
+ splitParts: partPaths.length,
288
+ });
289
+
290
+ return {
291
+ outputPath,
292
+ zipPath,
293
+ partPaths,
294
+ };
295
+ };
296
+
77
297
  /** @type {string} Default XSL sitemap template used when no `sitemap` source file exists in the public directory. */
78
298
  const defaultSitemapXsl = `<?xml version="1.0" encoding="UTF-8"?>
79
299
  <xsl:stylesheet version="1.0"
@@ -233,6 +453,7 @@ const defaultSitemapXsl = `<?xml version="1.0" encoding="UTF-8"?>
233
453
  * @param {Array} options.liveClientBuildPaths - List of paths to build incrementally.
234
454
  * @param {Array} options.instances - List of instances to build.
235
455
  * @param {boolean} options.buildZip - Whether to create zip files of the builds.
456
+ * @param {string|number} options.split - Optional zip split size in MB.
236
457
  * @param {boolean} options.fullBuild - Whether to perform a full build.
237
458
  * @param {boolean} options.iconsBuild - Whether to build icons.
238
459
  * @returns {Promise<void>} - Promise that resolves when the build is complete.
@@ -245,6 +466,7 @@ const buildClient = async (
245
466
  liveClientBuildPaths: [],
246
467
  instances: [],
247
468
  buildZip: false,
469
+ split: '',
248
470
  fullBuild: false,
249
471
  iconsBuild: false,
250
472
  },
@@ -311,35 +533,18 @@ const buildClient = async (
311
533
 
312
534
  buildAcmeChallengePath(acmeChallengeFullPath);
313
535
 
314
- if (publicClientId && publicClientId.startsWith('html-website-templates')) {
315
- if (!fs.existsSync(`/home/dd/html-website-templates/`))
316
- shellExec(`cd /home/dd && git clone https://github.com/designmodo/html-website-templates.git`);
317
- if (!fs.existsSync(`${rootClientPath}/index.php`)) {
318
- fs.copySync(`/home/dd/html-website-templates/${publicClientId.split('-publicClientId-')[1]}`, rootClientPath);
319
- Underpost.repo.initLocalRepo({ path: rootClientPath });
320
- shellExec(`cd ${rootClientPath} && git add . && git commit -m "Base template implementation"`);
321
- // git remote add origin git@github.com:<username>/<repo>.git
322
- fs.writeFileSync(`${rootClientPath}/.git/.htaccess`, `Deny from all`, 'utf8');
323
- }
324
- return;
325
- }
326
-
327
536
  fs.removeSync(rootClientPath);
328
537
 
329
538
  if (fs.existsSync(`./src/client/public/${publicClientId}`)) {
330
539
  if (iconsBuild === true) await buildIcons({ publicClientId, metadata });
331
540
 
332
- fs.copySync(
333
- `./src/client/public/${publicClientId}`,
334
- rootClientPath /* {
335
- filter: function (name) {
336
- console.log(name);
337
- return true;
338
- },
339
- } */,
340
- );
541
+ fs.copySync(`./src/client/public/${publicClientId}`, rootClientPath, {
542
+ filter: (sourcePath) => !sourcePath.split(dir.sep).includes('.git'),
543
+ });
341
544
  } else if (fs.existsSync(`./engine-private/src/client/public/${publicClientId}`)) {
342
- fs.copySync(`./engine-private/src/client/public/${publicClientId}`, rootClientPath);
545
+ fs.copySync(`./engine-private/src/client/public/${publicClientId}`, rootClientPath, {
546
+ filter: (sourcePath) => !sourcePath.split(dir.sep).includes('.git'),
547
+ });
343
548
  }
344
549
  if (dists)
345
550
  for (const dist of dists) {
@@ -463,28 +668,18 @@ const buildClient = async (
463
668
  for (const module of services) {
464
669
  if (!fs.existsSync(`${rootClientPath}/services/${module}`))
465
670
  fs.mkdirSync(`${rootClientPath}/services/${module}`, { recursive: true });
671
+ const moduleDir = `./src/client/services/${module}`;
672
+ if (!fs.existsSync(moduleDir)) continue;
466
673
 
467
- if (fs.existsSync(`./src/client/services/${module}/${module}.service.js`)) {
468
- const jsSrcPath = `./src/client/services/${module}/${module}.service.js`;
469
- const jsPublicPath = `${rootClientPath}/services/${module}/${module}.service.js`;
470
- if (enableLiveRebuild && !options.liveClientBuildPaths.find((p) => p.srcBuildPath === jsSrcPath)) continue;
674
+ const serviceFiles = fs
675
+ .readdirSync(moduleDir)
676
+ .filter((name) => name.endsWith('.service.js') || name.endsWith('.management.js'))
677
+ .sort();
471
678
 
472
- const jsSrc = await transformClientJs(jsSrcPath, {
473
- dists,
474
- proxyPath: path,
475
- basePath: 'services',
476
- module,
477
- baseHost,
478
- minify: minifyBuild,
479
- });
480
- fs.writeFileSync(jsPublicPath, jsSrc, 'utf8');
481
- }
482
- }
679
+ for (const serviceFile of serviceFiles) {
680
+ const jsSrcPath = `${moduleDir}/${serviceFile}`;
681
+ const jsPublicPath = `${rootClientPath}/services/${module}/${serviceFile}`;
483
682
 
484
- for (const module of services) {
485
- if (fs.existsSync(`./src/client/services/${module}/${module}.management.js`)) {
486
- const jsSrcPath = `./src/client/services/${module}/${module}.management.js`;
487
- const jsPublicPath = `${rootClientPath}/services/${module}/${module}.management.js`;
488
683
  if (enableLiveRebuild && !options.liveClientBuildPaths.find((p) => p.srcBuildPath === jsSrcPath)) continue;
489
684
 
490
685
  const jsSrc = await transformClientJs(jsSrcPath, {
@@ -497,6 +692,30 @@ const buildClient = async (
497
692
  });
498
693
  fs.writeFileSync(jsPublicPath, jsSrc, 'utf8');
499
694
  }
695
+
696
+ // Auto-build guest module files when user module is processed
697
+ if (module === 'user') {
698
+ const guestModuleDir = './src/client/services/user';
699
+ const guestServicePath = `${guestModuleDir}/guest.service.js`;
700
+ if (fs.existsSync(guestServicePath)) {
701
+ if (!fs.existsSync(`${rootClientPath}/services/user`))
702
+ fs.mkdirSync(`${rootClientPath}/services/user`, { recursive: true });
703
+
704
+ const guestJsPublicPath = `${rootClientPath}/services/user/guest.service.js`;
705
+
706
+ if (!enableLiveRebuild || options.liveClientBuildPaths.find((p) => p.srcBuildPath === guestServicePath)) {
707
+ const guestJsSrc = await transformClientJs(guestServicePath, {
708
+ dists,
709
+ proxyPath: path,
710
+ basePath: 'services',
711
+ module: 'user',
712
+ baseHost,
713
+ minify: minifyBuild,
714
+ });
715
+ fs.writeFileSync(guestJsPublicPath, guestJsSrc, 'utf8');
716
+ }
717
+ }
718
+ }
500
719
  }
501
720
  }
502
721
 
@@ -505,19 +724,24 @@ const buildClient = async (
505
724
  const ssrPath = path === '/' ? path : `${path}/`;
506
725
  const Render = await ssrFactory();
507
726
 
508
- if (views) {
509
- const jsSrcPath = fs.existsSync(`./src/client/sw/${publicClientId}.sw.js`)
510
- ? `./src/client/sw/${publicClientId}.sw.js`
511
- : `./src/client/sw/default.sw.js`;
512
-
513
- const jsPublicPath = `${rootClientPath}/sw.js`;
514
-
515
- if (!(enableLiveRebuild && !options.liveClientBuildPaths.find((p) => p.srcBuildPath === jsSrcPath))) {
516
- const jsSrc = await transformClientJs(jsSrcPath, { dists, proxyPath: path, baseHost, minify: minifyBuild });
517
-
518
- fs.writeFileSync(jsPublicPath, jsSrc, 'utf8');
519
- }
727
+ const swSrcPath = `./src/client/sw/core.sw.js`;
728
+ const swPublicPath = `${rootClientPath}/sw.js`;
729
+ const swShouldRebuild =
730
+ views && !(enableLiveRebuild && !options.liveClientBuildPaths.find((p) => p.srcBuildPath === swSrcPath));
731
+ // Transformed SW JS is held in memory; it gets prepended with renderPayload
732
+ // and written once below, after PRE_CACHED_RESOURCES are known.
733
+ let swTransformedJs = '';
734
+ if (swShouldRebuild) {
735
+ swTransformedJs = await transformClientJs(swSrcPath, {
736
+ dists,
737
+ proxyPath: path,
738
+ baseHost,
739
+ minify: minifyBuild,
740
+ externalizeBareImports: false,
741
+ });
742
+ }
520
743
 
744
+ if (views) {
521
745
  if (
522
746
  !(
523
747
  enableLiveRebuild &&
@@ -527,9 +751,8 @@ const buildClient = async (
527
751
  )
528
752
  )
529
753
  for (const view of views) {
530
- const buildPath = `${
531
- rootClientPath[rootClientPath.length - 1] === '/' ? rootClientPath.slice(0, -1) : rootClientPath
532
- }${view.path === '/' ? view.path : `${view.path}/`}`;
754
+ const buildPath = `${rootClientPath[rootClientPath.length - 1] === '/' ? rootClientPath.slice(0, -1) : rootClientPath
755
+ }${view.path === '/' ? view.path : `${view.path}/`}`;
533
756
 
534
757
  if (!fs.existsSync(buildPath)) fs.mkdirSync(buildPath, { recursive: true });
535
758
 
@@ -545,9 +768,8 @@ const buildClient = async (
545
768
  fs.writeFileSync(`${buildPath}${buildId}.js`, jsSrc, 'utf8');
546
769
  const title = metadata.title ? metadata.title : title;
547
770
 
548
- const canonicalURL = `https://${host}${path}${
549
- view.path === '/' ? (path === '/' ? '' : '/') : path === '/' ? `${view.path.slice(1)}/` : `${view.path}/`
550
- }`;
771
+ const canonicalURL = `https://${host}${path}${view.path === '/' ? (path === '/' ? '' : '/') : path === '/' ? `${view.path.slice(1)}/` : `${view.path}/`
772
+ }`;
551
773
 
552
774
  let ssrHeadComponents = ``;
553
775
  let ssrBodyComponents = ``;
@@ -681,12 +903,12 @@ const buildClient = async (
681
903
  `${buildPath}index.html`,
682
904
  minifyBuild
683
905
  ? await minify(htmlSrc, {
684
- minifyCSS: true,
685
- minifyJS: true,
686
- collapseBooleanAttributes: true,
687
- collapseInlineTagWhitespace: true,
688
- collapseWhitespace: true,
689
- })
906
+ minifyCSS: true,
907
+ minifyJS: true,
908
+ collapseBooleanAttributes: true,
909
+ collapseInlineTagWhitespace: true,
910
+ collapseWhitespace: true,
911
+ })
690
912
  : htmlSrc,
691
913
  'utf8',
692
914
  );
@@ -744,79 +966,85 @@ Sitemap: ${sitemapBaseUrl}/sitemap.xml`,
744
966
  }
745
967
 
746
968
  if (client) {
747
- let PRE_CACHED_RESOURCES = [];
748
-
749
- if (views && fs.existsSync(`${rootClientPath}/sw.js`)) {
750
- PRE_CACHED_RESOURCES = await fs.readdir(rootClientPath, { recursive: true });
751
- PRE_CACHED_RESOURCES = views
752
- .map((view) => `${path === '/' ? '' : path}${view.path}`)
753
- .concat(
754
- PRE_CACHED_RESOURCES.map((p) => `/${p}`).filter(
755
- (p) => p[1] !== '.' && !fs.statSync(`${rootClientPath}${p}`).isDirectory(),
756
- ),
757
- );
758
- }
969
+ const proxyPrefix = path === '/' ? '' : path;
970
+ const buildIndexUrl = (routePath) => `${proxyPrefix}${routePath === '/' ? '' : routePath}/index.html`;
971
+
972
+ // SSR views: a single declarative array. The role of each view (regular
973
+ // page vs. offline/maintenance fallback) is expressed by per-entry flags;
974
+ // fallback-flagged views are also precached so the SW can serve them
975
+ // when the network is unreachable.
976
+ const ssrClientConf = confSSR[getCapVariableName(client)] || {};
977
+ const ssrViews = Array.isArray(ssrClientConf.views) ? ssrClientConf.views : [];
978
+ const PRE_CACHED_RESOURCES = [];
979
+ let offlineFallbackUrl = null;
980
+ let maintenanceFallbackUrl = null;
981
+
982
+ for (const view of ssrViews) {
983
+ const SsrComponent = await ssrFactory(`./src/client/ssr/views/${view.client}.js`);
984
+
985
+ const htmlSrc = Render({
986
+ title: view.title,
987
+ ssrPath,
988
+ ssrHeadComponents: '<base target="_top">',
989
+ ssrBodyComponents: SsrComponent(),
990
+ renderPayload: {
991
+ apiBaseProxyPath,
992
+ apiBaseHost,
993
+ apiBasePath: process.env.BASE_API,
994
+ version: Underpost.version,
995
+ ...(isDevelopment ? { dev: true } : undefined),
996
+ },
997
+ renderApi: { JSONweb },
998
+ });
759
999
 
760
- for (const pageType of ['offline', 'pages']) {
761
- if (confSSR[getCapVariableName(client)] && confSSR[getCapVariableName(client)][pageType]) {
762
- for (const page of confSSR[getCapVariableName(client)][pageType]) {
763
- const SsrComponent = await ssrFactory(`./src/client/ssr/${pageType}/${page.client}.js`);
764
-
765
- const htmlSrc = Render({
766
- title: page.title,
767
- ssrPath,
768
- ssrHeadComponents: '<base target="_top">',
769
- ssrBodyComponents: SsrComponent(),
770
- renderPayload: {
771
- apiBaseProxyPath,
772
- apiBaseHost,
773
- apiBasePath: process.env.BASE_API,
774
- version: Underpost.version,
775
- ...(isDevelopment ? { dev: true } : undefined),
776
- },
777
- renderApi: {
778
- JSONweb,
779
- },
780
- });
781
-
782
- const buildPath = `${
783
- rootClientPath[rootClientPath.length - 1] === '/' ? rootClientPath.slice(0, -1) : rootClientPath
784
- }${page.path === '/' ? page.path : `${page.path}/`}`;
785
-
786
- PRE_CACHED_RESOURCES.push(`${path === '/' ? '' : path}${page.path === '/' ? '' : page.path}/index.html`);
787
-
788
- if (!fs.existsSync(buildPath)) fs.mkdirSync(buildPath, { recursive: true });
789
-
790
- const buildHtmlPath = `${buildPath}index.html`;
791
-
792
- logger.info('ssr page build', buildHtmlPath);
793
-
794
- fs.writeFileSync(
795
- buildHtmlPath,
796
- minifyBuild
797
- ? await minify(htmlSrc, {
798
- minifyCSS: true,
799
- minifyJS: true,
800
- collapseBooleanAttributes: true,
801
- collapseInlineTagWhitespace: true,
802
- collapseWhitespace: true,
803
- })
804
- : htmlSrc,
805
- 'utf8',
806
- );
807
- }
1000
+ const buildPath = `${rootClientPath[rootClientPath.length - 1] === '/' ? rootClientPath.slice(0, -1) : rootClientPath
1001
+ }${view.path === '/' ? view.path : `${view.path}/`}`;
1002
+
1003
+ const indexUrl = buildIndexUrl(view.path);
1004
+ if (view.offlineDefault) {
1005
+ offlineFallbackUrl = indexUrl;
1006
+ PRE_CACHED_RESOURCES.push(indexUrl);
808
1007
  }
1008
+ if (view.maintenanceDefault) {
1009
+ maintenanceFallbackUrl = indexUrl;
1010
+ PRE_CACHED_RESOURCES.push(indexUrl);
1011
+ }
1012
+
1013
+ if (!fs.existsSync(buildPath)) fs.mkdirSync(buildPath, { recursive: true });
1014
+ const buildHtmlPath = `${buildPath}index.html`;
1015
+ logger.info('ssr view build', buildHtmlPath);
1016
+
1017
+ fs.writeFileSync(
1018
+ buildHtmlPath,
1019
+ minifyBuild
1020
+ ? await minify(htmlSrc, {
1021
+ minifyCSS: true,
1022
+ minifyJS: true,
1023
+ collapseBooleanAttributes: true,
1024
+ collapseInlineTagWhitespace: true,
1025
+ collapseWhitespace: true,
1026
+ })
1027
+ : htmlSrc,
1028
+ 'utf8',
1029
+ );
809
1030
  }
810
1031
 
811
- {
1032
+ if (swShouldRebuild) {
1033
+ const cacheScope = path === '/' ? 'root' : path.replaceAll('/', '_');
812
1034
  const renderPayload = {
813
1035
  PRE_CACHED_RESOURCES: uniqueArray(PRE_CACHED_RESOURCES),
814
1036
  PROXY_PATH: path,
1037
+ CACHE_PREFIX: `engine-core-${cacheScope}`,
1038
+ OFFLINE_URL: offlineFallbackUrl || buildIndexUrl('/offline'),
1039
+ MAINTENANCE_URL: maintenanceFallbackUrl || buildIndexUrl('/maintenance'),
815
1040
  };
1041
+
1042
+ // Single write: prepend the payload prelude to the transformed SW JS.
816
1043
  fs.writeFileSync(
817
- `${rootClientPath}/sw.js`,
1044
+ swPublicPath,
818
1045
  `self.renderPayload = ${JSONweb(renderPayload)};
819
- ${fs.readFileSync(`${rootClientPath}/sw.js`, 'utf8')}`,
1046
+ self.__WB_DISABLE_DEV_LOGS = true;
1047
+ ${swTransformedJs}`,
820
1048
  'utf8',
821
1049
  );
822
1050
  }
@@ -838,13 +1066,24 @@ ${fs.readFileSync(`${rootClientPath}/sw.js`, 'utf8')}`,
838
1066
  }
839
1067
 
840
1068
  const buildId = `${host}-${path.replaceAll('/', '')}`;
1069
+ const zipPath = `./build/${buildId}.zip`;
1070
+
1071
+ logger.warn('write zip', zipPath);
841
1072
 
842
- logger.warn('write zip', `./build/${buildId}.zip`);
1073
+ zip.writeZip(zipPath);
843
1074
 
844
- zip.writeZip(`./build/${buildId}.zip`);
1075
+ if (options.split) {
1076
+ splitFileByMb({
1077
+ filePath: zipPath,
1078
+ partSizeMb: options.split,
1079
+ logger,
1080
+ });
1081
+ fs.removeSync(zipPath);
1082
+ logger.warn('removed original zip after split', { zipPath });
1083
+ }
845
1084
  }
846
1085
  }
847
1086
  }
848
1087
  };
849
1088
 
850
- export { buildClient, copyNonExistingFiles };
1089
+ export { buildClient, copyNonExistingFiles, unzipClientBuild, mergeClientBuildZip };