From 4b7fe1b9ed27a7a93b9c7d91d188e88fba581663 Mon Sep 17 00:00:00 2001 From: Steffen Beyer Date: Thu, 9 Apr 2026 10:44:46 +0200 Subject: [PATCH] dev: devenv.nix, nosdump pkg --- .envrc | 12 +++ .gitignore | 15 ++++ devenv.lock | 139 +++++++++++++++++++++++++++++++++++ devenv.nix | 90 +++++++++++++++++++++++ devenv.yaml | 17 +++++ nix/nosdump-no-upgrade.patch | 30 ++++++++ nix/nosdump.nix | 92 +++++++++++++++++++++++ 7 files changed, 395 insertions(+) create mode 100644 .envrc create mode 100644 devenv.lock create mode 100644 devenv.nix create mode 100644 devenv.yaml create mode 100644 nix/nosdump-no-upgrade.patch create mode 100644 nix/nosdump.nix diff --git a/.envrc b/.envrc new file mode 100644 index 0000000..cc5c18b --- /dev/null +++ b/.envrc @@ -0,0 +1,12 @@ +#!/usr/bin/env bash + +export DIRENV_WARN_TIMEOUT=20s + +eval "$(devenv direnvrc)" + +# `use devenv` supports the same options as the `devenv shell` command. +# +# To silence all output, use `--quiet`. +# +# Example usage: use devenv --quiet --impure --option services.postgres.enable:bool true +use devenv diff --git a/.gitignore b/.gitignore index bbbae40..cd5d153 100644 --- a/.gitignore +++ b/.gitignore @@ -25,3 +25,18 @@ Thumbs.db # Env files .env .env.local + +# To do list +/TODO.md + +# Devenv +.devenv* +.env +.null-ls_*.nix +devenv.local.nix + +# direnv +.direnv + +# pre-commit +.pre-commit-config.yaml diff --git a/devenv.lock b/devenv.lock new file mode 100644 index 0000000..a8461a3 --- /dev/null +++ b/devenv.lock @@ -0,0 +1,139 @@ +{ + "nodes": { + "devenv": { + "locked": { + "dir": "src/modules", + "lastModified": 1774475276, + "owner": "cachix", + "repo": "devenv", + "rev": "f8ca2c061ec2feceee1cf1c5e52c92f58b6aec9c", + "type": "github" + }, + "original": { + "dir": "src/modules", + "owner": "cachix", + "repo": "devenv", + "type": "github" + } + }, + "flake-compat": { + "flake": false, + "locked": { + "lastModified": 1767039857, + "owner": "NixOS", + "repo": "flake-compat", + "rev": "5edf11c44bc78a0d334f6334cdaf7d60d732daab", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "flake-compat", + "type": "github" + } + }, + "git-hooks": { + "inputs": { + "flake-compat": "flake-compat", + "gitignore": "gitignore", + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1774104215, + "owner": "cachix", + "repo": "git-hooks.nix", + "rev": "f799ae951fde0627157f40aec28dec27b22076d0", + "type": "github" + }, + "original": { + "owner": "cachix", + "repo": "git-hooks.nix", + "type": "github" + } + }, + "gitignore": { + "inputs": { + "nixpkgs": [ + "git-hooks", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1762808025, + "owner": "hercules-ci", + "repo": "gitignore.nix", + "rev": "cb5e3fdca1de58ccbc3ef53de65bd372b48f567c", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "gitignore.nix", + "type": "github" + } + }, + "nixpkgs": { + "inputs": { + "nixpkgs-src": "nixpkgs-src" + }, + "locked": { + "lastModified": 1774287239, + "owner": "cachix", + "repo": "devenv-nixpkgs", + "rev": "fa7125ea7f1ae5430010a6e071f68375a39bd24c", + "type": "github" + }, + "original": { + "owner": "cachix", + "ref": "rolling", + "repo": "devenv-nixpkgs", + "type": "github" + } + }, + "nixpkgs-src": { + "flake": false, + "locked": { + "lastModified": 1769922788, + "narHash": "sha256-H3AfG4ObMDTkTJYkd8cz1/RbY9LatN5Mk4UF48VuSXc=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "207d15f1a6603226e1e223dc79ac29c7846da32e", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-unstable": { + "locked": { + "lastModified": 1774386573, + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "46db2e09e1d3f113a13c0d7b81e2f221c63b8ce9", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "devenv": "devenv", + "git-hooks": "git-hooks", + "nixpkgs": "nixpkgs", + "nixpkgs-unstable": "nixpkgs-unstable", + "pre-commit-hooks": [ + "git-hooks" + ] + } + } + }, + "root": "root", + "version": 7 +} diff --git a/devenv.nix b/devenv.nix new file mode 100644 index 0000000..73e6e1d --- /dev/null +++ b/devenv.nix @@ -0,0 +1,90 @@ +{ + pkgs, + lib, + inputs, + ... +}: let + system = pkgs.stdenv.system; + pkgs-unstable = inputs.nixpkgs-unstable.legacyPackages.${system}; +in { + # https://devenv.sh/basics/ + env = { + # Parallel deps compilation + MIX_OS_DEPS_COMPILE_PARTITION_COUNT = 8; + # Enable JS/LV debugging (required?) + NODE_ENV = "development"; + }; + + # https://devenv.sh/packages/ + packages = with pkgs; + [ + git + # linter and formatter for JavaScript, TypeScript, JSX, CSS and GraphQL + prettier + # Nix code formatter + alejandra + # Nostr tooling + pkgs-unstable.nak + pkgs-unstable.algia + (pkgs-unstable.callPackage ./nix/nosdump.nix {}) + ] + ++ + # Linux only + lib.optionals pkgs.stdenv.isLinux [ + # for ExUnit notifier + libnotify + + # for package - file_system + inotify-tools + ]; + + # https://devenv.sh/tests/ + # enterTest = '' + # echo "Running tests" + # git --version | grep "2.42.0" + # ''; + + # https://devenv.sh/languages/ + languages = { + elixir = { + enable = true; + package = pkgs.elixir_1_19; + }; + + javascript = { + enable = true; + package = pkgs.nodejs_24; + npm.enable = true; + }; + }; + + # dotenv.enable = true; + devenv.warnOnNewVersion = false; + + # https://devenv.sh/pre-commit-hooks/ + git-hooks.hooks = { + alejandra.enable = true; + prettier.enable = true; + prettier.files = "\\.(js|ts|tsx|css)$"; + check-added-large-files = { + enable = true; + args = ["--maxkb=131072"]; + }; + mix-format.enable = true; + mix-format.files = "\\.(ex|exs|heex)$"; + }; + + # https://devenv.sh/scripts/ + enterShell = '' + echo + elixir --version + echo -n "Node.js " + node --version + echo + ''; + + # scripts = { + # }; + + # See full reference at https://devenv.sh/reference/options/ +} diff --git a/devenv.yaml b/devenv.yaml new file mode 100644 index 0000000..8910368 --- /dev/null +++ b/devenv.yaml @@ -0,0 +1,17 @@ +# yaml-language-server: $schema=https://devenv.sh/devenv.schema.json +inputs: + nixpkgs: + url: github:cachix/devenv-nixpkgs/rolling + nixpkgs-unstable: + url: github:NixOS/nixpkgs/nixos-unstable + +# If you're using non-OSS software, you can set allowUnfree to true. +# allowUnfree: true + +# If you're willing to use a package that's vulnerable +# permittedInsecurePackages: +# - "openssl-1.1.1w" + +# If you have more than one devenv you can merge them +#imports: +# - ./backend diff --git a/nix/nosdump-no-upgrade.patch b/nix/nosdump-no-upgrade.patch new file mode 100644 index 0000000..6da0851 --- /dev/null +++ b/nix/nosdump-no-upgrade.patch @@ -0,0 +1,30 @@ +--- a/command.ts ++++ b/command.ts +@@ -3,8 +3,6 @@ import { toText as streamToText } from "@std/streams"; + import type { ArgumentValue } from "@cliffy/command"; + import { Command, ValidationError } from "@cliffy/command"; + import { CompletionsCommand } from "@cliffy/command/completions"; +-import { UpgradeCommand } from "@cliffy/command/upgrade"; +-import { JsrProvider } from "@cliffy/command/upgrade/provider/jsr"; + + import type { AllEventsIterOptions, FetchFilter, FetchTimeRangeFilter } from "nostr-fetch"; + import * as nip19 from "nostr-tools/nip19"; +@@ -29,18 +27,6 @@ export const nosdumpCommand = new Command() + .description("A tool to dump events stored in Nostr relays") + .usage("[options...] ") + .command("completions", new CompletionsCommand()) +- .command( +- "upgrade", +- new UpgradeCommand({ +- provider: [ +- new JsrProvider({ +- scope: "jiftechnify", +- package: "@jiftechnify/nosdump", +- }), +- ], +- args: ["--allow-all"], // grant all permissions while upgrading +- }), +- ) + .command("relay-alias", relayAliasCommand).alias("alias") + .command("relay-set", relaySetCommand).alias("rset") + .reset() diff --git a/nix/nosdump.nix b/nix/nosdump.nix new file mode 100644 index 0000000..7bbb248 --- /dev/null +++ b/nix/nosdump.nix @@ -0,0 +1,92 @@ +{ + lib, + stdenv, + fetchFromGitHub, + deno, +}: let + pname = "nosdump"; + version = "0.7.1"; + + src = fetchFromGitHub { + owner = "jiftechnify"; + repo = "nosdump"; + rev = version; + hash = "sha256-sn6KUZWA2Y65Y/f1J718pT/a2BvX1Vr1LMe5RL4KtrM="; + }; + + # Fixed-output derivation: materialise DENO_DIR with all remote deps + # (jsr: + npm:) so the main build runs fully offline. + # + # To obtain the real hash after changing version or deps: + # nix build --impure --expr '(import {}).callPackage ./nix/nosdump.nix {}' + # The error output will contain the correct sha256 to substitute below. + denoCache = stdenv.mkDerivation { + name = "${pname}-${version}-deno-cache"; + inherit src; + + nativeBuildInputs = [deno]; + + outputHash = "sha256-v9hQQvYrnYVTlGud+i67rCZiw7nYq0MvXT8Lb7sSm30="; + outputHashMode = "recursive"; + outputHashAlgo = "sha256"; + + buildPhase = '' + export HOME="$TMPDIR/home" + export DENO_DIR="$out" + mkdir -p "$HOME" "$DENO_DIR" + deno cache --frozen mod.ts + ''; + + dontInstall = true; + }; +in + stdenv.mkDerivation { + inherit pname version src; + + nativeBuildInputs = [deno]; + + patches = [./nosdump-no-upgrade.patch]; + + dontConfigure = true; + + buildPhase = '' + runHook preBuild + + export HOME="$TMPDIR/home" + export DENO_DIR="$TMPDIR/deno-dir" + mkdir -p "$HOME" "$DENO_DIR" + + # DENO_DIR in the Nix store is read-only; Deno needs to write SQLite + # check/v8 caches at runtime, so we copy the pre-fetched cache here. + cp -r ${denoCache}/. "$DENO_DIR/" + chmod -R u+w "$DENO_DIR" + + deno compile \ + --cached-only \ + --frozen \ + --no-check \ + --allow-env \ + --allow-net \ + --allow-read \ + --allow-write \ + --allow-sys \ + --output nosdump \ + mod.ts + + runHook postBuild + ''; + + installPhase = '' + runHook preInstall + install -Dm755 nosdump "$out/bin/nosdump" + runHook postInstall + ''; + + meta = with lib; { + description = "Dump events from Nostr relays"; + homepage = "https://github.com/jiftechnify/nosdump"; + license = licenses.mit; + mainProgram = "nosdump"; + platforms = platforms.linux ++ platforms.darwin; + }; + }