commit 20f4493a0d0e51e8b275065674de564745bed9f8 Author: D. Moonfire Date: Sun Jan 28 14:32:33 2024 -0600 chore: initial commit diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..811c8a2 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,28 @@ +root = true +["*"] +charset = "utf-8" +curly_bracket_next_line = true +end_of_line = "lf" +indent_brace_style = "K&R" +indent_size = 4 +indent_style = "space" +insert_final_newline = true +max_line_length = 80 +tab_width = 4 +trim_trailing_whitespace = true + +["*.md"] +max_line_length = "off" + +["package.json"] +indent_size = 2 +indent_style = "space" +tab_width = 2 + +["{LICENSES/**,LICENSE}"] +charset = "unset" +end_of_line = "unset" +indent_size = "unset" +indent_style = "unset" +insert_final_newline = "unset" +trim_trailing_whitespace = "unset" diff --git a/.envrc b/.envrc new file mode 100644 index 0000000..8dfc6aa --- /dev/null +++ b/.envrc @@ -0,0 +1 @@ +use flake || use nix diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e0fbe03 --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +.direnv/ + +# nixago: ignore-linked-files +/treefmt.toml +/.prettierrc.json +/lefthook.yml +/.conform.yaml \ No newline at end of file diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..3854b9f --- /dev/null +++ b/flake.lock @@ -0,0 +1,376 @@ +{ + "nodes": { + "flake-utils": { + "locked": { + "lastModified": 1653893745, + "narHash": "sha256-0jntwV3Z8//YwuOjzhV2sgJJPt+HY6KhU7VZUL0fKZQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "1ed9fb1935d260de5fe1c2f7ee0ebaae17ed2fa1", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_2": { + "locked": { + "lastModified": 1653893745, + "narHash": "sha256-0jntwV3Z8//YwuOjzhV2sgJJPt+HY6KhU7VZUL0fKZQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "1ed9fb1935d260de5fe1c2f7ee0ebaae17ed2fa1", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_3": { + "locked": { + "lastModified": 1653893745, + "narHash": "sha256-0jntwV3Z8//YwuOjzhV2sgJJPt+HY6KhU7VZUL0fKZQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "1ed9fb1935d260de5fe1c2f7ee0ebaae17ed2fa1", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_4": { + "locked": { + "lastModified": 1653893745, + "narHash": "sha256-0jntwV3Z8//YwuOjzhV2sgJJPt+HY6KhU7VZUL0fKZQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "1ed9fb1935d260de5fe1c2f7ee0ebaae17ed2fa1", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_5": { + "locked": { + "lastModified": 1653893745, + "narHash": "sha256-0jntwV3Z8//YwuOjzhV2sgJJPt+HY6KhU7VZUL0fKZQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "1ed9fb1935d260de5fe1c2f7ee0ebaae17ed2fa1", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_6": { + "locked": { + "lastModified": 1653893745, + "narHash": "sha256-0jntwV3Z8//YwuOjzhV2sgJJPt+HY6KhU7VZUL0fKZQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "1ed9fb1935d260de5fe1c2f7ee0ebaae17ed2fa1", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_7": { + "locked": { + "lastModified": 1653893745, + "narHash": "sha256-0jntwV3Z8//YwuOjzhV2sgJJPt+HY6KhU7VZUL0fKZQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "1ed9fb1935d260de5fe1c2f7ee0ebaae17ed2fa1", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_8": { + "locked": { + "lastModified": 1653893745, + "narHash": "sha256-0jntwV3Z8//YwuOjzhV2sgJJPt+HY6KhU7VZUL0fKZQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "1ed9fb1935d260de5fe1c2f7ee0ebaae17ed2fa1", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "flake-utils_9": { + "locked": { + "lastModified": 1653893745, + "narHash": "sha256-0jntwV3Z8//YwuOjzhV2sgJJPt+HY6KhU7VZUL0fKZQ=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "1ed9fb1935d260de5fe1c2f7ee0ebaae17ed2fa1", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "nixago": { + "inputs": { + "flake-utils": "flake-utils", + "nixago-exts": "nixago-exts", + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1687381756, + "narHash": "sha256-IUMIlYfrvj7Yli4H2vvyig8HEPpfCeMaE6+kBGPzFyk=", + "owner": "jmgilman", + "repo": "nixago", + "rev": "dacceb10cace103b3e66552ec9719fa0d33c0dc9", + "type": "github" + }, + "original": { + "owner": "jmgilman", + "repo": "nixago", + "type": "github" + } + }, + "nixago-exts": { + "inputs": { + "flake-utils": "flake-utils_2", + "nixago": "nixago_2", + "nixpkgs": [ + "nixago", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1676070308, + "narHash": "sha256-QaJ65oc2l8iwQIGWUJ0EKjCeSuuCM/LqR8RauxZUUkc=", + "owner": "nix-community", + "repo": "nixago-extensions", + "rev": "e5380cb0456f4ea3c86cf94e3039eb856bf07d0b", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixago-extensions", + "type": "github" + } + }, + "nixago-exts_2": { + "inputs": { + "flake-utils": "flake-utils_4", + "nixago": "nixago_3", + "nixpkgs": [ + "nixago", + "nixago-exts", + "nixago", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1655508669, + "narHash": "sha256-BDDdo5dZQMmwNH/GNacy33nPBnCpSIydWFPZs0kkj/g=", + "owner": "nix-community", + "repo": "nixago-extensions", + "rev": "3022a932ce109258482ecc6568c163e8d0b426aa", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixago-extensions", + "type": "github" + } + }, + "nixago-exts_3": { + "inputs": { + "flake-utils": "flake-utils_6", + "nixago": "nixago_4", + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1676070308, + "narHash": "sha256-QaJ65oc2l8iwQIGWUJ0EKjCeSuuCM/LqR8RauxZUUkc=", + "owner": "nix-community", + "repo": "nixago-extensions", + "rev": "e5380cb0456f4ea3c86cf94e3039eb856bf07d0b", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixago-extensions", + "type": "github" + } + }, + "nixago-exts_4": { + "inputs": { + "flake-utils": "flake-utils_8", + "nixago": "nixago_5", + "nixpkgs": [ + "nixago-exts", + "nixago", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1655508669, + "narHash": "sha256-BDDdo5dZQMmwNH/GNacy33nPBnCpSIydWFPZs0kkj/g=", + "owner": "nix-community", + "repo": "nixago-extensions", + "rev": "3022a932ce109258482ecc6568c163e8d0b426aa", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixago-extensions", + "type": "github" + } + }, + "nixago_2": { + "inputs": { + "flake-utils": "flake-utils_3", + "nixago-exts": "nixago-exts_2", + "nixpkgs": [ + "nixago", + "nixago-exts", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1676070010, + "narHash": "sha256-iYzJIWptE1EUD8VINAg66AAMUajizg8JUYN3oBmb8no=", + "owner": "nix-community", + "repo": "nixago", + "rev": "d480ba6c0c16e2c5c0bd2122852d6a0c9ad1ed0e", + "type": "github" + }, + "original": { + "owner": "nix-community", + "ref": "rename-config-data", + "repo": "nixago", + "type": "github" + } + }, + "nixago_3": { + "inputs": { + "flake-utils": "flake-utils_5", + "nixpkgs": [ + "nixago", + "nixago-exts", + "nixago", + "nixago-exts", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1655405483, + "narHash": "sha256-Crd49aZWNrpczlRTOwWGfwBMsTUoG9vlHDKQC7cx264=", + "owner": "nix-community", + "repo": "nixago", + "rev": "e6a9566c18063db5b120e69e048d3627414e327d", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixago", + "type": "github" + } + }, + "nixago_4": { + "inputs": { + "flake-utils": "flake-utils_7", + "nixago-exts": "nixago-exts_4", + "nixpkgs": [ + "nixago-exts", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1676070010, + "narHash": "sha256-iYzJIWptE1EUD8VINAg66AAMUajizg8JUYN3oBmb8no=", + "owner": "nix-community", + "repo": "nixago", + "rev": "d480ba6c0c16e2c5c0bd2122852d6a0c9ad1ed0e", + "type": "github" + }, + "original": { + "owner": "nix-community", + "ref": "rename-config-data", + "repo": "nixago", + "type": "github" + } + }, + "nixago_5": { + "inputs": { + "flake-utils": "flake-utils_9", + "nixpkgs": [ + "nixago-exts", + "nixago", + "nixago-exts", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1655405483, + "narHash": "sha256-Crd49aZWNrpczlRTOwWGfwBMsTUoG9vlHDKQC7cx264=", + "owner": "nix-community", + "repo": "nixago", + "rev": "e6a9566c18063db5b120e69e048d3627414e327d", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixago", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1706098335, + "narHash": "sha256-r3dWjT8P9/Ah5m5ul4WqIWD8muj5F+/gbCdjiNVBKmU=", + "rev": "a77ab169a83a4175169d78684ddd2e54486ac651", + "revCount": 554858, + "type": "tarball", + "url": "https://api.flakehub.com/f/pinned/NixOS/nixpkgs/0.2311.554858%2Brev-a77ab169a83a4175169d78684ddd2e54486ac651/018d46f0-798f-71dc-a8c5-4689c46f7d12/source.tar.gz" + }, + "original": { + "type": "tarball", + "url": "https://flakehub.com/f/NixOS/nixpkgs/%2A.tar.gz" + } + }, + "root": { + "inputs": { + "nixago": "nixago", + "nixago-exts": "nixago-exts_3", + "nixpkgs": "nixpkgs" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..5523b5d --- /dev/null +++ b/flake.nix @@ -0,0 +1,49 @@ +{ + description = "Common setup for many projects that use a variety of languages."; + + inputs = { + nixpkgs.url = "https://flakehub.com/f/NixOS/nixpkgs/*.tar.gz"; + + nixago.url = "github:jmgilman/nixago"; + nixago.inputs.nixpkgs.follows = "nixpkgs"; + + nixago-exts.url = "github:nix-community/nixago-extensions"; + nixago-exts.inputs.nixpkgs.follows = "nixpkgs"; + }; + + outputs = inputs @ { self, nixpkgs, nixago, nixago-exts, ... }: + let + # Helpers for producing system-specific outputs + supportedSystems = [ "x86_64-linux" ]; + forEachSupportedSystem = f: nixpkgs.lib.genAttrs supportedSystems (system: f { + inherit system; + pkgs = import nixpkgs { inherit system; }; + }); + in + { + # Expose the configuration options for setup. + nixosModules = { + mfgames-project-setup = import ./src/modules/default.nix; + default = self.nixosModules.mfgames-project-setup; + }; + + # Set up the developer shell. + # Development environments + devShells = forEachSupportedSystem ({ system, pkgs }: + let + configs = import ./src/configs/default.nix { inherit system pkgs nixago nixago-exts; }; + in + { + # Shell + default = pkgs.mkShell { + shellHook = '' + ${configs.shellHook} + lefthook install + ''; + }; + }); + + # Formatting for the Nix files + formatter = forEachSupportedSystem ({ pkgs, ... }: pkgs.nixpkgs-fmt); + }; +} diff --git a/src/configs/conform.nix b/src/configs/conform.nix new file mode 100644 index 0000000..8959ce3 --- /dev/null +++ b/src/configs/conform.nix @@ -0,0 +1,22 @@ +inputs @ { system, nixago, nixago-exts, ... }: +nixago-exts.conform.${system} { + commit = { + header = { length = 89; }; + conventional = { + types = [ + "build" + "chore" + "ci" + "docs" + "feat" + "fix" + "perf" + "refactor" + "style" + "test" + ]; + + scopes = [ "cli" ]; + }; + }; +} diff --git a/src/configs/default.nix b/src/configs/default.nix new file mode 100644 index 0000000..4d3f6db --- /dev/null +++ b/src/configs/default.nix @@ -0,0 +1,9 @@ +inputs: +inputs.nixago.lib.${inputs.system}.makeAll [ + (import ./conform.nix (inputs)) + (import ./editorconfig.nix (inputs)) + (import ./lefthook.nix (inputs)) + (import ./prettier.nix (inputs)) + #(import ./rustfmt.nix (inputs)) + (import ./treefmt.nix (inputs)) +] diff --git a/src/configs/editorconfig.nix b/src/configs/editorconfig.nix new file mode 100644 index 0000000..572c278 --- /dev/null +++ b/src/configs/editorconfig.nix @@ -0,0 +1,44 @@ +inputs: +let + data = { + root = true; + + "*" = { + end_of_line = "lf"; + insert_final_newline = true; + trim_trailing_whitespace = true; + charset = "utf-8"; + indent_style = "space"; + indent_size = 4; + indent_brace_style = "K&R"; + max_line_length = 80; + tab_width = 4; + curly_bracket_next_line = true; + }; + + "*.md" = { + max_line_length = "off"; + }; + + "package.json" = { + indent_style = "space"; + indent_size = 2; + tab_width = 2; + }; + + "{LICENSES/**,LICENSE}" = { + end_of_line = "unset"; + insert_final_newline = "unset"; + trim_trailing_whitespace = "unset"; + charset = "unset"; + indent_style = "unset"; + indent_size = "unset"; + }; + }; +in +{ + inherit data; + hook.mode = "copy"; + output = ".editorconfig"; + format = "toml"; +} diff --git a/src/configs/lefthook.nix b/src/configs/lefthook.nix new file mode 100644 index 0000000..440c2ee --- /dev/null +++ b/src/configs/lefthook.nix @@ -0,0 +1,21 @@ +inputs @ { system, pkgs, nixago, nixago-exts, ... }: +nixago-exts.lefthook.${system} { + commit-msg = { + commands = { + # Runs conform on commit-msg hook to ensure commit messages are + # compliant. + conform = { + run = "${pkgs.conform}/bin/conform enforce --commit-msg-file {1}"; + }; + }; + }; + pre-commit = { + commands = { + # Runs treefmt on pre-commit hook to ensure checked-in source code is + # properly formatted. + treefmt = { + run = "${pkgs.treefmt}/bin/treefmt {staged_files} && git add {staged_files}"; + }; + }; + }; +} diff --git a/src/configs/prettier.nix b/src/configs/prettier.nix new file mode 100644 index 0000000..3166c3e --- /dev/null +++ b/src/configs/prettier.nix @@ -0,0 +1,7 @@ +inputs @ { system, nixago, nixago-exts, ... }: +nixago-exts.prettier.${system} { + data = { + printWidth = 80; + proseWrap = "always"; + }; +} diff --git a/src/configs/rustfmt.nix b/src/configs/rustfmt.nix new file mode 100644 index 0000000..86a90ec --- /dev/null +++ b/src/configs/rustfmt.nix @@ -0,0 +1,17 @@ +inputs: +let + data = { + brace_style = "AlwaysNextLine"; + indent_style = "Block"; + reorder_imports = true; + imports_layout = "HorizontalVertical"; + max_width = 80; + group_imports = "StdExternalCrate"; + imports_granularity = "Module"; + }; +in +{ + inherit data; + output = "rustfmt.toml"; + format = "toml"; +} diff --git a/src/configs/treefmt.nix b/src/configs/treefmt.nix new file mode 100644 index 0000000..04d3ba1 --- /dev/null +++ b/src/configs/treefmt.nix @@ -0,0 +1,39 @@ +inputs @ { pkgs, ... }: +let + data = { + formatter = { + nix = { + command = "nixpkgs-fmt"; + includes = [ "*.nix" ]; + }; + + prettier = { + command = "${pkgs.nodePackages.prettier}/bin/prettier"; + options = [ "--write" ]; + includes = [ + "*.css" + "*.html" + "*.js" + "*.json" + "*.jsx" + "*.md" + "*.mdx" + "*.scss" + "*.ts" + "*.yaml" + ]; + excludes = [ "**.min.js" ]; + }; + + rust = { + command = "rustfmt"; + options = [ "--edition" "2021" ]; + includes = [ "*.rs" ]; + }; + }; + }; +in +{ + inherit data; + output = "treefmt.toml"; +} diff --git a/src/modules/default.nix b/src/modules/default.nix new file mode 100644 index 0000000..58c8cf9 --- /dev/null +++ b/src/modules/default.nix @@ -0,0 +1,23 @@ +{ config, lib, pkgs, ... }: +let + cfg = config.mfgames-project-setup; + secretType = types.submodule ({ config, ... }: { + options = { + rust = mkOption { + type = types.bool; + default = false; + }; + }; + }); +in +{ + options.mfgames-project-setup = { + rust = mkOption { + type = types.bool; + default = true; + description = '' + Enabling this option including tools for handling Rust projects. + ''; + }; + }; +}