From 0d701071caaa8a7cd4fa88705102bae52fcaea75 Mon Sep 17 00:00:00 2001 From: David Dal Busco Date: Thu, 5 Jun 2025 12:51:50 +0200 Subject: [PATCH 1/5] feat: introduce cli config per mode --- .env.development | 1 - .env.production | 1 - src/cli/env.loader.ts | 15 +++++++++++++-- src/configs/cli.settings.config.ts | 4 ++-- src/constants/config.constants.ts | 4 ++-- src/constants/constants.ts | 2 -- src/types/cli.env.ts | 10 ++++++++-- 7 files changed, 25 insertions(+), 12 deletions(-) diff --git a/.env.development b/.env.development index 6fe15d0d..e69de29b 100644 --- a/.env.development +++ b/.env.development @@ -1 +0,0 @@ -CLI_PROJECT_NAME=juno-dev \ No newline at end of file diff --git a/.env.production b/.env.production index 43b605ea..e69de29b 100644 --- a/.env.production +++ b/.env.production @@ -1 +0,0 @@ -CLI_PROJECT_NAME=juno \ No newline at end of file diff --git a/src/cli/env.loader.ts b/src/cli/env.loader.ts index e093c3cd..da7e9c20 100644 --- a/src/cli/env.loader.ts +++ b/src/cli/env.loader.ts @@ -1,5 +1,6 @@ +import {notEmptyString} from '@dfinity/utils'; import {nextArg} from '@junobuild/cli-tools'; -import {JunoCliEnv, JunoConsole} from '../types/cli.env'; +import {JunoCliConfig, JunoCliEnv, JunoConsole} from '../types/cli.env'; export const loadEnv = (): JunoCliEnv => { const [_, ...args] = process.argv.slice(2); @@ -13,7 +14,8 @@ export const loadEnv = (): JunoCliEnv => { return { mode: mode ?? 'production', containerUrl: envContainerUrl, - console: loadEnvConsole({args, mode}) + console: loadEnvConsole({args, mode}), + config: loadEnvConfig({mode}) }; }; @@ -31,3 +33,12 @@ const loadEnvConsole = ({args, mode}: {args?: string[]; mode: string | undefined } }; }; + +const loadEnvConfig = ({mode}: {mode: string | undefined}): JunoCliConfig => { + const projectName = notEmptyString(mode) && mode !== 'production' ? `juno-${mode}` : 'juno'; + + return { + projectName, + projectSettingsName: `${projectName}-cli-settings` + }; +}; diff --git a/src/configs/cli.settings.config.ts b/src/configs/cli.settings.config.ts index bcd91db5..7f869633 100644 --- a/src/configs/cli.settings.config.ts +++ b/src/configs/cli.settings.config.ts @@ -1,5 +1,5 @@ import Conf, {type Schema} from 'conf'; -import {CLI_SETTINGS_NAME} from '../constants/constants'; +import {ENV} from '../env'; export interface CliSettingsConfig { encryption: boolean; @@ -12,7 +12,7 @@ const schema: Schema = { } as const; export const getSettingsConfig = (): Conf => - new Conf({projectName: CLI_SETTINGS_NAME, schema}); + 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 b8f88106..f531e734 100644 --- a/src/constants/config.constants.ts +++ b/src/constants/config.constants.ts @@ -1,5 +1,5 @@ import type {Schema} from 'conf'; -import {CLI_PROJECT_NAME} from './constants'; +import {ENV} from '../env'; import {CliConfig} from '../types/cli.config'; import {CliDefaultOptions, CliOptions} from '../types/cli.options'; @@ -22,6 +22,6 @@ const DEFAULT_CONF_OPTIONS: CliDefaultOptions = { export const CONFIG_OPTIONS: CliOptions = { ...DEFAULT_CONF_OPTIONS, - projectName: CLI_PROJECT_NAME, + projectName: ENV.config.projectName, schema }; diff --git a/src/constants/constants.ts b/src/constants/constants.ts index b9808e1e..c1586cc6 100644 --- a/src/constants/constants.ts +++ b/src/constants/constants.ts @@ -1,5 +1,3 @@ -export const CLI_PROJECT_NAME = process.env.CLI_PROJECT_NAME ?? 'juno'; -export const CLI_SETTINGS_NAME = `${CLI_PROJECT_NAME}-cli-settings`; export const REDIRECT_URL = 'http://localhost:{port}'; export const JUNO_CONFIG_FILENAME = 'juno.config'; // .json | .js | .mjs | .cjs | .ts export const JUNO_DEV_CONFIG_FILENAME = 'juno.dev.config'; // .json | .js | .mjs | .cjs | .ts diff --git a/src/types/cli.env.ts b/src/types/cli.env.ts index 4ff9f57b..2120f947 100644 --- a/src/types/cli.env.ts +++ b/src/types/cli.env.ts @@ -3,14 +3,20 @@ import type {JunoConfigEnv} from '@junobuild/config'; export type JunoCliEnv = JunoConfigEnv & { containerUrl: string | undefined; console: JunoConsole; + config: JunoCliConfig; }; -interface JunoConsole { +export interface JunoConsole { urls: JunoConsoleUrls; } -interface JunoConsoleUrls { +export interface JunoConsoleUrls { root: string; satellite: string; auth: string; } + +export interface JunoCliConfig { + projectName: string | 'juno'; + projectSettingsName: string | 'juno-cli-settings'; +} \ No newline at end of file From b42f95d4b094ccb7687d0903ca801f789733b7d9 Mon Sep 17 00:00:00 2001 From: David Dal Busco Date: Thu, 5 Jun 2025 12:53:51 +0200 Subject: [PATCH 2/5] docs: comment why juno without mode --- src/cli/env.loader.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/cli/env.loader.ts b/src/cli/env.loader.ts index da7e9c20..6f3eba0e 100644 --- a/src/cli/env.loader.ts +++ b/src/cli/env.loader.ts @@ -35,6 +35,8 @@ const loadEnvConsole = ({args, mode}: {args?: string[]; mode: string | undefined }; const loadEnvConfig = ({mode}: {mode: string | undefined}): JunoCliConfig => { + // Historically we used "juno" - without environment reference - for production. + // That is why we keep this approach for backwards compatibility. const projectName = notEmptyString(mode) && mode !== 'production' ? `juno-${mode}` : 'juno'; return { From 1e837525ecd43772af167a74d4157d244093a3fb Mon Sep 17 00:00:00 2001 From: David Dal Busco Date: Thu, 5 Jun 2025 12:54:56 +0200 Subject: [PATCH 3/5] chore: fmt --- src/cli/env.loader.ts | 2 +- src/constants/config.constants.ts | 4 ++-- src/types/cli.env.ts | 2 +- src/types/cli.options.ts | 9 ++++++--- 4 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/cli/env.loader.ts b/src/cli/env.loader.ts index 6f3eba0e..eb40017e 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 {JunoCliConfig, JunoCliEnv, JunoConsole} from '../types/cli.env'; +import {type JunoCliConfig, type JunoCliEnv, type JunoConsole} from '../types/cli.env'; export const loadEnv = (): JunoCliEnv => { const [_, ...args] = process.argv.slice(2); diff --git a/src/constants/config.constants.ts b/src/constants/config.constants.ts index f531e734..3316a876 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 {CliConfig} from '../types/cli.config'; -import {CliDefaultOptions, CliOptions} from '../types/cli.options'; +import {type CliConfig} from '../types/cli.config'; +import {type CliDefaultOptions, type CliOptions} from '../types/cli.options'; const schema: Schema = { token: { diff --git a/src/types/cli.env.ts b/src/types/cli.env.ts index 2120f947..ef4c6e64 100644 --- a/src/types/cli.env.ts +++ b/src/types/cli.env.ts @@ -19,4 +19,4 @@ export interface JunoConsoleUrls { export interface JunoCliConfig { projectName: string | 'juno'; projectSettingsName: string | 'juno-cli-settings'; -} \ No newline at end of file +} diff --git a/src/types/cli.options.ts b/src/types/cli.options.ts index 459b941c..cc856c84 100644 --- a/src/types/cli.options.ts +++ b/src/types/cli.options.ts @@ -1,10 +1,13 @@ import type {Options as ConfOptions} from 'conf'; -import {CliConfig} from './cli.config'; +import {type CliConfig} from './cli.config'; type CliConfigRequiredOptions = Required>; -export type CliDefaultOptions = Pick; +export type CliDefaultOptions = Pick< + CliConfigRequiredOptions, + 'fileExtension' | 'projectSuffix' | 'configName' +>; // TODO: We do not inherit the type of projectName from RequiredOptions because somehow TypeScript does not checks it's a defined string once made required export type CliOptions = {projectName: string} & Pick & - CliDefaultOptions; \ No newline at end of file + CliDefaultOptions; From f93650d607d394f7adf737045b04417d4cd977b5 Mon Sep 17 00:00:00 2001 From: David Dal Busco Date: Thu, 5 Jun 2025 13:00:01 +0200 Subject: [PATCH 4/5] chore: lint --- src/types/cli.env.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/types/cli.env.ts b/src/types/cli.env.ts index ef4c6e64..25854f73 100644 --- a/src/types/cli.env.ts +++ b/src/types/cli.env.ts @@ -17,6 +17,8 @@ export interface JunoConsoleUrls { } export interface JunoCliConfig { + // @typescript-eslint/no-redundant-type-constituents projectName: string | 'juno'; + // @typescript-eslint/no-redundant-type-constituents projectSettingsName: string | 'juno-cli-settings'; } From 11b8b6afdbc6dd6ced66d50ce910618eb61d7043 Mon Sep 17 00:00:00 2001 From: David Dal Busco Date: Thu, 5 Jun 2025 13:18:26 +0200 Subject: [PATCH 5/5] chore: lint --- src/types/cli.env.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/types/cli.env.ts b/src/types/cli.env.ts index 25854f73..260a3500 100644 --- a/src/types/cli.env.ts +++ b/src/types/cli.env.ts @@ -17,8 +17,8 @@ export interface JunoConsoleUrls { } export interface JunoCliConfig { - // @typescript-eslint/no-redundant-type-constituents + // eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents projectName: string | 'juno'; - // @typescript-eslint/no-redundant-type-constituents + // eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents projectSettingsName: string | 'juno-cli-settings'; }