1import { BasePackageManager } from './BasePackageManager';
2import { findYarnOrNpmWorkspaceRoot, BUN_LOCK_FILE } from '../utils/nodeWorkspaces';
3
4export class BunPackageManager extends BasePackageManager {
5  readonly name = 'bun';
6  readonly bin = 'bun';
7  readonly lockFile = BUN_LOCK_FILE;
8
9  workspaceRoot() {
10    const root = findYarnOrNpmWorkspaceRoot(this.ensureCwdDefined('workspaceRoot'));
11    if (root) {
12      return new BunPackageManager({
13        ...this.options,
14        silent: this.silent,
15        log: this.log,
16        cwd: root,
17      });
18    }
19
20    return null;
21  }
22
23  installAsync(namesOrFlags: string[] = []) {
24    return this.runAsync(['install', ...namesOrFlags]);
25  }
26
27  addAsync(namesOrFlags: string[] = []) {
28    if (!namesOrFlags.length) {
29      return this.installAsync();
30    }
31
32    return this.runAsync(['add', ...namesOrFlags]);
33  }
34
35  addDevAsync(namesOrFlags: string[] = []) {
36    if (!namesOrFlags.length) {
37      return this.installAsync();
38    }
39
40    return this.runAsync(['add', '--dev', ...namesOrFlags]);
41  }
42
43  addGlobalAsync(namesOrFlags: string[] = []) {
44    if (!namesOrFlags.length) {
45      return this.installAsync();
46    }
47
48    return this.runAsync(['add', '--global', ...namesOrFlags]);
49  }
50
51  removeAsync(namesOrFlags: string[]) {
52    return this.runAsync(['remove', ...namesOrFlags]);
53  }
54
55  removeDevAsync(namesOrFlags: string[]) {
56    return this.runAsync(['remove', ...namesOrFlags]);
57  }
58
59  removeGlobalAsync(namesOrFlags: string[]) {
60    return this.runAsync(['remove', '--global', ...namesOrFlags]);
61  }
62}
63