MCPcopy Index your code
hub / github.com/devcontainers/cli / mergeConfiguration

Function mergeConfiguration

src/spec-node/imageMetadata.ts:157–200  ·  view source on GitHub ↗
(config: DevContainerConfig, imageMetadata: ImageMetadataEntry[])

Source from the content-addressed store, hash-verified

155}
156
157export function mergeConfiguration(config: DevContainerConfig, imageMetadata: ImageMetadataEntry[]): MergedDevContainerConfig {
158 const customizations = imageMetadata.reduce((obj, entry) => {
159 for (const key in entry.customizations) {
160 if (key in obj) {
161 obj[key].push(entry.customizations[key]);
162 } else {
163 obj[key] = [entry.customizations[key]];
164 }
165 }
166 return obj;
167 }, {} as Record<string, any[]>);
168 const reversed = imageMetadata.slice().reverse();
169 const copy = { ...config };
170 replaceProperties.forEach(property => delete (copy as any)[property]);
171 const merged: MergedDevContainerConfig = {
172 ...copy,
173 init: imageMetadata.some(entry => entry.init),
174 privileged: imageMetadata.some(entry => entry.privileged),
175 capAdd: unionOrUndefined(imageMetadata.map(entry => entry.capAdd)),
176 securityOpt: unionOrUndefined(imageMetadata.map(entry => entry.securityOpt)),
177 entrypoints: collectOrUndefined(imageMetadata, 'entrypoint'),
178 mounts: mergeMounts(imageMetadata),
179 customizations: Object.keys(customizations).length ? customizations : undefined,
180 onCreateCommands: mergeLifecycleHooks(imageMetadata, 'onCreateCommand'),
181 updateContentCommands: mergeLifecycleHooks(imageMetadata, 'updateContentCommand'),
182 postCreateCommands: mergeLifecycleHooks(imageMetadata, 'postCreateCommand'),
183 postStartCommands: mergeLifecycleHooks(imageMetadata, 'postStartCommand'),
184 postAttachCommands: mergeLifecycleHooks(imageMetadata, 'postAttachCommand'),
185 waitFor: reversed.find(entry => entry.waitFor)?.waitFor,
186 remoteUser: reversed.find(entry => entry.remoteUser)?.remoteUser,
187 containerUser: reversed.find(entry => entry.containerUser)?.containerUser,
188 userEnvProbe: reversed.find(entry => entry.userEnvProbe)?.userEnvProbe,
189 remoteEnv: Object.assign({}, ...imageMetadata.map(entry => entry.remoteEnv)),
190 containerEnv: Object.assign({}, ...imageMetadata.map(entry => entry.containerEnv)),
191 overrideCommand: reversed.find(entry => typeof entry.overrideCommand === 'boolean')?.overrideCommand,
192 portsAttributes: Object.assign({}, ...imageMetadata.map(entry => entry.portsAttributes)),
193 otherPortsAttributes: reversed.find(entry => entry.otherPortsAttributes)?.otherPortsAttributes,
194 forwardPorts: mergeForwardPorts(imageMetadata),
195 shutdownAction: reversed.find(entry => entry.shutdownAction)?.shutdownAction,
196 updateRemoteUserUID: reversed.find(entry => typeof entry.updateRemoteUserUID === 'boolean')?.updateRemoteUserUID,
197 hostRequirements: mergeHostRequirements(imageMetadata),
198 };
199 return merged;
200}
201
202function mergeForwardPorts(imageMetadata: ImageMetadataEntry[]): (number | string)[] | undefined {
203 const forwardPorts = [

Callers 8

startContainerFunction · 0.90
doSetUpFunction · 0.90
doRunUserCommandsFunction · 0.90
readConfigurationFunction · 0.90
doExecFunction · 0.90

Calls 6

unionOrUndefinedFunction · 0.85
collectOrUndefinedFunction · 0.85
mergeMountsFunction · 0.85
mergeLifecycleHooksFunction · 0.85
mergeForwardPortsFunction · 0.85
mergeHostRequirementsFunction · 0.85

Tested by

no test coverage detected