@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
|
@@ -0,0 +1,508 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Package manifest and archive build utilities.
|
|
3
|
+
*
|
|
4
|
+
* @module src/server/build/package.js
|
|
5
|
+
* @namespace PackageBuilder
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import fs from 'fs-extra';
|
|
9
|
+
import os from 'node:os';
|
|
10
|
+
import nodePath from 'node:path';
|
|
11
|
+
import { fileURLToPath } from 'node:url';
|
|
12
|
+
import { loggerFactory } from '../ops/logger.js';
|
|
13
|
+
import { shellArgumentFactory, shellExec } from '../runtime/process.js';
|
|
14
|
+
import { loadDeployCatalog } from './catalog.js';
|
|
15
|
+
|
|
16
|
+
const logger = loggerFactory(import.meta);
|
|
17
|
+
const ENGINE_PACKAGE_PATH = fileURLToPath(new URL('../../../', import.meta.url));
|
|
18
|
+
const STAGED_CLI_PACKAGE = 'underpost-cli.tgz';
|
|
19
|
+
const DEPLOY_CONF_ROOT = './engine-private/conf';
|
|
20
|
+
const DEPLOY_MANIFEST_INDENT = 4;
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Packs an npm package into a build context under a stable file name.
|
|
24
|
+
*
|
|
25
|
+
* @param {object} params
|
|
26
|
+
* @param {string} params.stagedFileName
|
|
27
|
+
* @param {string} [params.outputPath]
|
|
28
|
+
* @param {string} [params.packagePath]
|
|
29
|
+
* @returns {string} Absolute path to the staged archive.
|
|
30
|
+
* @memberof PackageBuilder
|
|
31
|
+
*/
|
|
32
|
+
const stagePackageArchive = ({ stagedFileName, outputPath = '.', packagePath = '.' } = {}) => {
|
|
33
|
+
if (!stagedFileName || nodePath.basename(stagedFileName) !== stagedFileName)
|
|
34
|
+
throw new TypeError('stagePackageArchive requires a file name without a directory');
|
|
35
|
+
|
|
36
|
+
const sourcePath = nodePath.resolve(packagePath);
|
|
37
|
+
const destinationPath = nodePath.resolve(outputPath);
|
|
38
|
+
if (!fs.existsSync(nodePath.join(sourcePath, 'package.json')))
|
|
39
|
+
throw new Error(`Package manifest not found: ${nodePath.join(sourcePath, 'package.json')}`);
|
|
40
|
+
|
|
41
|
+
fs.ensureDirSync(destinationPath);
|
|
42
|
+
const temporaryPath = fs.mkdtempSync(nodePath.join(os.tmpdir(), 'underpost-package-'));
|
|
43
|
+
|
|
44
|
+
try {
|
|
45
|
+
shellExec(
|
|
46
|
+
`npm pack --ignore-scripts --pack-destination ${shellArgumentFactory(temporaryPath)} ${shellArgumentFactory(sourcePath)}`,
|
|
47
|
+
{ silent: true },
|
|
48
|
+
);
|
|
49
|
+
const archives = fs.readdirSync(temporaryPath).filter((entry) => entry.endsWith('.tgz'));
|
|
50
|
+
if (archives.length !== 1)
|
|
51
|
+
throw new Error(
|
|
52
|
+
`Expected exactly one package archive for ${sourcePath}, found ${archives.length}: ${archives.join(', ')}`,
|
|
53
|
+
);
|
|
54
|
+
|
|
55
|
+
const stagedPath = nodePath.join(destinationPath, stagedFileName);
|
|
56
|
+
fs.moveSync(nodePath.join(temporaryPath, archives[0]), stagedPath, { overwrite: true });
|
|
57
|
+
logger.info('Staged npm package archive', { source: archives[0], staged: stagedPath });
|
|
58
|
+
return stagedPath;
|
|
59
|
+
} finally {
|
|
60
|
+
fs.removeSync(temporaryPath);
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Stages this engine checkout as the CLI archive consumed by runtime images.
|
|
66
|
+
*
|
|
67
|
+
* @param {string} [outputPath]
|
|
68
|
+
* @returns {string} Absolute path to the staged archive.
|
|
69
|
+
* @memberof PackageBuilder
|
|
70
|
+
*/
|
|
71
|
+
const stageCliPackage = (outputPath = '.') =>
|
|
72
|
+
stagePackageArchive({
|
|
73
|
+
stagedFileName: STAGED_CLI_PACKAGE,
|
|
74
|
+
outputPath,
|
|
75
|
+
packagePath: ENGINE_PACKAGE_PATH,
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
const replaceTemplateReferences = (value, templateRepositoryName, repositoryName) => {
|
|
79
|
+
if (!templateRepositoryName || !repositoryName) return value;
|
|
80
|
+
if (typeof value === 'string') return value.replaceAll(templateRepositoryName, repositoryName);
|
|
81
|
+
if (Array.isArray(value))
|
|
82
|
+
return value.map((entry) => replaceTemplateReferences(entry, templateRepositoryName, repositoryName));
|
|
83
|
+
if (value && typeof value === 'object')
|
|
84
|
+
return Object.fromEntries(
|
|
85
|
+
Object.entries(value).map(([key, entry]) => [
|
|
86
|
+
key,
|
|
87
|
+
replaceTemplateReferences(entry, templateRepositoryName, repositoryName),
|
|
88
|
+
]),
|
|
89
|
+
);
|
|
90
|
+
return value;
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Builds the development dependency set for a generated product repository.
|
|
95
|
+
*
|
|
96
|
+
* A product's runtime set is the engine's plus whatever its catalog pins, so what stays here is
|
|
97
|
+
* the toolchain the generated repository needs to build and test itself: engine dev
|
|
98
|
+
* dependencies, the template's own, and anything the product already declares at runtime is
|
|
99
|
+
* dropped rather than pinned twice.
|
|
100
|
+
*
|
|
101
|
+
* @param {object} [params]
|
|
102
|
+
* @param {Record<string, string>} [params.engineDependencies]
|
|
103
|
+
* @param {Record<string, string>} [params.engineDevDependencies]
|
|
104
|
+
* @param {Record<string, string>} [params.productDependencies]
|
|
105
|
+
* @param {Record<string, string>} [params.productDevDependencies]
|
|
106
|
+
* @returns {Record<string, string>}
|
|
107
|
+
* @memberof PackageBuilder
|
|
108
|
+
*/
|
|
109
|
+
const productDevDependenciesFactory = ({
|
|
110
|
+
engineDependencies = {},
|
|
111
|
+
engineDevDependencies = {},
|
|
112
|
+
productDependencies = {},
|
|
113
|
+
productDevDependencies = {},
|
|
114
|
+
} = {}) => {
|
|
115
|
+
const developmentDependencies = {
|
|
116
|
+
...engineDependencies,
|
|
117
|
+
...engineDevDependencies,
|
|
118
|
+
...productDevDependencies,
|
|
119
|
+
};
|
|
120
|
+
|
|
121
|
+
for (const dependency of Object.keys(productDependencies)) delete developmentDependencies[dependency];
|
|
122
|
+
|
|
123
|
+
return developmentDependencies;
|
|
124
|
+
};
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Returns a generated product manifest without mutating its inputs.
|
|
128
|
+
*
|
|
129
|
+
* @param {object} params
|
|
130
|
+
* @param {object} params.basePackageJson
|
|
131
|
+
* @param {object} [params.sourcePackageJson]
|
|
132
|
+
* @param {object} [params.catalog]
|
|
133
|
+
* @param {string} params.confName
|
|
134
|
+
* @param {Record<string, string>} [params.customDependencies]
|
|
135
|
+
* @param {Record<string, string>} [params.customScripts]
|
|
136
|
+
* @param {Record<string, string>} [params.customBin]
|
|
137
|
+
* @param {string} [params.templateRepositoryName]
|
|
138
|
+
* @param {string} [params.repositoryName]
|
|
139
|
+
* @returns {object}
|
|
140
|
+
* @memberof PackageBuilder
|
|
141
|
+
*/
|
|
142
|
+
const buildProductPackageJson = ({
|
|
143
|
+
basePackageJson,
|
|
144
|
+
sourcePackageJson = basePackageJson,
|
|
145
|
+
catalog = {},
|
|
146
|
+
confName,
|
|
147
|
+
customDependencies,
|
|
148
|
+
customScripts = {},
|
|
149
|
+
customBin,
|
|
150
|
+
templateRepositoryName = 'pwa-microservices-template',
|
|
151
|
+
repositoryName = `engine-${confName?.replace(/^dd-/, '')}`,
|
|
152
|
+
} = {}) => {
|
|
153
|
+
if (!basePackageJson || typeof basePackageJson !== 'object')
|
|
154
|
+
throw new TypeError('buildProductPackageJson requires basePackageJson');
|
|
155
|
+
if (!confName) throw new TypeError('buildProductPackageJson requires confName');
|
|
156
|
+
|
|
157
|
+
const base = replaceTemplateReferences(basePackageJson, templateRepositoryName, repositoryName);
|
|
158
|
+
const { devDependencies: baseDevDependencies, ...baseManifest } = base;
|
|
159
|
+
const dependencies = customDependencies === undefined ? { ...base.dependencies } : { ...customDependencies };
|
|
160
|
+
const devDependencies =
|
|
161
|
+
customDependencies === undefined
|
|
162
|
+
? { ...baseDevDependencies }
|
|
163
|
+
: productDevDependenciesFactory({
|
|
164
|
+
engineDependencies: sourcePackageJson?.dependencies,
|
|
165
|
+
engineDevDependencies: sourcePackageJson?.devDependencies,
|
|
166
|
+
productDependencies: dependencies,
|
|
167
|
+
productDevDependencies: baseDevDependencies,
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
return {
|
|
171
|
+
...baseManifest,
|
|
172
|
+
name: confName.replace(/^dd-/, ''),
|
|
173
|
+
...(catalog.description ? { description: catalog.description } : {}),
|
|
174
|
+
...(catalog.keywords?.length ? { keywords: [...catalog.keywords] } : {}),
|
|
175
|
+
dependencies,
|
|
176
|
+
...(Object.keys(devDependencies).length ? { devDependencies } : {}),
|
|
177
|
+
scripts: { ...base.scripts, ...customScripts },
|
|
178
|
+
...(customBin === undefined ? {} : { bin: { ...customBin } }),
|
|
179
|
+
};
|
|
180
|
+
};
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* The manifest a product publishes to npm, from the one its repository runs on.
|
|
184
|
+
*
|
|
185
|
+
* A product repository declares the engine's runtime dependencies because it runs the engine
|
|
186
|
+
* source it ships. Somebody installing the product from the registry does not run that
|
|
187
|
+
* checkout: they get the engine through the published `underpost` package, so the tarball
|
|
188
|
+
* declares that package and the catalog's pins, and everything else stays the toolchain the
|
|
189
|
+
* repository builds and tests itself with. Publishing the repository's manifest unchanged
|
|
190
|
+
* would install a second copy of the engine's dependency set next to `underpost`'s own.
|
|
191
|
+
*
|
|
192
|
+
* The rewrite belongs to the publish step alone — never to the checkout, whose install is what
|
|
193
|
+
* a node and a pod run from.
|
|
194
|
+
* @param {object} params
|
|
195
|
+
* @param {object} params.packageJson - The repository's manifest.
|
|
196
|
+
* @param {object} [params.catalog] - That product's catalog.
|
|
197
|
+
* @param {string} [params.underpostVersion] - Engine CLI version to pin; the manifest's own otherwise.
|
|
198
|
+
* @returns {object} The manifest to publish.
|
|
199
|
+
* @memberof PackageBuilder
|
|
200
|
+
*/
|
|
201
|
+
const publishedProductPackageJson = ({ packageJson, catalog = {}, underpostVersion = '' } = {}) => {
|
|
202
|
+
if (!packageJson || typeof packageJson !== 'object')
|
|
203
|
+
throw new TypeError('publishedProductPackageJson requires packageJson');
|
|
204
|
+
|
|
205
|
+
const version = `${underpostVersion || packageJson.version || ''}`.replace(/^v/, '');
|
|
206
|
+
if (!version) throw new TypeError('publishedProductPackageJson requires a version to pin the engine CLI at');
|
|
207
|
+
|
|
208
|
+
const dependencies = { underpost: `^${version}`, ...(catalog.packageDependencies ?? {}) };
|
|
209
|
+
const devDependencies = productDevDependenciesFactory({
|
|
210
|
+
engineDependencies: packageJson.dependencies,
|
|
211
|
+
engineDevDependencies: packageJson.devDependencies,
|
|
212
|
+
productDependencies: dependencies,
|
|
213
|
+
});
|
|
214
|
+
|
|
215
|
+
return {
|
|
216
|
+
...packageJson,
|
|
217
|
+
dependencies,
|
|
218
|
+
...(Object.keys(devDependencies).length ? { devDependencies } : {}),
|
|
219
|
+
};
|
|
220
|
+
};
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
* Where a deploy id's package manifest lives.
|
|
224
|
+
*
|
|
225
|
+
* A deploy's manifest is part of its configuration, next to `conf.server.json` and its env
|
|
226
|
+
* files, so it is versioned with them rather than derived on the node.
|
|
227
|
+
* @param {string} deployId - Deploy id (e.g. `dd-cyberia`).
|
|
228
|
+
* @param {string} [confRoot] - Root of the private configuration tree.
|
|
229
|
+
* @returns {string} Path to that deploy's `package.json`.
|
|
230
|
+
* @memberof PackageBuilder
|
|
231
|
+
*/
|
|
232
|
+
const deployPackagePathFactory = (deployId, confRoot = DEPLOY_CONF_ROOT) => `${confRoot}/${deployId}/package.json`;
|
|
233
|
+
|
|
234
|
+
/**
|
|
235
|
+
* The npm name a deploy id publishes under.
|
|
236
|
+
*
|
|
237
|
+
* A catalog names its own package; every other deploy id is its own identity without the `dd-`
|
|
238
|
+
* prefix. One rule, so a manifest cannot be renamed by whichever command generated it.
|
|
239
|
+
* @param {string} deployId - Deploy id.
|
|
240
|
+
* @param {object} [catalog] - That deploy's product catalog.
|
|
241
|
+
* @returns {string} Package name.
|
|
242
|
+
* @memberof PackageBuilder
|
|
243
|
+
*/
|
|
244
|
+
const deployPackageNameFactory = (deployId, catalog = {}) =>
|
|
245
|
+
`${catalog.packageName || `${deployId ?? ''}`.replace(/^dd-/, '')}`;
|
|
246
|
+
|
|
247
|
+
/**
|
|
248
|
+
* The `start` script a deploy runs under.
|
|
249
|
+
*
|
|
250
|
+
* A catalog may declare its own, and an existing manifest's is preserved — a deploy that starts
|
|
251
|
+
* something other than the engine server (a cron applier, say) keeps saying so across a
|
|
252
|
+
* regeneration. Only a manifest that declares nothing gets the engine default.
|
|
253
|
+
* @param {string} deployId - Deploy id.
|
|
254
|
+
* @param {object} [catalog] - That deploy's product catalog.
|
|
255
|
+
* @param {object} [currentPackageJson] - The manifest being regenerated, when one exists.
|
|
256
|
+
* @returns {string} Start script.
|
|
257
|
+
* @memberof PackageBuilder
|
|
258
|
+
*/
|
|
259
|
+
const deployStartScriptFactory = (deployId, catalog = {}, currentPackageJson = {}) =>
|
|
260
|
+
catalog.packageScripts?.start ||
|
|
261
|
+
currentPackageJson?.scripts?.start ||
|
|
262
|
+
`node --max-old-space-size=8192 src/server ${deployId}`;
|
|
263
|
+
|
|
264
|
+
/**
|
|
265
|
+
* Builds a deploy id's package manifest from the engine's, without mutating either input.
|
|
266
|
+
*
|
|
267
|
+
* One generator for every deploy manifest in the project. The engine manifest is the base —
|
|
268
|
+
* its dependencies, overrides and toolchain scripts are what the checkout actually runs on —
|
|
269
|
+
* and the deploy owns only its identity, its `start`, and whatever its catalog adds. A deploy
|
|
270
|
+
* id without a catalog is therefore the engine manifest under its own name, which is the whole
|
|
271
|
+
* default: nothing has to be declared for a new deploy to have a correct manifest.
|
|
272
|
+
*
|
|
273
|
+
* `productIdentity` selects the standalone CLI's bin map over the engine's. It is off for a
|
|
274
|
+
* deploy's own manifest on purpose: that manifest is installed over the engine checkout on
|
|
275
|
+
* hosts and in pods, where `npm link` must keep publishing the engine's command.
|
|
276
|
+
* @param {object} params
|
|
277
|
+
* @param {string} params.deployId - Deploy id the manifest belongs to.
|
|
278
|
+
* @param {object} params.enginePackageJson - The engine's own manifest.
|
|
279
|
+
* @param {object} [params.catalog] - That deploy's product catalog.
|
|
280
|
+
* @param {object} [params.currentPackageJson] - The manifest being regenerated, when one exists.
|
|
281
|
+
* @param {boolean} [params.productIdentity] - Use the catalog's bin map instead of the engine's.
|
|
282
|
+
* @returns {object} The generated manifest.
|
|
283
|
+
* @memberof PackageBuilder
|
|
284
|
+
*/
|
|
285
|
+
const buildDeployPackageJson = ({
|
|
286
|
+
deployId,
|
|
287
|
+
enginePackageJson,
|
|
288
|
+
catalog = {},
|
|
289
|
+
currentPackageJson = {},
|
|
290
|
+
productIdentity = false,
|
|
291
|
+
} = {}) => {
|
|
292
|
+
if (!deployId) throw new TypeError('buildDeployPackageJson requires deployId');
|
|
293
|
+
if (!enginePackageJson || typeof enginePackageJson !== 'object')
|
|
294
|
+
throw new TypeError('buildDeployPackageJson requires enginePackageJson');
|
|
295
|
+
|
|
296
|
+
const catalogBin = catalog.packageBin && Object.keys(catalog.packageBin).length ? { ...catalog.packageBin } : null;
|
|
297
|
+
const bin = productIdentity && catalogBin ? catalogBin : enginePackageJson.bin;
|
|
298
|
+
|
|
299
|
+
return {
|
|
300
|
+
...enginePackageJson,
|
|
301
|
+
name: deployPackageNameFactory(deployId, catalog),
|
|
302
|
+
...(catalog.description ? { description: catalog.description } : {}),
|
|
303
|
+
...(catalog.keywords?.length ? { keywords: [...catalog.keywords] } : {}),
|
|
304
|
+
scripts: {
|
|
305
|
+
...enginePackageJson.scripts,
|
|
306
|
+
...catalog.packageScripts,
|
|
307
|
+
start: deployStartScriptFactory(deployId, catalog, currentPackageJson),
|
|
308
|
+
},
|
|
309
|
+
dependencies: { ...enginePackageJson.dependencies, ...catalog.packageDependencies },
|
|
310
|
+
...(bin === undefined ? {} : { bin: { ...bin } }),
|
|
311
|
+
};
|
|
312
|
+
};
|
|
313
|
+
|
|
314
|
+
/**
|
|
315
|
+
* The product-CLI manifest overrides a catalog declares, for {@link buildProductPackageJson}.
|
|
316
|
+
*
|
|
317
|
+
* A product package carries the engine's own runtime dependencies, not the published
|
|
318
|
+
* `underpost` package. A product repository ships the engine source and runs it directly, so
|
|
319
|
+
* depending on the package installed a second copy of the engine whose nested tree `src/`
|
|
320
|
+
* cannot resolve from — and a dependency pinned at a different version there was reachable
|
|
321
|
+
* only as a dev entry, which a production install omits, leaving the deployment unable to
|
|
322
|
+
* import its own modules. A catalog that declares no package contract returns nothing, leaving
|
|
323
|
+
* the base template's manifest as it is.
|
|
324
|
+
* @param {object} params
|
|
325
|
+
* @param {object} params.catalog - The deploy's product catalog.
|
|
326
|
+
* @param {Record<string, string>} [params.engineDependencies] - The engine's runtime dependencies.
|
|
327
|
+
* @returns {{customDependencies?: object, customScripts?: object, customBin?: object}} Overrides.
|
|
328
|
+
* @memberof PackageBuilder
|
|
329
|
+
*/
|
|
330
|
+
const productPackageOptionsFactory = ({ catalog = {}, engineDependencies = {} } = {}) => {
|
|
331
|
+
const dependencies = catalog.packageDependencies ?? {};
|
|
332
|
+
const bin = catalog.packageBin ?? {};
|
|
333
|
+
if (Object.keys(dependencies).length === 0 && Object.keys(bin).length === 0) return {};
|
|
334
|
+
|
|
335
|
+
return {
|
|
336
|
+
customDependencies: { ...engineDependencies, ...dependencies },
|
|
337
|
+
customScripts: { ...catalog.packageScripts },
|
|
338
|
+
...(Object.keys(bin).length ? { customBin: { ...bin } } : {}),
|
|
339
|
+
};
|
|
340
|
+
};
|
|
341
|
+
|
|
342
|
+
/**
|
|
343
|
+
* Regenerates the package manifest of every deploy id that has one.
|
|
344
|
+
*
|
|
345
|
+
* The engine's manifest is the source: a dependency added there reaches every deploy from here,
|
|
346
|
+
* which is what keeps a node's install from pruning packages the CLI imports. Deploy ids are
|
|
347
|
+
* discovered from the configuration tree rather than listed, so a new deploy is covered by
|
|
348
|
+
* existing.
|
|
349
|
+
* @param {object} [params]
|
|
350
|
+
* @param {string[]} [params.deployIds] - Deploy ids to regenerate; every one that has a manifest otherwise.
|
|
351
|
+
* @param {string} [params.confRoot] - Root of the private configuration tree.
|
|
352
|
+
* @param {object} [params.enginePackageJson] - The engine's own manifest.
|
|
353
|
+
* @param {boolean} [params.dryRun] - Resolve the manifests without writing them.
|
|
354
|
+
* @returns {Promise<Array<{deployId: string, path: string, name: string}>>} What was regenerated.
|
|
355
|
+
* @memberof PackageBuilder
|
|
356
|
+
*/
|
|
357
|
+
const syncDeployPackages = async ({
|
|
358
|
+
deployIds = [],
|
|
359
|
+
confRoot = DEPLOY_CONF_ROOT,
|
|
360
|
+
enginePackageJson = JSON.parse(fs.readFileSync('./package.json', 'utf8')),
|
|
361
|
+
dryRun = false,
|
|
362
|
+
} = {}) => {
|
|
363
|
+
if (!fs.existsSync(confRoot)) {
|
|
364
|
+
logger.warn('No private configuration tree to sync deploy manifests into', { confRoot });
|
|
365
|
+
return [];
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
const selected = deployIds.length > 0 ? deployIds : fs.readdirSync(confRoot).sort();
|
|
369
|
+
const synced = [];
|
|
370
|
+
for (const deployId of selected) {
|
|
371
|
+
const manifestPath = deployPackagePathFactory(deployId, confRoot);
|
|
372
|
+
if (!fs.existsSync(manifestPath)) {
|
|
373
|
+
// A deploy id named explicitly is a request, not a discovery: say which one has no
|
|
374
|
+
// manifest instead of reporting a silent no-op.
|
|
375
|
+
if (deployIds.length > 0) logger.warn('Deploy has no package manifest to sync', { deployId, manifestPath });
|
|
376
|
+
continue;
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
const currentPackageJson = JSON.parse(fs.readFileSync(manifestPath, 'utf8'));
|
|
380
|
+
const packageJson = buildDeployPackageJson({
|
|
381
|
+
deployId,
|
|
382
|
+
enginePackageJson,
|
|
383
|
+
catalog: await loadDeployCatalog(deployId),
|
|
384
|
+
currentPackageJson,
|
|
385
|
+
});
|
|
386
|
+
if (!dryRun)
|
|
387
|
+
fs.writeFileSync(manifestPath, `${JSON.stringify(packageJson, null, DEPLOY_MANIFEST_INDENT)}\n`, 'utf8');
|
|
388
|
+
synced.push({ deployId, path: manifestPath, name: packageJson.name });
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
logger.info('Deploy package manifests synced', { count: synced.length, dryRun, confRoot });
|
|
392
|
+
return synced;
|
|
393
|
+
};
|
|
394
|
+
|
|
395
|
+
/**
|
|
396
|
+
* The `repository` field a package points at.
|
|
397
|
+
*
|
|
398
|
+
* @param {string} slug - Repository `owner/repo` slug.
|
|
399
|
+
* @returns {{type: string, url: string}} Manifest repository entry.
|
|
400
|
+
* @memberof PackageBuilder
|
|
401
|
+
*/
|
|
402
|
+
const packageRepositoryFactory = (slug) => ({ type: 'git', url: `git+https://github.com/${slug}.git` });
|
|
403
|
+
|
|
404
|
+
const readManifest = (path) => JSON.parse(fs.readFileSync(path, 'utf8'));
|
|
405
|
+
const writeManifest = (path, manifest) =>
|
|
406
|
+
fs.writeFileSync(path, `${JSON.stringify(manifest, null, DEPLOY_MANIFEST_INDENT)}\n`, 'utf8');
|
|
407
|
+
|
|
408
|
+
/**
|
|
409
|
+
* Renames a checkout's package, in its manifest and its lockfile.
|
|
410
|
+
*
|
|
411
|
+
* Both carry the name, and npm rejects an install where they disagree, so they are one
|
|
412
|
+
* operation. A checkout with no lockfile is renamed just as well.
|
|
413
|
+
* @param {object} params
|
|
414
|
+
* @param {string} params.name - New package name.
|
|
415
|
+
* @param {string} [params.packagePath] - Manifest to rename.
|
|
416
|
+
* @param {string} [params.lockPath] - Lockfile to rename alongside it.
|
|
417
|
+
* @returns {{name: string, files: string[]}} The name applied and where.
|
|
418
|
+
* @memberof PackageBuilder
|
|
419
|
+
*/
|
|
420
|
+
const renamePackage = ({ name, packagePath = './package.json', lockPath = './package-lock.json' } = {}) => {
|
|
421
|
+
if (!name) throw new TypeError('renamePackage requires name');
|
|
422
|
+
|
|
423
|
+
writeManifest(packagePath, { ...readManifest(packagePath), name });
|
|
424
|
+
const files = [packagePath];
|
|
425
|
+
|
|
426
|
+
if (fs.existsSync(lockPath)) {
|
|
427
|
+
const lock = readManifest(lockPath);
|
|
428
|
+
writeManifest(lockPath, {
|
|
429
|
+
...lock,
|
|
430
|
+
name,
|
|
431
|
+
...(lock.packages?.[''] ? { packages: { ...lock.packages, '': { ...lock.packages[''], name } } } : {}),
|
|
432
|
+
});
|
|
433
|
+
files.push(lockPath);
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
logger.info('Package renamed', { name, files });
|
|
437
|
+
return { name, files };
|
|
438
|
+
};
|
|
439
|
+
|
|
440
|
+
/**
|
|
441
|
+
* Points a checkout's package at a repository.
|
|
442
|
+
*
|
|
443
|
+
* @param {object} params
|
|
444
|
+
* @param {string} params.slug - Repository `owner/repo` slug.
|
|
445
|
+
* @param {string} [params.packagePath] - Manifest to update.
|
|
446
|
+
* @returns {{repository: object}} The repository entry applied.
|
|
447
|
+
* @memberof PackageBuilder
|
|
448
|
+
*/
|
|
449
|
+
const setPackageRepository = ({ slug, packagePath = './package.json' } = {}) => {
|
|
450
|
+
if (!slug) throw new TypeError('setPackageRepository requires slug');
|
|
451
|
+
|
|
452
|
+
const repository = packageRepositoryFactory(slug);
|
|
453
|
+
writeManifest(packagePath, { ...readManifest(packagePath), repository });
|
|
454
|
+
logger.info('Package repository set', { slug, packagePath });
|
|
455
|
+
return { repository };
|
|
456
|
+
};
|
|
457
|
+
|
|
458
|
+
/**
|
|
459
|
+
* The install specifiers a deploy's catalog pins, as `name@version`.
|
|
460
|
+
*
|
|
461
|
+
* The pins are the catalog's, so an install and a generated manifest cannot disagree about a
|
|
462
|
+
* version.
|
|
463
|
+
* @param {object} [catalog] - The deploy's product catalog.
|
|
464
|
+
* @returns {string[]} Specifiers, in declaration order.
|
|
465
|
+
* @memberof PackageBuilder
|
|
466
|
+
*/
|
|
467
|
+
const deployDependencySpecsFactory = (catalog = {}) =>
|
|
468
|
+
Object.entries(catalog.packageDependencies ?? {}).map(([name, version]) => `${name}@${version}`);
|
|
469
|
+
|
|
470
|
+
/**
|
|
471
|
+
* Installs a deploy's catalog dependencies into the current checkout, at their pinned versions.
|
|
472
|
+
*
|
|
473
|
+
* @param {string} deployId - Deploy id whose catalog dependencies are installed.
|
|
474
|
+
* @param {object} [catalog] - Pre-loaded catalog; loaded from the deploy id otherwise.
|
|
475
|
+
* @returns {Promise<string[]>} The dependencies installed, as `name@version`.
|
|
476
|
+
* @memberof PackageBuilder
|
|
477
|
+
*/
|
|
478
|
+
const installDeployDependencies = async (deployId, catalog) => {
|
|
479
|
+
const specs = deployDependencySpecsFactory(catalog ?? (await loadDeployCatalog(deployId)));
|
|
480
|
+
if (specs.length === 0) {
|
|
481
|
+
logger.warn('Deploy declares no catalog dependencies', { deployId });
|
|
482
|
+
return specs;
|
|
483
|
+
}
|
|
484
|
+
shellExec(`npm install ${specs.join(' ')}`);
|
|
485
|
+
return specs;
|
|
486
|
+
};
|
|
487
|
+
|
|
488
|
+
export {
|
|
489
|
+
DEPLOY_CONF_ROOT,
|
|
490
|
+
DEPLOY_MANIFEST_INDENT,
|
|
491
|
+
STAGED_CLI_PACKAGE,
|
|
492
|
+
buildDeployPackageJson,
|
|
493
|
+
buildProductPackageJson,
|
|
494
|
+
deployDependencySpecsFactory,
|
|
495
|
+
deployPackageNameFactory,
|
|
496
|
+
deployPackagePathFactory,
|
|
497
|
+
deployStartScriptFactory,
|
|
498
|
+
installDeployDependencies,
|
|
499
|
+
packageRepositoryFactory,
|
|
500
|
+
productDevDependenciesFactory,
|
|
501
|
+
productPackageOptionsFactory,
|
|
502
|
+
publishedProductPackageJson,
|
|
503
|
+
renamePackage,
|
|
504
|
+
setPackageRepository,
|
|
505
|
+
stageCliPackage,
|
|
506
|
+
stagePackageArchive,
|
|
507
|
+
syncDeployPackages,
|
|
508
|
+
};
|