Skip to content

Commit d0718b7

Browse files
committed
feat: add demo templates for flake-parts, bare-flake, and no-flake usage
flake-parts: full feature showcase with import-tree, treefmt, formatters, onChange hooks, per-file overrides, and both APIs. bare-flake: vanilla flake with evalModules, no flake-parts dependency. no-flake: pure default.nix with import, no flake infrastructure.
1 parent 11a353d commit d0718b7

5 files changed

Lines changed: 226 additions & 0 deletions

File tree

templates/bare-flake/flake.nix

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
# Vanilla flake using files via evalModules — no flake-parts dependency.
2+
{
3+
inputs = {
4+
files.url = "github:sini/files";
5+
nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
6+
};
7+
8+
outputs =
9+
{
10+
self,
11+
files,
12+
nixpkgs,
13+
...
14+
}:
15+
let
16+
system = "x86_64-linux";
17+
pkgs = nixpkgs.legacyPackages.${system};
18+
eval = pkgs.lib.evalModules {
19+
modules = [
20+
files.module
21+
{
22+
config._module.args = {
23+
inherit pkgs;
24+
};
25+
config.files.root = self;
26+
config.files.generateApp = true;
27+
28+
# --- files.file attrset API ---
29+
config.files.file.".gitignore".text = ''
30+
result
31+
.direnv
32+
'';
33+
34+
config.files.file."README.md".text = ''
35+
# bare-flake demo
36+
Uses `evalModules` with `files.module` directly.
37+
'';
38+
39+
config.files.file."scripts/hello.sh" = {
40+
text = ''
41+
#!/bin/sh
42+
echo "hello from bare flake!"
43+
'';
44+
executable = true;
45+
};
46+
47+
# --- files.files list API ---
48+
config.files.files = [
49+
{
50+
path = "data/version.txt";
51+
drv = pkgs.writeText "version.txt" "0.1.0";
52+
}
53+
];
54+
}
55+
];
56+
};
57+
in
58+
{
59+
checks.${system} = eval.config.files.checks;
60+
packages.${system}.write-files = eval.config.files.writer.drv;
61+
apps.${system}.write-files = {
62+
type = "app";
63+
program = pkgs.lib.getExe eval.config.files.writer.drv;
64+
};
65+
};
66+
}

templates/flake-parts/flake.nix

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
{
2+
inputs = {
3+
files.url = "github:sini/files";
4+
5+
flake-parts = {
6+
url = "github:hercules-ci/flake-parts";
7+
inputs.nixpkgs-lib.follows = "nixpkgs";
8+
};
9+
10+
import-tree = {
11+
url = "github:vic/import-tree";
12+
flake = false;
13+
};
14+
15+
nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
16+
17+
treefmt-nix = {
18+
url = "github:numtide/treefmt-nix";
19+
flake = false;
20+
};
21+
};
22+
23+
outputs =
24+
inputs: inputs.flake-parts.lib.mkFlake { inherit inputs; } ((import inputs.import-tree) ./modules);
25+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
{ inputs, ... }:
2+
{
3+
imports = [
4+
inputs.files.flakeModule
5+
(inputs.treefmt-nix + "/flake-module.nix")
6+
];
7+
8+
systems = [
9+
"x86_64-linux"
10+
"aarch64-linux"
11+
"aarch64-darwin"
12+
"x86_64-darwin"
13+
];
14+
}
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
# Demonstrates files.file attrset API, treefmt integration,
2+
# global formatters, per-file format overrides, and onChange hooks.
3+
{
4+
perSystem =
5+
{ pkgs, ... }:
6+
{
7+
files.generateApp = true;
8+
9+
# --- treefmt integration ---
10+
# all files.file entries are auto-formatted through treefmt
11+
treefmt.programs.nixfmt.enable = true;
12+
files.treefmt.enable = true;
13+
14+
# --- global formatter by extension ---
15+
# applied to all .json files unless overridden per-file
16+
files.formatters.json =
17+
name: drv:
18+
pkgs.runCommand "jqfmt-${name}" { nativeBuildInputs = [ pkgs.jq ]; } ''
19+
jq --sort-keys . < ${drv} > $out
20+
'';
21+
22+
# --- files.file attrset API ---
23+
24+
# text content — auto-formatted by nixfmt via treefmt
25+
files.file."config.nix".text = "{foo=1;bar=2;}";
26+
27+
# source from structured data — formatted by global .json formatter
28+
files.file."data/config.json".source = pkgs.writers.writeJSON "config.json" {
29+
version = 1;
30+
features = {
31+
treefmt = true;
32+
formatters = true;
33+
};
34+
};
35+
36+
# executable script
37+
files.file."scripts/greet.sh" = {
38+
text = ''
39+
#!/bin/sh
40+
echo "hello from files!"
41+
'';
42+
executable = true;
43+
};
44+
45+
# onChange hook with runtimeInputs
46+
files.file.".envrc" = {
47+
text = "use flake";
48+
onChange = {
49+
runtimeInputs = [ pkgs.direnv ];
50+
script = "direnv allow || true";
51+
};
52+
};
53+
54+
# per-file format override — takes priority over treefmt and global formatters
55+
files.file."NOTICE".text = "generated by files";
56+
files.file."NOTICE".format =
57+
name: drv:
58+
pkgs.runCommand "upper-${name}" { } ''
59+
tr '[:lower:]' '[:upper:]' < ${drv} > $out
60+
'';
61+
62+
# disable a file (useful for overriding shared module defaults)
63+
files.file."disabled-example.txt".text = "this won't be written";
64+
files.file."disabled-example.txt".enable = false;
65+
66+
# --- files.files list API ---
67+
# both APIs can be used together; list entries merge with attrset entries
68+
files.files = [
69+
{
70+
path = "data/version.txt";
71+
drv = pkgs.writeText "version.txt" "0.1.0";
72+
}
73+
];
74+
};
75+
}

templates/no-flake/default.nix

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
# No-flake usage: import files/module.nix directly with evalModules.
2+
# Run: nix-build -A writer && ./result/bin/write-files
3+
# Check: nix-build -A checks
4+
{
5+
pkgs ? import <nixpkgs> { },
6+
files ? builtins.fetchGit {
7+
url = "https://github.com/sini/files";
8+
ref = "main";
9+
},
10+
root ? ./.,
11+
}:
12+
let
13+
eval = pkgs.lib.evalModules {
14+
modules = [
15+
(files + "/module.nix")
16+
{
17+
config._module.args = {
18+
inherit pkgs;
19+
};
20+
config.files.root = root;
21+
22+
# --- files.file attrset API ---
23+
config.files.file.".gitignore".text = ''
24+
result
25+
'';
26+
27+
config.files.file."README.md".text = ''
28+
# no-flake demo
29+
Uses `import` and `evalModules` — no flake required.
30+
'';
31+
32+
# --- files.files list API ---
33+
config.files.files = [
34+
{
35+
path = "data/version.txt";
36+
drv = pkgs.writeText "version.txt" "0.1.0";
37+
}
38+
];
39+
}
40+
];
41+
};
42+
in
43+
{
44+
inherit (eval.config.files) checks;
45+
writer = eval.config.files.writer.drv;
46+
}

0 commit comments

Comments
 (0)