(config: DevContainerConfig, imageMetadata: ImageMetadataEntry[])
| 155 | } |
| 156 | |
| 157 | export 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 | |
| 202 | function mergeForwardPorts(imageMetadata: ImageMetadataEntry[]): (number | string)[] | undefined { |
| 203 | const forwardPorts = [ |
no test coverage detected