@underpostnet/cyberia 3.2.90 → 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.
Files changed (490) hide show
  1. package/.dockerignore +1 -0
  2. package/.env.example +16 -0
  3. package/.github/workflows/coverall.cyberia.ci.yml +107 -0
  4. package/.github/workflows/cyberia-client.cd.yml +6 -18
  5. package/.github/workflows/cyberia-server.cd.yml +6 -18
  6. package/.github/workflows/docker-image.cyberia-client.ci.yml +8 -5
  7. package/.github/workflows/docker-image.cyberia-client.dev.ci.yml +8 -3
  8. package/.github/workflows/docker-image.cyberia-server.ci.yml +8 -5
  9. package/.github/workflows/docker-image.cyberia-server.dev.ci.yml +8 -5
  10. package/.github/workflows/docker-image.engine-cyberia.ci.yml +15 -1
  11. package/.github/workflows/docker-image.engine-cyberia.dev.ci.yml +15 -1
  12. package/.github/workflows/engine-cyberia.cd.yml +6 -78
  13. package/.github/workflows/engine-cyberia.ci.yml +4 -5
  14. package/.github/workflows/ghpkg.ci.yml +42 -21
  15. package/.github/workflows/hardhat.ci.yml +12 -11
  16. package/.github/workflows/npmpkg.ci.yml +17 -15
  17. package/.github/workflows/pwa-microservices-template-page.cd.yml +1 -16
  18. package/.github/workflows/pwa-microservices-template-test.ci.yml +2 -2
  19. package/.github/workflows/release.cd.yml +2 -9
  20. package/.prettierignore +1 -0
  21. package/AGENTS.md +47 -0
  22. package/CHANGELOG.md +581 -2417
  23. package/CLI-HELP.md +416 -127
  24. package/Dockerfile +25 -9
  25. package/Dockerfile.dev +25 -9
  26. package/Dockerfile.test +4 -4
  27. package/README.md +21 -1
  28. package/bin/build.js +70 -43
  29. package/bin/build.template.js +8 -3
  30. package/bin/cyberia.js +372 -135
  31. package/bin/deploy.js +18 -104
  32. package/bin/index.js +372 -135
  33. package/compose.env +16 -0
  34. package/conf.js +93 -4
  35. package/deploy/cyberia-client/deploy.sh +47 -0
  36. package/deploy/cyberia-client/package.sh +18 -0
  37. package/deploy/cyberia-client/state.sh +14 -0
  38. package/deploy/cyberia-server/deploy.sh +47 -0
  39. package/deploy/cyberia-server/package.sh +18 -0
  40. package/deploy/cyberia-server/state.sh +14 -0
  41. package/deploy/dd-cyberia/deploy.sh +22 -0
  42. package/deploy/dd-cyberia/init.sh +55 -0
  43. package/deploy/dd-cyberia/package.sh +17 -0
  44. package/deploy/dd-cyberia/state.sh +14 -0
  45. package/deploy/dd-cyberia/sync-deploy.sh +116 -0
  46. package/deploy/lib/github-actions-logging.sh +594 -0
  47. package/deploy/lib/host.sh +185 -0
  48. package/deploy/lib/state.sh +62 -0
  49. package/deploy/pwa-microservices-template/deploy.sh +45 -0
  50. package/deploy/release/deploy.sh +32 -0
  51. package/deployment.yaml +7 -2
  52. package/docker-compose.yml +31 -37
  53. package/examples/static-page/README.md +19 -19
  54. package/examples/static-page/ssr-components/CustomPage.js +2 -2
  55. package/hardhat/hardhat.config.js +1 -6
  56. package/hardhat/package-lock.json +104 -43
  57. package/hardhat/package.json +3 -3
  58. package/manifests/alertmanager/deployment.yaml +81 -0
  59. package/manifests/blackbox-exporter/deployment.yaml +75 -0
  60. package/manifests/cronjobs/dd-cron/dd-cron-backup.yaml +36 -7
  61. package/manifests/cronjobs/dd-cron/dd-cron-vultr.yaml +77 -0
  62. package/manifests/deployment/dd-cyberia-development/deployment.yaml +7 -2
  63. package/manifests/deployment/dd-default-development/deployment.yaml +2 -2
  64. package/manifests/grafana/deployment.yaml +26 -7
  65. package/manifests/grafana/kustomization.yaml +1 -0
  66. package/manifests/grafana/service.yaml +6 -1
  67. package/manifests/mariadb/pv.yaml +1 -0
  68. package/manifests/mongodb/statefulset.yaml +9 -2
  69. package/manifests/mysql/pv-pvc.yaml +14 -1
  70. package/manifests/postgresql/pv.yaml +12 -1
  71. package/manifests/postgresql/pvc.yaml +1 -0
  72. package/manifests/prometheus/deployment.yaml +18 -22
  73. package/package.json +83 -10
  74. package/scripts/audit-selinux.sh +64 -0
  75. package/scripts/event-monitor.sh +56 -0
  76. package/scripts/gpu-diag.sh +0 -0
  77. package/scripts/ip-info.sh +0 -0
  78. package/scripts/k3s-node-setup.sh +30 -14
  79. package/scripts/kubeadm-node-setup.sh +40 -31
  80. package/scripts/lxd-vm-setup.sh +0 -0
  81. package/scripts/maas-nat-firewalld.sh +0 -0
  82. package/scripts/maas-setup.sh +8 -8
  83. package/scripts/nat-iptables.sh +2 -0
  84. package/scripts/rhel-grpc-setup.sh +0 -0
  85. package/scripts/rocky-kickstart.sh +25 -9
  86. package/scripts/selinux-normalize.sh +907 -0
  87. package/scripts/shutdown-machine.sh +843 -0
  88. package/scripts/test-monitor.sh +3 -3
  89. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.controller.js +1 -1
  90. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.router.js +2 -2
  91. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.service.js +2 -2
  92. package/src/api/core/core.controller.js +1 -1
  93. package/src/api/core/core.router.js +2 -2
  94. package/src/api/core/core.service.js +2 -2
  95. package/src/api/crypto/crypto.controller.js +1 -1
  96. package/src/api/crypto/crypto.service.js +1 -1
  97. package/src/api/cyberia-action/cyberia-action.controller.js +1 -1
  98. package/src/api/cyberia-action/cyberia-action.router.js +1 -1
  99. package/src/api/cyberia-action/cyberia-action.service.js +2 -2
  100. package/src/api/cyberia-client-hints/cyberia-client-hints.controller.js +1 -1
  101. package/src/api/cyberia-client-hints/cyberia-client-hints.router.js +1 -1
  102. package/src/api/cyberia-client-hints/cyberia-client-hints.service.js +2 -2
  103. package/src/api/cyberia-dialogue/cyberia-dialogue.controller.js +1 -1
  104. package/src/api/cyberia-dialogue/cyberia-dialogue.router.js +1 -1
  105. package/src/api/cyberia-dialogue/cyberia-dialogue.service.js +2 -2
  106. package/src/api/cyberia-entity/cyberia-entity.controller.js +1 -1
  107. package/src/api/cyberia-entity/cyberia-entity.router.js +1 -1
  108. package/src/api/cyberia-entity/cyberia-entity.service.js +2 -2
  109. package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.controller.js +1 -1
  110. package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.router.js +1 -1
  111. package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.service.js +2 -2
  112. package/src/api/cyberia-instance/cyberia-fallback-capture.js +466 -0
  113. package/src/api/cyberia-instance/cyberia-fallback-default-items.js +63 -0
  114. package/src/api/cyberia-instance/cyberia-fallback-world.js +16 -1
  115. package/src/api/cyberia-instance/cyberia-instance-map.service.js +1 -1
  116. package/src/api/cyberia-instance/cyberia-instance.controller.js +4 -1
  117. package/src/api/cyberia-instance/cyberia-instance.router.js +15 -2
  118. package/src/api/cyberia-instance/cyberia-instance.service.js +45 -2
  119. package/src/api/cyberia-instance-conf/cyberia-instance-conf.controller.js +1 -1
  120. package/src/api/cyberia-instance-conf/cyberia-instance-conf.model.js +1 -0
  121. package/src/api/cyberia-instance-conf/cyberia-instance-conf.router.js +1 -1
  122. package/src/api/cyberia-instance-conf/cyberia-instance-conf.service.js +2 -2
  123. package/src/api/cyberia-map/cyberia-map.controller.js +1 -1
  124. package/src/api/cyberia-map/cyberia-map.router.js +1 -1
  125. package/src/api/cyberia-map/cyberia-map.service.js +2 -2
  126. package/src/api/cyberia-quest/cyberia-quest.controller.js +1 -1
  127. package/src/api/cyberia-quest/cyberia-quest.router.js +1 -1
  128. package/src/api/cyberia-quest/cyberia-quest.service.js +2 -2
  129. package/src/api/cyberia-quest-progress/cyberia-quest-progress.controller.js +1 -1
  130. package/src/api/cyberia-quest-progress/cyberia-quest-progress.router.js +1 -1
  131. package/src/api/cyberia-quest-progress/cyberia-quest-progress.service.js +2 -2
  132. package/src/api/cyberia-saga/cyberia-saga.controller.js +1 -1
  133. package/src/api/cyberia-saga/cyberia-saga.router.js +1 -1
  134. package/src/api/cyberia-saga/cyberia-saga.service.js +2 -2
  135. package/src/api/cyberia-server-defaults/cyberia-server-defaults.js +16 -29
  136. package/src/api/cyberia-skill/cyberia-skill.controller.js +1 -1
  137. package/src/api/cyberia-skill/cyberia-skill.router.js +1 -1
  138. package/src/api/cyberia-skill/cyberia-skill.service.js +2 -2
  139. package/src/api/default/default.controller.js +1 -1
  140. package/src/api/default/default.router.js +1 -1
  141. package/src/api/default/default.service.js +2 -2
  142. package/src/api/document/document.controller.js +1 -1
  143. package/src/api/document/document.router.js +1 -1
  144. package/src/api/document/document.service.js +2 -2
  145. package/src/api/file/file.controller.js +1 -1
  146. package/src/api/file/file.router.js +1 -1
  147. package/src/api/file/file.service.js +2 -2
  148. package/src/api/instance/instance.controller.js +1 -1
  149. package/src/api/instance/instance.router.js +1 -1
  150. package/src/api/instance/instance.service.js +2 -2
  151. package/src/api/ipfs/ipfs.controller.js +1 -1
  152. package/src/api/ipfs/ipfs.router.js +2 -2
  153. package/src/api/ipfs/ipfs.service.js +2 -2
  154. package/src/api/object-layer/object-layer.controller.js +1 -1
  155. package/src/api/object-layer/object-layer.model.js +204 -3
  156. package/src/api/object-layer/object-layer.router.js +2 -2
  157. package/src/api/object-layer/object-layer.service.js +4 -17
  158. package/src/api/object-layer-render-frames/object-layer-render-frames.controller.js +1 -1
  159. package/src/api/object-layer-render-frames/object-layer-render-frames.router.js +1 -1
  160. package/src/api/object-layer-render-frames/object-layer-render-frames.service.js +2 -2
  161. package/src/api/test/test.controller.js +1 -1
  162. package/src/api/test/test.service.js +1 -1
  163. package/src/api/user/guest.service.js +3 -3
  164. package/src/api/user/user.controller.js +1 -1
  165. package/src/api/user/user.router.js +2 -2
  166. package/src/api/user/user.service.js +4 -4
  167. package/src/api.js +5 -9
  168. package/src/cli/app.js +391 -0
  169. package/src/cli/baremetal.js +30 -36
  170. package/src/cli/client.js +306 -0
  171. package/src/cli/cloud-init.js +3 -3
  172. package/src/cli/cluster.js +242 -135
  173. package/src/cli/db.js +126 -67
  174. package/src/cli/deploy.js +158 -60
  175. package/src/cli/docker-compose.js +5 -5
  176. package/src/cli/domains.js +184 -0
  177. package/src/cli/dotenv-store.js +143 -0
  178. package/src/cli/event.js +2281 -0
  179. package/src/cli/fs.js +3 -3
  180. package/src/cli/host.js +672 -0
  181. package/src/cli/image.js +4 -7
  182. package/src/cli/index.js +426 -134
  183. package/src/cli/ipfs.js +34 -30
  184. package/src/cli/kickstart.js +1 -1
  185. package/src/cli/kubectl.js +218 -41
  186. package/src/cli/lxd.js +3 -3
  187. package/src/cli/monitor.js +1359 -26
  188. package/src/cli/package.js +90 -0
  189. package/src/cli/release.js +73 -34
  190. package/src/cli/repository.js +564 -367
  191. package/src/cli/run.js +362 -654
  192. package/src/cli/secrets.js +2158 -964
  193. package/src/cli/ssh.js +651 -331
  194. package/src/cli/state.js +394 -0
  195. package/src/cli/static.js +2 -2
  196. package/src/cli/system.js +26 -13
  197. package/src/cli/test.js +199 -125
  198. package/src/cli/vultr.js +623 -0
  199. package/src/cli/wireguard.js +2930 -0
  200. package/src/client/components/core/CalendarCore.js +53 -96
  201. package/src/client/components/core/Docs.js +258 -211
  202. package/src/client/components/core/FileExplorer.js +0 -21
  203. package/src/client/components/core/PanelForm.js +4 -4
  204. package/src/client/components/core/Repository.js +56 -0
  205. package/src/client/components/core/Translate.js +7 -0
  206. package/src/client/components/core/{FullScreen.js → ViewModeController.js} +42 -39
  207. package/src/client/components/core/Wallet.js +0 -11
  208. package/src/client/components/core/Worker.js +7 -1
  209. package/src/client/components/cryptokoyn/SettingsCryptokoyn.js +2 -2
  210. package/src/client/components/cyberia/FallbackWorldEngineCyberia.js +368 -0
  211. package/src/client/components/cyberia-portal/AppShellCyberiaPortal.js +35 -1
  212. package/src/client/components/cyberia-portal/RouterCyberiaPortal.js +4 -0
  213. package/src/client/components/cyberia-portal/SettingsCyberiaPortal.js +2 -2
  214. package/src/client/components/cyberia-portal/TranslateCyberiaPortal.js +4 -0
  215. package/src/client/components/default/AppShellDefault.js +1 -1
  216. package/src/client/components/default/SettingsDefault.js +2 -2
  217. package/src/client/components/itemledger/SettingsItemledger.js +2 -2
  218. package/src/client/components/underpost/AppShellUnderpost.js +3 -2
  219. package/src/client/components/underpost/SettingsUnderpost.js +2 -2
  220. package/src/client/public/cyberia-docs/ARCHITECTURE.md +17 -3
  221. package/src/client/public/cyberia-docs/CYBERIA-CLI.md +32 -5
  222. package/src/client/public/cyberia-docs/CYBERIA-SERVER.md +1 -1
  223. package/src/client/public/cyberia-docs/CYBERIA.md +21 -1
  224. package/src/client/public/cyberia-docs/HARDHAT-MODULE.md +23 -6
  225. package/src/client/public/cyberia-docs/ROADMAP.md +1 -1
  226. package/src/client/public/cyberia-docs/WHITE-PAPER.md +1 -1
  227. package/src/client/public/default/android-chrome-144x144.png +0 -0
  228. package/src/client/public/default/android-chrome-192x192.png +0 -0
  229. package/src/client/public/default/android-chrome-256x256.png +0 -0
  230. package/src/client/public/default/android-chrome-36x36.png +0 -0
  231. package/src/client/public/default/android-chrome-384x384.png +0 -0
  232. package/src/client/public/default/android-chrome-48x48.png +0 -0
  233. package/src/client/public/default/android-chrome-512x512.png +0 -0
  234. package/src/client/public/default/android-chrome-72x72.png +0 -0
  235. package/src/client/public/default/android-chrome-96x96.png +0 -0
  236. package/src/client/public/default/apple-touch-icon-1024x1024.png +0 -0
  237. package/src/client/public/default/apple-touch-icon-114x114.png +0 -0
  238. package/src/client/public/default/apple-touch-icon-120x120.png +0 -0
  239. package/src/client/public/default/apple-touch-icon-144x144.png +0 -0
  240. package/src/client/public/default/apple-touch-icon-152x152.png +0 -0
  241. package/src/client/public/default/apple-touch-icon-167x167.png +0 -0
  242. package/src/client/public/default/apple-touch-icon-180x180.png +0 -0
  243. package/src/client/public/default/apple-touch-icon-57x57.png +0 -0
  244. package/src/client/public/default/apple-touch-icon-60x60.png +0 -0
  245. package/src/client/public/default/apple-touch-icon-72x72.png +0 -0
  246. package/src/client/public/default/apple-touch-icon-76x76.png +0 -0
  247. package/src/client/public/default/apple-touch-icon-precomposed.png +0 -0
  248. package/src/client/public/default/apple-touch-icon.png +0 -0
  249. package/src/client/public/default/apple-touch-startup-image-1125x2436.png +0 -0
  250. package/src/client/public/default/apple-touch-startup-image-1136x640.png +0 -0
  251. package/src/client/public/default/apple-touch-startup-image-1170x2532.png +0 -0
  252. package/src/client/public/default/apple-touch-startup-image-1179x2556.png +0 -0
  253. package/src/client/public/default/apple-touch-startup-image-1242x2208.png +0 -0
  254. package/src/client/public/default/apple-touch-startup-image-1242x2688.png +0 -0
  255. package/src/client/public/default/apple-touch-startup-image-1284x2778.png +0 -0
  256. package/src/client/public/default/apple-touch-startup-image-1290x2796.png +0 -0
  257. package/src/client/public/default/apple-touch-startup-image-1334x750.png +0 -0
  258. package/src/client/public/default/apple-touch-startup-image-1488x2266.png +0 -0
  259. package/src/client/public/default/apple-touch-startup-image-1536x2048.png +0 -0
  260. package/src/client/public/default/apple-touch-startup-image-1620x2160.png +0 -0
  261. package/src/client/public/default/apple-touch-startup-image-1640x2160.png +0 -0
  262. package/src/client/public/default/apple-touch-startup-image-1668x2224.png +0 -0
  263. package/src/client/public/default/apple-touch-startup-image-1668x2388.png +0 -0
  264. package/src/client/public/default/apple-touch-startup-image-1792x828.png +0 -0
  265. package/src/client/public/default/apple-touch-startup-image-2048x1536.png +0 -0
  266. package/src/client/public/default/apple-touch-startup-image-2048x2732.png +0 -0
  267. package/src/client/public/default/apple-touch-startup-image-2160x1620.png +0 -0
  268. package/src/client/public/default/apple-touch-startup-image-2160x1640.png +0 -0
  269. package/src/client/public/default/apple-touch-startup-image-2208x1242.png +0 -0
  270. package/src/client/public/default/apple-touch-startup-image-2224x1668.png +0 -0
  271. package/src/client/public/default/apple-touch-startup-image-2266x1488.png +0 -0
  272. package/src/client/public/default/apple-touch-startup-image-2388x1668.png +0 -0
  273. package/src/client/public/default/apple-touch-startup-image-2436x1125.png +0 -0
  274. package/src/client/public/default/apple-touch-startup-image-2532x1170.png +0 -0
  275. package/src/client/public/default/apple-touch-startup-image-2556x1179.png +0 -0
  276. package/src/client/public/default/apple-touch-startup-image-2688x1242.png +0 -0
  277. package/src/client/public/default/apple-touch-startup-image-2732x2048.png +0 -0
  278. package/src/client/public/default/apple-touch-startup-image-2778x1284.png +0 -0
  279. package/src/client/public/default/apple-touch-startup-image-2796x1290.png +0 -0
  280. package/src/client/public/default/apple-touch-startup-image-640x1136.png +0 -0
  281. package/src/client/public/default/apple-touch-startup-image-750x1334.png +0 -0
  282. package/src/client/public/default/apple-touch-startup-image-828x1792.png +0 -0
  283. package/src/client/public/default/assets/background/white.jpg +0 -0
  284. package/src/client/public/default/browserconfig.xml +1 -1
  285. package/src/client/public/default/favicon-16x16.png +0 -0
  286. package/src/client/public/default/favicon-32x32.png +0 -0
  287. package/src/client/public/default/favicon-48x48.png +0 -0
  288. package/src/client/public/default/favicon.ico +0 -0
  289. package/src/client/public/default/manifest.webmanifest +5 -5
  290. package/src/client/public/default/mstile-144x144.png +0 -0
  291. package/src/client/public/default/mstile-150x150.png +0 -0
  292. package/src/client/public/default/mstile-310x150.png +0 -0
  293. package/src/client/public/default/mstile-310x310.png +0 -0
  294. package/src/client/public/default/mstile-70x70.png +0 -0
  295. package/src/client/public/default/yandex-browser-50x50.png +0 -0
  296. package/src/client/public/default/yandex-browser-manifest.json +1 -1
  297. package/src/client/services/cyberia-instance/cyberia-instance.service.js +40 -0
  298. package/src/client/services/object-layer/object-layer.management.js +4 -4
  299. package/src/client/ssr/RootDocument.js +1 -1
  300. package/src/client/ssr/body/404.js +1 -1
  301. package/src/client/ssr/body/500.js +1 -1
  302. package/src/client/ssr/body/CacheControl.js +1 -1
  303. package/src/client/ssr/body/CyberiaDefaultSplashScreen.js +1 -1
  304. package/src/client/ssr/body/DefaultSplashScreen.js +1 -1
  305. package/src/client/ssr/body/SwaggerDarkMode.js +1 -1
  306. package/src/client/ssr/body/UnderpostDefaultSplashScreen.js +1 -1
  307. package/src/client/ssr/head/CryptokoynScripts.js +1 -1
  308. package/src/client/ssr/head/Css.js +1 -1
  309. package/src/client/ssr/head/CyberiaPortalScripts.js +1 -1
  310. package/src/client/ssr/head/DefaultScripts.js +1 -1
  311. package/src/client/ssr/head/ItemledgerScripts.js +1 -1
  312. package/src/client/ssr/head/Microdata.js +1 -1
  313. package/src/client/ssr/head/Production.js +1 -1
  314. package/src/client/ssr/head/Pwa.js +1 -1
  315. package/src/client/ssr/head/PwaItemledger.js +1 -1
  316. package/src/client/ssr/head/Seo.js +1 -1
  317. package/src/client/ssr/head/UnderpostScripts.js +1 -1
  318. package/src/client/ssr/mailer/DefaultRecoverEmail.js +1 -1
  319. package/src/client/ssr/mailer/DefaultVerifyEmail.js +1 -1
  320. package/src/client/ssr/views/Cyberia404.js +7 -5
  321. package/src/client/ssr/views/CyberiaServerMetrics.js +1 -1
  322. package/src/client/ssr/views/Maintenance.js +1 -1
  323. package/src/client/ssr/views/NoNetworkConnection.js +1 -1
  324. package/src/client/ssr/views/Test.js +1 -1
  325. package/src/client/sw/core.sw.js +20 -14
  326. package/src/client-builder/client-build-docs.js +61 -46
  327. package/src/client-builder/client-build-live.js +2 -2
  328. package/src/client-builder/client-build.js +58 -44
  329. package/src/client-builder/client-dev-server.js +3 -3
  330. package/src/client-builder/client-icons.js +2 -2
  331. package/src/client-builder/ssr.js +3 -3
  332. package/src/client.build.js +3 -6
  333. package/src/client.dev.js +3 -6
  334. package/src/db/DataBaseProvider.js +186 -3
  335. package/src/db/mariadb/MariaDB.js +3 -2
  336. package/src/db/mongo/MongoBootstrap.js +273 -101
  337. package/src/db/mongo/MongooseDB.js +11 -8
  338. package/src/{server/valkey.js → db/valkey/Valkey.js} +5 -4
  339. package/src/grpc/cyberia/grpc-server.js +1 -1
  340. package/src/index.js +103 -23
  341. package/src/mailer/EmailRender.js +2 -2
  342. package/src/mailer/MailerInterceptor.js +87 -0
  343. package/src/mailer/MailerProvider.js +50 -6
  344. package/src/projects/cyberia/atlas-sprite-sheet-generator.js +1 -1
  345. package/src/projects/cyberia/besu-genesis-generator.js +3 -3
  346. package/src/projects/cyberia/catalog-cyberia.js +54 -6
  347. package/src/projects/cyberia/gemini-client.js +1 -1
  348. package/src/projects/cyberia/generate-saga.js +15 -24
  349. package/src/projects/cyberia/hot-reload-trigger.js +1 -1
  350. package/src/projects/cyberia/instance-data.js +22 -3
  351. package/src/projects/cyberia/ipfs-client.js +4 -4
  352. package/src/projects/cyberia/map-preview-generator.js +1 -1
  353. package/src/projects/cyberia/object-layer.js +12 -22
  354. package/src/projects/cyberia/semantic-layer-generator.js +1 -1
  355. package/src/projects/underpost/catalog-underpost.js +13 -2
  356. package/src/proxy.js +4 -7
  357. package/src/runtime/cyberia-client/Dockerfile +9 -4
  358. package/src/runtime/cyberia-client/Dockerfile.dev +8 -2
  359. package/src/runtime/cyberia-server/Dockerfile +9 -4
  360. package/src/runtime/cyberia-server/Dockerfile.dev +8 -2
  361. package/src/runtime/engine-cyberia/Dockerfile +25 -9
  362. package/src/runtime/engine-cyberia/Dockerfile.dev +25 -9
  363. package/src/runtime/engine-cyberia/Dockerfile.test +4 -4
  364. package/src/runtime/engine-cyberia/compose.env +16 -0
  365. package/src/runtime/engine-cyberia/docker-compose.yml +31 -37
  366. package/src/runtime/express/Express.js +32 -27
  367. package/src/runtime/lampp/Lampp.js +22 -70
  368. package/src/runtime/nginx/Nginx.js +1 -1
  369. package/src/runtime/wp/Wp.js +16 -48
  370. package/src/server/{catalog.js → build/catalog.js} +15 -5
  371. package/src/server/build/coverage.js +117 -0
  372. package/src/server/build/execution.js +402 -0
  373. package/src/server/build/package.js +465 -0
  374. package/src/server/build/testing.js +528 -0
  375. package/src/server/{dns.js → network/dns.js} +241 -14
  376. package/src/server/network/forward-proxy.js +541 -0
  377. package/src/server/{middlewares.js → network/middlewares.js} +59 -4
  378. package/src/server/network/node-capability.js +98 -0
  379. package/src/server/{peer.js → network/peer.js} +3 -3
  380. package/src/server/{proxy.js → network/proxy.js} +7 -13
  381. package/src/server/network/router.js +356 -0
  382. package/src/server/{tls.js → network/tls.js} +2 -2
  383. package/src/server/network/underpost-compression.js +186 -0
  384. package/src/server/{underpost-gateway.js → network/underpost-gateway.js} +26 -16
  385. package/src/server/{underpost-ingress.js → network/underpost-ingress.js} +19 -3
  386. package/src/server/{cri.js → ops/cri.js} +2 -2
  387. package/src/server/ops/cron.js +949 -0
  388. package/src/server/ops/event-notification.js +284 -0
  389. package/src/server/{logger.js → ops/logger.js} +108 -23
  390. package/src/server/ops/monitoring.js +1724 -0
  391. package/src/server/ops/systemd.js +259 -0
  392. package/src/server/{conf.js → runtime/conf.js} +521 -520
  393. package/src/server/runtime/config-scope.js +215 -0
  394. package/src/server/runtime/environment.js +149 -0
  395. package/src/server/{process.js → runtime/process.js} +153 -13
  396. package/src/server/{runtime-status.js → runtime/runtime-status.js} +155 -16
  397. package/src/server/{runtime.js → runtime/runtime.js} +12 -8
  398. package/src/server/{start.js → runtime/start.js} +128 -39
  399. package/src/server/{auth.js → security/auth.js} +7 -8
  400. package/src/server/security/container-storage.js +382 -0
  401. package/src/server/{crypto.js → security/crypto.js} +1 -1
  402. package/src/server/security/selinux.js +185 -0
  403. package/src/server/{backup.js → storage/backup.js} +17 -8
  404. package/src/server/{data-query.js → storage/data-query.js} +1 -1
  405. package/src/server/{downloader.js → storage/downloader.js} +2 -2
  406. package/src/server/storage/repository.js +68 -0
  407. package/src/server.js +4 -7
  408. package/src/ws/IoInterface.js +1 -1
  409. package/src/ws/IoServer.js +1 -1
  410. package/src/ws/core/core.ws.connection.js +1 -1
  411. package/src/ws/core/core.ws.emit.js +1 -1
  412. package/src/ws/core/core.ws.server.js +1 -1
  413. package/src/ws/default/default.ws.connection.js +1 -1
  414. package/src/ws/default/default.ws.emit.js +1 -1
  415. package/src/ws/default/default.ws.server.js +1 -1
  416. package/test/e2e/event-e2e-public-ingress-down.js +45 -0
  417. package/test/e2e/event-e2e-wireguard-server-down.js +38 -0
  418. package/test/e2e/event-e2e-wireguard-spoke-down.js +40 -0
  419. package/test/{api.test.js → integration/app/api.test.js} +33 -14
  420. package/test/integration/app/cyberia/cyberia-cli-plain-reads.test.js +30 -0
  421. package/test/{cyberia-instance-conf-defaults.test.js → integration/app/cyberia/cyberia-instance-conf-defaults.test.js} +2 -1
  422. package/test/integration/app/cyberia/cyberia-load.test.js +467 -0
  423. package/test/integration/app/cyberia/fallback-world-capture.test.js +253 -0
  424. package/test/integration/app/cyberia/object-layer-item-id.test.js +327 -0
  425. package/test/{shape-generator.test.js → integration/app/cyberia/shape-generator.test.js} +1 -1
  426. package/test/integration/infra/1-security/config-scope.test.js +305 -0
  427. package/test/integration/infra/1-security/container-storage.test.js +356 -0
  428. package/test/integration/infra/1-security/in-pod-cli-surface.test.js +86 -0
  429. package/test/integration/infra/1-security/secret-onboarding.test.js +930 -0
  430. package/test/integration/infra/1-security/selinux.test.js +69 -0
  431. package/test/{sops-secret-store.test.js → integration/infra/1-security/sops-secret-store.test.js} +415 -61
  432. package/test/integration/infra/1-security/systemd-service.test.js +70 -0
  433. package/test/integration/infra/1-security/underpost-config-secret.test.js +367 -0
  434. package/test/integration/infra/2-network/dns-firewall.test.js +566 -0
  435. package/test/integration/infra/2-network/node-capability.test.js +182 -0
  436. package/test/integration/infra/2-network/wireguard-cli.test.js +1163 -0
  437. package/test/integration/infra/2-network/wireguard-edge.test.js +1731 -0
  438. package/test/{cluster-instances.test.js → integration/infra/3-cluster/cluster-instances.test.js} +11 -15
  439. package/test/{deploy-node-placement.test.js → integration/infra/3-cluster/deploy-node-placement.test.js} +3 -3
  440. package/test/integration/infra/3-cluster/docker-compose-stack.test.js +313 -0
  441. package/test/integration/infra/4-ingress/deploy-routes.test.js +379 -0
  442. package/test/integration/infra/4-ingress/gateway-static-assets.test.js +453 -0
  443. package/test/{instance-traffic-plan.test.js → integration/infra/4-ingress/instance-traffic-plan.test.js} +10 -6
  444. package/test/{underpost-gateway.test.js → integration/infra/4-ingress/underpost-gateway.test.js} +47 -6
  445. package/test/{underpost-ingress.test.js → integration/infra/4-ingress/underpost-ingress.test.js} +56 -4
  446. package/test/integration/infra/5-observability/cron-jobs.test.js +652 -0
  447. package/test/{deploy-monitor.test.js → integration/infra/5-observability/deploy-monitor.test.js} +29 -31
  448. package/test/integration/infra/5-observability/event-notification.test.js +197 -0
  449. package/test/integration/infra/5-observability/event-remediation.test.js +502 -0
  450. package/test/integration/infra/5-observability/event-targets.test.js +1174 -0
  451. package/test/integration/infra/5-observability/monitoring-stack.test.js +902 -0
  452. package/test/support/shell-harness.js +73 -0
  453. package/test/unit/build-template.test.js +97 -0
  454. package/test/unit/build-workflow-offline.test.js +132 -0
  455. package/test/unit/catalog.test.js +71 -0
  456. package/test/unit/client-build-docs.test.js +334 -0
  457. package/test/unit/conf-loading.test.js +303 -0
  458. package/test/unit/conf-resolution.test.js +979 -0
  459. package/test/unit/coverage-artifact.test.js +130 -0
  460. package/test/{crypto.test.js → unit/crypto.test.js} +1 -1
  461. package/test/unit/deploy-env-resolution.test.js +38 -0
  462. package/test/unit/deploy-log-table.test.js +447 -0
  463. package/test/unit/execution-profiles.test.js +219 -0
  464. package/test/unit/fleet-sync-source.test.js +149 -0
  465. package/test/unit/logger-redaction.test.js +112 -0
  466. package/test/unit/package.test.js +403 -0
  467. package/test/unit/prepare-host.test.js +299 -0
  468. package/test/unit/process-environment.test.js +18 -0
  469. package/test/unit/propagation-message.test.js +78 -0
  470. package/test/unit/redeploy-plan.test.js +24 -0
  471. package/test/unit/release-bump.test.js +474 -0
  472. package/test/unit/ssh-output-redaction.test.js +28 -0
  473. package/test/unit/start-options.test.js +46 -0
  474. package/test/unit/test-tiers.test.js +193 -0
  475. package/vitest.config.js +58 -0
  476. package/.nycrc +0 -9
  477. package/manifests/cronjobs/dd-cron/dd-cron-dns.yaml +0 -48
  478. package/manifests/mongodb/pv-pvc.yaml +0 -59
  479. package/scripts/link-local-underpost-cli.sh +0 -6
  480. package/src/api/user/user.build.js +0 -16
  481. package/src/cli/env.js +0 -177
  482. package/src/client/components/core/Blockchain.js +0 -41
  483. package/src/client/components/core/Blog.js +0 -9
  484. package/src/client/components/core/KeyboardAvoidance.js +0 -145
  485. package/src/client/public/default/assets/background/dark.jpg +0 -0
  486. package/src/client/public/default/assets/background/white0-min.jpg +0 -0
  487. package/src/client/public/default/assets/background/white0.jpg +0 -0
  488. package/src/client/public/doc/favicon.ico +0 -0
  489. package/src/client/public/doc/sitemap +0 -148
  490. package/src/server/cron.js +0 -476
@@ -1,17 +1,18 @@
1
1
  import { Css, darkTheme, simpleIconsRender, ThemeEvents, Themes } from './Css.js';
2
2
  import { Modal, renderViewTitle } from './Modal.js';
3
+ import { coverallsUrl, githubPagesUrl, githubUrl, packageRepository } from './Repository.js';
4
+ import { Responsive } from './Responsive.js';
3
5
  import { listenQueryPathInstance, setQueryPath, closeModalRouteChangeEvent, getProxyPath } from './Router.js';
4
6
  import { s, sIframe } from './VanillaJs.js';
5
7
  // https://mintlify.com/docs/quickstart
6
8
  class Docs {
7
- static async RenderModal(type) {
9
+ static async RenderModal(type, parentModalId = 'modal-docs') {
8
10
  const docData = Docs.Data.find((d) => d.type === type);
11
+ const parentModal = Modal.Data[parentModalId];
12
+ if (!docData || !parentModal?.options) return;
9
13
  const ModalId = `modal-docs-${docData.type}`;
10
14
  const { barConfig } = await Themes[Css.currentTheme]();
11
- const parentBarMode =
12
- Modal.Data['modal-docs'] && Modal.Data['modal-docs'].options.barMode
13
- ? Modal.Data['modal-docs'].options.barMode
14
- : undefined;
15
+ const parentBarMode = parentModal.options.barMode;
15
16
  await Modal.instance({
16
17
  barConfig,
17
18
  title: renderViewTitle(docData),
@@ -25,14 +26,12 @@ class Docs {
25
26
  border: none;
26
27
  background: white;
27
28
  display: block;
29
+ /* The frame is the only scroll container; the modal body must not
30
+ gain one of its own from the height set on load. */
31
+ overflow: auto;
28
32
  }
29
33
  </style>
30
- <iframe
31
- class="in iframe-${ModalId}"
32
- src="${docData.url()}"
33
- sandbox="allow-same-origin allow-scripts allow-popups allow-forms allow-popups-to-escape-sandbox allow-top-navigation"
34
- >
35
- </iframe>
34
+ <iframe class="in iframe-${ModalId}" src="${docData.url()}"> </iframe>
36
35
  `;
37
36
  },
38
37
  maximize: true,
@@ -42,7 +41,7 @@ class Docs {
42
41
  observer: true,
43
42
  barMode: parentBarMode,
44
43
  query: true,
45
- RouterInstance: Modal.Data['modal-docs'].options.RouterInstance,
44
+ RouterInstance: parentModal.options.RouterInstance,
46
45
  });
47
46
  const iframeEl = s(`.iframe-${ModalId}`);
48
47
  let swaggerThemeEventKey = null;
@@ -65,48 +64,49 @@ class Docs {
65
64
  } catch (e) {
66
65
  // cross-origin or security restriction — safe to ignore
67
66
  }
68
- // Keep the parent window scroll untouched.
69
- // These modals are fixed-position; scrolling the parent on iframe navigation
70
- // shifts Chrome layout calculations and leaves view modals offset by 50px.
71
- // Bind Shift+K inside the iframe to focus the parent SearchBox (mirrors app-wide shortcut)
67
+ // These modals are fixed-position; scrolling the parent on iframe
68
+ // navigation shifts Chrome layout calculations and leaves view modals
69
+ // offset by 50px, so deep links re-sync the layout instead.
72
70
  try {
73
71
  const iframeWin = iframeEl.contentWindow;
74
72
  const iframeDoc = iframeEl.contentDocument || iframeEl.contentWindow?.document;
75
73
  if (iframeDoc) {
74
+ // The frame re-runs this on every in-frame navigation; without
75
+ // releasing the previous document's listeners they accumulate for
76
+ // the lifetime of the modal.
76
77
  if (unbindIframeLayoutSync) unbindIframeLayoutSync();
77
78
  const onIframeAnchorClick = (e) => {
78
- if (e.target && e.target.closest && e.target.closest('a')) {
79
- scheduleViewLayoutSync();
80
- }
79
+ if (e.target?.closest?.('a')) scheduleViewLayoutSync();
81
80
  };
82
81
  const onIframeHashChange = () => scheduleViewLayoutSync();
83
82
  const onIframePopState = () => scheduleViewLayoutSync();
83
+ // Mirrors the app-wide shortcut: the frame owns focus, so the parent
84
+ // never sees the keystroke unless the frame forwards it.
85
+ const onIframeSearchShortcut = (e) => {
86
+ if (!e.shiftKey || e.key?.toLowerCase() !== 'k') return;
87
+ const searchBox = s(`.top-bar-search-box`);
88
+ if (!searchBox) return;
89
+ e.preventDefault();
90
+ e.stopPropagation();
91
+ if (s(`.main-body-btn-ui-close`)?.classList.contains('hide')) s(`.main-body-btn-ui-open`).click();
92
+ searchBox.blur();
93
+ searchBox.focus();
94
+ searchBox.select();
95
+ };
84
96
  iframeDoc.addEventListener('click', onIframeAnchorClick, true);
97
+ iframeDoc.addEventListener('keydown', onIframeSearchShortcut);
85
98
  if (iframeWin) {
86
99
  iframeWin.addEventListener('hashchange', onIframeHashChange);
87
100
  iframeWin.addEventListener('popstate', onIframePopState);
88
101
  }
89
102
  unbindIframeLayoutSync = () => {
90
103
  iframeDoc.removeEventListener('click', onIframeAnchorClick, true);
104
+ iframeDoc.removeEventListener('keydown', onIframeSearchShortcut);
91
105
  if (iframeWin) {
92
106
  iframeWin.removeEventListener('hashchange', onIframeHashChange);
93
107
  iframeWin.removeEventListener('popstate', onIframePopState);
94
108
  }
95
109
  };
96
- iframeDoc.addEventListener('keydown', (e) => {
97
- if (e.shiftKey && e.key.toLowerCase() === 'k') {
98
- e.preventDefault();
99
- e.stopPropagation();
100
- if (s(`.top-bar-search-box`)) {
101
- if (s(`.main-body-btn-ui-close`) && s(`.main-body-btn-ui-close`).classList.contains('hide')) {
102
- s(`.main-body-btn-ui-open`).click();
103
- }
104
- s(`.top-bar-search-box`).blur();
105
- s(`.top-bar-search-box`).focus();
106
- s(`.top-bar-search-box`).select();
107
- }
108
- }
109
- });
110
110
  }
111
111
  } catch (e) {
112
112
  // cross-origin or security restriction — safe to ignore
@@ -159,19 +159,31 @@ class Docs {
159
159
  };
160
160
  }
161
161
  }
162
+ // The iframe is sized to the modal body rather than left to grow: an
163
+ // auto-height iframe inside a fixed-height modal scrolls the modal and the
164
+ // document it holds, which is where the double scrollbar comes from.
165
+ const resizeIframe = () => {
166
+ const frame = s(`.iframe-${ModalId}`);
167
+ const modalEl = s(`.${ModalId}`);
168
+ if (!frame || !modalEl) return;
169
+ const barEl = s(`.bar-default-modal-${ModalId}`);
170
+ const barHeight = barEl ? barEl.offsetHeight : Modal.headerTitleHeight;
171
+ frame.style.height = `${Math.max(modalEl.offsetHeight - barHeight, 0)}px`;
172
+ };
173
+
162
174
  Modal.Data[ModalId].onObserverListener[ModalId] = () => {
163
- if (s(`.iframe-${ModalId}`)) {
164
- const barEl = s(`.bar-default-modal-${ModalId}`);
165
- const barHeight = barEl ? barEl.offsetHeight : Modal.headerTitleHeight;
166
- s(`.iframe-${ModalId}`).style.height = `${s(`.${ModalId}`).offsetHeight - barHeight}px`;
167
- }
175
+ resizeIframe();
168
176
  if (type.match('coverage')) {
169
177
  simpleIconsRender(`.doc-icon-coverage`);
170
178
  simpleIconsRender(`.doc-icon-coverage-link`);
171
179
  }
172
180
  };
173
181
  Modal.Data[ModalId].onObserverListener[ModalId]();
182
+ // The observer fires on modal mutations, not on viewport changes; a rotate
183
+ // or a window drag leaves the frame at its old height without this.
184
+ Responsive.onChanged(resizeIframe, { key: ModalId });
174
185
  Modal.Data[ModalId].onCloseListener[ModalId] = () => {
186
+ Responsive.offChanged(ModalId);
175
187
  if (unbindIframeLayoutSync) unbindIframeLayoutSync();
176
188
  if (swaggerThemeEventKey) delete ThemeEvents[swaggerThemeEventKey];
177
189
  closeModalRouteChangeEvent({ closedId: ModalId });
@@ -185,7 +197,7 @@ class Docs {
185
197
  url: function () {
186
198
  const tokenOpts = Docs.Tokens['modal-docs'];
187
199
  if (tokenOpts && tokenOpts.lastReleaseUrl) return tokenOpts.lastReleaseUrl();
188
- return `https://github.com/underpostnet/pwa-microservices-template-ghpkg/`;
200
+ return githubUrl(packageRepository());
189
201
  },
190
202
  },
191
203
  {
@@ -201,7 +213,7 @@ class Docs {
201
213
  url: function () {
202
214
  const tokenOpts = Docs.Tokens['modal-docs'];
203
215
  if (tokenOpts && tokenOpts.demoUrl) return tokenOpts.demoUrl();
204
- return `https://underpostnet.github.io/pwa-microservices-template-ghpkg/`;
216
+ return githubPagesUrl(packageRepository());
205
217
  },
206
218
  },
207
219
  {
@@ -238,7 +250,9 @@ class Docs {
238
250
  icon: html`<img height="20" width="20" class="doc-icon-coverage-link" />`,
239
251
  text: `Coverage`,
240
252
  url: function () {
241
- return `https://coveralls.io/github/underpostnet/engine`;
253
+ const tokenOpts = Docs.Tokens['modal-docs'];
254
+ if (tokenOpts && tokenOpts.coverageLinkUrl) return tokenOpts.coverageLinkUrl();
255
+ return coverallsUrl();
242
256
  },
243
257
  themeEvent: () => {
244
258
  if (s(`.doc-icon-coverage-link`)) setTimeout(() => simpleIconsRender(`.doc-icon-coverage-link`));
@@ -252,15 +266,15 @@ class Docs {
252
266
  setTimeout(() => {
253
267
  s(`.btn-docs-src`).onclick = async () => {
254
268
  setQueryPath({ path: 'docs', queryPath: 'src' });
255
- await Docs.RenderModal('src');
269
+ await Docs.RenderModal('src', idModal);
256
270
  };
257
271
  s(`.btn-docs-api`).onclick = async () => {
258
272
  setQueryPath({ path: 'docs', queryPath: 'api' });
259
- await Docs.RenderModal('api');
273
+ await Docs.RenderModal('api', idModal);
260
274
  };
261
275
  s(`.btn-docs-coverage`).onclick = async () => {
262
276
  setQueryPath({ path: 'docs', queryPath: 'coverage' });
263
- await Docs.RenderModal('coverage');
277
+ await Docs.RenderModal('coverage', idModal);
264
278
  };
265
279
  s(`.btn-docs-coverage-link`).onclick = () => {
266
280
  const docData = Docs.Data.find((d) => d.type === 'coverage-link');
@@ -296,183 +310,216 @@ class Docs {
296
310
  }
297
311
  // Build submenu items and populate — submenu system is owned by Modal
298
312
  Modal.subMenuPopulate('docs', await Modal.buildSubMenuItemsHtml('docs', Docs.Data, options));
299
- {
300
- const docsData = [
301
- {
302
- id: 'getting-started',
303
- icon: 'rocket',
304
- title: 'Getting Started',
305
- description: 'Learn the basics and get started with our platform',
306
- },
307
- {
308
- id: 'api-docs',
309
- icon: 'code',
310
- title: 'API Reference',
311
- description: 'Detailed documentation of our API endpoints',
312
- },
313
- {
314
- id: 'guides',
315
- icon: 'book',
316
- title: 'Guides',
317
- description: 'Step-by-step tutorials and how-to guides',
318
- },
319
- {
320
- id: 'demo',
321
- icon: 'laptop-code',
322
- title: 'Demo',
323
- description: 'Practical examples and code snippets',
324
- },
325
- {
326
- id: 'faq',
327
- icon: 'question-circle',
328
- title: 'FAQ',
329
- description: 'Frequently asked questions',
330
- },
331
- {
332
- id: 'community',
333
- icon: 'users',
334
- title: 'Community',
335
- description: 'Join our developer community',
336
- },
337
- ];
338
- return html`
339
- <style>
340
- .docs-landing {
341
- padding: 2rem;
342
- max-width: 1200px;
343
- margin: 0 auto;
344
- height: 100%;
345
- box-sizing: border-box;
346
- }
347
- .docs-header {
348
- text-align: center;
349
- margin-bottom: 3rem;
350
- opacity: 0;
351
- animation: fadeInUp 0.6s ease-out forwards;
352
- }
353
- .docs-header h1 {
354
- font-size: 2.5rem;
355
- margin: 0 0 1rem;
356
- line-height: 1.2;
357
- }
358
- .docs-header p {
359
- font-size: 1.2rem;
360
- max-width: 700px;
361
- margin: 0 auto 2rem;
362
- line-height: 1.6;
363
- }
364
- .docs-grid {
365
- display: grid;
366
- grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
367
- gap: 1.5rem;
368
- margin: 0;
369
- padding: 0;
370
- list-style: none;
371
- }
372
- .docs-card-container {
373
- cursor: pointer;
374
- opacity: 0;
375
- margin-bottom: 3rem;
376
- animation: fadeInUp 0.6s ease-out forwards;
377
- }
378
- .docs-card {
379
- border-radius: 8px;
380
- padding: 1.5rem;
381
- display: flex;
382
- flex-direction: column;
383
- height: 100%;
384
- position: relative;
385
- transition: all 0.3s ease-in-out;
386
- }
387
313
 
388
- .card-icon {
389
- font-size: 1.75rem;
390
- width: 56px;
391
- height: 56px;
392
- border-radius: 12px;
393
- display: flex;
394
- align-items: center;
395
- justify-content: center;
396
- margin: 0 0 1.25rem;
397
- transition: transform 0.2s ease;
398
- }
314
+ const landingCards = [
315
+ {
316
+ id: 'getting-started',
317
+ icon: 'rocket',
318
+ title: 'Getting Started',
319
+ description: 'Learn the basics and get started with our platform',
320
+ docType: 'src',
321
+ },
322
+ {
323
+ id: 'api-docs',
324
+ icon: 'code',
325
+ title: 'API Reference',
326
+ description: 'Detailed documentation of our API endpoints',
327
+ docType: 'api',
328
+ },
329
+ {
330
+ id: 'guides',
331
+ icon: 'book',
332
+ title: 'Guides',
333
+ description: 'Step-by-step tutorials and how-to guides',
334
+ docType: 'src',
335
+ },
336
+ {
337
+ id: 'demo',
338
+ icon: 'laptop-code',
339
+ title: 'Demo',
340
+ description: 'Practical examples and code snippets',
341
+ docType: 'demo',
342
+ },
343
+ {
344
+ id: 'faq',
345
+ icon: 'question-circle',
346
+ title: 'FAQ',
347
+ description: 'Frequently asked questions',
348
+ docType: 'src',
349
+ },
350
+ {
351
+ id: 'community',
352
+ icon: 'users',
353
+ title: 'Community',
354
+ description: 'Join our developer community',
355
+ docType: 'repo',
356
+ },
357
+ ];
358
+
359
+ // A card resolves to a documented entry, never to a URL of its own: the
360
+ // submenu button and the card must open the same place.
361
+ const openLandingCard = (docType) => {
362
+ const btn = s(`.btn-docs-${docType}`);
363
+ if (btn) return btn.click();
364
+ location.href = Docs.Data.find((d) => d.type === docType).url();
365
+ };
399
366
 
400
- .card-content {
401
- flex: 1;
367
+ setTimeout(() => {
368
+ for (const { id, docType } of landingCards) {
369
+ const cardEl = s(`.docs-card-container-${id}`);
370
+ if (!cardEl) continue;
371
+ cardEl.onclick = () => openLandingCard(docType);
372
+ // The card is a div, so the keyboard affordances a button would carry
373
+ // have to be declared and handled explicitly.
374
+ cardEl.onkeydown = (e) => {
375
+ if (e.key !== 'Enter' && e.key !== ' ') return;
376
+ e.preventDefault();
377
+ openLandingCard(docType);
378
+ };
379
+ }
380
+ });
381
+
382
+ return html`
383
+ <style>
384
+ .docs-landing {
385
+ padding: 2rem;
386
+ max-width: 1200px;
387
+ margin: 0 auto;
388
+ box-sizing: border-box;
389
+ }
390
+ .docs-header {
391
+ text-align: center;
392
+ margin-bottom: 3rem;
393
+ opacity: 0;
394
+ animation: fadeInUp 0.6s ease-out forwards;
395
+ }
396
+ .docs-header h1 {
397
+ font-size: 2.5rem;
398
+ margin: 0 0 1rem;
399
+ line-height: 1.2;
400
+ }
401
+ .docs-grid {
402
+ display: grid;
403
+ grid-template-columns: repeat(auto-fit, minmax(min(100%, 260px), 1fr));
404
+ gap: 1.5rem;
405
+ margin: 0;
406
+ padding: 0;
407
+ list-style: none;
408
+ }
409
+ .docs-card-container {
410
+ cursor: pointer;
411
+ opacity: 0;
412
+ animation: fadeInUp 0.6s ease-out forwards;
413
+ border-radius: 8px;
414
+ }
415
+ .docs-card-container:focus-visible {
416
+ outline: 2px solid currentColor;
417
+ outline-offset: 3px;
418
+ }
419
+ .docs-card {
420
+ border-radius: 8px;
421
+ padding: 1.5rem;
422
+ display: flex;
423
+ flex-direction: column;
424
+ height: 100%;
425
+ box-sizing: border-box;
426
+ transition:
427
+ transform 0.25s ease,
428
+ background 0.25s ease,
429
+ border-color 0.25s ease;
430
+ }
431
+ .docs-card-container:hover .docs-card,
432
+ .docs-card-container:focus-visible .docs-card {
433
+ transform: translateY(-4px);
434
+ }
435
+ .card-icon {
436
+ font-size: 1.75rem;
437
+ width: 56px;
438
+ height: 56px;
439
+ border-radius: 12px;
440
+ display: flex;
441
+ align-items: center;
442
+ justify-content: center;
443
+ margin: 0 0 1.25rem;
444
+ transition: transform 0.25s ease;
445
+ }
446
+ .docs-card-container:hover .card-icon {
447
+ transform: scale(1.08);
448
+ }
449
+ .card-content {
450
+ flex: 1;
451
+ }
452
+ .card-content h3 {
453
+ margin: 0 0 0.5rem;
454
+ font-size: 1.25rem;
455
+ font-weight: 600;
456
+ }
457
+ .card-content p {
458
+ margin: 0;
459
+ font-size: 0.95rem;
460
+ line-height: 1.5;
461
+ opacity: 0.85;
462
+ }
463
+ @media (prefers-reduced-motion: reduce) {
464
+ .docs-header,
465
+ .docs-card-container {
466
+ animation: none;
467
+ opacity: 1;
402
468
  }
403
- .card-content h3 {
404
- margin: 0 0 0.5rem;
405
- font-size: 1.25rem;
406
- font-weight: 600;
469
+ .docs-card,
470
+ .card-icon {
471
+ transition: none;
407
472
  }
408
- .card-content p {
409
- margin: 0;
410
- font-size: 0.95rem;
411
- transition: color 0.3s ease;
473
+ .docs-card-container:hover .docs-card,
474
+ .docs-card-container:hover .card-icon {
475
+ transform: none;
412
476
  }
413
- </style>
477
+ }
478
+ </style>
479
+
480
+ <style>
481
+ ${landingCards
482
+ .map(
483
+ (_, index) => css`
484
+ .docs-card-container:nth-child(${index + 1}) {
485
+ animation-delay: ${0.1 * (index + 1)}s;
486
+ }
487
+ `,
488
+ )
489
+ .join('')}
490
+ </style>
491
+
492
+ <div class="docs-landing">
493
+ <div class="docs-header">
494
+ <h1>Documentation</h1>
495
+ </div>
414
496
 
415
- <style>
416
- ${docsData
497
+ <ul class="docs-grid">
498
+ ${landingCards
417
499
  .map(
418
- (_, index) => css`
419
- .docs-card-container:nth-child(${index + 1}) {
420
- animation-delay: ${0.1 * (index + 1)}s;
421
- }
500
+ ({ id, icon, title, description }) => html`
501
+ <div
502
+ class="in docs-card-container docs-card-container-${id}"
503
+ role="link"
504
+ tabindex="0"
505
+ aria-label="${title}: ${description}"
506
+ >
507
+ <li class="docs-card box-content-border hover">
508
+ <div class="card-icon">
509
+ <i class="fas fa-${icon}" aria-hidden="true"></i>
510
+ </div>
511
+ <div class="card-content">
512
+ <h3>${title}</h3>
513
+ <p>${description}</p>
514
+ </div>
515
+ </li>
516
+ </div>
422
517
  `,
423
518
  )
424
519
  .join('')}
425
- </style>
426
-
427
- <div class="docs-landing">
428
- <div class="docs-header">
429
- <h1>Documentation</h1>
430
- <!--
431
- <div class="search-bar">
432
- <i class="fas fa-search"></i>
433
- <input type="text" placeholder="Search documentation..." id="docs-search">
434
- </div>
435
- -->
436
- </div>
437
-
438
- <ul class="docs-grid">
439
- ${docsData
440
- .map((item) => {
441
- setTimeout(() => {
442
- if (s(`.docs-card-container-${item.id}`)) {
443
- s(`.docs-card-container-${item.id}`).onclick = () => {
444
- if (item.id.match('demo')) {
445
- const demoData = Docs.Data.find((d) => d.type === 'demo');
446
- location.href = demoData
447
- ? demoData.url()
448
- : 'https://underpostnet.github.io/pwa-microservices-template-ghpkg/';
449
- } else if (item.id.match('api')) {
450
- if (s(`.btn-docs-api`)) s(`.btn-docs-api`).click();
451
- } else {
452
- if (s(`.btn-docs-src`)) s(`.btn-docs-src`).click();
453
- }
454
- };
455
- }
456
- });
457
- return html`
458
- <div class="in docs-card-container docs-card-container-${item.id}">
459
- <li class="docs-card">
460
- <div class="card-icon">
461
- <i class="fas fa-${item.icon}"></i>
462
- </div>
463
- <div class="card-content">
464
- <h3>${item.title}</h3>
465
- <p>${item.description}</p>
466
- </div>
467
- </li>
468
- </div>
469
- `;
470
- })
471
- .join('')}
472
- </ul>
473
- </div>
474
- `;
475
- }
520
+ </ul>
521
+ </div>
522
+ `;
476
523
  }
477
524
  }
478
525
  export { Docs };
@@ -1231,27 +1231,6 @@ class FileExplorer {
1231
1231
  { headerName: '', width: 60, cellRenderer: LoadFolderActionsRenderer },
1232
1232
  ],
1233
1233
  rowSelection: 'single',
1234
- onSelectionChanged: (event) => {
1235
- return;
1236
- const selectedRows = AgGrid.grids[gridFolderId].getSelectedRows();
1237
- console.log('selectedRows', { event, selectedRows });
1238
- if (selectedRows[0]) {
1239
- const newLocation = selectedRows[0].location;
1240
- if (newLocation === location) return;
1241
- location = newLocation;
1242
- setPath(`${window.location.pathname}?location=${location}`);
1243
- s(`.file-explorer-query-nav`).value = location;
1244
- const format = FileExplorer.documentDataFormat({ document: documentInstance, location });
1245
- files = format.files;
1246
- folders = format.folders;
1247
- applySearchFilter();
1248
- currentPage = 0;
1249
- displayedFiles = getPagedFiles();
1250
- AgGrid.grids[gridFileId].setGridOption('rowData', displayedFiles);
1251
- AgGrid.grids[gridFolderId].setGridOption('rowData', folders);
1252
- updatePaginationUI();
1253
- }
1254
- },
1255
1234
  },
1256
1235
  })}
1257
1236
  </div>
@@ -734,7 +734,7 @@ class PanelForm {
734
734
  panelData.loading = false;
735
735
  LoadingAnimation.spinner.stop(`.panel-placeholder-bottom-${idPanel}`);
736
736
  };
737
- const renderSrrPanelData = async () =>
737
+ const renderSSRPanelData = async () =>
738
738
  await panelRender({
739
739
  data: range(0, 0).map((i) => ({
740
740
  id: i,
@@ -827,7 +827,7 @@ class PanelForm {
827
827
  // Always reset skip to 0 when reloading (whether cid exists or not)
828
828
  PanelForm.Data[idPanel].skip = 0;
829
829
  const containerSelector = `.${options.parentIdModal ? 'html-' + options.parentIdModal : 'main-body'}`;
830
- htmls(containerSelector, await renderSrrPanelData());
830
+ htmls(containerSelector, await renderSSRPanelData());
831
831
  await getPanelData();
832
832
  htmls(
833
833
  containerSelector,
@@ -906,10 +906,10 @@ class PanelForm {
906
906
  };
907
907
  }
908
908
  if (options.parentIdModal) {
909
- htmls(`.html-${options.parentIdModal}`, await renderSrrPanelData());
909
+ htmls(`.html-${options.parentIdModal}`, await renderSSRPanelData());
910
910
  return '';
911
911
  }
912
- return await renderSrrPanelData();
912
+ return await renderSSRPanelData();
913
913
  }
914
914
  }
915
915
  export { PanelForm };