From 5570d32c878e25a05133380fb7a5136fad090826 Mon Sep 17 00:00:00 2001 From: David Dal Busco Date: Tue, 17 Mar 2026 06:53:12 +0100 Subject: [PATCH] feat: move cli config modules and types to store Signed-off-by: David Dal Busco --- src/api/actor.api.ts | 2 +- src/cli/env.loader.ts | 2 +- src/commands/auth.ts | 2 +- src/commands/status.ts | 2 +- src/commands/whoami.ts | 2 +- src/configs/cli.settings.config.ts | 16 -------------- src/constants/config.constants.ts | 4 ++-- src/services/auth/login.emulator.services.ts | 2 +- src/services/auth/login.services.ts | 2 +- src/services/config/apply.services.ts | 6 +++--- src/services/config/init.services.ts | 4 ++-- src/services/controllers.services.ts | 2 +- .../snapshot.mission-control.services.ts | 2 +- src/services/modules/start-stop.services.ts | 2 +- .../upgrade.mission-control.services.ts | 2 +- .../version/version.check.services.ts | 2 +- .../version/version.check.weekly.services.ts | 12 +++++------ .../cli.config.ts => stores/config.store.ts} | 4 ++-- src/stores/settings.store.ts | 21 +++++++++++++++---- .../state.store.ts} | 8 +++---- .../versions.store.ts} | 12 +++++------ src/types/{cli/cli.env.ts => env.ts} | 0 .../{cli/cli.config.ts => stores/config.ts} | 0 .../{cli/cli.options.ts => stores/options.ts} | 2 +- .../cli.settings.ts => stores/settings.ts} | 0 .../{cli/cli.state.ts => stores/state.ts} | 0 .../cli.versions.ts => stores/versions.ts} | 0 src/utils/cli.config.utils.ts | 4 ++-- src/version.ts | 2 +- 29 files changed, 58 insertions(+), 61 deletions(-) delete mode 100644 src/configs/cli.settings.config.ts rename src/{configs/cli.config.ts => stores/config.store.ts} (97%) rename src/{configs/cli.state.config.ts => stores/state.store.ts} (86%) rename src/{configs/cli.versions.config.ts => stores/versions.store.ts} (83%) rename src/types/{cli/cli.env.ts => env.ts} (100%) rename src/types/{cli/cli.config.ts => stores/config.ts} (100%) rename src/types/{cli/cli.options.ts => stores/options.ts} (91%) rename src/types/{cli/cli.settings.ts => stores/settings.ts} (100%) rename src/types/{cli/cli.state.ts => stores/state.ts} (100%) rename src/types/{cli/cli.versions.ts => stores/versions.ts} (100%) diff --git a/src/api/actor.api.ts b/src/api/actor.api.ts index e9bed484..b72bd4bd 100644 --- a/src/api/actor.api.ts +++ b/src/api/actor.api.ts @@ -2,9 +2,9 @@ import {isNullish, nonNullish, notEmptyString} from '@dfinity/utils'; import {Ed25519KeyIdentity} from '@icp-sdk/core/identity'; import type {ActorParameters} from '@junobuild/ic-client/actor'; import {green, red, yellow} from 'kleur'; -import {getToken} from '../configs/cli.config'; import {readEmulatorConfig} from '../configs/emulator.config'; import {ENV} from '../env'; +import {getToken} from '../stores/config.store'; import {noConfigFile} from '../utils/cli.config.utils'; import {getProcessToken, isHeadless} from '../utils/process.utils'; import {initAgent} from './agent.api'; diff --git a/src/cli/env.loader.ts b/src/cli/env.loader.ts index cc1e910c..feaecde0 100644 --- a/src/cli/env.loader.ts +++ b/src/cli/env.loader.ts @@ -1,6 +1,6 @@ import {notEmptyString} from '@dfinity/utils'; import {nextArg} from '@junobuild/cli-tools'; -import {type JunoCliConfig, type JunoCliEnv, type JunoConsole} from '../types/cli/cli.env'; +import {type JunoCliConfig, type JunoCliEnv, type JunoConsole} from '../types/env'; export const loadEnv = (): JunoCliEnv => { const [_, ...args] = process.argv.slice(2); diff --git a/src/commands/auth.ts b/src/commands/auth.ts index e39da0f5..f38c5ca5 100644 --- a/src/commands/auth.ts +++ b/src/commands/auth.ts @@ -3,11 +3,11 @@ import {Ed25519KeyIdentity} from '@icp-sdk/core/identity'; import {assertAnswerCtrlC, hasArgs} from '@junobuild/cli-tools'; import {green, red} from 'kleur'; import prompts from 'prompts'; -import {clearCliConfig, getToken} from '../configs/cli.config'; import {DEV} from '../env'; import {loginEmulatorOnly} from '../services/auth/login.emulator.services'; import {login as loginServices} from '../services/auth/login.services'; import {reuseController} from '../services/controllers.services'; +import {clearCliConfig, getToken} from '../stores/config.store'; import {confirmAndExitUnlessHeadlessAndDev} from '../utils/prompt.utils'; export const logout = async () => { diff --git a/src/commands/status.ts b/src/commands/status.ts index 685e09e1..dfde437a 100644 --- a/src/commands/status.ts +++ b/src/commands/status.ts @@ -6,13 +6,13 @@ import { } from '@junobuild/admin'; import {red, yellow} from 'kleur'; import {actorParameters} from '../api/actor.api'; -import {getCliMissionControl} from '../configs/cli.config'; import { MISSION_CONTROL_WASM_NAME, ORBITER_WASM_NAME, SATELLITE_WASM_NAME } from '../constants/constants'; import {checkVersion, getSatelliteVersion} from '../services/version/version.services'; +import {getCliMissionControl} from '../stores/config.store'; import type {AssetKey} from '../types/asset-key'; import {toAssetKeys} from '../utils/asset-key.utils'; import {orbiterKey, satelliteKey} from '../utils/cli.config.utils'; diff --git a/src/commands/whoami.ts b/src/commands/whoami.ts index d363bf31..8422540f 100644 --- a/src/commands/whoami.ts +++ b/src/commands/whoami.ts @@ -1,9 +1,9 @@ import {isNullish, nonNullish} from '@dfinity/utils'; import {Ed25519KeyIdentity} from '@icp-sdk/core/identity'; import {green} from 'kleur'; -import {getToken} from '../configs/cli.config'; import {ENV} from '../env'; import {links} from '../services/links.services'; +import {getToken} from '../stores/config.store'; export const whoami = async () => { const {success} = await info(); diff --git a/src/configs/cli.settings.config.ts b/src/configs/cli.settings.config.ts deleted file mode 100644 index c4dac949..00000000 --- a/src/configs/cli.settings.config.ts +++ /dev/null @@ -1,16 +0,0 @@ -import Conf, {type Schema} from 'conf'; -import {ENV} from '../env'; -import {type CliSettings} from '../types/cli/cli.settings'; - -const schema: Schema = { - encryption: { - type: 'boolean' - } -} as const; - -export const getSettingsConfig = (): Conf => - new Conf({projectName: ENV.config.projectSettingsName, schema}); - -export const saveEncryption = (encryption: boolean) => { - getSettingsConfig().set('encryption', encryption); -}; diff --git a/src/constants/config.constants.ts b/src/constants/config.constants.ts index 479e50fb..d2ab655d 100644 --- a/src/constants/config.constants.ts +++ b/src/constants/config.constants.ts @@ -1,7 +1,7 @@ import type {Schema} from 'conf'; import {ENV} from '../env'; -import {type CliConfig} from '../types/cli/cli.config'; -import {type CliDefaultOptions, type CliOptions} from '../types/cli/cli.options'; +import {type CliConfig} from '../types/stores/config'; +import {type CliDefaultOptions, type CliOptions} from '../types/stores/options'; const schema: Schema = { token: { diff --git a/src/services/auth/login.emulator.services.ts b/src/services/auth/login.emulator.services.ts index 08980552..9016f555 100644 --- a/src/services/auth/login.emulator.services.ts +++ b/src/services/auth/login.emulator.services.ts @@ -2,9 +2,9 @@ import {notEmptyString} from '@dfinity/utils'; import {type PrincipalText} from '@junobuild/schema'; import {green, red} from 'kleur'; import ora from 'ora'; -import {saveCliConfig} from '../../configs/cli.config'; import {readEmulatorConfig} from '../../configs/emulator.config'; import {ENV} from '../../env'; +import {saveCliConfig} from '../../stores/config.store'; import {generateToken} from '../../utils/auth.utils'; import {assertConfigAndReadSatelliteId} from '../../utils/juno.config.utils'; import {dispatchRequest} from '../emulator/admin.services'; diff --git a/src/services/auth/login.services.ts b/src/services/auth/login.services.ts index 7d2ee734..7cfd3b37 100644 --- a/src/services/auth/login.services.ts +++ b/src/services/auth/login.services.ts @@ -8,7 +8,7 @@ import {createServer} from 'node:http'; import path, {dirname} from 'node:path'; import {fileURLToPath} from 'node:url'; import util from 'node:util'; -import {saveCliConfig} from '../../configs/cli.config'; +import {saveCliConfig} from '../../stores/config.store'; import {authUrl, generateToken, requestUrl} from '../../utils/auth.utils'; import {openUrl} from '../../utils/open.utils'; import {getPort} from '../../utils/port.utils'; diff --git a/src/services/config/apply.services.ts b/src/services/config/apply.services.ts index 754ed8f2..1c82af74 100644 --- a/src/services/config/apply.services.ts +++ b/src/services/config/apply.services.ts @@ -27,7 +27,6 @@ import type { } from '@junobuild/config'; import {red, yellow} from 'kleur'; import ora from 'ora'; -import {getLatestAppliedConfig, saveLastAppliedConfig} from '../../configs/cli.state.config'; import { DEFAULT_COMPUTE_ALLOCATION, DEFAULT_LOG_VISIBILITY, @@ -36,14 +35,15 @@ import { DEFAULT_SATELLITE_FREEZING_THRESHOLD, DEFAULT_SATELLITE_HEAP_WASM_MEMORY_LIMIT } from '../../constants/settings.constants'; +import {getLatestAppliedConfig, saveLastAppliedConfig} from '../../stores/state.store'; +import type {SatelliteParametersWithId} from '../../types/satellite'; import { type CliStateSatelliteAppliedCollection, type CliStateSatelliteAppliedConfigHashes, type ConfigHash, type RuleHash, type SettingsHash -} from '../../types/cli/cli.state'; -import type {SatelliteParametersWithId} from '../../types/satellite'; +} from '../../types/stores/state'; import {assertConfigAndLoadSatelliteContext} from '../../utils/juno.config.utils'; import {objHash} from '../../utils/obj.utils'; import {isHeadless} from '../../utils/process.utils'; diff --git a/src/services/config/init.services.ts b/src/services/config/init.services.ts index 6becc0cc..1c2aec72 100644 --- a/src/services/config/init.services.ts +++ b/src/services/config/init.services.ts @@ -5,7 +5,6 @@ import {cyan, yellow} from 'kleur'; import {unlink} from 'node:fs/promises'; import {basename} from 'node:path'; import prompts from 'prompts'; -import {getCliOrbiters, getCliSatellites, getToken} from '../../configs/cli.config'; import { detectJunoConfigType, junoConfigExist, @@ -14,9 +13,10 @@ import { writeJunoConfig, writeJunoConfigPlaceholder } from '../../configs/juno.config'; -import type {CliOrbiterConfig, CliSatelliteConfig} from '../../types/cli/cli.config'; +import {getCliOrbiters, getCliSatellites, getToken} from '../../stores/config.store'; import {type EmulatorConfigWithoutConsole} from '../../types/emulator'; import type {PackageManager} from '../../types/pm'; +import type {CliOrbiterConfig, CliSatelliteConfig} from '../../types/stores/config'; import {detectPackageManager} from '../../utils/pm.utils'; import {confirm, confirmAndExit, NEW_CMD_LINE} from '../../utils/prompt.utils'; import {login as consoleLogin} from '../auth/login.services'; diff --git a/src/services/controllers.services.ts b/src/services/controllers.services.ts index 28443076..31adb02f 100644 --- a/src/services/controllers.services.ts +++ b/src/services/controllers.services.ts @@ -2,8 +2,8 @@ import {type Principal} from '@icp-sdk/core/principal'; import {assertAnswerCtrlC} from '@junobuild/cli-tools'; import {bold, green, red} from 'kleur'; import prompts from 'prompts'; -import {addCliMissionControl, addCliOrbiter, addCliSatellite} from '../configs/cli.config'; import {ENV} from '../env'; +import {addCliMissionControl, addCliOrbiter, addCliSatellite} from '../stores/config.store'; import {type AssetKey} from '../types/asset-key'; import {displaySegment} from '../utils/display.utils'; import {terminalLink} from '../utils/links.utils'; diff --git a/src/services/modules/snapshot/snapshot.mission-control.services.ts b/src/services/modules/snapshot/snapshot.mission-control.services.ts index b0743e31..d7d94adf 100644 --- a/src/services/modules/snapshot/snapshot.mission-control.services.ts +++ b/src/services/modules/snapshot/snapshot.mission-control.services.ts @@ -1,6 +1,6 @@ import {isNullish} from '@dfinity/utils'; import {red} from 'kleur'; -import {getCliMissionControl} from '../../../configs/cli.config'; +import {getCliMissionControl} from '../../../stores/config.store'; import type {AssetKey} from '../../../types/asset-key'; import { createSnapshot, diff --git a/src/services/modules/start-stop.services.ts b/src/services/modules/start-stop.services.ts index 4e9dc27d..66a70fef 100644 --- a/src/services/modules/start-stop.services.ts +++ b/src/services/modules/start-stop.services.ts @@ -3,7 +3,7 @@ import {Principal} from '@icp-sdk/core/principal'; import {cyan, red} from 'kleur'; import ora from 'ora'; import {canisterStart, canisterStop} from '../../api/ic.api'; -import {getCliMissionControl} from '../../configs/cli.config'; +import {getCliMissionControl} from '../../stores/config.store'; import type {AssetKey} from '../../types/asset-key'; import type {StartStopAction} from '../../types/start-stop'; import { diff --git a/src/services/modules/upgrade/upgrade.mission-control.services.ts b/src/services/modules/upgrade/upgrade.mission-control.services.ts index 465b9390..925f9e00 100644 --- a/src/services/modules/upgrade/upgrade.mission-control.services.ts +++ b/src/services/modules/upgrade/upgrade.mission-control.services.ts @@ -8,8 +8,8 @@ import type {MissionControlParameters} from '@junobuild/ic-client/actor'; import type {PrincipalText} from '@junobuild/schema'; import {cyan, red} from 'kleur'; import {actorParameters} from '../../../api/actor.api'; -import {getCliMissionControl} from '../../../configs/cli.config'; import {MISSION_CONTROL_WASM_NAME} from '../../../constants/constants'; +import {getCliMissionControl} from '../../../stores/config.store'; import type {UpgradeWasmModule} from '../../../types/upgrade'; import {NEW_CMD_LINE} from '../../../utils/prompt.utils'; import {logUpgradeResult, readUpgradeOptions} from '../../../utils/upgrade.utils'; diff --git a/src/services/version/version.check.services.ts b/src/services/version/version.check.services.ts index 61c1e9c7..9f024213 100644 --- a/src/services/version/version.check.services.ts +++ b/src/services/version/version.check.services.ts @@ -1,6 +1,6 @@ import {isNullish} from '@dfinity/utils'; import prompts from 'prompts'; -import {isWeeklyCheckEnabled, toggleWeeklyCheck} from '../../configs/cli.versions.config'; +import {isWeeklyCheckEnabled, toggleWeeklyCheck} from '../../stores/versions.store'; export const enableDisableVersionCheck = async () => { const current = isWeeklyCheckEnabled(); diff --git a/src/services/version/version.check.weekly.services.ts b/src/services/version/version.check.weekly.services.ts index 331c796d..e4f7a637 100644 --- a/src/services/version/version.check.weekly.services.ts +++ b/src/services/version/version.check.weekly.services.ts @@ -2,17 +2,17 @@ import {isNullish, nonNullish} from '@dfinity/utils'; import ora from 'ora'; import {compare} from 'semver'; import {version as cliCurrentVersion} from '../../../package.json'; -import { - getCachedVersions, - saveCachedVersions, - updateLastCheckToNow -} from '../../configs/cli.versions.config'; import { githubCliLastRelease, githubJunoDockerLastRelease, type GithubLastReleaseResult } from '../../rest/github.rest'; -import {type CachedVersions} from '../../types/cli/cli.versions'; +import { + getCachedVersions, + saveCachedVersions, + updateLastCheckToNow +} from '../../stores/versions.store'; +import {type CachedVersions} from '../../types/stores/versions'; import {pmInstallHint} from '../../utils/pm.utils'; import {findEmulatorVersion} from '../emulator/version.services'; import { diff --git a/src/configs/cli.config.ts b/src/stores/config.store.ts similarity index 97% rename from src/configs/cli.config.ts rename to src/stores/config.store.ts index 2b3ca0de..252a3c3f 100644 --- a/src/configs/cli.config.ts +++ b/src/stores/config.store.ts @@ -3,9 +3,9 @@ import type {JsonnableEd25519KeyIdentity} from '@icp-sdk/core/identity'; import type Conf from 'conf'; import {red, yellow} from 'kleur'; import {askForPassword} from '../services/cli.settings.services'; -import {getSettingsStore} from '../stores/settings.store'; -import type {CliConfig, CliOrbiterConfig, CliSatelliteConfig} from '../types/cli/cli.config'; +import type {CliConfig, CliOrbiterConfig, CliSatelliteConfig} from '../types/stores/config'; import {loadConfig} from '../utils/cli.config.utils'; +import {getSettingsStore} from './settings.store'; // Save in https://github.com/sindresorhus/env-paths#pathsconfig diff --git a/src/stores/settings.store.ts b/src/stores/settings.store.ts index b222ce06..f66aca09 100644 --- a/src/stores/settings.store.ts +++ b/src/stores/settings.store.ts @@ -1,13 +1,26 @@ import {isNullish, nonNullish} from '@dfinity/utils'; -import type Conf from 'conf'; +import Conf, {type Schema} from 'conf'; import {yellow} from 'kleur'; -import {getSettingsConfig, saveEncryption} from '../configs/cli.settings.config'; +import {ENV} from '../env'; import {askForPassword} from '../services/cli.settings.services'; -import type {CliSettings} from '../types/cli/cli.settings'; +import type {CliSettings} from '../types/stores/settings'; import {configFileExists, loadConfig} from '../utils/cli.config.utils'; import {isHeadless} from '../utils/process.utils'; import {confirm} from '../utils/prompt.utils'; +const schema: Schema = { + encryption: { + type: 'boolean' + } +} as const; + +const getStore = (): Conf => + new Conf({projectName: ENV.config.projectSettingsName, schema}); + +const saveEncryption = (encryption: boolean) => { + getStore().set('encryption', encryption); +}; + class SettingsConfigStore { readonly #config: Conf; @@ -16,7 +29,7 @@ class SettingsConfigStore { } static async init(): Promise { - const store = new SettingsConfigStore(getSettingsConfig()); + const store = new SettingsConfigStore(getStore()); if (isHeadless()) { return store; diff --git a/src/configs/cli.state.config.ts b/src/stores/state.store.ts similarity index 86% rename from src/configs/cli.state.config.ts rename to src/stores/state.store.ts index 711525a1..5d375200 100644 --- a/src/configs/cli.state.config.ts +++ b/src/stores/state.store.ts @@ -5,9 +5,9 @@ import { type CliState, type CliStateSatellite, type CliStateSatelliteAppliedConfigHashes -} from '../types/cli/cli.state'; +} from '../types/stores/state'; -const getStateConfig = (): Conf => +const getStore = (): Conf => new Conf({projectName: ENV.config.projectStateName}); export const getLatestAppliedConfig = ({ @@ -15,13 +15,13 @@ export const getLatestAppliedConfig = ({ }: { satelliteId: PrincipalText; }): CliStateSatelliteAppliedConfigHashes | undefined => - getStateConfig().get('satellites')?.[satelliteId]?.lastAppliedConfig; + getStore().get('satellites')?.[satelliteId]?.lastAppliedConfig; export const saveLastAppliedConfig = ({ satelliteId, lastAppliedConfig: {storage, datastore, auth, settings, collections} }: {satelliteId: PrincipalText} & Pick) => { - const config = getStateConfig(); + const config = getStore(); const satellites = config.get('satellites'); diff --git a/src/configs/cli.versions.config.ts b/src/stores/versions.store.ts similarity index 83% rename from src/configs/cli.versions.config.ts rename to src/stores/versions.store.ts index c675aa1d..bd19d422 100644 --- a/src/configs/cli.versions.config.ts +++ b/src/stores/versions.store.ts @@ -1,10 +1,10 @@ import Conf from 'conf'; -import {type CachedVersion, type CachedVersions} from '../types/cli/cli.versions'; +import {type CachedVersion, type CachedVersions} from '../types/stores/versions'; -const getVersionConfig = (): Conf => +const getStore = (): Conf => new Conf({projectName: 'juno-cli-versions'}); -export const getCachedVersions = (): Conf => getVersionConfig(); +export const getCachedVersions = (): Conf => getStore(); export const isWeeklyCheckEnabled = (): boolean => getCachedVersions().get('weeklyCheckEnabled') !== false; @@ -12,7 +12,7 @@ export const isWeeklyCheckEnabled = (): boolean => export const isWeeklyCheckDisabled = (): boolean => !isWeeklyCheckEnabled(); export const toggleWeeklyCheck = (enabled: boolean) => { - const config = getVersionConfig(); + const config = getStore(); config.set('weeklyCheckEnabled', enabled); }; @@ -21,7 +21,7 @@ export const updateLastCheckToNow = ({ }: { key: keyof Omit; }) => { - const config = getVersionConfig(); + const config = getStore(); const currentVersions = config.get(key); @@ -38,7 +38,7 @@ export const saveCachedVersions = ({ key: keyof CachedVersions; versions: Omit; }) => { - const config = getVersionConfig(); + const config = getStore(); config.set(key, { lastCheck: new Date().toISOString(), ...versions diff --git a/src/types/cli/cli.env.ts b/src/types/env.ts similarity index 100% rename from src/types/cli/cli.env.ts rename to src/types/env.ts diff --git a/src/types/cli/cli.config.ts b/src/types/stores/config.ts similarity index 100% rename from src/types/cli/cli.config.ts rename to src/types/stores/config.ts diff --git a/src/types/cli/cli.options.ts b/src/types/stores/options.ts similarity index 91% rename from src/types/cli/cli.options.ts rename to src/types/stores/options.ts index cc856c84..375a4898 100644 --- a/src/types/cli/cli.options.ts +++ b/src/types/stores/options.ts @@ -1,5 +1,5 @@ import type {Options as ConfOptions} from 'conf'; -import {type CliConfig} from './cli.config'; +import {type CliConfig} from './config'; type CliConfigRequiredOptions = Required>; diff --git a/src/types/cli/cli.settings.ts b/src/types/stores/settings.ts similarity index 100% rename from src/types/cli/cli.settings.ts rename to src/types/stores/settings.ts diff --git a/src/types/cli/cli.state.ts b/src/types/stores/state.ts similarity index 100% rename from src/types/cli/cli.state.ts rename to src/types/stores/state.ts diff --git a/src/types/cli/cli.versions.ts b/src/types/stores/versions.ts similarity index 100% rename from src/types/cli/cli.versions.ts rename to src/types/stores/versions.ts diff --git a/src/utils/cli.config.utils.ts b/src/utils/cli.config.utils.ts index 4540a754..04b0b8ad 100644 --- a/src/utils/cli.config.utils.ts +++ b/src/utils/cli.config.utils.ts @@ -3,9 +3,9 @@ import Conf from 'conf'; import envPaths from 'env-paths'; import {existsSync} from 'node:fs'; import {resolve} from 'node:path'; -import {getCliOrbiters, getCliSatellites} from '../configs/cli.config'; import {CONFIG_OPTIONS} from '../constants/config.constants'; -import type {CliConfig} from '../types/cli/cli.config'; +import {getCliOrbiters, getCliSatellites} from '../stores/config.store'; +import type {CliConfig} from '../types/stores/config'; export const loadConfig = (encryptionKey: string | undefined): Conf => { return new Conf({ diff --git a/src/version.ts b/src/version.ts index 3b48aea3..d12f974c 100644 --- a/src/version.ts +++ b/src/version.ts @@ -1,8 +1,8 @@ -import {isWeeklyCheckDisabled} from './configs/cli.versions.config'; import { checkCliVersion, checkEmulatorVersion } from './services/version/version.check.weekly.services'; +import {isWeeklyCheckDisabled} from './stores/versions.store'; import {isHeadless} from './utils/process.utils'; export const checkWeeklyVersions = async ({cmd, args}: {cmd: string; args?: string[]}) => {