@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.
- package/.dockerignore +1 -0
- package/.env.example +17 -5
- package/.github/workflows/coverall.cyberia.ci.yml +39 -14
- package/.github/workflows/cyberia-client.cd.yml +5 -0
- package/.github/workflows/cyberia-server.cd.yml +5 -0
- package/.github/workflows/docker-image.cyberia-client.ci.yml +8 -5
- package/.github/workflows/docker-image.cyberia-client.dev.ci.yml +8 -3
- package/.github/workflows/docker-image.cyberia-server.ci.yml +8 -5
- package/.github/workflows/docker-image.cyberia-server.dev.ci.yml +8 -5
- package/.github/workflows/docker-image.engine-cyberia.ci.yml +15 -1
- package/.github/workflows/docker-image.engine-cyberia.dev.ci.yml +15 -1
- package/.github/workflows/engine-cyberia.cd.yml +3 -0
- package/.github/workflows/engine-cyberia.ci.yml +4 -5
- package/.github/workflows/ghpkg.ci.yml +35 -20
- package/.github/workflows/hardhat.ci.yml +12 -11
- package/.github/workflows/npmpkg.ci.yml +17 -15
- package/.github/workflows/publish.cyberia.ci.yml +44 -0
- package/.github/workflows/pwa-microservices-template-test.ci.yml +2 -2
- package/.github/workflows/release.cd.yml +1 -0
- package/.prettierignore +1 -0
- package/AGENTS.md +96 -0
- package/CHANGELOG.md +653 -2513
- package/CLI-HELP.md +323 -157
- package/Dockerfile +25 -9
- package/Dockerfile.dev +25 -9
- package/Dockerfile.test +5 -5
- package/README.md +48 -28
- package/bin/build.js +86 -41
- package/bin/build.template.js +8 -3
- package/bin/cyberia.js +1494 -1403
- package/bin/deploy.js +18 -104
- package/bin/index.js +1494 -1403
- package/compose.env +17 -5
- package/conf.js +98 -7
- package/deploy/cyberia-client/deploy.sh +46 -0
- package/deploy/cyberia-client/package.sh +17 -0
- package/deploy/cyberia-client/state.sh +15 -0
- package/deploy/cyberia-server/deploy.sh +46 -0
- package/deploy/cyberia-server/package.sh +17 -0
- package/deploy/cyberia-server/state.sh +15 -0
- package/deploy/dd-cyberia/deploy.sh +9 -29
- package/deploy/dd-cyberia/init.sh +38 -45
- package/deploy/dd-cyberia/package.sh +16 -0
- package/deploy/dd-cyberia/state.sh +14 -0
- package/deploy/dd-cyberia/sync-deploy.sh +133 -147
- package/deploy/lib/config.sh +29 -0
- package/deploy/lib/github-actions-logging.sh +610 -0
- package/deploy/lib/host.sh +194 -0
- package/deploy/lib/state.sh +65 -0
- package/deploy/pwa-microservices-template/deploy.sh +17 -42
- package/deploy/release/deploy.sh +9 -41
- package/deployment.yaml +7 -2
- package/docker-compose.yml +23 -17
- package/examples/static-page/README.md +19 -19
- package/examples/static-page/ssr-components/CustomPage.js +2 -2
- package/hardhat/hardhat.config.js +1 -6
- package/hardhat/package-lock.json +101 -40
- package/hardhat/package.json +2 -2
- package/manifests/alertmanager/deployment.yaml +81 -0
- package/manifests/blackbox-exporter/deployment.yaml +75 -0
- package/manifests/cronjobs/dd-cron/dd-cron-backup.yaml +32 -7
- package/manifests/cronjobs/dd-cron/dd-cron-vultr.yaml +32 -7
- package/manifests/deployment/dd-cyberia-development/deployment.yaml +7 -2
- package/manifests/deployment/dd-default-development/deployment.yaml +2 -2
- package/manifests/deployment/mongo-express/deployment.yaml +46 -27
- package/manifests/deployment/mongo-express/kustomization.yaml +9 -0
- package/manifests/deployment/mongo-express/mongo-express-nodeport.yaml +18 -0
- package/manifests/deployment/mongo-express/service.yaml +16 -0
- package/manifests/deployment/mongo-express-no-auth/disable-mongodb-auth.yaml +16 -0
- package/manifests/deployment/mongo-express-no-auth/kustomization.yaml +16 -0
- package/manifests/grafana/deployment.yaml +26 -7
- package/manifests/grafana/kustomization.yaml +1 -0
- package/manifests/grafana/service.yaml +6 -1
- package/manifests/mariadb/pv.yaml +1 -0
- package/manifests/mongodb/statefulset.yaml +9 -2
- package/manifests/mysql/pv-pvc.yaml +14 -1
- package/manifests/postgresql/pv.yaml +12 -1
- package/manifests/postgresql/pvc.yaml +1 -0
- package/manifests/prometheus/deployment.yaml +18 -22
- package/package.json +87 -12
- package/scripts/event-monitor.sh +56 -0
- package/scripts/k3s-node-setup.sh +27 -14
- package/scripts/kubeadm-node-setup.sh +31 -11
- package/scripts/maas-setup.sh +8 -8
- package/scripts/selinux-normalize.sh +907 -0
- package/scripts/shutdown-machine.sh +843 -0
- package/scripts/test-monitor.sh +5 -5
- package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.controller.js +15 -10
- package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.model.js +36 -5
- package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.router.js +7 -2
- package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.service.js +90 -186
- package/src/api/core/core.controller.js +1 -1
- package/src/api/core/core.router.js +2 -2
- package/src/api/core/core.service.js +2 -2
- package/src/api/crypto/crypto.controller.js +1 -1
- package/src/api/crypto/crypto.service.js +1 -1
- package/src/api/cyberia-action/cyberia-action.controller.js +1 -1
- package/src/api/cyberia-action/cyberia-action.router.js +3 -3
- package/src/api/cyberia-action/cyberia-action.service.js +5 -6
- package/src/api/cyberia-audio/cyberia-audio.controller.js +6 -0
- package/src/api/cyberia-audio/cyberia-audio.model.js +61 -0
- package/src/api/cyberia-audio/cyberia-audio.router.js +21 -0
- package/src/api/cyberia-audio/cyberia-audio.service.js +220 -0
- package/src/api/cyberia-client-hints/cyberia-client-hints.controller.js +2 -4
- package/src/api/cyberia-client-hints/cyberia-client-hints.model.js +10 -19
- package/src/api/cyberia-client-hints/cyberia-client-hints.router.js +13 -35
- package/src/api/cyberia-client-hints/cyberia-client-hints.service.js +17 -34
- package/src/api/cyberia-dialogue/cyberia-dialogue.controller.js +1 -1
- package/src/api/cyberia-dialogue/cyberia-dialogue.model.js +1 -1
- package/src/api/cyberia-dialogue/cyberia-dialogue.router.js +2 -2
- package/src/api/cyberia-dialogue/cyberia-dialogue.service.js +2 -2
- package/src/api/cyberia-entity/cyberia-entity.controller.js +1 -1
- package/src/api/cyberia-entity/cyberia-entity.model.js +2 -0
- package/src/api/cyberia-entity/cyberia-entity.router.js +1 -1
- package/src/api/cyberia-entity/cyberia-entity.service.js +3 -3
- package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.controller.js +8 -2
- package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.model.js +31 -20
- package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.router.js +17 -2
- package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.service.js +468 -5
- package/src/api/cyberia-instance/cyberia-fallback-capture.js +502 -0
- package/src/api/cyberia-instance/cyberia-fallback-world.js +29 -40
- package/src/api/cyberia-instance/cyberia-instance-boot.service.js +5 -5
- package/src/api/cyberia-instance/cyberia-instance-items.js +98 -0
- package/src/api/cyberia-instance/cyberia-instance-map.service.js +35 -142
- package/src/api/cyberia-instance/cyberia-instance.controller.js +2 -5
- package/src/api/cyberia-instance/cyberia-instance.model.js +0 -14
- package/src/api/cyberia-instance/cyberia-instance.router.js +5 -18
- package/src/api/cyberia-instance/cyberia-instance.service.js +5 -45
- package/src/api/cyberia-instance/cyberia-world-generator.js +8 -13
- package/src/api/cyberia-instance-conf/cyberia-instance-conf.controller.js +1 -1
- package/src/api/cyberia-instance-conf/cyberia-instance-conf.model.js +49 -75
- package/src/api/cyberia-instance-conf/cyberia-instance-conf.router.js +1 -1
- package/src/api/cyberia-instance-conf/cyberia-instance-conf.service.js +76 -3
- package/src/api/cyberia-map/cyberia-map.controller.js +1 -1
- package/src/api/cyberia-map/cyberia-map.router.js +1 -1
- package/src/api/cyberia-map/cyberia-map.service.js +8 -4
- package/src/api/cyberia-map-audio-conf/cyberia-map-audio-conf.controller.js +31 -0
- package/src/api/cyberia-map-audio-conf/cyberia-map-audio-conf.model.js +56 -0
- package/src/api/cyberia-map-audio-conf/cyberia-map-audio-conf.router.js +33 -0
- package/src/api/cyberia-map-audio-conf/cyberia-map-audio-conf.service.js +189 -0
- package/src/api/cyberia-quest/cyberia-quest.controller.js +1 -1
- package/src/api/cyberia-quest/cyberia-quest.router.js +4 -4
- package/src/api/cyberia-quest/cyberia-quest.service.js +5 -5
- package/src/api/cyberia-quest-progress/cyberia-quest-progress.controller.js +1 -1
- package/src/api/cyberia-quest-progress/cyberia-quest-progress.model.js +1 -1
- package/src/api/cyberia-quest-progress/cyberia-quest-progress.router.js +1 -1
- package/src/api/cyberia-quest-progress/cyberia-quest-progress.service.js +2 -2
- package/src/api/cyberia-saga/cyberia-saga.controller.js +1 -1
- package/src/api/cyberia-saga/cyberia-saga.router.js +1 -1
- package/src/api/cyberia-saga/cyberia-saga.service.js +2 -2
- package/src/api/cyberia-server-defaults/cyberia-server-defaults.js +403 -214
- package/src/api/cyberia-skill/cyberia-skill.controller.js +1 -1
- package/src/api/cyberia-skill/cyberia-skill.model.js +6 -6
- package/src/api/cyberia-skill/cyberia-skill.router.js +1 -1
- package/src/api/cyberia-skill/cyberia-skill.service.js +2 -2
- package/src/api/default/default.controller.js +1 -1
- package/src/api/default/default.router.js +1 -1
- package/src/api/default/default.service.js +2 -2
- package/src/api/document/document.controller.js +1 -1
- package/src/api/document/document.router.js +1 -1
- package/src/api/document/document.service.js +2 -2
- package/src/api/file/file.controller.js +1 -1
- package/src/api/file/file.ref.js +153 -0
- package/src/api/file/file.ref.json +11 -2
- package/src/api/file/file.router.js +1 -1
- package/src/api/file/file.service.js +2 -2
- package/src/api/instance/instance.controller.js +1 -1
- package/src/api/instance/instance.router.js +1 -1
- package/src/api/instance/instance.service.js +2 -2
- package/src/api/ipfs/ipfs.controller.js +1 -1
- package/src/api/ipfs/ipfs.router.js +2 -2
- package/src/api/ipfs/ipfs.service.js +2 -2
- package/src/api/object-layer/object-layer.controller.js +1 -1
- package/src/api/object-layer/object-layer.model.js +47 -12
- package/src/api/object-layer/object-layer.router.js +12 -5
- package/src/api/object-layer/object-layer.service.js +116 -123
- package/src/api/object-layer-render-frames/object-layer-render-frames.controller.js +1 -1
- package/src/api/object-layer-render-frames/object-layer-render-frames.router.js +1 -1
- package/src/api/object-layer-render-frames/object-layer-render-frames.service.js +2 -2
- package/src/api/test/test.controller.js +1 -1
- package/src/api/test/test.service.js +1 -1
- package/src/api/user/guest.service.js +3 -3
- package/src/api/user/user.controller.js +1 -1
- package/src/api/user/user.router.js +2 -2
- package/src/api/user/user.service.js +4 -4
- package/src/api.js +5 -9
- package/src/cli/app.js +402 -0
- package/src/cli/baremetal.js +30 -35
- package/src/cli/client.js +306 -0
- package/src/cli/cloud-init.js +3 -3
- package/src/cli/cluster.js +191 -82
- package/src/cli/db.js +120 -68
- package/src/cli/deploy.js +157 -75
- package/src/cli/docker-compose.js +5 -5
- package/src/cli/domains.js +184 -0
- package/src/cli/dotenv-store.js +143 -0
- package/src/cli/event.js +2281 -0
- package/src/cli/fs-selection.js +115 -0
- package/src/cli/fs.js +159 -343
- package/src/cli/host.js +672 -0
- package/src/cli/image.js +4 -6
- package/src/cli/index.js +343 -151
- package/src/cli/ipfs.js +34 -30
- package/src/cli/kickstart.js +1 -1
- package/src/cli/kubectl.js +218 -41
- package/src/cli/lxd.js +3 -3
- package/src/cli/monitor.js +1359 -26
- package/src/cli/package.js +90 -0
- package/src/cli/release.js +16 -12
- package/src/cli/repository.js +586 -363
- package/src/cli/run.js +398 -843
- package/src/cli/secrets.js +2158 -964
- package/src/cli/ssh.js +478 -279
- package/src/cli/state.js +394 -0
- package/src/cli/static.js +2 -2
- package/src/cli/system.js +1 -1
- package/src/cli/test.js +203 -125
- package/src/cli/vultr.js +61 -21
- package/src/cli/wireguard.js +1112 -306
- package/src/client/components/core/CalendarCore.js +53 -96
- package/src/client/components/core/Docs.js +327 -303
- package/src/client/components/core/FileExplorer.js +0 -21
- package/src/client/components/core/Modal.js +56 -1
- package/src/client/components/core/PanelForm.js +4 -4
- package/src/client/components/core/Repository.js +56 -0
- package/src/client/components/core/Translate.js +7 -0
- package/src/client/components/core/{FullScreen.js → ViewModeController.js} +42 -39
- package/src/client/components/core/Wallet.js +0 -11
- package/src/client/components/core/Worker.js +7 -1
- package/src/client/components/cryptokoyn/SettingsCryptokoyn.js +2 -2
- package/src/client/components/cyberia/ActionEngineCyberia.js +12 -36
- package/src/client/components/cyberia/EntityEngineCyberia.js +492 -121
- package/src/client/components/cyberia/InstanceEngineCyberia.js +129 -160
- package/src/client/components/cyberia/InstanceSelectionView.js +7 -1
- package/src/client/components/cyberia/MapEngineCyberia.js +175 -69
- package/src/client/components/cyberia/ObjectLayerEngine.js +1011 -97
- package/src/client/components/cyberia/ObjectLayerEngineModal.js +81 -155
- package/src/client/components/cyberia/ObjectLayerEngineViewer.js +113 -98
- package/src/client/components/cyberia/SharedDefaultsCyberia.js +215 -56
- package/src/client/components/cyberia-portal/AppShellCyberiaPortal.js +2 -35
- package/src/client/components/cyberia-portal/CssCyberiaPortal.js +1 -1
- package/src/client/components/cyberia-portal/MainBodyCyberiaPortal.js +712 -76
- package/src/client/components/cyberia-portal/SettingsCyberiaPortal.js +2 -2
- package/src/client/components/cyberia-portal/TranslateCyberiaPortal.js +0 -4
- package/src/client/components/default/AppShellDefault.js +1 -1
- package/src/client/components/default/SettingsDefault.js +2 -2
- package/src/client/components/itemledger/SettingsItemledger.js +2 -2
- package/src/client/components/underpost/AppShellUnderpost.js +3 -2
- package/src/client/components/underpost/SettingsUnderpost.js +2 -2
- package/src/client/public/cyberia-docs/ARCHITECTURE.md +15 -15
- package/src/client/public/cyberia-docs/CYBERIA-CLI.md +313 -30
- package/src/client/public/cyberia-docs/CYBERIA-CLIENT.md +51 -29
- package/src/client/public/cyberia-docs/CYBERIA-SAGA.md +52 -53
- package/src/client/public/cyberia-docs/CYBERIA-SERVER.md +16 -11
- package/src/client/public/cyberia-docs/CYBERIA.md +48 -28
- package/src/client/public/cyberia-docs/ENTITY-PROFILE.md +11 -5
- package/src/client/public/cyberia-docs/HARDHAT-MODULE.md +23 -6
- package/src/client/public/cyberia-docs/ROADMAP.md +1 -1
- package/src/client/public/cyberia-docs/STATS-PROGRESSION.md +217 -0
- package/src/client/public/cyberia-docs/WHITE-PAPER.md +20 -12
- package/src/client/public/default/android-chrome-144x144.png +0 -0
- package/src/client/public/default/android-chrome-192x192.png +0 -0
- package/src/client/public/default/android-chrome-256x256.png +0 -0
- package/src/client/public/default/android-chrome-36x36.png +0 -0
- package/src/client/public/default/android-chrome-384x384.png +0 -0
- package/src/client/public/default/android-chrome-48x48.png +0 -0
- package/src/client/public/default/android-chrome-512x512.png +0 -0
- package/src/client/public/default/android-chrome-72x72.png +0 -0
- package/src/client/public/default/android-chrome-96x96.png +0 -0
- package/src/client/public/default/apple-touch-icon-1024x1024.png +0 -0
- package/src/client/public/default/apple-touch-icon-114x114.png +0 -0
- package/src/client/public/default/apple-touch-icon-120x120.png +0 -0
- package/src/client/public/default/apple-touch-icon-144x144.png +0 -0
- package/src/client/public/default/apple-touch-icon-152x152.png +0 -0
- package/src/client/public/default/apple-touch-icon-167x167.png +0 -0
- package/src/client/public/default/apple-touch-icon-180x180.png +0 -0
- package/src/client/public/default/apple-touch-icon-57x57.png +0 -0
- package/src/client/public/default/apple-touch-icon-60x60.png +0 -0
- package/src/client/public/default/apple-touch-icon-72x72.png +0 -0
- package/src/client/public/default/apple-touch-icon-76x76.png +0 -0
- package/src/client/public/default/apple-touch-icon-precomposed.png +0 -0
- package/src/client/public/default/apple-touch-icon.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1125x2436.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1136x640.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1170x2532.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1179x2556.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1242x2208.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1242x2688.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1284x2778.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1290x2796.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1334x750.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1488x2266.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1536x2048.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1620x2160.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1640x2160.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1668x2224.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1668x2388.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-1792x828.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2048x1536.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2048x2732.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2160x1620.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2160x1640.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2208x1242.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2224x1668.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2266x1488.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2388x1668.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2436x1125.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2532x1170.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2556x1179.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2688x1242.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2732x2048.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2778x1284.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-2796x1290.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-640x1136.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-750x1334.png +0 -0
- package/src/client/public/default/apple-touch-startup-image-828x1792.png +0 -0
- package/src/client/public/default/assets/background/white.jpg +0 -0
- package/src/client/public/default/browserconfig.xml +1 -1
- package/src/client/public/default/favicon-16x16.png +0 -0
- package/src/client/public/default/favicon-32x32.png +0 -0
- package/src/client/public/default/favicon-48x48.png +0 -0
- package/src/client/public/default/favicon.ico +0 -0
- package/src/client/public/default/manifest.webmanifest +5 -5
- package/src/client/public/default/mstile-144x144.png +0 -0
- package/src/client/public/default/mstile-150x150.png +0 -0
- package/src/client/public/default/mstile-310x150.png +0 -0
- package/src/client/public/default/mstile-310x310.png +0 -0
- package/src/client/public/default/mstile-70x70.png +0 -0
- package/src/client/public/default/yandex-browser-50x50.png +0 -0
- package/src/client/public/default/yandex-browser-manifest.json +1 -1
- package/src/client/services/cyberia-audio/cyberia-audio.service.js +99 -0
- package/src/client/services/cyberia-entity-type-default/cyberia-entity-type-default.service.js +38 -0
- package/src/client/services/cyberia-instance/cyberia-instance.management.js +5 -4
- package/src/client/services/cyberia-instance/cyberia-instance.service.js +0 -40
- package/src/client/services/cyberia-map/cyberia-map.management.js +5 -4
- package/src/client/services/cyberia-map-audio-conf/cyberia-map-audio-conf.service.js +138 -0
- package/src/client/services/object-layer/object-layer.management.js +6 -10
- package/src/client/services/object-layer/object-layer.service.js +3 -1
- package/src/client/ssr/RootDocument.js +1 -1
- package/src/client/ssr/body/404.js +1 -1
- package/src/client/ssr/body/500.js +1 -1
- package/src/client/ssr/body/CacheControl.js +1 -1
- package/src/client/ssr/body/CyberiaDefaultSplashScreen.js +1 -1
- package/src/client/ssr/body/DefaultSplashScreen.js +1 -1
- package/src/client/ssr/body/SwaggerDarkMode.js +1 -1
- package/src/client/ssr/body/UnderpostDefaultSplashScreen.js +1 -1
- package/src/client/ssr/head/CryptokoynScripts.js +1 -1
- package/src/client/ssr/head/Css.js +1 -1
- package/src/client/ssr/head/CyberiaPortalScripts.js +1 -1
- package/src/client/ssr/head/DefaultScripts.js +1 -1
- package/src/client/ssr/head/ItemledgerScripts.js +1 -1
- package/src/client/ssr/head/Microdata.js +1 -1
- package/src/client/ssr/head/Production.js +1 -1
- package/src/client/ssr/head/Pwa.js +1 -1
- package/src/client/ssr/head/PwaItemledger.js +1 -1
- package/src/client/ssr/head/Seo.js +1 -1
- package/src/client/ssr/head/UnderpostScripts.js +1 -1
- package/src/client/ssr/mailer/DefaultRecoverEmail.js +1 -1
- package/src/client/ssr/mailer/DefaultVerifyEmail.js +1 -1
- package/src/client/ssr/views/Cyberia404.js +7 -5
- package/src/client/ssr/views/CyberiaServerMetrics.js +1 -1
- package/src/client/ssr/views/Maintenance.js +1 -1
- package/src/client/ssr/views/NoNetworkConnection.js +1 -1
- package/src/client/ssr/views/Test.js +1 -1
- package/src/client/sw/core.sw.js +20 -14
- package/src/client-builder/client-build-docs.js +92 -77
- package/src/client-builder/client-build-live.js +2 -2
- package/src/client-builder/client-build.js +105 -74
- package/src/client-builder/client-bundle.js +347 -0
- package/src/client-builder/client-dev-server.js +3 -3
- package/src/client-builder/client-icons.js +2 -2
- package/src/client-builder/ssr.js +3 -3
- package/src/client.build.js +3 -6
- package/src/client.dev.js +3 -6
- package/src/db/DataBaseProvider.js +186 -3
- package/src/db/mariadb/MariaDB.js +3 -2
- package/src/db/mongo/MongoBootstrap.js +273 -101
- package/src/db/mongo/MongoExpress.js +187 -0
- package/src/db/mongo/MongooseDB.js +7 -8
- package/src/{server/valkey.js → db/valkey/Valkey.js} +5 -4
- package/src/grpc/cyberia/grpc-server.js +6 -8
- package/src/index.js +79 -23
- package/src/mailer/EmailRender.js +2 -2
- package/src/mailer/MailerInterceptor.js +87 -0
- package/src/mailer/MailerProvider.js +50 -6
- package/src/projects/cyberia/atlas-sprite-sheet-generator.js +144 -147
- package/src/projects/cyberia/atlas-sprite-sheet-store.js +391 -0
- package/src/projects/cyberia/besu-genesis-generator.js +8 -17
- package/src/projects/cyberia/boot-contract-fixtures.js +32 -0
- package/src/projects/cyberia/catalog-cyberia.js +54 -10
- package/src/projects/cyberia/gemini-client.js +4 -4
- package/src/projects/cyberia/generate-saga.js +5 -12
- package/src/projects/cyberia/hot-reload-trigger.js +18 -29
- package/src/projects/cyberia/instance-backup.js +210 -0
- package/src/projects/cyberia/instance-data.js +178 -258
- package/src/projects/cyberia/ipfs-client.js +4 -4
- package/src/projects/cyberia/map-preview-generator.js +33 -69
- package/src/projects/cyberia/object-layer.js +153 -320
- package/src/projects/cyberia/seed-audio.js +139 -0
- package/src/projects/cyberia/semantic-layer-generator-skin.js +2 -8
- package/src/projects/cyberia/semantic-layer-generator.js +3 -19
- package/src/projects/cyberia/stat-balance.js +81 -0
- package/src/projects/cyberia/stat-commands.js +23 -0
- package/src/projects/cyberia/stat-contract-generator.js +101 -0
- package/src/projects/underpost/catalog-underpost.js +9 -1
- package/src/proxy.js +4 -7
- package/src/runtime/cyberia-client/Dockerfile +17 -8
- package/src/runtime/cyberia-client/Dockerfile.dev +13 -4
- package/src/runtime/cyberia-server/Dockerfile +18 -6
- package/src/runtime/cyberia-server/Dockerfile.dev +16 -3
- package/src/runtime/engine-cyberia/Dockerfile +25 -9
- package/src/runtime/engine-cyberia/Dockerfile.dev +25 -9
- package/src/runtime/engine-cyberia/Dockerfile.test +5 -5
- package/src/runtime/engine-cyberia/compose.env +17 -5
- package/src/runtime/engine-cyberia/docker-compose.yml +23 -17
- package/src/runtime/express/Express.js +32 -27
- package/src/runtime/lampp/Lampp.js +22 -70
- package/src/runtime/nginx/Nginx.js +1 -1
- package/src/runtime/wp/Wp.js +16 -48
- package/src/server/{catalog.js → build/catalog.js} +15 -5
- package/src/server/build/coverage.js +188 -0
- package/src/server/build/execution.js +402 -0
- package/src/server/build/package.js +508 -0
- package/src/server/build/testing.js +578 -0
- package/src/server/{dns.js → network/dns.js} +144 -11
- package/src/server/{forward-proxy.js → network/forward-proxy.js} +10 -18
- package/src/server/{middlewares.js → network/middlewares.js} +11 -5
- package/src/server/network/node-capability.js +98 -0
- package/src/server/{peer.js → network/peer.js} +3 -3
- package/src/server/{proxy.js → network/proxy.js} +7 -13
- package/src/server/network/router.js +356 -0
- package/src/server/{tls.js → network/tls.js} +2 -2
- package/src/server/{underpost-compression.js → network/underpost-compression.js} +1 -1
- package/src/server/{underpost-gateway.js → network/underpost-gateway.js} +7 -7
- package/src/server/{underpost-ingress.js → network/underpost-ingress.js} +2 -2
- package/src/server/{cri.js → ops/cri.js} +2 -2
- package/src/server/{cron.js → ops/cron.js} +349 -74
- package/src/server/ops/event-notification.js +284 -0
- package/src/server/{logger.js → ops/logger.js} +143 -23
- package/src/server/ops/monitoring.js +1724 -0
- package/src/server/{systemd.js → ops/systemd.js} +55 -1
- package/src/server/{conf.js → runtime/conf.js} +516 -423
- package/src/server/runtime/config-scope.js +215 -0
- package/src/server/runtime/environment.js +149 -0
- package/src/server/{process.js → runtime/process.js} +153 -12
- package/src/server/{runtime-status.js → runtime/runtime-status.js} +155 -16
- package/src/server/{runtime.js → runtime/runtime.js} +12 -8
- package/src/server/{start.js → runtime/start.js} +128 -39
- package/src/server/{auth.js → security/auth.js} +7 -8
- package/src/server/security/container-storage.js +382 -0
- package/src/server/{crypto.js → security/crypto.js} +1 -1
- package/src/server/{selinux.js → security/selinux.js} +1 -1
- package/src/server/{backup.js → storage/backup.js} +17 -8
- package/src/server/{data-query.js → storage/data-query.js} +17 -1
- package/src/server/storage/downloader.js +121 -0
- package/src/server/storage/repository.js +68 -0
- package/src/server/storage/zip.js +153 -0
- package/src/server.js +4 -7
- package/src/ws/IoInterface.js +1 -1
- package/src/ws/IoServer.js +1 -1
- package/src/ws/core/core.ws.connection.js +1 -1
- package/src/ws/core/core.ws.emit.js +1 -1
- package/src/ws/core/core.ws.server.js +1 -1
- package/src/ws/default/default.ws.connection.js +1 -1
- package/src/ws/default/default.ws.emit.js +1 -1
- package/src/ws/default/default.ws.server.js +1 -1
- package/test/e2e/event-e2e-public-ingress-down.js +45 -0
- package/test/e2e/event-e2e-wireguard-server-down.js +38 -0
- package/test/e2e/event-e2e-wireguard-spoke-down.js +40 -0
- package/test/{api.test.js → integration/app/api.test.js} +33 -14
- package/test/integration/app/cyberia/atlas-sprite-sheet-store.test.js +402 -0
- package/test/integration/app/cyberia/atlas-sprite-sheet.test.js +86 -0
- package/test/integration/app/cyberia/cyberia-cli-plain-reads.test.js +64 -0
- package/test/integration/app/cyberia/cyberia-entity-type-default.test.js +842 -0
- package/test/integration/app/cyberia/cyberia-instance-conf-coerce.test.js +53 -0
- package/test/{cyberia-instance-conf-defaults.test.js → integration/app/cyberia/cyberia-instance-conf-defaults.test.js} +17 -23
- package/test/integration/app/cyberia/cyberia-instance-items.test.js +90 -0
- package/test/integration/app/cyberia/cyberia-load.test.js +466 -0
- package/test/integration/app/cyberia/cyberia-map-audio-conf.test.js +256 -0
- package/test/integration/app/cyberia/cyberia-stats.test.js +150 -0
- package/test/integration/app/cyberia/fallback-world-capture.test.js +338 -0
- package/test/integration/app/cyberia/object-layer-item-id.test.js +327 -0
- package/test/integration/app/cyberia/object-layer-item-selection.test.js +56 -0
- package/test/integration/app/cyberia/object-layer-natural-key.test.js +32 -0
- package/test/integration/app/cyberia/seed-audio.test.js +275 -0
- package/test/{shape-generator.test.js → integration/app/cyberia/shape-generator.test.js} +1 -1
- package/test/integration/infra/1-security/config-scope.test.js +305 -0
- package/test/integration/infra/1-security/container-storage.test.js +356 -0
- package/test/integration/infra/1-security/in-pod-cli-surface.test.js +86 -0
- package/test/integration/infra/1-security/secret-onboarding.test.js +930 -0
- package/test/{selinux.test.js → integration/infra/1-security/selinux.test.js} +2 -4
- package/test/{sops-secret-store.test.js → integration/infra/1-security/sops-secret-store.test.js} +415 -61
- package/test/integration/infra/1-security/systemd-service.test.js +70 -0
- package/test/integration/infra/1-security/underpost-config-secret.test.js +367 -0
- package/test/integration/infra/2-network/dns-firewall.test.js +566 -0
- package/test/integration/infra/2-network/node-capability.test.js +182 -0
- package/test/integration/infra/2-network/wireguard-cli.test.js +1187 -0
- package/test/{wireguard-edge.test.js → integration/infra/2-network/wireguard-edge.test.js} +649 -55
- package/test/{cluster-instances.test.js → integration/infra/3-cluster/cluster-instances.test.js} +11 -15
- package/test/{deploy-node-placement.test.js → integration/infra/3-cluster/deploy-node-placement.test.js} +3 -3
- package/test/integration/infra/3-cluster/docker-compose-stack.test.js +313 -0
- package/test/integration/infra/3-cluster/mongo-express-deploy.test.js +156 -0
- package/test/integration/infra/4-ingress/api-cross-origin.test.js +79 -0
- package/test/integration/infra/4-ingress/deploy-routes.test.js +379 -0
- package/test/integration/infra/4-ingress/gateway-static-assets.test.js +453 -0
- package/test/{instance-traffic-plan.test.js → integration/infra/4-ingress/instance-traffic-plan.test.js} +10 -6
- package/test/{underpost-gateway.test.js → integration/infra/4-ingress/underpost-gateway.test.js} +6 -6
- package/test/{underpost-ingress.test.js → integration/infra/4-ingress/underpost-ingress.test.js} +4 -4
- package/test/integration/infra/5-observability/cron-jobs.test.js +652 -0
- package/test/{deploy-monitor.test.js → integration/infra/5-observability/deploy-monitor.test.js} +29 -31
- package/test/integration/infra/5-observability/event-notification.test.js +197 -0
- package/test/integration/infra/5-observability/event-remediation.test.js +502 -0
- package/test/integration/infra/5-observability/event-targets.test.js +1174 -0
- package/test/integration/infra/5-observability/monitoring-stack.test.js +902 -0
- package/test/support/shell-harness.js +73 -0
- package/test/unit/build-template.test.js +97 -0
- package/test/unit/build-workflow-offline.test.js +132 -0
- package/test/unit/catalog.test.js +71 -0
- package/test/unit/client-build-docs.test.js +361 -0
- package/test/unit/client-bundle.test.js +313 -0
- package/test/unit/conf-loading.test.js +303 -0
- package/test/unit/conf-resolution.test.js +996 -0
- package/test/unit/coverage-artifact.test.js +221 -0
- package/test/{crypto.test.js → unit/crypto.test.js} +1 -1
- package/test/unit/cyberia/instance-backup.test.js +183 -0
- package/test/unit/cyberia/instance-object-layer-items.test.js +46 -0
- package/test/unit/cyberia/publish-workflow.test.js +22 -0
- package/test/unit/cyberia/stat-balance.test.js +69 -0
- package/test/unit/deploy-env-resolution.test.js +38 -0
- package/test/unit/deploy-log-table.test.js +518 -0
- package/test/unit/downloader-integrity.test.js +98 -0
- package/test/unit/execution-profiles.test.js +219 -0
- package/test/unit/file-reference-registry.test.js +141 -0
- package/test/unit/fleet-sync-source.test.js +149 -0
- package/test/unit/fs-storage-paths.test.js +596 -0
- package/test/unit/logger-redaction.test.js +141 -0
- package/test/unit/package.test.js +457 -0
- package/test/unit/prepare-host.test.js +382 -0
- package/test/unit/process-environment.test.js +18 -0
- package/test/unit/propagation-message.test.js +78 -0
- package/test/unit/redeploy-plan.test.js +24 -0
- package/test/unit/release-bump.test.js +474 -0
- package/test/unit/ssh-output-redaction.test.js +28 -0
- package/test/unit/start-options.test.js +46 -0
- package/test/unit/test-tiers.test.js +220 -0
- package/test/unit/zip-archive.test.js +142 -0
- package/vitest.config.js +66 -0
- package/.nycrc +0 -9
- package/deploy/lib/logging.sh +0 -96
- package/manifests/cronjobs/dd-cron/dd-cron-dns.yaml +0 -48
- package/manifests/mongodb/pv-pvc.yaml +0 -59
- package/scripts/coverall-test-cyberia.sh +0 -24
- package/scripts/coverall-test.sh +0 -24
- package/scripts/link-local-underpost-cli.sh +0 -6
- package/src/api/cyberia-instance/cyberia-fallback-default-items.js +0 -63
- package/src/api/user/user.build.js +0 -16
- package/src/cli/env.js +0 -177
- package/src/client/components/core/Blockchain.js +0 -41
- package/src/client/components/core/Blog.js +0 -9
- package/src/client/components/core/KeyboardAvoidance.js +0 -145
- package/src/client/components/cyberia/FallbackWorldEngineCyberia.js +0 -368
- package/src/client/public/default/assets/background/dark.jpg +0 -0
- package/src/client/public/default/assets/background/white0-min.jpg +0 -0
- package/src/client/public/default/assets/background/white0.jpg +0 -0
- package/src/client/public/doc/favicon.ico +0 -0
- package/src/client/public/doc/sitemap +0 -148
- package/src/server/downloader.js +0 -73
- package/src/server/environment.js +0 -98
package/src/runtime/wp/Wp.js
CHANGED
|
@@ -13,8 +13,8 @@
|
|
|
13
13
|
|
|
14
14
|
import fs from 'fs-extra';
|
|
15
15
|
import path from 'path';
|
|
16
|
-
import { shellExec } from '../../server/process.js';
|
|
17
|
-
import { loggerFactory } from '../../server/logger.js';
|
|
16
|
+
import { shellExec } from '../../server/runtime/process.js';
|
|
17
|
+
import { loggerFactory } from '../../server/ops/logger.js';
|
|
18
18
|
import { Lampp } from '../lampp/Lampp.js';
|
|
19
19
|
import Underpost from '../../index.js';
|
|
20
20
|
|
|
@@ -141,14 +141,7 @@ class WpService {
|
|
|
141
141
|
({ freshInstall } = WpService.provisionFresh({ host, siteRoot: wpDir, db, wp, subDir }));
|
|
142
142
|
}
|
|
143
143
|
|
|
144
|
-
|
|
145
|
-
// Mark the directory as safe before git operations — the site root is owned
|
|
146
|
-
// by daemon:daemon (Apache) and git 2.35+ refuses to run in directories owned
|
|
147
|
-
// by a different user unless explicitly declared safe.
|
|
148
|
-
if (repository) {
|
|
149
|
-
shellExec(`git config --global --add safe.directory "${wpDir}"`);
|
|
150
|
-
Underpost.repo.initLocalRepo({ path: wpDir, origin: repository });
|
|
151
|
-
}
|
|
144
|
+
if (repository) Underpost.repo.initLocalRepo({ path: wpDir, origin: repository });
|
|
152
145
|
|
|
153
146
|
// Write a root .htaccess that rewrites / → /subDir/ when running in subdirectory mode
|
|
154
147
|
if (subDir) {
|
|
@@ -187,9 +180,9 @@ class WpService {
|
|
|
187
180
|
}
|
|
188
181
|
|
|
189
182
|
/**
|
|
190
|
-
* Clone mode —
|
|
191
|
-
* verifies `wp-config.php` exists.
|
|
192
|
-
*
|
|
183
|
+
* Clone mode — materializes `siteRoot` from `repository` via
|
|
184
|
+
* {@link UnderpostRepository.provisionSiteRoot}, then verifies `wp-config.php` exists.
|
|
185
|
+
* An unreachable remote or a checkout without `wp-config.php` falls back to a fresh install.
|
|
193
186
|
* @param {object} opts
|
|
194
187
|
* @param {string} opts.host - Virtual-host name (for logging).
|
|
195
188
|
* @param {string} opts.siteRoot - Absolute path where the site should live.
|
|
@@ -197,37 +190,11 @@ class WpService {
|
|
|
197
190
|
* @param {object|null} [opts.db] - MariaDB config used as fallback for fresh install.
|
|
198
191
|
*/
|
|
199
192
|
static provisionClone({ host, siteRoot, repository, db, wp, subDir = '' }) {
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
// Step 0 — verify the remote repository is reachable; fall back to fresh install if not.
|
|
205
|
-
// repository.js isRemoteRepo handles token injection internally.
|
|
206
|
-
const repoAccessible = Underpost.repo.isRemoteRepo(repository);
|
|
207
|
-
logger.info(`${host}: remote accessible = ${repoAccessible} (${repository})`);
|
|
208
|
-
if (!repoAccessible) {
|
|
209
|
-
logger.warn(`${host}: remote repository not accessible (${repository}) — running fresh install`);
|
|
210
|
-
return WpService.provisionFresh({ host, siteRoot, db, wp, subDir });
|
|
211
|
-
}
|
|
193
|
+
const { accessible } = Underpost.repo.provisionSiteRoot({ host, siteRoot, repository });
|
|
194
|
+
if (!accessible) return WpService.provisionFresh({ host, siteRoot, db, wp, subDir });
|
|
212
195
|
|
|
213
|
-
//
|
|
214
|
-
|
|
215
|
-
logger.info(`${host}: cloning ${repository} → ${siteRoot}`);
|
|
216
|
-
const cloneUrl = Underpost.repo.resolveAuthUrl(repository);
|
|
217
|
-
const tmp = `${siteRoot}.tmp`;
|
|
218
|
-
if (fs.existsSync(tmp)) shellExec(`sudo rm -rf "${tmp}"`);
|
|
219
|
-
shellExec(`git clone "${cloneUrl}" "${tmp}"`);
|
|
220
|
-
shellExec(`sudo mv "${tmp}" "${siteRoot}"`);
|
|
221
|
-
shellExec(`sudo chmod -R 755 "${siteRoot}"`);
|
|
222
|
-
shellExec(`sudo chown -R daemon:daemon "${siteRoot}"`);
|
|
223
|
-
} else {
|
|
224
|
-
logger.info(`${host}: repo already present at ${siteRoot}`);
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
// Step 2 — verify wp-config.php; if missing, wipe and do a fresh install.
|
|
228
|
-
// initLocalRepo is NOT called here — createApp always calls it after provisionClone
|
|
229
|
-
// returns (whether clone or fallback path) so we avoid a double-init and ensure
|
|
230
|
-
// safe.directory is declared before git runs.
|
|
196
|
+
// A checkout without wp-config.php is not a WordPress site: discard it and install fresh.
|
|
197
|
+
// initLocalRepo is left to createApp so both provisioning paths converge on one call.
|
|
231
198
|
if (!fs.existsSync(path.join(siteRoot, 'wp-config.php'))) {
|
|
232
199
|
logger.warn(`${host}: wp-config.php not found — wiping site root and running fresh install`);
|
|
233
200
|
shellExec(`sudo rm -rf "${siteRoot}"`);
|
|
@@ -515,10 +482,9 @@ Thumbs.db
|
|
|
515
482
|
const repoName = repository.split('/').pop().split('.')[0];
|
|
516
483
|
|
|
517
484
|
logger.info(`${host}: persisting site to repository`);
|
|
518
|
-
shellExec(
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
);
|
|
485
|
+
shellExec(`cd "${siteRoot}" && git add -A && git commit -m "wp provision ${host} $(date -u +%Y-%m-%dT%H:%M:%SZ)"`, {
|
|
486
|
+
silentOnError: true,
|
|
487
|
+
});
|
|
522
488
|
shellExec(`cd "${siteRoot}" && underpost push . ${githubOrg}/${repoName} -f`);
|
|
523
489
|
logger.info(`${host}: initial commit pushed to ${githubOrg}/${repoName}`);
|
|
524
490
|
}
|
|
@@ -630,7 +596,9 @@ if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROT
|
|
|
630
596
|
|
|
631
597
|
// MariaDB export is handled by the shared db.js backup flow — no duplicate dump here.
|
|
632
598
|
if (fs.existsSync(path.join(siteRoot, '.git'))) {
|
|
633
|
-
shellExec(`cd "${siteRoot}" && git add -A && git commit -m "wp backup $(date -u +%Y-%m-%dT%H:%M:%SZ)"`, {
|
|
599
|
+
shellExec(`cd "${siteRoot}" && git add -A && git commit -m "wp backup $(date -u +%Y-%m-%dT%H:%M:%SZ)"`, {
|
|
600
|
+
silentOnError: true,
|
|
601
|
+
});
|
|
634
602
|
shellExec(`cd "${siteRoot}" && underpost push . ${githubOrg}/${repository.split('/').pop().split('.')[0]}`);
|
|
635
603
|
logger.info(`backup: git push done for ${siteRoot}`);
|
|
636
604
|
} else {
|
|
@@ -8,9 +8,9 @@
|
|
|
8
8
|
* deploy id resolve to the empty catalog — nothing else breaks.
|
|
9
9
|
*
|
|
10
10
|
* Each product catalog default-exports the uniform shape documented in
|
|
11
|
-
* {@link module:src/
|
|
11
|
+
* {@link module:src/projects/cyberia/catalog-cyberia.js}.
|
|
12
12
|
*
|
|
13
|
-
* @module src/server/catalog.js
|
|
13
|
+
* @module src/server/build/catalog.js
|
|
14
14
|
* @namespace Catalog
|
|
15
15
|
*/
|
|
16
16
|
|
|
@@ -18,7 +18,13 @@ import fs from 'fs-extra';
|
|
|
18
18
|
import { fileURLToPath } from 'node:url';
|
|
19
19
|
import * as path from 'node:path';
|
|
20
20
|
|
|
21
|
-
/**
|
|
21
|
+
/**
|
|
22
|
+
* Empty product catalog returned for deploy ids without a dedicated module.
|
|
23
|
+
*
|
|
24
|
+
* The `package*` fields are the deploy's package manifest contract, read by
|
|
25
|
+
* {@link module:src/server/build/package.js}: a deploy id with no catalog gets the engine
|
|
26
|
+
* manifest under its own identity, and one with a catalog adds exactly what it declares here.
|
|
27
|
+
*/
|
|
22
28
|
const EMPTY_CATALOG = {
|
|
23
29
|
sourceMoves: [],
|
|
24
30
|
privateConfPaths: [],
|
|
@@ -28,6 +34,10 @@ const EMPTY_CATALOG = {
|
|
|
28
34
|
copies: [],
|
|
29
35
|
keywords: [],
|
|
30
36
|
description: '',
|
|
37
|
+
packageName: '',
|
|
38
|
+
packageBin: {},
|
|
39
|
+
packageDependencies: {},
|
|
40
|
+
packageScripts: {},
|
|
31
41
|
};
|
|
32
42
|
|
|
33
43
|
/**
|
|
@@ -44,7 +54,7 @@ const loadDeployCatalog = async (deployId) => {
|
|
|
44
54
|
const suffix = (deployId ?? '').split('dd-')[1];
|
|
45
55
|
if (!suffix) return EMPTY_CATALOG;
|
|
46
56
|
if (fs.existsSync(`./src/projects/${suffix}/catalog-${suffix}.js`)) {
|
|
47
|
-
const mod = await import(
|
|
57
|
+
const mod = await import(`../../projects/${suffix}/catalog-${suffix}.js`);
|
|
48
58
|
return { ...EMPTY_CATALOG, ...(mod.default ?? {}) };
|
|
49
59
|
}
|
|
50
60
|
return EMPTY_CATALOG;
|
|
@@ -63,7 +73,7 @@ const loadProductCatalogs = async () => {
|
|
|
63
73
|
const catalogs = [];
|
|
64
74
|
for (const file of await fs.readdir('./src/projects')) {
|
|
65
75
|
if (file === 'underpost') continue;
|
|
66
|
-
const mod = await import(
|
|
76
|
+
const mod = await import(`../../projects/${file}/catalog-${file}.js`);
|
|
67
77
|
if (mod.default) catalogs.push({ ...EMPTY_CATALOG, ...mod.default });
|
|
68
78
|
}
|
|
69
79
|
return catalogs;
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The coverage HTML reports as build artifacts: which reports a deploy declares, where a run
|
|
3
|
+
* leaves each, where an assembled deploy artifact carries them, and what is published when
|
|
4
|
+
* one was not carried.
|
|
5
|
+
*
|
|
6
|
+
* A deploy declares its reports in `conf.server.json` under `docs.coverage`, one entry per
|
|
7
|
+
* report it publishes at `/docs/coverage/<id>`:
|
|
8
|
+
*
|
|
9
|
+
* - `{ id, label, suite }` — a test tier selection run by `node bin test <suite>`, whose HTML
|
|
10
|
+
* report the runner writes under `coverage/<key>` (see `coverageReportKey`). A deploy shows
|
|
11
|
+
* the run it names, never the last run a host happened to make.
|
|
12
|
+
* - `{ id, label, path }` — a report another tree produces on its own (Hardhat's Solidity
|
|
13
|
+
* coverage), read from that tree's `coverage/` output.
|
|
14
|
+
*
|
|
15
|
+
* Reports are produced by the test stage and bundled into the deploy artifact under
|
|
16
|
+
* {@link COVERAGE_BUNDLE_DIRECTORY}. A workload container only ever copies them: running a
|
|
17
|
+
* test runner inside a pod costs minutes of the build phase, needs the dev dependency tree,
|
|
18
|
+
* and — because a suite's expected non-zero exits latch the runtime status contract —
|
|
19
|
+
* publishes a false `error` to the deployment monitor.
|
|
20
|
+
*
|
|
21
|
+
* @module src/server/build/coverage.js
|
|
22
|
+
* @namespace UnderpostCoverage
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
import fs from 'fs-extra';
|
|
26
|
+
import { UNDERPOST_TESTING, coverageReportKey } from './testing.js';
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* @constant COVERAGE_BUNDLE_DIRECTORY
|
|
30
|
+
* @description Path, relative to a source tree root, under which an assembled deploy
|
|
31
|
+
* artifact carries each report as `<id>/`. Deliberately not under `coverage/`, which every
|
|
32
|
+
* engine `.gitignore` excludes, so the bundled artifact is publishable source rather than a
|
|
33
|
+
* local run's output.
|
|
34
|
+
* @memberof UnderpostCoverage
|
|
35
|
+
*/
|
|
36
|
+
const COVERAGE_BUNDLE_DIRECTORY = 'docs/coverage';
|
|
37
|
+
|
|
38
|
+
const normalizeRoot = (root) => `${root ?? ''}`.replace(/\/+$/, '');
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* @method coverageReportsFactory
|
|
42
|
+
* @description The reports a deploy's `docs` conf declares, validated: every entry names an
|
|
43
|
+
* id and exactly one source, and no two entries publish under the same id.
|
|
44
|
+
* @param {object} [docs] - The `docs` block of one `conf.server.json` route.
|
|
45
|
+
* @returns {Array<{id: string, label: string, suite?: string, path?: string}>} Declared reports.
|
|
46
|
+
* @throws {Error} When an entry is malformed or an id repeats.
|
|
47
|
+
* @memberof UnderpostCoverage
|
|
48
|
+
*/
|
|
49
|
+
const coverageReportsFactory = (docs = {}) => {
|
|
50
|
+
const reports = docs.coverage ?? [];
|
|
51
|
+
const ids = new Set();
|
|
52
|
+
for (const report of reports) {
|
|
53
|
+
const { id, suite, path } = report;
|
|
54
|
+
if (!id || !/^[a-z0-9-]+$/.test(id)) throw new Error(`[coverage] report id must be a slug, got '${id}'`);
|
|
55
|
+
if (ids.has(id)) throw new Error(`[coverage] report id '${id}' is declared twice`);
|
|
56
|
+
if (!suite === !path) throw new Error(`[coverage] report '${id}' needs exactly one of 'suite' or 'path'`);
|
|
57
|
+
ids.add(id);
|
|
58
|
+
}
|
|
59
|
+
return reports.map(({ id, label = id, suite, path }) => ({ id, label, suite, path }));
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* @method deployCoverageReports
|
|
64
|
+
* @description Every report a deploy declares across its routes, once each: two routes may
|
|
65
|
+
* publish the same report, never the same id with different sources.
|
|
66
|
+
* @param {object} confServer - A parsed `conf.server.json`.
|
|
67
|
+
* @returns {Array<{id: string, label: string, suite?: string, path?: string}>} Declared reports.
|
|
68
|
+
* @throws {Error} When an id is declared with two different sources.
|
|
69
|
+
* @memberof UnderpostCoverage
|
|
70
|
+
*/
|
|
71
|
+
const deployCoverageReports = (confServer) => {
|
|
72
|
+
const reports = new Map();
|
|
73
|
+
for (const routes of Object.values(confServer)) {
|
|
74
|
+
for (const { docs } of Object.values(routes)) {
|
|
75
|
+
for (const report of coverageReportsFactory(docs)) {
|
|
76
|
+
const known = reports.get(report.id);
|
|
77
|
+
if (known && (known.suite !== report.suite || known.path !== report.path))
|
|
78
|
+
throw new Error(`[coverage] report id '${report.id}' is declared with two different sources`);
|
|
79
|
+
reports.set(report.id, report);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return [...reports.values()];
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* @method coverageReportCandidates
|
|
88
|
+
* @description Every place one report can live, most local first: the output of the run
|
|
89
|
+
* that produces it, then the bundled artifact a deploy artifact carries.
|
|
90
|
+
* @param {{id: string, suite?: string, path?: string}} report - A declared report.
|
|
91
|
+
* @returns {string[]} Candidate report directories.
|
|
92
|
+
* @memberof UnderpostCoverage
|
|
93
|
+
*/
|
|
94
|
+
const coverageReportCandidates = ({ id, suite, path }) => {
|
|
95
|
+
const bundled = `${COVERAGE_BUNDLE_DIRECTORY}/${id}`;
|
|
96
|
+
if (suite) return [`${UNDERPOST_TESTING.coverageDirectory}/${coverageReportKey(suite)}`, bundled];
|
|
97
|
+
const coverage = `${normalizeRoot(path)}/${UNDERPOST_TESTING.coverageDirectory}`;
|
|
98
|
+
return [`${coverage}/html`, `${coverage}/lcov-report`, coverage, bundled];
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* @method resolveCoverageReportPath
|
|
103
|
+
* @description First candidate that actually carries an HTML index. A directory holding
|
|
104
|
+
* only `lcov.info` is not a report and is not published.
|
|
105
|
+
* @param {{id: string, suite?: string, path?: string}} report - A declared report.
|
|
106
|
+
* @returns {string|undefined} Report directory, or undefined when none is available.
|
|
107
|
+
* @memberof UnderpostCoverage
|
|
108
|
+
*/
|
|
109
|
+
const resolveCoverageReportPath = (report) =>
|
|
110
|
+
coverageReportCandidates(report).find((candidate) => fs.existsSync(`${candidate}/index.html`));
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* @method coverageReportCommand
|
|
114
|
+
* @description The command that produces a report, for the operator who finds it missing.
|
|
115
|
+
* @param {{suite?: string, path?: string}} report - A declared report.
|
|
116
|
+
* @returns {string} Shell command.
|
|
117
|
+
* @memberof UnderpostCoverage
|
|
118
|
+
*/
|
|
119
|
+
const coverageReportCommand = ({ suite, path }) =>
|
|
120
|
+
suite ? `node bin test ${suite}` : `npm run coverage --prefix ${normalizeRoot(path)}`;
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* @method bundleCoverageReports
|
|
124
|
+
* @description Copies each declared report into `toRoot`'s bundle directory, so the
|
|
125
|
+
* assembled artifact carries it into every container started from that source.
|
|
126
|
+
* @param {Array<{id: string, suite?: string, path?: string}>} reports - Declared reports.
|
|
127
|
+
* @param {string} toRoot - Assembled artifact root.
|
|
128
|
+
* @returns {Array<{id: string, bundled: boolean, from?: string, to: string}>} What was bundled, and where.
|
|
129
|
+
* @memberof UnderpostCoverage
|
|
130
|
+
*/
|
|
131
|
+
const bundleCoverageReports = (reports, toRoot) =>
|
|
132
|
+
reports.map((report) => {
|
|
133
|
+
const to = `${normalizeRoot(toRoot)}/${COVERAGE_BUNDLE_DIRECTORY}/${report.id}`;
|
|
134
|
+
const from = resolveCoverageReportPath(report);
|
|
135
|
+
if (!from) return { id: report.id, bundled: false, to };
|
|
136
|
+
fs.emptyDirSync(to);
|
|
137
|
+
fs.copySync(from, to);
|
|
138
|
+
return { id: report.id, bundled: true, from, to };
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* @method coverageUnavailablePage
|
|
143
|
+
* @description The page served where a report was expected but none was bundled. A static
|
|
144
|
+
* document, never an invitation to generate one at runtime.
|
|
145
|
+
* @param {{id: string, suite?: string, path?: string}} report - The missing report.
|
|
146
|
+
* @returns {string} HTML document.
|
|
147
|
+
* @memberof UnderpostCoverage
|
|
148
|
+
*/
|
|
149
|
+
const coverageUnavailablePage = (report) => `<!doctype html>
|
|
150
|
+
<html lang="en">
|
|
151
|
+
<head>
|
|
152
|
+
<meta charset="utf-8" />
|
|
153
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
154
|
+
<meta name="robots" content="noindex" />
|
|
155
|
+
<title>Coverage report unavailable</title>
|
|
156
|
+
<style>
|
|
157
|
+
:root { color-scheme: light dark; }
|
|
158
|
+
body { margin: 0; display: grid; place-items: center; min-height: 100vh;
|
|
159
|
+
font: 16px/1.6 system-ui, -apple-system, Segoe UI, Roboto, sans-serif; }
|
|
160
|
+
main { max-width: 34rem; padding: 2rem; }
|
|
161
|
+
h1 { font-size: 1.25rem; margin: 0 0 .75rem; }
|
|
162
|
+
p { margin: 0 0 .75rem; opacity: .8; }
|
|
163
|
+
code { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: .9em; }
|
|
164
|
+
</style>
|
|
165
|
+
</head>
|
|
166
|
+
<body>
|
|
167
|
+
<main>
|
|
168
|
+
<h1>Coverage report unavailable</h1>
|
|
169
|
+
<p>This build carried no <code>${report.id}</code> coverage report. The report is generated
|
|
170
|
+
by the test stage and bundled into the deploy artifact under
|
|
171
|
+
<code>${COVERAGE_BUNDLE_DIRECTORY}/${report.id}</code>.</p>
|
|
172
|
+
<p>Run <code>${coverageReportCommand(report)}</code> in the build environment, then assemble
|
|
173
|
+
and publish the artifact again.</p>
|
|
174
|
+
</main>
|
|
175
|
+
</body>
|
|
176
|
+
</html>
|
|
177
|
+
`;
|
|
178
|
+
|
|
179
|
+
export {
|
|
180
|
+
COVERAGE_BUNDLE_DIRECTORY,
|
|
181
|
+
bundleCoverageReports,
|
|
182
|
+
coverageReportCandidates,
|
|
183
|
+
coverageReportCommand,
|
|
184
|
+
coverageReportsFactory,
|
|
185
|
+
coverageUnavailablePage,
|
|
186
|
+
deployCoverageReports,
|
|
187
|
+
resolveCoverageReportPath,
|
|
188
|
+
};
|