From 005ea4146be8d9dcd56b67782954ec38d2fc5b74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gergely=20B=C3=A9k=C3=A9si?= Date: Tue, 5 May 2026 12:00:10 +0200 Subject: [PATCH 1/8] feat: show warning when new swarm-cli version is available --- src/command/root-command/index.ts | 3 +++ src/service/version_checker.ts | 22 ++++++++++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 src/service/version_checker.ts diff --git a/src/command/root-command/index.ts b/src/command/root-command/index.ts index 11f62adf..33e882ba 100644 --- a/src/command/root-command/index.ts +++ b/src/command/root-command/index.ts @@ -6,6 +6,7 @@ import { parseHeaders } from '../../utils' import { ConfigOption } from '../../utils/types/config-option' import { CONFIG_OPTIONS, CommandConfig } from './command-config' import { CommandLog, VerbosityLevel } from './command-log' +import { checkForUpdates } from '../../service/version_checker' export class RootCommand { @ExternalOption('bee-api-url') @@ -57,6 +58,8 @@ export class RootCommand { this.commandConfig = new CommandConfig(this.appName, this.console, this.configFile, this.configFolder) this.sourcemap = Utils.getSourcemap() + checkForUpdates() + CONFIG_OPTIONS.forEach((option: ConfigOption) => { this.maybeSetFromConfig(option) }) diff --git a/src/service/version_checker.ts b/src/service/version_checker.ts new file mode 100644 index 00000000..0a776c67 --- /dev/null +++ b/src/service/version_checker.ts @@ -0,0 +1,22 @@ +import PackageJson from '../../package.json' +import { CommandLog, VerbosityLevel } from '../command/root-command/command-log' +import { warningText } from '../utils/text' + +const LATEST_RELEASE_URL = 'https://api.github.com/repos/ethersphere/swarm-cli/releases/latest' + +export async function checkForUpdates() { + const console = new CommandLog(VerbosityLevel.Normal) + await fetch(LATEST_RELEASE_URL) + .then(res => res.json()) + .then((data: { tag_name: string }) => { + const latestVersion = data.tag_name.replace(/^v/, '') + + if (latestVersion !== PackageJson.version) { + console.log( + warningText( + `A new version of swarm-cli is available: ${latestVersion}. You are using version ${PackageJson.version}. Please update to the latest version.`, + ), + ) + } + }) +} From 767ecb28dbae72ce8ece2938a7a191c335a61c96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gergely=20B=C3=A9k=C3=A9si?= Date: Wed, 6 May 2026 10:08:50 +0200 Subject: [PATCH 2/8] fix: make version check switchable for tests --- jest.config.ts | 2 ++ src/command/root-command/index.ts | 4 +++- src/service/version_checker.ts | 5 +++++ test/command/version-warning.spec.ts | 20 ++++++++++++++++++++ 4 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 test/command/version-warning.spec.ts diff --git a/jest.config.ts b/jest.config.ts index b6be5d57..136fdd76 100644 --- a/jest.config.ts +++ b/jest.config.ts @@ -17,6 +17,8 @@ export default async (): Promise => { */ const console = new CommandLog(VerbosityLevel.Normal) + process.env.SKIP_VERSION_CHECK = 'true' + if (!process.env.SKIP_WORKER) { process.env.WORKER_PSS_ADDRESS = (await getPssAddress('http://localhost:11633')).toCompressedHex() } diff --git a/src/command/root-command/index.ts b/src/command/root-command/index.ts index 33e882ba..46ab87b0 100644 --- a/src/command/root-command/index.ts +++ b/src/command/root-command/index.ts @@ -58,7 +58,9 @@ export class RootCommand { this.commandConfig = new CommandConfig(this.appName, this.console, this.configFile, this.configFolder) this.sourcemap = Utils.getSourcemap() - checkForUpdates() + if (!this.quiet) { + checkForUpdates() + } CONFIG_OPTIONS.forEach((option: ConfigOption) => { this.maybeSetFromConfig(option) diff --git a/src/service/version_checker.ts b/src/service/version_checker.ts index 0a776c67..9804aab0 100644 --- a/src/service/version_checker.ts +++ b/src/service/version_checker.ts @@ -1,10 +1,15 @@ import PackageJson from '../../package.json' import { CommandLog, VerbosityLevel } from '../command/root-command/command-log' import { warningText } from '../utils/text' +import fetch from 'node-fetch' const LATEST_RELEASE_URL = 'https://api.github.com/repos/ethersphere/swarm-cli/releases/latest' export async function checkForUpdates() { + if (process.env.SKIP_VERSION_CHECK === 'true') { + return + } + const console = new CommandLog(VerbosityLevel.Normal) await fetch(LATEST_RELEASE_URL) .then(res => res.json()) diff --git a/test/command/version-warning.spec.ts b/test/command/version-warning.spec.ts new file mode 100644 index 00000000..85b47b31 --- /dev/null +++ b/test/command/version-warning.spec.ts @@ -0,0 +1,20 @@ +import fetch, { Response } from 'node-fetch' +import PackageJson from '../../package.json' +import { describeCommand, invokeTestCli } from '../utility' + +jest.mock('node-fetch') +const mockedFetch = fetch as jest.MockedFunction + +describeCommand('Test Outdated Version Warning', ({ consoleMessages }) => { + it('should print warning when version is outdated', async () => { + process.env.SKIP_VERSION_CHECK = 'false' + mockedFetch.mockResolvedValue({ + json: () => Promise.resolve({ tag_name: 'v999.0.0' }), + } as unknown as Response) + await invokeTestCli(['status']) + expect(consoleMessages[2]).toContain( + `A new version of swarm-cli is available: 999.0.0. You are using version ${PackageJson.version}. Please update to the latest version.`, + ) + process.env.SKIP_VERSION_CHECK = 'true' + }) +}) From a2090d998e7e96120de248198890f1aa14f7a9bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gergely=20B=C3=A9k=C3=A9si?= Date: Wed, 6 May 2026 10:31:28 +0200 Subject: [PATCH 3/8] ci: update deposit command --- .github/workflows/tests-rc.yaml | 10 +++++----- .github/workflows/tests.yaml | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/.github/workflows/tests-rc.yaml b/.github/workflows/tests-rc.yaml index 83c8ddc2..47cb462d 100644 --- a/.github/workflows/tests-rc.yaml +++ b/.github/workflows/tests-rc.yaml @@ -58,11 +58,11 @@ jobs: - name: Deposit to chequebook run: | - swarm-cli cheque deposit 100000000000000000 - swarm-cli cheque deposit 100000000000000000 --bee-api-url http://localhost:11633 - swarm-cli cheque deposit 100000000000000000 --bee-api-url http://localhost:21633 - swarm-cli cheque deposit 100000000000000000 --bee-api-url http://localhost:31633 - swarm-cli cheque deposit 100000000000000000 --bee-api-url http://localhost:41633 + swarm-cli cheque deposit 10 + swarm-cli cheque deposit 10 --bee-api-url http://localhost:11633 + swarm-cli cheque deposit 10 --bee-api-url http://localhost:21633 + swarm-cli cheque deposit 10 --bee-api-url http://localhost:31633 + swarm-cli cheque deposit 10 --bee-api-url http://localhost:41633 - name: Print swarm-cli status continue-on-error: true diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index e752252a..7e8863bc 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -42,11 +42,11 @@ jobs: - name: Deposit to chequebook run: | - swarm-cli cheque deposit 100000000000000000 - swarm-cli cheque deposit 100000000000000000 --bee-api-url http://localhost:11633 - swarm-cli cheque deposit 100000000000000000 --bee-api-url http://localhost:21633 - swarm-cli cheque deposit 100000000000000000 --bee-api-url http://localhost:31633 - swarm-cli cheque deposit 100000000000000000 --bee-api-url http://localhost:41633 + swarm-cli cheque deposit 10 + swarm-cli cheque deposit 10 --bee-api-url http://localhost:11633 + swarm-cli cheque deposit 10 --bee-api-url http://localhost:21633 + swarm-cli cheque deposit 10 --bee-api-url http://localhost:31633 + swarm-cli cheque deposit 10 --bee-api-url http://localhost:41633 - name: Print swarm-cli status continue-on-error: true From b494a3e57a8e03ab9ae327e19bf030e153947ad9 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 6 May 2026 08:47:34 +0000 Subject: [PATCH 4/8] test: update test coverage --- test/coverage/coverage-summary.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/test/coverage/coverage-summary.json b/test/coverage/coverage-summary.json index ed815663..1bf3c644 100644 --- a/test/coverage/coverage-summary.json +++ b/test/coverage/coverage-summary.json @@ -1,4 +1,4 @@ -{"total": {"lines":{"total":2863,"covered":2186,"skipped":0,"pct":76.35},"statements":{"total":2884,"covered":2200,"skipped":0,"pct":76.28},"functions":{"total":343,"covered":271,"skipped":0,"pct":79},"branches":{"total":621,"covered":353,"skipped":0,"pct":56.84},"branchesTrue":{"total":0,"covered":0,"skipped":0,"pct":100}} +{"total": {"lines":{"total":2880,"covered":2203,"skipped":0,"pct":76.49},"statements":{"total":2901,"covered":2217,"skipped":0,"pct":76.42},"functions":{"total":346,"covered":274,"skipped":0,"pct":79.19},"branches":{"total":624,"covered":356,"skipped":0,"pct":57.05},"branchesTrue":{"total":0,"covered":0,"skipped":0,"pct":100}} ,"/home/runner/work/swarm-cli/swarm-cli/src/application.ts": {"lines":{"total":2,"covered":0,"skipped":0,"pct":0},"functions":{"total":0,"covered":0,"skipped":0,"pct":100},"statements":{"total":2,"covered":0,"skipped":0,"pct":0},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}} ,"/home/runner/work/swarm-cli/swarm-cli/src/config.ts": {"lines":{"total":33,"covered":32,"skipped":0,"pct":96.96},"functions":{"total":1,"covered":0,"skipped":0,"pct":0},"statements":{"total":33,"covered":32,"skipped":0,"pct":96.96},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}} ,"/home/runner/work/swarm-cli/swarm-cli/src/curl.ts": {"lines":{"total":24,"covered":24,"skipped":0,"pct":100},"functions":{"total":7,"covered":7,"skipped":0,"pct":100},"statements":{"total":25,"covered":25,"skipped":0,"pct":100},"branches":{"total":13,"covered":12,"skipped":0,"pct":92.3}} @@ -65,7 +65,7 @@ ,"/home/runner/work/swarm-cli/swarm-cli/src/command/pss/subscribe.ts": {"lines":{"total":18,"covered":8,"skipped":0,"pct":44.44},"functions":{"total":5,"covered":1,"skipped":0,"pct":20},"statements":{"total":18,"covered":8,"skipped":0,"pct":44.44},"branches":{"total":4,"covered":0,"skipped":0,"pct":0}} ,"/home/runner/work/swarm-cli/swarm-cli/src/command/root-command/command-config.ts": {"lines":{"total":39,"covered":33,"skipped":0,"pct":84.61},"functions":{"total":8,"covered":8,"skipped":0,"pct":100},"statements":{"total":42,"covered":35,"skipped":0,"pct":83.33},"branches":{"total":11,"covered":6,"skipped":0,"pct":54.54}} ,"/home/runner/work/swarm-cli/swarm-cli/src/command/root-command/command-log.ts": {"lines":{"total":78,"covered":60,"skipped":0,"pct":76.92},"functions":{"total":9,"covered":6,"skipped":0,"pct":66.66},"statements":{"total":78,"covered":60,"skipped":0,"pct":76.92},"branches":{"total":11,"covered":7,"skipped":0,"pct":63.63}} -,"/home/runner/work/swarm-cli/swarm-cli/src/command/root-command/index.ts": {"lines":{"total":44,"covered":40,"skipped":0,"pct":90.9},"functions":{"total":4,"covered":4,"skipped":0,"pct":100},"statements":{"total":44,"covered":40,"skipped":0,"pct":90.9},"branches":{"total":9,"covered":5,"skipped":0,"pct":55.55}} +,"/home/runner/work/swarm-cli/swarm-cli/src/command/root-command/index.ts": {"lines":{"total":47,"covered":43,"skipped":0,"pct":91.48},"functions":{"total":4,"covered":4,"skipped":0,"pct":100},"statements":{"total":47,"covered":43,"skipped":0,"pct":91.48},"branches":{"total":10,"covered":6,"skipped":0,"pct":60}} ,"/home/runner/work/swarm-cli/swarm-cli/src/command/root-command/printer.ts": {"lines":{"total":9,"covered":9,"skipped":0,"pct":100},"functions":{"total":6,"covered":6,"skipped":0,"pct":100},"statements":{"total":9,"covered":9,"skipped":0,"pct":100},"branches":{"total":1,"covered":1,"skipped":0,"pct":100}} ,"/home/runner/work/swarm-cli/swarm-cli/src/command/stake/deposit.ts": {"lines":{"total":40,"covered":31,"skipped":0,"pct":77.5},"functions":{"total":3,"covered":3,"skipped":0,"pct":100},"statements":{"total":40,"covered":31,"skipped":0,"pct":77.5},"branches":{"total":17,"covered":11,"skipped":0,"pct":64.7}} ,"/home/runner/work/swarm-cli/swarm-cli/src/command/stake/index.ts": {"lines":{"total":8,"covered":8,"skipped":0,"pct":100},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":8,"covered":8,"skipped":0,"pct":100},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}} @@ -92,6 +92,7 @@ ,"/home/runner/work/swarm-cli/swarm-cli/src/command/wallet/status.ts": {"lines":{"total":11,"covered":11,"skipped":0,"pct":100},"functions":{"total":2,"covered":2,"skipped":0,"pct":100},"statements":{"total":11,"covered":11,"skipped":0,"pct":100},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}} ,"/home/runner/work/swarm-cli/swarm-cli/src/command/wallet/withdraw-bzz.ts": {"lines":{"total":21,"covered":19,"skipped":0,"pct":90.47},"functions":{"total":2,"covered":2,"skipped":0,"pct":100},"statements":{"total":21,"covered":19,"skipped":0,"pct":90.47},"branches":{"total":6,"covered":3,"skipped":0,"pct":50}} ,"/home/runner/work/swarm-cli/swarm-cli/src/command/wallet/withdraw-dai.ts": {"lines":{"total":21,"covered":19,"skipped":0,"pct":90.47},"functions":{"total":2,"covered":2,"skipped":0,"pct":100},"statements":{"total":21,"covered":19,"skipped":0,"pct":90.47},"branches":{"total":6,"covered":3,"skipped":0,"pct":50}} +,"/home/runner/work/swarm-cli/swarm-cli/src/service/version_checker.ts": {"lines":{"total":14,"covered":14,"skipped":0,"pct":100},"functions":{"total":3,"covered":3,"skipped":0,"pct":100},"statements":{"total":14,"covered":14,"skipped":0,"pct":100},"branches":{"total":2,"covered":2,"skipped":0,"pct":100}} ,"/home/runner/work/swarm-cli/swarm-cli/src/service/history/index.ts": {"lines":{"total":21,"covered":19,"skipped":0,"pct":90.47},"functions":{"total":5,"covered":5,"skipped":0,"pct":100},"statements":{"total":22,"covered":20,"skipped":0,"pct":90.9},"branches":{"total":1,"covered":1,"skipped":0,"pct":100}} ,"/home/runner/work/swarm-cli/swarm-cli/src/service/identity/index.ts": {"lines":{"total":36,"covered":32,"skipped":0,"pct":88.88},"functions":{"total":7,"covered":7,"skipped":0,"pct":100},"statements":{"total":36,"covered":32,"skipped":0,"pct":88.88},"branches":{"total":9,"covered":6,"skipped":0,"pct":66.66}} ,"/home/runner/work/swarm-cli/swarm-cli/src/service/identity/types/identity.ts": {"lines":{"total":4,"covered":4,"skipped":0,"pct":100},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":4,"covered":4,"skipped":0,"pct":100},"branches":{"total":2,"covered":2,"skipped":0,"pct":100}} From abc07528edd8716ed0a700485cb0559eb0edabf5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gergely=20B=C3=A9k=C3=A9si?= Date: Thu, 7 May 2026 14:58:33 +0200 Subject: [PATCH 5/8] refactor: use caching mechanism for version fetching --- src/command/root-command/command-config.ts | 4 ++ src/command/root-command/index.ts | 22 +++++-- src/service/version_checker.ts | 74 +++++++++++++++++----- test/command/version-warning.spec.ts | 18 ++++-- test/utility/index.ts | 1 + 5 files changed, 93 insertions(+), 26 deletions(-) diff --git a/src/command/root-command/command-config.ts b/src/command/root-command/command-config.ts index afd9ea5e..4b66619f 100644 --- a/src/command/root-command/command-config.ts +++ b/src/command/root-command/command-config.ts @@ -58,6 +58,10 @@ export class CommandConfig { return process.env.SWARM_CLI_HISTORY_FILE_PATH || join(this.configFolderPath, 'upload-history.json') } + public getVersionCheckFilePath(): string { + return process.env.SWARM_CLI_VERSION_CHECK_FILE_PATH || join(this.configFolderPath, 'version-check.json') + } + public setHistoryEnabled(enabled: boolean): void { this.config.historyEnabled = enabled this.saveConfig() diff --git a/src/command/root-command/index.ts b/src/command/root-command/index.ts index 46ab87b0..0449af6a 100644 --- a/src/command/root-command/index.ts +++ b/src/command/root-command/index.ts @@ -6,7 +6,9 @@ import { parseHeaders } from '../../utils' import { ConfigOption } from '../../utils/types/config-option' import { CONFIG_OPTIONS, CommandConfig } from './command-config' import { CommandLog, VerbosityLevel } from './command-log' -import { checkForUpdates } from '../../service/version_checker' +import { checkForUpdates, getLatestVersionCheck } from '../../service/version_checker' +import PackageJson from '../../../package.json' +import { warningText } from '../../utils/text' export class RootCommand { @ExternalOption('bee-api-url') @@ -58,10 +60,6 @@ export class RootCommand { this.commandConfig = new CommandConfig(this.appName, this.console, this.configFile, this.configFolder) this.sourcemap = Utils.getSourcemap() - if (!this.quiet) { - checkForUpdates() - } - CONFIG_OPTIONS.forEach((option: ConfigOption) => { this.maybeSetFromConfig(option) }) @@ -84,6 +82,20 @@ export class RootCommand { this.verbosity = VerbosityLevel.Verbose } this.console = new CommandLog(this.verbosity) + + if (!this.quiet) { + const latestVersionCheck = getLatestVersionCheck(this.commandConfig) + + if (latestVersionCheck === null) { + checkForUpdates(this.commandConfig) + } else if (latestVersionCheck.latestVersion !== PackageJson.version) { + this.console.log( + warningText( + `A new version of swarm-cli is available: ${latestVersionCheck.latestVersion}. You are using version ${PackageJson.version}. Please update to get the latest features and fixes.`, + ), + ) + } + } } private maybeSetFromConfig(option: ConfigOption): void { diff --git a/src/service/version_checker.ts b/src/service/version_checker.ts index 9804aab0..173e8fde 100644 --- a/src/service/version_checker.ts +++ b/src/service/version_checker.ts @@ -1,27 +1,67 @@ +import { existsSync, readFileSync, writeFileSync } from 'fs' import PackageJson from '../../package.json' -import { CommandLog, VerbosityLevel } from '../command/root-command/command-log' -import { warningText } from '../utils/text' +import { CommandConfig } from '../command/root-command/command-config' import fetch from 'node-fetch' +import { Dates } from 'cafe-utility' const LATEST_RELEASE_URL = 'https://api.github.com/repos/ethersphere/swarm-cli/releases/latest' -export async function checkForUpdates() { +type VersionCheckData = { + latestVersion: string + expiresAt: number +} + +export async function checkForUpdates(config: CommandConfig) { if (process.env.SKIP_VERSION_CHECK === 'true') { return } - const console = new CommandLog(VerbosityLevel.Normal) - await fetch(LATEST_RELEASE_URL) - .then(res => res.json()) - .then((data: { tag_name: string }) => { - const latestVersion = data.tag_name.replace(/^v/, '') - - if (latestVersion !== PackageJson.version) { - console.log( - warningText( - `A new version of swarm-cli is available: ${latestVersion}. You are using version ${PackageJson.version}. Please update to the latest version.`, - ), - ) - } - }) + const filePath = config.getVersionCheckFilePath() + + try { + const response = await fetch(LATEST_RELEASE_URL) + + if (!response.ok) { + process.stderr.write(`Failed to fetch latest release info: ${response.status} ${response.statusText}\n`) + + return + } + + const data = (await response.json()) as { tag_name: string } + const latestVersion = data.tag_name.replace(/^v/, '') + const versionCheckData = { + latestVersion, + expiresAt: Date.now() + Dates.days(1), + } + process.stderr.write(JSON.stringify(versionCheckData) + '\n') + + if (latestVersion !== PackageJson.version) { + writeFileSync(filePath, JSON.stringify(versionCheckData)) + } + } catch { + return + } +} + +export function getLatestVersionCheck(config: CommandConfig): VersionCheckData | null { + const filePath = config.getVersionCheckFilePath() + + if (!existsSync(filePath)) { + return null + } + + try { + const data = JSON.parse(readFileSync(filePath).toString()) as VersionCheckData + + if (Date.now() > data.expiresAt) { + return null + } + + return { + latestVersion: data.latestVersion, + expiresAt: data.expiresAt, + } + } catch { + return null + } } diff --git a/test/command/version-warning.spec.ts b/test/command/version-warning.spec.ts index 85b47b31..0198dfff 100644 --- a/test/command/version-warning.spec.ts +++ b/test/command/version-warning.spec.ts @@ -1,20 +1,30 @@ import fetch, { Response } from 'node-fetch' import PackageJson from '../../package.json' import { describeCommand, invokeTestCli } from '../utility' +import { existsSync, unlinkSync } from 'fs' jest.mock('node-fetch') const mockedFetch = fetch as jest.MockedFunction -describeCommand('Test Outdated Version Warning', ({ consoleMessages }) => { +describeCommand('Test Outdated Version Warning', ({ hasMessageContaining }) => { + afterEach(() => { + if (existsSync('./test/testconfig/version-check.json')) { + unlinkSync('./test/testconfig/version-check.json') + } + }) it('should print warning when version is outdated', async () => { process.env.SKIP_VERSION_CHECK = 'false' mockedFetch.mockResolvedValue({ + ok: true, json: () => Promise.resolve({ tag_name: 'v999.0.0' }), } as unknown as Response) await invokeTestCli(['status']) - expect(consoleMessages[2]).toContain( - `A new version of swarm-cli is available: 999.0.0. You are using version ${PackageJson.version}. Please update to the latest version.`, - ) + await invokeTestCli(['status']) + expect( + hasMessageContaining( + `A new version of swarm-cli is available: 999.0.0. You are using version ${PackageJson.version}. Please update to get the latest features and fixes.`, + ), + ).toBe(true) process.env.SKIP_VERSION_CHECK = 'true' }) }) diff --git a/test/utility/index.ts b/test/utility/index.ts index 84847640..e96e5d9d 100644 --- a/test/utility/index.ts +++ b/test/utility/index.ts @@ -77,6 +77,7 @@ export function describeCommand( configFileName ? `${configFileName}-upload-history.json` : 'upload-history.json', ) process.env.SWARM_CLI_HISTORY_FILE_PATH = historyFilePath + process.env.SWARM_CLI_VERSION_CHECK_FILE_PATH = join(configFolderPath, 'version-check.json') //if own config is needed if (configFileName) { From 317aeaaecbae0ef9d5d2a45d5c3408d567a4e768 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 7 May 2026 13:11:47 +0000 Subject: [PATCH 6/8] test: update test coverage --- test/coverage/coverage-summary.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/coverage/coverage-summary.json b/test/coverage/coverage-summary.json index 1bf3c644..b45ce92c 100644 --- a/test/coverage/coverage-summary.json +++ b/test/coverage/coverage-summary.json @@ -1,4 +1,4 @@ -{"total": {"lines":{"total":2880,"covered":2203,"skipped":0,"pct":76.49},"statements":{"total":2901,"covered":2217,"skipped":0,"pct":76.42},"functions":{"total":346,"covered":274,"skipped":0,"pct":79.19},"branches":{"total":624,"covered":356,"skipped":0,"pct":57.05},"branchesTrue":{"total":0,"covered":0,"skipped":0,"pct":100}} +{"total": {"lines":{"total":2904,"covered":2222,"skipped":0,"pct":76.51},"statements":{"total":2925,"covered":2236,"skipped":0,"pct":76.44},"functions":{"total":346,"covered":274,"skipped":0,"pct":79.19},"branches":{"total":632,"covered":361,"skipped":0,"pct":57.12},"branchesTrue":{"total":0,"covered":0,"skipped":0,"pct":100}} ,"/home/runner/work/swarm-cli/swarm-cli/src/application.ts": {"lines":{"total":2,"covered":0,"skipped":0,"pct":0},"functions":{"total":0,"covered":0,"skipped":0,"pct":100},"statements":{"total":2,"covered":0,"skipped":0,"pct":0},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}} ,"/home/runner/work/swarm-cli/swarm-cli/src/config.ts": {"lines":{"total":33,"covered":32,"skipped":0,"pct":96.96},"functions":{"total":1,"covered":0,"skipped":0,"pct":0},"statements":{"total":33,"covered":32,"skipped":0,"pct":96.96},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}} ,"/home/runner/work/swarm-cli/swarm-cli/src/curl.ts": {"lines":{"total":24,"covered":24,"skipped":0,"pct":100},"functions":{"total":7,"covered":7,"skipped":0,"pct":100},"statements":{"total":25,"covered":25,"skipped":0,"pct":100},"branches":{"total":13,"covered":12,"skipped":0,"pct":92.3}} @@ -63,9 +63,9 @@ ,"/home/runner/work/swarm-cli/swarm-cli/src/command/pss/receive.ts": {"lines":{"total":24,"covered":18,"skipped":0,"pct":75},"functions":{"total":2,"covered":2,"skipped":0,"pct":100},"statements":{"total":24,"covered":18,"skipped":0,"pct":75},"branches":{"total":6,"covered":2,"skipped":0,"pct":33.33}} ,"/home/runner/work/swarm-cli/swarm-cli/src/command/pss/send.ts": {"lines":{"total":34,"covered":29,"skipped":0,"pct":85.29},"functions":{"total":2,"covered":2,"skipped":0,"pct":100},"statements":{"total":34,"covered":29,"skipped":0,"pct":85.29},"branches":{"total":5,"covered":2,"skipped":0,"pct":40}} ,"/home/runner/work/swarm-cli/swarm-cli/src/command/pss/subscribe.ts": {"lines":{"total":18,"covered":8,"skipped":0,"pct":44.44},"functions":{"total":5,"covered":1,"skipped":0,"pct":20},"statements":{"total":18,"covered":8,"skipped":0,"pct":44.44},"branches":{"total":4,"covered":0,"skipped":0,"pct":0}} -,"/home/runner/work/swarm-cli/swarm-cli/src/command/root-command/command-config.ts": {"lines":{"total":39,"covered":33,"skipped":0,"pct":84.61},"functions":{"total":8,"covered":8,"skipped":0,"pct":100},"statements":{"total":42,"covered":35,"skipped":0,"pct":83.33},"branches":{"total":11,"covered":6,"skipped":0,"pct":54.54}} +,"/home/runner/work/swarm-cli/swarm-cli/src/command/root-command/command-config.ts": {"lines":{"total":40,"covered":34,"skipped":0,"pct":85},"functions":{"total":9,"covered":9,"skipped":0,"pct":100},"statements":{"total":43,"covered":36,"skipped":0,"pct":83.72},"branches":{"total":13,"covered":7,"skipped":0,"pct":53.84}} ,"/home/runner/work/swarm-cli/swarm-cli/src/command/root-command/command-log.ts": {"lines":{"total":78,"covered":60,"skipped":0,"pct":76.92},"functions":{"total":9,"covered":6,"skipped":0,"pct":66.66},"statements":{"total":78,"covered":60,"skipped":0,"pct":76.92},"branches":{"total":11,"covered":7,"skipped":0,"pct":63.63}} -,"/home/runner/work/swarm-cli/swarm-cli/src/command/root-command/index.ts": {"lines":{"total":47,"covered":43,"skipped":0,"pct":91.48},"functions":{"total":4,"covered":4,"skipped":0,"pct":100},"statements":{"total":47,"covered":43,"skipped":0,"pct":91.48},"branches":{"total":10,"covered":6,"skipped":0,"pct":60}} +,"/home/runner/work/swarm-cli/swarm-cli/src/command/root-command/index.ts": {"lines":{"total":53,"covered":49,"skipped":0,"pct":92.45},"functions":{"total":4,"covered":4,"skipped":0,"pct":100},"statements":{"total":53,"covered":49,"skipped":0,"pct":92.45},"branches":{"total":13,"covered":9,"skipped":0,"pct":69.23}} ,"/home/runner/work/swarm-cli/swarm-cli/src/command/root-command/printer.ts": {"lines":{"total":9,"covered":9,"skipped":0,"pct":100},"functions":{"total":6,"covered":6,"skipped":0,"pct":100},"statements":{"total":9,"covered":9,"skipped":0,"pct":100},"branches":{"total":1,"covered":1,"skipped":0,"pct":100}} ,"/home/runner/work/swarm-cli/swarm-cli/src/command/stake/deposit.ts": {"lines":{"total":40,"covered":31,"skipped":0,"pct":77.5},"functions":{"total":3,"covered":3,"skipped":0,"pct":100},"statements":{"total":40,"covered":31,"skipped":0,"pct":77.5},"branches":{"total":17,"covered":11,"skipped":0,"pct":64.7}} ,"/home/runner/work/swarm-cli/swarm-cli/src/command/stake/index.ts": {"lines":{"total":8,"covered":8,"skipped":0,"pct":100},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":8,"covered":8,"skipped":0,"pct":100},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}} @@ -92,7 +92,7 @@ ,"/home/runner/work/swarm-cli/swarm-cli/src/command/wallet/status.ts": {"lines":{"total":11,"covered":11,"skipped":0,"pct":100},"functions":{"total":2,"covered":2,"skipped":0,"pct":100},"statements":{"total":11,"covered":11,"skipped":0,"pct":100},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}} ,"/home/runner/work/swarm-cli/swarm-cli/src/command/wallet/withdraw-bzz.ts": {"lines":{"total":21,"covered":19,"skipped":0,"pct":90.47},"functions":{"total":2,"covered":2,"skipped":0,"pct":100},"statements":{"total":21,"covered":19,"skipped":0,"pct":90.47},"branches":{"total":6,"covered":3,"skipped":0,"pct":50}} ,"/home/runner/work/swarm-cli/swarm-cli/src/command/wallet/withdraw-dai.ts": {"lines":{"total":21,"covered":19,"skipped":0,"pct":90.47},"functions":{"total":2,"covered":2,"skipped":0,"pct":100},"statements":{"total":21,"covered":19,"skipped":0,"pct":90.47},"branches":{"total":6,"covered":3,"skipped":0,"pct":50}} -,"/home/runner/work/swarm-cli/swarm-cli/src/service/version_checker.ts": {"lines":{"total":14,"covered":14,"skipped":0,"pct":100},"functions":{"total":3,"covered":3,"skipped":0,"pct":100},"statements":{"total":14,"covered":14,"skipped":0,"pct":100},"branches":{"total":2,"covered":2,"skipped":0,"pct":100}} +,"/home/runner/work/swarm-cli/swarm-cli/src/service/version_checker.ts": {"lines":{"total":31,"covered":26,"skipped":0,"pct":83.87},"functions":{"total":2,"covered":2,"skipped":0,"pct":100},"statements":{"total":31,"covered":26,"skipped":0,"pct":83.87},"branches":{"total":5,"covered":3,"skipped":0,"pct":60}} ,"/home/runner/work/swarm-cli/swarm-cli/src/service/history/index.ts": {"lines":{"total":21,"covered":19,"skipped":0,"pct":90.47},"functions":{"total":5,"covered":5,"skipped":0,"pct":100},"statements":{"total":22,"covered":20,"skipped":0,"pct":90.9},"branches":{"total":1,"covered":1,"skipped":0,"pct":100}} ,"/home/runner/work/swarm-cli/swarm-cli/src/service/identity/index.ts": {"lines":{"total":36,"covered":32,"skipped":0,"pct":88.88},"functions":{"total":7,"covered":7,"skipped":0,"pct":100},"statements":{"total":36,"covered":32,"skipped":0,"pct":88.88},"branches":{"total":9,"covered":6,"skipped":0,"pct":66.66}} ,"/home/runner/work/swarm-cli/swarm-cli/src/service/identity/types/identity.ts": {"lines":{"total":4,"covered":4,"skipped":0,"pct":100},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":4,"covered":4,"skipped":0,"pct":100},"branches":{"total":2,"covered":2,"skipped":0,"pct":100}} From 71f374114fd75eba2fdbc93af6796359f47f5f37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gergely=20B=C3=A9k=C3=A9si?= Date: Thu, 7 May 2026 15:48:40 +0200 Subject: [PATCH 7/8] fix: remove debug statements --- src/service/version_checker.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/service/version_checker.ts b/src/service/version_checker.ts index 173e8fde..24b8deaa 100644 --- a/src/service/version_checker.ts +++ b/src/service/version_checker.ts @@ -22,8 +22,6 @@ export async function checkForUpdates(config: CommandConfig) { const response = await fetch(LATEST_RELEASE_URL) if (!response.ok) { - process.stderr.write(`Failed to fetch latest release info: ${response.status} ${response.statusText}\n`) - return } @@ -33,7 +31,6 @@ export async function checkForUpdates(config: CommandConfig) { latestVersion, expiresAt: Date.now() + Dates.days(1), } - process.stderr.write(JSON.stringify(versionCheckData) + '\n') if (latestVersion !== PackageJson.version) { writeFileSync(filePath, JSON.stringify(versionCheckData)) From a9c6653dfb69b5c3766dbf07ff992b5132735c46 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 7 May 2026 14:01:46 +0000 Subject: [PATCH 8/8] test: update test coverage --- test/coverage/coverage-summary.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/coverage/coverage-summary.json b/test/coverage/coverage-summary.json index b45ce92c..48b3729b 100644 --- a/test/coverage/coverage-summary.json +++ b/test/coverage/coverage-summary.json @@ -1,4 +1,4 @@ -{"total": {"lines":{"total":2904,"covered":2222,"skipped":0,"pct":76.51},"statements":{"total":2925,"covered":2236,"skipped":0,"pct":76.44},"functions":{"total":346,"covered":274,"skipped":0,"pct":79.19},"branches":{"total":632,"covered":361,"skipped":0,"pct":57.12},"branchesTrue":{"total":0,"covered":0,"skipped":0,"pct":100}} +{"total": {"lines":{"total":2902,"covered":2221,"skipped":0,"pct":76.53},"statements":{"total":2923,"covered":2235,"skipped":0,"pct":76.46},"functions":{"total":346,"covered":274,"skipped":0,"pct":79.19},"branches":{"total":632,"covered":361,"skipped":0,"pct":57.12},"branchesTrue":{"total":0,"covered":0,"skipped":0,"pct":100}} ,"/home/runner/work/swarm-cli/swarm-cli/src/application.ts": {"lines":{"total":2,"covered":0,"skipped":0,"pct":0},"functions":{"total":0,"covered":0,"skipped":0,"pct":100},"statements":{"total":2,"covered":0,"skipped":0,"pct":0},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}} ,"/home/runner/work/swarm-cli/swarm-cli/src/config.ts": {"lines":{"total":33,"covered":32,"skipped":0,"pct":96.96},"functions":{"total":1,"covered":0,"skipped":0,"pct":0},"statements":{"total":33,"covered":32,"skipped":0,"pct":96.96},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}} ,"/home/runner/work/swarm-cli/swarm-cli/src/curl.ts": {"lines":{"total":24,"covered":24,"skipped":0,"pct":100},"functions":{"total":7,"covered":7,"skipped":0,"pct":100},"statements":{"total":25,"covered":25,"skipped":0,"pct":100},"branches":{"total":13,"covered":12,"skipped":0,"pct":92.3}} @@ -92,7 +92,7 @@ ,"/home/runner/work/swarm-cli/swarm-cli/src/command/wallet/status.ts": {"lines":{"total":11,"covered":11,"skipped":0,"pct":100},"functions":{"total":2,"covered":2,"skipped":0,"pct":100},"statements":{"total":11,"covered":11,"skipped":0,"pct":100},"branches":{"total":0,"covered":0,"skipped":0,"pct":100}} ,"/home/runner/work/swarm-cli/swarm-cli/src/command/wallet/withdraw-bzz.ts": {"lines":{"total":21,"covered":19,"skipped":0,"pct":90.47},"functions":{"total":2,"covered":2,"skipped":0,"pct":100},"statements":{"total":21,"covered":19,"skipped":0,"pct":90.47},"branches":{"total":6,"covered":3,"skipped":0,"pct":50}} ,"/home/runner/work/swarm-cli/swarm-cli/src/command/wallet/withdraw-dai.ts": {"lines":{"total":21,"covered":19,"skipped":0,"pct":90.47},"functions":{"total":2,"covered":2,"skipped":0,"pct":100},"statements":{"total":21,"covered":19,"skipped":0,"pct":90.47},"branches":{"total":6,"covered":3,"skipped":0,"pct":50}} -,"/home/runner/work/swarm-cli/swarm-cli/src/service/version_checker.ts": {"lines":{"total":31,"covered":26,"skipped":0,"pct":83.87},"functions":{"total":2,"covered":2,"skipped":0,"pct":100},"statements":{"total":31,"covered":26,"skipped":0,"pct":83.87},"branches":{"total":5,"covered":3,"skipped":0,"pct":60}} +,"/home/runner/work/swarm-cli/swarm-cli/src/service/version_checker.ts": {"lines":{"total":29,"covered":25,"skipped":0,"pct":86.2},"functions":{"total":2,"covered":2,"skipped":0,"pct":100},"statements":{"total":29,"covered":25,"skipped":0,"pct":86.2},"branches":{"total":5,"covered":3,"skipped":0,"pct":60}} ,"/home/runner/work/swarm-cli/swarm-cli/src/service/history/index.ts": {"lines":{"total":21,"covered":19,"skipped":0,"pct":90.47},"functions":{"total":5,"covered":5,"skipped":0,"pct":100},"statements":{"total":22,"covered":20,"skipped":0,"pct":90.9},"branches":{"total":1,"covered":1,"skipped":0,"pct":100}} ,"/home/runner/work/swarm-cli/swarm-cli/src/service/identity/index.ts": {"lines":{"total":36,"covered":32,"skipped":0,"pct":88.88},"functions":{"total":7,"covered":7,"skipped":0,"pct":100},"statements":{"total":36,"covered":32,"skipped":0,"pct":88.88},"branches":{"total":9,"covered":6,"skipped":0,"pct":66.66}} ,"/home/runner/work/swarm-cli/swarm-cli/src/service/identity/types/identity.ts": {"lines":{"total":4,"covered":4,"skipped":0,"pct":100},"functions":{"total":1,"covered":1,"skipped":0,"pct":100},"statements":{"total":4,"covered":4,"skipped":0,"pct":100},"branches":{"total":2,"covered":2,"skipped":0,"pct":100}}