]> Git — Sourcephile - tmp/julm/literate-invoice.git/blob - flake.nix
update(log): invoice #org3sale2
[tmp/julm/literate-invoice.git] / flake.nix
1 # SPDX-FileCopyrightText: 2025 Julien Moutinho <julm+literate-invoice@sourcephile.fr>
2 # SPDX-License-Identifier: CC0-1.0
3 {
4 description = "Literate Invoice";
5 nixConfig = {
6 allow-import-from-derivation = true;
7 };
8 inputs = {
9 nixpkgs.url = "flake:nixpkgs";
10 git-hooks.url = "github:cachix/git-hooks.nix";
11 git-hooks.inputs.nixpkgs.follows = "nixpkgs";
12 # really-safe-money = {
13 # url = "github:NorfairKing/really-safe-money";
14 # flake = false;
15 # };
16 };
17 outputs =
18 inputs:
19 let
20 pkg = "literate-invoice";
21 lib = inputs.nixpkgs.lib;
22 fileInputs =
23 with lib.fileset;
24 toSource {
25 root = ./.;
26 fileset = unions [
27 ./literate-invoice.cabal
28 #./ChangeLog.md
29 #./Readme.md
30 ./LICENSES
31 (fileFilter (file: lib.any file.hasExt [ "hs" ]) ./src)
32 (fileFilter (file: lib.any file.hasExt [ "css" ]) ./data/styles)
33 (fileFilter (
34 file:
35 lib.any file.hasExt [
36 "hs"
37 "html"
38 "txt"
39 ]
40 ) ./tests)
41 #(fileFilter (file: lib.any file.hasExt [ "hs" ]) ./app)
42 ];
43 };
44 # Helper to build for each system in `lib.systems.flakeExposed`.
45 forallSystems =
46 f:
47 lib.genAttrs lib.systems.flakeExposed (
48 system:
49 f rec {
50 inherit system;
51 #pkgs = inputs.nixpkgs.legacyPackages.${system};
52 pkgs = import inputs.nixpkgs {
53 inherit system;
54 config.allowUnfreePredicate =
55 pkg:
56 builtins.elem (lib.getName pkg) [
57 "really-safe-money"
58 ];
59 overlays = [
60 (finalPkgs: previousPkgs: {
61 haskellPackages = previousPkgs.haskellPackages.extend (
62 with finalPkgs.haskell.lib;
63 finalHaskellPkgs: previousHaskellPkgs: {
64 ${pkg} = buildFromSdist (finalHaskellPkgs.callCabal2nix pkg fileInputs { });
65 # really-safe-money =
66 # finalHaskellPkgs.callCabal2nix "really-safe-money" "${inputs.really-safe-money}/really-safe-money"
67 # { };
68 }
69 );
70 })
71 ];
72 };
73
74 }
75 );
76 in
77 {
78 # `nix -L build`
79 packages = forallSystems (
80 { pkgs, ... }:
81 pkgs
82 // {
83 default = pkgs.haskellPackages.${pkg};
84 }
85 );
86 # `nix -L develop` or `direnv allow`
87 devShells = forallSystems (
88 {
89 pkgs,
90 system,
91 ...
92 }:
93 {
94 default = pkgs.haskellPackages.shellFor {
95 packages = ps: [ ps.${pkg} ];
96 nativeBuildInputs = [
97 pkgs.haskellPackages.cabal-fmt
98 pkgs.haskellPackages.cabal-install
99 pkgs.haskellPackages.eventlog2html
100 pkgs.haskellPackages.ghc-gc-tune
101 pkgs.haskellPackages.ghcid
102 pkgs.haskellPackages.haskell-language-server
103 pkgs.haskellPackages.hlint
104 #pkgs.haskellPackages.hs-speedscope
105 #pkgs.git-chglog
106 pkgs.reuse
107 pkgs.xdot
108 pkgs.gnuplot
109 pkgs.fswatch
110 ]
111 ++ inputs.self.checks.${system}.git-hooks-check.enabledPackages;
112 withHoogle = false;
113 shellHook = ''
114 ${inputs.self.checks.${system}.git-hooks-check.shellHook}
115 '';
116 };
117 }
118 );
119 # `nix flake check`
120 checks = forallSystems (
121 args: with args; {
122 git-hooks-check = inputs.git-hooks.lib.${system}.run {
123 src = ./.;
124 hooks = {
125 cabal-fmt.enable = true;
126 fourmolu.enable = true;
127 hlint.enable = true;
128 nixfmt-rfc-style.enable = true;
129 ormolu.settings.cabalDefaultExtensions = true;
130 ormolu.settings.defaultExtensions = [
131 "ImportQualifiedPost"
132 "TypeApplications"
133 ];
134 reuse = {
135 enable = true;
136 entry = "${pkgs.reuse}/bin/reuse lint";
137 pass_filenames = false;
138 };
139 };
140 };
141 }
142 );
143 # `nix fmt`
144 formatter = forallSystems (
145 args:
146 with args;
147 let
148 config = inputs.self.checks.${system}.git-hooks-check.config;
149 inherit (config) package configFile;
150 script = ''
151 ${lib.getExe package} run --all-files --config ${configFile}
152 '';
153 in
154 pkgs.writeShellScriptBin "pre-commit-run" script
155 );
156 };
157 }