@underpostnet/cyberia 3.3.0 → 3.3.76

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 (568) hide show
  1. package/.dockerignore +1 -0
  2. package/.env.example +17 -5
  3. package/.github/workflows/coverall.cyberia.ci.yml +39 -14
  4. package/.github/workflows/cyberia-client.cd.yml +5 -0
  5. package/.github/workflows/cyberia-server.cd.yml +5 -0
  6. package/.github/workflows/docker-image.cyberia-client.ci.yml +8 -5
  7. package/.github/workflows/docker-image.cyberia-client.dev.ci.yml +8 -3
  8. package/.github/workflows/docker-image.cyberia-server.ci.yml +8 -5
  9. package/.github/workflows/docker-image.cyberia-server.dev.ci.yml +8 -5
  10. package/.github/workflows/docker-image.engine-cyberia.ci.yml +15 -1
  11. package/.github/workflows/docker-image.engine-cyberia.dev.ci.yml +15 -1
  12. package/.github/workflows/engine-cyberia.cd.yml +3 -0
  13. package/.github/workflows/engine-cyberia.ci.yml +4 -5
  14. package/.github/workflows/ghpkg.ci.yml +35 -20
  15. package/.github/workflows/hardhat.ci.yml +12 -11
  16. package/.github/workflows/npmpkg.ci.yml +17 -15
  17. package/.github/workflows/publish.cyberia.ci.yml +44 -0
  18. package/.github/workflows/pwa-microservices-template-test.ci.yml +2 -2
  19. package/.github/workflows/release.cd.yml +1 -0
  20. package/.prettierignore +1 -0
  21. package/AGENTS.md +96 -0
  22. package/CHANGELOG.md +653 -2513
  23. package/CLI-HELP.md +323 -157
  24. package/Dockerfile +25 -9
  25. package/Dockerfile.dev +25 -9
  26. package/Dockerfile.test +5 -5
  27. package/README.md +48 -28
  28. package/bin/build.js +86 -41
  29. package/bin/build.template.js +8 -3
  30. package/bin/cyberia.js +1494 -1403
  31. package/bin/deploy.js +18 -104
  32. package/bin/index.js +1494 -1403
  33. package/compose.env +17 -5
  34. package/conf.js +98 -7
  35. package/deploy/cyberia-client/deploy.sh +46 -0
  36. package/deploy/cyberia-client/package.sh +17 -0
  37. package/deploy/cyberia-client/state.sh +15 -0
  38. package/deploy/cyberia-server/deploy.sh +46 -0
  39. package/deploy/cyberia-server/package.sh +17 -0
  40. package/deploy/cyberia-server/state.sh +15 -0
  41. package/deploy/dd-cyberia/deploy.sh +9 -29
  42. package/deploy/dd-cyberia/init.sh +38 -45
  43. package/deploy/dd-cyberia/package.sh +16 -0
  44. package/deploy/dd-cyberia/state.sh +14 -0
  45. package/deploy/dd-cyberia/sync-deploy.sh +133 -147
  46. package/deploy/lib/config.sh +29 -0
  47. package/deploy/lib/github-actions-logging.sh +610 -0
  48. package/deploy/lib/host.sh +194 -0
  49. package/deploy/lib/state.sh +65 -0
  50. package/deploy/pwa-microservices-template/deploy.sh +17 -42
  51. package/deploy/release/deploy.sh +9 -41
  52. package/deployment.yaml +7 -2
  53. package/docker-compose.yml +23 -17
  54. package/examples/static-page/README.md +19 -19
  55. package/examples/static-page/ssr-components/CustomPage.js +2 -2
  56. package/hardhat/hardhat.config.js +1 -6
  57. package/hardhat/package-lock.json +101 -40
  58. package/hardhat/package.json +2 -2
  59. package/manifests/alertmanager/deployment.yaml +81 -0
  60. package/manifests/blackbox-exporter/deployment.yaml +75 -0
  61. package/manifests/cronjobs/dd-cron/dd-cron-backup.yaml +32 -7
  62. package/manifests/cronjobs/dd-cron/dd-cron-vultr.yaml +32 -7
  63. package/manifests/deployment/dd-cyberia-development/deployment.yaml +7 -2
  64. package/manifests/deployment/dd-default-development/deployment.yaml +2 -2
  65. package/manifests/deployment/mongo-express/deployment.yaml +46 -27
  66. package/manifests/deployment/mongo-express/kustomization.yaml +9 -0
  67. package/manifests/deployment/mongo-express/mongo-express-nodeport.yaml +18 -0
  68. package/manifests/deployment/mongo-express/service.yaml +16 -0
  69. package/manifests/deployment/mongo-express-no-auth/disable-mongodb-auth.yaml +16 -0
  70. package/manifests/deployment/mongo-express-no-auth/kustomization.yaml +16 -0
  71. package/manifests/grafana/deployment.yaml +26 -7
  72. package/manifests/grafana/kustomization.yaml +1 -0
  73. package/manifests/grafana/service.yaml +6 -1
  74. package/manifests/mariadb/pv.yaml +1 -0
  75. package/manifests/mongodb/statefulset.yaml +9 -2
  76. package/manifests/mysql/pv-pvc.yaml +14 -1
  77. package/manifests/postgresql/pv.yaml +12 -1
  78. package/manifests/postgresql/pvc.yaml +1 -0
  79. package/manifests/prometheus/deployment.yaml +18 -22
  80. package/package.json +87 -12
  81. package/scripts/event-monitor.sh +56 -0
  82. package/scripts/k3s-node-setup.sh +27 -14
  83. package/scripts/kubeadm-node-setup.sh +31 -11
  84. package/scripts/maas-setup.sh +8 -8
  85. package/scripts/selinux-normalize.sh +907 -0
  86. package/scripts/shutdown-machine.sh +843 -0
  87. package/scripts/test-monitor.sh +5 -5
  88. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.controller.js +15 -10
  89. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.model.js +36 -5
  90. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.router.js +7 -2
  91. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.service.js +90 -186
  92. package/src/api/core/core.controller.js +1 -1
  93. package/src/api/core/core.router.js +2 -2
  94. package/src/api/core/core.service.js +2 -2
  95. package/src/api/crypto/crypto.controller.js +1 -1
  96. package/src/api/crypto/crypto.service.js +1 -1
  97. package/src/api/cyberia-action/cyberia-action.controller.js +1 -1
  98. package/src/api/cyberia-action/cyberia-action.router.js +3 -3
  99. package/src/api/cyberia-action/cyberia-action.service.js +5 -6
  100. package/src/api/cyberia-audio/cyberia-audio.controller.js +6 -0
  101. package/src/api/cyberia-audio/cyberia-audio.model.js +61 -0
  102. package/src/api/cyberia-audio/cyberia-audio.router.js +21 -0
  103. package/src/api/cyberia-audio/cyberia-audio.service.js +220 -0
  104. package/src/api/cyberia-client-hints/cyberia-client-hints.controller.js +2 -4
  105. package/src/api/cyberia-client-hints/cyberia-client-hints.model.js +10 -19
  106. package/src/api/cyberia-client-hints/cyberia-client-hints.router.js +13 -35
  107. package/src/api/cyberia-client-hints/cyberia-client-hints.service.js +17 -34
  108. package/src/api/cyberia-dialogue/cyberia-dialogue.controller.js +1 -1
  109. package/src/api/cyberia-dialogue/cyberia-dialogue.model.js +1 -1
  110. package/src/api/cyberia-dialogue/cyberia-dialogue.router.js +2 -2
  111. package/src/api/cyberia-dialogue/cyberia-dialogue.service.js +2 -2
  112. package/src/api/cyberia-entity/cyberia-entity.controller.js +1 -1
  113. package/src/api/cyberia-entity/cyberia-entity.model.js +2 -0
  114. package/src/api/cyberia-entity/cyberia-entity.router.js +1 -1
  115. package/src/api/cyberia-entity/cyberia-entity.service.js +3 -3
  116. package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.controller.js +8 -2
  117. package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.model.js +31 -20
  118. package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.router.js +17 -2
  119. package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.service.js +468 -5
  120. package/src/api/cyberia-instance/cyberia-fallback-capture.js +502 -0
  121. package/src/api/cyberia-instance/cyberia-fallback-world.js +29 -40
  122. package/src/api/cyberia-instance/cyberia-instance-boot.service.js +5 -5
  123. package/src/api/cyberia-instance/cyberia-instance-items.js +98 -0
  124. package/src/api/cyberia-instance/cyberia-instance-map.service.js +35 -142
  125. package/src/api/cyberia-instance/cyberia-instance.controller.js +2 -5
  126. package/src/api/cyberia-instance/cyberia-instance.model.js +0 -14
  127. package/src/api/cyberia-instance/cyberia-instance.router.js +5 -18
  128. package/src/api/cyberia-instance/cyberia-instance.service.js +5 -45
  129. package/src/api/cyberia-instance/cyberia-world-generator.js +8 -13
  130. package/src/api/cyberia-instance-conf/cyberia-instance-conf.controller.js +1 -1
  131. package/src/api/cyberia-instance-conf/cyberia-instance-conf.model.js +49 -75
  132. package/src/api/cyberia-instance-conf/cyberia-instance-conf.router.js +1 -1
  133. package/src/api/cyberia-instance-conf/cyberia-instance-conf.service.js +76 -3
  134. package/src/api/cyberia-map/cyberia-map.controller.js +1 -1
  135. package/src/api/cyberia-map/cyberia-map.router.js +1 -1
  136. package/src/api/cyberia-map/cyberia-map.service.js +8 -4
  137. package/src/api/cyberia-map-audio-conf/cyberia-map-audio-conf.controller.js +31 -0
  138. package/src/api/cyberia-map-audio-conf/cyberia-map-audio-conf.model.js +56 -0
  139. package/src/api/cyberia-map-audio-conf/cyberia-map-audio-conf.router.js +33 -0
  140. package/src/api/cyberia-map-audio-conf/cyberia-map-audio-conf.service.js +189 -0
  141. package/src/api/cyberia-quest/cyberia-quest.controller.js +1 -1
  142. package/src/api/cyberia-quest/cyberia-quest.router.js +4 -4
  143. package/src/api/cyberia-quest/cyberia-quest.service.js +5 -5
  144. package/src/api/cyberia-quest-progress/cyberia-quest-progress.controller.js +1 -1
  145. package/src/api/cyberia-quest-progress/cyberia-quest-progress.model.js +1 -1
  146. package/src/api/cyberia-quest-progress/cyberia-quest-progress.router.js +1 -1
  147. package/src/api/cyberia-quest-progress/cyberia-quest-progress.service.js +2 -2
  148. package/src/api/cyberia-saga/cyberia-saga.controller.js +1 -1
  149. package/src/api/cyberia-saga/cyberia-saga.router.js +1 -1
  150. package/src/api/cyberia-saga/cyberia-saga.service.js +2 -2
  151. package/src/api/cyberia-server-defaults/cyberia-server-defaults.js +403 -214
  152. package/src/api/cyberia-skill/cyberia-skill.controller.js +1 -1
  153. package/src/api/cyberia-skill/cyberia-skill.model.js +6 -6
  154. package/src/api/cyberia-skill/cyberia-skill.router.js +1 -1
  155. package/src/api/cyberia-skill/cyberia-skill.service.js +2 -2
  156. package/src/api/default/default.controller.js +1 -1
  157. package/src/api/default/default.router.js +1 -1
  158. package/src/api/default/default.service.js +2 -2
  159. package/src/api/document/document.controller.js +1 -1
  160. package/src/api/document/document.router.js +1 -1
  161. package/src/api/document/document.service.js +2 -2
  162. package/src/api/file/file.controller.js +1 -1
  163. package/src/api/file/file.ref.js +153 -0
  164. package/src/api/file/file.ref.json +11 -2
  165. package/src/api/file/file.router.js +1 -1
  166. package/src/api/file/file.service.js +2 -2
  167. package/src/api/instance/instance.controller.js +1 -1
  168. package/src/api/instance/instance.router.js +1 -1
  169. package/src/api/instance/instance.service.js +2 -2
  170. package/src/api/ipfs/ipfs.controller.js +1 -1
  171. package/src/api/ipfs/ipfs.router.js +2 -2
  172. package/src/api/ipfs/ipfs.service.js +2 -2
  173. package/src/api/object-layer/object-layer.controller.js +1 -1
  174. package/src/api/object-layer/object-layer.model.js +47 -12
  175. package/src/api/object-layer/object-layer.router.js +12 -5
  176. package/src/api/object-layer/object-layer.service.js +116 -123
  177. package/src/api/object-layer-render-frames/object-layer-render-frames.controller.js +1 -1
  178. package/src/api/object-layer-render-frames/object-layer-render-frames.router.js +1 -1
  179. package/src/api/object-layer-render-frames/object-layer-render-frames.service.js +2 -2
  180. package/src/api/test/test.controller.js +1 -1
  181. package/src/api/test/test.service.js +1 -1
  182. package/src/api/user/guest.service.js +3 -3
  183. package/src/api/user/user.controller.js +1 -1
  184. package/src/api/user/user.router.js +2 -2
  185. package/src/api/user/user.service.js +4 -4
  186. package/src/api.js +5 -9
  187. package/src/cli/app.js +402 -0
  188. package/src/cli/baremetal.js +30 -35
  189. package/src/cli/client.js +306 -0
  190. package/src/cli/cloud-init.js +3 -3
  191. package/src/cli/cluster.js +191 -82
  192. package/src/cli/db.js +120 -68
  193. package/src/cli/deploy.js +157 -75
  194. package/src/cli/docker-compose.js +5 -5
  195. package/src/cli/domains.js +184 -0
  196. package/src/cli/dotenv-store.js +143 -0
  197. package/src/cli/event.js +2281 -0
  198. package/src/cli/fs-selection.js +115 -0
  199. package/src/cli/fs.js +159 -343
  200. package/src/cli/host.js +672 -0
  201. package/src/cli/image.js +4 -6
  202. package/src/cli/index.js +343 -151
  203. package/src/cli/ipfs.js +34 -30
  204. package/src/cli/kickstart.js +1 -1
  205. package/src/cli/kubectl.js +218 -41
  206. package/src/cli/lxd.js +3 -3
  207. package/src/cli/monitor.js +1359 -26
  208. package/src/cli/package.js +90 -0
  209. package/src/cli/release.js +16 -12
  210. package/src/cli/repository.js +586 -363
  211. package/src/cli/run.js +398 -843
  212. package/src/cli/secrets.js +2158 -964
  213. package/src/cli/ssh.js +478 -279
  214. package/src/cli/state.js +394 -0
  215. package/src/cli/static.js +2 -2
  216. package/src/cli/system.js +1 -1
  217. package/src/cli/test.js +203 -125
  218. package/src/cli/vultr.js +61 -21
  219. package/src/cli/wireguard.js +1112 -306
  220. package/src/client/components/core/CalendarCore.js +53 -96
  221. package/src/client/components/core/Docs.js +327 -303
  222. package/src/client/components/core/FileExplorer.js +0 -21
  223. package/src/client/components/core/Modal.js +56 -1
  224. package/src/client/components/core/PanelForm.js +4 -4
  225. package/src/client/components/core/Repository.js +56 -0
  226. package/src/client/components/core/Translate.js +7 -0
  227. package/src/client/components/core/{FullScreen.js → ViewModeController.js} +42 -39
  228. package/src/client/components/core/Wallet.js +0 -11
  229. package/src/client/components/core/Worker.js +7 -1
  230. package/src/client/components/cryptokoyn/SettingsCryptokoyn.js +2 -2
  231. package/src/client/components/cyberia/ActionEngineCyberia.js +12 -36
  232. package/src/client/components/cyberia/EntityEngineCyberia.js +492 -121
  233. package/src/client/components/cyberia/InstanceEngineCyberia.js +129 -160
  234. package/src/client/components/cyberia/InstanceSelectionView.js +7 -1
  235. package/src/client/components/cyberia/MapEngineCyberia.js +175 -69
  236. package/src/client/components/cyberia/ObjectLayerEngine.js +1011 -97
  237. package/src/client/components/cyberia/ObjectLayerEngineModal.js +81 -155
  238. package/src/client/components/cyberia/ObjectLayerEngineViewer.js +113 -98
  239. package/src/client/components/cyberia/SharedDefaultsCyberia.js +215 -56
  240. package/src/client/components/cyberia-portal/AppShellCyberiaPortal.js +2 -35
  241. package/src/client/components/cyberia-portal/CssCyberiaPortal.js +1 -1
  242. package/src/client/components/cyberia-portal/MainBodyCyberiaPortal.js +712 -76
  243. package/src/client/components/cyberia-portal/SettingsCyberiaPortal.js +2 -2
  244. package/src/client/components/cyberia-portal/TranslateCyberiaPortal.js +0 -4
  245. package/src/client/components/default/AppShellDefault.js +1 -1
  246. package/src/client/components/default/SettingsDefault.js +2 -2
  247. package/src/client/components/itemledger/SettingsItemledger.js +2 -2
  248. package/src/client/components/underpost/AppShellUnderpost.js +3 -2
  249. package/src/client/components/underpost/SettingsUnderpost.js +2 -2
  250. package/src/client/public/cyberia-docs/ARCHITECTURE.md +15 -15
  251. package/src/client/public/cyberia-docs/CYBERIA-CLI.md +313 -30
  252. package/src/client/public/cyberia-docs/CYBERIA-CLIENT.md +51 -29
  253. package/src/client/public/cyberia-docs/CYBERIA-SAGA.md +52 -53
  254. package/src/client/public/cyberia-docs/CYBERIA-SERVER.md +16 -11
  255. package/src/client/public/cyberia-docs/CYBERIA.md +48 -28
  256. package/src/client/public/cyberia-docs/ENTITY-PROFILE.md +11 -5
  257. package/src/client/public/cyberia-docs/HARDHAT-MODULE.md +23 -6
  258. package/src/client/public/cyberia-docs/ROADMAP.md +1 -1
  259. package/src/client/public/cyberia-docs/STATS-PROGRESSION.md +217 -0
  260. package/src/client/public/cyberia-docs/WHITE-PAPER.md +20 -12
  261. package/src/client/public/default/android-chrome-144x144.png +0 -0
  262. package/src/client/public/default/android-chrome-192x192.png +0 -0
  263. package/src/client/public/default/android-chrome-256x256.png +0 -0
  264. package/src/client/public/default/android-chrome-36x36.png +0 -0
  265. package/src/client/public/default/android-chrome-384x384.png +0 -0
  266. package/src/client/public/default/android-chrome-48x48.png +0 -0
  267. package/src/client/public/default/android-chrome-512x512.png +0 -0
  268. package/src/client/public/default/android-chrome-72x72.png +0 -0
  269. package/src/client/public/default/android-chrome-96x96.png +0 -0
  270. package/src/client/public/default/apple-touch-icon-1024x1024.png +0 -0
  271. package/src/client/public/default/apple-touch-icon-114x114.png +0 -0
  272. package/src/client/public/default/apple-touch-icon-120x120.png +0 -0
  273. package/src/client/public/default/apple-touch-icon-144x144.png +0 -0
  274. package/src/client/public/default/apple-touch-icon-152x152.png +0 -0
  275. package/src/client/public/default/apple-touch-icon-167x167.png +0 -0
  276. package/src/client/public/default/apple-touch-icon-180x180.png +0 -0
  277. package/src/client/public/default/apple-touch-icon-57x57.png +0 -0
  278. package/src/client/public/default/apple-touch-icon-60x60.png +0 -0
  279. package/src/client/public/default/apple-touch-icon-72x72.png +0 -0
  280. package/src/client/public/default/apple-touch-icon-76x76.png +0 -0
  281. package/src/client/public/default/apple-touch-icon-precomposed.png +0 -0
  282. package/src/client/public/default/apple-touch-icon.png +0 -0
  283. package/src/client/public/default/apple-touch-startup-image-1125x2436.png +0 -0
  284. package/src/client/public/default/apple-touch-startup-image-1136x640.png +0 -0
  285. package/src/client/public/default/apple-touch-startup-image-1170x2532.png +0 -0
  286. package/src/client/public/default/apple-touch-startup-image-1179x2556.png +0 -0
  287. package/src/client/public/default/apple-touch-startup-image-1242x2208.png +0 -0
  288. package/src/client/public/default/apple-touch-startup-image-1242x2688.png +0 -0
  289. package/src/client/public/default/apple-touch-startup-image-1284x2778.png +0 -0
  290. package/src/client/public/default/apple-touch-startup-image-1290x2796.png +0 -0
  291. package/src/client/public/default/apple-touch-startup-image-1334x750.png +0 -0
  292. package/src/client/public/default/apple-touch-startup-image-1488x2266.png +0 -0
  293. package/src/client/public/default/apple-touch-startup-image-1536x2048.png +0 -0
  294. package/src/client/public/default/apple-touch-startup-image-1620x2160.png +0 -0
  295. package/src/client/public/default/apple-touch-startup-image-1640x2160.png +0 -0
  296. package/src/client/public/default/apple-touch-startup-image-1668x2224.png +0 -0
  297. package/src/client/public/default/apple-touch-startup-image-1668x2388.png +0 -0
  298. package/src/client/public/default/apple-touch-startup-image-1792x828.png +0 -0
  299. package/src/client/public/default/apple-touch-startup-image-2048x1536.png +0 -0
  300. package/src/client/public/default/apple-touch-startup-image-2048x2732.png +0 -0
  301. package/src/client/public/default/apple-touch-startup-image-2160x1620.png +0 -0
  302. package/src/client/public/default/apple-touch-startup-image-2160x1640.png +0 -0
  303. package/src/client/public/default/apple-touch-startup-image-2208x1242.png +0 -0
  304. package/src/client/public/default/apple-touch-startup-image-2224x1668.png +0 -0
  305. package/src/client/public/default/apple-touch-startup-image-2266x1488.png +0 -0
  306. package/src/client/public/default/apple-touch-startup-image-2388x1668.png +0 -0
  307. package/src/client/public/default/apple-touch-startup-image-2436x1125.png +0 -0
  308. package/src/client/public/default/apple-touch-startup-image-2532x1170.png +0 -0
  309. package/src/client/public/default/apple-touch-startup-image-2556x1179.png +0 -0
  310. package/src/client/public/default/apple-touch-startup-image-2688x1242.png +0 -0
  311. package/src/client/public/default/apple-touch-startup-image-2732x2048.png +0 -0
  312. package/src/client/public/default/apple-touch-startup-image-2778x1284.png +0 -0
  313. package/src/client/public/default/apple-touch-startup-image-2796x1290.png +0 -0
  314. package/src/client/public/default/apple-touch-startup-image-640x1136.png +0 -0
  315. package/src/client/public/default/apple-touch-startup-image-750x1334.png +0 -0
  316. package/src/client/public/default/apple-touch-startup-image-828x1792.png +0 -0
  317. package/src/client/public/default/assets/background/white.jpg +0 -0
  318. package/src/client/public/default/browserconfig.xml +1 -1
  319. package/src/client/public/default/favicon-16x16.png +0 -0
  320. package/src/client/public/default/favicon-32x32.png +0 -0
  321. package/src/client/public/default/favicon-48x48.png +0 -0
  322. package/src/client/public/default/favicon.ico +0 -0
  323. package/src/client/public/default/manifest.webmanifest +5 -5
  324. package/src/client/public/default/mstile-144x144.png +0 -0
  325. package/src/client/public/default/mstile-150x150.png +0 -0
  326. package/src/client/public/default/mstile-310x150.png +0 -0
  327. package/src/client/public/default/mstile-310x310.png +0 -0
  328. package/src/client/public/default/mstile-70x70.png +0 -0
  329. package/src/client/public/default/yandex-browser-50x50.png +0 -0
  330. package/src/client/public/default/yandex-browser-manifest.json +1 -1
  331. package/src/client/services/cyberia-audio/cyberia-audio.service.js +99 -0
  332. package/src/client/services/cyberia-entity-type-default/cyberia-entity-type-default.service.js +38 -0
  333. package/src/client/services/cyberia-instance/cyberia-instance.management.js +5 -4
  334. package/src/client/services/cyberia-instance/cyberia-instance.service.js +0 -40
  335. package/src/client/services/cyberia-map/cyberia-map.management.js +5 -4
  336. package/src/client/services/cyberia-map-audio-conf/cyberia-map-audio-conf.service.js +138 -0
  337. package/src/client/services/object-layer/object-layer.management.js +6 -10
  338. package/src/client/services/object-layer/object-layer.service.js +3 -1
  339. package/src/client/ssr/RootDocument.js +1 -1
  340. package/src/client/ssr/body/404.js +1 -1
  341. package/src/client/ssr/body/500.js +1 -1
  342. package/src/client/ssr/body/CacheControl.js +1 -1
  343. package/src/client/ssr/body/CyberiaDefaultSplashScreen.js +1 -1
  344. package/src/client/ssr/body/DefaultSplashScreen.js +1 -1
  345. package/src/client/ssr/body/SwaggerDarkMode.js +1 -1
  346. package/src/client/ssr/body/UnderpostDefaultSplashScreen.js +1 -1
  347. package/src/client/ssr/head/CryptokoynScripts.js +1 -1
  348. package/src/client/ssr/head/Css.js +1 -1
  349. package/src/client/ssr/head/CyberiaPortalScripts.js +1 -1
  350. package/src/client/ssr/head/DefaultScripts.js +1 -1
  351. package/src/client/ssr/head/ItemledgerScripts.js +1 -1
  352. package/src/client/ssr/head/Microdata.js +1 -1
  353. package/src/client/ssr/head/Production.js +1 -1
  354. package/src/client/ssr/head/Pwa.js +1 -1
  355. package/src/client/ssr/head/PwaItemledger.js +1 -1
  356. package/src/client/ssr/head/Seo.js +1 -1
  357. package/src/client/ssr/head/UnderpostScripts.js +1 -1
  358. package/src/client/ssr/mailer/DefaultRecoverEmail.js +1 -1
  359. package/src/client/ssr/mailer/DefaultVerifyEmail.js +1 -1
  360. package/src/client/ssr/views/Cyberia404.js +7 -5
  361. package/src/client/ssr/views/CyberiaServerMetrics.js +1 -1
  362. package/src/client/ssr/views/Maintenance.js +1 -1
  363. package/src/client/ssr/views/NoNetworkConnection.js +1 -1
  364. package/src/client/ssr/views/Test.js +1 -1
  365. package/src/client/sw/core.sw.js +20 -14
  366. package/src/client-builder/client-build-docs.js +92 -77
  367. package/src/client-builder/client-build-live.js +2 -2
  368. package/src/client-builder/client-build.js +105 -74
  369. package/src/client-builder/client-bundle.js +347 -0
  370. package/src/client-builder/client-dev-server.js +3 -3
  371. package/src/client-builder/client-icons.js +2 -2
  372. package/src/client-builder/ssr.js +3 -3
  373. package/src/client.build.js +3 -6
  374. package/src/client.dev.js +3 -6
  375. package/src/db/DataBaseProvider.js +186 -3
  376. package/src/db/mariadb/MariaDB.js +3 -2
  377. package/src/db/mongo/MongoBootstrap.js +273 -101
  378. package/src/db/mongo/MongoExpress.js +187 -0
  379. package/src/db/mongo/MongooseDB.js +7 -8
  380. package/src/{server/valkey.js → db/valkey/Valkey.js} +5 -4
  381. package/src/grpc/cyberia/grpc-server.js +6 -8
  382. package/src/index.js +79 -23
  383. package/src/mailer/EmailRender.js +2 -2
  384. package/src/mailer/MailerInterceptor.js +87 -0
  385. package/src/mailer/MailerProvider.js +50 -6
  386. package/src/projects/cyberia/atlas-sprite-sheet-generator.js +144 -147
  387. package/src/projects/cyberia/atlas-sprite-sheet-store.js +391 -0
  388. package/src/projects/cyberia/besu-genesis-generator.js +8 -17
  389. package/src/projects/cyberia/boot-contract-fixtures.js +32 -0
  390. package/src/projects/cyberia/catalog-cyberia.js +54 -10
  391. package/src/projects/cyberia/gemini-client.js +4 -4
  392. package/src/projects/cyberia/generate-saga.js +5 -12
  393. package/src/projects/cyberia/hot-reload-trigger.js +18 -29
  394. package/src/projects/cyberia/instance-backup.js +210 -0
  395. package/src/projects/cyberia/instance-data.js +178 -258
  396. package/src/projects/cyberia/ipfs-client.js +4 -4
  397. package/src/projects/cyberia/map-preview-generator.js +33 -69
  398. package/src/projects/cyberia/object-layer.js +153 -320
  399. package/src/projects/cyberia/seed-audio.js +139 -0
  400. package/src/projects/cyberia/semantic-layer-generator-skin.js +2 -8
  401. package/src/projects/cyberia/semantic-layer-generator.js +3 -19
  402. package/src/projects/cyberia/stat-balance.js +81 -0
  403. package/src/projects/cyberia/stat-commands.js +23 -0
  404. package/src/projects/cyberia/stat-contract-generator.js +101 -0
  405. package/src/projects/underpost/catalog-underpost.js +9 -1
  406. package/src/proxy.js +4 -7
  407. package/src/runtime/cyberia-client/Dockerfile +17 -8
  408. package/src/runtime/cyberia-client/Dockerfile.dev +13 -4
  409. package/src/runtime/cyberia-server/Dockerfile +18 -6
  410. package/src/runtime/cyberia-server/Dockerfile.dev +16 -3
  411. package/src/runtime/engine-cyberia/Dockerfile +25 -9
  412. package/src/runtime/engine-cyberia/Dockerfile.dev +25 -9
  413. package/src/runtime/engine-cyberia/Dockerfile.test +5 -5
  414. package/src/runtime/engine-cyberia/compose.env +17 -5
  415. package/src/runtime/engine-cyberia/docker-compose.yml +23 -17
  416. package/src/runtime/express/Express.js +32 -27
  417. package/src/runtime/lampp/Lampp.js +22 -70
  418. package/src/runtime/nginx/Nginx.js +1 -1
  419. package/src/runtime/wp/Wp.js +16 -48
  420. package/src/server/{catalog.js → build/catalog.js} +15 -5
  421. package/src/server/build/coverage.js +188 -0
  422. package/src/server/build/execution.js +402 -0
  423. package/src/server/build/package.js +508 -0
  424. package/src/server/build/testing.js +578 -0
  425. package/src/server/{dns.js → network/dns.js} +144 -11
  426. package/src/server/{forward-proxy.js → network/forward-proxy.js} +10 -18
  427. package/src/server/{middlewares.js → network/middlewares.js} +11 -5
  428. package/src/server/network/node-capability.js +98 -0
  429. package/src/server/{peer.js → network/peer.js} +3 -3
  430. package/src/server/{proxy.js → network/proxy.js} +7 -13
  431. package/src/server/network/router.js +356 -0
  432. package/src/server/{tls.js → network/tls.js} +2 -2
  433. package/src/server/{underpost-compression.js → network/underpost-compression.js} +1 -1
  434. package/src/server/{underpost-gateway.js → network/underpost-gateway.js} +7 -7
  435. package/src/server/{underpost-ingress.js → network/underpost-ingress.js} +2 -2
  436. package/src/server/{cri.js → ops/cri.js} +2 -2
  437. package/src/server/{cron.js → ops/cron.js} +349 -74
  438. package/src/server/ops/event-notification.js +284 -0
  439. package/src/server/{logger.js → ops/logger.js} +143 -23
  440. package/src/server/ops/monitoring.js +1724 -0
  441. package/src/server/{systemd.js → ops/systemd.js} +55 -1
  442. package/src/server/{conf.js → runtime/conf.js} +516 -423
  443. package/src/server/runtime/config-scope.js +215 -0
  444. package/src/server/runtime/environment.js +149 -0
  445. package/src/server/{process.js → runtime/process.js} +153 -12
  446. package/src/server/{runtime-status.js → runtime/runtime-status.js} +155 -16
  447. package/src/server/{runtime.js → runtime/runtime.js} +12 -8
  448. package/src/server/{start.js → runtime/start.js} +128 -39
  449. package/src/server/{auth.js → security/auth.js} +7 -8
  450. package/src/server/security/container-storage.js +382 -0
  451. package/src/server/{crypto.js → security/crypto.js} +1 -1
  452. package/src/server/{selinux.js → security/selinux.js} +1 -1
  453. package/src/server/{backup.js → storage/backup.js} +17 -8
  454. package/src/server/{data-query.js → storage/data-query.js} +17 -1
  455. package/src/server/storage/downloader.js +121 -0
  456. package/src/server/storage/repository.js +68 -0
  457. package/src/server/storage/zip.js +153 -0
  458. package/src/server.js +4 -7
  459. package/src/ws/IoInterface.js +1 -1
  460. package/src/ws/IoServer.js +1 -1
  461. package/src/ws/core/core.ws.connection.js +1 -1
  462. package/src/ws/core/core.ws.emit.js +1 -1
  463. package/src/ws/core/core.ws.server.js +1 -1
  464. package/src/ws/default/default.ws.connection.js +1 -1
  465. package/src/ws/default/default.ws.emit.js +1 -1
  466. package/src/ws/default/default.ws.server.js +1 -1
  467. package/test/e2e/event-e2e-public-ingress-down.js +45 -0
  468. package/test/e2e/event-e2e-wireguard-server-down.js +38 -0
  469. package/test/e2e/event-e2e-wireguard-spoke-down.js +40 -0
  470. package/test/{api.test.js → integration/app/api.test.js} +33 -14
  471. package/test/integration/app/cyberia/atlas-sprite-sheet-store.test.js +402 -0
  472. package/test/integration/app/cyberia/atlas-sprite-sheet.test.js +86 -0
  473. package/test/integration/app/cyberia/cyberia-cli-plain-reads.test.js +64 -0
  474. package/test/integration/app/cyberia/cyberia-entity-type-default.test.js +842 -0
  475. package/test/integration/app/cyberia/cyberia-instance-conf-coerce.test.js +53 -0
  476. package/test/{cyberia-instance-conf-defaults.test.js → integration/app/cyberia/cyberia-instance-conf-defaults.test.js} +17 -23
  477. package/test/integration/app/cyberia/cyberia-instance-items.test.js +90 -0
  478. package/test/integration/app/cyberia/cyberia-load.test.js +466 -0
  479. package/test/integration/app/cyberia/cyberia-map-audio-conf.test.js +256 -0
  480. package/test/integration/app/cyberia/cyberia-stats.test.js +150 -0
  481. package/test/integration/app/cyberia/fallback-world-capture.test.js +338 -0
  482. package/test/integration/app/cyberia/object-layer-item-id.test.js +327 -0
  483. package/test/integration/app/cyberia/object-layer-item-selection.test.js +56 -0
  484. package/test/integration/app/cyberia/object-layer-natural-key.test.js +32 -0
  485. package/test/integration/app/cyberia/seed-audio.test.js +275 -0
  486. package/test/{shape-generator.test.js → integration/app/cyberia/shape-generator.test.js} +1 -1
  487. package/test/integration/infra/1-security/config-scope.test.js +305 -0
  488. package/test/integration/infra/1-security/container-storage.test.js +356 -0
  489. package/test/integration/infra/1-security/in-pod-cli-surface.test.js +86 -0
  490. package/test/integration/infra/1-security/secret-onboarding.test.js +930 -0
  491. package/test/{selinux.test.js → integration/infra/1-security/selinux.test.js} +2 -4
  492. package/test/{sops-secret-store.test.js → integration/infra/1-security/sops-secret-store.test.js} +415 -61
  493. package/test/integration/infra/1-security/systemd-service.test.js +70 -0
  494. package/test/integration/infra/1-security/underpost-config-secret.test.js +367 -0
  495. package/test/integration/infra/2-network/dns-firewall.test.js +566 -0
  496. package/test/integration/infra/2-network/node-capability.test.js +182 -0
  497. package/test/integration/infra/2-network/wireguard-cli.test.js +1187 -0
  498. package/test/{wireguard-edge.test.js → integration/infra/2-network/wireguard-edge.test.js} +649 -55
  499. package/test/{cluster-instances.test.js → integration/infra/3-cluster/cluster-instances.test.js} +11 -15
  500. package/test/{deploy-node-placement.test.js → integration/infra/3-cluster/deploy-node-placement.test.js} +3 -3
  501. package/test/integration/infra/3-cluster/docker-compose-stack.test.js +313 -0
  502. package/test/integration/infra/3-cluster/mongo-express-deploy.test.js +156 -0
  503. package/test/integration/infra/4-ingress/api-cross-origin.test.js +79 -0
  504. package/test/integration/infra/4-ingress/deploy-routes.test.js +379 -0
  505. package/test/integration/infra/4-ingress/gateway-static-assets.test.js +453 -0
  506. package/test/{instance-traffic-plan.test.js → integration/infra/4-ingress/instance-traffic-plan.test.js} +10 -6
  507. package/test/{underpost-gateway.test.js → integration/infra/4-ingress/underpost-gateway.test.js} +6 -6
  508. package/test/{underpost-ingress.test.js → integration/infra/4-ingress/underpost-ingress.test.js} +4 -4
  509. package/test/integration/infra/5-observability/cron-jobs.test.js +652 -0
  510. package/test/{deploy-monitor.test.js → integration/infra/5-observability/deploy-monitor.test.js} +29 -31
  511. package/test/integration/infra/5-observability/event-notification.test.js +197 -0
  512. package/test/integration/infra/5-observability/event-remediation.test.js +502 -0
  513. package/test/integration/infra/5-observability/event-targets.test.js +1174 -0
  514. package/test/integration/infra/5-observability/monitoring-stack.test.js +902 -0
  515. package/test/support/shell-harness.js +73 -0
  516. package/test/unit/build-template.test.js +97 -0
  517. package/test/unit/build-workflow-offline.test.js +132 -0
  518. package/test/unit/catalog.test.js +71 -0
  519. package/test/unit/client-build-docs.test.js +361 -0
  520. package/test/unit/client-bundle.test.js +313 -0
  521. package/test/unit/conf-loading.test.js +303 -0
  522. package/test/unit/conf-resolution.test.js +996 -0
  523. package/test/unit/coverage-artifact.test.js +221 -0
  524. package/test/{crypto.test.js → unit/crypto.test.js} +1 -1
  525. package/test/unit/cyberia/instance-backup.test.js +183 -0
  526. package/test/unit/cyberia/instance-object-layer-items.test.js +46 -0
  527. package/test/unit/cyberia/publish-workflow.test.js +22 -0
  528. package/test/unit/cyberia/stat-balance.test.js +69 -0
  529. package/test/unit/deploy-env-resolution.test.js +38 -0
  530. package/test/unit/deploy-log-table.test.js +518 -0
  531. package/test/unit/downloader-integrity.test.js +98 -0
  532. package/test/unit/execution-profiles.test.js +219 -0
  533. package/test/unit/file-reference-registry.test.js +141 -0
  534. package/test/unit/fleet-sync-source.test.js +149 -0
  535. package/test/unit/fs-storage-paths.test.js +596 -0
  536. package/test/unit/logger-redaction.test.js +141 -0
  537. package/test/unit/package.test.js +457 -0
  538. package/test/unit/prepare-host.test.js +382 -0
  539. package/test/unit/process-environment.test.js +18 -0
  540. package/test/unit/propagation-message.test.js +78 -0
  541. package/test/unit/redeploy-plan.test.js +24 -0
  542. package/test/unit/release-bump.test.js +474 -0
  543. package/test/unit/ssh-output-redaction.test.js +28 -0
  544. package/test/unit/start-options.test.js +46 -0
  545. package/test/unit/test-tiers.test.js +220 -0
  546. package/test/unit/zip-archive.test.js +142 -0
  547. package/vitest.config.js +66 -0
  548. package/.nycrc +0 -9
  549. package/deploy/lib/logging.sh +0 -96
  550. package/manifests/cronjobs/dd-cron/dd-cron-dns.yaml +0 -48
  551. package/manifests/mongodb/pv-pvc.yaml +0 -59
  552. package/scripts/coverall-test-cyberia.sh +0 -24
  553. package/scripts/coverall-test.sh +0 -24
  554. package/scripts/link-local-underpost-cli.sh +0 -6
  555. package/src/api/cyberia-instance/cyberia-fallback-default-items.js +0 -63
  556. package/src/api/user/user.build.js +0 -16
  557. package/src/cli/env.js +0 -177
  558. package/src/client/components/core/Blockchain.js +0 -41
  559. package/src/client/components/core/Blog.js +0 -9
  560. package/src/client/components/core/KeyboardAvoidance.js +0 -145
  561. package/src/client/components/cyberia/FallbackWorldEngineCyberia.js +0 -368
  562. package/src/client/public/default/assets/background/dark.jpg +0 -0
  563. package/src/client/public/default/assets/background/white0-min.jpg +0 -0
  564. package/src/client/public/default/assets/background/white0.jpg +0 -0
  565. package/src/client/public/doc/favicon.ico +0 -0
  566. package/src/client/public/doc/sitemap +0 -148
  567. package/src/server/downloader.js +0 -73
  568. package/src/server/environment.js +0 -98
@@ -0,0 +1,220 @@
1
+ 'use strict';
2
+
3
+ import { expect } from 'chai';
4
+ import fs from 'node:fs';
5
+ import {
6
+ TEST_TIERS,
7
+ UNDERPOST_TESTING,
8
+ coverageIncludeFactory,
9
+ coverageReportKey,
10
+ coverageThresholdFactory,
11
+ resolveTestSelection,
12
+ testProjectsFactory,
13
+ testSuiteNames,
14
+ vitestProjectSelector,
15
+ } from '../../src/server/build/testing.js';
16
+
17
+ // The table declares every tier the platform ships. A product build slices the
18
+ // tree, so whether a tier's directory is present here is a catalog question,
19
+ // asserted in catalog.test.js — these are about the table itself.
20
+ describe('test tiers', () => {
21
+ it('names every tier uniquely', () => {
22
+ const names = TEST_TIERS.map(({ name }) => name);
23
+ expect(new Set(names).size).to.equal(names.length);
24
+ });
25
+
26
+ it('never leaves a tier on group order 0', () => {
27
+ // Vitest routes a single-worker project on the default 0 into a bucket it
28
+ // appends after every ordered group, which would run that tier last.
29
+ for (const { name, groupOrder } of TEST_TIERS) expect(groupOrder, name).to.be.greaterThan(0);
30
+ });
31
+
32
+ it('declares tiers in the order they run', () => {
33
+ const orders = TEST_TIERS.map(({ groupOrder }) => groupOrder);
34
+ expect(orders).to.deep.equal([...orders].sort((a, b) => a - b));
35
+ });
36
+
37
+ it('keeps delegated tiers in the last group', () => {
38
+ // They run after the Vitest pass, so an earlier group order would describe
39
+ // an execution order that does not happen.
40
+ const lastGroup = Math.max(...TEST_TIERS.map(({ groupOrder }) => groupOrder));
41
+ for (const { name, groupOrder, delegate } of TEST_TIERS) if (delegate) expect(groupOrder, name).to.equal(lastGroup);
42
+ });
43
+
44
+ it('exposes only non-delegated tiers as Vitest projects', () => {
45
+ const projects = testProjectsFactory().map(({ test }) => test.name);
46
+ expect(projects).to.deep.equal(TEST_TIERS.filter(({ delegate }) => !delegate).map(({ name }) => name));
47
+ });
48
+ });
49
+
50
+ describe('test tier selection', () => {
51
+ it('runs every tier when nothing is selected', () => {
52
+ for (const selector of ['', 'all']) {
53
+ const { projects, runVitest, delegated } = resolveTestSelection(selector);
54
+ // No explicit project list: Vitest runs them all, and a product build
55
+ // that strips one must not fail on a name it no longer ships.
56
+ expect(projects, selector).to.be.empty;
57
+ expect(runVitest, selector).to.equal(true);
58
+ expect(
59
+ delegated.map(({ name }) => name),
60
+ selector,
61
+ ).to.deep.equal(TEST_TIERS.filter(({ delegate }) => delegate).map(({ name }) => name));
62
+ }
63
+ });
64
+
65
+ it('expands a suite into its tiers', () => {
66
+ expect(resolveTestSelection('infra').projects).to.deep.equal(
67
+ TEST_TIERS.filter(({ name }) => name.startsWith('infra:')).map(({ name }) => name),
68
+ );
69
+ });
70
+
71
+ it('skips the Vitest pass when only delegated tiers are selected', () => {
72
+ const { runVitest, delegated } = resolveTestSelection('contracts');
73
+ expect(runVitest).to.equal(false);
74
+ expect(delegated.map(({ name }) => name)).to.deep.equal(['contracts']);
75
+ });
76
+
77
+ it('rejects an unknown selector instead of reporting an empty green run', () => {
78
+ expect(() => resolveTestSelection('not-a-suite')).to.throw(/unknown suite/);
79
+ });
80
+
81
+ it('offers every suite prefix as a selector', () => {
82
+ for (const suite of testSuiteNames()) expect(() => resolveTestSelection(suite), suite).to.not.throw();
83
+ });
84
+ });
85
+
86
+ describe('delegated tier commands', () => {
87
+ const delegated = TEST_TIERS.filter(({ delegate }) => delegate);
88
+
89
+ it('ships at least one delegated tier to assert against', () => {
90
+ expect(delegated).to.not.be.empty;
91
+ });
92
+
93
+ it('writes results only when a destination is given', () => {
94
+ for (const { name, delegate } of delegated) {
95
+ expect(delegate({}), name).to.not.include('--test-reporter-destination=/');
96
+ expect(delegate({ resultsPath: '/results/TEST-x.xml' }), name).to.include('/results/TEST-x.xml');
97
+ }
98
+ });
99
+
100
+ it('passes a name filter through to its runner', () => {
101
+ for (const { name, delegate } of delegated) expect(delegate({ grep: 'Burning' }), name).to.include('Burning');
102
+ });
103
+
104
+ // Under an outer `npm`, npx resolves the root project as the local prefix and
105
+ // pulls its own copy of a nested tool from the registry, which Hardhat then
106
+ // refuses to run as a non-local installation.
107
+ it('runs nested tooling from the nested install rather than through npx', () => {
108
+ for (const { name, delegate } of delegated) {
109
+ expect(delegate({}), name).to.not.match(/\bnpx\b/);
110
+ expect(delegate({}), name).to.include('./node_modules/.bin/');
111
+ }
112
+ });
113
+
114
+ // A directory left behind by an interrupted install passes a `-d` probe while
115
+ // holding none of the binaries the tier runs.
116
+ it('probes the installed binary before skipping the install', () => {
117
+ for (const { name, delegate } of delegated)
118
+ expect(delegate({}), name).to.match(/\[ -x node_modules\/\.bin\/[\w.-]+ \] \|\| npm ci/);
119
+ });
120
+ });
121
+
122
+ describe('coverage threshold', () => {
123
+ it('reports without gating until a run opts in', () => {
124
+ // A tier selection measures a slice of the tree, so the whole-suite number is
125
+ // not the bar it should be held to.
126
+ expect(coverageThresholdFactory({})).to.equal(null);
127
+ expect(coverageThresholdFactory({ COVERAGE_ENFORCE: '0' })).to.equal(null);
128
+ });
129
+
130
+ it('gates an opted-in run on the shipped threshold', () => {
131
+ for (const COVERAGE_ENFORCE of ['1', 'true'])
132
+ expect(coverageThresholdFactory({ COVERAGE_ENFORCE }), COVERAGE_ENFORCE).to.equal(
133
+ UNDERPOST_TESTING.coverageThreshold,
134
+ );
135
+ });
136
+
137
+ it('lets a repository ratchet its own bar', () => {
138
+ expect(coverageThresholdFactory({ COVERAGE_MIN: '25' })).to.equal(25);
139
+ // An unset repository variable arrives as an empty string, not as absent.
140
+ expect(coverageThresholdFactory({ COVERAGE_ENFORCE: '1', COVERAGE_MIN: '' })).to.equal(
141
+ UNDERPOST_TESTING.coverageThreshold,
142
+ );
143
+ });
144
+
145
+ it('refuses a bar that is not a percentage', () => {
146
+ for (const COVERAGE_MIN of ['eighty', '-1', '101'])
147
+ expect(() => coverageThresholdFactory({ COVERAGE_MIN }), COVERAGE_MIN).to.throw('COVERAGE_MIN');
148
+ });
149
+ });
150
+
151
+ describe('coverage scope', () => {
152
+ const vitestTiers = TEST_TIERS.filter(({ delegate }) => !delegate);
153
+
154
+ it('makes every Vitest tier accountable for the sources it drives', () => {
155
+ for (const { name, sources } of vitestTiers) expect(sources, name).to.not.be.empty;
156
+ });
157
+
158
+ it('leaves a delegated tier out of the Vitest report', () => {
159
+ // Its runner measures its own coverage, and this table only feeds Vitest.
160
+ for (const { name, sources, delegate } of TEST_TIERS) if (delegate) expect(sources, name).to.equal(undefined);
161
+ });
162
+
163
+ it('points every glob at something this tree ships', () => {
164
+ // A source that moved leaves the tier silently measuring nothing, which
165
+ // reads as coverage rather than as the missing measurement it is. A product
166
+ // build slices the tree, so only tiers it kept are asserted.
167
+ for (const { name, directory, sources } of vitestTiers) {
168
+ if (!fs.existsSync(directory)) continue;
169
+ for (const glob of sources) expect(fs.globSync(glob), `${name}: ${glob}`).to.not.be.empty;
170
+ }
171
+ });
172
+
173
+ it('measures every tier when the run selects none', () => {
174
+ const everySource = new Set(vitestTiers.flatMap(({ sources }) => sources));
175
+ expect(coverageIncludeFactory([])).to.have.members([...everySource]);
176
+ });
177
+
178
+ it('measures only the selected tiers', () => {
179
+ const unit = TEST_TIERS.find(({ name }) => name === 'unit').sources;
180
+ for (const argv of [['--project', 'unit'], ['--project=unit']])
181
+ expect(coverageIncludeFactory(['npx', 'vitest', 'run', ...argv, '--coverage']), argv.join(' ')).to.deep.equal(
182
+ unit,
183
+ );
184
+ });
185
+
186
+ it('counts a source two tiers drive once', () => {
187
+ const include = coverageIncludeFactory(['--project', 'infra:3-cluster', '--project', 'infra:4-ingress']);
188
+ expect(new Set(include).size).to.equal(include.length);
189
+ expect(include).to.include('src/server/runtime/conf.js');
190
+ });
191
+
192
+ it('rejects a selection that matches no tier', () => {
193
+ expect(() => coverageIncludeFactory(['--project', 'not-a-tier'])).to.throw(/unknown suite/);
194
+ });
195
+ });
196
+
197
+ describe('coverage report directory', () => {
198
+ it('names the report after the suites the selection spans', () => {
199
+ expect(coverageReportKey('unit,infra,app')).to.equal('unit-infra-app');
200
+ expect(coverageReportKey('cyberia')).to.equal('cyberia');
201
+ expect(coverageReportKey('infra:1-security,infra:2-network')).to.equal('infra');
202
+ });
203
+
204
+ it('names every Vitest suite for a full run and none for a delegated one', () => {
205
+ expect(coverageReportKey('')).to.equal(coverageReportKey('all'));
206
+ expect(coverageReportKey('all').split('-')).to.have.members([
207
+ ...new Set(TEST_TIERS.filter(({ delegate }) => !delegate).map(({ name }) => name.split(':')[0])),
208
+ ]);
209
+ expect(coverageReportKey('contracts')).to.equal('');
210
+ });
211
+
212
+ // A deploy names its report by suite and the runner is handed the same tiers as
213
+ // `--project` flags; both must land on one directory.
214
+ it('agrees between a suite selector and the projects the runner was handed', () => {
215
+ const { projects } = resolveTestSelection('unit,infra,app');
216
+ const argv = ['npx', 'vitest', 'run', ...projects.flatMap((project) => ['--project', project]), '--coverage'];
217
+ expect(coverageReportKey(vitestProjectSelector(argv))).to.equal(coverageReportKey('unit,infra,app'));
218
+ expect(vitestProjectSelector(['--project=cyberia'])).to.equal('cyberia');
219
+ });
220
+ });
@@ -0,0 +1,142 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * @module zip-archive.test
5
+ * @description Covers the JSZip-backed archive helpers shared by the file-storage CLI and the
6
+ * client builder: local-file archiving, full and single-entry extraction, entry lookup by
7
+ * basename, and the guard that keeps an archive path from escaping the extraction root.
8
+ *
9
+ * Uses 'chai' for assertions.
10
+ */
11
+
12
+ import { expect } from 'chai';
13
+ import fs from 'fs-extra';
14
+ import JSZip from 'jszip';
15
+ import * as dir from 'path';
16
+ import {
17
+ extractZipEntryTo,
18
+ extractZipTo,
19
+ findZipEntry,
20
+ isZipBuffer,
21
+ loadZip,
22
+ readZipEntry,
23
+ zipFromLocalFiles,
24
+ } from '../../src/server/storage/zip.js';
25
+
26
+ describe('zip archive helpers', () => {
27
+ let fixturePath;
28
+
29
+ beforeEach(() => {
30
+ fixturePath = fs.mkdtempSync('/tmp/engine-zip-archive-');
31
+ fs.mkdirSync(`${fixturePath}/src/nested`, { recursive: true });
32
+ fs.writeFileSync(`${fixturePath}/src/index.html`, '<h1>index</h1>'.repeat(200), 'utf8');
33
+ fs.writeFileSync(`${fixturePath}/src/nested/app.js`, 'console.log(1);'.repeat(200), 'utf8');
34
+ fs.writeFileSync(`${fixturePath}/src/run.sh`, '#!/bin/sh\necho run\n', 'utf8');
35
+ fs.chmodSync(`${fixturePath}/src/run.sh`, 0o755);
36
+ });
37
+
38
+ afterEach(() => {
39
+ fs.removeSync(fixturePath);
40
+ });
41
+
42
+ const buildFixtureArchive = () =>
43
+ zipFromLocalFiles([
44
+ { localPath: `${fixturePath}/src/index.html`, entryName: 'index.html' },
45
+ { localPath: `${fixturePath}/src/nested/app.js`, entryName: 'nested/app.js' },
46
+ { localPath: `${fixturePath}/src/run.sh`, entryName: 'run.sh' },
47
+ ]);
48
+
49
+ it('writes a deflated archive that keeps the requested entry names', async () => {
50
+ const archive = await buildFixtureArchive();
51
+ const rawBytes = ['src/index.html', 'src/nested/app.js', 'src/run.sh'].reduce(
52
+ (total, relativePath) => total + fs.statSync(`${fixturePath}/${relativePath}`).size,
53
+ 0,
54
+ );
55
+
56
+ expect(isZipBuffer(archive)).to.equal(true);
57
+ expect(archive.length).to.be.below(rawBytes);
58
+ const entries = Object.values((await loadZip(archive)).files);
59
+ expect(entries.filter((entry) => entry.dir).map((entry) => entry.name)).to.deep.equal(['nested/']);
60
+ expect(
61
+ entries
62
+ .filter((entry) => !entry.dir)
63
+ .map((entry) => entry.name)
64
+ .sort(),
65
+ ).to.deep.equal(['index.html', 'nested/app.js', 'run.sh']);
66
+ });
67
+
68
+ it('round-trips an archive through extraction, preserving content and executable bits', async () => {
69
+ const outputPath = `${fixturePath}/out`;
70
+ await extractZipTo(await buildFixtureArchive(), outputPath);
71
+
72
+ expect(fs.readFileSync(`${outputPath}/nested/app.js`, 'utf8')).to.equal(
73
+ fs.readFileSync(`${fixturePath}/src/nested/app.js`, 'utf8'),
74
+ );
75
+ expect(fs.statSync(`${outputPath}/run.sh`).mode & 0o777).to.equal(0o755);
76
+ });
77
+
78
+ it('extracts from an archive path as well as from a buffer', async () => {
79
+ const archivePath = `${fixturePath}/build.zip`;
80
+ fs.writeFileSync(archivePath, await buildFixtureArchive());
81
+ await extractZipTo(archivePath, `${fixturePath}/from-path`);
82
+
83
+ expect(fs.existsSync(`${fixturePath}/from-path/nested/app.js`)).to.equal(true);
84
+ });
85
+
86
+ it('resolves an entry by exact name, by basename, and by single-entry fallback', async () => {
87
+ const nested = await loadZip(await buildFixtureArchive());
88
+ expect(findZipEntry(nested, 'nested/app.js').name).to.equal('nested/app.js');
89
+ expect(findZipEntry(nested, 'app.js').name).to.equal('nested/app.js');
90
+ expect(findZipEntry(nested, 'absent.js')).to.equal(null);
91
+
92
+ const single = await loadZip(
93
+ await zipFromLocalFiles([{ localPath: `${fixturePath}/src/index.html`, entryName: 'deep/path/index.html' }]),
94
+ );
95
+ expect(findZipEntry(single, 'absent.js').name).to.equal('deep/path/index.html');
96
+ });
97
+
98
+ it('reads a wrapped entry out of a single-file archive', async () => {
99
+ const inner = await buildFixtureArchive();
100
+ fs.writeFileSync(`${fixturePath}/inner.zip`, inner);
101
+ const wrapper = await zipFromLocalFiles([
102
+ { localPath: `${fixturePath}/inner.zip`, entryName: 'wrapped/inner.zip' },
103
+ ]);
104
+
105
+ expect(await readZipEntry(wrapper, 'inner.zip')).to.deep.equal(inner);
106
+ });
107
+
108
+ it('flattens a single extracted entry into the target directory', async () => {
109
+ const archive = await zipFromLocalFiles([
110
+ { localPath: `${fixturePath}/src/index.html`, entryName: 'deep/path/index.html' },
111
+ ]);
112
+ const targetDir = `${fixturePath}/pull`;
113
+ const written = await extractZipEntryTo(archive, 'index.html', targetDir);
114
+
115
+ expect(written).to.equal(dir.resolve(targetDir, 'index.html'));
116
+ expect(fs.readFileSync(written, 'utf8')).to.equal(fs.readFileSync(`${fixturePath}/src/index.html`, 'utf8'));
117
+ });
118
+
119
+ it('rejects a missing entry rather than writing an empty file', async () => {
120
+ const archive = await buildFixtureArchive();
121
+ let thrown;
122
+ await extractZipEntryTo(archive, 'index.html', `${fixturePath}/missing`).catch((error) => (thrown = error));
123
+ expect(thrown).to.equal(undefined);
124
+
125
+ await extractZipEntryTo(await buildFixtureArchive(), 'absent.js', `${fixturePath}/missing`).catch(
126
+ (error) => (thrown = error),
127
+ );
128
+ expect(thrown?.message).to.match(/Zip entry not found/);
129
+ });
130
+
131
+ it('blocks an archive entry that resolves outside the extraction root', async () => {
132
+ const escaping = new JSZip();
133
+ escaping.file('../escaped.txt', 'escaped');
134
+ const archive = await escaping.generateAsync({ type: 'nodebuffer' });
135
+
136
+ let thrown;
137
+ await extractZipTo(archive, `${fixturePath}/guarded`).catch((error) => (thrown = error));
138
+
139
+ expect(thrown?.message).to.match(/Blocked zip entry outside extraction directory/);
140
+ expect(fs.existsSync(`${fixturePath}/escaped.txt`)).to.equal(false);
141
+ });
142
+ });
@@ -0,0 +1,66 @@
1
+ import { defineConfig } from 'vitest/config';
2
+ import {
3
+ UNDERPOST_TESTING,
4
+ coverageIncludeFactory,
5
+ coverageReportKey,
6
+ coverageThresholdFactory,
7
+ testProjectsFactory,
8
+ vitestProjectSelector,
9
+ } from './src/server/build/testing.js';
10
+
11
+ const allureResultsDirectory = process.env[UNDERPOST_TESTING.allureResultsEnvKey];
12
+ const coverageThreshold = coverageThresholdFactory(process.env);
13
+ const coverageInclude = coverageIncludeFactory(process.argv);
14
+ const coverageReportDirectory = coverageReportKey(vitestProjectSelector(process.argv));
15
+
16
+ // Spread into every tier: a Vitest project inherits nothing from the root
17
+ // `test` block, and only `coverage` and `reporters` are read from it.
18
+ const projectDefaults = {
19
+ // Mocha's `describe`/`it` and the hooks stay global, so the suites read the
20
+ // same either side of the migration and carry no runner import.
21
+ globals: true,
22
+ environment: 'node',
23
+ // A tier is only meaningful if its failures are attributable to it, and a
24
+ // suite that reads `dd.routes` or binds a fixed port cannot share a worker
25
+ // with another doing the same.
26
+ fileParallelism: false,
27
+ ...(allureResultsDirectory ? { setupFiles: ['allure-vitest/setup'] } : {}),
28
+ };
29
+
30
+ export default defineConfig({
31
+ test: {
32
+ reporters: [
33
+ 'default',
34
+ ...(allureResultsDirectory ? [['allure-vitest/reporter', { resultsDir: allureResultsDirectory }]] : []),
35
+ ],
36
+ coverage: {
37
+ provider: 'v8',
38
+ reportsDirectory: UNDERPOST_TESTING.coverageDirectory,
39
+ // `lcovonly` is what Coveralls ingests, `json` is what a merged multi-job
40
+ // report is assembled from, `text` is what a local run reads, and `html` is
41
+ // what a deploy publishes — under the selection's own directory, so the
42
+ // report a deploy declares is the run it names and never the last run made.
43
+ reporter: ['text', 'lcovonly', 'json', ['html', { subdir: coverageReportDirectory }]],
44
+ // The directory holds one report per selection, so a run must not empty it; the
45
+ // runner (`src/cli/test.js`) clears its own selection's report before it starts.
46
+ clean: false,
47
+ // Written even when the run fails: the coverage workflows upload the report
48
+ // from a job the threshold step is meant to fail, and without it the badge
49
+ // freezes at the last passing build instead of moving with the tree.
50
+ reportOnFailure: true,
51
+ // The tiers in the selection decide what is measured, so a partial run
52
+ // reports the slice it drives and the whole run reports the whole of it —
53
+ // rather than every module the CLI barrel drags into a worker on import.
54
+ include: coverageInclude,
55
+ // Only the suites themselves: an `include` whitelist already keeps
56
+ // dependencies, bundles and generated assets out, and a directory pattern
57
+ // here is not anchored to the root — `test/**` also excluded the API
58
+ // surfaces named `test`, so the tier covering them reported nothing.
59
+ exclude: ['**/*.{test,spec}.js'],
60
+ // Absent unless the run opted in, so a single-tier run reports its slice
61
+ // instead of failing against a number it never measured.
62
+ ...(coverageThreshold === null ? {} : { thresholds: { lines: coverageThreshold } }),
63
+ },
64
+ projects: testProjectsFactory(projectDefaults),
65
+ },
66
+ });
package/.nycrc DELETED
@@ -1,9 +0,0 @@
1
- {
2
- "exclude": [],
3
- "include": ["test"],
4
- "output": "reports",
5
- "reporter": ["html", "text", "lcov", "text-lcov", "cobertura"],
6
- "sourceMap": true,
7
- "instrument": true,
8
- "all": true
9
- }
@@ -1,96 +0,0 @@
1
- # Shared logging helpers for deploy/<deploy-id>/*.sh. Sourced, never executed directly.
2
- #
3
- # Deploy script contract:
4
- # - one run_quiet call per remote command, with its own label
5
- # - the body lives in main(), invoked on the last line: the first remote command
6
- # pulls this repository, rewriting the running script while bash reads it
7
- #
8
- # run_quiet hides normal output, prints only `patterns` matches plus the next
9
- # `lines_after` lines, and returns the command's exit status so `set -e` stops
10
- # the deployment. On failure it keeps two temp files and prints their paths in
11
- # red instead of their contents: the command's own stderr (native error message
12
- # and stack trace) and the full unfiltered log up to the error.
13
-
14
- RUN_QUIET_RED=$'\033[0;31m'
15
- RUN_QUIET_RESET=$'\033[0m'
16
-
17
- RUN_QUIET_NODE_NAME=$(hostname 2>/dev/null | tr '[:upper:]' '[:lower:]')
18
- RUN_QUIET_NODE_TAG=${RUN_QUIET_NODE_NAME:+ [$RUN_QUIET_NODE_NAME]}
19
-
20
- run_quiet() {
21
- local label="$1"
22
- local patterns="$2"
23
- local lines_after="$3"
24
- shift 3
25
-
26
- local debug_log
27
- local error_log
28
- local fifo_dir
29
- local filter_pid
30
- local stderr_pid
31
- local status=0
32
-
33
- echo "$(date -Is) $RUN_QUIET_NODE_TAG ▶ $label"
34
-
35
- debug_log=$(mktemp --suffix=.debug.log)
36
- error_log=$(mktemp --suffix=.error.log)
37
- fifo_dir=$(mktemp -d)
38
- mkfifo "$fifo_dir/merged" "$fifo_dir/stderr"
39
-
40
- # The filter reads the live stream rather than the finished log: a deployment
41
- # monitor prints its matches for minutes before exiting, so a pass over the
42
- # completed file would show nothing until then. fflush defeats awk's block
43
- # buffering, which otherwise withholds matches whenever stdout is a pipe.
44
- # awk writes the debug log itself rather than piping through tee, so the
45
- # reader stays a single process that a kill can always release.
46
- awk \
47
- -v pattern="$patterns" \
48
- -v lines_after="$lines_after" \
49
- -v debug_log="$debug_log" '
50
- {
51
- print > debug_log
52
- }
53
- $0 ~ pattern {
54
- remaining = lines_after + 1
55
- }
56
- remaining > 0 {
57
- print
58
- fflush()
59
- remaining--
60
- }
61
- ' <"$fifo_dir/merged" &
62
- filter_pid=$!
63
-
64
- # stderr is duplicated: on its own for the native error and stack trace, and
65
- # into the merged stream so both the debug log and the filter see it in
66
- # chronological order with stdout.
67
- tee -a "$error_log" <"$fifo_dir/stderr" >"$fifo_dir/merged" &
68
- stderr_pid=$!
69
-
70
- "$@" >"$fifo_dir/merged" 2>"$fifo_dir/stderr" || status=$?
71
-
72
- # Drain both readers before the paths are printed, or the trace can still be
73
- # in flight. Bounded: a command that leaks a child holding a stream open must
74
- # not hang the deployment, and by then everything read has been written.
75
- run_quiet_drain "$stderr_pid"
76
- run_quiet_drain "$filter_pid"
77
- rm -rf "$fifo_dir"
78
-
79
- if [ "$status" -ne 0 ]; then
80
- printf '%s✖ %s failed (exit %s)\n error trace: %s\n debug log: %s%s\n' \
81
- "$RUN_QUIET_RED" "$label" "$status" "$error_log" "$debug_log" "$RUN_QUIET_RESET" >&2
82
- return "$status"
83
- fi
84
-
85
- rm -f "$debug_log" "$error_log"
86
-
87
- return "$status"
88
- }
89
-
90
- run_quiet_drain() {
91
- local pid="$1"
92
-
93
- timeout 10 tail --pid="$pid" -f /dev/null 2>/dev/null || true
94
- kill "$pid" 2>/dev/null || true
95
- wait "$pid" 2>/dev/null || true
96
- }
@@ -1,48 +0,0 @@
1
- apiVersion: batch/v1
2
- kind: CronJob
3
- metadata:
4
- name: dd-cron-dns
5
- namespace: default
6
- labels:
7
- app: dd-cron-dns
8
- managed-by: underpost
9
- spec:
10
- schedule: "* * * * *"
11
- concurrencyPolicy: Forbid
12
- startingDeadlineSeconds: 200
13
- successfulJobsHistoryLimit: 3
14
- failedJobsHistoryLimit: 1
15
- suspend: false
16
- jobTemplate:
17
- spec:
18
- template:
19
- metadata:
20
- labels:
21
- app: dd-cron-dns
22
- managed-by: underpost
23
- spec:
24
- containers:
25
- - name: dd-cron-dns
26
- image: underpost/underpost-engine:v3.3.0
27
- command:
28
- - /bin/sh
29
- - -c
30
- - >
31
- cd /home/dd/engine &&
32
- node bin env dd-cron production &&
33
- node bin cron dd-cron dns --git --kubeadm
34
- volumeMounts:
35
- - mountPath: /home/dd/engine
36
- name: underpost-cron-container-volume
37
- - mountPath: /usr/lib/node_modules/underpost
38
- name: underpost-share-env
39
- volumes:
40
- - hostPath:
41
- path: /home/dd/engine
42
- type: Directory
43
- name: underpost-cron-container-volume
44
- - hostPath:
45
- path: /root/.nvm/versions/node/v24.15.0/lib/node_modules/underpost
46
- type: DirectoryOrCreate
47
- name: underpost-share-env
48
- restartPolicy: OnFailure
@@ -1,59 +0,0 @@
1
- apiVersion: v1
2
- kind: PersistentVolume
3
- metadata:
4
- name: mongodb-pv-0
5
- labels:
6
- app: mongodb
7
- spec:
8
- capacity:
9
- storage: 5Gi
10
- accessModes:
11
- - ReadWriteOnce
12
- persistentVolumeReclaimPolicy: Retain
13
- storageClassName: mongodb-storage-class
14
- claimRef:
15
- namespace: default
16
- name: mongodb-storage-mongodb-0
17
- hostPath:
18
- path: /data/mongodb/v0
19
- type: DirectoryOrCreate
20
- ---
21
- apiVersion: v1
22
- kind: PersistentVolume
23
- metadata:
24
- name: mongodb-pv-1
25
- labels:
26
- app: mongodb
27
- spec:
28
- capacity:
29
- storage: 5Gi
30
- accessModes:
31
- - ReadWriteOnce
32
- persistentVolumeReclaimPolicy: Retain
33
- storageClassName: mongodb-storage-class
34
- claimRef:
35
- namespace: default
36
- name: mongodb-storage-mongodb-1
37
- hostPath:
38
- path: /data/mongodb/v1
39
- type: DirectoryOrCreate
40
- ---
41
- apiVersion: v1
42
- kind: PersistentVolume
43
- metadata:
44
- name: mongodb-pv-2
45
- labels:
46
- app: mongodb
47
- spec:
48
- capacity:
49
- storage: 5Gi
50
- accessModes:
51
- - ReadWriteOnce
52
- persistentVolumeReclaimPolicy: Retain
53
- storageClassName: mongodb-storage-class
54
- claimRef:
55
- namespace: default
56
- name: mongodb-storage-mongodb-2
57
- hostPath:
58
- path: /data/mongodb/v2
59
- type: DirectoryOrCreate
@@ -1,24 +0,0 @@
1
- #!/usr/bin/env bash
2
- set -u -o pipefail
3
-
4
- EXCLUDES=(
5
- --exclude="test/cluster-instances.test.js"
6
- --exclude="test/deploy-monitor.test.js"
7
- --exclude="test/deploy-node-placement.test.js"
8
- --exclude="test/instance-traffic-plan.test.js"
9
- --exclude="test/sops-secret-store.test.js"
10
- --exclude="test/underpost-gateway.test.js"
11
- --exclude="test/underpost-ingress.test.js"
12
- --exclude="test/wireguard-edge.test.js"
13
- )
14
-
15
- TESTS=(
16
- test/cyberia-instance-conf-defaults.test.js
17
- test/cyberia-load.test.js
18
- test/object-layer-item-id.test.js
19
- test/api.test.js
20
- test/crypto.test.js
21
- test/shape-generator.test.js
22
- )
23
-
24
- c8 "${EXCLUDES[@]}" mocha "${TESTS[@]}"