diff options
Diffstat (limited to 'packages/cli/src/config')
| -rw-r--r-- | packages/cli/src/config/auth.test.ts | 8 | ||||
| -rw-r--r-- | packages/cli/src/config/auth.ts | 7 | ||||
| -rw-r--r-- | packages/cli/src/config/config.integration.test.ts | 6 | ||||
| -rw-r--r-- | packages/cli/src/config/config.test.ts | 59 | ||||
| -rw-r--r-- | packages/cli/src/config/config.ts | 20 | ||||
| -rw-r--r-- | packages/cli/src/config/sandboxConfig.ts | 6 | ||||
| -rw-r--r-- | packages/cli/src/config/settings.test.ts | 80 | ||||
| -rw-r--r-- | packages/cli/src/config/settings.ts | 14 |
8 files changed, 94 insertions, 106 deletions
diff --git a/packages/cli/src/config/auth.test.ts b/packages/cli/src/config/auth.test.ts index 96defb1e..ddfed236 100644 --- a/packages/cli/src/config/auth.test.ts +++ b/packages/cli/src/config/auth.test.ts @@ -34,7 +34,7 @@ describe('validateAuthMethod', () => { describe('USE_GEMINI', () => { it('should return null if GEMINI_API_KEY is set', () => { - process.env.GEMINI_API_KEY = 'test-key'; + process.env['GEMINI_API_KEY'] = 'test-key'; expect(validateAuthMethod(AuthType.USE_GEMINI)).toBeNull(); }); @@ -47,13 +47,13 @@ describe('validateAuthMethod', () => { describe('USE_VERTEX_AI', () => { it('should return null if GOOGLE_CLOUD_PROJECT and GOOGLE_CLOUD_LOCATION are set', () => { - process.env.GOOGLE_CLOUD_PROJECT = 'test-project'; - process.env.GOOGLE_CLOUD_LOCATION = 'test-location'; + process.env['GOOGLE_CLOUD_PROJECT'] = 'test-project'; + process.env['GOOGLE_CLOUD_LOCATION'] = 'test-location'; expect(validateAuthMethod(AuthType.USE_VERTEX_AI)).toBeNull(); }); it('should return null if GOOGLE_API_KEY is set', () => { - process.env.GOOGLE_API_KEY = 'test-api-key'; + process.env['GOOGLE_API_KEY'] = 'test-api-key'; expect(validateAuthMethod(AuthType.USE_VERTEX_AI)).toBeNull(); }); diff --git a/packages/cli/src/config/auth.ts b/packages/cli/src/config/auth.ts index 91d4eee3..4676bb2f 100644 --- a/packages/cli/src/config/auth.ts +++ b/packages/cli/src/config/auth.ts @@ -17,7 +17,7 @@ export const validateAuthMethod = (authMethod: string): string | null => { } if (authMethod === AuthType.USE_GEMINI) { - if (!process.env.GEMINI_API_KEY) { + if (!process.env['GEMINI_API_KEY']) { return 'GEMINI_API_KEY environment variable not found. Add that to your environment and try again (no reload needed if using .env)!'; } return null; @@ -25,8 +25,9 @@ export const validateAuthMethod = (authMethod: string): string | null => { if (authMethod === AuthType.USE_VERTEX_AI) { const hasVertexProjectLocationConfig = - !!process.env.GOOGLE_CLOUD_PROJECT && !!process.env.GOOGLE_CLOUD_LOCATION; - const hasGoogleApiKey = !!process.env.GOOGLE_API_KEY; + !!process.env['GOOGLE_CLOUD_PROJECT'] && + !!process.env['GOOGLE_CLOUD_LOCATION']; + const hasGoogleApiKey = !!process.env['GOOGLE_API_KEY']; if (!hasVertexProjectLocationConfig && !hasGoogleApiKey) { return ( 'When using Vertex AI, you must specify either:\n' + diff --git a/packages/cli/src/config/config.integration.test.ts b/packages/cli/src/config/config.integration.test.ts index 45ed6d82..6d77740d 100644 --- a/packages/cli/src/config/config.integration.test.ts +++ b/packages/cli/src/config/config.integration.test.ts @@ -53,19 +53,17 @@ vi.mock('@google/gemini-cli-core', async () => { describe('Configuration Integration Tests', () => { let tempDir: string; - let originalEnv: NodeJS.ProcessEnv; beforeEach(() => { server.resetHandlers(http.post(CLEARCUT_URL, () => HttpResponse.text())); tempDir = fs.mkdtempSync(path.join(tmpdir(), 'gemini-cli-test-')); - originalEnv = { ...process.env }; - process.env.GEMINI_API_KEY = 'test-api-key'; + vi.stubEnv('GEMINI_API_KEY', 'test-api-key'); vi.clearAllMocks(); }); afterEach(() => { - process.env = originalEnv; + vi.unstubAllEnvs(); if (fs.existsSync(tempDir)) { fs.rmSync(tempDir, { recursive: true }); } diff --git a/packages/cli/src/config/config.test.ts b/packages/cli/src/config/config.test.ts index e70fc3b3..727f6fe1 100644 --- a/packages/cli/src/config/config.test.ts +++ b/packages/cli/src/config/config.test.ts @@ -252,17 +252,16 @@ describe('parseArguments', () => { describe('loadCliConfig', () => { const originalArgv = process.argv; - const originalEnv = { ...process.env }; beforeEach(() => { vi.resetAllMocks(); vi.mocked(os.homedir).mockReturnValue('/mock/home/user'); - process.env.GEMINI_API_KEY = 'test-api-key'; // Ensure API key is set for tests + vi.stubEnv('GEMINI_API_KEY', 'test-api-key'); }); afterEach(() => { process.argv = originalArgv; - process.env = originalEnv; + vi.unstubAllEnvs(); vi.restoreAllMocks(); }); @@ -339,7 +338,7 @@ describe('loadCliConfig', () => { ]; testCases.forEach(({ input, expected }) => { it(`should set proxy to ${expected} according to environment variable [${input.env_name}]`, async () => { - process.env[input.env_name] = input.proxy_url; + vi.stubEnv(input.env_name, input.proxy_url); process.argv = ['node', 'script.js']; const argv = await parseArguments(); const settings: Settings = {}; @@ -357,7 +356,7 @@ describe('loadCliConfig', () => { }); it('should prioritize CLI flag over environment variable for proxy (CLI http://localhost:7890, environment variable http://localhost:7891)', async () => { - process.env['http_proxy'] = 'http://localhost:7891'; + vi.stubEnv('http_proxy', 'http://localhost:7891'); process.argv = ['node', 'script.js', '--proxy', 'http://localhost:7890']; const argv = await parseArguments(); const settings: Settings = {}; @@ -368,17 +367,16 @@ describe('loadCliConfig', () => { describe('loadCliConfig telemetry', () => { const originalArgv = process.argv; - const originalEnv = { ...process.env }; beforeEach(() => { vi.resetAllMocks(); vi.mocked(os.homedir).mockReturnValue('/mock/home/user'); - process.env.GEMINI_API_KEY = 'test-api-key'; + vi.stubEnv('GEMINI_API_KEY', 'test-api-key'); }); afterEach(() => { process.argv = originalArgv; - process.env = originalEnv; + vi.unstubAllEnvs(); vi.restoreAllMocks(); }); @@ -1113,17 +1111,16 @@ describe('Approval mode tool exclusion logic', () => { describe('loadCliConfig with allowed-mcp-server-names', () => { const originalArgv = process.argv; - const originalEnv = { ...process.env }; beforeEach(() => { vi.resetAllMocks(); vi.mocked(os.homedir).mockReturnValue('/mock/home/user'); - process.env.GEMINI_API_KEY = 'test-api-key'; + vi.stubEnv('GEMINI_API_KEY', 'test-api-key'); }); afterEach(() => { process.argv = originalArgv; - process.env = originalEnv; + vi.unstubAllEnvs(); vi.restoreAllMocks(); }); @@ -1363,17 +1360,16 @@ describe('loadCliConfig model selection', () => { describe('loadCliConfig folderTrustFeature', () => { const originalArgv = process.argv; - const originalEnv = { ...process.env }; beforeEach(() => { vi.resetAllMocks(); vi.mocked(os.homedir).mockReturnValue('/mock/home/user'); - process.env.GEMINI_API_KEY = 'test-api-key'; + vi.stubEnv('GEMINI_API_KEY', 'test-api-key'); }); afterEach(() => { process.argv = originalArgv; - process.env = originalEnv; + vi.unstubAllEnvs(); vi.restoreAllMocks(); }); @@ -1396,17 +1392,16 @@ describe('loadCliConfig folderTrustFeature', () => { describe('loadCliConfig folderTrust', () => { const originalArgv = process.argv; - const originalEnv = { ...process.env }; beforeEach(() => { vi.resetAllMocks(); vi.mocked(os.homedir).mockReturnValue('/mock/home/user'); - process.env.GEMINI_API_KEY = 'test-api-key'; + vi.stubEnv('GEMINI_API_KEY', 'test-api-key'); }); afterEach(() => { process.argv = originalArgv; - process.env = originalEnv; + vi.unstubAllEnvs(); vi.restoreAllMocks(); }); @@ -1477,12 +1472,11 @@ vi.mock('fs', async () => { describe('loadCliConfig with includeDirectories', () => { const originalArgv = process.argv; - const originalEnv = { ...process.env }; beforeEach(() => { vi.resetAllMocks(); vi.mocked(os.homedir).mockReturnValue('/mock/home/user'); - process.env.GEMINI_API_KEY = 'test-api-key'; + vi.stubEnv('GEMINI_API_KEY', 'test-api-key'); vi.spyOn(process, 'cwd').mockReturnValue( path.resolve(path.sep, 'home', 'user', 'project'), ); @@ -1490,7 +1484,7 @@ describe('loadCliConfig with includeDirectories', () => { afterEach(() => { process.argv = originalArgv; - process.env = originalEnv; + vi.unstubAllEnvs(); vi.restoreAllMocks(); }); @@ -1530,17 +1524,16 @@ describe('loadCliConfig with includeDirectories', () => { describe('loadCliConfig chatCompression', () => { const originalArgv = process.argv; - const originalEnv = { ...process.env }; beforeEach(() => { vi.resetAllMocks(); vi.mocked(os.homedir).mockReturnValue('/mock/home/user'); - process.env.GEMINI_API_KEY = 'test-api-key'; + vi.stubEnv('GEMINI_API_KEY', 'test-api-key'); }); afterEach(() => { process.argv = originalArgv; - process.env = originalEnv; + vi.unstubAllEnvs(); vi.restoreAllMocks(); }); @@ -1569,20 +1562,19 @@ describe('loadCliConfig chatCompression', () => { describe('loadCliConfig tool exclusions', () => { const originalArgv = process.argv; - const originalEnv = { ...process.env }; const originalIsTTY = process.stdin.isTTY; beforeEach(() => { vi.resetAllMocks(); vi.mocked(os.homedir).mockReturnValue('/mock/home/user'); - process.env.GEMINI_API_KEY = 'test-api-key'; + vi.stubEnv('GEMINI_API_KEY', 'test-api-key'); process.stdin.isTTY = true; }); afterEach(() => { process.argv = originalArgv; - process.env = originalEnv; process.stdin.isTTY = originalIsTTY; + vi.unstubAllEnvs(); vi.restoreAllMocks(); }); @@ -1629,20 +1621,19 @@ describe('loadCliConfig tool exclusions', () => { describe('loadCliConfig interactive', () => { const originalArgv = process.argv; - const originalEnv = { ...process.env }; const originalIsTTY = process.stdin.isTTY; beforeEach(() => { vi.resetAllMocks(); vi.mocked(os.homedir).mockReturnValue('/mock/home/user'); - process.env.GEMINI_API_KEY = 'test-api-key'; + vi.stubEnv('GEMINI_API_KEY', 'test-api-key'); process.stdin.isTTY = true; }); afterEach(() => { process.argv = originalArgv; - process.env = originalEnv; process.stdin.isTTY = originalIsTTY; + vi.unstubAllEnvs(); vi.restoreAllMocks(); }); @@ -1681,18 +1672,17 @@ describe('loadCliConfig interactive', () => { describe('loadCliConfig approval mode', () => { const originalArgv = process.argv; - const originalEnv = { ...process.env }; beforeEach(() => { vi.resetAllMocks(); vi.mocked(os.homedir).mockReturnValue('/mock/home/user'); - process.env.GEMINI_API_KEY = 'test-api-key'; + vi.stubEnv('GEMINI_API_KEY', 'test-api-key'); process.argv = ['node', 'script.js']; // Reset argv for each test }); afterEach(() => { process.argv = originalArgv; - process.env = originalEnv; + vi.unstubAllEnvs(); vi.restoreAllMocks(); }); @@ -1759,18 +1749,17 @@ describe('loadCliConfig approval mode', () => { describe('loadCliConfig trustedFolder', () => { const originalArgv = process.argv; - const originalEnv = { ...process.env }; beforeEach(() => { vi.resetAllMocks(); vi.mocked(os.homedir).mockReturnValue('/mock/home/user'); - process.env.GEMINI_API_KEY = 'test-api-key'; + vi.stubEnv('GEMINI_API_KEY', 'test-api-key'); process.argv = ['node', 'script.js']; // Reset argv for each test }); afterEach(() => { process.argv = originalArgv; - process.env = originalEnv; + vi.unstubAllEnvs(); vi.restoreAllMocks(); }); diff --git a/packages/cli/src/config/config.ts b/packages/cli/src/config/config.ts index a943f641..b66afcc8 100644 --- a/packages/cli/src/config/config.ts +++ b/packages/cli/src/config/config.ts @@ -87,7 +87,7 @@ export async function parseArguments(): Promise<CliArgs> { alias: 'm', type: 'string', description: `Model`, - default: process.env.GEMINI_MODEL, + default: process.env['GEMINI_MODEL'], }) .option('prompt', { alias: 'p', @@ -230,12 +230,12 @@ export async function parseArguments(): Promise<CliArgs> { dirs.flatMap((dir) => dir.split(',').map((d) => d.trim())), }) .check((argv) => { - if (argv.prompt && argv.promptInteractive) { + if (argv.prompt && argv['promptInteractive']) { throw new Error( 'Cannot use both --prompt (-p) and --prompt-interactive (-i) together', ); } - if (argv.yolo && argv.approvalMode) { + if (argv.yolo && argv['approvalMode']) { throw new Error( 'Cannot use both --yolo (-y) and --approval-mode together. Use --approval-mode=yolo instead.', ); @@ -317,7 +317,7 @@ export async function loadCliConfig( ): Promise<Config> { const debugMode = argv.debug || - [process.env.DEBUG, process.env.DEBUG_MODE].some( + [process.env['DEBUG'], process.env['DEBUG_MODE']].some( (v) => v === 'true' || v === '1', ) || false; @@ -496,7 +496,7 @@ export async function loadCliConfig( settings.telemetry?.target) as TelemetryTarget, otlpEndpoint: argv.telemetryOtlpEndpoint ?? - process.env.OTEL_EXPORTER_OTLP_ENDPOINT ?? + process.env['OTEL_EXPORTER_OTLP_ENDPOINT'] ?? settings.telemetry?.otlpEndpoint, otlpProtocol: (['grpc', 'http'] as const).find( (p) => @@ -517,10 +517,10 @@ export async function loadCliConfig( checkpointing: argv.checkpointing || settings.checkpointing?.enabled, proxy: argv.proxy || - process.env.HTTPS_PROXY || - process.env.https_proxy || - process.env.HTTP_PROXY || - process.env.http_proxy, + process.env['HTTPS_PROXY'] || + process.env['https_proxy'] || + process.env['HTTP_PROXY'] || + process.env['http_proxy'], cwd, fileDiscoveryService: fileService, bugCommand: settings.bugCommand, @@ -531,7 +531,7 @@ export async function loadCliConfig( listExtensions: argv.listExtensions || false, extensions: allExtensions, blockedMcpServers, - noBrowser: !!process.env.NO_BROWSER, + noBrowser: !!process.env['NO_BROWSER'], summarizeToolOutput: settings.summarizeToolOutput, ideMode, chatCompression: settings.chatCompression, diff --git a/packages/cli/src/config/sandboxConfig.ts b/packages/cli/src/config/sandboxConfig.ts index c4ae50c4..4311b148 100644 --- a/packages/cli/src/config/sandboxConfig.ts +++ b/packages/cli/src/config/sandboxConfig.ts @@ -31,13 +31,13 @@ function getSandboxCommand( sandbox?: boolean | string, ): SandboxConfig['command'] | '' { // If the SANDBOX env var is set, we're already inside the sandbox. - if (process.env.SANDBOX) { + if (process.env['SANDBOX']) { return ''; } // note environment variable takes precedence over argument (from command line or settings) const environmentConfiguredSandbox = - process.env.GEMINI_SANDBOX?.toLowerCase().trim() ?? ''; + process.env['GEMINI_SANDBOX']?.toLowerCase().trim() ?? ''; sandbox = environmentConfiguredSandbox?.length > 0 ? environmentConfiguredSandbox @@ -100,7 +100,7 @@ export async function loadSandboxConfig( const packageJson = await getPackageJson(); const image = argv.sandboxImage ?? - process.env.GEMINI_SANDBOX_IMAGE ?? + process.env['GEMINI_SANDBOX_IMAGE'] ?? packageJson?.config?.sandboxImageUri; return command && image ? { command, image } : undefined; diff --git a/packages/cli/src/config/settings.test.ts b/packages/cli/src/config/settings.test.ts index 353a5783..d537eeb1 100644 --- a/packages/cli/src/config/settings.test.ts +++ b/packages/cli/src/config/settings.test.ts @@ -892,7 +892,7 @@ describe('Settings Loading and Merging', () => { }); it('should resolve environment variables in user settings', () => { - process.env.TEST_API_KEY = 'user_api_key_from_env'; + process.env['TEST_API_KEY'] = 'user_api_key_from_env'; const userSettingsContent = { apiKey: '$TEST_API_KEY', someUrl: 'https://test.com/${TEST_API_KEY}', @@ -917,11 +917,11 @@ describe('Settings Loading and Merging', () => { ); // @ts-expect-error: dynamic property for test expect(settings.merged.apiKey).toBe('user_api_key_from_env'); - delete process.env.TEST_API_KEY; + delete process.env['TEST_API_KEY']; }); it('should resolve environment variables in workspace settings', () => { - process.env.WORKSPACE_ENDPOINT = 'workspace_endpoint_from_env'; + process.env['WORKSPACE_ENDPOINT'] = 'workspace_endpoint_from_env'; const workspaceSettingsContent = { endpoint: '${WORKSPACE_ENDPOINT}/api', nested: { value: '$WORKSPACE_ENDPOINT' }, @@ -946,7 +946,7 @@ describe('Settings Loading and Merging', () => { ); // @ts-expect-error: dynamic property for test expect(settings.merged.endpoint).toBe('workspace_endpoint_from_env/api'); - delete process.env.WORKSPACE_ENDPOINT; + delete process.env['WORKSPACE_ENDPOINT']; }); it('should prioritize user env variables over workspace env variables if keys clash after resolution', () => { @@ -954,18 +954,18 @@ describe('Settings Loading and Merging', () => { const workspaceSettingsContent = { configValue: '$SHARED_VAR' }; (mockFsExistsSync as Mock).mockReturnValue(true); - const originalSharedVar = process.env.SHARED_VAR; + const originalSharedVar = process.env['SHARED_VAR']; // Temporarily delete to ensure a clean slate for the test's specific manipulations - delete process.env.SHARED_VAR; + delete process.env['SHARED_VAR']; (fs.readFileSync as Mock).mockImplementation( (p: fs.PathOrFileDescriptor) => { if (p === USER_SETTINGS_PATH) { - process.env.SHARED_VAR = 'user_value_for_user_read'; // Set for user settings read + process.env['SHARED_VAR'] = 'user_value_for_user_read'; // Set for user settings read return JSON.stringify(userSettingsContent); } if (p === MOCK_WORKSPACE_SETTINGS_PATH) { - process.env.SHARED_VAR = 'workspace_value_for_workspace_read'; // Set for workspace settings read + process.env['SHARED_VAR'] = 'workspace_value_for_workspace_read'; // Set for workspace settings read return JSON.stringify(workspaceSettingsContent); } return '{}'; @@ -990,9 +990,9 @@ describe('Settings Loading and Merging', () => { // Restore original environment variable state if (originalSharedVar !== undefined) { - process.env.SHARED_VAR = originalSharedVar; + process.env['SHARED_VAR'] = originalSharedVar; } else { - delete process.env.SHARED_VAR; // Ensure it's deleted if it wasn't there before + delete process.env['SHARED_VAR']; // Ensure it's deleted if it wasn't there before } }); @@ -1001,18 +1001,18 @@ describe('Settings Loading and Merging', () => { const workspaceSettingsContent = { configValue: '$SHARED_VAR' }; (mockFsExistsSync as Mock).mockReturnValue(true); - const originalSharedVar = process.env.SHARED_VAR; + const originalSharedVar = process.env['SHARED_VAR']; // Temporarily delete to ensure a clean slate for the test's specific manipulations - delete process.env.SHARED_VAR; + delete process.env['SHARED_VAR']; (fs.readFileSync as Mock).mockImplementation( (p: fs.PathOrFileDescriptor) => { if (p === USER_SETTINGS_PATH) { - process.env.SHARED_VAR = 'user_value_for_user_read'; // Set for user settings read + process.env['SHARED_VAR'] = 'user_value_for_user_read'; // Set for user settings read return JSON.stringify(userSettingsContent); } if (p === MOCK_WORKSPACE_SETTINGS_PATH) { - process.env.SHARED_VAR = 'workspace_value_for_workspace_read'; // Set for workspace settings read + process.env['SHARED_VAR'] = 'workspace_value_for_workspace_read'; // Set for workspace settings read return JSON.stringify(workspaceSettingsContent); } return '{}'; @@ -1034,9 +1034,9 @@ describe('Settings Loading and Merging', () => { // Restore original environment variable state if (originalSharedVar !== undefined) { - process.env.SHARED_VAR = originalSharedVar; + process.env['SHARED_VAR'] = originalSharedVar; } else { - delete process.env.SHARED_VAR; // Ensure it's deleted if it wasn't there before + delete process.env['SHARED_VAR']; // Ensure it's deleted if it wasn't there before } }); @@ -1045,18 +1045,18 @@ describe('Settings Loading and Merging', () => { const systemSettingsContent = { configValue: '$SHARED_VAR' }; (mockFsExistsSync as Mock).mockReturnValue(true); - const originalSharedVar = process.env.SHARED_VAR; + const originalSharedVar = process.env['SHARED_VAR']; // Temporarily delete to ensure a clean slate for the test's specific manipulations - delete process.env.SHARED_VAR; + delete process.env['SHARED_VAR']; (fs.readFileSync as Mock).mockImplementation( (p: fs.PathOrFileDescriptor) => { if (p === getSystemSettingsPath()) { - process.env.SHARED_VAR = 'system_value_for_system_read'; // Set for system settings read + process.env['SHARED_VAR'] = 'system_value_for_system_read'; // Set for system settings read return JSON.stringify(systemSettingsContent); } if (p === MOCK_WORKSPACE_SETTINGS_PATH) { - process.env.SHARED_VAR = 'workspace_value_for_workspace_read'; // Set for workspace settings read + process.env['SHARED_VAR'] = 'workspace_value_for_workspace_read'; // Set for workspace settings read return JSON.stringify(workspaceSettingsContent); } return '{}'; @@ -1079,9 +1079,9 @@ describe('Settings Loading and Merging', () => { // Restore original environment variable state if (originalSharedVar !== undefined) { - process.env.SHARED_VAR = originalSharedVar; + process.env['SHARED_VAR'] = originalSharedVar; } else { - delete process.env.SHARED_VAR; // Ensure it's deleted if it wasn't there before + delete process.env['SHARED_VAR']; // Ensure it's deleted if it wasn't there before } }); @@ -1146,8 +1146,8 @@ describe('Settings Loading and Merging', () => { }); it('should resolve multiple environment variables in a single string', () => { - process.env.VAR_A = 'valueA'; - process.env.VAR_B = 'valueB'; + process.env['VAR_A'] = 'valueA'; + process.env['VAR_B'] = 'valueB'; const userSettingsContent = { path: '/path/$VAR_A/${VAR_B}/end' }; (mockFsExistsSync as Mock).mockImplementation( (p: fs.PathLike) => p === USER_SETTINGS_PATH, @@ -1161,13 +1161,13 @@ describe('Settings Loading and Merging', () => { ); const settings = loadSettings(MOCK_WORKSPACE_DIR); expect(settings.user.settings.path).toBe('/path/valueA/valueB/end'); - delete process.env.VAR_A; - delete process.env.VAR_B; + delete process.env['VAR_A']; + delete process.env['VAR_B']; }); it('should resolve environment variables in arrays', () => { - process.env.ITEM_1 = 'item1_env'; - process.env.ITEM_2 = 'item2_env'; + process.env['ITEM_1'] = 'item1_env'; + process.env['ITEM_2'] = 'item2_env'; const userSettingsContent = { list: ['$ITEM_1', '${ITEM_2}', 'literal'] }; (mockFsExistsSync as Mock).mockImplementation( (p: fs.PathLike) => p === USER_SETTINGS_PATH, @@ -1185,13 +1185,13 @@ describe('Settings Loading and Merging', () => { 'item2_env', 'literal', ]); - delete process.env.ITEM_1; - delete process.env.ITEM_2; + delete process.env['ITEM_1']; + delete process.env['ITEM_2']; }); it('should correctly pass through null, boolean, and number types, and handle undefined properties', () => { - process.env.MY_ENV_STRING = 'env_string_value'; - process.env.MY_ENV_STRING_NESTED = 'env_string_nested_value'; + process.env['MY_ENV_STRING'] = 'env_string_value'; + process.env['MY_ENV_STRING_NESTED'] = 'env_string_nested_value'; const userSettingsContent = { nullVal: null, @@ -1236,13 +1236,13 @@ describe('Settings Loading and Merging', () => { 'env_string_nested_value', ); - delete process.env.MY_ENV_STRING; - delete process.env.MY_ENV_STRING_NESTED; + delete process.env['MY_ENV_STRING']; + delete process.env['MY_ENV_STRING_NESTED']; }); it('should resolve multiple concatenated environment variables in a single string value', () => { - process.env.TEST_HOST = 'myhost'; - process.env.TEST_PORT = '9090'; + process.env['TEST_HOST'] = 'myhost'; + process.env['TEST_PORT'] = '9090'; const userSettingsContent = { serverAddress: '${TEST_HOST}:${TEST_PORT}/api', }; @@ -1260,20 +1260,20 @@ describe('Settings Loading and Merging', () => { const settings = loadSettings(MOCK_WORKSPACE_DIR); expect(settings.user.settings.serverAddress).toBe('myhost:9090/api'); - delete process.env.TEST_HOST; - delete process.env.TEST_PORT; + delete process.env['TEST_HOST']; + delete process.env['TEST_PORT']; }); describe('when GEMINI_CLI_SYSTEM_SETTINGS_PATH is set', () => { const MOCK_ENV_SYSTEM_SETTINGS_PATH = '/mock/env/system/settings.json'; beforeEach(() => { - process.env.GEMINI_CLI_SYSTEM_SETTINGS_PATH = + process.env['GEMINI_CLI_SYSTEM_SETTINGS_PATH'] = MOCK_ENV_SYSTEM_SETTINGS_PATH; }); afterEach(() => { - delete process.env.GEMINI_CLI_SYSTEM_SETTINGS_PATH; + delete process.env['GEMINI_CLI_SYSTEM_SETTINGS_PATH']; }); it('should load system settings from the path specified in the environment variable', () => { diff --git a/packages/cli/src/config/settings.ts b/packages/cli/src/config/settings.ts index 36fd50f1..524eb16c 100644 --- a/packages/cli/src/config/settings.ts +++ b/packages/cli/src/config/settings.ts @@ -25,8 +25,8 @@ export const USER_SETTINGS_PATH = path.join(USER_SETTINGS_DIR, 'settings.json'); export const DEFAULT_EXCLUDED_ENV_VARS = ['DEBUG', 'DEBUG_MODE']; export function getSystemSettingsPath(): string { - if (process.env.GEMINI_CLI_SYSTEM_SETTINGS_PATH) { - return process.env.GEMINI_CLI_SYSTEM_SETTINGS_PATH; + if (process.env['GEMINI_CLI_SYSTEM_SETTINGS_PATH']) { + return process.env['GEMINI_CLI_SYSTEM_SETTINGS_PATH']; } if (platform() === 'darwin') { return '/Library/Application Support/GeminiCli/settings.json'; @@ -236,16 +236,16 @@ export function setUpCloudShellEnvironment(envFilePath: string | null): void { if (envFilePath && fs.existsSync(envFilePath)) { const envFileContent = fs.readFileSync(envFilePath); const parsedEnv = dotenv.parse(envFileContent); - if (parsedEnv.GOOGLE_CLOUD_PROJECT) { + if (parsedEnv['GOOGLE_CLOUD_PROJECT']) { // .env file takes precedence in Cloud Shell - process.env.GOOGLE_CLOUD_PROJECT = parsedEnv.GOOGLE_CLOUD_PROJECT; + process.env['GOOGLE_CLOUD_PROJECT'] = parsedEnv['GOOGLE_CLOUD_PROJECT']; } else { // If not in .env, set to default and override global - process.env.GOOGLE_CLOUD_PROJECT = 'cloudshell-gca'; + process.env['GOOGLE_CLOUD_PROJECT'] = 'cloudshell-gca'; } } else { // If no .env file, set to default and override global - process.env.GOOGLE_CLOUD_PROJECT = 'cloudshell-gca'; + process.env['GOOGLE_CLOUD_PROJECT'] = 'cloudshell-gca'; } } @@ -253,7 +253,7 @@ export function loadEnvironment(settings?: Settings): void { const envFilePath = findEnvFile(process.cwd()); // Cloud Shell environment variable handling - if (process.env.CLOUD_SHELL === 'true') { + if (process.env['CLOUD_SHELL'] === 'true') { setUpCloudShellEnvironment(envFilePath); } |
