diff --git a/.gitignore b/.gitignore index 826994d33c..f344e035ec 100644 --- a/.gitignore +++ b/.gitignore @@ -99,6 +99,11 @@ ecc2/target/ # Generated lock files in tool subdirectories .opencode/package-lock.json .opencode/node_modules/ + +# yarn is the canonical package manager for this repo (see package.json +# "packageManager"); ignore stray lockfiles from running another manager locally +/bun.lock +/bun.lockb assets/images/security/badrudi-exploit.mp4 .aider* diff --git a/scripts/lib/package-manager.js b/scripts/lib/package-manager.js index 5f9b497fd5..def3870b01 100644 --- a/scripts/lib/package-manager.js +++ b/scripts/lib/package-manager.js @@ -43,7 +43,10 @@ const PACKAGE_MANAGERS = { }, bun: { name: 'bun', - lockFile: 'bun.lockb', + lockFile: 'bun.lock', + // Bun switched its default lockfile from the binary bun.lockb to the + // text-based bun.lock. Keep recognizing the legacy file too. + lockFileAliases: ['bun.lockb'], installCmd: 'bun install', runCmd: 'bun run', execCmd: 'bunx', @@ -92,9 +95,9 @@ function saveConfig(config) { function detectFromLockFile(projectDir = process.cwd()) { for (const pmName of DETECTION_PRIORITY) { const pm = PACKAGE_MANAGERS[pmName]; - const lockFilePath = path.join(projectDir, pm.lockFile); + const lockFileNames = [pm.lockFile, ...(pm.lockFileAliases || [])]; - if (fs.existsSync(lockFilePath)) { + if (lockFileNames.some(lockFileName => fs.existsSync(path.join(projectDir, lockFileName)))) { return pmName; } } diff --git a/tests/lib/package-manager.test.js b/tests/lib/package-manager.test.js index ebe5922e4a..0a00caabdd 100644 --- a/tests/lib/package-manager.test.js +++ b/tests/lib/package-manager.test.js @@ -131,7 +131,7 @@ function runTests() { })) passed++; else failed++; - if (test('detects bun from bun.lockb', () => { + if (test('detects bun from bun.lockb (legacy binary lockfile)', () => { const testDir = createTestDir(); try { fs.writeFileSync(path.join(testDir, 'bun.lockb'), ''); @@ -143,6 +143,18 @@ function runTests() { })) passed++; else failed++; + if (test('detects bun from bun.lock (modern text lockfile)', () => { + const testDir = createTestDir(); + try { + fs.writeFileSync(path.join(testDir, 'bun.lock'), ''); + const result = pm.detectFromLockFile(testDir); + assert.strictEqual(result, 'bun'); + } finally { + cleanupTestDir(testDir); + } + })) passed++; + else failed++; + if (test('returns null when no lock file exists', () => { const testDir = createTestDir(); try {