diff --git a/.envrc b/.envrc new file mode 100644 index 0000000..3550a30 --- /dev/null +++ b/.envrc @@ -0,0 +1 @@ +use flake diff --git a/.gitignore b/.gitignore index 460cbe1..3baef8c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +.direnv /findr /findr-prof *.spall diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..9ecfd2a --- /dev/null +++ b/flake.lock @@ -0,0 +1,99 @@ +{ + "nodes": { + "flake-parts": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib" + }, + "locked": { + "lastModified": 1778716662, + "narHash": "sha256-m1Yf0wZ8j1OHjTc2UwHwyQRSnNeSgLJOd7q5Y45hzi4=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "f7c1a2d347e4c52d5fb8d10cb4d94b5884e546fb", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1767313136, + "narHash": "sha256-16KkgfdYqjaeRGBaYsNrhPRRENs0qzkQVUooNHtoy2w=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "ac62194c3917d5f474c1a844b6fd6da2db95077d", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-25.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib": { + "locked": { + "lastModified": 1777168982, + "narHash": "sha256-GOkGPcboWE9BmGCRMLX3worL4EMnsnG8MyKmXNeYuhQ=", + "owner": "nix-community", + "repo": "nixpkgs.lib", + "rev": "f5901329dade4a6ea039af1433fb087bd9c1fe14", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixpkgs.lib", + "type": "github" + } + }, + "nixpkgs-unstable": { + "locked": { + "lastModified": 1781173989, + "narHash": "sha256-fnzKKPvS+oieI/pTzotA5tkoM47EB1NpaBcgk4R97hE=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "8c91a71d13451abc40eb9dae8910f972f979852f", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "flake-parts": "flake-parts", + "nixpkgs": "nixpkgs", + "nixpkgs-unstable": "nixpkgs-unstable", + "treefmt-nix": "treefmt-nix" + } + }, + "treefmt-nix": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1780220602, + "narHash": "sha256-eynAfOmbmxJnkp7YewvCEbShNnnYJ9gLLqkzsYtBPeM=", + "owner": "numtide", + "repo": "treefmt-nix", + "rev": "db947814a175b7ca6ded66e21383d938df01c227", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "treefmt-nix", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..aa50bf0 --- /dev/null +++ b/flake.nix @@ -0,0 +1,127 @@ +{ + description = "Manage your .env files."; + + inputs = { + nixpkgs.url = "github:NixOS/nixpkgs/nixos-25.05"; + nixpkgs-unstable.url = "github:NixOS/nixpkgs/nixpkgs-unstable"; + + flake-parts.url = "github:hercules-ci/flake-parts"; + treefmt-nix.url = "github:numtide/treefmt-nix"; + treefmt-nix.inputs.nixpkgs.follows = "nixpkgs"; + }; + + outputs = + inputs@{ + flake-parts, + nixpkgs, + nixpkgs-unstable, + self, + treefmt-nix, + }: + flake-parts.lib.mkFlake { inherit inputs; } { + imports = [ + inputs.treefmt-nix.flakeModule + ]; + systems = [ + "x86_64-linux" + "aarch64-linux" + + "aarch64-darwin" + ]; + + perSystem = + { + pkgs, + system, + inputs', + ... + }: + let + mysqlite = pkgs.sqlite.overrideAttrs (old: { + configureFlags = (old.configureFlags or [ ]) ++ [ "--enable-deserialize" ]; + }); + in + { + _module.args.pkgs = import nixpkgs { + inherit system; + config.allowUnfree = true; + + overlays = [ + (_final: _prev: { unstable = inputs'.nixpkgs-unstable.legacyPackages; }) + ]; + }; + + treefmt = { + projectRootFile = "flake.nix"; + settings.global.excludes = [ + ".direnv/**" + ".jj/**" + ".env" + ".envrc" + ".env.local" + ]; + + programs.nixpkgs-fmt.enable = true; + }; + + packages.default = pkgs.stdenv.mkDerivation rec { + pname = "envr"; + version = "0.3.0"; + src = ./.; + + nativeBuildInputs = [ + pkgs.unstable.odin + pkgs.pkg-config + ]; + + buildInputs = [ + pkgs.libsodium + mysqlite + ]; + + doCheck = true; + checkPhase = '' + runHook preCheck + odin test . -all-packages + runHook postCheck + ''; + + buildPhase = '' + runHook preBuild + echo '${version}' > version.txt + odin build . -o:speed -out:${pname} + runHook postBuild + ''; + + installPhase = '' + runHook preInstall + install -Dm755 ${pname} $out/bin/${pname} + runHook postInstall + ''; + }; + + devShells.default = pkgs.mkShell { + buildInputs = with pkgs; [ + nushell + + libsodium + mysqlite + unstable.odin + unstable.ols + + # Build tools + zip + + # Helper tools + delta + hyperfine + + # IDE + unstable.helix + typescript-language-server + vscode-langservers-extracted + ]; + }; + }; + }; +}