@underpostnet/cyberia 3.3.76 → 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.
- package/.env.example +1 -0
- package/.github/workflows/coverall.cyberia.ci.yml +17 -3
- package/.github/workflows/cyberia-client.cd.yml +2 -1
- package/.github/workflows/cyberia-server.cd.yml +2 -1
- package/.github/workflows/docker-image.cyberia-client.ci.yml +1 -1
- package/.github/workflows/docker-image.cyberia-client.dev.ci.yml +1 -1
- package/.github/workflows/docker-image.cyberia-server.ci.yml +1 -1
- package/.github/workflows/docker-image.cyberia-server.dev.ci.yml +1 -1
- package/.github/workflows/docker-image.engine-cyberia.ci.yml +1 -1
- package/.github/workflows/docker-image.engine-cyberia.dev.ci.yml +1 -1
- package/.github/workflows/engine-cyberia.ci.yml +7 -1
- package/.github/workflows/ghpkg.ci.yml +19 -2
- package/.github/workflows/gitlab.ci.yml +8 -6
- package/.github/workflows/hardhat.ci.yml +4 -1
- package/.github/workflows/npmpkg.ci.yml +9 -5
- package/.github/workflows/publish.ci.yml +21 -12
- package/.github/workflows/publish.cyberia.ci.yml +25 -14
- package/.github/workflows/pwa-microservices-template-page.cd.yml +4 -2
- package/CHANGELOG.md +110 -262
- package/CLI-HELP.md +29 -2
- package/Dockerfile +1 -1
- package/Dockerfile.dev +1 -1
- package/Dockerfile.test +1 -1
- package/README.md +1 -1
- package/bin/build.js +67 -14
- package/bin/cyberia.js +4 -4
- package/bin/index.js +4 -4
- package/compose.env +1 -0
- package/conf.js +1 -1043
- package/deploy/cyberia-client/deploy.sh +13 -11
- package/deploy/cyberia-server/deploy.sh +13 -11
- package/deploy/dd-cyberia/sync-deploy.sh +7 -28
- package/deploy/lib/config.sh +1 -1
- package/deploy/lib/github-actions-logging.sh +3 -2
- package/deploy/lib/host.sh +1 -1
- package/deploy/pwa-microservices-template/deploy.sh +7 -1
- package/deployment.yaml +1 -1
- package/docker-compose.yml +7 -7
- package/docs/coverage/cyberia/api/cyberia-instance/cyberia-fallback-capture.js.html +1591 -0
- package/docs/coverage/cyberia/api/cyberia-instance/index.html +116 -0
- package/docs/coverage/cyberia/api/cyberia-server-defaults/cyberia-server-defaults.js.html +4138 -0
- package/docs/coverage/cyberia/api/cyberia-server-defaults/index.html +116 -0
- package/docs/coverage/cyberia/api/object-layer/index.html +116 -0
- package/docs/coverage/cyberia/api/object-layer/object-layer.model.js.html +1393 -0
- package/docs/coverage/cyberia/base.css +362 -0
- package/docs/coverage/cyberia/block-navigation.js +82 -0
- package/docs/coverage/cyberia/favicon.png +0 -0
- package/docs/coverage/cyberia/index.html +161 -0
- package/docs/coverage/cyberia/prettify.css +101 -0
- package/docs/coverage/cyberia/prettify.js +937 -0
- package/docs/coverage/cyberia/projects/cyberia/atlas-sprite-sheet-generator.js.html +1315 -0
- package/docs/coverage/cyberia/projects/cyberia/index.html +176 -0
- package/docs/coverage/cyberia/projects/cyberia/instance-backup.js.html +715 -0
- package/docs/coverage/cyberia/projects/cyberia/instance-data.js.html +2182 -0
- package/docs/coverage/cyberia/projects/cyberia/shape-generator.js.html +3265 -0
- package/docs/coverage/cyberia/projects/cyberia/stat-balance.js.html +328 -0
- package/docs/coverage/cyberia/sort-arrow-sprite.png +0 -0
- package/docs/coverage/cyberia/sorter.js +205 -0
- package/hardhat/package-lock.json +6 -6
- package/hardhat/package.json +2 -2
- package/manifests/cronjobs/dd-cron/dd-cron-backup.yaml +1 -1
- package/manifests/cronjobs/dd-cron/dd-cron-vultr.yaml +1 -1
- package/manifests/deployment/dd-cyberia-development/deployment.yaml +1 -1
- package/manifests/deployment/dd-default-development/deployment.yaml +2 -2
- package/package.json +19 -17
- package/scripts/test-monitor.sh +1 -1
- package/src/api/file/file.router.js +7 -1
- package/src/cli/baremetal.js +1 -1
- package/src/cli/cluster.js +73 -18
- package/src/cli/deploy.js +211 -30
- package/src/cli/docker-compose.js +1 -1
- package/src/cli/index.js +36 -0
- package/src/cli/kubectl.js +4 -3
- package/src/cli/release.js +5 -1
- package/src/cli/repository.js +14 -11
- package/src/cli/run.js +10 -3
- package/src/cli/secrets.js +393 -200
- package/src/cli/socketsecurity.js +260 -0
- package/src/client/components/core/Badge.js +0 -1
- package/src/client/components/core/CssCore.js +11 -1
- package/src/client/components/core/Modal.js +189 -66
- package/src/client/components/core/SearchBox.js +0 -1
- package/src/client/components/core/ToolTip.js +15 -0
- package/src/client/components/cryptokoyn/AppShellCryptokoyn.js +0 -2
- package/src/client/components/cyberia-portal/RouterCyberiaPortal.js +0 -4
- package/src/client/components/default/AppShellDefault.js +1 -4
- package/src/client/components/itemledger/AppShellItemledger.js +0 -2
- package/src/client/components/underpost/AppShellUnderpost.js +12 -0
- package/src/client/components/underpost/CssUnderpost.js +15 -2
- package/src/client/public/cyberia-docs/CYBERIA-CLIENT.md +8 -0
- package/src/client/public/cyberia-docs/CYBERIA.md +1 -1
- package/src/client/public/cyberia-docs/OFF-CHAIN-ECONOMY.md +54 -56
- package/src/client/public/cyberia-docs/ROADMAP.md +1 -1
- package/src/client/public/cyberia-docs/UNDERPOST-PLATFORM.md +30 -29
- package/src/client/public/cyberia-docs/WHITE-PAPER.md +1 -1
- package/src/client/ssr/body/UnderpostDefaultSplashScreen.js +54 -25
- package/src/client/ssr/head/Css.js +12 -10
- package/src/client/ssr/views/Cyberia404.js +9 -13
- package/src/client/ssr/views/NotFound.js +75 -0
- package/src/client-builder/client-bundle.js +2 -2
- package/src/index.js +13 -1
- package/src/runtime/engine-cyberia/Dockerfile +1 -1
- package/src/runtime/engine-cyberia/Dockerfile.dev +1 -1
- package/src/runtime/engine-cyberia/Dockerfile.test +1 -1
- package/src/runtime/engine-cyberia/compose.env +1 -0
- package/src/runtime/engine-cyberia/docker-compose.yml +7 -7
- package/src/server/build/catalog.js +1 -0
- package/src/server/build/execution.js +19 -5
- package/src/server/build/package.js +166 -3
- package/src/server/build/testing.js +2 -1
- package/src/server/network/underpost-gateway.js +113 -14
- package/src/server/runtime/conf.js +57 -7
- package/src/server/runtime/config-scope.js +2 -0
- package/src/server/runtime/process.js +4 -3
- package/src/server/runtime/start.js +11 -2
- package/src/server/security/socketsecurity.js +1735 -0
- package/test/integration/infra/1-security/config-scope.test.js +3 -0
- package/test/integration/infra/1-security/socketsecurity.test.js +1041 -0
- package/test/integration/infra/1-security/sops-secret-store.test.js +201 -71
- package/test/integration/infra/4-ingress/underpost-ingress.test.js +1 -1
- package/test/unit/build-template.test.js +24 -0
- package/test/unit/catalog.test.js +13 -2
- package/test/unit/conf-resolution.test.js +41 -7
- package/test/unit/cyberia/instance-data.test.js +314 -0
- package/test/unit/deploy-legacy-gateway-sweep.test.js +63 -0
- package/test/unit/deploy-log-table.test.js +38 -0
- package/test/unit/execution-profiles.test.js +1 -0
- package/test/unit/gateway-pod-fetch.test.js +95 -0
- package/test/unit/letsencrypt-issuer.test.js +101 -0
- package/test/unit/package.test.js +118 -0
- package/test/unit/release-bump.test.js +3 -1
- package/test/unit/start-options.test.js +12 -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
|
+
});
|
|
@@ -307,7 +307,9 @@ describe('release pipeline commands', () => {
|
|
|
307
307
|
commands = [];
|
|
308
308
|
const { triggerCmd } = await UnderpostRelease.API.ci(deployId, 'fixture message');
|
|
309
309
|
expect(triggerCmd, deployId).to.include('/engine-cyberia');
|
|
310
|
-
|
|
310
|
+
// `--coverage`: the published source must carry the reports the deploy declares, or
|
|
311
|
+
// every pod started from it serves the unavailable page.
|
|
312
|
+
expect(commands, deployId).to.include('node bin/build dd-cyberia --coverage');
|
|
311
313
|
}
|
|
312
314
|
});
|
|
313
315
|
|
|
@@ -37,6 +37,18 @@ describe('start receives every flag its command registers', () => {
|
|
|
37
37
|
expect(buildContract).to.include('{ force: Underpost.state.isInsideContainer() }');
|
|
38
38
|
});
|
|
39
39
|
|
|
40
|
+
it('withdraws the ephemeral engine-private clone once a production container is serving', () => {
|
|
41
|
+
// Regression: the domain-split withdraw passed `force: false` to every domain, and only
|
|
42
|
+
// `host clean --force` removes `engine-private` — the clone outlived the boot in the pod.
|
|
43
|
+
const runStart = source.indexOf('async run(');
|
|
44
|
+
const withdraw = source.slice(
|
|
45
|
+
source.indexOf('for (const domain of', runStart),
|
|
46
|
+
source.indexOf('setTimeout', runStart),
|
|
47
|
+
);
|
|
48
|
+
expect(withdraw).to.include('[Underpost.secret, Underpost.host, Underpost.app]');
|
|
49
|
+
expect(withdraw).to.include('force: domain === Underpost.host');
|
|
50
|
+
});
|
|
51
|
+
|
|
40
52
|
it('runs the container in one phase, with no re-entry through the global CLI', () => {
|
|
41
53
|
// The pod's own bootstrap replaces the checkout and links the CLI before `start` is
|
|
42
54
|
// invoked, so re-execing `underpost start` here only pulled and installed a second time.
|