@underpostnet/cyberia 3.3.0 → 3.3.73
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.dockerignore +1 -0
- package/.github/workflows/coverall.cyberia.ci.yml +34 -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/pwa-microservices-template-test.ci.yml +2 -2
- package/.github/workflows/release.cd.yml +1 -0
- package/.prettierignore +1 -0
- package/AGENTS.md +47 -0
- package/CHANGELOG.md +565 -2510
- package/CLI-HELP.md +306 -147
- package/Dockerfile +25 -9
- package/Dockerfile.dev +25 -9
- package/Dockerfile.test +4 -4
- package/README.md +21 -1
- package/bin/build.js +66 -41
- package/bin/build.template.js +8 -3
- package/bin/cyberia.js +308 -91
- package/bin/deploy.js +18 -104
- package/bin/index.js +308 -91
- package/conf.js +91 -4
- package/deploy/cyberia-client/deploy.sh +47 -0
- package/deploy/cyberia-client/package.sh +18 -0
- package/deploy/cyberia-client/state.sh +14 -0
- package/deploy/cyberia-server/deploy.sh +47 -0
- package/deploy/cyberia-server/package.sh +18 -0
- package/deploy/cyberia-server/state.sh +14 -0
- package/deploy/dd-cyberia/deploy.sh +6 -26
- package/deploy/dd-cyberia/init.sh +35 -43
- package/deploy/dd-cyberia/package.sh +17 -0
- package/deploy/dd-cyberia/state.sh +14 -0
- package/deploy/dd-cyberia/sync-deploy.sh +92 -170
- package/deploy/lib/github-actions-logging.sh +594 -0
- package/deploy/lib/host.sh +185 -0
- package/deploy/lib/state.sh +62 -0
- package/deploy/pwa-microservices-template/deploy.sh +12 -39
- package/deploy/release/deploy.sh +9 -39
- package/deployment.yaml +7 -2
- package/docker-compose.yml +7 -7
- 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/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 +83 -10
- 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 +3 -3
- package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.controller.js +1 -1
- package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.router.js +2 -2
- package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.service.js +2 -2
- 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 +1 -1
- package/src/api/cyberia-action/cyberia-action.service.js +2 -2
- package/src/api/cyberia-client-hints/cyberia-client-hints.controller.js +1 -1
- package/src/api/cyberia-client-hints/cyberia-client-hints.router.js +1 -1
- package/src/api/cyberia-client-hints/cyberia-client-hints.service.js +2 -2
- package/src/api/cyberia-dialogue/cyberia-dialogue.controller.js +1 -1
- package/src/api/cyberia-dialogue/cyberia-dialogue.router.js +1 -1
- 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.router.js +1 -1
- package/src/api/cyberia-entity/cyberia-entity.service.js +2 -2
- package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.controller.js +1 -1
- package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.router.js +1 -1
- package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.service.js +2 -2
- package/src/api/cyberia-instance/cyberia-fallback-capture.js +466 -0
- package/src/api/cyberia-instance/cyberia-fallback-world.js +8 -0
- package/src/api/cyberia-instance/cyberia-instance-map.service.js +1 -1
- package/src/api/cyberia-instance/cyberia-instance.controller.js +1 -1
- package/src/api/cyberia-instance/cyberia-instance.router.js +2 -2
- package/src/api/cyberia-instance/cyberia-instance.service.js +2 -2
- package/src/api/cyberia-instance-conf/cyberia-instance-conf.controller.js +1 -1
- package/src/api/cyberia-instance-conf/cyberia-instance-conf.router.js +1 -1
- package/src/api/cyberia-instance-conf/cyberia-instance-conf.service.js +2 -2
- 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 +2 -2
- package/src/api/cyberia-quest/cyberia-quest.controller.js +1 -1
- package/src/api/cyberia-quest/cyberia-quest.router.js +1 -1
- package/src/api/cyberia-quest/cyberia-quest.service.js +2 -2
- package/src/api/cyberia-quest-progress/cyberia-quest-progress.controller.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 +0 -26
- package/src/api/cyberia-skill/cyberia-skill.controller.js +1 -1
- 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.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.router.js +2 -2
- package/src/api/object-layer/object-layer.service.js +3 -3
- 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 +391 -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 +184 -82
- package/src/cli/db.js +120 -68
- package/src/cli/deploy.js +153 -71
- 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.js +3 -3
- package/src/cli/host.js +672 -0
- package/src/cli/image.js +4 -6
- package/src/cli/index.js +322 -142
- 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 +558 -363
- package/src/cli/run.js +331 -650
- 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 +199 -125
- package/src/cli/vultr.js +61 -21
- package/src/cli/wireguard.js +1111 -306
- package/src/client/components/core/CalendarCore.js +53 -96
- package/src/client/components/core/Docs.js +258 -211
- package/src/client/components/core/FileExplorer.js +0 -21
- 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-portal/AppShellCyberiaPortal.js +2 -1
- package/src/client/components/cyberia-portal/SettingsCyberiaPortal.js +2 -2
- 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/CYBERIA-CLI.md +32 -5
- package/src/client/public/cyberia-docs/CYBERIA.md +21 -1
- 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/WHITE-PAPER.md +1 -1
- 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/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 +61 -46
- package/src/client-builder/client-build-live.js +2 -2
- package/src/client-builder/client-build.js +38 -30
- 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/MongooseDB.js +7 -8
- package/src/{server/valkey.js → db/valkey/Valkey.js} +5 -4
- package/src/grpc/cyberia/grpc-server.js +1 -1
- 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 +1 -1
- package/src/projects/cyberia/besu-genesis-generator.js +3 -3
- package/src/projects/cyberia/catalog-cyberia.js +53 -10
- package/src/projects/cyberia/gemini-client.js +1 -1
- package/src/projects/cyberia/generate-saga.js +1 -1
- package/src/projects/cyberia/hot-reload-trigger.js +1 -1
- package/src/projects/cyberia/instance-data.js +1 -1
- package/src/projects/cyberia/ipfs-client.js +4 -4
- package/src/projects/cyberia/map-preview-generator.js +1 -1
- package/src/projects/cyberia/object-layer.js +1 -1
- package/src/projects/cyberia/semantic-layer-generator.js +1 -1
- package/src/projects/underpost/catalog-underpost.js +9 -1
- package/src/proxy.js +4 -7
- package/src/runtime/cyberia-client/Dockerfile +9 -4
- package/src/runtime/cyberia-client/Dockerfile.dev +8 -2
- package/src/runtime/cyberia-server/Dockerfile +9 -4
- package/src/runtime/cyberia-server/Dockerfile.dev +8 -2
- package/src/runtime/engine-cyberia/Dockerfile +25 -9
- package/src/runtime/engine-cyberia/Dockerfile.dev +25 -9
- package/src/runtime/engine-cyberia/Dockerfile.test +4 -4
- package/src/runtime/engine-cyberia/docker-compose.yml +7 -7
- 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 +117 -0
- package/src/server/build/execution.js +402 -0
- package/src/server/build/package.js +465 -0
- package/src/server/build/testing.js +528 -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} +3 -3
- 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} +108 -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} +513 -422
- 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} +1 -1
- package/src/server/{downloader.js → storage/downloader.js} +2 -2
- package/src/server/storage/repository.js +68 -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/cyberia-cli-plain-reads.test.js +30 -0
- package/test/{cyberia-instance-conf-defaults.test.js → integration/app/cyberia/cyberia-instance-conf-defaults.test.js} +1 -1
- package/test/integration/app/cyberia/cyberia-load.test.js +467 -0
- package/test/integration/app/cyberia/fallback-world-capture.test.js +253 -0
- package/test/integration/app/cyberia/object-layer-item-id.test.js +327 -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 +1163 -0
- package/test/{wireguard-edge.test.js → integration/infra/2-network/wireguard-edge.test.js} +609 -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/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 +334 -0
- package/test/unit/conf-loading.test.js +303 -0
- package/test/unit/conf-resolution.test.js +979 -0
- package/test/unit/coverage-artifact.test.js +130 -0
- package/test/{crypto.test.js → unit/crypto.test.js} +1 -1
- package/test/unit/deploy-env-resolution.test.js +38 -0
- package/test/unit/deploy-log-table.test.js +447 -0
- package/test/unit/execution-profiles.test.js +219 -0
- package/test/unit/fleet-sync-source.test.js +149 -0
- package/test/unit/logger-redaction.test.js +112 -0
- package/test/unit/package.test.js +403 -0
- package/test/unit/prepare-host.test.js +299 -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 +193 -0
- package/vitest.config.js +58 -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/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/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/environment.js +0 -98
package/src/client/sw/core.sw.js
CHANGED
|
@@ -15,6 +15,12 @@ const CACHE_PREFIX = payload.CACHE_PREFIX || 'engine-core';
|
|
|
15
15
|
const PRE_CACHED_RESOURCES = Array.isArray(payload.PRE_CACHED_RESOURCES) ? payload.PRE_CACHED_RESOURCES : [];
|
|
16
16
|
const OFFLINE_URL = payload.OFFLINE_URL || '/offline/index.html';
|
|
17
17
|
const MAINTENANCE_URL = payload.MAINTENANCE_URL || '/maintenance/index.html';
|
|
18
|
+
const PROXY_ROOT = payload.PROXY_PATH && payload.PROXY_PATH !== '/' ? payload.PROXY_PATH.replace(/\/$/, '') : '';
|
|
19
|
+
const isDocumentationPath = (pathname) =>
|
|
20
|
+
[`${PROXY_ROOT}/docs`, `${PROXY_ROOT}/api-docs`].some(
|
|
21
|
+
(prefix) => pathname === prefix || pathname.startsWith(`${prefix}/`),
|
|
22
|
+
);
|
|
23
|
+
const isDistributionPath = (pathname) => pathname.startsWith(`${PROXY_ROOT}/dist/`);
|
|
18
24
|
|
|
19
25
|
// Dedicated cache for fallback pages so they're available even if precacheAndRoute
|
|
20
26
|
// fails (e.g. a precache manifest entry returns non-200 during install).
|
|
@@ -34,7 +40,7 @@ const inlineFallback = (kind) => {
|
|
|
34
40
|
const msg =
|
|
35
41
|
kind === 'offline'
|
|
36
42
|
? 'You are offline. Please check your internet connection and try again.'
|
|
37
|
-
:
|
|
43
|
+
: "The server is under maintenance. We'll be back shortly.";
|
|
38
44
|
const html = `<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1,viewport-fit=cover"><title>${title}</title><style>body{display:flex;flex-direction:column;align-items:center;justify-content:center;min-height:100vh;margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif;background:#f5f5f5;color:#333;padding:1rem;text-align:center}h1{font-size:2rem;margin-bottom:.5rem}p{font-size:1rem;color:#666;max-width:24rem}</style></head><body><h1>${icon} ${title}</h1><p>${msg}</p></body></html>`;
|
|
39
45
|
return new Response(html, {
|
|
40
46
|
status: 200,
|
|
@@ -74,17 +80,17 @@ const getFallback = async (kind) => {
|
|
|
74
80
|
try {
|
|
75
81
|
const fetchResp = await fetch(primary, { credentials: 'same-origin' });
|
|
76
82
|
if (fetchResp.ok) {
|
|
77
|
-
cache.put(primary, fetchResp.clone()).catch(() => {
|
|
83
|
+
cache.put(primary, fetchResp.clone()).catch(() => {});
|
|
78
84
|
return fetchResp;
|
|
79
85
|
}
|
|
80
|
-
} catch (_) {
|
|
86
|
+
} catch (_) {}
|
|
81
87
|
try {
|
|
82
88
|
const fetchResp = await fetch(secondary, { credentials: 'same-origin' });
|
|
83
89
|
if (fetchResp.ok) {
|
|
84
|
-
cache.put(secondary, fetchResp.clone()).catch(() => {
|
|
90
|
+
cache.put(secondary, fetchResp.clone()).catch(() => {});
|
|
85
91
|
return fetchResp;
|
|
86
92
|
}
|
|
87
|
-
} catch (_) {
|
|
93
|
+
} catch (_) {}
|
|
88
94
|
}
|
|
89
95
|
|
|
90
96
|
// ── 3. Ultimate inline fallback ────────────────────────────────────────
|
|
@@ -160,6 +166,8 @@ registerRoute(
|
|
|
160
166
|
({ request, url }) =>
|
|
161
167
|
request.method === 'GET' &&
|
|
162
168
|
url.origin === self.location.origin &&
|
|
169
|
+
!isDocumentationPath(url.pathname) &&
|
|
170
|
+
!isDistributionPath(url.pathname) &&
|
|
163
171
|
['style', 'script', 'font', 'image'].includes(request.destination),
|
|
164
172
|
new StaleWhileRevalidate({
|
|
165
173
|
cacheName: `${CACHE_PREFIX}-assets`,
|
|
@@ -212,7 +220,7 @@ registerRoute(
|
|
|
212
220
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
213
221
|
|
|
214
222
|
registerRoute(
|
|
215
|
-
({ request }) => request.mode === 'navigate',
|
|
223
|
+
({ request, url }) => request.mode === 'navigate' && !isDocumentationPath(url.pathname),
|
|
216
224
|
async ({ event }) => {
|
|
217
225
|
// ── 1. Check browser offline state ────────────────────────────────────
|
|
218
226
|
if (typeof navigator !== 'undefined' && navigator.onLine === false) {
|
|
@@ -225,7 +233,7 @@ registerRoute(
|
|
|
225
233
|
if (preload && preload.status < 500) {
|
|
226
234
|
// Fire-and-forget: eagerly cache fallback pages in the background
|
|
227
235
|
// after a successful navigation so they're available when offline.
|
|
228
|
-
cacheFallbackPages().catch(() => {
|
|
236
|
+
cacheFallbackPages().catch(() => {});
|
|
229
237
|
return preload;
|
|
230
238
|
}
|
|
231
239
|
} catch (_) {
|
|
@@ -243,18 +251,17 @@ registerRoute(
|
|
|
243
251
|
if (response.ok) {
|
|
244
252
|
// Cache the successful response for future navigations
|
|
245
253
|
const cache = await caches.open(`${CACHE_PREFIX}-pages`);
|
|
246
|
-
cache.put(event.request, response.clone()).catch(() => {
|
|
254
|
+
cache.put(event.request, response.clone()).catch(() => {});
|
|
247
255
|
|
|
248
256
|
// Eagerly cache fallback pages in the background
|
|
249
|
-
cacheFallbackPages().catch(() => {
|
|
257
|
+
cacheFallbackPages().catch(() => {});
|
|
250
258
|
|
|
251
259
|
return response;
|
|
252
260
|
}
|
|
253
261
|
|
|
254
262
|
return response;
|
|
255
263
|
} catch (_) {
|
|
256
|
-
const reallyOffline =
|
|
257
|
-
typeof navigator !== 'undefined' && navigator.onLine === false;
|
|
264
|
+
const reallyOffline = typeof navigator !== 'undefined' && navigator.onLine === false;
|
|
258
265
|
return getFallback(reallyOffline ? 'offline' : 'maintenance');
|
|
259
266
|
}
|
|
260
267
|
},
|
|
@@ -263,12 +270,11 @@ registerRoute(
|
|
|
263
270
|
// ─── Global catch handler (non-navigation failures) ──────────────────────────
|
|
264
271
|
setCatchHandler(async ({ request }) => {
|
|
265
272
|
if (request.mode === 'navigate') {
|
|
266
|
-
const reallyOffline =
|
|
267
|
-
typeof navigator !== 'undefined' && navigator.onLine === false;
|
|
273
|
+
const reallyOffline = typeof navigator !== 'undefined' && navigator.onLine === false;
|
|
268
274
|
return getFallback(reallyOffline ? 'offline' : 'maintenance');
|
|
269
275
|
}
|
|
270
276
|
return new Response(JSON.stringify({ status: 'error', message: 'request failed' }), {
|
|
271
277
|
status: 503,
|
|
272
278
|
headers: { 'Content-Type': 'application/json' },
|
|
273
279
|
});
|
|
274
|
-
});
|
|
280
|
+
});
|
|
@@ -7,8 +7,13 @@
|
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
9
|
import fs from 'fs-extra';
|
|
10
|
-
import { shellExec } from '../server/process.js';
|
|
11
|
-
import { loggerFactory } from '../server/logger.js';
|
|
10
|
+
import { shellExec } from '../server/runtime/process.js';
|
|
11
|
+
import { loggerFactory } from '../server/ops/logger.js';
|
|
12
|
+
import {
|
|
13
|
+
coverageReportCandidates,
|
|
14
|
+
coverageUnavailablePage,
|
|
15
|
+
resolveCoverageReportPath,
|
|
16
|
+
} from '../server/build/coverage.js';
|
|
12
17
|
import { JSONweb } from './client-formatted.js';
|
|
13
18
|
import { ssrFactory } from './ssr.js';
|
|
14
19
|
|
|
@@ -20,6 +25,8 @@ import { ssrFactory } from './ssr.js';
|
|
|
20
25
|
* @param {string} options.host - The hostname for the API
|
|
21
26
|
* @param {string} options.path - The base path for the API
|
|
22
27
|
* @param {number} options.port - The port number for the API
|
|
28
|
+
* @param {string} [options.apiBaseHost] - Host serving the API when it is split from the client
|
|
29
|
+
* @param {string} [options.apiBaseProxyPath] - Proxy path of the API runtime when it is split from the client
|
|
23
30
|
* @param {Object} options.metadata - Metadata for the API documentation
|
|
24
31
|
* @param {Array<string>} options.apis - List of API modules to document
|
|
25
32
|
* @param {string} options.publicClientId - Client ID for the public documentation
|
|
@@ -30,6 +37,8 @@ const buildApiDocs = async ({
|
|
|
30
37
|
host,
|
|
31
38
|
path,
|
|
32
39
|
port,
|
|
40
|
+
apiBaseHost,
|
|
41
|
+
apiBaseProxyPath,
|
|
33
42
|
metadata = {},
|
|
34
43
|
apis = [],
|
|
35
44
|
publicClientId,
|
|
@@ -37,7 +46,10 @@ const buildApiDocs = async ({
|
|
|
37
46
|
packageData,
|
|
38
47
|
}) => {
|
|
39
48
|
const logger = loggerFactory(import.meta);
|
|
40
|
-
|
|
49
|
+
// The spec is rendered by the client instance but exercised against the API runtime;
|
|
50
|
+
// when the two are split the server url must follow the API, not the docs page.
|
|
51
|
+
const apiPath = apiBaseProxyPath ? apiBaseProxyPath : path;
|
|
52
|
+
const basePath = apiPath === '/' ? `${process.env.BASE_API}` : `/${process.env.BASE_API}`;
|
|
41
53
|
|
|
42
54
|
const doc = {
|
|
43
55
|
info: {
|
|
@@ -49,8 +61,8 @@ const buildApiDocs = async ({
|
|
|
49
61
|
{
|
|
50
62
|
url:
|
|
51
63
|
process.env.NODE_ENV === 'development'
|
|
52
|
-
? `http
|
|
53
|
-
: `https://${host}${
|
|
64
|
+
? `http://${apiBaseHost ? apiBaseHost : `localhost:${port}`}${apiPath}${basePath}`
|
|
65
|
+
: `https://${apiBaseHost ? apiBaseHost : host}${apiPath}${basePath}`,
|
|
54
66
|
description: `${process.env.NODE_ENV} server`,
|
|
55
67
|
},
|
|
56
68
|
],
|
|
@@ -371,63 +383,60 @@ const buildJsDocs = async ({ host, path, metadata = {}, publicClientId, docs, do
|
|
|
371
383
|
fs.writeFileSync(tmpConfigPath, JSON.stringify(runtimeConfig, null, 2), 'utf8');
|
|
372
384
|
logger.warn('build typedoc view', docsDestination);
|
|
373
385
|
|
|
374
|
-
|
|
386
|
+
// Non-fatal like every other docs surface: a typedoc failure leaves the reference site
|
|
387
|
+
// unpublished, it does not take a rollout down with it.
|
|
388
|
+
const result = shellExec(`node_modules/.bin/typedoc --options ${tmpConfigPath}`, {
|
|
389
|
+
silent: true,
|
|
390
|
+
silentOnError: true,
|
|
391
|
+
});
|
|
375
392
|
|
|
376
393
|
fs.removeSync(tmpConfigPath);
|
|
394
|
+
|
|
395
|
+
if (fs.existsSync(`${docsDestination}index.html`)) return;
|
|
396
|
+
logger.warn('typedoc produced no HTML index', {
|
|
397
|
+
docsDestination,
|
|
398
|
+
code: result?.code,
|
|
399
|
+
stderr: `${result?.stderr ?? ''}`.trim().split('\n').slice(-1)[0],
|
|
400
|
+
});
|
|
377
401
|
};
|
|
378
402
|
|
|
379
403
|
/**
|
|
380
|
-
*
|
|
404
|
+
* Publishes the coverage HTML report a build carried into the docs route.
|
|
405
|
+
*
|
|
406
|
+
* Never generates it: the report belongs to the test stage, which bundles it into the
|
|
407
|
+
* deploy artifact (see {@link module:src/server/build/coverage.js}). A client build that
|
|
408
|
+
* shelled out to `npm test` here spent minutes of a pod's build phase on a runner the
|
|
409
|
+
* workload has no business holding, and every expected non-zero exit of that suite latched
|
|
410
|
+
* `container-status=error`, failing the deployment monitor on a healthy rollout.
|
|
381
411
|
* @function buildCoverage
|
|
382
412
|
* @memberof clientBuildDocs
|
|
383
413
|
* @param {Object} options - Coverage build options
|
|
384
414
|
* @param {Object} options.docs - Documentation config from server conf
|
|
385
|
-
* @param {string} options.docs.coveragePath -
|
|
415
|
+
* @param {string} options.docs.coveragePath - Source tree root the report was bundled into
|
|
416
|
+
* @param {string} [options.docs.coverageOutputDir] - Route directory under the docs path
|
|
386
417
|
* @param {string} options.docsDestination - Resolved output path where docs were built
|
|
387
418
|
*/
|
|
388
419
|
const buildCoverage = async ({ docs, docsDestination }) => {
|
|
389
420
|
const logger = loggerFactory(import.meta);
|
|
390
421
|
const { coveragePath, coverageOutputDir = 'coverage' } = docs;
|
|
422
|
+
// No configured source tree is a deploy that never declared coverage — not a missing report.
|
|
423
|
+
if (!coveragePath) return;
|
|
391
424
|
|
|
392
|
-
const
|
|
393
|
-
|
|
394
|
-
const pkgPath = `${coveragePath}/package.json`;
|
|
395
|
-
if (fs.existsSync(pkgPath)) {
|
|
396
|
-
const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8'));
|
|
397
|
-
if (pkg.scripts && pkg.scripts.coverage) {
|
|
398
|
-
logger.info('generating coverage report', coveragePath);
|
|
399
|
-
try {
|
|
400
|
-
await shellExec(`cd ${coveragePath} && npm run coverage`, { silent: true });
|
|
401
|
-
} catch (err) {
|
|
402
|
-
logger.warn('coverage generation failed (non-fatal), skipping:', err.message);
|
|
403
|
-
return;
|
|
404
|
-
}
|
|
405
|
-
} else if (pkg.scripts && pkg.scripts.test) {
|
|
406
|
-
logger.info('generating coverage via test', coveragePath);
|
|
407
|
-
try {
|
|
408
|
-
await shellExec(`cd ${coveragePath} && npm test`, { silent: true, silentOnError: true });
|
|
409
|
-
} catch (err) {
|
|
410
|
-
logger.warn('coverage generation failed (non-fatal), skipping:', err.message);
|
|
411
|
-
return;
|
|
412
|
-
}
|
|
413
|
-
}
|
|
414
|
-
}
|
|
415
|
-
}
|
|
425
|
+
const coverageBuildPath = `${docsDestination}${coverageOutputDir}`;
|
|
426
|
+
const reportPath = resolveCoverageReportPath(coveragePath);
|
|
416
427
|
|
|
417
|
-
if (
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
} else {
|
|
425
|
-
fs.copySync(coverageOutputPath, coverageBuildPath);
|
|
426
|
-
}
|
|
427
|
-
logger.warn('build coverage', coverageBuildPath);
|
|
428
|
-
} else {
|
|
429
|
-
logger.warn('no coverage output found, skipping', coverageOutputPath);
|
|
428
|
+
if (!reportPath) {
|
|
429
|
+
fs.outputFileSync(`${coverageBuildPath}/index.html`, coverageUnavailablePage(), 'utf8');
|
|
430
|
+
logger.warn('no coverage report bundled, publishing the unavailable page', {
|
|
431
|
+
searched: coverageReportCandidates(coveragePath),
|
|
432
|
+
published: coverageBuildPath,
|
|
433
|
+
});
|
|
434
|
+
return;
|
|
430
435
|
}
|
|
436
|
+
|
|
437
|
+
fs.emptyDirSync(coverageBuildPath);
|
|
438
|
+
fs.copySync(reportPath, coverageBuildPath);
|
|
439
|
+
logger.warn('build coverage', coverageBuildPath);
|
|
431
440
|
};
|
|
432
441
|
|
|
433
442
|
/**
|
|
@@ -438,6 +447,8 @@ const buildCoverage = async ({ docs, docsDestination }) => {
|
|
|
438
447
|
* @param {string} options.host - The hostname
|
|
439
448
|
* @param {string} options.path - The base path
|
|
440
449
|
* @param {number} options.port - The port number
|
|
450
|
+
* @param {string} [options.apiBaseHost] - Host serving the API when it is split from the client
|
|
451
|
+
* @param {string} [options.apiBaseProxyPath] - Proxy path of the API runtime when it is split from the client
|
|
441
452
|
* @param {Object} options.metadata - Metadata for the documentation
|
|
442
453
|
* @param {Array<string>} options.apis - List of API modules to document
|
|
443
454
|
* @param {string} options.publicClientId - Client ID for the public documentation
|
|
@@ -449,6 +460,8 @@ const buildDocs = async ({
|
|
|
449
460
|
host,
|
|
450
461
|
path,
|
|
451
462
|
port,
|
|
463
|
+
apiBaseHost,
|
|
464
|
+
apiBaseProxyPath,
|
|
452
465
|
metadata = {},
|
|
453
466
|
apis = [],
|
|
454
467
|
publicClientId,
|
|
@@ -468,6 +481,8 @@ const buildDocs = async ({
|
|
|
468
481
|
host,
|
|
469
482
|
path,
|
|
470
483
|
port,
|
|
484
|
+
apiBaseHost,
|
|
485
|
+
apiBaseProxyPath,
|
|
471
486
|
metadata,
|
|
472
487
|
apis,
|
|
473
488
|
publicClientId,
|
|
@@ -490,4 +505,4 @@ const buildSwaggerUiOptions = async () => {
|
|
|
490
505
|
return { customCss: css, customJsStr: js };
|
|
491
506
|
};
|
|
492
507
|
|
|
493
|
-
export { buildDocs, buildSwaggerUiOptions };
|
|
508
|
+
export { buildCoverage, buildDocs, buildSwaggerUiOptions };
|
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
7
|
import fs from 'fs-extra';
|
|
8
|
-
import { Config, loadConf, readConfJson } from '../server/conf.js';
|
|
9
|
-
import { loggerFactory } from '../server/logger.js';
|
|
8
|
+
import { Config, loadConf, readConfJson } from '../server/runtime/conf.js';
|
|
9
|
+
import { loggerFactory } from '../server/ops/logger.js';
|
|
10
10
|
import { buildClient } from './client-build.js';
|
|
11
11
|
|
|
12
12
|
const logger = loggerFactory(import.meta);
|
|
@@ -8,22 +8,23 @@
|
|
|
8
8
|
|
|
9
9
|
import fs from 'fs-extra';
|
|
10
10
|
import { transformClientJs, JSONweb } from './client-formatted.js';
|
|
11
|
-
import { loggerFactory } from '../server/logger.js';
|
|
11
|
+
import { loggerFactory } from '../server/ops/logger.js';
|
|
12
12
|
import {
|
|
13
13
|
getCapVariableName,
|
|
14
14
|
newInstance,
|
|
15
15
|
orderArrayFromAttrInt,
|
|
16
16
|
uniqueArray,
|
|
17
17
|
} from '../client/components/core/CommonJs.js';
|
|
18
|
-
import { readConfJson } from '../server/conf.js';
|
|
18
|
+
import { readConfJson } from '../server/runtime/conf.js';
|
|
19
19
|
import { minify } from 'html-minifier-terser';
|
|
20
20
|
import AdmZip from 'adm-zip';
|
|
21
21
|
import * as dir from 'path';
|
|
22
|
-
import { shellExec } from '../server/process.js';
|
|
22
|
+
import { shellExec } from '../server/runtime/process.js';
|
|
23
23
|
import { SitemapStream, streamToPromise } from 'sitemap';
|
|
24
24
|
import { Readable } from 'stream';
|
|
25
25
|
import { buildIcons } from './client-icons.js';
|
|
26
|
-
import { statusPageBuildSegment } from '../server/underpost-gateway.js';
|
|
26
|
+
import { statusPageBuildSegment } from '../server/network/underpost-gateway.js';
|
|
27
|
+
import { repositoryIdentityFactory } from '../server/storage/repository.js';
|
|
27
28
|
import Underpost from '../index.js';
|
|
28
29
|
import { buildDocs } from './client-build-docs.js';
|
|
29
30
|
import { ssrFactory } from './ssr.js';
|
|
@@ -533,6 +534,7 @@ const defaultSitemapXsl = `<?xml version="1.0" encoding="UTF-8"?>
|
|
|
533
534
|
const buildClient = async (
|
|
534
535
|
options = {
|
|
535
536
|
deployId: '',
|
|
537
|
+
subConf: '',
|
|
536
538
|
liveClientBuildPaths: [],
|
|
537
539
|
instances: [],
|
|
538
540
|
buildZip: false,
|
|
@@ -543,9 +545,13 @@ const buildClient = async (
|
|
|
543
545
|
) => {
|
|
544
546
|
const logger = loggerFactory(import.meta);
|
|
545
547
|
const deployId = options.deployId || process.env.DEPLOY_ID;
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
548
|
+
// Carried as an argument rather than re-derived from DEPLOY_SUB_CONF: the caller already
|
|
549
|
+
// resolved which sub-configuration this build is for, and a build that reads a different
|
|
550
|
+
// conf.server than the one its caller loaded renders the wrong set of hosts.
|
|
551
|
+
const subConf = `${options.subConf ?? ''}`.trim();
|
|
552
|
+
const confClient = readConfJson(deployId, 'client', { subConf });
|
|
553
|
+
const confServer = readConfJson(deployId, 'server', { subConf, loadReplicas: true });
|
|
554
|
+
const confSSR = readConfJson(deployId, 'ssr', { subConf });
|
|
549
555
|
const packageData = JSON.parse(fs.readFileSync(`./package.json`, 'utf8'));
|
|
550
556
|
const acmeChallengePath = `/.well-known/acme-challenge`;
|
|
551
557
|
const publicPath = `./public`;
|
|
@@ -689,6 +695,18 @@ const buildClient = async (
|
|
|
689
695
|
// ''; // process.env.NODE_ENV === 'production' ? `https://${host}` : ``;
|
|
690
696
|
currentPort++;
|
|
691
697
|
|
|
698
|
+
// Every document this instance emits carries the same payload; the SSR
|
|
699
|
+
// views and the client index must never disagree about which repository
|
|
700
|
+
// published them.
|
|
701
|
+
const renderPayload = {
|
|
702
|
+
apiBaseProxyPath,
|
|
703
|
+
apiBaseHost,
|
|
704
|
+
apiBasePath: process.env.BASE_API,
|
|
705
|
+
version: Underpost.version,
|
|
706
|
+
repository: repositoryIdentityFactory(),
|
|
707
|
+
...(isDevelopment ? { dev: true } : undefined),
|
|
708
|
+
};
|
|
709
|
+
|
|
692
710
|
const acmeChallengeFullPath = directory
|
|
693
711
|
? `${directory}${acmeChallengePath}`
|
|
694
712
|
: `${publicPath}/${host}${acmeChallengePath}`;
|
|
@@ -854,7 +872,7 @@ const buildClient = async (
|
|
|
854
872
|
confSSR[view.ssr].head.unshift('Production');
|
|
855
873
|
|
|
856
874
|
for (const ssrHeadComponent of confSSR[view.ssr].head) {
|
|
857
|
-
const
|
|
875
|
+
const SSRComponent = await ssrFactory(`./src/client/ssr/head/${ssrHeadComponent}.js`);
|
|
858
876
|
|
|
859
877
|
switch (ssrHeadComponent) {
|
|
860
878
|
case 'Pwa':
|
|
@@ -909,11 +927,11 @@ const buildClient = async (
|
|
|
909
927
|
// ],
|
|
910
928
|
// "prefer_related_applications": true
|
|
911
929
|
}
|
|
912
|
-
if (validPwaBuild) ssrHeadComponents +=
|
|
930
|
+
if (validPwaBuild) ssrHeadComponents += SSRComponent({ title, ssrPath, canonicalURL, ...metadata });
|
|
913
931
|
break;
|
|
914
932
|
case 'Seo':
|
|
915
933
|
if (metadata) {
|
|
916
|
-
ssrHeadComponents +=
|
|
934
|
+
ssrHeadComponents += SSRComponent({ title, ssrPath, canonicalURL, ...metadata });
|
|
917
935
|
}
|
|
918
936
|
break;
|
|
919
937
|
case 'Microdata':
|
|
@@ -925,18 +943,18 @@ const buildClient = async (
|
|
|
925
943
|
const microdata = JSON.parse(
|
|
926
944
|
fs.readFileSync(`./src/client/public/${publicClientId}/microdata.json`, 'utf8'),
|
|
927
945
|
);
|
|
928
|
-
ssrHeadComponents +=
|
|
946
|
+
ssrHeadComponents += SSRComponent({ microdata });
|
|
929
947
|
}
|
|
930
948
|
break;
|
|
931
949
|
default:
|
|
932
|
-
ssrHeadComponents +=
|
|
950
|
+
ssrHeadComponents += SSRComponent({ ssrPath, host, path });
|
|
933
951
|
break;
|
|
934
952
|
}
|
|
935
953
|
}
|
|
936
954
|
|
|
937
955
|
for (const ssrBodyComponent of confSSR[view.ssr].body) {
|
|
938
|
-
const
|
|
939
|
-
ssrBodyComponents +=
|
|
956
|
+
const SSRComponent = await ssrFactory(`./src/client/ssr/body/${ssrBodyComponent}.js`);
|
|
957
|
+
ssrBodyComponents += SSRComponent({
|
|
940
958
|
...metadata,
|
|
941
959
|
ssrPath,
|
|
942
960
|
host,
|
|
@@ -962,13 +980,7 @@ const buildClient = async (
|
|
|
962
980
|
ssrPath,
|
|
963
981
|
ssrHeadComponents,
|
|
964
982
|
ssrBodyComponents,
|
|
965
|
-
renderPayload
|
|
966
|
-
apiBaseProxyPath,
|
|
967
|
-
apiBaseHost,
|
|
968
|
-
apiBasePath: process.env.BASE_API,
|
|
969
|
-
version: Underpost.version,
|
|
970
|
-
...(isDevelopment ? { dev: true } : undefined),
|
|
971
|
-
},
|
|
983
|
+
renderPayload,
|
|
972
984
|
renderApi: {
|
|
973
985
|
JSONweb,
|
|
974
986
|
},
|
|
@@ -1031,6 +1043,8 @@ Sitemap: ${sitemapBaseUrl}/sitemap.xml`,
|
|
|
1031
1043
|
host,
|
|
1032
1044
|
path,
|
|
1033
1045
|
port,
|
|
1046
|
+
apiBaseHost,
|
|
1047
|
+
apiBaseProxyPath,
|
|
1034
1048
|
metadata,
|
|
1035
1049
|
apis,
|
|
1036
1050
|
publicClientId,
|
|
@@ -1064,13 +1078,7 @@ Sitemap: ${sitemapBaseUrl}/sitemap.xml`,
|
|
|
1064
1078
|
ssrPath,
|
|
1065
1079
|
ssrHeadComponents: '<base target="_top">',
|
|
1066
1080
|
ssrBodyComponents: SsrComponent(),
|
|
1067
|
-
renderPayload
|
|
1068
|
-
apiBaseProxyPath,
|
|
1069
|
-
apiBaseHost,
|
|
1070
|
-
apiBasePath: process.env.BASE_API,
|
|
1071
|
-
version: Underpost.version,
|
|
1072
|
-
...(isDevelopment ? { dev: true } : undefined),
|
|
1073
|
-
},
|
|
1081
|
+
renderPayload,
|
|
1074
1082
|
renderApi: { JSONweb },
|
|
1075
1083
|
});
|
|
1076
1084
|
|
|
@@ -1116,7 +1124,7 @@ Sitemap: ${sitemapBaseUrl}/sitemap.xml`,
|
|
|
1116
1124
|
|
|
1117
1125
|
if (swShouldRebuild) {
|
|
1118
1126
|
const cacheScope = path === '/' ? 'root' : path.replaceAll('/', '_');
|
|
1119
|
-
const
|
|
1127
|
+
const swRenderPayload = {
|
|
1120
1128
|
PRE_CACHED_RESOURCES: uniqueArray(PRE_CACHED_RESOURCES),
|
|
1121
1129
|
PROXY_PATH: path,
|
|
1122
1130
|
CACHE_PREFIX: `engine-core-${cacheScope}`,
|
|
@@ -1127,7 +1135,7 @@ Sitemap: ${sitemapBaseUrl}/sitemap.xml`,
|
|
|
1127
1135
|
// Single write: prepend the payload prelude to the transformed SW JS.
|
|
1128
1136
|
fs.writeFileSync(
|
|
1129
1137
|
swPublicPath,
|
|
1130
|
-
`self.renderPayload = ${JSONweb(
|
|
1138
|
+
`self.renderPayload = ${JSONweb(swRenderPayload)};
|
|
1131
1139
|
self.__WB_DISABLE_DEV_LOGS = true;
|
|
1132
1140
|
${swTransformedJs}`,
|
|
1133
1141
|
'utf8',
|
|
@@ -6,8 +6,8 @@
|
|
|
6
6
|
import fs from 'fs-extra';
|
|
7
7
|
import nodemon from 'nodemon';
|
|
8
8
|
import dotenv from 'dotenv';
|
|
9
|
-
import { shellExec } from '../server/process.js';
|
|
10
|
-
import { loggerFactory } from '../server/logger.js';
|
|
9
|
+
import { shellExec } from '../server/runtime/process.js';
|
|
10
|
+
import { loggerFactory } from '../server/ops/logger.js';
|
|
11
11
|
import Underpost from '../index.js';
|
|
12
12
|
|
|
13
13
|
const logger = loggerFactory(import.meta);
|
|
@@ -32,7 +32,7 @@ const createClientDevServer = async (
|
|
|
32
32
|
const devClientEnvPath = `./engine-private/conf/${deployId}/.env.${process.env.NODE_ENV}.${subConf}-dev-client`;
|
|
33
33
|
if (fs.existsSync(devClientEnvPath)) dotenv.config({ path: devClientEnvPath, override: true });
|
|
34
34
|
|
|
35
|
-
await Underpost.
|
|
35
|
+
await Underpost.client.callback(deployId, `${subConf}-dev-client`.trim(), host, path);
|
|
36
36
|
|
|
37
37
|
shellExec(`node src/server ${deployId} ${subConf}-dev-client`.trim(), {
|
|
38
38
|
async: true,
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* @namespace clientIcons
|
|
5
5
|
*/
|
|
6
6
|
import { favicons } from 'favicons';
|
|
7
|
-
import { loggerFactory } from '../server/logger.js';
|
|
7
|
+
import { loggerFactory } from '../server/ops/logger.js';
|
|
8
8
|
import fs from 'fs-extra';
|
|
9
9
|
import { getCapVariableName } from '../client/components/core/CommonJs.js';
|
|
10
10
|
|
|
@@ -99,7 +99,7 @@ const buildIcons = async ({
|
|
|
99
99
|
|
|
100
100
|
const ssrPath = `./src/client/ssr/head/Pwa${getCapVariableName(publicClientId)}.js`;
|
|
101
101
|
if (!fs.existsSync(ssrPath))
|
|
102
|
-
fs.writeFileSync(ssrPath, '
|
|
102
|
+
fs.writeFileSync(ssrPath, 'SSRComponent = () => html`' + response.html.join(`\n`) + '`;', 'utf8');
|
|
103
103
|
} catch (error) {
|
|
104
104
|
logger.error(error.message); // Error description e.g. "An unknown error has occurred"
|
|
105
105
|
}
|
|
@@ -10,7 +10,7 @@ import vm from 'node:vm';
|
|
|
10
10
|
import Underpost from '../index.js';
|
|
11
11
|
|
|
12
12
|
import { srcFormatted } from './client-formatted.js';
|
|
13
|
-
import { loggerFactory } from '../server/logger.js';
|
|
13
|
+
import { loggerFactory } from '../server/ops/logger.js';
|
|
14
14
|
|
|
15
15
|
const logger = loggerFactory(import.meta);
|
|
16
16
|
|
|
@@ -22,10 +22,10 @@ const logger = loggerFactory(import.meta);
|
|
|
22
22
|
* @memberof ServerSideRendering
|
|
23
23
|
*/
|
|
24
24
|
const ssrFactory = async (componentPath = `./src/client/ssr/RootDocument.js`) => {
|
|
25
|
-
const context = {
|
|
25
|
+
const context = { SSRComponent: () => {}, npm_package_version: Underpost.version };
|
|
26
26
|
vm.createContext(context);
|
|
27
27
|
vm.runInContext(await srcFormatted(fs.readFileSync(componentPath, 'utf8')), context);
|
|
28
|
-
return context.
|
|
28
|
+
return context.SSRComponent;
|
|
29
29
|
};
|
|
30
30
|
|
|
31
31
|
/**
|
package/src/client.build.js
CHANGED
|
@@ -1,11 +1,8 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
import { loggerFactory } from './server/logger.js';
|
|
7
|
-
import { Config } from './server/conf.js';
|
|
8
|
-
import { ProcessController } from './server/process.js';
|
|
3
|
+
import { loggerFactory } from './server/ops/logger.js';
|
|
4
|
+
import { Config } from './server/runtime/conf.js';
|
|
5
|
+
import { ProcessController } from './server/runtime/process.js';
|
|
9
6
|
import { clientLiveBuild } from './client-builder/client-build-live.js';
|
|
10
7
|
|
|
11
8
|
await Config.build();
|
package/src/client.dev.js
CHANGED
|
@@ -1,11 +1,8 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
import { loggerFactory } from './server/logger.js';
|
|
7
|
-
import { ProcessController } from './server/process.js';
|
|
8
|
-
import { Config, buildClientStaticConf } from './server/conf.js';
|
|
3
|
+
import { loggerFactory } from './server/ops/logger.js';
|
|
4
|
+
import { ProcessController } from './server/runtime/process.js';
|
|
5
|
+
import { Config, buildClientStaticConf } from './server/runtime/conf.js';
|
|
9
6
|
import { createClientDevServer } from './client-builder/client-dev-server.js';
|
|
10
7
|
|
|
11
8
|
const logger = loggerFactory(import.meta);
|