@underpostnet/cyberia 3.3.73 → 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 (228) hide show
  1. package/.env.example +17 -5
  2. package/.github/workflows/coverall.cyberia.ci.yml +5 -0
  3. package/.github/workflows/docker-image.cyberia-client.ci.yml +1 -1
  4. package/.github/workflows/docker-image.cyberia-client.dev.ci.yml +1 -1
  5. package/.github/workflows/docker-image.cyberia-server.ci.yml +1 -1
  6. package/.github/workflows/docker-image.cyberia-server.dev.ci.yml +1 -1
  7. package/.github/workflows/docker-image.engine-cyberia.ci.yml +1 -1
  8. package/.github/workflows/docker-image.engine-cyberia.dev.ci.yml +1 -1
  9. package/.github/workflows/publish.cyberia.ci.yml +44 -0
  10. package/AGENTS.md +61 -12
  11. package/CHANGELOG.md +126 -41
  12. package/CLI-HELP.md +19 -12
  13. package/Dockerfile +1 -1
  14. package/Dockerfile.dev +1 -1
  15. package/Dockerfile.test +2 -2
  16. package/README.md +28 -28
  17. package/bin/build.js +37 -17
  18. package/bin/cyberia.js +1247 -1373
  19. package/bin/index.js +1247 -1373
  20. package/compose.env +17 -5
  21. package/conf.js +7 -3
  22. package/deploy/cyberia-client/deploy.sh +10 -11
  23. package/deploy/cyberia-client/package.sh +0 -1
  24. package/deploy/cyberia-client/state.sh +3 -2
  25. package/deploy/cyberia-server/deploy.sh +10 -11
  26. package/deploy/cyberia-server/package.sh +0 -1
  27. package/deploy/cyberia-server/state.sh +3 -2
  28. package/deploy/dd-cyberia/deploy.sh +5 -5
  29. package/deploy/dd-cyberia/init.sh +15 -14
  30. package/deploy/dd-cyberia/package.sh +0 -1
  31. package/deploy/dd-cyberia/state.sh +2 -2
  32. package/deploy/dd-cyberia/sync-deploy.sh +139 -75
  33. package/deploy/lib/config.sh +29 -0
  34. package/deploy/lib/github-actions-logging.sh +92 -76
  35. package/deploy/lib/host.sh +27 -18
  36. package/deploy/lib/state.sh +4 -1
  37. package/deploy/pwa-microservices-template/deploy.sh +10 -8
  38. package/deploy/release/deploy.sh +0 -2
  39. package/deployment.yaml +1 -1
  40. package/docker-compose.yml +23 -17
  41. package/hardhat/package-lock.json +2 -2
  42. package/hardhat/package.json +1 -1
  43. package/manifests/cronjobs/dd-cron/dd-cron-backup.yaml +1 -1
  44. package/manifests/cronjobs/dd-cron/dd-cron-vultr.yaml +1 -1
  45. package/manifests/deployment/dd-cyberia-development/deployment.yaml +1 -1
  46. package/manifests/deployment/dd-default-development/deployment.yaml +2 -2
  47. package/manifests/deployment/mongo-express/deployment.yaml +46 -27
  48. package/manifests/deployment/mongo-express/kustomization.yaml +9 -0
  49. package/manifests/deployment/mongo-express/mongo-express-nodeport.yaml +18 -0
  50. package/manifests/deployment/mongo-express/service.yaml +16 -0
  51. package/manifests/deployment/mongo-express-no-auth/disable-mongodb-auth.yaml +16 -0
  52. package/manifests/deployment/mongo-express-no-auth/kustomization.yaml +16 -0
  53. package/package.json +19 -17
  54. package/scripts/test-monitor.sh +3 -3
  55. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.controller.js +14 -9
  56. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.model.js +36 -5
  57. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.router.js +5 -0
  58. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.service.js +88 -184
  59. package/src/api/cyberia-action/cyberia-action.router.js +2 -2
  60. package/src/api/cyberia-action/cyberia-action.service.js +3 -4
  61. package/src/api/cyberia-audio/cyberia-audio.controller.js +6 -0
  62. package/src/api/cyberia-audio/cyberia-audio.model.js +61 -0
  63. package/src/api/cyberia-audio/cyberia-audio.router.js +21 -0
  64. package/src/api/cyberia-audio/cyberia-audio.service.js +220 -0
  65. package/src/api/cyberia-client-hints/cyberia-client-hints.controller.js +1 -3
  66. package/src/api/cyberia-client-hints/cyberia-client-hints.model.js +10 -19
  67. package/src/api/cyberia-client-hints/cyberia-client-hints.router.js +12 -34
  68. package/src/api/cyberia-client-hints/cyberia-client-hints.service.js +15 -32
  69. package/src/api/cyberia-dialogue/cyberia-dialogue.model.js +1 -1
  70. package/src/api/cyberia-dialogue/cyberia-dialogue.router.js +1 -1
  71. package/src/api/cyberia-entity/cyberia-entity.model.js +2 -0
  72. package/src/api/cyberia-entity/cyberia-entity.service.js +1 -1
  73. package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.controller.js +8 -2
  74. package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.model.js +31 -20
  75. package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.router.js +16 -1
  76. package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.service.js +466 -3
  77. package/src/api/cyberia-instance/cyberia-fallback-capture.js +87 -51
  78. package/src/api/cyberia-instance/cyberia-fallback-world.js +21 -40
  79. package/src/api/cyberia-instance/cyberia-instance-boot.service.js +5 -5
  80. package/src/api/cyberia-instance/cyberia-instance-items.js +98 -0
  81. package/src/api/cyberia-instance/cyberia-instance-map.service.js +34 -141
  82. package/src/api/cyberia-instance/cyberia-instance.controller.js +1 -4
  83. package/src/api/cyberia-instance/cyberia-instance.model.js +0 -14
  84. package/src/api/cyberia-instance/cyberia-instance.router.js +3 -16
  85. package/src/api/cyberia-instance/cyberia-instance.service.js +3 -43
  86. package/src/api/cyberia-instance/cyberia-world-generator.js +8 -13
  87. package/src/api/cyberia-instance-conf/cyberia-instance-conf.model.js +49 -75
  88. package/src/api/cyberia-instance-conf/cyberia-instance-conf.service.js +74 -1
  89. package/src/api/cyberia-map/cyberia-map.service.js +6 -2
  90. package/src/api/cyberia-map-audio-conf/cyberia-map-audio-conf.controller.js +31 -0
  91. package/src/api/cyberia-map-audio-conf/cyberia-map-audio-conf.model.js +56 -0
  92. package/src/api/cyberia-map-audio-conf/cyberia-map-audio-conf.router.js +33 -0
  93. package/src/api/cyberia-map-audio-conf/cyberia-map-audio-conf.service.js +189 -0
  94. package/src/api/cyberia-quest/cyberia-quest.router.js +3 -3
  95. package/src/api/cyberia-quest/cyberia-quest.service.js +3 -3
  96. package/src/api/cyberia-quest-progress/cyberia-quest-progress.model.js +1 -1
  97. package/src/api/cyberia-server-defaults/cyberia-server-defaults.js +403 -188
  98. package/src/api/cyberia-skill/cyberia-skill.model.js +6 -6
  99. package/src/api/file/file.ref.js +153 -0
  100. package/src/api/file/file.ref.json +11 -2
  101. package/src/api/object-layer/object-layer.model.js +47 -12
  102. package/src/api/object-layer/object-layer.router.js +10 -3
  103. package/src/api/object-layer/object-layer.service.js +113 -120
  104. package/src/cli/app.js +12 -1
  105. package/src/cli/client.js +2 -2
  106. package/src/cli/cluster.js +7 -0
  107. package/src/cli/deploy.js +4 -4
  108. package/src/cli/docker-compose.js +1 -1
  109. package/src/cli/fs-selection.js +115 -0
  110. package/src/cli/fs.js +158 -342
  111. package/src/cli/index.js +22 -10
  112. package/src/cli/repository.js +28 -0
  113. package/src/cli/run.js +71 -197
  114. package/src/cli/test.js +4 -0
  115. package/src/cli/wireguard.js +32 -31
  116. package/src/client/components/core/Docs.js +77 -100
  117. package/src/client/components/core/Modal.js +56 -1
  118. package/src/client/components/cyberia/ActionEngineCyberia.js +12 -36
  119. package/src/client/components/cyberia/EntityEngineCyberia.js +492 -121
  120. package/src/client/components/cyberia/InstanceEngineCyberia.js +129 -160
  121. package/src/client/components/cyberia/InstanceSelectionView.js +7 -1
  122. package/src/client/components/cyberia/MapEngineCyberia.js +175 -69
  123. package/src/client/components/cyberia/ObjectLayerEngine.js +1011 -97
  124. package/src/client/components/cyberia/ObjectLayerEngineModal.js +81 -155
  125. package/src/client/components/cyberia/ObjectLayerEngineViewer.js +113 -98
  126. package/src/client/components/cyberia/SharedDefaultsCyberia.js +215 -56
  127. package/src/client/components/cyberia-portal/AppShellCyberiaPortal.js +0 -34
  128. package/src/client/components/cyberia-portal/CssCyberiaPortal.js +1 -1
  129. package/src/client/components/cyberia-portal/MainBodyCyberiaPortal.js +712 -76
  130. package/src/client/components/cyberia-portal/TranslateCyberiaPortal.js +0 -4
  131. package/src/client/public/cyberia-docs/ARCHITECTURE.md +15 -15
  132. package/src/client/public/cyberia-docs/CYBERIA-CLI.md +280 -24
  133. package/src/client/public/cyberia-docs/CYBERIA-CLIENT.md +51 -29
  134. package/src/client/public/cyberia-docs/CYBERIA-SAGA.md +52 -53
  135. package/src/client/public/cyberia-docs/CYBERIA-SERVER.md +16 -11
  136. package/src/client/public/cyberia-docs/CYBERIA.md +28 -28
  137. package/src/client/public/cyberia-docs/ENTITY-PROFILE.md +11 -5
  138. package/src/client/public/cyberia-docs/ROADMAP.md +1 -1
  139. package/src/client/public/cyberia-docs/STATS-PROGRESSION.md +217 -0
  140. package/src/client/public/cyberia-docs/WHITE-PAPER.md +20 -12
  141. package/src/client/services/cyberia-audio/cyberia-audio.service.js +99 -0
  142. package/src/client/services/cyberia-entity-type-default/cyberia-entity-type-default.service.js +38 -0
  143. package/src/client/services/cyberia-instance/cyberia-instance.management.js +5 -4
  144. package/src/client/services/cyberia-instance/cyberia-instance.service.js +0 -40
  145. package/src/client/services/cyberia-map/cyberia-map.management.js +5 -4
  146. package/src/client/services/cyberia-map-audio-conf/cyberia-map-audio-conf.service.js +138 -0
  147. package/src/client/services/object-layer/object-layer.management.js +6 -10
  148. package/src/client/services/object-layer/object-layer.service.js +3 -1
  149. package/src/client-builder/client-build-docs.js +52 -52
  150. package/src/client-builder/client-build.js +67 -44
  151. package/src/client-builder/client-bundle.js +347 -0
  152. package/src/db/mongo/MongoExpress.js +187 -0
  153. package/src/grpc/cyberia/grpc-server.js +5 -7
  154. package/src/index.js +1 -1
  155. package/src/projects/cyberia/atlas-sprite-sheet-generator.js +143 -146
  156. package/src/projects/cyberia/atlas-sprite-sheet-store.js +391 -0
  157. package/src/projects/cyberia/besu-genesis-generator.js +5 -14
  158. package/src/projects/cyberia/boot-contract-fixtures.js +32 -0
  159. package/src/projects/cyberia/catalog-cyberia.js +3 -2
  160. package/src/projects/cyberia/gemini-client.js +3 -3
  161. package/src/projects/cyberia/generate-saga.js +4 -11
  162. package/src/projects/cyberia/hot-reload-trigger.js +17 -28
  163. package/src/projects/cyberia/instance-backup.js +210 -0
  164. package/src/projects/cyberia/instance-data.js +177 -257
  165. package/src/projects/cyberia/map-preview-generator.js +32 -68
  166. package/src/projects/cyberia/object-layer.js +152 -319
  167. package/src/projects/cyberia/seed-audio.js +139 -0
  168. package/src/projects/cyberia/semantic-layer-generator-skin.js +2 -8
  169. package/src/projects/cyberia/semantic-layer-generator.js +2 -18
  170. package/src/projects/cyberia/stat-balance.js +81 -0
  171. package/src/projects/cyberia/stat-commands.js +23 -0
  172. package/src/projects/cyberia/stat-contract-generator.js +101 -0
  173. package/src/runtime/cyberia-client/Dockerfile +8 -4
  174. package/src/runtime/cyberia-client/Dockerfile.dev +5 -2
  175. package/src/runtime/cyberia-server/Dockerfile +9 -2
  176. package/src/runtime/cyberia-server/Dockerfile.dev +8 -1
  177. package/src/runtime/engine-cyberia/Dockerfile +1 -1
  178. package/src/runtime/engine-cyberia/Dockerfile.dev +1 -1
  179. package/src/runtime/engine-cyberia/Dockerfile.test +2 -2
  180. package/src/runtime/engine-cyberia/compose.env +17 -5
  181. package/src/runtime/engine-cyberia/docker-compose.yml +23 -17
  182. package/src/server/build/coverage.js +113 -42
  183. package/src/server/build/package.js +55 -12
  184. package/src/server/build/testing.js +59 -9
  185. package/src/server/network/middlewares.js +8 -2
  186. package/src/server/ops/logger.js +70 -35
  187. package/src/server/runtime/conf.js +4 -2
  188. package/src/server/storage/data-query.js +16 -0
  189. package/src/server/storage/downloader.js +62 -14
  190. package/src/server/storage/zip.js +153 -0
  191. package/test/integration/app/cyberia/atlas-sprite-sheet-store.test.js +402 -0
  192. package/test/integration/app/cyberia/atlas-sprite-sheet.test.js +86 -0
  193. package/test/integration/app/cyberia/cyberia-cli-plain-reads.test.js +34 -0
  194. package/test/integration/app/cyberia/cyberia-entity-type-default.test.js +842 -0
  195. package/test/integration/app/cyberia/cyberia-instance-conf-coerce.test.js +53 -0
  196. package/test/integration/app/cyberia/cyberia-instance-conf-defaults.test.js +16 -22
  197. package/test/integration/app/cyberia/cyberia-instance-items.test.js +90 -0
  198. package/test/integration/app/cyberia/cyberia-load.test.js +6 -7
  199. package/test/integration/app/cyberia/cyberia-map-audio-conf.test.js +256 -0
  200. package/test/integration/app/cyberia/cyberia-stats.test.js +150 -0
  201. package/test/integration/app/cyberia/fallback-world-capture.test.js +87 -2
  202. package/test/integration/app/cyberia/object-layer-item-selection.test.js +56 -0
  203. package/test/integration/app/cyberia/object-layer-natural-key.test.js +32 -0
  204. package/test/integration/app/cyberia/seed-audio.test.js +275 -0
  205. package/test/integration/infra/2-network/wireguard-cli.test.js +33 -9
  206. package/test/integration/infra/2-network/wireguard-edge.test.js +58 -18
  207. package/test/integration/infra/3-cluster/mongo-express-deploy.test.js +156 -0
  208. package/test/integration/infra/4-ingress/api-cross-origin.test.js +79 -0
  209. package/test/unit/client-build-docs.test.js +97 -70
  210. package/test/unit/client-bundle.test.js +313 -0
  211. package/test/unit/conf-resolution.test.js +17 -0
  212. package/test/unit/coverage-artifact.test.js +120 -29
  213. package/test/unit/cyberia/instance-backup.test.js +183 -0
  214. package/test/unit/cyberia/instance-object-layer-items.test.js +46 -0
  215. package/test/unit/cyberia/publish-workflow.test.js +22 -0
  216. package/test/unit/cyberia/stat-balance.test.js +69 -0
  217. package/test/unit/deploy-log-table.test.js +76 -5
  218. package/test/unit/downloader-integrity.test.js +98 -0
  219. package/test/unit/file-reference-registry.test.js +141 -0
  220. package/test/unit/fs-storage-paths.test.js +596 -0
  221. package/test/unit/logger-redaction.test.js +29 -0
  222. package/test/unit/package.test.js +70 -16
  223. package/test/unit/prepare-host.test.js +84 -1
  224. package/test/unit/test-tiers.test.js +27 -0
  225. package/test/unit/zip-archive.test.js +142 -0
  226. package/vitest.config.js +11 -3
  227. package/src/api/cyberia-instance/cyberia-fallback-default-items.js +0 -63
  228. package/src/client/components/cyberia/FallbackWorldEngineCyberia.js +0 -368
package/README.md CHANGED
@@ -20,7 +20,7 @@ _Stackable Rendering Layers as a Unified Tokenized Reality_
20
20
  <!-- CI/CD and health -->
21
21
  <div align="center">
22
22
 
23
- [![Node.js CI](https://img.shields.io/github/actions/workflow/status/underpostnet/engine-cyberia/docker-image.engine-cyberia.ci.yml?branch=main&label=Node.js%20CI)](https://github.com/underpostnet/engine-cyberia/actions/workflows/docker-image.engine-cyberia.ci.yml) [![Test](https://img.shields.io/github/actions/workflow/status/underpostnet/engine-cyberia/coverall.cyberia.ci.yml?branch=main&label=Test)](https://github.com/underpostnet/engine-cyberia/actions/workflows/coverall.cyberia.ci.yml) [![Coverage Status](https://coveralls.io/repos/github/underpostnet/engine-cyberia/badge.svg?branch=main)](https://coveralls.io/github/underpostnet/engine-cyberia?branch=main) [![Socket Badge](https://socket.dev/api/badge/npm/package/cyberia/3.3.73)](https://socket.dev/npm/package/cyberia/overview/3.3.73)
23
+ [![Node.js CI](https://img.shields.io/github/actions/workflow/status/underpostnet/engine-cyberia/docker-image.engine-cyberia.ci.yml?branch=main&label=Node.js%20CI)](https://github.com/underpostnet/engine-cyberia/actions/workflows/docker-image.engine-cyberia.ci.yml) [![Test](https://img.shields.io/github/actions/workflow/status/underpostnet/engine-cyberia/coverall.cyberia.ci.yml?branch=main&label=Test)](https://github.com/underpostnet/engine-cyberia/actions/workflows/coverall.cyberia.ci.yml) [![Coverage Status](https://coveralls.io/repos/github/underpostnet/engine-cyberia/badge.svg?branch=main)](https://coveralls.io/github/underpostnet/engine-cyberia?branch=main) [![Socket Badge](https://socket.dev/api/badge/npm/package/cyberia/3.3.76)](https://socket.dev/npm/package/cyberia/overview/3.3.76)
24
24
 
25
25
  </div>
26
26
 
@@ -45,26 +45,26 @@ Go server and the WASM client with data — it does not run the simulation or th
45
45
 
46
46
  ```text
47
47
  ┌───────────────────────────────────────────────┐
48
- │ UNDERPOST PLATFORM
49
- │ toolchain · deploy · PWA build · static
50
- │ delivery · cluster/image/db · monitoring
51
-
52
- │ underpost CLI ──▶ builds & deploys all
48
+ │ UNDERPOST PLATFORM
49
+ │ toolchain · deploy · PWA build · static
50
+ │ delivery · cluster/image/db · monitoring
51
+
52
+ │ underpost CLI ──▶ builds & deploys all
53
53
  └───────────────────────────────────────────────┘
54
54
  │ hosts / delivers
55
55
 
56
- ╔═══════════════════════════════ CYBERIA MMO ══════════════════════════════════╗
56
+ ╔═══════════════════════════════ CYBERIA MMO ═══════════════════════════════════╗
57
57
  ║ ║
58
- ║ ┌──────────────────┐ gRPC ┌──────────────────┐ WebSocket
59
- ║ │ engine-cyberia │ ────────▶ │ cyberia-server │ ───────────┐
60
- ║ │ (Node.js) │ │ (Go) │ │
61
- ║ │ │ │ │ ▼
62
- ║ │ content │ │ authoritative │ ┌──────────────────┐ ║
63
- ║ │ validation │ │ simulation │ │ cyberia-client │ ║
64
- ║ │ persistence │ │ world tick │ │ (C / WASM) │ ║
65
- ║ │ gRPC/REST data │ │ AOI replication │ │ │ ║
66
- ║ │ asset metadata │ │ │ │ rendering │ ║
67
- ║ └──────────────────┘ └──────────────────┘ │ input │ ║
58
+ ║ ┌──────────────────┐ gRPC ┌──────────────────┐ WebSocket
59
+ ║ │ engine-cyberia │ ────────▶ │ cyberia-server │ ───────────┐
60
+ ║ │ (Node.js) │ │ (Go) │ │
61
+ ║ │ │ │ │ ▼
62
+ ║ │ content │ │ authoritative │ ┌──────────────────┐ ║
63
+ ║ │ validation │ │ simulation │ │ cyberia-client │ ║
64
+ ║ │ persistence │ │ world tick │ │ (C / WASM) │ ║
65
+ ║ │ gRPC/REST data │ │ AOI replication │ │ │ ║
66
+ ║ │ asset metadata │ │ │ │ rendering │ ║
67
+ ║ └──────────────────┘ └──────────────────┘ │ input │ ║
68
68
  ║ │ │ prediction │ ║
69
69
  ║ └──────────────── REST (content/assets) ─────▶│ presentation │ ║
70
70
  ║ └──────────────────┘ ║
@@ -157,17 +157,17 @@ Three supervised processes run in parallel, each with its own monitor and reconn
157
157
 
158
158
  ```text
159
159
  ┌──────────────────────────────────────────────────────────────┐
160
- │ SUPERVISION (parallel)
161
-
162
- │ engine-cyberia cyberia-server cyberia-client
163
- │ ┌────────────┐ ┌────────────┐ ┌────────────┐
164
- │ │ monitor │ │ monitor │ │ monitor │
165
- │ │ +reconnect │ │ +reconnect │ │ +reconnect │
166
- │ └─────┬──────┘ └─────┬──────┘ └─────┬──────┘
167
- │ │ │ │
168
- │ └──────────┬──────────┴──────────┬──────────┘
169
- │ ▼ ▼
170
- │ all three up & connected?
160
+ │ SUPERVISION (parallel)
161
+
162
+ │ engine-cyberia cyberia-server cyberia-client
163
+ │ ┌────────────┐ ┌────────────┐ ┌────────────┐
164
+ │ │ monitor │ │ monitor │ │ monitor │
165
+ │ │ +reconnect │ │ +reconnect │ │ +reconnect │
166
+ │ └─────┬──────┘ └─────┬──────┘ └─────┬──────┘
167
+ │ │ │ │
168
+ │ └──────────┬──────────┴──────────┬──────────┘
169
+ │ ▼ ▼
170
+ │ all three up & connected?
171
171
  └────────────────────────────┬─────────────────────────────────┘
172
172
 
173
173
  ┌─────────────────────┼─────────────────────┐
package/bin/build.js CHANGED
@@ -14,7 +14,12 @@ import {
14
14
  import { resolveDeployList } from '../src/server/network/router.js';
15
15
  import { loadDeployCatalog } from '../src/server/build/catalog.js';
16
16
  import { buildProductPackageJson, productPackageOptionsFactory } from '../src/server/build/package.js';
17
- import { COVERAGE_BUNDLE_DIRECTORY, bundleCoverageReport } from '../src/server/build/coverage.js';
17
+ import {
18
+ COVERAGE_BUNDLE_DIRECTORY,
19
+ bundleCoverageReports,
20
+ coverageReportCommand,
21
+ deployCoverageReports,
22
+ } from '../src/server/build/coverage.js';
18
23
  import { shellExec } from '../src/server/runtime/process.js';
19
24
  import Underpost from '../src/index.js';
20
25
 
@@ -125,7 +130,7 @@ const buildDeployTemplate = async (confName) => {
125
130
 
126
131
  // The manifest a product publishes is its catalog's declaration, resolved the same way for
127
132
  // every product: only the files a product places in the template are its own business.
128
- const packageOptions = productPackageOptionsFactory({ catalog, underpostVersion: Underpost.version });
133
+ const packageOptions = productPackageOptionsFactory({ catalog, engineDependencies: sourcePackageJson.dependencies });
129
134
 
130
135
  switch (confName) {
131
136
  case 'dd-cyberia': {
@@ -221,16 +226,28 @@ const buildDeployTemplate = async (confName) => {
221
226
  };
222
227
 
223
228
  /**
224
- * Carries this build stage's coverage HTML report into the assembled template, so every
225
- * container started from the published source serves the report instead of generating one.
229
+ * The coverage reports a deploy id's conf declares, as {@link deployCoverageReports} reads them.
230
+ * @param {string} deployId - A concrete deploy id.
231
+ * @returns {Array<{id: string, suite?: string, path?: string}>}
226
232
  */
227
- const bundleDeployCoverage = () => {
228
- const { bundled, from, to } = bundleCoverageReport('.', basePath);
229
- if (bundled) return void logger.info('Build coverage artifact', { from, to });
230
- logger.warn('No coverage report to bundle; the deploy will publish the unavailable page', {
231
- hint: 'node bin/build <deploy-id> --coverage',
232
- to,
233
- });
233
+ const deployReports = (deployId) =>
234
+ deployCoverageReports(JSON.parse(fs.readFileSync(`./engine-private/conf/${deployId}/conf.server.json`, 'utf8')));
235
+
236
+ /**
237
+ * Carries this build stage's coverage HTML reports into the assembled template, so every
238
+ * container started from the published source serves them instead of generating one.
239
+ * @param {string} deployId - A concrete deploy id.
240
+ */
241
+ const bundleDeployCoverage = (deployId) => {
242
+ for (const { id, bundled, from, to } of bundleCoverageReports(deployReports(deployId), basePath)) {
243
+ if (bundled) logger.info('Build coverage artifact', { id, from, to });
244
+ else
245
+ logger.warn('No coverage report to bundle; the deploy will publish the unavailable page', {
246
+ id,
247
+ hint: 'node bin/build <deploy-id> --coverage',
248
+ to,
249
+ });
250
+ }
234
251
  };
235
252
 
236
253
  const program = new Command();
@@ -247,7 +264,7 @@ program
247
264
  )
248
265
  .option(
249
266
  '--coverage',
250
- `Run the test suite to refresh ./coverage before assembly, so the artifact carries a current ${COVERAGE_BUNDLE_DIRECTORY} report.`,
267
+ `Run the test suites the deploy ids' coverage reports name before assembly, so the artifact carries current ${COVERAGE_BUNDLE_DIRECTORY} reports.`,
251
268
  false,
252
269
  )
253
270
  .option(
@@ -267,10 +284,13 @@ program
267
284
  return;
268
285
  }
269
286
 
270
- // Tests run here, in the build stage, and exactly once: the artifact carries the report so
271
- // no container ever has to produce its own. Refreshing is opt-in because a template
272
- // assembly is not otherwise a test run.
273
- if (options.coverage) shellExec(`npm run test:coverage`);
287
+ // Tests run here, in the build stage, and once per declared suite: the artifact carries
288
+ // each report so no container ever has to produce its own. Refreshing is opt-in because
289
+ // a template assembly is not otherwise a test run.
290
+ if (options.coverage) {
291
+ const suites = new Set(deployList.flatMap(deployReports).flatMap(({ suite }) => (suite ? [suite] : [])));
292
+ for (const suite of suites) shellExec(coverageReportCommand({ suite }));
293
+ }
274
294
 
275
295
  for (const deployId of deployList) {
276
296
  // Reconstruct the base template from 0 before each deploy id so neither a previous
@@ -278,7 +298,7 @@ program
278
298
  // --no-template-rebuild.
279
299
  if (options.templateRebuild) await buildTemplate({ toPath: basePath });
280
300
  await buildDeployTemplate(deployId);
281
- bundleDeployCoverage();
301
+ bundleDeployCoverage(deployId);
282
302
  // Publish the just-assembled tree to the deploy id's private test repo so a
283
303
  // pod started with `--private-test-repo` clones this work-in-progress source.
284
304
  if (options.updatePrivate) await updatePrivateEngineTestRepo(deployId);