underpost 2.8.82 → 2.8.85

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 (115) hide show
  1. package/.env.development +1 -0
  2. package/.env.production +1 -0
  3. package/.env.test +1 -0
  4. package/.github/workflows/{ghpkg.yml → ghpkg.ci.yml} +5 -5
  5. package/.github/workflows/{npmpkg.yml → npmpkg.ci.yml} +5 -5
  6. package/.github/workflows/{publish.yml → publish.ci.yml} +1 -1
  7. package/.github/workflows/{pwa-microservices-template.page.yml → pwa-microservices-template-page.cd.yml} +1 -1
  8. package/.github/workflows/{pwa-microservices-template.test.yml → pwa-microservices-template-test.ci.yml} +1 -1
  9. package/.vscode/extensions.json +1 -1
  10. package/.vscode/settings.json +0 -44
  11. package/README.md +62 -2
  12. package/bin/build.js +15 -5
  13. package/bin/deploy.js +42 -92
  14. package/bin/file.js +33 -9
  15. package/bin/vs.js +12 -4
  16. package/cli.md +90 -42
  17. package/conf.js +1 -1
  18. package/docker-compose.yml +1 -1
  19. package/manifests/deployment/dd-template-development/deployment.yaml +2 -2
  20. package/manifests/deployment/tensorflow/tf-gpu-test.yaml +65 -0
  21. package/manifests/maas/device-scan.sh +3 -3
  22. package/manifests/maas/gpu-diag.sh +19 -0
  23. package/manifests/maas/maas-setup.sh +10 -10
  24. package/manifests/maas/snap-clean.sh +26 -0
  25. package/package.json +4 -6
  26. package/src/api/user/user.router.js +24 -1
  27. package/src/api/user/user.service.js +1 -4
  28. package/src/cli/baremetal.js +105 -73
  29. package/src/cli/cloud-init.js +21 -12
  30. package/src/cli/cluster.js +227 -133
  31. package/src/cli/deploy.js +34 -0
  32. package/src/cli/index.js +28 -1
  33. package/src/cli/monitor.js +8 -12
  34. package/src/cli/repository.js +7 -4
  35. package/src/cli/run.js +367 -0
  36. package/src/cli/ssh.js +32 -0
  37. package/src/cli/test.js +1 -1
  38. package/src/client/Default.index.js +7 -3
  39. package/src/client/components/core/Account.js +1 -1
  40. package/src/client/components/core/Chat.js +1 -1
  41. package/src/client/components/core/CommonJs.js +24 -22
  42. package/src/client/components/core/Content.js +1 -5
  43. package/src/client/components/core/Css.js +258 -18
  44. package/src/client/components/core/CssCore.js +8 -8
  45. package/src/client/components/core/Docs.js +14 -61
  46. package/src/client/components/core/DropDown.js +137 -82
  47. package/src/client/components/core/EventsUI.js +92 -5
  48. package/src/client/components/core/LoadingAnimation.js +8 -15
  49. package/src/client/components/core/Modal.js +597 -136
  50. package/src/client/components/core/NotificationManager.js +2 -2
  51. package/src/client/components/core/ObjectLayerEngine.js +638 -0
  52. package/src/client/components/core/Panel.js +158 -34
  53. package/src/client/components/core/PanelForm.js +12 -3
  54. package/src/client/components/core/Recover.js +1 -1
  55. package/src/client/components/core/Router.js +77 -17
  56. package/src/client/components/core/SocketIo.js +3 -3
  57. package/src/client/components/core/Translate.js +6 -2
  58. package/src/client/components/core/VanillaJs.js +0 -3
  59. package/src/client/components/core/Worker.js +3 -1
  60. package/src/client/components/default/CssDefault.js +17 -3
  61. package/src/client/components/default/MenuDefault.js +264 -45
  62. package/src/client/components/default/RoutesDefault.js +6 -12
  63. package/src/client/public/default/android-chrome-144x144.png +0 -0
  64. package/src/client/public/default/android-chrome-192x192.png +0 -0
  65. package/src/client/public/default/android-chrome-256x256.png +0 -0
  66. package/src/client/public/default/android-chrome-36x36.png +0 -0
  67. package/src/client/public/default/android-chrome-48x48.png +0 -0
  68. package/src/client/public/default/android-chrome-72x72.png +0 -0
  69. package/src/client/public/default/android-chrome-96x96.png +0 -0
  70. package/src/client/public/default/apple-touch-icon-114x114-precomposed.png +0 -0
  71. package/src/client/public/default/apple-touch-icon-114x114.png +0 -0
  72. package/src/client/public/default/apple-touch-icon-120x120-precomposed.png +0 -0
  73. package/src/client/public/default/apple-touch-icon-120x120.png +0 -0
  74. package/src/client/public/default/apple-touch-icon-144x144-precomposed.png +0 -0
  75. package/src/client/public/default/apple-touch-icon-144x144.png +0 -0
  76. package/src/client/public/default/apple-touch-icon-152x152-precomposed.png +0 -0
  77. package/src/client/public/default/apple-touch-icon-152x152.png +0 -0
  78. package/src/client/public/default/apple-touch-icon-180x180-precomposed.png +0 -0
  79. package/src/client/public/default/apple-touch-icon-180x180.png +0 -0
  80. package/src/client/public/default/apple-touch-icon-57x57-precomposed.png +0 -0
  81. package/src/client/public/default/apple-touch-icon-57x57.png +0 -0
  82. package/src/client/public/default/apple-touch-icon-60x60-precomposed.png +0 -0
  83. package/src/client/public/default/apple-touch-icon-60x60.png +0 -0
  84. package/src/client/public/default/apple-touch-icon-72x72-precomposed.png +0 -0
  85. package/src/client/public/default/apple-touch-icon-72x72.png +0 -0
  86. package/src/client/public/default/apple-touch-icon-76x76-precomposed.png +0 -0
  87. package/src/client/public/default/apple-touch-icon-76x76.png +0 -0
  88. package/src/client/public/default/apple-touch-icon-precomposed.png +0 -0
  89. package/src/client/public/default/apple-touch-icon.png +0 -0
  90. package/src/client/public/default/assets/background/dark.jpg +0 -0
  91. package/src/client/public/default/assets/background/dark.svg +557 -0
  92. package/src/client/public/default/assets/logo/base-icon.png +0 -0
  93. package/src/client/public/default/assets/logo/underpost.gif +0 -0
  94. package/src/client/public/default/assets/mailer/api-user-check.png +0 -0
  95. package/src/client/public/default/assets/mailer/api-user-invalid-token.png +0 -0
  96. package/src/client/public/default/assets/mailer/api-user-recover.png +0 -0
  97. package/src/client/public/default/favicon-16x16.png +0 -0
  98. package/src/client/public/default/favicon-32x32.png +0 -0
  99. package/src/client/public/default/favicon.ico +0 -0
  100. package/src/client/public/default/mstile-144x144.png +0 -0
  101. package/src/client/public/default/mstile-150x150.png +0 -0
  102. package/src/client/public/default/mstile-310x150.png +0 -0
  103. package/src/client/public/default/mstile-310x310.png +0 -0
  104. package/src/client/public/default/mstile-70x70.png +0 -0
  105. package/src/client/public/default/safari-pinned-tab.svg +24 -0
  106. package/src/client/ssr/body/DefaultSplashScreen.js +2 -2
  107. package/src/index.js +34 -17
  108. package/src/monitor.js +24 -0
  109. package/src/runtime/lampp/Dockerfile +30 -39
  110. package/src/runtime/lampp/Lampp.js +11 -2
  111. package/src/server/client-build-docs.js +205 -0
  112. package/src/server/client-build.js +16 -166
  113. package/src/server/conf.js +18 -8
  114. package/src/server/process.js +16 -19
  115. package/src/server/valkey.js +102 -41
@@ -1,7 +1,16 @@
1
1
  import { Account } from '../core/Account.js';
2
2
  import { BtnIcon } from '../core/BtnIcon.js';
3
3
  import { getId, newInstance } from '../core/CommonJs.js';
4
- import { Css, Themes } from '../core/Css.js';
4
+ import {
5
+ borderChar,
6
+ boxShadow,
7
+ Css,
8
+ darkTheme,
9
+ extractBackgroundImageUrl,
10
+ renderCssAttr,
11
+ ThemeEvents,
12
+ Themes,
13
+ } from '../core/Css.js';
5
14
  import { EventsUI } from '../core/EventsUI.js';
6
15
  import { LogIn } from '../core/LogIn.js';
7
16
  import { LogOut } from '../core/LogOut.js';
@@ -35,6 +44,7 @@ const MenuDefault = {
35
44
  await Modal.Render({
36
45
  id: 'modal-menu',
37
46
  html: html`
47
+ <div class="style-lading-render"></div>
38
48
  <div class="fl menu-btn-container">
39
49
  ${await BtnIcon.Render({
40
50
  class: 'in wfa main-btn-menu main-btn-home main-btn-menu-active',
@@ -105,17 +115,6 @@ const MenuDefault = {
105
115
  handleContainerClass: 'handle-btn-container',
106
116
  tooltipHtml: await Badge.Render(buildBadgeToolTipMenuOption('settings')),
107
117
  })}
108
- ${await BtnIcon.Render({
109
- class: 'in wfa main-btn-menu main-btn-docs hide',
110
- label: renderMenuLabel({
111
- icon: html`<i class="fas fa-book"></i>`,
112
- text: html`<span class="menu-label-text">${Translate.Render('docs')}</span>`,
113
- }),
114
- attrs: `data-id="docs"`,
115
- tabHref: `${getProxyPath()}docs`,
116
- handleContainerClass: 'handle-btn-container',
117
- tooltipHtml: await Badge.Render(buildBadgeToolTipMenuOption('docs')),
118
- })}
119
118
  ${await BtnIcon.Render({
120
119
  class: 'in wfa main-btn-menu main-btn-recover hide',
121
120
  label: renderMenuLabel({
@@ -166,18 +165,267 @@ const MenuDefault = {
166
165
  title: NameApp,
167
166
  // titleClass: 'hide',
168
167
  titleRender: () => {
169
- setTimeout(() => {
170
- htmls(`.action-btn-app-icon-render`, html`APP`);
171
- });
168
+ ThemeEvents['titleRender'] = () => {
169
+ const srcLogo = `${getProxyPath()}apple-touch-icon-114x114-precomposed.png`;
170
+
171
+ htmls(
172
+ '.action-btn-app-icon-render',
173
+ html`<img class="inl top-bar-app-icon ${darkTheme ? 'negative-color' : ''}" src="${srcLogo}" />`,
174
+ );
175
+ };
176
+ setTimeout(ThemeEvents['titleRender']);
172
177
  return '';
173
178
  },
174
179
  mode: 'slide-menu',
175
180
  RouterInstance,
176
181
  heightTopBar,
177
182
  heightBottomBar,
178
- htmlMainBody: options?.htmlMainBody ? options.htmlMainBody : undefined,
183
+ htmlMainBody: async () => {
184
+ setTimeout(() => {
185
+ EventsUI.onClick('.get-started-button', (e) => {
186
+ e.preventDefault();
187
+ location.href = `https://www.nexodev.org/docs/?cid=src`;
188
+ });
189
+ });
190
+ return html`
191
+ <div class="landing-container">
192
+ <div class="content-wrapper">
193
+ <h1 class="animated-text">
194
+ <span class="greeting">Hello, World!</span>
195
+ <span class="subtitle">Welcome to Our Platform</span>
196
+ </h1>
197
+
198
+ <div class="features">
199
+ <div class="feature-card">
200
+ <i class="icon">🚀</i>
201
+ <h3>Fast & Reliable</h3>
202
+ <p>Lightning-fast performance with 99.9% uptime</p>
203
+ </div>
204
+ <div class="feature-card">
205
+ <i class="icon">🎨</i>
206
+ <h3>Beautiful UI</h3>
207
+ <p>Modern and intuitive user interface</p>
208
+ </div>
209
+ <div class="feature-card">
210
+ <i class="icon">⚡</i>
211
+ <h3>Powerful Features</h3>
212
+ <p>Everything you need in one place</p>
213
+ </div>
214
+ </div>
215
+
216
+ <button class="cta-button get-started-button">
217
+ Get Started
218
+ <span class="button-icon">→</span>
219
+ </button>
220
+ </div>
221
+ </div>
222
+ `;
223
+ },
179
224
  });
180
225
 
226
+ ThemeEvents['main-theme-handler'] = () => {
227
+ if (darkTheme) {
228
+ const backgroundImage = `${getProxyPath()}assets/background/dark.svg`;
229
+ htmls(
230
+ `.style-ssr-background-image`,
231
+ css`
232
+ .ssr-background-image {
233
+ background-image: url('${backgroundImage}');
234
+ }
235
+ `,
236
+ );
237
+ } else {
238
+ const backgroundImage = `${getProxyPath()}assets/background/white0-min.jpg`;
239
+ htmls(
240
+ `.style-ssr-background-image`,
241
+ css`
242
+ .ssr-background-image {
243
+ background-image: url('${backgroundImage}');
244
+ }
245
+ `,
246
+ );
247
+ }
248
+ htmls(
249
+ `.style-lading-render`,
250
+ html` <style>
251
+ .landing-container {
252
+ min-height: calc(100vh - ${heightTopBar + heightBottomBar}px);
253
+ display: flex;
254
+ /* align-items: center; */
255
+ justify-content: center;
256
+
257
+ padding: 2rem;
258
+ color: ${darkTheme ? '#fff' : '#333'};
259
+ transition: all 0.3s ease;
260
+ }
261
+
262
+ .content-wrapper {
263
+ text-align: center;
264
+ max-width: 1200px;
265
+ width: 100%;
266
+ padding: 2rem;
267
+ animation: fadeIn 1s ease-out;
268
+ }
269
+
270
+ .animated-text {
271
+ margin-bottom: 3rem;
272
+ }
273
+
274
+ .greeting {
275
+ display: block;
276
+ font-size: 3.5rem;
277
+ font-weight: 700;
278
+ margin-bottom: 1rem;
279
+ background: linear-gradient(90deg, #4f46e5, #7c3aed);
280
+ -webkit-background-clip: text;
281
+ -webkit-text-fill-color: transparent;
282
+ animation: slideIn 1s ease-out;
283
+ }
284
+
285
+ .subtitle {
286
+ display: block;
287
+ font-size: 1.5rem;
288
+ color: ${darkTheme ? '#a0aec0' : '#4a5568'};
289
+ margin-top: 1rem;
290
+ opacity: 0;
291
+ animation: fadeInUp 0.8s ease-out 0.3s forwards;
292
+ }
293
+
294
+ .features {
295
+ display: grid;
296
+ grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
297
+ gap: 2rem;
298
+ margin: 4rem 0;
299
+ }
300
+
301
+ .feature-card {
302
+ background: ${darkTheme ? 'rgba(255, 255, 255, 0.05)' : 'white'};
303
+ padding: 2rem;
304
+ border-radius: 12px;
305
+ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.05);
306
+ transition: transform 0.3s ease, box-shadow 0.3s ease;
307
+ opacity: 0;
308
+ animation: fadeInUp 0.6s ease-out forwards;
309
+ }
310
+
311
+ .feature-card:nth-child(1) {
312
+ animation-delay: 0.5s;
313
+ }
314
+ .feature-card:nth-child(2) {
315
+ animation-delay: 0.7s;
316
+ }
317
+ .feature-card:nth-child(3) {
318
+ animation-delay: 0.9s;
319
+ }
320
+
321
+ .feature-card:hover {
322
+ transform: translateY(-5px);
323
+ box-shadow: 0 10px 15px rgba(0, 0, 0, 0.1);
324
+ }
325
+
326
+ .feature-card .icon {
327
+ font-size: 2.5rem;
328
+ margin-bottom: 1rem;
329
+ display: inline-block;
330
+ }
331
+
332
+ .feature-card h3 {
333
+ font-size: 1.25rem;
334
+ margin-bottom: 0.75rem;
335
+ color: ${darkTheme ? '#e2e8f0' : '#2d3748'};
336
+ }
337
+
338
+ .feature-card p {
339
+ color: ${darkTheme ? '#a0aec0' : '#4a5568'};
340
+ line-height: 1.6;
341
+ }
342
+
343
+ .cta-button {
344
+ background: linear-gradient(90deg, #4f46e5, #7c3aed);
345
+ color: white;
346
+ border: none;
347
+ padding: 1rem 2.5rem;
348
+ font-size: 1.1rem;
349
+ border-radius: 50px;
350
+ cursor: pointer;
351
+ display: inline-flex;
352
+ align-items: center;
353
+ gap: 0.5rem;
354
+ transition: all 0.3s ease;
355
+ box-shadow: 0 4px 15px rgba(79, 70, 229, 0.3);
356
+ opacity: 0;
357
+ animation: fadeIn 0.8s ease-out 1.2s forwards;
358
+ }
359
+
360
+ .cta-button:hover {
361
+ transform: translateY(-2px);
362
+ box-shadow: 0 6px 20px rgba(79, 70, 229, 0.4);
363
+ background: linear-gradient(90deg, #3e38b4, #602bbc);
364
+ color: white;
365
+ }
366
+
367
+ .cta-button:active {
368
+ transform: translateY(0);
369
+ }
370
+
371
+ .button-icon {
372
+ transition: transform 0.3s ease;
373
+ }
374
+
375
+ .cta-button:hover .button-icon {
376
+ transform: translateX(4px);
377
+ }
378
+
379
+ @keyframes fadeIn {
380
+ from {
381
+ opacity: 0;
382
+ }
383
+ to {
384
+ opacity: 1;
385
+ }
386
+ }
387
+
388
+ @keyframes fadeInUp {
389
+ from {
390
+ opacity: 0;
391
+ transform: translateY(20px);
392
+ }
393
+ to {
394
+ opacity: 1;
395
+ transform: translateY(0);
396
+ }
397
+ }
398
+
399
+ @keyframes slideIn {
400
+ from {
401
+ opacity: 0;
402
+ transform: translateX(-30px);
403
+ }
404
+ to {
405
+ opacity: 1;
406
+ transform: translateX(0);
407
+ }
408
+ }
409
+
410
+ @media (max-width: 768px) {
411
+ .greeting {
412
+ font-size: 2.5rem;
413
+ }
414
+
415
+ .subtitle {
416
+ font-size: 1.25rem;
417
+ }
418
+
419
+ .features {
420
+ grid-template-columns: 1fr;
421
+ }
422
+ }
423
+ </style>`,
424
+ );
425
+ };
426
+
427
+ setTimeout(ThemeEvents['main-theme-handler']);
428
+
181
429
  this.Data[id].sortable = new Sortable(s(`.menu-btn-container`), {
182
430
  animation: 150,
183
431
  group: `menu-sortable`,
@@ -337,35 +585,6 @@ const MenuDefault = {
337
585
  });
338
586
  });
339
587
 
340
- EventsUI.onClick(`.main-btn-docs`, async () => {
341
- const { barConfig } = await Themes[Css.currentTheme]();
342
- await Modal.Render({
343
- id: 'modal-docs',
344
- route: 'docs',
345
- barConfig,
346
- title: renderViewTitle({
347
- icon: html`<i class="fas fa-book"></i>`,
348
- text: Translate.Render('docs'),
349
- }),
350
- html: async () =>
351
- await Docs.Init({
352
- idModal: 'modal-docs',
353
- modalOptions: {
354
- barMode: undefined,
355
- },
356
- }),
357
- handleType: 'bar',
358
- observer: true,
359
- maximize: true,
360
- mode: 'view',
361
- slideMenu: 'modal-menu',
362
- RouterInstance,
363
- heightTopBar,
364
- heightBottomBar,
365
- barMode,
366
- });
367
- });
368
-
369
588
  EventsUI.onClick(`.main-btn-recover`, async () => {
370
589
  const { barConfig } = await Themes[Css.currentTheme]();
371
590
  await Modal.Render({
@@ -4,7 +4,7 @@ import { getProxyPath, s } from '../core/VanillaJs.js';
4
4
 
5
5
  const logger = loggerFactory(import.meta);
6
6
 
7
- const NameApp = html`Default`;
7
+ const NameApp = html`<strong class="inl" style="font-family: system-ui">PWA</strong>`;
8
8
 
9
9
  // Router
10
10
  const RoutesDefault = () => {
@@ -12,30 +12,24 @@ const RoutesDefault = () => {
12
12
  '/': {
13
13
  title: 'Home',
14
14
  render: () => Modal.onHomeRouterEvent(),
15
- upperCase: false,
16
15
  },
17
16
  '/home': { title: 'home', render: () => Modal.onHomeRouterEvent() },
18
- '/settings': { title: 'settings', render: () => s(`.main-btn-settings`).click(), translateTitle: true },
19
- '/log-in': { title: 'log-in', render: () => s(`.main-btn-log-in`).click(), translateTitle: true },
20
- '/sign-up': { title: 'sign-up', render: () => s(`.main-btn-sign-up`).click(), translateTitle: true },
17
+ '/settings': { title: 'settings', render: () => s(`.main-btn-settings`).click() },
18
+ '/log-in': { title: 'log-in', render: () => s(`.main-btn-log-in`).click() },
19
+ '/sign-up': { title: 'sign-up', render: () => s(`.main-btn-sign-up`).click() },
21
20
  '/log-out': {
22
21
  title: 'log-out',
23
22
  render: () => s(`.main-btn-log-out`).click(),
24
- hideDisplay: true,
25
- translateTitle: true,
26
23
  },
27
24
  '/account': {
28
25
  title: 'account',
29
26
  render: () => s(`.main-btn-account`).click(),
30
- hideDisplay: true,
31
- translateTitle: true,
32
27
  },
33
- '/docs': { title: 'docs', render: () => s(`.main-btn-docs`).click(), translateTitle: true },
34
- '/recover': { title: 'recover', render: () => s(`.main-btn-recover`).click(), translateTitle: true },
28
+ '/docs': { title: 'docs', render: () => s(`.main-btn-docs`).click() },
29
+ '/recover': { title: 'recover', render: () => s(`.main-btn-recover`).click() },
35
30
  '/default-management': {
36
31
  title: 'default-management',
37
32
  render: () => s(`.main-btn-default-management`).click(),
38
- translateTitle: true,
39
33
  },
40
34
  '/404': { title: '404 Not Found', render: () => s(`.main-btn-404`).click() },
41
35
  '/500': { title: '500 Server Error', render: () => s(`.main-btn-500`).click() },