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