1{
2 inputs = {
3 nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable";
4 };
5
6 outputs = {
7 self,
8 nixpkgs,
9 }: let
10 supportedSystems = ["x86_64-linux" "aarch64-linux" "aarch64-darwin"];
11 forAllSystems = nixpkgs.lib.genAttrs supportedSystems;
12 nixpkgsFor = forAllSystems (system:
13 import nixpkgs {
14 inherit system;
15 overlays = [self.overlays.default];
16 });
17 in {
18 overlays.default = final: prev: let
19 pname = "plonk";
20 version = "0.1.0";
21 in {
22 plonk = with final;
23 buildNpmPackage {
24 inherit pname version;
25 src = ./.;
26 packageJson = ./package.json;
27 buildPhase = "npm run build";
28 npmDepsHash = "sha256-qGCbaFAHd/s9hOTWMjHCam6Kf6pU6IWPybfwYh0sOwc=";
29 };
30 };
31
32 packages = forAllSystems (system: {
33 inherit (nixpkgsFor."${system}") plonk;
34 });
35
36 defaultPackage = forAllSystems (system: nixpkgsFor."${system}".plonk);
37
38 devShell = forAllSystems (system: let
39 pkgs = nixpkgsFor."${system}";
40 in
41 pkgs.mkShell {
42 nativeBuildInputs = [
43 pkgs.nodejs
44 pkgs.biome
45 pkgs.typescript
46 pkgs.nodePackages.typescript-language-server
47 ];
48 });
49
50 formatter = forAllSystems (system: nixpkgsFor."${system}".alejandra);
51
52 nixosModules.default = {
53 config,
54 pkgs,
55 lib,
56 ...
57 }:
58 with lib; {
59 options = {
60 services.plonk = {
61 enable = mkOption {
62 type = types.bool;
63 default = false;
64 description = "Enable plonk";
65 };
66 port = mkOption {
67 type = types.int;
68 default = 3000;
69 description = "Port to run plonk on";
70 };
71 cookie_secret = mkOption {
72 type = types.string;
73 default = "00000000000000000000000000000000";
74 description = "Cookie secret";
75 };
76 };
77 };
78
79 config = mkIf config.services.plonk.enable {
80 nixpkgs.overlays = [self.overlays.default];
81 systemd.services.plonk = {
82 description = "plonk service";
83 wantedBy = ["multi-user.target"];
84
85 serviceConfig = {
86 ListenStream = "0.0.0.0:${toString config.services.plonk.port}";
87 ExecStart = "${pkgs.plonk}/bin/plonk";
88 Restart = "always";
89 };
90
91 environment = {
92 PLONK_PORT = "${toString config.services.plonk.port}";
93 PLONK_NODE_ENV = "production";
94 PLONK_HOST = "localhost";
95 PLONK_PUBLIC_URL = "plonk.li";
96 PLONK_DB_PATH = "plonk.db";
97 PLONK_COOKIE_SECRET = config.services.plonk.cookie_secret;
98 };
99 };
100 };
101 };
102 };
103}