2026-06-16 13:51:51 -06:00
|
|
|
{ pkgs, lib, config, ... }:
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
languages.rust = {
|
|
|
|
|
enable = true;
|
|
|
|
|
channel = "stable"; # edition 2024 needs a recent stable (CLAUDE.md: Rust 1.93+)
|
|
|
|
|
components = [ "rustc" "cargo" "clippy" "rustfmt" "rust-analyzer" "rust-src" ];
|
2026-06-16 17:57:57 -06:00
|
|
|
# wasm32 std for building the WASM plugin fixtures and the vendored BLAKE3
|
|
|
|
|
# module (scripts/build-plugin-hello.sh, scripts/build-wasm.sh). Only needed
|
|
|
|
|
# to *rebuild* those committed artifacts, not for normal server builds/tests.
|
|
|
|
|
targets = [ "wasm32-unknown-unknown" ];
|
2026-06-16 13:51:51 -06:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
# Native build deps + the full justfile toolchain.
|
|
|
|
|
packages = with pkgs; [
|
|
|
|
|
pkg-config
|
|
|
|
|
openssl
|
|
|
|
|
git
|
|
|
|
|
|
|
|
|
|
# task runner + Rust extras
|
|
|
|
|
just
|
|
|
|
|
cargo-audit
|
|
|
|
|
|
2026-06-21 20:03:32 -06:00
|
|
|
# frontend tooling (no root package.json — these are expected as global bins).
|
|
|
|
|
# Pinned to Node 26 to match CI (.github/workflows/ci.yml). Newer Node ships
|
|
|
|
|
# a native global Web Storage API, so a skew here vs CI silently changes
|
|
|
|
|
# jsdom/localStorage behaviour in the Vitest suite.
|
|
|
|
|
nodejs_26
|
2026-06-16 13:51:51 -06:00
|
|
|
biome
|
|
|
|
|
typescript # provides `tsc`
|
|
|
|
|
stylelint
|
|
|
|
|
|
|
|
|
|
# helper scripts (tools/check-icons.py, tools/check-missing-translations.py)
|
|
|
|
|
python3
|
|
|
|
|
|
|
|
|
|
# API/WebDAV functional tests + the DB-readiness probe in tests/common/spawn-db.sh
|
|
|
|
|
hurl
|
|
|
|
|
netcat-gnu # provides `nc`
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
# Dev Postgres on :5432, matching DATABASE_URL in example.env
|
|
|
|
|
# (postgres://postgres:postgres@localhost:5432/oxicloud).
|
|
|
|
|
services.postgres = {
|
|
|
|
|
enable = true;
|
2026-06-21 20:03:32 -06:00
|
|
|
# Pinned to PostgreSQL 18 to match CI (postgres:18-alpine in ci.yml).
|
|
|
|
|
package = pkgs.postgresql_18;
|
2026-06-16 13:51:51 -06:00
|
|
|
listen_addresses = "127.0.0.1";
|
|
|
|
|
port = 5432;
|
|
|
|
|
initialDatabases = [ { name = "oxicloud"; } ];
|
|
|
|
|
# devenv's bootstrap superuser is the OS user with trust auth, so the
|
|
|
|
|
# password is not actually checked — but the `postgres` role must exist
|
|
|
|
|
# for the DATABASE_URL above to connect. Extensions per CLAUDE.md.
|
|
|
|
|
initialScript = ''
|
|
|
|
|
CREATE ROLE postgres SUPERUSER LOGIN PASSWORD 'postgres';
|
|
|
|
|
\connect oxicloud
|
|
|
|
|
CREATE EXTENSION IF NOT EXISTS pg_trgm;
|
|
|
|
|
CREATE EXTENSION IF NOT EXISTS ltree;
|
|
|
|
|
'';
|
|
|
|
|
};
|
|
|
|
|
|
2026-06-16 21:26:36 -06:00
|
|
|
# Keep cargo's build output OUT of the repo. The devenv shell is entered via
|
|
|
|
|
# `use flake "path:$PWD"` (.envrc), and a `path:` flake copies the whole working
|
|
|
|
|
# tree into the Nix store WITHOUT honoring .gitignore — so a multi-GB `target/`
|
|
|
|
|
# makes every direnv evaluation hang "copying … to the store". Redirecting
|
|
|
|
|
# CARGO_TARGET_DIR under $HOME (per-user, so it stays portable) keeps the source
|
|
|
|
|
# tree small. `builtins.getEnv` is fine here: the flake is evaluated --impure.
|
|
|
|
|
env.CARGO_TARGET_DIR = "${builtins.getEnv "HOME"}/.cache/oxicloud/target";
|
|
|
|
|
|
2026-06-16 13:51:51 -06:00
|
|
|
# Load .env (justfile uses `set dotenv-load`); contributor should `cp example.env .env`.
|
|
|
|
|
dotenv.enable = true;
|
|
|
|
|
|
|
|
|
|
enterShell = ''
|
|
|
|
|
echo "OxiCloud dev env — Rust $(rustc --version | cut -d' ' -f2), Node $(node --version), Postgres on :5432"
|
|
|
|
|
'';
|
|
|
|
|
}
|