mergeProviderEnvironment function

Map<String, String> mergeProviderEnvironment({
  1. required Map<String, String> inherited,
  2. required Map<String, String> overrides,
  3. required bool isWindows,
  4. Iterable<String> canonicalKeys = const <String>[],
})

Merges process environment layers using the host platform's key semantics.

Windows environment keys are case-insensitive. The canonical PATH and PATHEXT spellings keep subsequent executable lookup deterministic.

Implementation

Map<String, String> mergeProviderEnvironment({
  required Map<String, String> inherited,
  required Map<String, String> overrides,
  required bool isWindows,
  Iterable<String> canonicalKeys = const <String>[],
}) {
  if (!isWindows) {
    return <String, String>{...inherited, ...overrides};
  }

  final merged = <String, String>{};
  final keysByLowerCase = <String, String>{};
  final canonicalKeysByLowerCase = <String, String>{
    for (final key in canonicalKeys) key.toLowerCase(): key,
    'path': 'PATH',
    'pathext': 'PATHEXT',
  };
  void add(String key, String value) {
    final lowerCase = key.toLowerCase();
    final previousKey = keysByLowerCase[lowerCase];
    if (previousKey != null) merged.remove(previousKey);
    final canonicalKey =
        canonicalKeysByLowerCase[lowerCase] ?? previousKey ?? key;
    keysByLowerCase[lowerCase] = canonicalKey;
    merged[canonicalKey] = value;
  }

  inherited.forEach(add);
  overrides.forEach(add);
  return merged;
}