(baseImageMetadata: SubstitutedConfig<ImageMetadataEntry[]>, devContainerConfig: SubstitutedConfig<DevContainerConfig>, featuresConfig: FeaturesConfig | undefined, omitPropertyOverride: string[] = [], omitDevcontainerPropertyOverride: (keyof DevContainerConfig & keyof ImageMetadataEntry)[] = [])
| 289 | } |
| 290 | |
| 291 | export function getDevcontainerMetadata(baseImageMetadata: SubstitutedConfig<ImageMetadataEntry[]>, devContainerConfig: SubstitutedConfig<DevContainerConfig>, featuresConfig: FeaturesConfig | undefined, omitPropertyOverride: string[] = [], omitDevcontainerPropertyOverride: (keyof DevContainerConfig & keyof ImageMetadataEntry)[] = []): SubstitutedConfig<ImageMetadataEntry[]> { |
| 292 | const effectivePickFeatureProperties = pickFeatureProperties.filter(property => !omitPropertyOverride.includes(property)); |
| 293 | const effectivePickDevcontainerProperties = pickConfigProperties.filter(property => !omitDevcontainerPropertyOverride.includes(property)); |
| 294 | |
| 295 | const featureRaw = featuresConfig?.featureSets.map(featureSet => |
| 296 | featureSet.features.map(feature => ({ |
| 297 | id: featureSet.sourceInformation.userFeatureId, |
| 298 | ...pick(feature, effectivePickFeatureProperties), |
| 299 | }))).flat() || []; |
| 300 | |
| 301 | const raw = [ |
| 302 | ...baseImageMetadata.raw, |
| 303 | ...featureRaw, |
| 304 | pick(devContainerConfig.raw, effectivePickDevcontainerProperties), |
| 305 | ].filter(config => Object.keys(config).length); |
| 306 | |
| 307 | return { |
| 308 | config: [ |
| 309 | ...baseImageMetadata.config, |
| 310 | ...featureRaw.map(devContainerConfig.substitute), |
| 311 | pick(devContainerConfig.config, effectivePickDevcontainerProperties), |
| 312 | ].filter(config => Object.keys(config).length), |
| 313 | raw, |
| 314 | substitute: devContainerConfig.substitute, |
| 315 | }; |
| 316 | } |
| 317 | |
| 318 | function pick<T extends object, K extends keyof T>(obj: T, keys: K[]) { |
| 319 | return keys.reduce((res, key) => { |
no test coverage detected