π File detail
utils/teleport/environmentSelection.ts
π§© .tsπ 78 linesπΎ 2,695 bytesπ text
β Back to All Filesπ― Use case
This file lives under βutils/β, which covers cross-cutting helpers (shell, tempfiles, settings, messages, process input, β¦). On the API surface it exposes EnvironmentSelectionInfo and getEnvironmentSelectionInfo β mainly functions, hooks, or classes. It composes internal code from settings and environments (relative imports).
Generated from folder role, exports, dependency roots, and inline comments β not hand-reviewed for every path.
π§ Inline summary
import { SETTING_SOURCES, type SettingSource } from '../settings/constants.js' import { getSettings_DEPRECATED, getSettingsForSource, } from '../settings/settings.js'
π€ Exports (heuristic)
EnvironmentSelectionInfogetEnvironmentSelectionInfo
π₯οΈ Source preview
import { SETTING_SOURCES, type SettingSource } from '../settings/constants.js'
import {
getSettings_DEPRECATED,
getSettingsForSource,
} from '../settings/settings.js'
import { type EnvironmentResource, fetchEnvironments } from './environments.js'
export type EnvironmentSelectionInfo = {
availableEnvironments: EnvironmentResource[]
selectedEnvironment: EnvironmentResource | null
selectedEnvironmentSource: SettingSource | null
}
/**
* Gets information about available environments and the currently selected one.
*
* @returns Promise<EnvironmentSelectionInfo> containing:
* - availableEnvironments: all environments from the API
* - selectedEnvironment: the environment that would be used (based on settings or first available),
* or null if no environments are available
* - selectedEnvironmentSource: the SettingSource where defaultEnvironmentId is configured,
* or null if using the default (first environment)
*/
export async function getEnvironmentSelectionInfo(): Promise<EnvironmentSelectionInfo> {
// Fetch available environments
const environments = await fetchEnvironments()
if (environments.length === 0) {
return {
availableEnvironments: [],
selectedEnvironment: null,
selectedEnvironmentSource: null,
}
}
// Get the merged settings to see what would actually be used
const mergedSettings = getSettings_DEPRECATED()
const defaultEnvironmentId = mergedSettings?.remote?.defaultEnvironmentId
// Find which environment would be selected
let selectedEnvironment: EnvironmentResource =
environments.find(env => env.kind !== 'bridge') ?? environments[0]!
let selectedEnvironmentSource: SettingSource | null = null
if (defaultEnvironmentId) {
const matchingEnvironment = environments.find(
env => env.environment_id === defaultEnvironmentId,
)
if (matchingEnvironment) {
selectedEnvironment = matchingEnvironment
// Find which source has this setting
// Iterate from lowest to highest priority, so the last match wins (highest priority)
for (let i = SETTING_SOURCES.length - 1; i >= 0; i--) {
const source = SETTING_SOURCES[i]
if (!source || source === 'flagSettings') {
// Skip flagSettings as it's not a normal source we check
continue
}
const sourceSettings = getSettingsForSource(source)
if (
sourceSettings?.remote?.defaultEnvironmentId === defaultEnvironmentId
) {
selectedEnvironmentSource = source
break
}
}
}
}
return {
availableEnvironments: environments,
selectedEnvironment,
selectedEnvironmentSource,
}
}