{ 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 { } "executable"; templateBuildDefaultLibrary = createTemplate ./templates/pkg/flake.nix { } "library" { }; templateBuildWithDeps = createTemplate ./templates/pkgWithDeps/flake.nix { pkg = templateBuildDefaultLibrary; } "executable"; testsTemplate = { checkFoo = '' ${templateBuildDefault}/bin/runMyPkg \ | grep "Foo" ''; }; testsTemplateWithDeps = { checkBar = '' ${templateBuildWithDeps}/bin/runMyPkg2 \ | grep "Bar" ''; }; in withTests testsTemplate templateBuildDefault // withTests testsTemplateWithDeps templateBuildWithDeps // { idris2Tests = idris.packages.${system}.default.overrideAttrs (a: { doCheck = true; }); }