{
  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