{ nixpkgs, idris, flake-utils, system, stdenv, runCommand, lib }: let withTests = tests: drv: let testDrvs = lib.mapAttrs (name: testScript: runCommand "${drv.name}-test-${name}" { } '' ${testScript} touch "$out" '') tests; in testDrvs; createTemplate = flake: inputs: type: let self = import flake; template = self.outputs ({ inherit self nixpkgs idris flake-utils; } // inputs); templateBuild = template.packages.${system}.${type}; in templateBuild; templateBuildDefault = createTemplate ./templates/pkg/flake.nix { } "build"; templateBuildDefaultLibrary = createTemplate ./templates/pkg/flake.nix { } "installLibrary"; templateBuildWithDeps = createTemplate ./templates/pkgWithDeps/flake.nix { pkg = templateBuildDefaultLibrary; } "build"; testsTemplate = { checkFoo = '' ${templateBuildDefault}/bin/runMyPkg \ | grep "Foo" ''; }; testsTemplateWithDeps = { checkBar = '' ${templateBuildWithDeps}/bin/runMyPkg2 \ | grep "Bar" ''; }; in withTests testsTemplate templateBuildDefault // withTests testsTemplateWithDeps templateBuildWithDeps // { idris2Tests = idris.defaultPackage.${system}.overrideAttrs (a: { doCheck = true; }); }