{ lib, fetchurl, runCommand, writeText, }: { name ? "deps", data, dontFixup ? true, ... }@attrs: let data' = builtins.removeAttrs (if builtins.isPath data then lib.importJSON data else data) [ "!version" ]; urlToPath = url: if lib.hasPrefix "https://" url then ( let url' = lib.drop 2 (lib.splitString "/" url); in "https/${builtins.concatStringsSep "/" url'}" ) else builtins.replaceStrings [ "://" ] [ "/" ] url; code = '' mkdir -p "$out" cd "$out" '' + builtins.concatStringsSep "" ( lib.mapAttrsToList ( url: info: let key = builtins.head (builtins.attrNames info); val = info.${key}; path = urlToPath url; name = baseNameOf path; source = { redirect = "$out/${urlToPath val}"; hash = fetchurl { inherit url; hash = val; }; text = writeText name val; } .${key} or (throw "Unknown key: ${url}"); in '' mkdir -p "${dirOf path}" ln -s "${source}" "${path}" '' ) data' ); in runCommand name ( builtins.removeAttrs attrs [ "name" "data" ] // { passthru = (attrs.passthru or { }) // { data = writeText "deps.json" (builtins.toJSON data); }; } ) code