From 5bb8b1a28523a80a0efdbef7a653b18113c37c15 Mon Sep 17 00:00:00 2001 From: Colin McDonnell <3084745+colinhacks@users.noreply.github.com> Date: Tue, 7 Jul 2026 20:29:04 -0700 Subject: [PATCH 1/3] Add nub to recognised package managers Add a NubPackageManager descriptor so projects with a nub.lock lock file are detected as nub-managed. --- .changeset/nub-package-manager.md | 7 +++ packages/workers-utils/src/index.ts | 1 + packages/workers-utils/src/package-manager.ts | 12 ++++- .../tests/package-manager.test.ts | 47 +++++++++++++++++++ 4 files changed, 66 insertions(+), 1 deletion(-) create mode 100644 .changeset/nub-package-manager.md create mode 100644 packages/workers-utils/tests/package-manager.test.ts diff --git a/.changeset/nub-package-manager.md b/.changeset/nub-package-manager.md new file mode 100644 index 0000000000..bccec0bd4f --- /dev/null +++ b/.changeset/nub-package-manager.md @@ -0,0 +1,7 @@ +--- +"@cloudflare/workers-utils": minor +--- + +Add nub to the list of recognised package managers + +nub is a package manager whose lock file is `nub.lock`. Adding a `NubPackageManager` descriptor lets projects managed by nub be detected by their lock file. diff --git a/packages/workers-utils/src/index.ts b/packages/workers-utils/src/index.ts index dccd99c3f4..e62bd93cf6 100644 --- a/packages/workers-utils/src/index.ts +++ b/packages/workers-utils/src/index.ts @@ -150,6 +150,7 @@ export { PnpmPackageManager, YarnPackageManager, BunPackageManager, + NubPackageManager, } from "./package-manager"; export { diff --git a/packages/workers-utils/src/package-manager.ts b/packages/workers-utils/src/package-manager.ts index b924b2c93f..3c58204eae 100644 --- a/packages/workers-utils/src/package-manager.ts +++ b/packages/workers-utils/src/package-manager.ts @@ -4,7 +4,7 @@ */ export interface PackageManager { /** The package manager identifier. */ - type: "npm" | "yarn" | "pnpm" | "bun"; + type: "npm" | "yarn" | "pnpm" | "bun" | "nub"; /** The command used to execute packages (e.g. `npx`, `pnpm`, `bunx`). */ npx: string; /** The command segments used to download and execute packages (e.g. `["npx"]`, `["pnpm", "dlx"]`). */ @@ -52,3 +52,13 @@ export const BunPackageManager = { dlx: ["bunx"], lockFiles: ["bun.lockb", "bun.lock"], } as const satisfies PackageManager; + +/** + * Manage packages using nub. + */ +export const NubPackageManager = { + type: "nub", + npx: "nubx", + dlx: ["nubx"], + lockFiles: ["nub.lock"], +} as const satisfies PackageManager; diff --git a/packages/workers-utils/tests/package-manager.test.ts b/packages/workers-utils/tests/package-manager.test.ts new file mode 100644 index 0000000000..dc3b6e3b03 --- /dev/null +++ b/packages/workers-utils/tests/package-manager.test.ts @@ -0,0 +1,47 @@ +import { existsSync } from "node:fs"; +import { join } from "node:path"; +import { describe, it } from "vitest"; +import { + BunPackageManager, + NpmPackageManager, + NubPackageManager, + PnpmPackageManager, + YarnPackageManager, +} from "../src/package-manager"; +import { runInTempDir, seed } from "../src/test-helpers"; +import type { PackageManager } from "../src/package-manager"; + +const packageManagers: PackageManager[] = [ + NpmPackageManager, + PnpmPackageManager, + YarnPackageManager, + BunPackageManager, + NubPackageManager, +]; + +describe("package managers", () => { + it("describes nub", ({ expect }) => { + expect(NubPackageManager).toEqual({ + type: "nub", + npx: "nubx", + dlx: ["nubx"], + lockFiles: ["nub.lock"], + }); + }); + + describe("lock file detection", () => { + runInTempDir(); + + // Detection is lock-file-based: a project is managed by the package + // manager whose lock file is present, matching how consumers resolve it. + const findByLockFile = (dir: string) => + packageManagers.find((pm) => + pm.lockFiles.some((lockFile) => existsSync(join(dir, lockFile))) + ); + + it("detects nub from nub.lock", async ({ expect }) => { + await seed({ "nub.lock": "" }); + expect(findByLockFile(process.cwd())).toBe(NubPackageManager); + }); + }); +}); From bf68c91a30a6c90d284062abf06e6b1e8e6ca233 Mon Sep 17 00:00:00 2001 From: Colin McDonnell <3084745+colinhacks@users.noreply.github.com> Date: Tue, 7 Jul 2026 21:00:12 -0700 Subject: [PATCH 2/3] Rewrite changeset to describe user-facing impact, not implementation Per REVIEW.md, changesets target users rather than maintainers and should avoid naming internal constructs. Drops the `NubPackageManager` descriptor reference flagged in review. --- .changeset/nub-package-manager.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/nub-package-manager.md b/.changeset/nub-package-manager.md index bccec0bd4f..cf73c51410 100644 --- a/.changeset/nub-package-manager.md +++ b/.changeset/nub-package-manager.md @@ -4,4 +4,4 @@ Add nub to the list of recognised package managers -nub is a package manager whose lock file is `nub.lock`. Adding a `NubPackageManager` descriptor lets projects managed by nub be detected by their lock file. +Projects using nub can now be automatically detected by their `nub.lock` file. From 1e4f3dbe1ade6402ebc82259c5d0be35d3eaa6c8 Mon Sep 17 00:00:00 2001 From: Colin McDonnell <3084745+colinhacks@users.noreply.github.com> Date: Tue, 7 Jul 2026 21:04:00 -0700 Subject: [PATCH 3/3] Reclassify nub-package-manager changeset as patch MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adding one entry to the recognised-package-manager list is additive, same scale as the D1-bindings validation changeset (#14530), not a headline feature on the order of #14474 (cache options for WorkerEntrypoint exports) — patch fits workers-utils' own convention better than minor. --- .changeset/nub-package-manager.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/nub-package-manager.md b/.changeset/nub-package-manager.md index cf73c51410..029815a16a 100644 --- a/.changeset/nub-package-manager.md +++ b/.changeset/nub-package-manager.md @@ -1,5 +1,5 @@ --- -"@cloudflare/workers-utils": minor +"@cloudflare/workers-utils": patch --- Add nub to the list of recognised package managers