From ddbf1ffecbb149442bf73e6c2db8671090bc6771 Mon Sep 17 00:00:00 2001 From: can1357 Date: Thu, 13 Aug 2026 07:18:17 +0200 Subject: [PATCH] feat: fell back to pinned bunx package for bun2nix generation - Added a fallback to the pinned bunx package when generating Nix bun dependencies without an active Nix environment. - Updated generator resolution logic and corresponding tests. --- README.md | 2 +- scripts/gen-nix-bun.test.ts | 11 ++++++----- scripts/gen-nix-bun.ts | 20 +++++++++++++++----- 3 files changed, 22 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 2f4b8ac4e..1ffb9a58b 100644 --- a/README.md +++ b/README.md @@ -620,7 +620,7 @@ Build and smoke-test the distributable Nix package with `nix build .#omp`. Wayla bun run gen:nix ``` -The command uses `bun2nix` from `nix develop` when available, otherwise enters the development shell through Nix. Do not edit `nix/bun.nix` manually. +The command uses `bun2nix` from `nix develop` when available, otherwise enters the development shell through Nix, then falls back to the pinned `bunx bun2nix@2.1.2`. Do not edit `nix/bun.nix` manually. For a non-interactive smoke check: diff --git a/scripts/gen-nix-bun.test.ts b/scripts/gen-nix-bun.test.ts index 2cf1c36a9..359a5d0bd 100644 --- a/scripts/gen-nix-bun.test.ts +++ b/scripts/gen-nix-bun.test.ts @@ -1,5 +1,5 @@ import { describe, expect, test } from "bun:test"; -import { resolveNixBunDepsGenerator } from "./gen-nix-bun"; +import { BUN2NIX_NPM_SPEC, resolveNixBunDepsGenerator } from "./gen-nix-bun"; describe("resolveNixBunDepsGenerator", () => { test("prefers bun2nix from the active development shell", () => { @@ -17,9 +17,10 @@ describe("resolveNixBunDepsGenerator", () => { expect(generator).toEqual({ kind: "nix", executable: "/usr/bin/nix" }); }); - test("fails before a release mutates files when no generator is available", () => { - expect(() => resolveNixBunDepsGenerator(() => null)).toThrow( - "Generating nix/bun.nix requires bun2nix from `nix develop`, or Nix to enter that shell.", - ); + test("falls back to the pinned portable bunx package", () => { + expect(resolveNixBunDepsGenerator(() => null)).toEqual({ + kind: "bunx", + package: BUN2NIX_NPM_SPEC, + }); }); }); diff --git a/scripts/gen-nix-bun.ts b/scripts/gen-nix-bun.ts index 32e68eacd..3760ef924 100755 --- a/scripts/gen-nix-bun.ts +++ b/scripts/gen-nix-bun.ts @@ -6,10 +6,16 @@ import { $which } from "../packages/utils/src/which"; const repoRoot = path.join(import.meta.dir, ".."); +/** Pinned npm package matching flake.lock's bun2nix revision (`0f2a1f…`). */ +export const BUN2NIX_NPM_SPEC = "bun2nix@2.1.2"; + type FindExecutable = (command: string) => string | null; /** The executable path and invocation mode for the pinned Bun dependency generator. */ -export type NixBunDepsGenerator = { kind: "bun2nix"; executable: string } | { kind: "nix"; executable: string }; +export type NixBunDepsGenerator = + | { kind: "bun2nix"; executable: string } + | { kind: "nix"; executable: string } + | { kind: "bunx"; package: typeof BUN2NIX_NPM_SPEC }; /** Resolve the generator needed by releases before they mutate repository state. */ export function resolveNixBunDepsGenerator(findExecutable: FindExecutable = $which): NixBunDepsGenerator { @@ -19,7 +25,7 @@ export function resolveNixBunDepsGenerator(findExecutable: FindExecutable = $whi const nix = findExecutable("nix"); if (nix) return { kind: "nix", executable: nix }; - throw new Error("Generating nix/bun.nix requires bun2nix from `nix develop`, or Nix to enter that shell."); + return { kind: "bunx", package: BUN2NIX_NPM_SPEC }; } /** Regenerate the checked-in Bun dependency expression with the pinned bun2nix input. */ @@ -28,10 +34,14 @@ export async function generateNixBunDeps(generator: NixBunDepsGenerator = resolv await $`${generator.executable} -l bun.lock -c ../ -o nix/bun.nix`.cwd(repoRoot); return; } + if (generator.kind === "nix") { + await $`${generator.executable} --extra-experimental-features ${"nix-command flakes"} --accept-flake-config develop --command bun2nix -l bun.lock -c ../ -o nix/bun.nix`.cwd( + repoRoot, + ); + return; + } - await $`${generator.executable} --extra-experimental-features ${"nix-command flakes"} --accept-flake-config develop --command bun2nix -l bun.lock -c ../ -o nix/bun.nix`.cwd( - repoRoot, - ); + await $`bunx ${generator.package} -l bun.lock -c ../ -o nix/bun.nix`.cwd(repoRoot); } if (import.meta.main) await generateNixBunDeps();