Monorepo for Tangled
tangled.org
1{
2 description = "atproto github";
3
4 inputs = {
5 nixpkgs.url = "github:nixos/nixpkgs";
6 indigo = {
7 url = "github:oppiliappan/indigo";
8 flake = false;
9 };
10 htmx-src = {
11 url = "https://unpkg.com/htmx.org@2.0.4/dist/htmx.min.js";
12 flake = false;
13 };
14 gitignore = {
15 url = "github:hercules-ci/gitignore.nix";
16 inputs.nixpkgs.follows = "nixpkgs";
17 };
18 };
19
20 outputs = {
21 self,
22 nixpkgs,
23 indigo,
24 htmx-src,
25 gitignore,
26 }: let
27 supportedSystems = ["x86_64-linux" "x86_64-darwin" "aarch64-linux" "aarch64-darwin"];
28 forAllSystems = nixpkgs.lib.genAttrs supportedSystems;
29 nixpkgsFor = forAllSystems (system:
30 import nixpkgs {
31 inherit system;
32 overlays = [self.overlays.default];
33 });
34 inherit (gitignore.lib) gitignoreSource;
35 in {
36 overlays.default = final: prev: {
37 indigo-lexgen = with final;
38 final.buildGoModule {
39 pname = "indigo-lexgen";
40 version = "0.1.0";
41 src = indigo;
42 subPackages = ["cmd/lexgen"];
43 vendorHash = "sha256-pGc29fgJFq8LP7n/pY1cv6ExZl88PAeFqIbFEhB3xXs=";
44 doCheck = false;
45 };
46
47 appview = with final;
48 final.buildGoModule {
49 pname = "appview";
50 version = "0.1.0";
51 src = gitignoreSource ./.;
52 postConfigureHook = ''
53 cp -f ${htmx-src} appview/pages/static/htmx.min.js
54 ${pkgs.tailwindcss}/bin/tailwindcss -i input.css -o appview/pages/static/tw.css
55 '';
56 subPackages = ["cmd/appview"];
57 vendorHash = "sha256-QgUPTOgAdKUTg+ztfs194G7pt3/qDtqTMkDRmMECxSo=";
58 env.CGO_ENABLED = 1;
59 };
60 knotserver = with final;
61 final.buildGoModule {
62 pname = "knotserver";
63 version = "0.1.0";
64 src = gitignoreSource ./.;
65 subPackages = ["cmd/knotserver"];
66 vendorHash = "sha256-QgUPTOgAdKUTg+ztfs194G7pt3/qDtqTMkDRmMECxSo=";
67 env.CGO_ENABLED = 1;
68 };
69 };
70 packages = forAllSystems (system: {
71 inherit (nixpkgsFor."${system}") indigo-lexgen appview knotserver;
72 });
73 defaultPackage = forAllSystems (system: nixpkgsFor.${system}.appview);
74 formatter = forAllSystems (system: nixpkgsFor."${system}".alejandra);
75 devShells = forAllSystems (system: let
76 pkgs = nixpkgsFor.${system};
77 staticShell = pkgs.mkShell.override {
78 stdenv = pkgs.pkgsStatic.stdenv;
79 };
80 in {
81 default = staticShell {
82 nativeBuildInputs = [
83 pkgs.go
84 pkgs.air
85 pkgs.gopls
86 pkgs.httpie
87 pkgs.indigo-lexgen
88 pkgs.litecli
89 pkgs.websocat
90 pkgs.tailwindcss
91 ];
92 };
93 });
94 apps = forAllSystems (system: let
95 pkgs = nixpkgsFor."${system}";
96 air-watcher = name:
97 pkgs.writeShellScriptBin "run"
98 ''
99 ${pkgs.air}/bin/air -c /dev/null \
100 -build.cmd "cp -f ${htmx-src} appview/pages/static/htmx.min.js && ${pkgs.tailwindcss}/bin/tailwindcss -i input.css -o ./appview/pages/static/tw.css && ${pkgs.go}/bin/go build -o ./out/${name}.out ./cmd/${name}/main.go" \
101 -build.bin "./out/${name}.out" \
102 -build.include_ext "go,html,css"
103 '';
104 in {
105 watch-appview = {
106 type = "app";
107 program = ''${air-watcher "appview"}/bin/run'';
108 };
109 watch-knotserver = {
110 type = "app";
111 program = ''${air-watcher "knotserver"}/bin/run'';
112 };
113 });
114 };
115}