{ runCommand, lib, kubernetes-helm, yq, }: with lib; { # chart to template chart, # release name name, # namespace to install release into namespace ? null, # values to pass to chart values ? {}, # kubernetes version to template chart for kubeVersion ? null, # whether to include CRD includeCRDs ? false, # whether to include hooks noHooks ? false, }: let valuesJsonFile = builtins.toFile "${name}-values.json" (builtins.toJSON values); # The `helm template` and YAML -> JSON steps are separate `runCommand` derivations for easier debuggability resourcesYaml = runCommand "${name}.yaml" {nativeBuildInputs = [kubernetes-helm];} '' helm template "${name}" \ ${optionalString (kubeVersion != null) "--kube-version ${kubeVersion}"} \ ${optionalString (namespace != null) "--namespace ${namespace}"} \ ${optionalString (values != {}) "-f ${valuesJsonFile}"} \ ${optionalString includeCRDs "--include-crds"} \ ${optionalString noHooks "--no-hooks"} \ ${chart} >$out ''; in runCommand "${name}.json" {} '' # Remove null values ${yq}/bin/yq -Scs 'walk( if type == "object" then with_entries(select(.value != null)) elif type == "array" then map(select(. != null)) else . end)' ${resourcesYaml} >$out ''