@stamhoofd/cli 2.122.1
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/LICENSE.md +32 -0
- package/README.md +365 -0
- package/bin/stam.js +19 -0
- package/dist/base-command.d.ts +22 -0
- package/dist/base-command.d.ts.map +1 -0
- package/dist/base-command.js +23 -0
- package/dist/base-command.js.map +1 -0
- package/dist/command-flags.d.ts +8 -0
- package/dist/command-flags.d.ts.map +1 -0
- package/dist/command-flags.js +32 -0
- package/dist/command-flags.js.map +1 -0
- package/dist/commands/build.d.ts +12 -0
- package/dist/commands/build.d.ts.map +1 -0
- package/dist/commands/build.js +16 -0
- package/dist/commands/build.js.map +1 -0
- package/dist/commands/check/all.d.ts +12 -0
- package/dist/commands/check/all.d.ts.map +1 -0
- package/dist/commands/check/all.js +21 -0
- package/dist/commands/check/all.js.map +1 -0
- package/dist/commands/check/index.d.ts +8 -0
- package/dist/commands/check/index.d.ts.map +1 -0
- package/dist/commands/check/index.js +15 -0
- package/dist/commands/check/index.js.map +1 -0
- package/dist/commands/check/lint.d.ts +11 -0
- package/dist/commands/check/lint.d.ts.map +1 -0
- package/dist/commands/check/lint.js +16 -0
- package/dist/commands/check/lint.js.map +1 -0
- package/dist/commands/check/typecheck.d.ts +11 -0
- package/dist/commands/check/typecheck.d.ts.map +1 -0
- package/dist/commands/check/typecheck.js +16 -0
- package/dist/commands/check/typecheck.js.map +1 -0
- package/dist/commands/clean/index.d.ts +31 -0
- package/dist/commands/clean/index.d.ts.map +1 -0
- package/dist/commands/clean/index.js +131 -0
- package/dist/commands/clean/index.js.map +1 -0
- package/dist/commands/config/explain.d.ts +13 -0
- package/dist/commands/config/explain.d.ts.map +1 -0
- package/dist/commands/config/explain.js +26 -0
- package/dist/commands/config/explain.js.map +1 -0
- package/dist/commands/config/index.d.ts +8 -0
- package/dist/commands/config/index.d.ts.map +1 -0
- package/dist/commands/config/index.js +15 -0
- package/dist/commands/config/index.js.map +1 -0
- package/dist/commands/config/print.d.ts +13 -0
- package/dist/commands/config/print.d.ts.map +1 -0
- package/dist/commands/config/print.js +19 -0
- package/dist/commands/config/print.js.map +1 -0
- package/dist/commands/db/backup/index.d.ts +13 -0
- package/dist/commands/db/backup/index.d.ts.map +1 -0
- package/dist/commands/db/backup/index.js +31 -0
- package/dist/commands/db/backup/index.js.map +1 -0
- package/dist/commands/db/backup/list.d.ts +13 -0
- package/dist/commands/db/backup/list.d.ts.map +1 -0
- package/dist/commands/db/backup/list.js +38 -0
- package/dist/commands/db/backup/list.js.map +1 -0
- package/dist/commands/db/backup/remove.d.ts +15 -0
- package/dist/commands/db/backup/remove.d.ts.map +1 -0
- package/dist/commands/db/backup/remove.js +24 -0
- package/dist/commands/db/backup/remove.js.map +1 -0
- package/dist/commands/db/backup/rename.d.ts +15 -0
- package/dist/commands/db/backup/rename.d.ts.map +1 -0
- package/dist/commands/db/backup/rename.js +24 -0
- package/dist/commands/db/backup/rename.js.map +1 -0
- package/dist/commands/db/copy.d.ts +16 -0
- package/dist/commands/db/copy.d.ts.map +1 -0
- package/dist/commands/db/copy.js +27 -0
- package/dist/commands/db/copy.js.map +1 -0
- package/dist/commands/db/index.d.ts +8 -0
- package/dist/commands/db/index.d.ts.map +1 -0
- package/dist/commands/db/index.js +20 -0
- package/dist/commands/db/index.js.map +1 -0
- package/dist/commands/db/migrate.d.ts +13 -0
- package/dist/commands/db/migrate.d.ts.map +1 -0
- package/dist/commands/db/migrate.js +16 -0
- package/dist/commands/db/migrate.js.map +1 -0
- package/dist/commands/db/move.d.ts +16 -0
- package/dist/commands/db/move.d.ts.map +1 -0
- package/dist/commands/db/move.js +28 -0
- package/dist/commands/db/move.js.map +1 -0
- package/dist/commands/db/remove.d.ts +15 -0
- package/dist/commands/db/remove.d.ts.map +1 -0
- package/dist/commands/db/remove.js +25 -0
- package/dist/commands/db/remove.js.map +1 -0
- package/dist/commands/db/restore.d.ts +13 -0
- package/dist/commands/db/restore.d.ts.map +1 -0
- package/dist/commands/db/restore.js +31 -0
- package/dist/commands/db/restore.js.map +1 -0
- package/dist/commands/db/shell.d.ts +13 -0
- package/dist/commands/db/shell.d.ts.map +1 -0
- package/dist/commands/db/shell.js +20 -0
- package/dist/commands/db/shell.js.map +1 -0
- package/dist/commands/dev/index.d.ts +19 -0
- package/dist/commands/dev/index.d.ts.map +1 -0
- package/dist/commands/dev/index.js +63 -0
- package/dist/commands/dev/index.js.map +1 -0
- package/dist/commands/services/down.d.ts +11 -0
- package/dist/commands/services/down.d.ts.map +1 -0
- package/dist/commands/services/down.js +17 -0
- package/dist/commands/services/down.js.map +1 -0
- package/dist/commands/services/index.d.ts +8 -0
- package/dist/commands/services/index.d.ts.map +1 -0
- package/dist/commands/services/index.js +15 -0
- package/dist/commands/services/index.js.map +1 -0
- package/dist/commands/services/logs.d.ts +11 -0
- package/dist/commands/services/logs.d.ts.map +1 -0
- package/dist/commands/services/logs.js +15 -0
- package/dist/commands/services/logs.js.map +1 -0
- package/dist/commands/services/restart.d.ts +11 -0
- package/dist/commands/services/restart.d.ts.map +1 -0
- package/dist/commands/services/restart.js +18 -0
- package/dist/commands/services/restart.js.map +1 -0
- package/dist/commands/services/status.d.ts +11 -0
- package/dist/commands/services/status.d.ts.map +1 -0
- package/dist/commands/services/status.js +16 -0
- package/dist/commands/services/status.js.map +1 -0
- package/dist/commands/services/stop.d.ts +2 -0
- package/dist/commands/services/stop.d.ts.map +1 -0
- package/dist/commands/services/stop.js +2 -0
- package/dist/commands/services/stop.js.map +1 -0
- package/dist/commands/services/up.d.ts +11 -0
- package/dist/commands/services/up.d.ts.map +1 -0
- package/dist/commands/services/up.js +16 -0
- package/dist/commands/services/up.js.map +1 -0
- package/dist/commands/setup/index.d.ts +22 -0
- package/dist/commands/setup/index.d.ts.map +1 -0
- package/dist/commands/setup/index.js +69 -0
- package/dist/commands/setup/index.js.map +1 -0
- package/dist/commands/sso/config.d.ts +16 -0
- package/dist/commands/sso/config.d.ts.map +1 -0
- package/dist/commands/sso/config.js +21 -0
- package/dist/commands/sso/config.js.map +1 -0
- package/dist/commands/sso/index.d.ts +8 -0
- package/dist/commands/sso/index.d.ts.map +1 -0
- package/dist/commands/sso/index.js +16 -0
- package/dist/commands/sso/index.js.map +1 -0
- package/dist/commands/sso/logs.d.ts +13 -0
- package/dist/commands/sso/logs.d.ts.map +1 -0
- package/dist/commands/sso/logs.js +17 -0
- package/dist/commands/sso/logs.js.map +1 -0
- package/dist/commands/sso/start.d.ts +17 -0
- package/dist/commands/sso/start.d.ts.map +1 -0
- package/dist/commands/sso/start.js +32 -0
- package/dist/commands/sso/start.js.map +1 -0
- package/dist/commands/sso/stop.d.ts +13 -0
- package/dist/commands/sso/stop.d.ts.map +1 -0
- package/dist/commands/sso/stop.js +18 -0
- package/dist/commands/sso/stop.js.map +1 -0
- package/dist/commands/status.d.ts +15 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +61 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/test/all.d.ts +12 -0
- package/dist/commands/test/all.d.ts.map +1 -0
- package/dist/commands/test/all.js +19 -0
- package/dist/commands/test/all.js.map +1 -0
- package/dist/commands/test/e2e.d.ts +16 -0
- package/dist/commands/test/e2e.d.ts.map +1 -0
- package/dist/commands/test/e2e.js +32 -0
- package/dist/commands/test/e2e.js.map +1 -0
- package/dist/commands/test/index.d.ts +8 -0
- package/dist/commands/test/index.d.ts.map +1 -0
- package/dist/commands/test/index.js +16 -0
- package/dist/commands/test/index.js.map +1 -0
- package/dist/commands/test/unit.d.ts +12 -0
- package/dist/commands/test/unit.d.ts.map +1 -0
- package/dist/commands/test/unit.js +17 -0
- package/dist/commands/test/unit.js.map +1 -0
- package/dist/config/build-config.d.ts +15 -0
- package/dist/config/build-config.d.ts.map +1 -0
- package/dist/config/build-config.js +8 -0
- package/dist/config/build-config.js.map +1 -0
- package/dist/config/caddy-config.d.ts +122 -0
- package/dist/config/caddy-config.d.ts.map +1 -0
- package/dist/config/caddy-config.js +127 -0
- package/dist/config/caddy-config.js.map +1 -0
- package/dist/config/development-config.d.ts +48 -0
- package/dist/config/development-config.d.ts.map +1 -0
- package/dist/config/development-config.js +230 -0
- package/dist/config/development-config.js.map +1 -0
- package/dist/config/internal-secrets.d.ts +13 -0
- package/dist/config/internal-secrets.d.ts.map +1 -0
- package/dist/config/internal-secrets.js +65 -0
- package/dist/config/internal-secrets.js.map +1 -0
- package/dist/config/shared-service-config.d.ts +60 -0
- package/dist/config/shared-service-config.d.ts.map +1 -0
- package/dist/config/shared-service-config.js +94 -0
- package/dist/config/shared-service-config.js.map +1 -0
- package/dist/config/shared-service-profile.d.ts +29 -0
- package/dist/config/shared-service-profile.d.ts.map +1 -0
- package/dist/config/shared-service-profile.js +56 -0
- package/dist/config/shared-service-profile.js.map +1 -0
- package/dist/context/create-context.d.ts +19 -0
- package/dist/context/create-context.d.ts.map +1 -0
- package/dist/context/create-context.js +26 -0
- package/dist/context/create-context.js.map +1 -0
- package/dist/context/instance.d.ts +12 -0
- package/dist/context/instance.d.ts.map +1 -0
- package/dist/context/instance.js +26 -0
- package/dist/context/instance.js.map +1 -0
- package/dist/context/port-allocation.d.ts +3 -0
- package/dist/context/port-allocation.d.ts.map +1 -0
- package/dist/context/port-allocation.js +77 -0
- package/dist/context/port-allocation.js.map +1 -0
- package/dist/context/ports.d.ts +14 -0
- package/dist/context/ports.d.ts.map +1 -0
- package/dist/context/ports.js +17 -0
- package/dist/context/ports.js.map +1 -0
- package/dist/context/project-path.d.ts +2 -0
- package/dist/context/project-path.d.ts.map +1 -0
- package/dist/context/project-path.js +7 -0
- package/dist/context/project-path.js.map +1 -0
- package/dist/context/workspace.d.ts +5 -0
- package/dist/context/workspace.d.ts.map +1 -0
- package/dist/context/workspace.js +47 -0
- package/dist/context/workspace.js.map +1 -0
- package/dist/help.d.ts +13 -0
- package/dist/help.d.ts.map +1 -0
- package/dist/help.js +125 -0
- package/dist/help.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/runtime/command-runner.d.ts +20 -0
- package/dist/runtime/command-runner.d.ts.map +1 -0
- package/dist/runtime/command-runner.js +75 -0
- package/dist/runtime/command-runner.js.map +1 -0
- package/dist/runtime/database-command-helpers.d.ts +16 -0
- package/dist/runtime/database-command-helpers.d.ts.map +1 -0
- package/dist/runtime/database-command-helpers.js +64 -0
- package/dist/runtime/database-command-helpers.js.map +1 -0
- package/dist/runtime/db-backup-helpers.d.ts +24 -0
- package/dist/runtime/db-backup-helpers.d.ts.map +1 -0
- package/dist/runtime/db-backup-helpers.js +145 -0
- package/dist/runtime/db-backup-helpers.js.map +1 -0
- package/dist/runtime/live-output.d.ts +31 -0
- package/dist/runtime/live-output.d.ts.map +1 -0
- package/dist/runtime/live-output.js +139 -0
- package/dist/runtime/live-output.js.map +1 -0
- package/dist/runtime/manifest-store.d.ts +66 -0
- package/dist/runtime/manifest-store.d.ts.map +1 -0
- package/dist/runtime/manifest-store.js +188 -0
- package/dist/runtime/manifest-store.js.map +1 -0
- package/dist/runtime/monorepo-runner.d.ts +20 -0
- package/dist/runtime/monorepo-runner.d.ts.map +1 -0
- package/dist/runtime/monorepo-runner.js +175 -0
- package/dist/runtime/monorepo-runner.js.map +1 -0
- package/dist/runtime/one-password.d.ts +7 -0
- package/dist/runtime/one-password.d.ts.map +1 -0
- package/dist/runtime/one-password.js +90 -0
- package/dist/runtime/one-password.js.map +1 -0
- package/dist/runtime/output-target.d.ts +13 -0
- package/dist/runtime/output-target.d.ts.map +1 -0
- package/dist/runtime/output-target.js +22 -0
- package/dist/runtime/output-target.js.map +1 -0
- package/dist/runtime/show-help.d.ts +3 -0
- package/dist/runtime/show-help.d.ts.map +1 -0
- package/dist/runtime/show-help.js +6 -0
- package/dist/runtime/show-help.js.map +1 -0
- package/dist/runtime/status.d.ts +10 -0
- package/dist/runtime/status.d.ts.map +1 -0
- package/dist/runtime/status.js +28 -0
- package/dist/runtime/status.js.map +1 -0
- package/dist/runtime/ux.d.ts +62 -0
- package/dist/runtime/ux.d.ts.map +1 -0
- package/dist/runtime/ux.js +255 -0
- package/dist/runtime/ux.js.map +1 -0
- package/dist/services/definitions/caddy-service.d.ts +31 -0
- package/dist/services/definitions/caddy-service.d.ts.map +1 -0
- package/dist/services/definitions/caddy-service.js +93 -0
- package/dist/services/definitions/caddy-service.js.map +1 -0
- package/dist/services/definitions/coredns-service.d.ts +20 -0
- package/dist/services/definitions/coredns-service.d.ts.map +1 -0
- package/dist/services/definitions/coredns-service.js +43 -0
- package/dist/services/definitions/coredns-service.js.map +1 -0
- package/dist/services/definitions/maildev-service.d.ts +14 -0
- package/dist/services/definitions/maildev-service.d.ts.map +1 -0
- package/dist/services/definitions/maildev-service.js +28 -0
- package/dist/services/definitions/maildev-service.js.map +1 -0
- package/dist/services/definitions/mysql-service.d.ts +19 -0
- package/dist/services/definitions/mysql-service.d.ts.map +1 -0
- package/dist/services/definitions/mysql-service.js +41 -0
- package/dist/services/definitions/mysql-service.js.map +1 -0
- package/dist/services/definitions/rustfs-service.d.ts +16 -0
- package/dist/services/definitions/rustfs-service.d.ts.map +1 -0
- package/dist/services/definitions/rustfs-service.js +36 -0
- package/dist/services/definitions/rustfs-service.js.map +1 -0
- package/dist/services/definitions/sso-service.d.ts +27 -0
- package/dist/services/definitions/sso-service.d.ts.map +1 -0
- package/dist/services/definitions/sso-service.js +41 -0
- package/dist/services/definitions/sso-service.js.map +1 -0
- package/dist/services/definitions/stripe-service.d.ts +26 -0
- package/dist/services/definitions/stripe-service.d.ts.map +1 -0
- package/dist/services/definitions/stripe-service.js +70 -0
- package/dist/services/definitions/stripe-service.js.map +1 -0
- package/dist/services/docker-service.d.ts +39 -0
- package/dist/services/docker-service.d.ts.map +1 -0
- package/dist/services/docker-service.js +98 -0
- package/dist/services/docker-service.js.map +1 -0
- package/dist/services/docker.d.ts +23 -0
- package/dist/services/docker.d.ts.map +1 -0
- package/dist/services/docker.js +86 -0
- package/dist/services/docker.js.map +1 -0
- package/dist/services/manager.d.ts +25 -0
- package/dist/services/manager.d.ts.map +1 -0
- package/dist/services/manager.js +238 -0
- package/dist/services/manager.js.map +1 -0
- package/dist/services/registry.d.ts +3 -0
- package/dist/services/registry.d.ts.map +1 -0
- package/dist/services/registry.js +13 -0
- package/dist/services/registry.js.map +1 -0
- package/dist/services/service.d.ts +24 -0
- package/dist/services/service.d.ts.map +1 -0
- package/dist/services/service.js +2 -0
- package/dist/services/service.js.map +1 -0
- package/dist/services/shared-services.d.ts +17 -0
- package/dist/services/shared-services.d.ts.map +1 -0
- package/dist/services/shared-services.js +67 -0
- package/dist/services/shared-services.js.map +1 -0
- package/dist/services/sso-config.d.ts +14 -0
- package/dist/services/sso-config.d.ts.map +1 -0
- package/dist/services/sso-config.js +106 -0
- package/dist/services/sso-config.js.map +1 -0
- package/dist/services/stripe.d.ts +4 -0
- package/dist/services/stripe.d.ts.map +1 -0
- package/dist/services/stripe.js +8 -0
- package/dist/services/stripe.js.map +1 -0
- package/dist/workflows/setup-machine.d.ts +55 -0
- package/dist/workflows/setup-machine.d.ts.map +1 -0
- package/dist/workflows/setup-machine.js +529 -0
- package/dist/workflows/setup-machine.js.map +1 -0
- package/dist/workflows/setup-node.d.ts +14 -0
- package/dist/workflows/setup-node.d.ts.map +1 -0
- package/dist/workflows/setup-node.js +49 -0
- package/dist/workflows/setup-node.js.map +1 -0
- package/dist/workflows/setup-shell.d.ts +32 -0
- package/dist/workflows/setup-shell.d.ts.map +1 -0
- package/dist/workflows/setup-shell.js +104 -0
- package/dist/workflows/setup-shell.js.map +1 -0
- package/dist/workflows/start-dev.d.ts +13 -0
- package/dist/workflows/start-dev.d.ts.map +1 -0
- package/dist/workflows/start-dev.js +339 -0
- package/dist/workflows/start-dev.js.map +1 -0
- package/dist/workflows/start-services.d.ts +3 -0
- package/dist/workflows/start-services.d.ts.map +1 -0
- package/dist/workflows/start-services.js +6 -0
- package/dist/workflows/start-services.js.map +1 -0
- package/package.json +69 -0
|
@@ -0,0 +1,529 @@
|
|
|
1
|
+
import fs from 'node:fs/promises';
|
|
2
|
+
import dns from 'node:dns/promises';
|
|
3
|
+
import net from 'node:net';
|
|
4
|
+
import os from 'node:os';
|
|
5
|
+
import path from 'node:path';
|
|
6
|
+
import { writeSetupCaddyConfig } from '../config/caddy-config.js';
|
|
7
|
+
import { caddyContainer, caddyHttpPort, caddyHttpsPort, caddyRootCaPath, caddySetupAdminPort, defaultDomain, localIpv4Host, localhostPort } from '../config/shared-service-config.js';
|
|
8
|
+
import { buildSharedServiceProfile, SharedServiceDnsSetupKind } from '../config/shared-service-profile.js';
|
|
9
|
+
import { run } from '../runtime/command-runner.js';
|
|
10
|
+
import { sharedDir } from '../runtime/manifest-store.js';
|
|
11
|
+
import { CliStatus } from '../runtime/status.js';
|
|
12
|
+
import { command, confirm, statusCell, success, table, Table, warning } from '../runtime/ux.js';
|
|
13
|
+
import { corednsService } from '../services/definitions/coredns-service.js';
|
|
14
|
+
import * as docker from '../services/docker.js';
|
|
15
|
+
import { runServices } from './start-services.js';
|
|
16
|
+
import { checkNodeVersion, setupNodeVersion } from './setup-node.js';
|
|
17
|
+
const directDnsQueryTimeoutMs = 1000;
|
|
18
|
+
export var SetupAutomaticFixKey;
|
|
19
|
+
(function (SetupAutomaticFixKey) {
|
|
20
|
+
SetupAutomaticFixKey["Node"] = "node";
|
|
21
|
+
SetupAutomaticFixKey["Dns"] = "dns";
|
|
22
|
+
SetupAutomaticFixKey["PrivilegedPorts"] = "privileged-ports";
|
|
23
|
+
SetupAutomaticFixKey["Services"] = "services";
|
|
24
|
+
SetupAutomaticFixKey["Caddy"] = "caddy";
|
|
25
|
+
SetupAutomaticFixKey["Cert"] = "cert";
|
|
26
|
+
})(SetupAutomaticFixKey || (SetupAutomaticFixKey = {}));
|
|
27
|
+
export async function checkSetup(context) {
|
|
28
|
+
const profile = await currentSharedServiceProfile();
|
|
29
|
+
return {
|
|
30
|
+
node: await nodeCheck(context),
|
|
31
|
+
docker: await dockerCheck(),
|
|
32
|
+
privilegedPorts: await privilegedPortRedirectCheck(profile),
|
|
33
|
+
caddy: await caddyCheck(),
|
|
34
|
+
dns: await dnsCheck(context, profile),
|
|
35
|
+
cert: await certCheck(),
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
export async function checkSetupWithTable(context, options) {
|
|
39
|
+
const domain = process.env.STAMHOOFD_DOMAIN ?? defaultDomain;
|
|
40
|
+
const rows = {
|
|
41
|
+
node: Table.row(['Node.js', Table.cell('checking', { indeterminate: true }), '']),
|
|
42
|
+
docker: Table.row(['Podman / Docker', Table.cell('checking', { indeterminate: true }), '']),
|
|
43
|
+
privilegedPorts: Table.row(['Privileged port redirects', Table.cell('checking', { indeterminate: true }), '']),
|
|
44
|
+
caddy: Table.row(['Caddy', Table.cell('checking', { indeterminate: true }), '']),
|
|
45
|
+
dns: Table.row([`DNS .${domain}`, Table.cell('checking', { indeterminate: true }), '']),
|
|
46
|
+
cert: Table.row(['Caddy local CA', Table.cell('checking', { indeterminate: true }), '']),
|
|
47
|
+
};
|
|
48
|
+
const liveTable = Table.create({
|
|
49
|
+
title: 'Checking Stamhoofd local development setup',
|
|
50
|
+
headers: ['Check', 'Status', 'Details'],
|
|
51
|
+
rows: [rows.node, rows.docker, rows.privilegedPorts, rows.caddy, rows.dns, rows.cert],
|
|
52
|
+
live: options.live,
|
|
53
|
+
});
|
|
54
|
+
const profilePromise = currentSharedServiceProfile();
|
|
55
|
+
const results = await Promise.allSettled([
|
|
56
|
+
runSetupCheck(rows.node, 'Node.js', nodeCheck(context)),
|
|
57
|
+
runSetupCheck(rows.docker, 'Podman / Docker', dockerCheck()),
|
|
58
|
+
profilePromise.then(profile => runSetupCheck(rows.privilegedPorts, 'Privileged port redirects', privilegedPortRedirectCheck(profile))),
|
|
59
|
+
runSetupCheck(rows.caddy, 'Caddy', caddyCheck()),
|
|
60
|
+
profilePromise.then(profile => runSetupCheck(rows.dns, `DNS .${domain}`, dnsCheck(context, profile))),
|
|
61
|
+
runSetupCheck(rows.cert, 'Caddy local CA', certCheck()),
|
|
62
|
+
]);
|
|
63
|
+
await liveTable.wait();
|
|
64
|
+
const rejected = results.find((result) => result.status === 'rejected');
|
|
65
|
+
if (rejected) {
|
|
66
|
+
throw rejected.reason;
|
|
67
|
+
}
|
|
68
|
+
return {
|
|
69
|
+
node: results[0].status === 'fulfilled' ? results[0].value : neverRejected(results[0]),
|
|
70
|
+
docker: results[1].status === 'fulfilled' ? results[1].value : neverRejected(results[1]),
|
|
71
|
+
privilegedPorts: results[2].status === 'fulfilled' ? results[2].value : neverRejected(results[2]),
|
|
72
|
+
caddy: results[3].status === 'fulfilled' ? results[3].value : neverRejected(results[3]),
|
|
73
|
+
dns: results[4].status === 'fulfilled' ? results[4].value : neverRejected(results[4]),
|
|
74
|
+
cert: results[5].status === 'fulfilled' ? results[5].value : neverRejected(results[5]),
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
export function printSetupReport(report) {
|
|
78
|
+
table(['Check', 'Status', 'Details'], [
|
|
79
|
+
row('Node.js', report.node),
|
|
80
|
+
row('Podman / Docker', report.docker),
|
|
81
|
+
row('Privileged port redirects', report.privilegedPorts),
|
|
82
|
+
row('Caddy', report.caddy),
|
|
83
|
+
row(`DNS .${process.env.STAMHOOFD_DOMAIN ?? defaultDomain}`, report.dns),
|
|
84
|
+
row('Caddy local CA', report.cert),
|
|
85
|
+
], { title: 'Checking Stamhoofd local development setup' });
|
|
86
|
+
}
|
|
87
|
+
export async function runSetup(context) {
|
|
88
|
+
const report = await checkSetupWithTable(context, { live: true });
|
|
89
|
+
const fixes = getRecommendedSetupFixes(report);
|
|
90
|
+
if (fixes.length === 0) {
|
|
91
|
+
if (setupChecks(report).some(check => !check.ok)) {
|
|
92
|
+
console.log('\nResolve the missing manual setup items above, then run stam setup again.');
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
console.log('\nSetup looks ready. Next: stam dev all');
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
console.log('\nRecommended fixes:');
|
|
99
|
+
fixes.forEach(({ label }, index) => console.log(` ${index + 1}. ${label}`));
|
|
100
|
+
console.log('');
|
|
101
|
+
if (!(await confirm('Run recommended fixes now?', { default: true }))) {
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
for (const fix of fixes) {
|
|
105
|
+
if (fix.key === SetupAutomaticFixKey.Node) {
|
|
106
|
+
await setupNodeVersion(context.rootDir, { verbose: context.verbose });
|
|
107
|
+
console.log('\nActivate the new version in this terminal, then run stam setup again.');
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
else if (fix.key === SetupAutomaticFixKey.Dns) {
|
|
111
|
+
await setupDns({ yes: true, dryRun: false, verbose: context.verbose });
|
|
112
|
+
}
|
|
113
|
+
else if (fix.key === SetupAutomaticFixKey.PrivilegedPorts) {
|
|
114
|
+
await setupPrivilegedPortRedirects({ yes: true, dryRun: false, verbose: context.verbose });
|
|
115
|
+
}
|
|
116
|
+
else if (fix.key === SetupAutomaticFixKey.Services) {
|
|
117
|
+
await runServices(context);
|
|
118
|
+
}
|
|
119
|
+
else if (fix.key === SetupAutomaticFixKey.Caddy) {
|
|
120
|
+
await setupCaddy({ yes: true, dryRun: false, verbose: context.verbose });
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
await setupCert(context, { yes: true, dryRun: false });
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
export function getRecommendedSetupFixes(report) {
|
|
128
|
+
const fixes = [];
|
|
129
|
+
for (const check of setupChecks(report)) {
|
|
130
|
+
if (check.ok) {
|
|
131
|
+
continue;
|
|
132
|
+
}
|
|
133
|
+
if (!check.automaticFix) {
|
|
134
|
+
break;
|
|
135
|
+
}
|
|
136
|
+
fixes.push(check.automaticFix);
|
|
137
|
+
if (check.automaticFix.key === SetupAutomaticFixKey.Node) {
|
|
138
|
+
break;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
return fixes;
|
|
142
|
+
}
|
|
143
|
+
export function isSetupReady(report) {
|
|
144
|
+
return setupChecks(report).every(check => check.ok);
|
|
145
|
+
}
|
|
146
|
+
function setupChecks(report) {
|
|
147
|
+
return [report.node, report.docker, report.privilegedPorts, report.caddy, report.dns, report.cert];
|
|
148
|
+
}
|
|
149
|
+
async function nodeCheck(context) {
|
|
150
|
+
const check = await checkNodeVersion(context.rootDir);
|
|
151
|
+
if (check.ok) {
|
|
152
|
+
return { ok: true, details: check.details };
|
|
153
|
+
}
|
|
154
|
+
return {
|
|
155
|
+
ok: false,
|
|
156
|
+
details: check.details,
|
|
157
|
+
manualFix: 'stam setup node',
|
|
158
|
+
automaticFix: {
|
|
159
|
+
key: SetupAutomaticFixKey.Node,
|
|
160
|
+
label: `Install Node.js ${check.expected}`,
|
|
161
|
+
},
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
var IptablesChain;
|
|
165
|
+
(function (IptablesChain) {
|
|
166
|
+
IptablesChain["Prerouting"] = "PREROUTING";
|
|
167
|
+
IptablesChain["Output"] = "OUTPUT";
|
|
168
|
+
})(IptablesChain || (IptablesChain = {}));
|
|
169
|
+
var IptablesAction;
|
|
170
|
+
(function (IptablesAction) {
|
|
171
|
+
IptablesAction["Append"] = "-A";
|
|
172
|
+
IptablesAction["Check"] = "-C";
|
|
173
|
+
})(IptablesAction || (IptablesAction = {}));
|
|
174
|
+
function privilegedRedirectRules(profile) {
|
|
175
|
+
return [
|
|
176
|
+
{ chain: IptablesChain.Prerouting, fromPort: caddyHttpPort, toPort: profile.caddyHttpHostPort },
|
|
177
|
+
{ chain: IptablesChain.Prerouting, fromPort: caddyHttpsPort, toPort: profile.caddyHttpsHostPort },
|
|
178
|
+
{ chain: IptablesChain.Output, destination: localIpv4Host, fromPort: caddyHttpPort, toPort: profile.caddyHttpHostPort },
|
|
179
|
+
{ chain: IptablesChain.Output, destination: localIpv4Host, fromPort: caddyHttpsPort, toPort: profile.caddyHttpsHostPort },
|
|
180
|
+
];
|
|
181
|
+
}
|
|
182
|
+
export async function setupDns(options) {
|
|
183
|
+
const profile = await currentSharedServiceProfile();
|
|
184
|
+
if (profile.dnsSetupKind === SharedServiceDnsSetupKind.MacosResolver) {
|
|
185
|
+
await setupMacosDns(options);
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
if (profile.dnsSetupKind !== SharedServiceDnsSetupKind.SystemdResolved) {
|
|
189
|
+
throw new Error('Automatic DNS setup is not supported on this platform.');
|
|
190
|
+
}
|
|
191
|
+
const domain = process.env.STAMHOOFD_DOMAIN ?? defaultDomain;
|
|
192
|
+
const content = `[Resolve]\nDNS=${localIpv4Host}:${profile.corednsHostPort}\nDomains=~${domain}\n`;
|
|
193
|
+
const tempPath = path.join(os.tmpdir(), `stamhoofd-resolved-${process.pid}.conf`);
|
|
194
|
+
console.log(`This will configure temporary split DNS for .${domain}.`);
|
|
195
|
+
console.log('\nFile: /run/systemd/resolved.conf.d/stamhoofd.conf');
|
|
196
|
+
console.log(content.trim());
|
|
197
|
+
console.log('\nCommands:');
|
|
198
|
+
console.log(command(' sudo mkdir -p /run/systemd/resolved.conf.d'));
|
|
199
|
+
console.log(command(' sudo cp <tempfile> /run/systemd/resolved.conf.d/stamhoofd.conf'));
|
|
200
|
+
console.log(command(' sudo systemctl restart systemd-resolved'));
|
|
201
|
+
if (options.dryRun) {
|
|
202
|
+
warning('Dry run: DNS configuration was not changed.');
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
if (!options.yes && !(await confirm('Apply this DNS configuration?', { default: true }))) {
|
|
206
|
+
warning('DNS setup skipped.');
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
await fs.writeFile(tempPath, content);
|
|
210
|
+
await run('sudo', ['mkdir', '-p', '/run/systemd/resolved.conf.d'], { verbose: options.verbose });
|
|
211
|
+
await run('sudo', ['cp', tempPath, '/run/systemd/resolved.conf.d/stamhoofd.conf'], { verbose: options.verbose });
|
|
212
|
+
await fs.rm(tempPath, { force: true });
|
|
213
|
+
await run('sudo', ['systemctl', 'restart', 'systemd-resolved'], { verbose: options.verbose });
|
|
214
|
+
success('DNS configured.');
|
|
215
|
+
}
|
|
216
|
+
async function setupMacosDns(options) {
|
|
217
|
+
const domain = process.env.STAMHOOFD_DOMAIN ?? defaultDomain;
|
|
218
|
+
const resolverPath = macosResolverPath(domain);
|
|
219
|
+
const content = macosResolverContent();
|
|
220
|
+
const tempPath = path.join(os.tmpdir(), `stamhoofd-resolver-${process.pid}.conf`);
|
|
221
|
+
const existing = await readFileIfExists(resolverPath);
|
|
222
|
+
console.log(`This will configure .${domain} DNS through the macOS resolver.`);
|
|
223
|
+
console.log(`\nFile: ${resolverPath}`);
|
|
224
|
+
console.log(content.trim());
|
|
225
|
+
console.log('\nCommands:');
|
|
226
|
+
console.log(command(' sudo mkdir -p /etc/resolver'));
|
|
227
|
+
console.log(command(` sudo cp <tempfile> ${resolverPath}`));
|
|
228
|
+
if (existing !== undefined && existing !== content) {
|
|
229
|
+
warning(`${resolverPath} already exists with different contents.`);
|
|
230
|
+
}
|
|
231
|
+
if (existing === content) {
|
|
232
|
+
success('DNS already configured.');
|
|
233
|
+
return;
|
|
234
|
+
}
|
|
235
|
+
if (options.dryRun) {
|
|
236
|
+
warning('Dry run: DNS configuration was not changed.');
|
|
237
|
+
return;
|
|
238
|
+
}
|
|
239
|
+
if (existing !== undefined && existing !== content && !options.yes && !(await confirm(`Overwrite ${resolverPath}?`, { default: false }))) {
|
|
240
|
+
warning('DNS setup skipped.');
|
|
241
|
+
return;
|
|
242
|
+
}
|
|
243
|
+
if (existing === undefined && !options.yes && !(await confirm('Apply this DNS configuration?', { default: true }))) {
|
|
244
|
+
warning('DNS setup skipped.');
|
|
245
|
+
return;
|
|
246
|
+
}
|
|
247
|
+
await fs.writeFile(tempPath, content);
|
|
248
|
+
await run('sudo', ['mkdir', '-p', '/etc/resolver'], { verbose: options.verbose });
|
|
249
|
+
await run('sudo', ['cp', tempPath, resolverPath], { verbose: options.verbose });
|
|
250
|
+
await fs.rm(tempPath, { force: true });
|
|
251
|
+
success('DNS configured.');
|
|
252
|
+
}
|
|
253
|
+
export async function setupPrivilegedPortRedirects(options) {
|
|
254
|
+
if (process.platform !== 'linux') {
|
|
255
|
+
throw new Error('Automatic privileged port redirect setup currently supports Linux with iptables only.');
|
|
256
|
+
}
|
|
257
|
+
const profile = await currentSharedServiceProfile();
|
|
258
|
+
const rules = privilegedRedirectRules(profile);
|
|
259
|
+
console.log('This will redirect local HTTP/HTTPS traffic to the unprivileged ports used by local containers.');
|
|
260
|
+
console.log('\nCommands:');
|
|
261
|
+
for (const rule of rules) {
|
|
262
|
+
console.log(command(` ${formatIptablesCommand(IptablesAction.Append, rule)}`));
|
|
263
|
+
}
|
|
264
|
+
if (options.dryRun) {
|
|
265
|
+
warning('Dry run: privileged port redirects were not changed.');
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
if (!options.yes && !(await confirm('Apply these privileged port redirects?', { default: true }))) {
|
|
269
|
+
warning('Privileged port redirect setup skipped.');
|
|
270
|
+
return;
|
|
271
|
+
}
|
|
272
|
+
for (const rule of rules) {
|
|
273
|
+
if (!(await iptablesRuleExists(rule))) {
|
|
274
|
+
await run('sudo', iptablesArgs(IptablesAction.Append, rule), { verbose: options.verbose });
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
success('Privileged port redirects configured.');
|
|
278
|
+
}
|
|
279
|
+
export async function setupCaddy(options) {
|
|
280
|
+
if (process.platform !== 'darwin') {
|
|
281
|
+
throw new Error('Automatic Caddy installation currently supports macOS with Homebrew only.');
|
|
282
|
+
}
|
|
283
|
+
console.log('This will install Caddy using Homebrew.');
|
|
284
|
+
console.log('\nCommands:');
|
|
285
|
+
console.log(command(' brew install caddy'));
|
|
286
|
+
if (options.dryRun) {
|
|
287
|
+
warning('Dry run: Caddy was not installed.');
|
|
288
|
+
return;
|
|
289
|
+
}
|
|
290
|
+
if (!options.yes && !(await confirm('Install Caddy with Homebrew?', { default: true }))) {
|
|
291
|
+
warning('Caddy installation skipped.');
|
|
292
|
+
return;
|
|
293
|
+
}
|
|
294
|
+
await run('brew', ['install', 'caddy'], { verbose: options.verbose });
|
|
295
|
+
success('Caddy installed.');
|
|
296
|
+
}
|
|
297
|
+
export async function setupCert(context, options) {
|
|
298
|
+
console.log('This will trust the local development CA using a temporary local Caddy instance.');
|
|
299
|
+
if (options.dryRun) {
|
|
300
|
+
warning('Dry run: certificate trust was not changed.');
|
|
301
|
+
return;
|
|
302
|
+
}
|
|
303
|
+
if (!options.yes && !(await confirm('Trust the Stamhoofd development CA?', { default: true }))) {
|
|
304
|
+
warning('Certificate setup skipped.');
|
|
305
|
+
return;
|
|
306
|
+
}
|
|
307
|
+
await fs.mkdir(sharedDir(context), { recursive: true });
|
|
308
|
+
const configPath = await writeSetupCaddyConfig(context);
|
|
309
|
+
const pidPath = path.join(sharedDir(context), 'caddy-setup.pid');
|
|
310
|
+
console.log('Preparing temporary local Caddy CA...');
|
|
311
|
+
await run('caddy', ['start', '--config', configPath, '--pidfile', pidPath], { verbose: context.verbose });
|
|
312
|
+
try {
|
|
313
|
+
await run('caddy', ['trust', '--config', configPath, '--address', localhostPort(caddySetupAdminPort)], { verbose: context.verbose });
|
|
314
|
+
}
|
|
315
|
+
finally {
|
|
316
|
+
await run('caddy', ['stop', '--config', configPath, '--address', localhostPort(caddySetupAdminPort)], { allowFailure: true, quiet: true, verbose: context.verbose });
|
|
317
|
+
await fs.rm(pidPath, { force: true });
|
|
318
|
+
}
|
|
319
|
+
success('Caddy local CA trusted.');
|
|
320
|
+
}
|
|
321
|
+
async function dnsCheck(context, profile) {
|
|
322
|
+
const domain = process.env.STAMHOOFD_DOMAIN ?? defaultDomain;
|
|
323
|
+
if (profile.dnsSetupKind === SharedServiceDnsSetupKind.MacosResolver) {
|
|
324
|
+
return await macosDnsCheck(context, domain);
|
|
325
|
+
}
|
|
326
|
+
if (!(await dnsConfigurationCheck(domain, profile))) {
|
|
327
|
+
return { ok: false, details: `Local DNS is not configured for .${domain}`, manualFix: 'stam setup dns', automaticFix: { key: SetupAutomaticFixKey.Dns, label: 'Configure local DNS' } };
|
|
328
|
+
}
|
|
329
|
+
const result = await run('resolvectl', ['query', `dashboard.${domain}`], { capture: true, allowFailure: true });
|
|
330
|
+
if (result.stdout.includes(localIpv4Host)) {
|
|
331
|
+
return { ok: true, details: `dashboard.${domain} resolves to ${localIpv4Host}` };
|
|
332
|
+
}
|
|
333
|
+
const corednsStatus = await corednsService.status(context);
|
|
334
|
+
if (!corednsStatus.running) {
|
|
335
|
+
return { ok: false, details: `Local DNS is configured, but CoreDNS is not running`, manualFix: 'stam services up', automaticFix: { key: SetupAutomaticFixKey.Services, label: 'Start shared services' } };
|
|
336
|
+
}
|
|
337
|
+
return { ok: false, details: `Local DNS is configured and CoreDNS is running, but dashboard.${domain} does not resolve to ${localIpv4Host}`, manualFix: 'stam setup dns' };
|
|
338
|
+
}
|
|
339
|
+
async function macosDnsCheck(context, domain) {
|
|
340
|
+
const resolverPath = macosResolverPath(domain);
|
|
341
|
+
const content = await readFileIfExists(resolverPath);
|
|
342
|
+
if (content === undefined) {
|
|
343
|
+
return { ok: false, details: `${resolverPath} does not exist`, manualFix: 'stam setup dns', automaticFix: { key: SetupAutomaticFixKey.Dns, label: 'Configure local DNS' } };
|
|
344
|
+
}
|
|
345
|
+
if (content !== macosResolverContent()) {
|
|
346
|
+
return { ok: false, details: `${resolverPath} exists with unexpected contents`, manualFix: 'stam setup dns' };
|
|
347
|
+
}
|
|
348
|
+
const corednsStatus = await corednsService.status(context);
|
|
349
|
+
if (!corednsStatus.running) {
|
|
350
|
+
return { ok: false, details: `Local DNS is configured, but CoreDNS is not running`, manualFix: 'stam services up', automaticFix: { key: SetupAutomaticFixKey.Services, label: 'Start shared services' } };
|
|
351
|
+
}
|
|
352
|
+
if (await directCorednsCheck(domain)) {
|
|
353
|
+
return { ok: true, details: `dashboard.${domain} resolves to ${localIpv4Host}` };
|
|
354
|
+
}
|
|
355
|
+
return { ok: false, details: `Local DNS is configured and CoreDNS is running, but dashboard.${domain} does not resolve to ${process.env.PUBLIC_IP || localIpv4Host}`, manualFix: 'stam setup dns' };
|
|
356
|
+
}
|
|
357
|
+
async function directCorednsCheck(domain) {
|
|
358
|
+
const resolver = new dns.Resolver({ timeout: directDnsQueryTimeoutMs, tries: 1 });
|
|
359
|
+
resolver.setServers([localIpv4Host]);
|
|
360
|
+
try {
|
|
361
|
+
const addresses = await resolver.resolve4(`dashboard.${domain}`);
|
|
362
|
+
return addresses.includes(process.env.PUBLIC_IP || localIpv4Host);
|
|
363
|
+
}
|
|
364
|
+
catch {
|
|
365
|
+
return false;
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
async function dnsConfigurationCheck(domain, profile) {
|
|
369
|
+
const [dns, domains] = await Promise.all([
|
|
370
|
+
run('resolvectl', ['dns'], { capture: true, allowFailure: true }),
|
|
371
|
+
run('resolvectl', ['domain'], { capture: true, allowFailure: true }),
|
|
372
|
+
]);
|
|
373
|
+
return dns.status === 0
|
|
374
|
+
&& domains.status === 0
|
|
375
|
+
&& dns.stdout.includes(`${localIpv4Host}:${profile.corednsHostPort}`)
|
|
376
|
+
&& domains.stdout.includes(`~${domain}`);
|
|
377
|
+
}
|
|
378
|
+
async function certCheck() {
|
|
379
|
+
const certPath = caddyRootCaPath();
|
|
380
|
+
try {
|
|
381
|
+
await fs.access(certPath);
|
|
382
|
+
return { ok: true, details: certPath };
|
|
383
|
+
}
|
|
384
|
+
catch {
|
|
385
|
+
return { ok: false, details: 'Caddy local CA not found', manualFix: 'stam setup cert', automaticFix: { key: SetupAutomaticFixKey.Cert, label: 'Trust local HTTPS certificates' } };
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
async function privilegedPortRedirectCheck(profile) {
|
|
389
|
+
if (!profile.needsPrivilegedRedirects) {
|
|
390
|
+
return { ok: true, details: 'not needed for docker' };
|
|
391
|
+
}
|
|
392
|
+
if (process.platform !== 'linux') {
|
|
393
|
+
return { ok: false, details: 'Privileged port redirects require Linux with iptables', manualFix: 'Configure privileged port redirects' };
|
|
394
|
+
}
|
|
395
|
+
let caddyRunning;
|
|
396
|
+
try {
|
|
397
|
+
caddyRunning = await docker.containerIsRunning(caddyContainer);
|
|
398
|
+
}
|
|
399
|
+
catch {
|
|
400
|
+
return { ok: true, details: 'container runtime unavailable' };
|
|
401
|
+
}
|
|
402
|
+
if (caddyRunning) {
|
|
403
|
+
const highPortsReady = await portAcceptsConnection(profile.caddyHttpHostPort) && await portAcceptsConnection(profile.caddyHttpsHostPort);
|
|
404
|
+
if (!highPortsReady) {
|
|
405
|
+
return { ok: false, details: `Caddy is running, but ${localhostPort(profile.caddyHttpHostPort)} or ${localhostPort(profile.caddyHttpsHostPort)} is not reachable`, manualFix: 'stam services restart' };
|
|
406
|
+
}
|
|
407
|
+
if (await portAcceptsConnection(caddyHttpPort) && await portAcceptsConnection(caddyHttpsPort)) {
|
|
408
|
+
return { ok: true, details: `${localhostPort(caddyHttpPort)} -> ${localhostPort(profile.caddyHttpHostPort)}, ${localhostPort(caddyHttpsPort)} -> ${localhostPort(profile.caddyHttpsHostPort)}` };
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
const missingRules = [];
|
|
412
|
+
for (const rule of privilegedRedirectRules(profile)) {
|
|
413
|
+
if (!(await iptablesRuleExists(rule))) {
|
|
414
|
+
missingRules.push(rule);
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
return missingRules.length === 0
|
|
418
|
+
? { ok: true, details: `${localhostPort(caddyHttpPort)} -> ${localhostPort(profile.caddyHttpHostPort)}, ${localhostPort(caddyHttpsPort)} -> ${localhostPort(profile.caddyHttpsHostPort)}` }
|
|
419
|
+
: { ok: false, details: `${missingRules.length} privileged port redirect${missingRules.length === 1 ? '' : 's'} missing`, manualFix: 'stam setup', automaticFix: { key: SetupAutomaticFixKey.PrivilegedPorts, label: 'Configure privileged port redirects' } };
|
|
420
|
+
}
|
|
421
|
+
async function caddyCheck() {
|
|
422
|
+
const result = await run('caddy', ['version'], { capture: true, allowFailure: true });
|
|
423
|
+
if (result.status !== 0) {
|
|
424
|
+
if (process.platform === 'darwin') {
|
|
425
|
+
return { ok: false, details: 'caddy not found', manualFix: 'stam setup', automaticFix: { key: SetupAutomaticFixKey.Caddy, label: 'Install Caddy with Homebrew' } };
|
|
426
|
+
}
|
|
427
|
+
return { ok: false, details: 'caddy not found', manualFix: 'Install Caddy, then run stam setup cert' };
|
|
428
|
+
}
|
|
429
|
+
return { ok: true, details: result.stdout.trim() };
|
|
430
|
+
}
|
|
431
|
+
async function currentSharedServiceProfile() {
|
|
432
|
+
let runtime = docker.ContainerRuntime.Docker;
|
|
433
|
+
try {
|
|
434
|
+
runtime = await docker.getContainerRuntime();
|
|
435
|
+
}
|
|
436
|
+
catch {
|
|
437
|
+
// Setup can still report DNS and Caddy issues before Docker is running.
|
|
438
|
+
}
|
|
439
|
+
return buildSharedServiceProfile(runtime);
|
|
440
|
+
}
|
|
441
|
+
function macosResolverPath(domain) {
|
|
442
|
+
return path.join('/etc/resolver', domain);
|
|
443
|
+
}
|
|
444
|
+
function macosResolverContent() {
|
|
445
|
+
return `nameserver ${localIpv4Host}\n`;
|
|
446
|
+
}
|
|
447
|
+
async function readFileIfExists(filePath) {
|
|
448
|
+
try {
|
|
449
|
+
return await fs.readFile(filePath, 'utf8');
|
|
450
|
+
}
|
|
451
|
+
catch (error) {
|
|
452
|
+
if (error && typeof error === 'object' && 'code' in error && error.code === 'ENOENT') {
|
|
453
|
+
return undefined;
|
|
454
|
+
}
|
|
455
|
+
throw error;
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
async function iptablesRuleExists(rule) {
|
|
459
|
+
const result = await run('sudo', ['-n', ...iptablesArgs(IptablesAction.Check, rule)], { capture: true, quiet: true, allowFailure: true });
|
|
460
|
+
return result.status === 0;
|
|
461
|
+
}
|
|
462
|
+
async function portAcceptsConnection(port) {
|
|
463
|
+
return await new Promise((resolve) => {
|
|
464
|
+
const socket = net.createConnection({ host: localIpv4Host, port });
|
|
465
|
+
const done = (result) => {
|
|
466
|
+
socket.destroy();
|
|
467
|
+
resolve(result);
|
|
468
|
+
};
|
|
469
|
+
socket.setTimeout(500);
|
|
470
|
+
socket.once('connect', () => done(true));
|
|
471
|
+
socket.once('error', () => done(false));
|
|
472
|
+
socket.once('timeout', () => done(false));
|
|
473
|
+
});
|
|
474
|
+
}
|
|
475
|
+
function iptablesArgs(action, rule) {
|
|
476
|
+
return [
|
|
477
|
+
'iptables',
|
|
478
|
+
'-t',
|
|
479
|
+
'nat',
|
|
480
|
+
action,
|
|
481
|
+
rule.chain,
|
|
482
|
+
'-p',
|
|
483
|
+
'tcp',
|
|
484
|
+
...(rule.destination ? ['-d', rule.destination] : []),
|
|
485
|
+
'--dport',
|
|
486
|
+
String(rule.fromPort),
|
|
487
|
+
'-j',
|
|
488
|
+
'REDIRECT',
|
|
489
|
+
'--to-port',
|
|
490
|
+
String(rule.toPort),
|
|
491
|
+
];
|
|
492
|
+
}
|
|
493
|
+
function formatIptablesCommand(action, rule) {
|
|
494
|
+
return ['sudo', ...iptablesArgs(action, rule)].join(' ');
|
|
495
|
+
}
|
|
496
|
+
async function dockerCheck() {
|
|
497
|
+
try {
|
|
498
|
+
const runtime = await docker.getContainerRuntime();
|
|
499
|
+
return { ok: true, details: runtime === docker.ContainerRuntime.Podman ? 'podman ready' : 'docker daemon reachable' };
|
|
500
|
+
}
|
|
501
|
+
catch (error) {
|
|
502
|
+
return { ok: false, details: error instanceof Error ? error.message : 'container runtime not reachable', manualFix: 'Start Podman or Docker, then run stam setup' };
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
async function runSetupCheck(row, label, check) {
|
|
506
|
+
try {
|
|
507
|
+
const result = await check;
|
|
508
|
+
row.update(setupRow(label, result));
|
|
509
|
+
return result;
|
|
510
|
+
}
|
|
511
|
+
catch (error) {
|
|
512
|
+
row.update([
|
|
513
|
+
label,
|
|
514
|
+
statusCell(CliStatus.Failed),
|
|
515
|
+
error instanceof Error ? error.message : String(error),
|
|
516
|
+
]);
|
|
517
|
+
throw error;
|
|
518
|
+
}
|
|
519
|
+
}
|
|
520
|
+
function neverRejected(result) {
|
|
521
|
+
throw result.reason;
|
|
522
|
+
}
|
|
523
|
+
function row(label, result) {
|
|
524
|
+
return setupRow(label, result);
|
|
525
|
+
}
|
|
526
|
+
function setupRow(label, result) {
|
|
527
|
+
return [label, statusCell(result.ok ? CliStatus.Ready : CliStatus.Missing), result.manualFix ? `${result.details} (${result.manualFix})` : result.details];
|
|
528
|
+
}
|
|
529
|
+
//# sourceMappingURL=setup-machine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup-machine.js","sourceRoot":"","sources":["../../src/workflows/setup-machine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export type NodeVersionCheck = {
|
|
2
|
+
ok: boolean;
|
|
3
|
+
current: string;
|
|
4
|
+
expected: string;
|
|
5
|
+
details: string;
|
|
6
|
+
};
|
|
7
|
+
export declare function checkNodeVersion(rootDir: string): Promise<NodeVersionCheck>;
|
|
8
|
+
export declare function nodeInstallCommand(rootDir: string, currentDir?: string): string;
|
|
9
|
+
export declare function setupNodeVersion(rootDir: string, options: {
|
|
10
|
+
verbose: boolean;
|
|
11
|
+
dryRun?: boolean;
|
|
12
|
+
}): Promise<void>;
|
|
13
|
+
export declare function printNodeVersionStatus(check: NodeVersionCheck): void;
|
|
14
|
+
//# sourceMappingURL=setup-node.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup-node.d.ts","sourceRoot":"","sources":["../../src/workflows/setup-node.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,gBAAgB,GAAG;IAC3B,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAcjF;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,GAAE,MAAsB,GAAG,MAAM,CAG9F;AAED,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBtH;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,gBAAgB,GAAG,IAAI,CAUpE"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import fs from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { run } from '../runtime/command-runner.js';
|
|
4
|
+
import { CliStatus } from '../runtime/status.js';
|
|
5
|
+
import { command, info, statusCell, table, warning } from '../runtime/ux.js';
|
|
6
|
+
import chalk from 'chalk';
|
|
7
|
+
export async function checkNodeVersion(rootDir) {
|
|
8
|
+
const configured = (await fs.readFile(path.join(rootDir, '.nvmrc'), 'utf8')).trim();
|
|
9
|
+
const expected = configured.startsWith('v') ? configured : `v${configured}`;
|
|
10
|
+
const current = process.version;
|
|
11
|
+
const ok = current === expected;
|
|
12
|
+
return {
|
|
13
|
+
ok,
|
|
14
|
+
current,
|
|
15
|
+
expected,
|
|
16
|
+
details: ok
|
|
17
|
+
? `${current} matches .nvmrc`
|
|
18
|
+
: `Expected Node ${expected}, got ${current}`,
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
export function nodeInstallCommand(rootDir, currentDir = process.cwd()) {
|
|
22
|
+
const scriptPath = path.relative(currentDir, path.join(rootDir, '.development/install-node.sh'));
|
|
23
|
+
return `source ${JSON.stringify(scriptPath)}`;
|
|
24
|
+
}
|
|
25
|
+
export async function setupNodeVersion(rootDir, options) {
|
|
26
|
+
if (options.dryRun) {
|
|
27
|
+
console.log(command(nodeInstallCommand(rootDir)));
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
const scriptPath = path.join(rootDir, '.development/install-node.sh');
|
|
31
|
+
await run('bash', ['-c', '. "$1"', 'stam-install-node', scriptPath], {
|
|
32
|
+
cwd: rootDir,
|
|
33
|
+
verbose: options.verbose,
|
|
34
|
+
});
|
|
35
|
+
info('');
|
|
36
|
+
warning(chalk.yellow('ACTION REQUIRED: this terminal is still using the old Node.js version.'));
|
|
37
|
+
info('');
|
|
38
|
+
info('Restart your terminal before continuing, or activate the new version now:');
|
|
39
|
+
info(` ${command(nodeInstallCommand(rootDir))}`);
|
|
40
|
+
info('');
|
|
41
|
+
}
|
|
42
|
+
export function printNodeVersionStatus(check) {
|
|
43
|
+
table(['Check', 'Status', 'Details'], [[
|
|
44
|
+
'Node.js',
|
|
45
|
+
statusCell(check.ok ? CliStatus.Ready : CliStatus.Failed),
|
|
46
|
+
check.ok ? check.details : `${check.details} (run "stam setup node")`,
|
|
47
|
+
]], { title: 'Development runtime' });
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=setup-node.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup-node.js","sourceRoot":"","sources":["../../src/workflows/setup-node.ts"],"names":[],"mappings":"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"}
|