@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/cli/env.js
DELETED
|
@@ -1,177 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Environment module for managing the environment variables of the underpost root
|
|
3
|
-
* @module src/cli/env.js
|
|
4
|
-
* @namespace UnderpostEnv
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import { getNpmRootPath, writeEnv } from '../server/environment.js';
|
|
8
|
-
import fs from 'fs-extra';
|
|
9
|
-
import { loggerFactory } from '../server/logger.js';
|
|
10
|
-
import dotenv from 'dotenv';
|
|
11
|
-
import { pbcopy } from '../server/process.js';
|
|
12
|
-
|
|
13
|
-
const logger = loggerFactory(import.meta);
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* Guards an env file path against stale directory artifacts.
|
|
17
|
-
* Removes the path if it exists as a directory (e.g. `.env/` created by a previous EISDIR bug).
|
|
18
|
-
* @param {string} envPath - The path to the environment file.
|
|
19
|
-
* @memberof UnderpostEnv
|
|
20
|
-
*/
|
|
21
|
-
const guardEnvPath = (envPath) => {
|
|
22
|
-
if (fs.existsSync(envPath) && !fs.statSync(envPath).isFile()) {
|
|
23
|
-
logger.warn(`Removing stale directory at env path: ${envPath}`);
|
|
24
|
-
fs.removeSync(envPath);
|
|
25
|
-
}
|
|
26
|
-
};
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* @class UnderpostRootEnv
|
|
30
|
-
* @description Manages the environment variables of the underpost root.
|
|
31
|
-
* @memberof UnderpostEnv
|
|
32
|
-
*/
|
|
33
|
-
class UnderpostRootEnv {
|
|
34
|
-
static API = {
|
|
35
|
-
/**
|
|
36
|
-
* @method set
|
|
37
|
-
* @description Sets an environment variable in the underpost root environment.
|
|
38
|
-
* @param {string} key - The key of the environment variable to set.
|
|
39
|
-
* @param {string} value - The value of the environment variable to set.
|
|
40
|
-
* @param {object} options - Options for setting the environment variable.
|
|
41
|
-
* @param {string} [options.deployId=''] - Deployment ID associated with the environment variable.
|
|
42
|
-
* @param {boolean} [options.build=false] - If true, sets the environment variable using custom --deploy-id or all dd.router deploy ids configured.
|
|
43
|
-
* @memberof UnderpostEnv
|
|
44
|
-
*/
|
|
45
|
-
set(key, value, options = { deployId: '', build: false }) {
|
|
46
|
-
const _set = (envPath, key, value) => {
|
|
47
|
-
guardEnvPath(envPath);
|
|
48
|
-
let env = {};
|
|
49
|
-
if (fs.existsSync(envPath)) env = dotenv.parse(fs.readFileSync(envPath, 'utf8'));
|
|
50
|
-
env[key] = value;
|
|
51
|
-
writeEnv(envPath, env);
|
|
52
|
-
};
|
|
53
|
-
if (options.build) {
|
|
54
|
-
const deployIdList = options.deployId
|
|
55
|
-
? [options.deployId]
|
|
56
|
-
: fs.existsSync(`./engine-private/deploy/dd.router`)
|
|
57
|
-
? fs.readFileSync(`./engine-private/deploy/dd.router`, 'utf8').split(',')
|
|
58
|
-
: [DEFAULT_DEPLOY_ID];
|
|
59
|
-
for (const deployId of deployIdList)
|
|
60
|
-
for (const envFile of ['test', 'development', 'production'])
|
|
61
|
-
_set(`./engine-private/conf/${deployId}/.env.${envFile}`, key, value);
|
|
62
|
-
return;
|
|
63
|
-
}
|
|
64
|
-
const exeRootPath = `${getNpmRootPath()}/underpost`;
|
|
65
|
-
fs.ensureDirSync(exeRootPath);
|
|
66
|
-
const envPath = `${exeRootPath}/.env`;
|
|
67
|
-
_set(envPath, key, value);
|
|
68
|
-
},
|
|
69
|
-
/**
|
|
70
|
-
* @method delete
|
|
71
|
-
* @description Deletes an environment variable from the underpost root environment.
|
|
72
|
-
* @param {string} key - The key of the environment variable to delete.
|
|
73
|
-
* @memberof UnderpostEnv
|
|
74
|
-
*/
|
|
75
|
-
delete(key) {
|
|
76
|
-
const exeRootPath = `${getNpmRootPath()}/underpost`;
|
|
77
|
-
const envPath = `${exeRootPath}/.env`;
|
|
78
|
-
guardEnvPath(envPath);
|
|
79
|
-
let env = {};
|
|
80
|
-
if (fs.existsSync(envPath)) env = dotenv.parse(fs.readFileSync(envPath, 'utf8'));
|
|
81
|
-
delete env[key];
|
|
82
|
-
writeEnv(envPath, env);
|
|
83
|
-
},
|
|
84
|
-
/**
|
|
85
|
-
* @method get
|
|
86
|
-
* @description Gets an environment variable from the underpost root environment.
|
|
87
|
-
* @param {string} key - The key of the environment variable to get.
|
|
88
|
-
* @param {string} value - The value of the environment variable to get.
|
|
89
|
-
* @param {object} options - Options for getting the environment variable.
|
|
90
|
-
* @param {boolean} [options.plain=false] - If true, returns the environment variable value as a string.
|
|
91
|
-
* @param {boolean} [options.disableLog=false] - If true, disables logging of the environment variable value.
|
|
92
|
-
* @param {boolean} [options.copy=false] - If true, copies the environment variable value to the clipboard.
|
|
93
|
-
* @memberof UnderpostEnv
|
|
94
|
-
*/
|
|
95
|
-
get(key, value, options = { plain: false, disableLog: false, copy: false }) {
|
|
96
|
-
const exeRootPath = `${getNpmRootPath()}/underpost`;
|
|
97
|
-
const envPath = `${exeRootPath}/.env`;
|
|
98
|
-
if (!fs.existsSync(envPath) || !fs.statSync(envPath).isFile()) return undefined;
|
|
99
|
-
const env = dotenv.parse(fs.readFileSync(envPath, 'utf8'));
|
|
100
|
-
if (!options.disableLog)
|
|
101
|
-
options?.plain === true ? console.log(env[key]) : logger.info(`${key}(${typeof env[key]})`, env[key]);
|
|
102
|
-
if (options.copy === true) pbcopy(env[key]);
|
|
103
|
-
return env[key];
|
|
104
|
-
},
|
|
105
|
-
/**
|
|
106
|
-
* @method list
|
|
107
|
-
* @description Lists all environment variables in the underpost root environment.
|
|
108
|
-
* @param {string} key - Not used for list operation.
|
|
109
|
-
* @param {string} value - Not used for list operation.
|
|
110
|
-
* @param {object} options - Options for listing environment variables.
|
|
111
|
-
* @param {string} [options.filter] - Filter keyword to match against keys or values.
|
|
112
|
-
* @memberof UnderpostEnv
|
|
113
|
-
*/
|
|
114
|
-
list(key, value, options = {}) {
|
|
115
|
-
const exeRootPath = `${getNpmRootPath()}/underpost`;
|
|
116
|
-
const envPath = `${exeRootPath}/.env`;
|
|
117
|
-
guardEnvPath(envPath);
|
|
118
|
-
if (!fs.existsSync(envPath)) {
|
|
119
|
-
logger.warn(`Empty environment variables`);
|
|
120
|
-
return {};
|
|
121
|
-
}
|
|
122
|
-
let env = dotenv.parse(fs.readFileSync(envPath, 'utf8'));
|
|
123
|
-
|
|
124
|
-
// Apply filter if provided
|
|
125
|
-
if (options.filter) {
|
|
126
|
-
const filterKeyword = options.filter.toLowerCase();
|
|
127
|
-
const filtered = {};
|
|
128
|
-
for (const [envKey, envValue] of Object.entries(env)) {
|
|
129
|
-
const keyMatch = envKey.toLowerCase().includes(filterKeyword);
|
|
130
|
-
const valueMatch = String(envValue).toLowerCase().includes(filterKeyword);
|
|
131
|
-
if (keyMatch || valueMatch) {
|
|
132
|
-
filtered[envKey] = envValue;
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
env = filtered;
|
|
136
|
-
logger.info(`underpost root (filtered by: ${options.filter})`, env);
|
|
137
|
-
} else {
|
|
138
|
-
logger.info('underpost root', env);
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
return env;
|
|
142
|
-
},
|
|
143
|
-
/**
|
|
144
|
-
* @method clean
|
|
145
|
-
* @description Cleans the underpost root environment by removing the environment file.
|
|
146
|
-
* @param {object} options - Options for cleaning the environment.
|
|
147
|
-
* @param {Array<string>} [options.keepKeys=[]] - List of keys to keep in the environment file. If provided, only these keys will be retained.
|
|
148
|
-
* @memberof UnderpostEnv
|
|
149
|
-
*/
|
|
150
|
-
clean(options = { keepKeys: [] }) {
|
|
151
|
-
const { keepKeys } = options;
|
|
152
|
-
const exeRootPath = `${getNpmRootPath()}/underpost`;
|
|
153
|
-
const envPath = `${exeRootPath}/.env`;
|
|
154
|
-
if (keepKeys && keepKeys.length > 0 && fs.existsSync(envPath)) {
|
|
155
|
-
const env = dotenv.parse(fs.readFileSync(envPath, 'utf8'));
|
|
156
|
-
const filteredEnv = Object.fromEntries(Object.entries(env).filter(([key]) => keepKeys.includes(key)));
|
|
157
|
-
writeEnv(envPath, filteredEnv);
|
|
158
|
-
} else {
|
|
159
|
-
fs.removeSync(envPath);
|
|
160
|
-
}
|
|
161
|
-
},
|
|
162
|
-
/**
|
|
163
|
-
* @method isInsideContainer
|
|
164
|
-
* @description Detects whether the current process is running inside a container.
|
|
165
|
-
* Checks for Kubernetes service injection or Docker's .dockerenv marker.
|
|
166
|
-
* @returns {boolean} True if running inside a container.
|
|
167
|
-
* @memberof UnderpostEnv
|
|
168
|
-
*/
|
|
169
|
-
isInsideContainer() {
|
|
170
|
-
return !!process.env.KUBERNETES_SERVICE_HOST || fs.existsSync('/.dockerenv');
|
|
171
|
-
},
|
|
172
|
-
};
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
export default UnderpostRootEnv;
|
|
176
|
-
|
|
177
|
-
export { guardEnvPath };
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
import { BlockChainService } from '../../services/blockchain/blockchain.service.js';
|
|
2
|
-
import { BtnIcon } from './BtnIcon.js';
|
|
3
|
-
import { dynamicCol } from './Css.js';
|
|
4
|
-
import { EventsUI } from './EventsUI.js';
|
|
5
|
-
import { Input } from './Input.js';
|
|
6
|
-
import { Translate } from './Translate.js';
|
|
7
|
-
|
|
8
|
-
const BlockChainManagement = {
|
|
9
|
-
Render: async function (options) {
|
|
10
|
-
setTimeout(() => {
|
|
11
|
-
EventsUI.onClick(`.btn-upload-blockchain`, async () => {
|
|
12
|
-
// const { result, status } = new BlockChainService.post();
|
|
13
|
-
});
|
|
14
|
-
});
|
|
15
|
-
return html` ${dynamicCol({ containerSelector: options.idModal, id: 'blockchain' })}
|
|
16
|
-
<div class="fl">
|
|
17
|
-
<div class="in fll blockchain-col-a">
|
|
18
|
-
<div class="in section-mp">
|
|
19
|
-
<div class="in sub-title-modal"><i class="fa-solid fa-sliders"></i> ${Translate.Render('config')}</div>
|
|
20
|
-
<div class="in">
|
|
21
|
-
${await Input.Render({
|
|
22
|
-
id: `blockchain-seed`,
|
|
23
|
-
label: html`<i class="fa-solid fa-pen-to-square"></i> ${Translate.Render('blockchain-seed')}`,
|
|
24
|
-
containerClass: 'section-mp width-mini-box input-container',
|
|
25
|
-
placeholder: true,
|
|
26
|
-
})}
|
|
27
|
-
${await BtnIcon.Render({
|
|
28
|
-
class: `inl section-mp btn-custom btn-upload-blockchain`,
|
|
29
|
-
label: html`<i class="fas fa-plus"></i> ${Translate.Render(`create`)}`,
|
|
30
|
-
})}
|
|
31
|
-
</div>
|
|
32
|
-
</div>
|
|
33
|
-
</div>
|
|
34
|
-
<div class="in fll blockchain-col-b">
|
|
35
|
-
<div class="in section-mp"></div>
|
|
36
|
-
</div>
|
|
37
|
-
</div>`;
|
|
38
|
-
},
|
|
39
|
-
};
|
|
40
|
-
|
|
41
|
-
export { BlockChainManagement };
|
|
@@ -1,145 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Mobile virtual keyboard avoidance utility.
|
|
3
|
-
*
|
|
4
|
-
* On mobile browsers, when the software keyboard appears it reduces
|
|
5
|
-
* `window.visualViewport.height`. Without compensation, the keyboard
|
|
6
|
-
* can cover modals and form inputs so the user cannot see what they type.
|
|
7
|
-
*
|
|
8
|
-
* This module attaches to `window.visualViewport` resize/scroll events and
|
|
9
|
-
* translates a target element upward by the amount of space the keyboard has
|
|
10
|
-
* consumed. A debounce is applied so that rapid `resize` events (common on
|
|
11
|
-
* Android) do not cause visual jitter.
|
|
12
|
-
*
|
|
13
|
-
* Usage:
|
|
14
|
-
* ```js
|
|
15
|
-
* import { initKeyboardAvoidance } from './KeyboardAvoidance.js';
|
|
16
|
-
*
|
|
17
|
-
* // Attach when a modal opens:
|
|
18
|
-
* const cleanup = initKeyboardAvoidance(document.querySelector('.my-modal'));
|
|
19
|
-
*
|
|
20
|
-
* // Detach when the modal closes:
|
|
21
|
-
* cleanup();
|
|
22
|
-
* ```
|
|
23
|
-
*
|
|
24
|
-
* @module src/client/components/core/KeyboardAvoidance.js
|
|
25
|
-
* @namespace KeyboardAvoidanceModule
|
|
26
|
-
*/
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* Minimum keyboard height in pixels below which we consider the keyboard
|
|
30
|
-
* to be hidden. Values smaller than this are treated as OS chrome
|
|
31
|
-
* (address bar resize, etc.) and ignored.
|
|
32
|
-
*
|
|
33
|
-
* @constant {number}
|
|
34
|
-
* @memberof KeyboardAvoidanceModule
|
|
35
|
-
*/
|
|
36
|
-
const MIN_KEYBOARD_HEIGHT_PX = 50;
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* Debounce delay in milliseconds applied to the `resize` handler.
|
|
40
|
-
* Prevents excessive style recalculations when the keyboard animates in.
|
|
41
|
-
*
|
|
42
|
-
* @constant {number}
|
|
43
|
-
* @memberof KeyboardAvoidanceModule
|
|
44
|
-
*/
|
|
45
|
-
const DEBOUNCE_MS = 32;
|
|
46
|
-
|
|
47
|
-
/**
|
|
48
|
-
* Attaches `visualViewport` listeners to translate `targetEl` when the
|
|
49
|
-
* mobile software keyboard appears.
|
|
50
|
-
*
|
|
51
|
-
* The function is a no-op in environments that do not support the
|
|
52
|
-
* `visualViewport` API (desktop browsers, some older mobile browsers).
|
|
53
|
-
*
|
|
54
|
-
* @param {HTMLElement} targetEl - The element to translate (typically a
|
|
55
|
-
* modal container or form wrapper).
|
|
56
|
-
* @param {object} [options]
|
|
57
|
-
* @param {number} [options.debounceMs=32] - Debounce delay in ms.
|
|
58
|
-
* @param {number} [options.minKeyboardPx=50] - Minimum offset to treat
|
|
59
|
-
* as a real keyboard appearance.
|
|
60
|
-
* @param {string} [options.transitionStyle='transform 0.15s ease-out'] -
|
|
61
|
-
* CSS transition applied to `targetEl` during keyboard animations.
|
|
62
|
-
* @returns {function(): void} Cleanup function — call when the element is
|
|
63
|
-
* unmounted or the modal closes to remove the event listeners.
|
|
64
|
-
*
|
|
65
|
-
* @memberof KeyboardAvoidanceModule
|
|
66
|
-
*
|
|
67
|
-
* @example
|
|
68
|
-
* // Inside a modal's open() method:
|
|
69
|
-
* this._kbCleanup = initKeyboardAvoidance(this._el);
|
|
70
|
-
*
|
|
71
|
-
* // Inside the modal's close() method:
|
|
72
|
-
* if (this._kbCleanup) { this._kbCleanup(); this._kbCleanup = null; }
|
|
73
|
-
*/
|
|
74
|
-
export function initKeyboardAvoidance(
|
|
75
|
-
targetEl,
|
|
76
|
-
{
|
|
77
|
-
debounceMs = DEBOUNCE_MS,
|
|
78
|
-
minKeyboardPx = MIN_KEYBOARD_HEIGHT_PX,
|
|
79
|
-
transitionStyle = 'transform 0.15s ease-out',
|
|
80
|
-
} = {},
|
|
81
|
-
) {
|
|
82
|
-
// Feature-detect visualViewport. When unavailable, return a no-op cleanup.
|
|
83
|
-
if (!window.visualViewport || !targetEl) return () => {};
|
|
84
|
-
|
|
85
|
-
// Apply transition so movement feels natural.
|
|
86
|
-
const previousTransition = targetEl.style.transition;
|
|
87
|
-
targetEl.style.transition = transitionStyle;
|
|
88
|
-
|
|
89
|
-
let debounceTimer = null;
|
|
90
|
-
|
|
91
|
-
/**
|
|
92
|
-
* Computes the vertical offset caused by the software keyboard and
|
|
93
|
-
* applies a CSS translateY correction to `targetEl`.
|
|
94
|
-
*
|
|
95
|
-
* @returns {void}
|
|
96
|
-
* @memberof KeyboardAvoidanceModule
|
|
97
|
-
*/
|
|
98
|
-
const update = () => {
|
|
99
|
-
const offset = window.innerHeight - window.visualViewport.height - window.visualViewport.offsetTop;
|
|
100
|
-
|
|
101
|
-
if (offset > minKeyboardPx) {
|
|
102
|
-
// Keyboard is visible — push the element up.
|
|
103
|
-
targetEl.style.transform = `translateY(-${Math.round(offset)}px)`;
|
|
104
|
-
} else {
|
|
105
|
-
// Keyboard is hidden — restore original position.
|
|
106
|
-
targetEl.style.transform = '';
|
|
107
|
-
}
|
|
108
|
-
};
|
|
109
|
-
|
|
110
|
-
/**
|
|
111
|
-
* Debounced wrapper for `update`.
|
|
112
|
-
* @returns {void}
|
|
113
|
-
*/
|
|
114
|
-
const onViewportChange = () => {
|
|
115
|
-
if (debounceTimer !== null) clearTimeout(debounceTimer);
|
|
116
|
-
debounceTimer = setTimeout(update, debounceMs);
|
|
117
|
-
};
|
|
118
|
-
|
|
119
|
-
window.visualViewport.addEventListener('resize', onViewportChange);
|
|
120
|
-
window.visualViewport.addEventListener('scroll', onViewportChange);
|
|
121
|
-
|
|
122
|
-
// Run once immediately to handle the case where the keyboard was already
|
|
123
|
-
// open when this function was called.
|
|
124
|
-
update();
|
|
125
|
-
|
|
126
|
-
/**
|
|
127
|
-
* Cleanup function. Removes all listeners and restores the element's
|
|
128
|
-
* original styles.
|
|
129
|
-
*
|
|
130
|
-
* @returns {void}
|
|
131
|
-
*/
|
|
132
|
-
return () => {
|
|
133
|
-
if (debounceTimer !== null) {
|
|
134
|
-
clearTimeout(debounceTimer);
|
|
135
|
-
debounceTimer = null;
|
|
136
|
-
}
|
|
137
|
-
window.visualViewport.removeEventListener('resize', onViewportChange);
|
|
138
|
-
window.visualViewport.removeEventListener('scroll', onViewportChange);
|
|
139
|
-
// Restore previous styles.
|
|
140
|
-
targetEl.style.transform = '';
|
|
141
|
-
targetEl.style.transition = previousTransition;
|
|
142
|
-
};
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
export default initKeyboardAvoidance;
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1,148 +0,0 @@
|
|
|
1
|
-
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
-
<xsl:stylesheet version="2.0"
|
|
3
|
-
xmlns:html="http://www.w3.org/TR/REC-html40"
|
|
4
|
-
xmlns:image="http://www.google.com/schemas/sitemap-image/1.1"
|
|
5
|
-
xmlns:sitemap="http://www.sitemaps.org/schemas/sitemap/0.9"
|
|
6
|
-
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
|
|
7
|
-
<xsl:output method="html" version="1.0" encoding="UTF-8" indent="yes" />
|
|
8
|
-
<xsl:template match="/">
|
|
9
|
-
<html xmlns="http://www.w3.org/1999/xhtml">
|
|
10
|
-
<head>
|
|
11
|
-
<title>XML Sitemap</title>
|
|
12
|
-
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
|
13
|
-
<style type="text/css">
|
|
14
|
-
body {
|
|
15
|
-
font-family: sans-serif;
|
|
16
|
-
font-size: 16px;
|
|
17
|
-
color: #242628;
|
|
18
|
-
}
|
|
19
|
-
a {
|
|
20
|
-
color: #000;
|
|
21
|
-
text-decoration: none;
|
|
22
|
-
}
|
|
23
|
-
a:hover {
|
|
24
|
-
text-decoration: underline;
|
|
25
|
-
}
|
|
26
|
-
table {
|
|
27
|
-
border: none;
|
|
28
|
-
border-collapse: collapse;
|
|
29
|
-
width: 100%
|
|
30
|
-
}
|
|
31
|
-
th {
|
|
32
|
-
text-align: left;
|
|
33
|
-
padding-right: 30px;
|
|
34
|
-
font-size: 11px;
|
|
35
|
-
}
|
|
36
|
-
thead th {
|
|
37
|
-
border-bottom: 1px solid #7d878a;
|
|
38
|
-
cursor: pointer;
|
|
39
|
-
}
|
|
40
|
-
td {
|
|
41
|
-
font-size:11px;
|
|
42
|
-
padding: 5px;
|
|
43
|
-
}
|
|
44
|
-
tr:nth-child(odd) td {
|
|
45
|
-
background-color: rgba(0,0,0,0.04);
|
|
46
|
-
}
|
|
47
|
-
tr:hover td {
|
|
48
|
-
background-color: #e2edf2;
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
#content {
|
|
52
|
-
margin: 0 auto;
|
|
53
|
-
padding: 2% 5%;
|
|
54
|
-
max-width: 800px;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
.desc {
|
|
58
|
-
margin: 18px 3px;
|
|
59
|
-
line-height: 1.2em;
|
|
60
|
-
}
|
|
61
|
-
.desc a {
|
|
62
|
-
color: #5ba4e5;
|
|
63
|
-
}
|
|
64
|
-
</style>
|
|
65
|
-
</head>
|
|
66
|
-
<body>
|
|
67
|
-
<div id="content">
|
|
68
|
-
<h1>XML Sitemap</h1>
|
|
69
|
-
<p class="desc"> This is a sitemap generated by <a
|
|
70
|
-
href="https://www.nexodev.org">nexodev.org</a>
|
|
71
|
-
</p>
|
|
72
|
-
<xsl:if test="count(sitemap:sitemapindex/sitemap:sitemap) > 0">
|
|
73
|
-
<table id="sitemap" cellpadding="3">
|
|
74
|
-
<thead>
|
|
75
|
-
<tr>
|
|
76
|
-
<th width="75%">Sitemap</th>
|
|
77
|
-
<th width="25%">Last Modified</th>
|
|
78
|
-
</tr>
|
|
79
|
-
</thead>
|
|
80
|
-
<tbody>
|
|
81
|
-
<xsl:for-each select="sitemap:sitemapindex/sitemap:sitemap">
|
|
82
|
-
<xsl:variable name="sitemapURL">
|
|
83
|
-
<xsl:value-of select="sitemap:loc" />
|
|
84
|
-
</xsl:variable>
|
|
85
|
-
<tr>
|
|
86
|
-
<td>
|
|
87
|
-
<a href="{$sitemapURL}">
|
|
88
|
-
<xsl:value-of select="sitemap:loc" />
|
|
89
|
-
</a>
|
|
90
|
-
</td>
|
|
91
|
-
<td>
|
|
92
|
-
<xsl:value-of
|
|
93
|
-
select="concat(substring(sitemap:lastmod,0,11),concat(' ', substring(sitemap:lastmod,12,5)))" />
|
|
94
|
-
</td>
|
|
95
|
-
</tr>
|
|
96
|
-
</xsl:for-each>
|
|
97
|
-
</tbody>
|
|
98
|
-
</table>
|
|
99
|
-
</xsl:if>
|
|
100
|
-
<xsl:if test="count(sitemap:sitemapindex/sitemap:sitemap) < 1">
|
|
101
|
-
<p class="desc">
|
|
102
|
-
<a href="{{web-url}}sitemap.xml" class="back-link">← Back to index</a>
|
|
103
|
-
</p>
|
|
104
|
-
<table
|
|
105
|
-
id="sitemap" cellpadding="3">
|
|
106
|
-
<thead>
|
|
107
|
-
<tr>
|
|
108
|
-
<th width="70%">URL (<xsl:value-of
|
|
109
|
-
select="count(sitemap:urlset/sitemap:url)" /> total)</th>
|
|
110
|
-
<th width="15%">Images</th>
|
|
111
|
-
<th title="Last Modification Time" width="15%">Last Modified</th>
|
|
112
|
-
</tr>
|
|
113
|
-
</thead>
|
|
114
|
-
<tbody>
|
|
115
|
-
<xsl:variable name="lower" select="'abcdefghijklmnopqrstuvwxyz'" />
|
|
116
|
-
<xsl:variable name="upper" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'" />
|
|
117
|
-
<xsl:for-each select="sitemap:urlset/sitemap:url">
|
|
118
|
-
<tr>
|
|
119
|
-
<td>
|
|
120
|
-
<xsl:variable name="itemURL">
|
|
121
|
-
<xsl:value-of select="sitemap:loc" />
|
|
122
|
-
</xsl:variable>
|
|
123
|
-
<a href="{$itemURL}">
|
|
124
|
-
<xsl:value-of select="sitemap:loc" />
|
|
125
|
-
</a>
|
|
126
|
-
</td>
|
|
127
|
-
<td>
|
|
128
|
-
<xsl:value-of select="count(image:image)" />
|
|
129
|
-
</td>
|
|
130
|
-
<td>
|
|
131
|
-
<xsl:value-of
|
|
132
|
-
select="concat(substring(sitemap:lastmod,0,11),concat(' ', substring(sitemap:lastmod,12,5)))" />
|
|
133
|
-
</td>
|
|
134
|
-
</tr>
|
|
135
|
-
</xsl:for-each>
|
|
136
|
-
</tbody>
|
|
137
|
-
</table>
|
|
138
|
-
<p
|
|
139
|
-
class="desc">
|
|
140
|
-
<a href="{{web-url}}sitemap.xml" class="back-link">← Back to index</a>
|
|
141
|
-
</p>
|
|
142
|
-
</xsl:if>
|
|
143
|
-
</div>
|
|
144
|
-
</body>
|
|
145
|
-
</html>
|
|
146
|
-
|
|
147
|
-
</xsl:template>
|
|
148
|
-
</xsl:stylesheet>
|
|
@@ -1,98 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Environment and global installation path resolution.
|
|
3
|
-
* @module src/server/environment.js
|
|
4
|
-
* @namespace ServerEnvironment
|
|
5
|
-
*/
|
|
6
|
-
'use strict';
|
|
7
|
-
|
|
8
|
-
import dotenv from 'dotenv';
|
|
9
|
-
import fs from 'fs-extra';
|
|
10
|
-
import { execFileSync } from 'node:child_process';
|
|
11
|
-
import { loggerFactory } from './logger.js';
|
|
12
|
-
|
|
13
|
-
const logger = loggerFactory(import.meta);
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* Node directory backing every hostPath PersistentVolume the deploy flow
|
|
17
|
-
* materializes (`<root>/<pv id>`), including the shared gateway's static tree.
|
|
18
|
-
* Cluster bring-up gives it the shared container label, because the pods that
|
|
19
|
-
* read these documents are unprivileged.
|
|
20
|
-
* @constant {string}
|
|
21
|
-
* @memberof ServerEnvironment
|
|
22
|
-
*/
|
|
23
|
-
const HOST_VOLUME_ROOT = '/home/dd/engine/volume';
|
|
24
|
-
const envFileCache = new Map();
|
|
25
|
-
let rootEnvPath;
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* Resolves the global npm module directory.
|
|
29
|
-
* @returns {string}
|
|
30
|
-
* @memberof ServerEnvironment
|
|
31
|
-
*/
|
|
32
|
-
const getNpmRootPath = () => {
|
|
33
|
-
try {
|
|
34
|
-
return execFileSync('npm', ['root', '-g'], {
|
|
35
|
-
encoding: 'utf8',
|
|
36
|
-
stdio: ['ignore', 'pipe', 'ignore'],
|
|
37
|
-
}).trim();
|
|
38
|
-
} catch {
|
|
39
|
-
return '';
|
|
40
|
-
}
|
|
41
|
-
};
|
|
42
|
-
|
|
43
|
-
/**
|
|
44
|
-
* Resolves the global Underpost installation directory.
|
|
45
|
-
* @returns {string}
|
|
46
|
-
* @memberof ServerEnvironment
|
|
47
|
-
*/
|
|
48
|
-
const getUnderpostRootPath = () => {
|
|
49
|
-
const npmRoot = getNpmRootPath();
|
|
50
|
-
return npmRoot ? `${npmRoot}/underpost` : '';
|
|
51
|
-
};
|
|
52
|
-
|
|
53
|
-
const readEnvFile = (path) => {
|
|
54
|
-
if (envFileCache.has(path)) return envFileCache.get(path);
|
|
55
|
-
let values = {};
|
|
56
|
-
try {
|
|
57
|
-
if (path && fs.existsSync(path)) values = dotenv.parse(fs.readFileSync(path, 'utf8'));
|
|
58
|
-
} catch (error) {
|
|
59
|
-
logger.warn('Ignoring unreadable env file', { target: path, message: error.message });
|
|
60
|
-
}
|
|
61
|
-
envFileCache.set(path, values);
|
|
62
|
-
return values;
|
|
63
|
-
};
|
|
64
|
-
|
|
65
|
-
const environmentValueFactory = (key) => {
|
|
66
|
-
const processValue = `${process.env[key] ?? ''}`.trim();
|
|
67
|
-
if (processValue) return processValue;
|
|
68
|
-
|
|
69
|
-
if (rootEnvPath === undefined) {
|
|
70
|
-
const underpostRoot = getUnderpostRootPath();
|
|
71
|
-
rootEnvPath = underpostRoot ? `${underpostRoot}/.env` : '';
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
for (const path of ['./.env', rootEnvPath]) {
|
|
75
|
-
const value = `${readEnvFile(path)[key] ?? ''}`.trim();
|
|
76
|
-
if (value) return value;
|
|
77
|
-
}
|
|
78
|
-
return '';
|
|
79
|
-
};
|
|
80
|
-
|
|
81
|
-
/**
|
|
82
|
-
* Writes environment values as a dotenv file.
|
|
83
|
-
* @method writeEnv
|
|
84
|
-
* @param {string} envPath - Destination file path.
|
|
85
|
-
* @param {Object<string, *>} envObj - Environment values keyed by variable name.
|
|
86
|
-
* @returns {void}
|
|
87
|
-
* @memberof ServerEnvironment
|
|
88
|
-
*/
|
|
89
|
-
const writeEnv = (envPath, envObj) =>
|
|
90
|
-
fs.writeFileSync(
|
|
91
|
-
envPath,
|
|
92
|
-
Object.keys(envObj)
|
|
93
|
-
.map((key) => `${key}=${envObj[key]}`)
|
|
94
|
-
.join('\n'),
|
|
95
|
-
'utf8',
|
|
96
|
-
);
|
|
97
|
-
|
|
98
|
-
export { environmentValueFactory, getNpmRootPath, getUnderpostRootPath, HOST_VOLUME_ROOT, writeEnv };
|