@underpostnet/cyberia 3.3.0 → 3.3.73

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 (471) hide show
  1. package/.dockerignore +1 -0
  2. package/.github/workflows/coverall.cyberia.ci.yml +34 -14
  3. package/.github/workflows/cyberia-client.cd.yml +5 -0
  4. package/.github/workflows/cyberia-server.cd.yml +5 -0
  5. package/.github/workflows/docker-image.cyberia-client.ci.yml +8 -5
  6. package/.github/workflows/docker-image.cyberia-client.dev.ci.yml +8 -3
  7. package/.github/workflows/docker-image.cyberia-server.ci.yml +8 -5
  8. package/.github/workflows/docker-image.cyberia-server.dev.ci.yml +8 -5
  9. package/.github/workflows/docker-image.engine-cyberia.ci.yml +15 -1
  10. package/.github/workflows/docker-image.engine-cyberia.dev.ci.yml +15 -1
  11. package/.github/workflows/engine-cyberia.cd.yml +3 -0
  12. package/.github/workflows/engine-cyberia.ci.yml +4 -5
  13. package/.github/workflows/ghpkg.ci.yml +35 -20
  14. package/.github/workflows/hardhat.ci.yml +12 -11
  15. package/.github/workflows/npmpkg.ci.yml +17 -15
  16. package/.github/workflows/pwa-microservices-template-test.ci.yml +2 -2
  17. package/.github/workflows/release.cd.yml +1 -0
  18. package/.prettierignore +1 -0
  19. package/AGENTS.md +47 -0
  20. package/CHANGELOG.md +565 -2510
  21. package/CLI-HELP.md +306 -147
  22. package/Dockerfile +25 -9
  23. package/Dockerfile.dev +25 -9
  24. package/Dockerfile.test +4 -4
  25. package/README.md +21 -1
  26. package/bin/build.js +66 -41
  27. package/bin/build.template.js +8 -3
  28. package/bin/cyberia.js +308 -91
  29. package/bin/deploy.js +18 -104
  30. package/bin/index.js +308 -91
  31. package/conf.js +91 -4
  32. package/deploy/cyberia-client/deploy.sh +47 -0
  33. package/deploy/cyberia-client/package.sh +18 -0
  34. package/deploy/cyberia-client/state.sh +14 -0
  35. package/deploy/cyberia-server/deploy.sh +47 -0
  36. package/deploy/cyberia-server/package.sh +18 -0
  37. package/deploy/cyberia-server/state.sh +14 -0
  38. package/deploy/dd-cyberia/deploy.sh +6 -26
  39. package/deploy/dd-cyberia/init.sh +35 -43
  40. package/deploy/dd-cyberia/package.sh +17 -0
  41. package/deploy/dd-cyberia/state.sh +14 -0
  42. package/deploy/dd-cyberia/sync-deploy.sh +92 -170
  43. package/deploy/lib/github-actions-logging.sh +594 -0
  44. package/deploy/lib/host.sh +185 -0
  45. package/deploy/lib/state.sh +62 -0
  46. package/deploy/pwa-microservices-template/deploy.sh +12 -39
  47. package/deploy/release/deploy.sh +9 -39
  48. package/deployment.yaml +7 -2
  49. package/docker-compose.yml +7 -7
  50. package/examples/static-page/README.md +19 -19
  51. package/examples/static-page/ssr-components/CustomPage.js +2 -2
  52. package/hardhat/hardhat.config.js +1 -6
  53. package/hardhat/package-lock.json +101 -40
  54. package/hardhat/package.json +2 -2
  55. package/manifests/alertmanager/deployment.yaml +81 -0
  56. package/manifests/blackbox-exporter/deployment.yaml +75 -0
  57. package/manifests/cronjobs/dd-cron/dd-cron-backup.yaml +32 -7
  58. package/manifests/cronjobs/dd-cron/dd-cron-vultr.yaml +32 -7
  59. package/manifests/deployment/dd-cyberia-development/deployment.yaml +7 -2
  60. package/manifests/deployment/dd-default-development/deployment.yaml +2 -2
  61. package/manifests/grafana/deployment.yaml +26 -7
  62. package/manifests/grafana/kustomization.yaml +1 -0
  63. package/manifests/grafana/service.yaml +6 -1
  64. package/manifests/mariadb/pv.yaml +1 -0
  65. package/manifests/mongodb/statefulset.yaml +9 -2
  66. package/manifests/mysql/pv-pvc.yaml +14 -1
  67. package/manifests/postgresql/pv.yaml +12 -1
  68. package/manifests/postgresql/pvc.yaml +1 -0
  69. package/manifests/prometheus/deployment.yaml +18 -22
  70. package/package.json +83 -10
  71. package/scripts/event-monitor.sh +56 -0
  72. package/scripts/k3s-node-setup.sh +27 -14
  73. package/scripts/kubeadm-node-setup.sh +31 -11
  74. package/scripts/maas-setup.sh +8 -8
  75. package/scripts/selinux-normalize.sh +907 -0
  76. package/scripts/shutdown-machine.sh +843 -0
  77. package/scripts/test-monitor.sh +3 -3
  78. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.controller.js +1 -1
  79. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.router.js +2 -2
  80. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.service.js +2 -2
  81. package/src/api/core/core.controller.js +1 -1
  82. package/src/api/core/core.router.js +2 -2
  83. package/src/api/core/core.service.js +2 -2
  84. package/src/api/crypto/crypto.controller.js +1 -1
  85. package/src/api/crypto/crypto.service.js +1 -1
  86. package/src/api/cyberia-action/cyberia-action.controller.js +1 -1
  87. package/src/api/cyberia-action/cyberia-action.router.js +1 -1
  88. package/src/api/cyberia-action/cyberia-action.service.js +2 -2
  89. package/src/api/cyberia-client-hints/cyberia-client-hints.controller.js +1 -1
  90. package/src/api/cyberia-client-hints/cyberia-client-hints.router.js +1 -1
  91. package/src/api/cyberia-client-hints/cyberia-client-hints.service.js +2 -2
  92. package/src/api/cyberia-dialogue/cyberia-dialogue.controller.js +1 -1
  93. package/src/api/cyberia-dialogue/cyberia-dialogue.router.js +1 -1
  94. package/src/api/cyberia-dialogue/cyberia-dialogue.service.js +2 -2
  95. package/src/api/cyberia-entity/cyberia-entity.controller.js +1 -1
  96. package/src/api/cyberia-entity/cyberia-entity.router.js +1 -1
  97. package/src/api/cyberia-entity/cyberia-entity.service.js +2 -2
  98. package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.controller.js +1 -1
  99. package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.router.js +1 -1
  100. package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.service.js +2 -2
  101. package/src/api/cyberia-instance/cyberia-fallback-capture.js +466 -0
  102. package/src/api/cyberia-instance/cyberia-fallback-world.js +8 -0
  103. package/src/api/cyberia-instance/cyberia-instance-map.service.js +1 -1
  104. package/src/api/cyberia-instance/cyberia-instance.controller.js +1 -1
  105. package/src/api/cyberia-instance/cyberia-instance.router.js +2 -2
  106. package/src/api/cyberia-instance/cyberia-instance.service.js +2 -2
  107. package/src/api/cyberia-instance-conf/cyberia-instance-conf.controller.js +1 -1
  108. package/src/api/cyberia-instance-conf/cyberia-instance-conf.router.js +1 -1
  109. package/src/api/cyberia-instance-conf/cyberia-instance-conf.service.js +2 -2
  110. package/src/api/cyberia-map/cyberia-map.controller.js +1 -1
  111. package/src/api/cyberia-map/cyberia-map.router.js +1 -1
  112. package/src/api/cyberia-map/cyberia-map.service.js +2 -2
  113. package/src/api/cyberia-quest/cyberia-quest.controller.js +1 -1
  114. package/src/api/cyberia-quest/cyberia-quest.router.js +1 -1
  115. package/src/api/cyberia-quest/cyberia-quest.service.js +2 -2
  116. package/src/api/cyberia-quest-progress/cyberia-quest-progress.controller.js +1 -1
  117. package/src/api/cyberia-quest-progress/cyberia-quest-progress.router.js +1 -1
  118. package/src/api/cyberia-quest-progress/cyberia-quest-progress.service.js +2 -2
  119. package/src/api/cyberia-saga/cyberia-saga.controller.js +1 -1
  120. package/src/api/cyberia-saga/cyberia-saga.router.js +1 -1
  121. package/src/api/cyberia-saga/cyberia-saga.service.js +2 -2
  122. package/src/api/cyberia-server-defaults/cyberia-server-defaults.js +0 -26
  123. package/src/api/cyberia-skill/cyberia-skill.controller.js +1 -1
  124. package/src/api/cyberia-skill/cyberia-skill.router.js +1 -1
  125. package/src/api/cyberia-skill/cyberia-skill.service.js +2 -2
  126. package/src/api/default/default.controller.js +1 -1
  127. package/src/api/default/default.router.js +1 -1
  128. package/src/api/default/default.service.js +2 -2
  129. package/src/api/document/document.controller.js +1 -1
  130. package/src/api/document/document.router.js +1 -1
  131. package/src/api/document/document.service.js +2 -2
  132. package/src/api/file/file.controller.js +1 -1
  133. package/src/api/file/file.router.js +1 -1
  134. package/src/api/file/file.service.js +2 -2
  135. package/src/api/instance/instance.controller.js +1 -1
  136. package/src/api/instance/instance.router.js +1 -1
  137. package/src/api/instance/instance.service.js +2 -2
  138. package/src/api/ipfs/ipfs.controller.js +1 -1
  139. package/src/api/ipfs/ipfs.router.js +2 -2
  140. package/src/api/ipfs/ipfs.service.js +2 -2
  141. package/src/api/object-layer/object-layer.controller.js +1 -1
  142. package/src/api/object-layer/object-layer.router.js +2 -2
  143. package/src/api/object-layer/object-layer.service.js +3 -3
  144. package/src/api/object-layer-render-frames/object-layer-render-frames.controller.js +1 -1
  145. package/src/api/object-layer-render-frames/object-layer-render-frames.router.js +1 -1
  146. package/src/api/object-layer-render-frames/object-layer-render-frames.service.js +2 -2
  147. package/src/api/test/test.controller.js +1 -1
  148. package/src/api/test/test.service.js +1 -1
  149. package/src/api/user/guest.service.js +3 -3
  150. package/src/api/user/user.controller.js +1 -1
  151. package/src/api/user/user.router.js +2 -2
  152. package/src/api/user/user.service.js +4 -4
  153. package/src/api.js +5 -9
  154. package/src/cli/app.js +391 -0
  155. package/src/cli/baremetal.js +30 -35
  156. package/src/cli/client.js +306 -0
  157. package/src/cli/cloud-init.js +3 -3
  158. package/src/cli/cluster.js +184 -82
  159. package/src/cli/db.js +120 -68
  160. package/src/cli/deploy.js +153 -71
  161. package/src/cli/docker-compose.js +5 -5
  162. package/src/cli/domains.js +184 -0
  163. package/src/cli/dotenv-store.js +143 -0
  164. package/src/cli/event.js +2281 -0
  165. package/src/cli/fs.js +3 -3
  166. package/src/cli/host.js +672 -0
  167. package/src/cli/image.js +4 -6
  168. package/src/cli/index.js +322 -142
  169. package/src/cli/ipfs.js +34 -30
  170. package/src/cli/kickstart.js +1 -1
  171. package/src/cli/kubectl.js +218 -41
  172. package/src/cli/lxd.js +3 -3
  173. package/src/cli/monitor.js +1359 -26
  174. package/src/cli/package.js +90 -0
  175. package/src/cli/release.js +16 -12
  176. package/src/cli/repository.js +558 -363
  177. package/src/cli/run.js +331 -650
  178. package/src/cli/secrets.js +2158 -964
  179. package/src/cli/ssh.js +478 -279
  180. package/src/cli/state.js +394 -0
  181. package/src/cli/static.js +2 -2
  182. package/src/cli/system.js +1 -1
  183. package/src/cli/test.js +199 -125
  184. package/src/cli/vultr.js +61 -21
  185. package/src/cli/wireguard.js +1111 -306
  186. package/src/client/components/core/CalendarCore.js +53 -96
  187. package/src/client/components/core/Docs.js +258 -211
  188. package/src/client/components/core/FileExplorer.js +0 -21
  189. package/src/client/components/core/PanelForm.js +4 -4
  190. package/src/client/components/core/Repository.js +56 -0
  191. package/src/client/components/core/Translate.js +7 -0
  192. package/src/client/components/core/{FullScreen.js → ViewModeController.js} +42 -39
  193. package/src/client/components/core/Wallet.js +0 -11
  194. package/src/client/components/core/Worker.js +7 -1
  195. package/src/client/components/cryptokoyn/SettingsCryptokoyn.js +2 -2
  196. package/src/client/components/cyberia-portal/AppShellCyberiaPortal.js +2 -1
  197. package/src/client/components/cyberia-portal/SettingsCyberiaPortal.js +2 -2
  198. package/src/client/components/default/AppShellDefault.js +1 -1
  199. package/src/client/components/default/SettingsDefault.js +2 -2
  200. package/src/client/components/itemledger/SettingsItemledger.js +2 -2
  201. package/src/client/components/underpost/AppShellUnderpost.js +3 -2
  202. package/src/client/components/underpost/SettingsUnderpost.js +2 -2
  203. package/src/client/public/cyberia-docs/CYBERIA-CLI.md +32 -5
  204. package/src/client/public/cyberia-docs/CYBERIA.md +21 -1
  205. package/src/client/public/cyberia-docs/HARDHAT-MODULE.md +23 -6
  206. package/src/client/public/cyberia-docs/ROADMAP.md +1 -1
  207. package/src/client/public/cyberia-docs/WHITE-PAPER.md +1 -1
  208. package/src/client/public/default/android-chrome-144x144.png +0 -0
  209. package/src/client/public/default/android-chrome-192x192.png +0 -0
  210. package/src/client/public/default/android-chrome-256x256.png +0 -0
  211. package/src/client/public/default/android-chrome-36x36.png +0 -0
  212. package/src/client/public/default/android-chrome-384x384.png +0 -0
  213. package/src/client/public/default/android-chrome-48x48.png +0 -0
  214. package/src/client/public/default/android-chrome-512x512.png +0 -0
  215. package/src/client/public/default/android-chrome-72x72.png +0 -0
  216. package/src/client/public/default/android-chrome-96x96.png +0 -0
  217. package/src/client/public/default/apple-touch-icon-1024x1024.png +0 -0
  218. package/src/client/public/default/apple-touch-icon-114x114.png +0 -0
  219. package/src/client/public/default/apple-touch-icon-120x120.png +0 -0
  220. package/src/client/public/default/apple-touch-icon-144x144.png +0 -0
  221. package/src/client/public/default/apple-touch-icon-152x152.png +0 -0
  222. package/src/client/public/default/apple-touch-icon-167x167.png +0 -0
  223. package/src/client/public/default/apple-touch-icon-180x180.png +0 -0
  224. package/src/client/public/default/apple-touch-icon-57x57.png +0 -0
  225. package/src/client/public/default/apple-touch-icon-60x60.png +0 -0
  226. package/src/client/public/default/apple-touch-icon-72x72.png +0 -0
  227. package/src/client/public/default/apple-touch-icon-76x76.png +0 -0
  228. package/src/client/public/default/apple-touch-icon-precomposed.png +0 -0
  229. package/src/client/public/default/apple-touch-icon.png +0 -0
  230. package/src/client/public/default/apple-touch-startup-image-1125x2436.png +0 -0
  231. package/src/client/public/default/apple-touch-startup-image-1136x640.png +0 -0
  232. package/src/client/public/default/apple-touch-startup-image-1170x2532.png +0 -0
  233. package/src/client/public/default/apple-touch-startup-image-1179x2556.png +0 -0
  234. package/src/client/public/default/apple-touch-startup-image-1242x2208.png +0 -0
  235. package/src/client/public/default/apple-touch-startup-image-1242x2688.png +0 -0
  236. package/src/client/public/default/apple-touch-startup-image-1284x2778.png +0 -0
  237. package/src/client/public/default/apple-touch-startup-image-1290x2796.png +0 -0
  238. package/src/client/public/default/apple-touch-startup-image-1334x750.png +0 -0
  239. package/src/client/public/default/apple-touch-startup-image-1488x2266.png +0 -0
  240. package/src/client/public/default/apple-touch-startup-image-1536x2048.png +0 -0
  241. package/src/client/public/default/apple-touch-startup-image-1620x2160.png +0 -0
  242. package/src/client/public/default/apple-touch-startup-image-1640x2160.png +0 -0
  243. package/src/client/public/default/apple-touch-startup-image-1668x2224.png +0 -0
  244. package/src/client/public/default/apple-touch-startup-image-1668x2388.png +0 -0
  245. package/src/client/public/default/apple-touch-startup-image-1792x828.png +0 -0
  246. package/src/client/public/default/apple-touch-startup-image-2048x1536.png +0 -0
  247. package/src/client/public/default/apple-touch-startup-image-2048x2732.png +0 -0
  248. package/src/client/public/default/apple-touch-startup-image-2160x1620.png +0 -0
  249. package/src/client/public/default/apple-touch-startup-image-2160x1640.png +0 -0
  250. package/src/client/public/default/apple-touch-startup-image-2208x1242.png +0 -0
  251. package/src/client/public/default/apple-touch-startup-image-2224x1668.png +0 -0
  252. package/src/client/public/default/apple-touch-startup-image-2266x1488.png +0 -0
  253. package/src/client/public/default/apple-touch-startup-image-2388x1668.png +0 -0
  254. package/src/client/public/default/apple-touch-startup-image-2436x1125.png +0 -0
  255. package/src/client/public/default/apple-touch-startup-image-2532x1170.png +0 -0
  256. package/src/client/public/default/apple-touch-startup-image-2556x1179.png +0 -0
  257. package/src/client/public/default/apple-touch-startup-image-2688x1242.png +0 -0
  258. package/src/client/public/default/apple-touch-startup-image-2732x2048.png +0 -0
  259. package/src/client/public/default/apple-touch-startup-image-2778x1284.png +0 -0
  260. package/src/client/public/default/apple-touch-startup-image-2796x1290.png +0 -0
  261. package/src/client/public/default/apple-touch-startup-image-640x1136.png +0 -0
  262. package/src/client/public/default/apple-touch-startup-image-750x1334.png +0 -0
  263. package/src/client/public/default/apple-touch-startup-image-828x1792.png +0 -0
  264. package/src/client/public/default/assets/background/white.jpg +0 -0
  265. package/src/client/public/default/browserconfig.xml +1 -1
  266. package/src/client/public/default/favicon-16x16.png +0 -0
  267. package/src/client/public/default/favicon-32x32.png +0 -0
  268. package/src/client/public/default/favicon-48x48.png +0 -0
  269. package/src/client/public/default/favicon.ico +0 -0
  270. package/src/client/public/default/manifest.webmanifest +5 -5
  271. package/src/client/public/default/mstile-144x144.png +0 -0
  272. package/src/client/public/default/mstile-150x150.png +0 -0
  273. package/src/client/public/default/mstile-310x150.png +0 -0
  274. package/src/client/public/default/mstile-310x310.png +0 -0
  275. package/src/client/public/default/mstile-70x70.png +0 -0
  276. package/src/client/public/default/yandex-browser-50x50.png +0 -0
  277. package/src/client/public/default/yandex-browser-manifest.json +1 -1
  278. package/src/client/ssr/RootDocument.js +1 -1
  279. package/src/client/ssr/body/404.js +1 -1
  280. package/src/client/ssr/body/500.js +1 -1
  281. package/src/client/ssr/body/CacheControl.js +1 -1
  282. package/src/client/ssr/body/CyberiaDefaultSplashScreen.js +1 -1
  283. package/src/client/ssr/body/DefaultSplashScreen.js +1 -1
  284. package/src/client/ssr/body/SwaggerDarkMode.js +1 -1
  285. package/src/client/ssr/body/UnderpostDefaultSplashScreen.js +1 -1
  286. package/src/client/ssr/head/CryptokoynScripts.js +1 -1
  287. package/src/client/ssr/head/Css.js +1 -1
  288. package/src/client/ssr/head/CyberiaPortalScripts.js +1 -1
  289. package/src/client/ssr/head/DefaultScripts.js +1 -1
  290. package/src/client/ssr/head/ItemledgerScripts.js +1 -1
  291. package/src/client/ssr/head/Microdata.js +1 -1
  292. package/src/client/ssr/head/Production.js +1 -1
  293. package/src/client/ssr/head/Pwa.js +1 -1
  294. package/src/client/ssr/head/PwaItemledger.js +1 -1
  295. package/src/client/ssr/head/Seo.js +1 -1
  296. package/src/client/ssr/head/UnderpostScripts.js +1 -1
  297. package/src/client/ssr/mailer/DefaultRecoverEmail.js +1 -1
  298. package/src/client/ssr/mailer/DefaultVerifyEmail.js +1 -1
  299. package/src/client/ssr/views/Cyberia404.js +7 -5
  300. package/src/client/ssr/views/CyberiaServerMetrics.js +1 -1
  301. package/src/client/ssr/views/Maintenance.js +1 -1
  302. package/src/client/ssr/views/NoNetworkConnection.js +1 -1
  303. package/src/client/ssr/views/Test.js +1 -1
  304. package/src/client/sw/core.sw.js +20 -14
  305. package/src/client-builder/client-build-docs.js +61 -46
  306. package/src/client-builder/client-build-live.js +2 -2
  307. package/src/client-builder/client-build.js +38 -30
  308. package/src/client-builder/client-dev-server.js +3 -3
  309. package/src/client-builder/client-icons.js +2 -2
  310. package/src/client-builder/ssr.js +3 -3
  311. package/src/client.build.js +3 -6
  312. package/src/client.dev.js +3 -6
  313. package/src/db/DataBaseProvider.js +186 -3
  314. package/src/db/mariadb/MariaDB.js +3 -2
  315. package/src/db/mongo/MongoBootstrap.js +273 -101
  316. package/src/db/mongo/MongooseDB.js +7 -8
  317. package/src/{server/valkey.js → db/valkey/Valkey.js} +5 -4
  318. package/src/grpc/cyberia/grpc-server.js +1 -1
  319. package/src/index.js +79 -23
  320. package/src/mailer/EmailRender.js +2 -2
  321. package/src/mailer/MailerInterceptor.js +87 -0
  322. package/src/mailer/MailerProvider.js +50 -6
  323. package/src/projects/cyberia/atlas-sprite-sheet-generator.js +1 -1
  324. package/src/projects/cyberia/besu-genesis-generator.js +3 -3
  325. package/src/projects/cyberia/catalog-cyberia.js +53 -10
  326. package/src/projects/cyberia/gemini-client.js +1 -1
  327. package/src/projects/cyberia/generate-saga.js +1 -1
  328. package/src/projects/cyberia/hot-reload-trigger.js +1 -1
  329. package/src/projects/cyberia/instance-data.js +1 -1
  330. package/src/projects/cyberia/ipfs-client.js +4 -4
  331. package/src/projects/cyberia/map-preview-generator.js +1 -1
  332. package/src/projects/cyberia/object-layer.js +1 -1
  333. package/src/projects/cyberia/semantic-layer-generator.js +1 -1
  334. package/src/projects/underpost/catalog-underpost.js +9 -1
  335. package/src/proxy.js +4 -7
  336. package/src/runtime/cyberia-client/Dockerfile +9 -4
  337. package/src/runtime/cyberia-client/Dockerfile.dev +8 -2
  338. package/src/runtime/cyberia-server/Dockerfile +9 -4
  339. package/src/runtime/cyberia-server/Dockerfile.dev +8 -2
  340. package/src/runtime/engine-cyberia/Dockerfile +25 -9
  341. package/src/runtime/engine-cyberia/Dockerfile.dev +25 -9
  342. package/src/runtime/engine-cyberia/Dockerfile.test +4 -4
  343. package/src/runtime/engine-cyberia/docker-compose.yml +7 -7
  344. package/src/runtime/express/Express.js +32 -27
  345. package/src/runtime/lampp/Lampp.js +22 -70
  346. package/src/runtime/nginx/Nginx.js +1 -1
  347. package/src/runtime/wp/Wp.js +16 -48
  348. package/src/server/{catalog.js → build/catalog.js} +15 -5
  349. package/src/server/build/coverage.js +117 -0
  350. package/src/server/build/execution.js +402 -0
  351. package/src/server/build/package.js +465 -0
  352. package/src/server/build/testing.js +528 -0
  353. package/src/server/{dns.js → network/dns.js} +144 -11
  354. package/src/server/{forward-proxy.js → network/forward-proxy.js} +10 -18
  355. package/src/server/{middlewares.js → network/middlewares.js} +3 -3
  356. package/src/server/network/node-capability.js +98 -0
  357. package/src/server/{peer.js → network/peer.js} +3 -3
  358. package/src/server/{proxy.js → network/proxy.js} +7 -13
  359. package/src/server/network/router.js +356 -0
  360. package/src/server/{tls.js → network/tls.js} +2 -2
  361. package/src/server/{underpost-compression.js → network/underpost-compression.js} +1 -1
  362. package/src/server/{underpost-gateway.js → network/underpost-gateway.js} +7 -7
  363. package/src/server/{underpost-ingress.js → network/underpost-ingress.js} +2 -2
  364. package/src/server/{cri.js → ops/cri.js} +2 -2
  365. package/src/server/{cron.js → ops/cron.js} +349 -74
  366. package/src/server/ops/event-notification.js +284 -0
  367. package/src/server/{logger.js → ops/logger.js} +108 -23
  368. package/src/server/ops/monitoring.js +1724 -0
  369. package/src/server/{systemd.js → ops/systemd.js} +55 -1
  370. package/src/server/{conf.js → runtime/conf.js} +513 -422
  371. package/src/server/runtime/config-scope.js +215 -0
  372. package/src/server/runtime/environment.js +149 -0
  373. package/src/server/{process.js → runtime/process.js} +153 -12
  374. package/src/server/{runtime-status.js → runtime/runtime-status.js} +155 -16
  375. package/src/server/{runtime.js → runtime/runtime.js} +12 -8
  376. package/src/server/{start.js → runtime/start.js} +128 -39
  377. package/src/server/{auth.js → security/auth.js} +7 -8
  378. package/src/server/security/container-storage.js +382 -0
  379. package/src/server/{crypto.js → security/crypto.js} +1 -1
  380. package/src/server/{selinux.js → security/selinux.js} +1 -1
  381. package/src/server/{backup.js → storage/backup.js} +17 -8
  382. package/src/server/{data-query.js → storage/data-query.js} +1 -1
  383. package/src/server/{downloader.js → storage/downloader.js} +2 -2
  384. package/src/server/storage/repository.js +68 -0
  385. package/src/server.js +4 -7
  386. package/src/ws/IoInterface.js +1 -1
  387. package/src/ws/IoServer.js +1 -1
  388. package/src/ws/core/core.ws.connection.js +1 -1
  389. package/src/ws/core/core.ws.emit.js +1 -1
  390. package/src/ws/core/core.ws.server.js +1 -1
  391. package/src/ws/default/default.ws.connection.js +1 -1
  392. package/src/ws/default/default.ws.emit.js +1 -1
  393. package/src/ws/default/default.ws.server.js +1 -1
  394. package/test/e2e/event-e2e-public-ingress-down.js +45 -0
  395. package/test/e2e/event-e2e-wireguard-server-down.js +38 -0
  396. package/test/e2e/event-e2e-wireguard-spoke-down.js +40 -0
  397. package/test/{api.test.js → integration/app/api.test.js} +33 -14
  398. package/test/integration/app/cyberia/cyberia-cli-plain-reads.test.js +30 -0
  399. package/test/{cyberia-instance-conf-defaults.test.js → integration/app/cyberia/cyberia-instance-conf-defaults.test.js} +1 -1
  400. package/test/integration/app/cyberia/cyberia-load.test.js +467 -0
  401. package/test/integration/app/cyberia/fallback-world-capture.test.js +253 -0
  402. package/test/integration/app/cyberia/object-layer-item-id.test.js +327 -0
  403. package/test/{shape-generator.test.js → integration/app/cyberia/shape-generator.test.js} +1 -1
  404. package/test/integration/infra/1-security/config-scope.test.js +305 -0
  405. package/test/integration/infra/1-security/container-storage.test.js +356 -0
  406. package/test/integration/infra/1-security/in-pod-cli-surface.test.js +86 -0
  407. package/test/integration/infra/1-security/secret-onboarding.test.js +930 -0
  408. package/test/{selinux.test.js → integration/infra/1-security/selinux.test.js} +2 -4
  409. package/test/{sops-secret-store.test.js → integration/infra/1-security/sops-secret-store.test.js} +415 -61
  410. package/test/integration/infra/1-security/systemd-service.test.js +70 -0
  411. package/test/integration/infra/1-security/underpost-config-secret.test.js +367 -0
  412. package/test/integration/infra/2-network/dns-firewall.test.js +566 -0
  413. package/test/integration/infra/2-network/node-capability.test.js +182 -0
  414. package/test/integration/infra/2-network/wireguard-cli.test.js +1163 -0
  415. package/test/{wireguard-edge.test.js → integration/infra/2-network/wireguard-edge.test.js} +609 -55
  416. package/test/{cluster-instances.test.js → integration/infra/3-cluster/cluster-instances.test.js} +11 -15
  417. package/test/{deploy-node-placement.test.js → integration/infra/3-cluster/deploy-node-placement.test.js} +3 -3
  418. package/test/integration/infra/3-cluster/docker-compose-stack.test.js +313 -0
  419. package/test/integration/infra/4-ingress/deploy-routes.test.js +379 -0
  420. package/test/integration/infra/4-ingress/gateway-static-assets.test.js +453 -0
  421. package/test/{instance-traffic-plan.test.js → integration/infra/4-ingress/instance-traffic-plan.test.js} +10 -6
  422. package/test/{underpost-gateway.test.js → integration/infra/4-ingress/underpost-gateway.test.js} +6 -6
  423. package/test/{underpost-ingress.test.js → integration/infra/4-ingress/underpost-ingress.test.js} +4 -4
  424. package/test/integration/infra/5-observability/cron-jobs.test.js +652 -0
  425. package/test/{deploy-monitor.test.js → integration/infra/5-observability/deploy-monitor.test.js} +29 -31
  426. package/test/integration/infra/5-observability/event-notification.test.js +197 -0
  427. package/test/integration/infra/5-observability/event-remediation.test.js +502 -0
  428. package/test/integration/infra/5-observability/event-targets.test.js +1174 -0
  429. package/test/integration/infra/5-observability/monitoring-stack.test.js +902 -0
  430. package/test/support/shell-harness.js +73 -0
  431. package/test/unit/build-template.test.js +97 -0
  432. package/test/unit/build-workflow-offline.test.js +132 -0
  433. package/test/unit/catalog.test.js +71 -0
  434. package/test/unit/client-build-docs.test.js +334 -0
  435. package/test/unit/conf-loading.test.js +303 -0
  436. package/test/unit/conf-resolution.test.js +979 -0
  437. package/test/unit/coverage-artifact.test.js +130 -0
  438. package/test/{crypto.test.js → unit/crypto.test.js} +1 -1
  439. package/test/unit/deploy-env-resolution.test.js +38 -0
  440. package/test/unit/deploy-log-table.test.js +447 -0
  441. package/test/unit/execution-profiles.test.js +219 -0
  442. package/test/unit/fleet-sync-source.test.js +149 -0
  443. package/test/unit/logger-redaction.test.js +112 -0
  444. package/test/unit/package.test.js +403 -0
  445. package/test/unit/prepare-host.test.js +299 -0
  446. package/test/unit/process-environment.test.js +18 -0
  447. package/test/unit/propagation-message.test.js +78 -0
  448. package/test/unit/redeploy-plan.test.js +24 -0
  449. package/test/unit/release-bump.test.js +474 -0
  450. package/test/unit/ssh-output-redaction.test.js +28 -0
  451. package/test/unit/start-options.test.js +46 -0
  452. package/test/unit/test-tiers.test.js +193 -0
  453. package/vitest.config.js +58 -0
  454. package/.nycrc +0 -9
  455. package/deploy/lib/logging.sh +0 -96
  456. package/manifests/cronjobs/dd-cron/dd-cron-dns.yaml +0 -48
  457. package/manifests/mongodb/pv-pvc.yaml +0 -59
  458. package/scripts/coverall-test-cyberia.sh +0 -24
  459. package/scripts/coverall-test.sh +0 -24
  460. package/scripts/link-local-underpost-cli.sh +0 -6
  461. package/src/api/user/user.build.js +0 -16
  462. package/src/cli/env.js +0 -177
  463. package/src/client/components/core/Blockchain.js +0 -41
  464. package/src/client/components/core/Blog.js +0 -9
  465. package/src/client/components/core/KeyboardAvoidance.js +0 -145
  466. package/src/client/public/default/assets/background/dark.jpg +0 -0
  467. package/src/client/public/default/assets/background/white0-min.jpg +0 -0
  468. package/src/client/public/default/assets/background/white0.jpg +0 -0
  469. package/src/client/public/doc/favicon.ico +0 -0
  470. package/src/client/public/doc/sitemap +0 -148
  471. package/src/server/environment.js +0 -98
@@ -52,7 +52,7 @@ const main = () => {
52
52
  );
53
53
  };
54
54
 
55
- SrrComponent = () =>
55
+ SSRComponent = () =>
56
56
  html`<script>
57
57
  {
58
58
  const s = ${s};
@@ -56,7 +56,7 @@ const main = () => {
56
56
  );
57
57
  };
58
58
 
59
- SrrComponent = () =>
59
+ SSRComponent = () =>
60
60
  html`<script>
61
61
  {
62
62
  const s = ${s};
@@ -187,7 +187,7 @@ const main = () => {
187
187
  );
188
188
  };
189
189
 
190
- SrrComponent = () =>
190
+ SSRComponent = () =>
191
191
  html`<script>
192
192
  {
193
193
  const s = ${s};
@@ -15,6 +15,12 @@ const CACHE_PREFIX = payload.CACHE_PREFIX || 'engine-core';
15
15
  const PRE_CACHED_RESOURCES = Array.isArray(payload.PRE_CACHED_RESOURCES) ? payload.PRE_CACHED_RESOURCES : [];
16
16
  const OFFLINE_URL = payload.OFFLINE_URL || '/offline/index.html';
17
17
  const MAINTENANCE_URL = payload.MAINTENANCE_URL || '/maintenance/index.html';
18
+ const PROXY_ROOT = payload.PROXY_PATH && payload.PROXY_PATH !== '/' ? payload.PROXY_PATH.replace(/\/$/, '') : '';
19
+ const isDocumentationPath = (pathname) =>
20
+ [`${PROXY_ROOT}/docs`, `${PROXY_ROOT}/api-docs`].some(
21
+ (prefix) => pathname === prefix || pathname.startsWith(`${prefix}/`),
22
+ );
23
+ const isDistributionPath = (pathname) => pathname.startsWith(`${PROXY_ROOT}/dist/`);
18
24
 
19
25
  // Dedicated cache for fallback pages so they're available even if precacheAndRoute
20
26
  // fails (e.g. a precache manifest entry returns non-200 during install).
@@ -34,7 +40,7 @@ const inlineFallback = (kind) => {
34
40
  const msg =
35
41
  kind === 'offline'
36
42
  ? 'You are offline. Please check your internet connection and try again.'
37
- : 'The server is under maintenance. We\'ll be back shortly.';
43
+ : "The server is under maintenance. We'll be back shortly.";
38
44
  const html = `<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1,viewport-fit=cover"><title>${title}</title><style>body{display:flex;flex-direction:column;align-items:center;justify-content:center;min-height:100vh;margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif;background:#f5f5f5;color:#333;padding:1rem;text-align:center}h1{font-size:2rem;margin-bottom:.5rem}p{font-size:1rem;color:#666;max-width:24rem}</style></head><body><h1>${icon} ${title}</h1><p>${msg}</p></body></html>`;
39
45
  return new Response(html, {
40
46
  status: 200,
@@ -74,17 +80,17 @@ const getFallback = async (kind) => {
74
80
  try {
75
81
  const fetchResp = await fetch(primary, { credentials: 'same-origin' });
76
82
  if (fetchResp.ok) {
77
- cache.put(primary, fetchResp.clone()).catch(() => { });
83
+ cache.put(primary, fetchResp.clone()).catch(() => {});
78
84
  return fetchResp;
79
85
  }
80
- } catch (_) { }
86
+ } catch (_) {}
81
87
  try {
82
88
  const fetchResp = await fetch(secondary, { credentials: 'same-origin' });
83
89
  if (fetchResp.ok) {
84
- cache.put(secondary, fetchResp.clone()).catch(() => { });
90
+ cache.put(secondary, fetchResp.clone()).catch(() => {});
85
91
  return fetchResp;
86
92
  }
87
- } catch (_) { }
93
+ } catch (_) {}
88
94
  }
89
95
 
90
96
  // ── 3. Ultimate inline fallback ────────────────────────────────────────
@@ -160,6 +166,8 @@ registerRoute(
160
166
  ({ request, url }) =>
161
167
  request.method === 'GET' &&
162
168
  url.origin === self.location.origin &&
169
+ !isDocumentationPath(url.pathname) &&
170
+ !isDistributionPath(url.pathname) &&
163
171
  ['style', 'script', 'font', 'image'].includes(request.destination),
164
172
  new StaleWhileRevalidate({
165
173
  cacheName: `${CACHE_PREFIX}-assets`,
@@ -212,7 +220,7 @@ registerRoute(
212
220
  // ─────────────────────────────────────────────────────────────────────────────
213
221
 
214
222
  registerRoute(
215
- ({ request }) => request.mode === 'navigate',
223
+ ({ request, url }) => request.mode === 'navigate' && !isDocumentationPath(url.pathname),
216
224
  async ({ event }) => {
217
225
  // ── 1. Check browser offline state ────────────────────────────────────
218
226
  if (typeof navigator !== 'undefined' && navigator.onLine === false) {
@@ -225,7 +233,7 @@ registerRoute(
225
233
  if (preload && preload.status < 500) {
226
234
  // Fire-and-forget: eagerly cache fallback pages in the background
227
235
  // after a successful navigation so they're available when offline.
228
- cacheFallbackPages().catch(() => { });
236
+ cacheFallbackPages().catch(() => {});
229
237
  return preload;
230
238
  }
231
239
  } catch (_) {
@@ -243,18 +251,17 @@ registerRoute(
243
251
  if (response.ok) {
244
252
  // Cache the successful response for future navigations
245
253
  const cache = await caches.open(`${CACHE_PREFIX}-pages`);
246
- cache.put(event.request, response.clone()).catch(() => { });
254
+ cache.put(event.request, response.clone()).catch(() => {});
247
255
 
248
256
  // Eagerly cache fallback pages in the background
249
- cacheFallbackPages().catch(() => { });
257
+ cacheFallbackPages().catch(() => {});
250
258
 
251
259
  return response;
252
260
  }
253
261
 
254
262
  return response;
255
263
  } catch (_) {
256
- const reallyOffline =
257
- typeof navigator !== 'undefined' && navigator.onLine === false;
264
+ const reallyOffline = typeof navigator !== 'undefined' && navigator.onLine === false;
258
265
  return getFallback(reallyOffline ? 'offline' : 'maintenance');
259
266
  }
260
267
  },
@@ -263,12 +270,11 @@ registerRoute(
263
270
  // ─── Global catch handler (non-navigation failures) ──────────────────────────
264
271
  setCatchHandler(async ({ request }) => {
265
272
  if (request.mode === 'navigate') {
266
- const reallyOffline =
267
- typeof navigator !== 'undefined' && navigator.onLine === false;
273
+ const reallyOffline = typeof navigator !== 'undefined' && navigator.onLine === false;
268
274
  return getFallback(reallyOffline ? 'offline' : 'maintenance');
269
275
  }
270
276
  return new Response(JSON.stringify({ status: 'error', message: 'request failed' }), {
271
277
  status: 503,
272
278
  headers: { 'Content-Type': 'application/json' },
273
279
  });
274
- });
280
+ });
@@ -7,8 +7,13 @@
7
7
  */
8
8
 
9
9
  import fs from 'fs-extra';
10
- import { shellExec } from '../server/process.js';
11
- import { loggerFactory } from '../server/logger.js';
10
+ import { shellExec } from '../server/runtime/process.js';
11
+ import { loggerFactory } from '../server/ops/logger.js';
12
+ import {
13
+ coverageReportCandidates,
14
+ coverageUnavailablePage,
15
+ resolveCoverageReportPath,
16
+ } from '../server/build/coverage.js';
12
17
  import { JSONweb } from './client-formatted.js';
13
18
  import { ssrFactory } from './ssr.js';
14
19
 
@@ -20,6 +25,8 @@ import { ssrFactory } from './ssr.js';
20
25
  * @param {string} options.host - The hostname for the API
21
26
  * @param {string} options.path - The base path for the API
22
27
  * @param {number} options.port - The port number for the API
28
+ * @param {string} [options.apiBaseHost] - Host serving the API when it is split from the client
29
+ * @param {string} [options.apiBaseProxyPath] - Proxy path of the API runtime when it is split from the client
23
30
  * @param {Object} options.metadata - Metadata for the API documentation
24
31
  * @param {Array<string>} options.apis - List of API modules to document
25
32
  * @param {string} options.publicClientId - Client ID for the public documentation
@@ -30,6 +37,8 @@ const buildApiDocs = async ({
30
37
  host,
31
38
  path,
32
39
  port,
40
+ apiBaseHost,
41
+ apiBaseProxyPath,
33
42
  metadata = {},
34
43
  apis = [],
35
44
  publicClientId,
@@ -37,7 +46,10 @@ const buildApiDocs = async ({
37
46
  packageData,
38
47
  }) => {
39
48
  const logger = loggerFactory(import.meta);
40
- const basePath = path === '/' ? `${process.env.BASE_API}` : `/${process.env.BASE_API}`;
49
+ // The spec is rendered by the client instance but exercised against the API runtime;
50
+ // when the two are split the server url must follow the API, not the docs page.
51
+ const apiPath = apiBaseProxyPath ? apiBaseProxyPath : path;
52
+ const basePath = apiPath === '/' ? `${process.env.BASE_API}` : `/${process.env.BASE_API}`;
41
53
 
42
54
  const doc = {
43
55
  info: {
@@ -49,8 +61,8 @@ const buildApiDocs = async ({
49
61
  {
50
62
  url:
51
63
  process.env.NODE_ENV === 'development'
52
- ? `http://localhost:${port}${path}${basePath}`
53
- : `https://${host}${path}${basePath}`,
64
+ ? `http://${apiBaseHost ? apiBaseHost : `localhost:${port}`}${apiPath}${basePath}`
65
+ : `https://${apiBaseHost ? apiBaseHost : host}${apiPath}${basePath}`,
54
66
  description: `${process.env.NODE_ENV} server`,
55
67
  },
56
68
  ],
@@ -371,63 +383,60 @@ const buildJsDocs = async ({ host, path, metadata = {}, publicClientId, docs, do
371
383
  fs.writeFileSync(tmpConfigPath, JSON.stringify(runtimeConfig, null, 2), 'utf8');
372
384
  logger.warn('build typedoc view', docsDestination);
373
385
 
374
- shellExec(`node_modules/.bin/typedoc --options ${tmpConfigPath}`, { silent: true });
386
+ // Non-fatal like every other docs surface: a typedoc failure leaves the reference site
387
+ // unpublished, it does not take a rollout down with it.
388
+ const result = shellExec(`node_modules/.bin/typedoc --options ${tmpConfigPath}`, {
389
+ silent: true,
390
+ silentOnError: true,
391
+ });
375
392
 
376
393
  fs.removeSync(tmpConfigPath);
394
+
395
+ if (fs.existsSync(`${docsDestination}index.html`)) return;
396
+ logger.warn('typedoc produced no HTML index', {
397
+ docsDestination,
398
+ code: result?.code,
399
+ stderr: `${result?.stderr ?? ''}`.trim().split('\n').slice(-1)[0],
400
+ });
377
401
  };
378
402
 
379
403
  /**
380
- * Builds test coverage documentation
404
+ * Publishes the coverage HTML report a build carried into the docs route.
405
+ *
406
+ * Never generates it: the report belongs to the test stage, which bundles it into the
407
+ * deploy artifact (see {@link module:src/server/build/coverage.js}). A client build that
408
+ * shelled out to `npm test` here spent minutes of a pod's build phase on a runner the
409
+ * workload has no business holding, and every expected non-zero exit of that suite latched
410
+ * `container-status=error`, failing the deployment monitor on a healthy rollout.
381
411
  * @function buildCoverage
382
412
  * @memberof clientBuildDocs
383
413
  * @param {Object} options - Coverage build options
384
414
  * @param {Object} options.docs - Documentation config from server conf
385
- * @param {string} options.docs.coveragePath - Directory where coverage reports are generated
415
+ * @param {string} options.docs.coveragePath - Source tree root the report was bundled into
416
+ * @param {string} [options.docs.coverageOutputDir] - Route directory under the docs path
386
417
  * @param {string} options.docsDestination - Resolved output path where docs were built
387
418
  */
388
419
  const buildCoverage = async ({ docs, docsDestination }) => {
389
420
  const logger = loggerFactory(import.meta);
390
421
  const { coveragePath, coverageOutputDir = 'coverage' } = docs;
422
+ // No configured source tree is a deploy that never declared coverage — not a missing report.
423
+ if (!coveragePath) return;
391
424
 
392
- const coverageOutputPath = `${coveragePath}/coverage`;
393
- if (!fs.existsSync(coverageOutputPath)) {
394
- const pkgPath = `${coveragePath}/package.json`;
395
- if (fs.existsSync(pkgPath)) {
396
- const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8'));
397
- if (pkg.scripts && pkg.scripts.coverage) {
398
- logger.info('generating coverage report', coveragePath);
399
- try {
400
- await shellExec(`cd ${coveragePath} && npm run coverage`, { silent: true });
401
- } catch (err) {
402
- logger.warn('coverage generation failed (non-fatal), skipping:', err.message);
403
- return;
404
- }
405
- } else if (pkg.scripts && pkg.scripts.test) {
406
- logger.info('generating coverage via test', coveragePath);
407
- try {
408
- await shellExec(`cd ${coveragePath} && npm test`, { silent: true, silentOnError: true });
409
- } catch (err) {
410
- logger.warn('coverage generation failed (non-fatal), skipping:', err.message);
411
- return;
412
- }
413
- }
414
- }
415
- }
425
+ const coverageBuildPath = `${docsDestination}${coverageOutputDir}`;
426
+ const reportPath = resolveCoverageReportPath(coveragePath);
416
427
 
417
- if (fs.existsSync(coverageOutputPath) && fs.readdirSync(coverageOutputPath).length > 0) {
418
- const coverageBuildPath = `${docsDestination}${coverageOutputDir}`;
419
- fs.mkdirSync(coverageBuildPath, { recursive: true });
420
- // Hardhat 3 outputs HTML to coverage/html/; Hardhat 2 / c8 output directly to coverage/
421
- const coverageHtmlSubdir = `${coverageOutputPath}/html`;
422
- if (fs.existsSync(coverageHtmlSubdir) && fs.existsSync(`${coverageHtmlSubdir}/index.html`)) {
423
- fs.copySync(coverageHtmlSubdir, coverageBuildPath);
424
- } else {
425
- fs.copySync(coverageOutputPath, coverageBuildPath);
426
- }
427
- logger.warn('build coverage', coverageBuildPath);
428
- } else {
429
- logger.warn('no coverage output found, skipping', coverageOutputPath);
428
+ if (!reportPath) {
429
+ fs.outputFileSync(`${coverageBuildPath}/index.html`, coverageUnavailablePage(), 'utf8');
430
+ logger.warn('no coverage report bundled, publishing the unavailable page', {
431
+ searched: coverageReportCandidates(coveragePath),
432
+ published: coverageBuildPath,
433
+ });
434
+ return;
430
435
  }
436
+
437
+ fs.emptyDirSync(coverageBuildPath);
438
+ fs.copySync(reportPath, coverageBuildPath);
439
+ logger.warn('build coverage', coverageBuildPath);
431
440
  };
432
441
 
433
442
  /**
@@ -438,6 +447,8 @@ const buildCoverage = async ({ docs, docsDestination }) => {
438
447
  * @param {string} options.host - The hostname
439
448
  * @param {string} options.path - The base path
440
449
  * @param {number} options.port - The port number
450
+ * @param {string} [options.apiBaseHost] - Host serving the API when it is split from the client
451
+ * @param {string} [options.apiBaseProxyPath] - Proxy path of the API runtime when it is split from the client
441
452
  * @param {Object} options.metadata - Metadata for the documentation
442
453
  * @param {Array<string>} options.apis - List of API modules to document
443
454
  * @param {string} options.publicClientId - Client ID for the public documentation
@@ -449,6 +460,8 @@ const buildDocs = async ({
449
460
  host,
450
461
  path,
451
462
  port,
463
+ apiBaseHost,
464
+ apiBaseProxyPath,
452
465
  metadata = {},
453
466
  apis = [],
454
467
  publicClientId,
@@ -468,6 +481,8 @@ const buildDocs = async ({
468
481
  host,
469
482
  path,
470
483
  port,
484
+ apiBaseHost,
485
+ apiBaseProxyPath,
471
486
  metadata,
472
487
  apis,
473
488
  publicClientId,
@@ -490,4 +505,4 @@ const buildSwaggerUiOptions = async () => {
490
505
  return { customCss: css, customJsStr: js };
491
506
  };
492
507
 
493
- export { buildDocs, buildSwaggerUiOptions };
508
+ export { buildCoverage, buildDocs, buildSwaggerUiOptions };
@@ -5,8 +5,8 @@
5
5
  */
6
6
 
7
7
  import fs from 'fs-extra';
8
- import { Config, loadConf, readConfJson } from '../server/conf.js';
9
- import { loggerFactory } from '../server/logger.js';
8
+ import { Config, loadConf, readConfJson } from '../server/runtime/conf.js';
9
+ import { loggerFactory } from '../server/ops/logger.js';
10
10
  import { buildClient } from './client-build.js';
11
11
 
12
12
  const logger = loggerFactory(import.meta);
@@ -8,22 +8,23 @@
8
8
 
9
9
  import fs from 'fs-extra';
10
10
  import { transformClientJs, JSONweb } from './client-formatted.js';
11
- import { loggerFactory } from '../server/logger.js';
11
+ import { loggerFactory } from '../server/ops/logger.js';
12
12
  import {
13
13
  getCapVariableName,
14
14
  newInstance,
15
15
  orderArrayFromAttrInt,
16
16
  uniqueArray,
17
17
  } from '../client/components/core/CommonJs.js';
18
- import { readConfJson } from '../server/conf.js';
18
+ import { readConfJson } from '../server/runtime/conf.js';
19
19
  import { minify } from 'html-minifier-terser';
20
20
  import AdmZip from 'adm-zip';
21
21
  import * as dir from 'path';
22
- import { shellExec } from '../server/process.js';
22
+ import { shellExec } from '../server/runtime/process.js';
23
23
  import { SitemapStream, streamToPromise } from 'sitemap';
24
24
  import { Readable } from 'stream';
25
25
  import { buildIcons } from './client-icons.js';
26
- import { statusPageBuildSegment } from '../server/underpost-gateway.js';
26
+ import { statusPageBuildSegment } from '../server/network/underpost-gateway.js';
27
+ import { repositoryIdentityFactory } from '../server/storage/repository.js';
27
28
  import Underpost from '../index.js';
28
29
  import { buildDocs } from './client-build-docs.js';
29
30
  import { ssrFactory } from './ssr.js';
@@ -533,6 +534,7 @@ const defaultSitemapXsl = `<?xml version="1.0" encoding="UTF-8"?>
533
534
  const buildClient = async (
534
535
  options = {
535
536
  deployId: '',
537
+ subConf: '',
536
538
  liveClientBuildPaths: [],
537
539
  instances: [],
538
540
  buildZip: false,
@@ -543,9 +545,13 @@ const buildClient = async (
543
545
  ) => {
544
546
  const logger = loggerFactory(import.meta);
545
547
  const deployId = options.deployId || process.env.DEPLOY_ID;
546
- const confClient = readConfJson(deployId, 'client');
547
- const confServer = readConfJson(deployId, 'server', { loadReplicas: true });
548
- const confSSR = readConfJson(deployId, 'ssr');
548
+ // Carried as an argument rather than re-derived from DEPLOY_SUB_CONF: the caller already
549
+ // resolved which sub-configuration this build is for, and a build that reads a different
550
+ // conf.server than the one its caller loaded renders the wrong set of hosts.
551
+ const subConf = `${options.subConf ?? ''}`.trim();
552
+ const confClient = readConfJson(deployId, 'client', { subConf });
553
+ const confServer = readConfJson(deployId, 'server', { subConf, loadReplicas: true });
554
+ const confSSR = readConfJson(deployId, 'ssr', { subConf });
549
555
  const packageData = JSON.parse(fs.readFileSync(`./package.json`, 'utf8'));
550
556
  const acmeChallengePath = `/.well-known/acme-challenge`;
551
557
  const publicPath = `./public`;
@@ -689,6 +695,18 @@ const buildClient = async (
689
695
  // ''; // process.env.NODE_ENV === 'production' ? `https://${host}` : ``;
690
696
  currentPort++;
691
697
 
698
+ // Every document this instance emits carries the same payload; the SSR
699
+ // views and the client index must never disagree about which repository
700
+ // published them.
701
+ const renderPayload = {
702
+ apiBaseProxyPath,
703
+ apiBaseHost,
704
+ apiBasePath: process.env.BASE_API,
705
+ version: Underpost.version,
706
+ repository: repositoryIdentityFactory(),
707
+ ...(isDevelopment ? { dev: true } : undefined),
708
+ };
709
+
692
710
  const acmeChallengeFullPath = directory
693
711
  ? `${directory}${acmeChallengePath}`
694
712
  : `${publicPath}/${host}${acmeChallengePath}`;
@@ -854,7 +872,7 @@ const buildClient = async (
854
872
  confSSR[view.ssr].head.unshift('Production');
855
873
 
856
874
  for (const ssrHeadComponent of confSSR[view.ssr].head) {
857
- const SrrComponent = await ssrFactory(`./src/client/ssr/head/${ssrHeadComponent}.js`);
875
+ const SSRComponent = await ssrFactory(`./src/client/ssr/head/${ssrHeadComponent}.js`);
858
876
 
859
877
  switch (ssrHeadComponent) {
860
878
  case 'Pwa':
@@ -909,11 +927,11 @@ const buildClient = async (
909
927
  // ],
910
928
  // "prefer_related_applications": true
911
929
  }
912
- if (validPwaBuild) ssrHeadComponents += SrrComponent({ title, ssrPath, canonicalURL, ...metadata });
930
+ if (validPwaBuild) ssrHeadComponents += SSRComponent({ title, ssrPath, canonicalURL, ...metadata });
913
931
  break;
914
932
  case 'Seo':
915
933
  if (metadata) {
916
- ssrHeadComponents += SrrComponent({ title, ssrPath, canonicalURL, ...metadata });
934
+ ssrHeadComponents += SSRComponent({ title, ssrPath, canonicalURL, ...metadata });
917
935
  }
918
936
  break;
919
937
  case 'Microdata':
@@ -925,18 +943,18 @@ const buildClient = async (
925
943
  const microdata = JSON.parse(
926
944
  fs.readFileSync(`./src/client/public/${publicClientId}/microdata.json`, 'utf8'),
927
945
  );
928
- ssrHeadComponents += SrrComponent({ microdata });
946
+ ssrHeadComponents += SSRComponent({ microdata });
929
947
  }
930
948
  break;
931
949
  default:
932
- ssrHeadComponents += SrrComponent({ ssrPath, host, path });
950
+ ssrHeadComponents += SSRComponent({ ssrPath, host, path });
933
951
  break;
934
952
  }
935
953
  }
936
954
 
937
955
  for (const ssrBodyComponent of confSSR[view.ssr].body) {
938
- const SrrComponent = await ssrFactory(`./src/client/ssr/body/${ssrBodyComponent}.js`);
939
- ssrBodyComponents += SrrComponent({
956
+ const SSRComponent = await ssrFactory(`./src/client/ssr/body/${ssrBodyComponent}.js`);
957
+ ssrBodyComponents += SSRComponent({
940
958
  ...metadata,
941
959
  ssrPath,
942
960
  host,
@@ -962,13 +980,7 @@ const buildClient = async (
962
980
  ssrPath,
963
981
  ssrHeadComponents,
964
982
  ssrBodyComponents,
965
- renderPayload: {
966
- apiBaseProxyPath,
967
- apiBaseHost,
968
- apiBasePath: process.env.BASE_API,
969
- version: Underpost.version,
970
- ...(isDevelopment ? { dev: true } : undefined),
971
- },
983
+ renderPayload,
972
984
  renderApi: {
973
985
  JSONweb,
974
986
  },
@@ -1031,6 +1043,8 @@ Sitemap: ${sitemapBaseUrl}/sitemap.xml`,
1031
1043
  host,
1032
1044
  path,
1033
1045
  port,
1046
+ apiBaseHost,
1047
+ apiBaseProxyPath,
1034
1048
  metadata,
1035
1049
  apis,
1036
1050
  publicClientId,
@@ -1064,13 +1078,7 @@ Sitemap: ${sitemapBaseUrl}/sitemap.xml`,
1064
1078
  ssrPath,
1065
1079
  ssrHeadComponents: '<base target="_top">',
1066
1080
  ssrBodyComponents: SsrComponent(),
1067
- renderPayload: {
1068
- apiBaseProxyPath,
1069
- apiBaseHost,
1070
- apiBasePath: process.env.BASE_API,
1071
- version: Underpost.version,
1072
- ...(isDevelopment ? { dev: true } : undefined),
1073
- },
1081
+ renderPayload,
1074
1082
  renderApi: { JSONweb },
1075
1083
  });
1076
1084
 
@@ -1116,7 +1124,7 @@ Sitemap: ${sitemapBaseUrl}/sitemap.xml`,
1116
1124
 
1117
1125
  if (swShouldRebuild) {
1118
1126
  const cacheScope = path === '/' ? 'root' : path.replaceAll('/', '_');
1119
- const renderPayload = {
1127
+ const swRenderPayload = {
1120
1128
  PRE_CACHED_RESOURCES: uniqueArray(PRE_CACHED_RESOURCES),
1121
1129
  PROXY_PATH: path,
1122
1130
  CACHE_PREFIX: `engine-core-${cacheScope}`,
@@ -1127,7 +1135,7 @@ Sitemap: ${sitemapBaseUrl}/sitemap.xml`,
1127
1135
  // Single write: prepend the payload prelude to the transformed SW JS.
1128
1136
  fs.writeFileSync(
1129
1137
  swPublicPath,
1130
- `self.renderPayload = ${JSONweb(renderPayload)};
1138
+ `self.renderPayload = ${JSONweb(swRenderPayload)};
1131
1139
  self.__WB_DISABLE_DEV_LOGS = true;
1132
1140
  ${swTransformedJs}`,
1133
1141
  'utf8',
@@ -6,8 +6,8 @@
6
6
  import fs from 'fs-extra';
7
7
  import nodemon from 'nodemon';
8
8
  import dotenv from 'dotenv';
9
- import { shellExec } from '../server/process.js';
10
- import { loggerFactory } from '../server/logger.js';
9
+ import { shellExec } from '../server/runtime/process.js';
10
+ import { loggerFactory } from '../server/ops/logger.js';
11
11
  import Underpost from '../index.js';
12
12
 
13
13
  const logger = loggerFactory(import.meta);
@@ -32,7 +32,7 @@ const createClientDevServer = async (
32
32
  const devClientEnvPath = `./engine-private/conf/${deployId}/.env.${process.env.NODE_ENV}.${subConf}-dev-client`;
33
33
  if (fs.existsSync(devClientEnvPath)) dotenv.config({ path: devClientEnvPath, override: true });
34
34
 
35
- await Underpost.repo.client(deployId, `${subConf}-dev-client`.trim(), host, path);
35
+ await Underpost.client.callback(deployId, `${subConf}-dev-client`.trim(), host, path);
36
36
 
37
37
  shellExec(`node src/server ${deployId} ${subConf}-dev-client`.trim(), {
38
38
  async: true,
@@ -4,7 +4,7 @@
4
4
  * @namespace clientIcons
5
5
  */
6
6
  import { favicons } from 'favicons';
7
- import { loggerFactory } from '../server/logger.js';
7
+ import { loggerFactory } from '../server/ops/logger.js';
8
8
  import fs from 'fs-extra';
9
9
  import { getCapVariableName } from '../client/components/core/CommonJs.js';
10
10
 
@@ -99,7 +99,7 @@ const buildIcons = async ({
99
99
 
100
100
  const ssrPath = `./src/client/ssr/head/Pwa${getCapVariableName(publicClientId)}.js`;
101
101
  if (!fs.existsSync(ssrPath))
102
- fs.writeFileSync(ssrPath, 'SrrComponent = () => html`' + response.html.join(`\n`) + '`;', 'utf8');
102
+ fs.writeFileSync(ssrPath, 'SSRComponent = () => html`' + response.html.join(`\n`) + '`;', 'utf8');
103
103
  } catch (error) {
104
104
  logger.error(error.message); // Error description e.g. "An unknown error has occurred"
105
105
  }
@@ -10,7 +10,7 @@ import vm from 'node:vm';
10
10
  import Underpost from '../index.js';
11
11
 
12
12
  import { srcFormatted } from './client-formatted.js';
13
- import { loggerFactory } from '../server/logger.js';
13
+ import { loggerFactory } from '../server/ops/logger.js';
14
14
 
15
15
  const logger = loggerFactory(import.meta);
16
16
 
@@ -22,10 +22,10 @@ const logger = loggerFactory(import.meta);
22
22
  * @memberof ServerSideRendering
23
23
  */
24
24
  const ssrFactory = async (componentPath = `./src/client/ssr/RootDocument.js`) => {
25
- const context = { SrrComponent: () => {}, npm_package_version: Underpost.version };
25
+ const context = { SSRComponent: () => {}, npm_package_version: Underpost.version };
26
26
  vm.createContext(context);
27
27
  vm.runInContext(await srcFormatted(fs.readFileSync(componentPath, 'utf8')), context);
28
- return context.SrrComponent;
28
+ return context.SSRComponent;
29
29
  };
30
30
 
31
31
  /**
@@ -1,11 +1,8 @@
1
1
  'use strict';
2
2
 
3
- // https://nodejs.org/api
4
- // https://expressjs.com/en/4x/api.html
5
-
6
- import { loggerFactory } from './server/logger.js';
7
- import { Config } from './server/conf.js';
8
- import { ProcessController } from './server/process.js';
3
+ import { loggerFactory } from './server/ops/logger.js';
4
+ import { Config } from './server/runtime/conf.js';
5
+ import { ProcessController } from './server/runtime/process.js';
9
6
  import { clientLiveBuild } from './client-builder/client-build-live.js';
10
7
 
11
8
  await Config.build();
package/src/client.dev.js CHANGED
@@ -1,11 +1,8 @@
1
1
  'use strict';
2
2
 
3
- // https://nodejs.org/api
4
- // https://expressjs.com/en/4x/api.html
5
-
6
- import { loggerFactory } from './server/logger.js';
7
- import { ProcessController } from './server/process.js';
8
- import { Config, buildClientStaticConf } from './server/conf.js';
3
+ import { loggerFactory } from './server/ops/logger.js';
4
+ import { ProcessController } from './server/runtime/process.js';
5
+ import { Config, buildClientStaticConf } from './server/runtime/conf.js';
9
6
  import { createClientDevServer } from './client-builder/client-dev-server.js';
10
7
 
11
8
  const logger = loggerFactory(import.meta);