1*8a424bebSJames Ideimport { BasePackageManager } from './BasePackageManager';
28d3f3824SCedric van Puttenimport { findYarnOrNpmWorkspaceRoot, YARN_LOCK_FILE } from '../utils/nodeWorkspaces';
38d3f3824SCedric van Puttenimport { createPendingSpawnAsync } from '../utils/spawn';
48d3f3824SCedric van Puttenimport { isYarnOfflineAsync } from '../utils/yarn';
58d3f3824SCedric van Putten
68d3f3824SCedric van Puttenexport class YarnPackageManager extends BasePackageManager {
78d3f3824SCedric van Putten  readonly name = 'yarn';
88d3f3824SCedric van Putten  readonly bin = 'yarnpkg';
98d3f3824SCedric van Putten  readonly lockFile = YARN_LOCK_FILE;
108d3f3824SCedric van Putten
118d3f3824SCedric van Putten  /** Check if Yarn is running in offline mode, and add the `--offline` flag */
128d3f3824SCedric van Putten  private async withOfflineFlagAsync(namesOrFlags: string[]): Promise<string[]> {
138d3f3824SCedric van Putten    return (await isYarnOfflineAsync()) ? [...namesOrFlags, '--offline'] : namesOrFlags;
148d3f3824SCedric van Putten  }
158d3f3824SCedric van Putten
168d3f3824SCedric van Putten  workspaceRoot() {
178d3f3824SCedric van Putten    const root = findYarnOrNpmWorkspaceRoot(this.ensureCwdDefined('workspaceRoot'));
188d3f3824SCedric van Putten    if (root) {
198d3f3824SCedric van Putten      return new YarnPackageManager({
208d3f3824SCedric van Putten        ...this.options,
218d3f3824SCedric van Putten        silent: this.silent,
228d3f3824SCedric van Putten        log: this.log,
238d3f3824SCedric van Putten        cwd: root,
248d3f3824SCedric van Putten      });
258d3f3824SCedric van Putten    }
268d3f3824SCedric van Putten
278d3f3824SCedric van Putten    return null;
288d3f3824SCedric van Putten  }
298d3f3824SCedric van Putten
308d3f3824SCedric van Putten  installAsync(flags: string[] = []) {
318d3f3824SCedric van Putten    return createPendingSpawnAsync(
328d3f3824SCedric van Putten      () => this.withOfflineFlagAsync(['install']),
338d3f3824SCedric van Putten      (args) => this.runAsync([...args, ...flags])
348d3f3824SCedric van Putten    );
358d3f3824SCedric van Putten  }
368d3f3824SCedric van Putten
378d3f3824SCedric van Putten  addAsync(namesOrFlags: string[] = []) {
388d3f3824SCedric van Putten    if (!namesOrFlags.length) {
398d3f3824SCedric van Putten      return this.installAsync();
408d3f3824SCedric van Putten    }
418d3f3824SCedric van Putten
428d3f3824SCedric van Putten    return createPendingSpawnAsync(
438d3f3824SCedric van Putten      () => this.withOfflineFlagAsync(['add', ...namesOrFlags]),
448d3f3824SCedric van Putten      (args) => this.runAsync(args)
458d3f3824SCedric van Putten    );
468d3f3824SCedric van Putten  }
478d3f3824SCedric van Putten
488d3f3824SCedric van Putten  addDevAsync(namesOrFlags: string[] = []) {
498d3f3824SCedric van Putten    if (!namesOrFlags.length) {
508d3f3824SCedric van Putten      return this.installAsync();
518d3f3824SCedric van Putten    }
528d3f3824SCedric van Putten
538d3f3824SCedric van Putten    return createPendingSpawnAsync(
548d3f3824SCedric van Putten      () => this.withOfflineFlagAsync(['add', '--dev', ...namesOrFlags]),
558d3f3824SCedric van Putten      (args) => this.runAsync(args)
568d3f3824SCedric van Putten    );
578d3f3824SCedric van Putten  }
588d3f3824SCedric van Putten
598d3f3824SCedric van Putten  addGlobalAsync(namesOrFlags: string[] = []) {
608d3f3824SCedric van Putten    if (!namesOrFlags.length) {
618d3f3824SCedric van Putten      return this.installAsync();
628d3f3824SCedric van Putten    }
638d3f3824SCedric van Putten
648d3f3824SCedric van Putten    return createPendingSpawnAsync(
658d3f3824SCedric van Putten      () => this.withOfflineFlagAsync(['global', 'add', ...namesOrFlags]),
668d3f3824SCedric van Putten      (args) => this.runAsync(args)
678d3f3824SCedric van Putten    );
688d3f3824SCedric van Putten  }
698d3f3824SCedric van Putten
708d3f3824SCedric van Putten  removeAsync(namesOrFlags: string[]) {
718d3f3824SCedric van Putten    return this.runAsync(['remove', ...namesOrFlags]);
728d3f3824SCedric van Putten  }
738d3f3824SCedric van Putten
748d3f3824SCedric van Putten  removeDevAsync(namesOrFlags: string[]) {
758d3f3824SCedric van Putten    return this.runAsync(['remove', ...namesOrFlags]);
768d3f3824SCedric van Putten  }
778d3f3824SCedric van Putten
788d3f3824SCedric van Putten  removeGlobalAsync(namesOrFlags: string[]) {
798d3f3824SCedric van Putten    return this.runAsync(['global', 'remove', ...namesOrFlags]);
808d3f3824SCedric van Putten  }
818d3f3824SCedric van Putten}
82