cyberia 3.0.2 → 3.1.3

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 (182) hide show
  1. package/{.env.production → .env.example} +20 -2
  2. package/.github/workflows/engine-cyberia.cd.yml +41 -10
  3. package/.github/workflows/engine-cyberia.ci.yml +53 -14
  4. package/.github/workflows/ghpkg.ci.yml +1 -1
  5. package/.github/workflows/gitlab.ci.yml +1 -1
  6. package/.github/workflows/hardhat.ci.yml +82 -0
  7. package/.github/workflows/npmpkg.ci.yml +37 -8
  8. package/.github/workflows/publish.ci.yml +5 -5
  9. package/.github/workflows/publish.cyberia.ci.yml +5 -5
  10. package/.github/workflows/pwa-microservices-template-page.cd.yml +3 -3
  11. package/.github/workflows/pwa-microservices-template-test.ci.yml +1 -1
  12. package/.github/workflows/release.cd.yml +3 -2
  13. package/.vscode/extensions.json +9 -8
  14. package/.vscode/settings.json +3 -2
  15. package/CHANGELOG.md +533 -290
  16. package/CLI-HELP.md +79 -53
  17. package/WHITE-PAPER.md +1540 -0
  18. package/bin/build.js +16 -11
  19. package/bin/cyberia.js +959 -8
  20. package/bin/deploy.js +103 -270
  21. package/bin/file.js +2 -1
  22. package/bin/index.js +959 -8
  23. package/bin/vs.js +3 -3
  24. package/conf.js +277 -77
  25. package/deployment.yaml +218 -4
  26. package/hardhat/.env.example +31 -0
  27. package/hardhat/README.md +531 -0
  28. package/hardhat/WHITE-PAPER.md +1540 -0
  29. package/hardhat/contracts/ObjectLayerToken.sol +391 -0
  30. package/hardhat/deployments/.gitkeep +0 -0
  31. package/hardhat/deployments/hardhat-ObjectLayerToken.json +11 -0
  32. package/hardhat/hardhat.config.js +136 -0
  33. package/hardhat/ignition/modules/ObjectLayerToken.js +21 -0
  34. package/hardhat/networks/besu-object-layer.network.json +138 -0
  35. package/hardhat/package-lock.json +7628 -0
  36. package/hardhat/package.json +45 -0
  37. package/hardhat/scripts/deployObjectLayerToken.js +98 -0
  38. package/hardhat/test/ObjectLayerToken.js +590 -0
  39. package/jsdoc.dd-cyberia.json +59 -0
  40. package/jsdoc.json +20 -13
  41. package/manifests/cronjobs/dd-cron/dd-cron-backup.yaml +1 -1
  42. package/manifests/cronjobs/dd-cron/dd-cron-dns.yaml +1 -1
  43. package/manifests/deployment/dd-cyberia-development/deployment.yaml +490 -0
  44. package/manifests/deployment/dd-cyberia-development/proxy.yaml +261 -0
  45. package/manifests/deployment/dd-cyberia-development/pv-pvc.yaml +132 -0
  46. package/manifests/deployment/dd-default-development/deployment.yaml +2 -2
  47. package/manifests/deployment/dd-test-development/deployment.yaml +52 -52
  48. package/manifests/deployment/dd-test-development/proxy.yaml +4 -4
  49. package/manifests/pv-pvc-dd.yaml +1 -1
  50. package/package.json +60 -50
  51. package/proxy.yaml +128 -9
  52. package/pv-pvc.yaml +132 -0
  53. package/scripts/k3s-node-setup.sh +1 -1
  54. package/scripts/ports-ls.sh +2 -0
  55. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.controller.js +3 -1
  56. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.model.js +1 -2
  57. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.service.js +40 -7
  58. package/src/api/document/document.service.js +1 -1
  59. package/src/api/file/file.controller.js +3 -1
  60. package/src/api/file/file.service.js +28 -5
  61. package/src/api/ipfs/ipfs.service.js +2 -2
  62. package/src/api/object-layer/object-layer.controller.js +6 -2
  63. package/src/api/object-layer/object-layer.model.js +67 -21
  64. package/src/api/object-layer/object-layer.router.js +668 -42
  65. package/src/api/object-layer/object-layer.service.js +10 -16
  66. package/src/api/object-layer-render-frames/object-layer-render-frames.model.js +1 -2
  67. package/src/api/user/user.router.js +10 -5
  68. package/src/api/user/user.service.js +7 -7
  69. package/src/cli/baremetal.js +6 -10
  70. package/src/cli/cloud-init.js +0 -3
  71. package/src/cli/db.js +54 -71
  72. package/src/cli/deploy.js +64 -12
  73. package/src/cli/env.js +5 -5
  74. package/src/cli/fs.js +0 -2
  75. package/src/cli/image.js +0 -3
  76. package/src/cli/index.js +41 -13
  77. package/src/cli/monitor.js +5 -6
  78. package/src/cli/repository.js +329 -46
  79. package/src/cli/run.js +210 -122
  80. package/src/cli/secrets.js +1 -3
  81. package/src/cli/ssh.js +1 -1
  82. package/src/client/Itemledger.index.js +1 -959
  83. package/src/client/Underpost.index.js +36 -0
  84. package/src/client/components/core/AgGrid.js +20 -5
  85. package/src/client/components/core/Alert.js +2 -2
  86. package/src/client/components/core/Content.js +22 -3
  87. package/src/client/components/core/Docs.js +30 -6
  88. package/src/client/components/core/FileExplorer.js +71 -4
  89. package/src/client/components/core/Input.js +1 -1
  90. package/src/client/components/core/Modal.js +22 -6
  91. package/src/client/components/core/PublicProfile.js +3 -3
  92. package/src/client/components/core/RichText.js +1 -2
  93. package/src/client/components/core/Router.js +34 -1
  94. package/src/client/components/core/Worker.js +1 -1
  95. package/src/client/components/cryptokoyn/CssCryptokoyn.js +63 -1
  96. package/src/client/components/cyberia/ObjectLayerEngineModal.js +145 -119
  97. package/src/client/components/cyberia/ObjectLayerEngineViewer.js +64 -6
  98. package/src/client/components/cyberia-portal/CommonCyberiaPortal.js +1 -0
  99. package/src/client/components/cyberia-portal/CssCyberiaPortal.js +44 -2
  100. package/src/client/components/cyberia-portal/LogInCyberiaPortal.js +0 -1
  101. package/src/client/components/cyberia-portal/MenuCyberiaPortal.js +64 -2
  102. package/src/client/components/cyberia-portal/RoutesCyberiaPortal.js +1 -0
  103. package/src/client/components/itemledger/CssItemledger.js +62 -0
  104. package/src/client/components/underpost/CommonUnderpost.js +29 -0
  105. package/src/client/components/underpost/CssUnderpost.js +281 -0
  106. package/src/client/components/underpost/CyberpunkBloggerUnderpost.js +879 -0
  107. package/src/client/components/underpost/DocumentSearchProvider.js +448 -0
  108. package/src/client/components/underpost/ElementsUnderpost.js +38 -0
  109. package/src/client/components/underpost/LabGalleryUnderpost.js +82 -0
  110. package/src/client/components/underpost/LogInUnderpost.js +23 -0
  111. package/src/client/components/underpost/LogOutUnderpost.js +15 -0
  112. package/src/client/components/underpost/MenuUnderpost.js +691 -0
  113. package/src/client/components/underpost/RoutesUnderpost.js +47 -0
  114. package/src/client/components/underpost/SettingsUnderpost.js +16 -0
  115. package/src/client/components/underpost/SignUpUnderpost.js +9 -0
  116. package/src/client/components/underpost/SocketIoUnderpost.js +54 -0
  117. package/src/client/components/underpost/TranslateUnderpost.js +10 -0
  118. package/src/client/public/cryptokoyn/assets/logo/base-icon.png +0 -0
  119. package/src/client/public/cryptokoyn/browserconfig.xml +12 -0
  120. package/src/client/public/cryptokoyn/microdata.json +85 -0
  121. package/src/client/public/cryptokoyn/site.webmanifest +57 -0
  122. package/src/client/public/cryptokoyn/sitemap +3 -3
  123. package/src/client/public/default/sitemap +3 -3
  124. package/src/client/public/itemledger/browserconfig.xml +2 -2
  125. package/src/client/public/itemledger/manifest.webmanifest +4 -4
  126. package/src/client/public/itemledger/microdata.json +71 -0
  127. package/src/client/public/itemledger/sitemap +3 -3
  128. package/src/client/public/itemledger/yandex-browser-manifest.json +2 -2
  129. package/src/client/public/test/sitemap +3 -3
  130. package/src/client/services/object-layer/object-layer.management.js +23 -4
  131. package/src/client/ssr/body/404.js +15 -11
  132. package/src/client/ssr/body/500.js +15 -11
  133. package/src/client/ssr/body/SwaggerDarkMode.js +285 -0
  134. package/src/client/ssr/body/UnderpostDefaultSplashScreen.js +83 -0
  135. package/src/client/ssr/head/PwaItemledger.js +60 -0
  136. package/src/client/ssr/head/UnderpostScripts.js +6 -0
  137. package/src/client/ssr/offline/NoNetworkConnection.js +11 -10
  138. package/src/client/ssr/pages/Test.js +11 -10
  139. package/src/client.build.js +0 -3
  140. package/src/client.dev.js +0 -3
  141. package/src/db/DataBaseProvider.js +17 -2
  142. package/src/db/mariadb/MariaDB.js +14 -9
  143. package/src/db/mongo/MongooseDB.js +17 -1
  144. package/src/index.js +1 -1
  145. package/src/proxy.js +0 -3
  146. package/src/runtime/express/Express.js +15 -9
  147. package/src/runtime/lampp/Lampp.js +6 -13
  148. package/src/server/auth.js +12 -14
  149. package/src/server/backup.js +2 -3
  150. package/src/server/besu-genesis-generator.js +1630 -0
  151. package/src/server/client-build-docs.js +126 -17
  152. package/src/server/client-build-live.js +9 -18
  153. package/src/server/client-build.js +203 -75
  154. package/src/server/client-dev-server.js +14 -13
  155. package/src/server/conf.js +376 -164
  156. package/src/server/cron.js +2 -1
  157. package/src/server/dns.js +28 -12
  158. package/src/server/downloader.js +0 -2
  159. package/src/server/logger.js +27 -9
  160. package/src/server/object-layer.js +92 -16
  161. package/src/server/peer.js +0 -2
  162. package/src/server/process.js +1 -50
  163. package/src/server/proxy.js +4 -8
  164. package/src/server/runtime.js +5 -8
  165. package/src/server/semantic-layer-generator.js +1 -0
  166. package/src/server/ssr.js +0 -3
  167. package/src/server/start.js +19 -12
  168. package/src/server/tls.js +0 -2
  169. package/src/server.js +0 -4
  170. package/.env.development +0 -43
  171. package/.env.test +0 -43
  172. package/hardhat/contracts/CryptoKoyn.sol +0 -59
  173. package/hardhat/contracts/ItemLedger.sol +0 -73
  174. package/hardhat/contracts/Lock.sol +0 -34
  175. package/hardhat/hardhat.config.cjs +0 -45
  176. package/hardhat/ignition/modules/Lock.js +0 -18
  177. package/hardhat/networks/cryptokoyn-itemledger.network.json +0 -29
  178. package/hardhat/scripts/deployCryptokoyn.cjs +0 -25
  179. package/hardhat/scripts/deployItemledger.cjs +0 -25
  180. package/hardhat/test/Lock.js +0 -126
  181. package/hardhat/white-paper.md +0 -581
  182. package/white-paper.md +0 -581
@@ -0,0 +1,285 @@
1
+ const swaggerDarkCss = css`
2
+ /* ── Toggle button ── */
3
+ .swagger-ui .topbar-wrapper {
4
+ display: flex;
5
+ align-items: center;
6
+ }
7
+ .swagger-theme-toggle-btn {
8
+ background: rgba(255, 255, 255, 0.12);
9
+ border: 1px solid rgba(255, 255, 255, 0.3);
10
+ color: #fff;
11
+ padding: 5px 14px;
12
+ border-radius: 4px;
13
+ cursor: pointer;
14
+ font-size: 13px;
15
+ margin-left: auto;
16
+ margin-right: 16px;
17
+ white-space: nowrap;
18
+ transition: background 0.2s ease;
19
+ }
20
+ .swagger-theme-toggle-btn:hover {
21
+ background: rgba(255, 255, 255, 0.25);
22
+ }
23
+
24
+ /* ── Dark mode overrides — black/gray gradients ── */
25
+ body.swagger-dark {
26
+ background: #0f0f0f;
27
+ }
28
+ body.swagger-dark .swagger-ui {
29
+ background: #0f0f0f;
30
+ }
31
+ body.swagger-dark .swagger-ui .wrapper {
32
+ background: #0f0f0f;
33
+ }
34
+
35
+ /* Info block */
36
+ body.swagger-dark .swagger-ui .info .title,
37
+ body.swagger-dark .swagger-ui .info h1,
38
+ body.swagger-dark .swagger-ui .info h2,
39
+ body.swagger-dark .swagger-ui .info h3,
40
+ body.swagger-dark .swagger-ui .info p,
41
+ body.swagger-dark .swagger-ui .info li,
42
+ body.swagger-dark .swagger-ui .info a {
43
+ color: #e8e8e8;
44
+ }
45
+
46
+ /* Scheme / server selector bar */
47
+ body.swagger-dark .swagger-ui .scheme-container {
48
+ background: linear-gradient(180deg, #1a1a1a 0%, #222222 100%);
49
+ box-shadow: 0 1px 0 #383838;
50
+ }
51
+ body.swagger-dark .swagger-ui select {
52
+ background: #2a2a2a;
53
+ color: #e8e8e8;
54
+ border-color: #383838;
55
+ }
56
+
57
+ /* Operation tags */
58
+ body.swagger-dark .swagger-ui .opblock-tag {
59
+ color: #e8e8e8;
60
+ border-color: #383838;
61
+ }
62
+ body.swagger-dark .swagger-ui .opblock-tag small {
63
+ color: #a8a8a8;
64
+ }
65
+ body.swagger-dark .swagger-ui .opblock-tag:hover {
66
+ background: rgba(255, 255, 255, 0.04);
67
+ }
68
+
69
+ /* Operation blocks */
70
+ body.swagger-dark .swagger-ui .opblock {
71
+ background: linear-gradient(180deg, #161616 0%, #1e1e1e 100%);
72
+ border-color: #383838;
73
+ }
74
+ body.swagger-dark .swagger-ui .opblock .opblock-summary {
75
+ border-color: #383838;
76
+ }
77
+ body.swagger-dark .swagger-ui .opblock .opblock-summary-description,
78
+ body.swagger-dark .swagger-ui .opblock .opblock-summary-operation-id {
79
+ color: #a8a8a8;
80
+ }
81
+ body.swagger-dark .swagger-ui .opblock-body {
82
+ background: #0f0f0f;
83
+ }
84
+ body.swagger-dark .swagger-ui .opblock-description-wrapper p,
85
+ body.swagger-dark .swagger-ui .opblock-external-docs-wrapper p {
86
+ color: #a8a8a8;
87
+ }
88
+ body.swagger-dark .swagger-ui .opblock-section-header {
89
+ background: linear-gradient(180deg, #1a1a1a 0%, #222222 100%);
90
+ border-color: #383838;
91
+ }
92
+ body.swagger-dark .swagger-ui .opblock-section-header h4 {
93
+ color: #e8e8e8;
94
+ }
95
+
96
+ /* Models section */
97
+ body.swagger-dark .swagger-ui section.models {
98
+ background: linear-gradient(180deg, #161616 0%, #1e1e1e 100%);
99
+ border-color: #383838;
100
+ }
101
+ body.swagger-dark .swagger-ui section.models h4,
102
+ body.swagger-dark .swagger-ui section.models h5 {
103
+ color: #e8e8e8;
104
+ border-color: #383838;
105
+ }
106
+ body.swagger-dark .swagger-ui .model-container {
107
+ background: #0f0f0f;
108
+ border-color: #2a2a2a;
109
+ }
110
+ body.swagger-dark .swagger-ui .model-box {
111
+ background: #1a1a1a;
112
+ }
113
+ body.swagger-dark .swagger-ui .model,
114
+ body.swagger-dark .swagger-ui .model-title,
115
+ body.swagger-dark .swagger-ui .model span,
116
+ body.swagger-dark .swagger-ui .model .property {
117
+ color: #e8e8e8;
118
+ }
119
+ body.swagger-dark .swagger-ui .model .property.primitive {
120
+ color: #a8a8a8;
121
+ }
122
+
123
+ /* Tables */
124
+ body.swagger-dark .swagger-ui table thead tr th {
125
+ background: linear-gradient(180deg, #222222 0%, #2a2a2a 100%);
126
+ color: #e8e8e8;
127
+ border-color: #383838;
128
+ }
129
+ body.swagger-dark .swagger-ui table tbody tr td {
130
+ color: #a8a8a8;
131
+ border-color: #2a2a2a;
132
+ }
133
+
134
+ /* Parameters */
135
+ body.swagger-dark .swagger-ui .parameter__name,
136
+ body.swagger-dark .swagger-ui .parameter__type,
137
+ body.swagger-dark .swagger-ui .parameter__in,
138
+ body.swagger-dark .swagger-ui .parameter__extension,
139
+ body.swagger-dark .swagger-ui .parameter__empty_value_toggle {
140
+ color: #a8a8a8;
141
+ }
142
+ body.swagger-dark .swagger-ui .parameter__name.required:after {
143
+ color: #ff6b6b;
144
+ }
145
+
146
+ /* Inputs & textareas */
147
+ body.swagger-dark .swagger-ui input[type='text'],
148
+ body.swagger-dark .swagger-ui input[type='email'],
149
+ body.swagger-dark .swagger-ui input[type='password'],
150
+ body.swagger-dark .swagger-ui input[type='search'],
151
+ body.swagger-dark .swagger-ui input[type='number'],
152
+ body.swagger-dark .swagger-ui textarea {
153
+ background: #2a2a2a;
154
+ color: #e8e8e8;
155
+ border-color: #383838;
156
+ }
157
+
158
+ /* Buttons */
159
+ body.swagger-dark .swagger-ui .btn {
160
+ color: #e8e8e8;
161
+ border-color: #383838;
162
+ background: #222222;
163
+ }
164
+ body.swagger-dark .swagger-ui .btn:hover {
165
+ background: #2a2a2a;
166
+ }
167
+ body.swagger-dark .swagger-ui .btn.authorize {
168
+ color: #49cc90;
169
+ border-color: #49cc90;
170
+ background: transparent;
171
+ }
172
+ body.swagger-dark .swagger-ui .btn.execute {
173
+ background: linear-gradient(180deg, #333333 0%, #262626 100%);
174
+ border-color: #484848;
175
+ color: #e8e8e8;
176
+ }
177
+ body.swagger-dark .swagger-ui .btn.cancel {
178
+ color: #ff6b6b;
179
+ border-color: #ff6b6b;
180
+ }
181
+
182
+ /* Responses */
183
+ body.swagger-dark .swagger-ui .responses-inner h4,
184
+ body.swagger-dark .swagger-ui .responses-inner h5 {
185
+ color: #a8a8a8;
186
+ }
187
+ body.swagger-dark .swagger-ui .response-col_status {
188
+ color: #e8e8e8;
189
+ }
190
+ body.swagger-dark .swagger-ui .response-col_description__inner p {
191
+ color: #a8a8a8;
192
+ }
193
+ body.swagger-dark .swagger-ui .response {
194
+ border-color: #2a2a2a;
195
+ }
196
+
197
+ /* Code / highlight */
198
+ body.swagger-dark .swagger-ui .highlight-code,
199
+ body.swagger-dark .swagger-ui .microlight {
200
+ background: #1a1a1a;
201
+ border: 1px solid #2a2a2a;
202
+ }
203
+
204
+ /* Markdown */
205
+ body.swagger-dark .swagger-ui .markdown p,
206
+ body.swagger-dark .swagger-ui .markdown li,
207
+ body.swagger-dark .swagger-ui .markdown a {
208
+ color: #a8a8a8;
209
+ }
210
+
211
+ /* Tabs */
212
+ body.swagger-dark .swagger-ui .tab li {
213
+ color: #a8a8a8;
214
+ }
215
+ body.swagger-dark .swagger-ui .tab li.active {
216
+ color: #e8e8e8;
217
+ }
218
+
219
+ /* Auth / modal dialog */
220
+ body.swagger-dark .swagger-ui .dialog-ux .modal-ux {
221
+ background: linear-gradient(180deg, #1a1a1a 0%, #222222 100%);
222
+ border: 1px solid #383838;
223
+ box-shadow: 0 4px 24px rgba(0, 0, 0, 0.7);
224
+ }
225
+ body.swagger-dark .swagger-ui .dialog-ux .modal-ux-header {
226
+ border-bottom: 1px solid #383838;
227
+ background: linear-gradient(180deg, #222222 0%, #1a1a1a 100%);
228
+ }
229
+ body.swagger-dark .swagger-ui .dialog-ux .modal-ux-header h3 {
230
+ color: #e8e8e8;
231
+ }
232
+ body.swagger-dark .swagger-ui .dialog-ux .modal-ux-content p,
233
+ body.swagger-dark .swagger-ui .dialog-ux .modal-ux-content label,
234
+ body.swagger-dark .swagger-ui .dialog-ux .modal-ux-content h4 {
235
+ color: #e8e8e8;
236
+ }
237
+ body.swagger-dark .swagger-ui .auth-container .errors {
238
+ color: #ff6b6b;
239
+ }
240
+
241
+ /* Info / description */
242
+ body.swagger-dark .swagger-ui .info .base-url,
243
+ body.swagger-dark .swagger-ui .servers-title,
244
+ body.swagger-dark .swagger-ui .servers > label {
245
+ color: #a8a8a8;
246
+ }
247
+
248
+ /* Expand/collapse arrows */
249
+ body.swagger-dark .swagger-ui svg.arrow path {
250
+ fill: #a8a8a8;
251
+ }
252
+ `;
253
+
254
+ const swaggerDarkJs = `(function () {
255
+ function injectThemeToggle() {
256
+ var topbarWrapper = document.querySelector('.swagger-ui .topbar-wrapper');
257
+ if (!topbarWrapper || document.getElementById('swagger-theme-toggle')) return;
258
+
259
+ var savedTheme = localStorage.getItem('swagger-theme') || 'light';
260
+ if (savedTheme === 'dark') document.body.classList.add('swagger-dark');
261
+
262
+ var btn = document.createElement('button');
263
+ btn.id = 'swagger-theme-toggle';
264
+ btn.className = 'swagger-theme-toggle-btn';
265
+ btn.setAttribute('title', 'Toggle dark / light mode');
266
+ btn.textContent = savedTheme === 'dark' ? '\u2600\uFE0F Light Mode' : '\uD83C\uDF19 Dark Mode';
267
+
268
+ btn.addEventListener('click', function () {
269
+ var isDark = document.body.classList.toggle('swagger-dark');
270
+ localStorage.setItem('swagger-theme', isDark ? 'dark' : 'light');
271
+ btn.textContent = isDark ? '\u2600\uFE0F Light Mode' : '\uD83C\uDF19 Dark Mode';
272
+ });
273
+
274
+ topbarWrapper.appendChild(btn);
275
+ }
276
+
277
+ var poll = setInterval(function () {
278
+ if (document.querySelector('.swagger-ui .topbar-wrapper')) {
279
+ injectThemeToggle();
280
+ clearInterval(poll);
281
+ }
282
+ }, 100);
283
+ })();`;
284
+
285
+ SrrComponent = () => ({ css: swaggerDarkCss, js: swaggerDarkJs });
@@ -0,0 +1,83 @@
1
+ SrrComponent = ({ backgroundImage }) => html`
2
+ ${backgroundImage
3
+ ? html`<style>
4
+ .ssr-background-image {
5
+ background-image: url('${backgroundImage}');
6
+ }
7
+ </style>`
8
+ : ''}
9
+ <style>
10
+ .ssr-top-bar {
11
+ background: #121212;
12
+ height: 100px;
13
+ }
14
+ .ssr-btn {
15
+ height: 40px;
16
+ width: 40px;
17
+ }
18
+ .ssr-btn-0 {
19
+ top: 55px;
20
+ right: 5px;
21
+ }
22
+ .ssr-btn-1 {
23
+ top: 55px;
24
+ right: 55px;
25
+ }
26
+ .ssr-btn-2 {
27
+ top: 55px;
28
+ right: 105px;
29
+ }
30
+ .ssr-btn-3 {
31
+ top: 55px;
32
+ left: 5px;
33
+ }
34
+ .ssr-btn-4 {
35
+ top: 5px;
36
+ left: 5px;
37
+ }
38
+ .ssr-btn-5 {
39
+ top: 5px;
40
+ right: 5px;
41
+ border-radius: 50%;
42
+ }
43
+ .ssr-loader {
44
+ width: auto;
45
+ }
46
+
47
+ .loader {
48
+ height: 6px;
49
+ width: 130px;
50
+ --c: no-repeat linear-gradient(#353535 0 0);
51
+ background: var(--c), var(--c), #e1e1e1;
52
+ background-size: 60% 100%;
53
+ animation: l16 3s infinite;
54
+ }
55
+ @keyframes l16 {
56
+ 0% {
57
+ background-position: -150% 0, -150% 0;
58
+ }
59
+ 66% {
60
+ background-position: 250% 0, -150% 0;
61
+ }
62
+ 100% {
63
+ background-position: 250% 0, 250% 0;
64
+ }
65
+ }
66
+ </style>
67
+ <div class="ssr-background-image"></div>
68
+ <div class="ssr-abs ssr-background" style="opacity: 1">
69
+ <div class="ssr-in ssr-top-bar">
70
+ ${new Array(6)
71
+ .fill()
72
+ .map(
73
+ (v, i) => html`<div class="ssr-abs ssr-btn ssr-btn-${i}">
74
+ <div class="ssr-shimmer-dark"></div>
75
+ </div>`,
76
+ )
77
+ .join('')}
78
+
79
+ <div class="ssr-abs ssr-search-box"><div class="ssr-shimmer-dark-search-box"></div></div>
80
+ </div>
81
+ <div class="ssr-abs ssr-center ssr-loader"><div class="loader"></div></div>
82
+ </div>
83
+ `;
@@ -0,0 +1,60 @@
1
+ SrrComponent = () => html`<link rel="icon" type="image/x-icon" href="/favicon.ico">
2
+ <link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png">
3
+ <link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
4
+ <link rel="icon" type="image/png" sizes="48x48" href="/favicon-48x48.png">
5
+ <link rel="manifest" href="/manifest.webmanifest" crossOrigin="use-credentials">
6
+ <meta name="mobile-web-app-capable" content="yes">
7
+ <meta name="theme-color" content="#0551C4">
8
+ <meta name="application-name" content="Item Ledger">
9
+ <link rel="apple-touch-icon" sizes="57x57" href="/apple-touch-icon-57x57.png">
10
+ <link rel="apple-touch-icon" sizes="60x60" href="/apple-touch-icon-60x60.png">
11
+ <link rel="apple-touch-icon" sizes="72x72" href="/apple-touch-icon-72x72.png">
12
+ <link rel="apple-touch-icon" sizes="76x76" href="/apple-touch-icon-76x76.png">
13
+ <link rel="apple-touch-icon" sizes="114x114" href="/apple-touch-icon-114x114.png">
14
+ <link rel="apple-touch-icon" sizes="120x120" href="/apple-touch-icon-120x120.png">
15
+ <link rel="apple-touch-icon" sizes="144x144" href="/apple-touch-icon-144x144.png">
16
+ <link rel="apple-touch-icon" sizes="152x152" href="/apple-touch-icon-152x152.png">
17
+ <link rel="apple-touch-icon" sizes="167x167" href="/apple-touch-icon-167x167.png">
18
+ <link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon-180x180.png">
19
+ <link rel="apple-touch-icon" sizes="1024x1024" href="/apple-touch-icon-1024x1024.png">
20
+ <meta name="apple-mobile-web-app-capable" content="yes">
21
+ <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
22
+ <meta name="apple-mobile-web-app-title" content="Item Ledger">
23
+ <link rel="apple-touch-startup-image" media="(device-width: 320px) and (device-height: 568px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/apple-touch-startup-image-640x1136.png">
24
+ <link rel="apple-touch-startup-image" media="(device-width: 320px) and (device-height: 568px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="/apple-touch-startup-image-1136x640.png">
25
+ <link rel="apple-touch-startup-image" media="(device-width: 375px) and (device-height: 667px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/apple-touch-startup-image-750x1334.png">
26
+ <link rel="apple-touch-startup-image" media="(device-width: 375px) and (device-height: 667px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="/apple-touch-startup-image-1334x750.png">
27
+ <link rel="apple-touch-startup-image" media="(device-width: 375px) and (device-height: 812px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)" href="/apple-touch-startup-image-1125x2436.png">
28
+ <link rel="apple-touch-startup-image" media="(device-width: 375px) and (device-height: 812px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)" href="/apple-touch-startup-image-2436x1125.png">
29
+ <link rel="apple-touch-startup-image" media="(device-width: 390px) and (device-height: 844px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)" href="/apple-touch-startup-image-1170x2532.png">
30
+ <link rel="apple-touch-startup-image" media="(device-width: 390px) and (device-height: 844px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)" href="/apple-touch-startup-image-2532x1170.png">
31
+ <link rel="apple-touch-startup-image" media="(device-width: 393px) and (device-height: 852px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)" href="/apple-touch-startup-image-1179x2556.png">
32
+ <link rel="apple-touch-startup-image" media="(device-width: 393px) and (device-height: 852px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)" href="/apple-touch-startup-image-2556x1179.png">
33
+ <link rel="apple-touch-startup-image" media="(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/apple-touch-startup-image-828x1792.png">
34
+ <link rel="apple-touch-startup-image" media="(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="/apple-touch-startup-image-1792x828.png">
35
+ <link rel="apple-touch-startup-image" media="(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)" href="/apple-touch-startup-image-1242x2688.png">
36
+ <link rel="apple-touch-startup-image" media="(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)" href="/apple-touch-startup-image-2688x1242.png">
37
+ <link rel="apple-touch-startup-image" media="(device-width: 414px) and (device-height: 736px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)" href="/apple-touch-startup-image-1242x2208.png">
38
+ <link rel="apple-touch-startup-image" media="(device-width: 414px) and (device-height: 736px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)" href="/apple-touch-startup-image-2208x1242.png">
39
+ <link rel="apple-touch-startup-image" media="(device-width: 428px) and (device-height: 926px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)" href="/apple-touch-startup-image-1284x2778.png">
40
+ <link rel="apple-touch-startup-image" media="(device-width: 428px) and (device-height: 926px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)" href="/apple-touch-startup-image-2778x1284.png">
41
+ <link rel="apple-touch-startup-image" media="(device-width: 430px) and (device-height: 932px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)" href="/apple-touch-startup-image-1290x2796.png">
42
+ <link rel="apple-touch-startup-image" media="(device-width: 430px) and (device-height: 932px) and (-webkit-device-pixel-ratio: 3) and (orientation: landscape)" href="/apple-touch-startup-image-2796x1290.png">
43
+ <link rel="apple-touch-startup-image" media="(device-width: 744px) and (device-height: 1133px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/apple-touch-startup-image-1488x2266.png">
44
+ <link rel="apple-touch-startup-image" media="(device-width: 744px) and (device-height: 1133px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="/apple-touch-startup-image-2266x1488.png">
45
+ <link rel="apple-touch-startup-image" media="(device-width: 768px) and (device-height: 1024px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/apple-touch-startup-image-1536x2048.png">
46
+ <link rel="apple-touch-startup-image" media="(device-width: 768px) and (device-height: 1024px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="/apple-touch-startup-image-2048x1536.png">
47
+ <link rel="apple-touch-startup-image" media="(device-width: 810px) and (device-height: 1080px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/apple-touch-startup-image-1620x2160.png">
48
+ <link rel="apple-touch-startup-image" media="(device-width: 810px) and (device-height: 1080px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="/apple-touch-startup-image-2160x1620.png">
49
+ <link rel="apple-touch-startup-image" media="(device-width: 820px) and (device-height: 1080px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/apple-touch-startup-image-1640x2160.png">
50
+ <link rel="apple-touch-startup-image" media="(device-width: 820px) and (device-height: 1080px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="/apple-touch-startup-image-2160x1640.png">
51
+ <link rel="apple-touch-startup-image" media="(device-width: 834px) and (device-height: 1194px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/apple-touch-startup-image-1668x2388.png">
52
+ <link rel="apple-touch-startup-image" media="(device-width: 834px) and (device-height: 1194px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="/apple-touch-startup-image-2388x1668.png">
53
+ <link rel="apple-touch-startup-image" media="(device-width: 834px) and (device-height: 1112px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/apple-touch-startup-image-1668x2224.png">
54
+ <link rel="apple-touch-startup-image" media="(device-width: 834px) and (device-height: 1112px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="/apple-touch-startup-image-2224x1668.png">
55
+ <link rel="apple-touch-startup-image" media="(device-width: 1024px) and (device-height: 1366px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/apple-touch-startup-image-2048x2732.png">
56
+ <link rel="apple-touch-startup-image" media="(device-width: 1024px) and (device-height: 1366px) and (-webkit-device-pixel-ratio: 2) and (orientation: landscape)" href="/apple-touch-startup-image-2732x2048.png">
57
+ <meta name="msapplication-TileColor" content="#0551C4">
58
+ <meta name="msapplication-TileImage" content="/mstile-144x144.png">
59
+ <meta name="msapplication-config" content="/browserconfig.xml">
60
+ <link rel="yandex-tableau-widget" href="/yandex-browser-manifest.json">`;
@@ -0,0 +1,6 @@
1
+ SrrComponent = ({ ssrPath }) => html`
2
+ <script type="text/javascript" src="${ssrPath}dist/validator/validator.min.js"></script>
3
+ <script type="text/javascript" src="${ssrPath}dist/ag-grid-community/ag-grid-community.min.js"></script>
4
+ <script type="text/javascript" src="${ssrPath}dist/easymde/easymde.min.js"></script>
5
+ <link rel="stylesheet" href="${ssrPath}dist/easymde/easymde.min.css" />
6
+ `;
@@ -51,17 +51,18 @@ const main = () => {
51
51
  <br />
52
52
  <br />${Translate.Render('no-internet-connection')} <br />
53
53
  <br />
54
- <a href="${location.origin}">${Translate.Render('back')}</a>
54
+ <a target="_top" href="${location.origin}">${Translate.Render('back')}</a>
55
55
  </div>`,
56
56
  );
57
57
  };
58
58
 
59
- SrrComponent = () => html`<script>
60
- {
61
- const s = ${s};
62
- const append = ${append};
63
- const getLang = ${getLang};
64
- const main = ${main};
65
- window.onload = main;
66
- }
67
- </script>`;
59
+ SrrComponent = () =>
60
+ html`<script>
61
+ {
62
+ const s = ${s};
63
+ const append = ${append};
64
+ const getLang = ${getLang};
65
+ const main = ${main};
66
+ window.onload = main;
67
+ }
68
+ </script>`;
@@ -182,17 +182,18 @@ const main = () => {
182
182
  <span class="bold">Test Page</span>
183
183
  <br />
184
184
  <br />
185
- <a href="${location.origin}">${Translate.Render('back')}</a>
185
+ <a target="_top" href="${location.origin}">${Translate.Render('back')}</a>
186
186
  </div>`,
187
187
  );
188
188
  };
189
189
 
190
- SrrComponent = () => html`<script>
191
- {
192
- const s = ${s};
193
- const append = ${append};
194
- const getLang = ${getLang};
195
- const main = ${main};
196
- window.onload = main;
197
- }
198
- </script>`;
190
+ SrrComponent = () =>
191
+ html`<script>
192
+ {
193
+ const s = ${s};
194
+ const append = ${append};
195
+ const getLang = ${getLang};
196
+ const main = ${main};
197
+ window.onload = main;
198
+ }
199
+ </script>`;
@@ -3,14 +3,11 @@
3
3
  // https://nodejs.org/api
4
4
  // https://expressjs.com/en/4x/api.html
5
5
 
6
- import dotenv from 'dotenv';
7
6
  import { loggerFactory } from './server/logger.js';
8
7
  import { Config } from './server/conf.js';
9
8
  import { ProcessController } from './server/process.js';
10
9
  import { clientLiveBuild } from './server/client-build-live.js';
11
10
 
12
- dotenv.config();
13
-
14
11
  await Config.build();
15
12
 
16
13
  const logger = loggerFactory(import.meta);
package/src/client.dev.js CHANGED
@@ -3,14 +3,11 @@
3
3
  // https://nodejs.org/api
4
4
  // https://expressjs.com/en/4x/api.html
5
5
 
6
- import dotenv from 'dotenv';
7
6
  import { loggerFactory } from './server/logger.js';
8
7
  import { ProcessController } from './server/process.js';
9
8
  import { Config, buildClientStaticConf } from './server/conf.js';
10
9
  import { createClientDevServer } from './server/client-dev-server.js';
11
10
 
12
- dotenv.config();
13
-
14
11
  const logger = loggerFactory(import.meta);
15
12
 
16
13
  await logger.setUpInfo();
@@ -13,7 +13,7 @@ const logger = loggerFactory(import.meta);
13
13
  * @class
14
14
  * @alias DataBaseProviderService
15
15
  * @memberof DataBaseProviderService
16
- * @classdesc Centralized service for loading, managing, and accessing multiple database connections
16
+ * @classdesc Service for loading, managing, and accessing multiple database connections
17
17
  * based on application configuration (host, path, provider type).
18
18
  */
19
19
  class DataBaseProviderService {
@@ -81,7 +81,22 @@ class DataBaseProviderService {
81
81
  }
82
82
  return this.#instance[key][db.provider];
83
83
  } catch (error) {
84
- logger.error(error, { error: error.stack, options });
84
+ // Sanitize options to prevent credential exposure in logs
85
+ const safeOptions = {
86
+ apis: options.apis,
87
+ host: options.host,
88
+ path: options.path,
89
+ db: options.db
90
+ ? {
91
+ provider: options.db.provider,
92
+ name: options.db.name ? '***' : undefined,
93
+ host: options.db.host ? '***' : undefined,
94
+ user: options.db.user ? '***' : undefined,
95
+ password: options.db.password ? '***' : undefined,
96
+ }
97
+ : {},
98
+ };
99
+ logger.error(error.message, { safeOptions });
85
100
  return undefined;
86
101
  }
87
102
  }
@@ -16,6 +16,11 @@ const logger = loggerFactory(import.meta);
16
16
  * @memberof MariaDBService
17
17
  * @classdesc Provides a simplified interface for executing queries against a MariaDB/MySQL database
18
18
  * using a connection pool, ensuring connection management (acquisition and release).
19
+ *
20
+ * Connection credentials are resolved in the following order:
21
+ * 1. Explicit values passed in the `options` parameter.
22
+ * 2. Environment variables (`MARIADB_HOST`, `MARIADB_PORT`, `MARIADB_USER`, `MARIADB_PASSWORD`).
23
+ * 3. Safe built-in defaults (`127.0.0.1`, `3306`, `root`, empty password).
19
24
  */
20
25
  class MariaDBService {
21
26
  /**
@@ -23,20 +28,20 @@ class MariaDBService {
23
28
  *
24
29
  * @async
25
30
  * @param {object} options - The database connection and query options.
26
- * @param {string} [options.host='127.0.0.1'] - The database host.
27
- * @param {number} [options.port=3306] - The database port.
28
- * @param {string} [options.user='root'] - The database user.
29
- * @param {string} [options.password=''] - The database password.
31
+ * @param {string} [options.host] - The database host. Falls back to `process.env.MARIADB_HOST` then `'127.0.0.1'`.
32
+ * @param {number} [options.port] - The database port. Falls back to `process.env.MARIADB_PORT` then `3306`.
33
+ * @param {string} [options.user] - The database user. Falls back to `process.env.MARIADB_USER` then `'root'`.
34
+ * @param {string} [options.password] - The database password. Falls back to `process.env.MARIADB_PASSWORD` then `''`.
30
35
  * @param {string} options.query - The SQL query string to execute.
31
36
  * @returns {Promise<any>} The result of the database query.
32
37
  */
33
38
  async query(options) {
34
39
  const { host, port, user, password, query } = options;
35
40
  const pool = createPool({
36
- host: 'host' in options ? host : '127.0.0.1',
37
- port: 'port' in options ? port : 3306,
38
- user: 'user' in options ? user : 'root',
39
- password: 'password' in options ? password : '',
41
+ host: 'host' in options ? host : process.env.MARIADB_HOST || '127.0.0.1',
42
+ port: 'port' in options ? port : parseInt(process.env.MARIADB_PORT, 10) || 3306,
43
+ user: 'user' in options ? user : process.env.MARIADB_USER || 'root',
44
+ password: 'password' in options ? password : process.env.MARIADB_PASSWORD || '',
40
45
  });
41
46
  let conn, result;
42
47
  try {
@@ -45,7 +50,7 @@ class MariaDBService {
45
50
  logger.info('query');
46
51
  console.log(result);
47
52
  } catch (error) {
48
- logger.error(error, error.stack);
53
+ logger.error('MariaDB query failed', { error: error.message });
49
54
  } finally {
50
55
  if (conn) conn.release(); // release to pool
51
56
  await pool.end();
@@ -16,17 +16,33 @@ const logger = loggerFactory(import.meta);
16
16
  * @memberof MongooseDBService
17
17
  * @classdesc Manages the Mongoose connection lifecycle and dynamic loading of database models
18
18
  * based on API configuration.
19
+ *
20
+ * Connection parameters are resolved in the following order:
21
+ * 1. Explicit values passed as arguments to {@link MongooseDBService#connect}.
22
+ * 2. Environment variables (`DB_HOST` for host, `DB_NAME` for database name).
23
+ * 3. No built-in defaults — both `host` and `name` are required from the caller or environment.
19
24
  */
20
25
  class MongooseDBService {
21
26
  /**
22
27
  * Establishes a Mongoose connection to the specified MongoDB instance.
23
28
  *
24
29
  * @async
25
- * @param {string} host - The MongoDB host (e.g., 'mongodb://localhost:27017').
30
+ * @param {string} host - The MongoDB host URI (e.g., `'mongodb://localhost:27017'`).
31
+ * Falls back to `process.env.DB_HOST` when not provided.
26
32
  * @param {string} name - The database name.
33
+ * Falls back to `process.env.DB_NAME` when not provided.
27
34
  * @returns {Promise<mongoose.Connection>} A promise that resolves to the established Mongoose connection object.
35
+ * @throws {Error} If neither the argument nor the corresponding environment variable supplies a value.
28
36
  */
29
37
  async connect(host, name) {
38
+ host = host || process.env.DB_HOST;
39
+ name = name || process.env.DB_NAME;
40
+
41
+ if (!host || !name) {
42
+ const missing = [!host && 'host (DB_HOST)', !name && 'name (DB_NAME)'].filter(Boolean).join(', ');
43
+ throw new Error(`MongooseDBService.connect: missing required parameter(s): ${missing}`);
44
+ }
45
+
30
46
  const uri = `${host}/${name}`;
31
47
  // logger.info('MongooseDB connect', { host, name, uri });
32
48
  return await mongoose
package/src/index.js CHANGED
@@ -42,7 +42,7 @@ class Underpost {
42
42
  * @type {String}
43
43
  * @memberof Underpost
44
44
  */
45
- static version = 'v3.0.2';
45
+ static version = 'v3.1.3';
46
46
 
47
47
  /**
48
48
  * Required Node.js major version