summaryrefslogtreecommitdiff
path: root/packages/cli/src/config
diff options
context:
space:
mode:
Diffstat (limited to 'packages/cli/src/config')
-rw-r--r--packages/cli/src/config/auth.test.ts8
-rw-r--r--packages/cli/src/config/auth.ts7
-rw-r--r--packages/cli/src/config/config.integration.test.ts6
-rw-r--r--packages/cli/src/config/config.test.ts59
-rw-r--r--packages/cli/src/config/config.ts20
-rw-r--r--packages/cli/src/config/sandboxConfig.ts6
-rw-r--r--packages/cli/src/config/settings.test.ts80
-rw-r--r--packages/cli/src/config/settings.ts14
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);
}