feat(devshells): add vtimeline devshell for the VeeamTimelineView project

Sister project at S:\Git\VeeamTimelineView has its own repo and gitea

remote; we keep its Nix env here in the home-fleet flake so the project

itself stays free of Nix.

`nix develop .#vtimeline` provides:

  - nodejs_22 (Node 20 hit EOL 2026-04-30 and was removed from nixpkgs)

  - python3 (Playwright webServer)

  - chromium (used via PLAYWRIGHT_BROWSERS_PATH symlink farm, since

    Playwright 1.40+ hard-codes a separate chrome-headless-shell path)

Shell banner points at ../VeeamTimelineView. The absolute project path

cannot be baked into the shellHook (Nix forbids escaping the flake source

dir at eval time); user is expected to `cd` themselves.
This commit is contained in:
oqyude
2026-10-10 15:10:37 +03:00
parent 16644fcc0b
commit 0e622eaa13
+77
View File
@@ -0,0 +1,77 @@
# Per-project devshells. Each entry here is a self-contained mkShell that
# can be entered with `nix develop .#<name>`.
#
# Why this lives in the nixos flake:
# vtimeline is a sibling project under /s/Git/VeeamTimelineView (not part
# of the NixOS configs). Keeping its devshell here avoids polluting the
# project itself with a flake, while still letting us `nix develop` into
# the same node/python/chromium toolchain that NixOS uses.
{ inputs, ... }@_flakeContext:
let
system = "x86_64-linux";
pkgs = import inputs.nixpkgs {
inherit system;
config = { allowUnfree = true; };
};
in
{
devShells.${system} = {
# `nix develop .#vtimeline` -> shell for testing the VeeamTimelineView
# project (Playwright + ESLint + Prettier over a vanilla-JS frontend).
vtimeline = pkgs.mkShell {
name = "vtimeline-devshell";
buildInputs = with pkgs; [
# nodejs_20 was removed from nixpkgs on 2026-07-13 after Node.js 20
# reached upstream EOL on 2026-04-30. nodejs_22 is the current LTS.
# VeeamTimelineView's package.json does not pin a Node version, so
# this is transparent to npm.
nodejs_22
python3
chromium
];
# `nodePackages.*` deliberately not added — they would pollute the
# shell globally. Anything npm-side goes through `npm install` in the
# project's own node_modules.
shellHook = ''
# Skip Playwright's own browser download — we use the system one.
export PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1
# Direct executable-path override (honoured by older Playwright and
# the `channel: "chromium"` code path).
export PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH=${pkgs.chromium}/bin/chromium
# Playwright 1.40+ uses a separate "chrome-headless-shell" binary
# in headless mode and looks for it under a hard-coded path
# ($PLAYWRIGHT_BROWSERS_PATH/chromium_headless_shell-<rev>/...).
# We satisfy that lookup by symlinking the nixpkgs chromium into a
# fake registry directory.
export NIX_CHROMIUM=${pkgs.chromium}/bin/chromium
export PLAYWRIGHT_BROWSERS_PATH=$HOME/.cache/vtimeline-pw-browsers
mkdir -p "$PLAYWRIGHT_BROWSERS_PATH"
link_bin() {
local d="$PLAYWRIGHT_BROWSERS_PATH/$1"
mkdir -p "$d"
ln -sfn "$NIX_CHROMIUM" "$d/chrome-headless-shell"
ln -sfn "$NIX_CHROMIUM" "$d/chrome"
}
# Layouts derived from Playwright's EXECUTABLE_PATHS table for
# the chromium + chromium-headless-shell entries (linux-x64).
link_bin "chromium-1248/chrome-linux"
link_bin "chromium_headless_shell-1248/chrome-headless-shell-linux64"
# Convenience banner. The VeeamTimelineView project lives next to
# this flake repo (../VeeamTimelineView from the nixos checkout,
# i.e. S:\\Git\\VeeamTimelineView on Windows). We don't bake the
# path into the shellHook because Nix forbids escaping the flake
# source dir at eval time — print a hint and let the user `cd`.
echo "[vtimeline-devshell] node: $(command -v node)"
echo "[vtimeline-devshell] python: $(command -v python3)"
echo "[vtimeline-devshell] chrome: $NIX_CHROMIUM"
echo "[vtimeline-devshell] run: cd ../VeeamTimelineView && npm install && npm test"
'';
};
};
}