mergeProviderEnvironment function
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;
}