@underpostnet/cyberia 3.3.77 → 3.4.0

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 (105) hide show
  1. package/.env.example +1 -0
  2. package/.github/workflows/coverall.cyberia.ci.yml +12 -3
  3. package/.github/workflows/cyberia-client.cd.yml +2 -1
  4. package/.github/workflows/cyberia-server.cd.yml +2 -1
  5. package/.github/workflows/docker-image.cyberia-client.ci.yml +1 -1
  6. package/.github/workflows/docker-image.cyberia-client.dev.ci.yml +1 -1
  7. package/.github/workflows/docker-image.cyberia-server.ci.yml +1 -1
  8. package/.github/workflows/docker-image.cyberia-server.dev.ci.yml +1 -1
  9. package/.github/workflows/docker-image.engine-cyberia.ci.yml +1 -1
  10. package/.github/workflows/docker-image.engine-cyberia.dev.ci.yml +1 -1
  11. package/.github/workflows/engine-cyberia.ci.yml +6 -0
  12. package/.github/workflows/ghpkg.ci.yml +19 -2
  13. package/.github/workflows/gitlab.ci.yml +8 -6
  14. package/.github/workflows/hardhat.ci.yml +4 -1
  15. package/.github/workflows/npmpkg.ci.yml +9 -5
  16. package/.github/workflows/publish.ci.yml +21 -12
  17. package/.github/workflows/publish.cyberia.ci.yml +25 -14
  18. package/.github/workflows/pwa-microservices-template-page.cd.yml +4 -2
  19. package/CHANGELOG.md +75 -140
  20. package/CLI-HELP.md +28 -1
  21. package/Dockerfile +1 -1
  22. package/Dockerfile.dev +1 -1
  23. package/Dockerfile.test +1 -1
  24. package/README.md +1 -1
  25. package/bin/build.js +2 -4
  26. package/bin/cyberia.js +4 -4
  27. package/bin/index.js +4 -4
  28. package/compose.env +1 -0
  29. package/conf.js +1 -1042
  30. package/deploy/cyberia-client/deploy.sh +13 -11
  31. package/deploy/cyberia-server/deploy.sh +13 -11
  32. package/deploy/dd-cyberia/sync-deploy.sh +7 -28
  33. package/deploy/lib/config.sh +1 -1
  34. package/deploy/lib/github-actions-logging.sh +3 -2
  35. package/deploy/pwa-microservices-template/deploy.sh +7 -1
  36. package/deployment.yaml +1 -1
  37. package/docker-compose.yml +7 -7
  38. package/docs/coverage/cyberia/api/cyberia-instance/cyberia-fallback-capture.js.html +1 -1
  39. package/docs/coverage/cyberia/api/cyberia-instance/index.html +1 -1
  40. package/docs/coverage/cyberia/api/cyberia-server-defaults/cyberia-server-defaults.js.html +1 -1
  41. package/docs/coverage/cyberia/api/cyberia-server-defaults/index.html +1 -1
  42. package/docs/coverage/cyberia/api/object-layer/index.html +1 -1
  43. package/docs/coverage/cyberia/api/object-layer/object-layer.model.js.html +1 -1
  44. package/docs/coverage/cyberia/index.html +1 -1
  45. package/docs/coverage/cyberia/projects/cyberia/atlas-sprite-sheet-generator.js.html +1 -1
  46. package/docs/coverage/cyberia/projects/cyberia/index.html +1 -1
  47. package/docs/coverage/cyberia/projects/cyberia/instance-backup.js.html +1 -1
  48. package/docs/coverage/cyberia/projects/cyberia/instance-data.js.html +1 -1
  49. package/docs/coverage/cyberia/projects/cyberia/shape-generator.js.html +1 -1
  50. package/docs/coverage/cyberia/projects/cyberia/stat-balance.js.html +1 -1
  51. package/hardhat/package-lock.json +6 -6
  52. package/hardhat/package.json +2 -2
  53. package/manifests/cronjobs/dd-cron/dd-cron-backup.yaml +1 -1
  54. package/manifests/cronjobs/dd-cron/dd-cron-vultr.yaml +1 -1
  55. package/manifests/deployment/dd-cyberia-development/deployment.yaml +1 -1
  56. package/manifests/deployment/dd-default-development/deployment.yaml +2 -2
  57. package/package.json +19 -17
  58. package/scripts/test-monitor.sh +1 -1
  59. package/src/api/file/file.router.js +7 -1
  60. package/src/cli/baremetal.js +1 -1
  61. package/src/cli/docker-compose.js +1 -1
  62. package/src/cli/index.js +36 -0
  63. package/src/cli/kubectl.js +4 -3
  64. package/src/cli/release.js +2 -0
  65. package/src/cli/repository.js +7 -2
  66. package/src/cli/run.js +1 -1
  67. package/src/cli/secrets.js +393 -200
  68. package/src/cli/socketsecurity.js +260 -0
  69. package/src/client/components/core/CssCore.js +3 -0
  70. package/src/client/components/core/Modal.js +160 -36
  71. package/src/client/components/core/SearchBox.js +0 -1
  72. package/src/client/components/underpost/AppShellUnderpost.js +13 -1
  73. package/src/client/components/underpost/CssUnderpost.js +15 -2
  74. package/src/client/public/cyberia-docs/CYBERIA-CLIENT.md +8 -0
  75. package/src/client/public/cyberia-docs/CYBERIA.md +1 -1
  76. package/src/client/public/cyberia-docs/OFF-CHAIN-ECONOMY.md +54 -56
  77. package/src/client/public/cyberia-docs/ROADMAP.md +1 -1
  78. package/src/client/public/cyberia-docs/UNDERPOST-PLATFORM.md +30 -29
  79. package/src/client/public/cyberia-docs/WHITE-PAPER.md +1 -1
  80. package/src/client/ssr/body/UnderpostDefaultSplashScreen.js +54 -25
  81. package/src/client/ssr/head/Css.js +12 -10
  82. package/src/client/ssr/views/Cyberia404.js +6 -10
  83. package/src/client/ssr/views/NotFound.js +75 -0
  84. package/src/client-builder/client-bundle.js +2 -2
  85. package/src/index.js +13 -1
  86. package/src/runtime/engine-cyberia/Dockerfile +1 -1
  87. package/src/runtime/engine-cyberia/Dockerfile.dev +1 -1
  88. package/src/runtime/engine-cyberia/Dockerfile.test +1 -1
  89. package/src/runtime/engine-cyberia/compose.env +1 -0
  90. package/src/runtime/engine-cyberia/docker-compose.yml +7 -7
  91. package/src/server/build/catalog.js +1 -0
  92. package/src/server/build/execution.js +19 -5
  93. package/src/server/build/package.js +166 -3
  94. package/src/server/build/testing.js +2 -1
  95. package/src/server/runtime/conf.js +21 -0
  96. package/src/server/runtime/config-scope.js +2 -0
  97. package/src/server/runtime/process.js +4 -3
  98. package/src/server/security/socketsecurity.js +1735 -0
  99. package/test/integration/infra/1-security/config-scope.test.js +3 -0
  100. package/test/integration/infra/1-security/socketsecurity.test.js +1041 -0
  101. package/test/integration/infra/1-security/sops-secret-store.test.js +201 -71
  102. package/test/unit/build-template.test.js +24 -0
  103. package/test/unit/deploy-log-table.test.js +38 -0
  104. package/test/unit/execution-profiles.test.js +1 -0
  105. package/test/unit/package.test.js +118 -0
@@ -4,6 +4,7 @@ import shell from 'shelljs';
4
4
  import { program } from '../../src/cli/index.js';
5
5
  import {
6
6
  STAGED_CLI_PACKAGE,
7
+ auditRuntimeDependencies,
7
8
  deployDependencySpecsFactory,
8
9
  packageRepositoryFactory,
9
10
  renamePackage,
@@ -12,9 +13,11 @@ import {
12
13
  buildProductPackageJson,
13
14
  deployPackageNameFactory,
14
15
  deployPackagePathFactory,
16
+ importPackageNameFactory,
15
17
  productDevDependenciesFactory,
16
18
  productPackageOptionsFactory,
17
19
  publishedProductPackageJson,
20
+ runtimeImportGraphFactory,
18
21
  stagePackageArchive,
19
22
  syncDeployPackages,
20
23
  } from '../../src/server/build/package.js';
@@ -328,6 +331,15 @@ describe('the manifest a product publishes to npm', () => {
328
331
  ).to.deep.equal({ underpost: '^4.0.0' });
329
332
  });
330
333
 
334
+ it('lets a GitHub Packages publish pin the engine under its scoped package name', () => {
335
+ expect(
336
+ publishedProductPackageJson({
337
+ packageJson: { version: '3.3.73' },
338
+ underpostPackageName: '@underpost/underpost',
339
+ }).dependencies,
340
+ ).to.deep.equal({ '@underpost/underpost': '^3.3.73' });
341
+ });
342
+
331
343
  it('refuses a manifest it cannot pin the engine CLI from', () => {
332
344
  expect(() => publishedProductPackageJson()).to.throw('packageJson');
333
345
  expect(() => publishedProductPackageJson({ packageJson: { name: 'cyberia' } })).to.throw('version');
@@ -455,3 +467,109 @@ describe('package identity is written in one place', () => {
455
467
  expect(() => setPackageRepository({})).to.throw('slug');
456
468
  });
457
469
  });
470
+
471
+ describe('runtime dependency audit', () => {
472
+ const tree = () => {
473
+ const root = fs.mkdtempSync(path.join(os.tmpdir(), 'underpost-runtime-graph-'));
474
+ fs.outputJsonSync(path.join(root, 'package.json'), {
475
+ dependencies: { express: '^5.0.0', 'fs-extra': '^11.0.0' },
476
+ devDependencies: { vitest: '5.0.0', bumpp: '^12.0.0' },
477
+ });
478
+ fs.outputFileSync(path.join(root, 'bin/index.js'), "import '../src/cli.js';\n");
479
+ fs.outputFileSync(
480
+ path.join(root, 'src/cli.js'),
481
+ [
482
+ "import express from 'express';",
483
+ "import { helper } from './lib';",
484
+ "/** @type {import('typedoc').Options} */",
485
+ "// import legacy from 'legacy-tool';",
486
+ "export const bump = () => import('bumpp');",
487
+ "export * from './lib/index.js';",
488
+ // A module chosen at runtime from a directory this tree does not ship.
489
+ 'export const grpc = (name) => import(`./grpc/${name}/grpc-server.js`);',
490
+ // Source text a command writes to disk and runs elsewhere; not an import of this module.
491
+ 'export const script = `',
492
+ " import hre from 'hardhat';",
493
+ '`;',
494
+ ].join('\n'),
495
+ );
496
+ fs.outputFileSync(
497
+ path.join(root, 'src/lib/index.js'),
498
+ "import fs from 'fs-extra';\nimport nodePath from 'node:path';\nimport { readFileSync } from 'fs';\nexport const helper = 1;\n",
499
+ );
500
+ fs.outputFileSync(
501
+ path.join(root, 'src/api/user/user.router.js'),
502
+ "import { run } from 'vitest';\nimport sharp from 'sharp';\n",
503
+ );
504
+ return root;
505
+ };
506
+
507
+ it('names the package a specifier imports', () => {
508
+ expect(importPackageNameFactory('express')).to.equal('express');
509
+ expect(importPackageNameFactory('@grpc/grpc-js/build/x.js')).to.equal('@grpc/grpc-js');
510
+ expect(importPackageNameFactory('socket.io/client-dist/socket.io.esm.min.js')).to.equal('socket.io');
511
+ for (const specifier of [
512
+ './x.js',
513
+ '../y.js',
514
+ '/abs.js',
515
+ 'node:fs',
516
+ 'fs',
517
+ 'path',
518
+ 'data:text/javascript,1',
519
+ 'https://cdn/x.js',
520
+ ])
521
+ expect(importPackageNameFactory(specifier), specifier).to.equal('');
522
+ });
523
+
524
+ it('walks the static graph from the entry points and records dynamic imports as lazy', async () => {
525
+ const root = tree();
526
+ try {
527
+ const graph = await runtimeImportGraphFactory({ root });
528
+ expect(graph.files).to.deep.equal([
529
+ 'bin/index.js',
530
+ 'src/api/user/user.router.js',
531
+ 'src/cli.js',
532
+ 'src/lib/index.js',
533
+ ]);
534
+ expect(graph.packages).to.deep.equal({
535
+ express: ['src/cli.js'],
536
+ 'fs-extra': ['src/lib/index.js'],
537
+ sharp: ['src/api/user/user.router.js'],
538
+ vitest: ['src/api/user/user.router.js'],
539
+ });
540
+ expect(graph.lazyPackages).to.deep.equal({ bumpp: ['src/cli.js'] });
541
+ } finally {
542
+ fs.removeSync(root);
543
+ }
544
+ });
545
+
546
+ it('flags a runtime import declared outside dependencies and accepts a catalog pin', async () => {
547
+ const root = tree();
548
+ try {
549
+ const audit = await auditRuntimeDependencies({ root, catalogs: [{ packageDependencies: { sharp: '^0.35.0' } }] });
550
+ expect(audit).to.include({ dependencies: 2, devDependencies: 2 });
551
+ expect(audit.runtime).to.deep.equal(['express', 'fs-extra', 'sharp', 'vitest']);
552
+ expect(audit.lazy).to.deep.equal(['bumpp (devDependencies)']);
553
+ expect(audit.misplaced).to.deep.equal([
554
+ { name: 'vitest', declaredIn: 'devDependencies', importers: ['src/api/user/user.router.js'] },
555
+ ]);
556
+ const unpinned = await auditRuntimeDependencies({ root, catalogs: [] });
557
+ expect(unpinned.misplaced.map(({ name, declaredIn }) => `${name}:${declaredIn}`)).to.deep.equal([
558
+ 'sharp:none',
559
+ 'vitest:devDependencies',
560
+ ]);
561
+ } finally {
562
+ fs.removeSync(root);
563
+ }
564
+ });
565
+
566
+ it('keeps every package this engine imports at runtime in dependencies', async () => {
567
+ // A production install omits devDependencies, so a runtime import from there breaks the
568
+ // published CLI at load time. This bundles the whole engine from its real entry points
569
+ // with esbuild, which comfortably clears the 5s default on a slower CI runner.
570
+ const audit = await auditRuntimeDependencies();
571
+ expect(audit.misplaced).to.deep.equal([]);
572
+ expect(audit.runtime).to.include.members(['commander', 'esbuild', 'express', 'mongoose']);
573
+ expect(audit.runtime).to.not.include.members(['vitest', 'chai', 'nodemon', 'bumpp']);
574
+ }, 30000);
575
+ });