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