18d3f3824SCedric van Puttenimport spawnAsync from '@expo/spawn-async'; 28d3f3824SCedric van Puttenimport { vol } from 'memfs'; 38d3f3824SCedric van Puttenimport path from 'path'; 48d3f3824SCedric van Putten 58d3f3824SCedric van Puttenimport { mockSpawnPromise, mockedSpawnAsync } from '../../__tests__/spawn-utils'; 68d3f3824SCedric van Puttenimport { PNPM_WORKSPACE_FILE } from '../../utils/nodeWorkspaces'; 78d3f3824SCedric van Puttenimport { PnpmPackageManager } from '../PnpmPackageManager'; 88d3f3824SCedric van Putten 98d3f3824SCedric van Puttenjest.mock('@expo/spawn-async'); 108d3f3824SCedric van Puttenjest.mock('fs'); 118d3f3824SCedric van Putten 128d3f3824SCedric van Puttenconst originalCI = process.env.CI; 138d3f3824SCedric van Putten 148d3f3824SCedric van PuttenbeforeAll(() => { 158d3f3824SCedric van Putten // Disable logging to clean up test ouput 168d3f3824SCedric van Putten jest.spyOn(console, 'log').mockImplementation(); 178d3f3824SCedric van Putten}); 188d3f3824SCedric van Putten 198d3f3824SCedric van PuttenbeforeEach(() => { 208d3f3824SCedric van Putten // Pnpm changes behavior based on `CI=true`. 218d3f3824SCedric van Putten // Disable this behavior by default, to make these tests pass on CI. 228d3f3824SCedric van Putten // Some tests test this behavior and may override this value. 238d3f3824SCedric van Putten delete process.env.CI; 248d3f3824SCedric van Putten}); 258d3f3824SCedric van Putten 268d3f3824SCedric van PuttenafterEach(() => { 278d3f3824SCedric van Putten process.env.CI = originalCI; 288d3f3824SCedric van Putten}); 298d3f3824SCedric van Putten 308d3f3824SCedric van Puttendescribe('PnpmPackageManager', () => { 318d3f3824SCedric van Putten const projectRoot = '/project/with-pnpm'; 328d3f3824SCedric van Putten 338d3f3824SCedric van Putten it('name is set to pnpm', () => { 348d3f3824SCedric van Putten const pnpm = new PnpmPackageManager({ cwd: projectRoot }); 358d3f3824SCedric van Putten expect(pnpm.name).toBe('pnpm'); 368d3f3824SCedric van Putten }); 378d3f3824SCedric van Putten 388d3f3824SCedric van Putten describe('getDefaultEnvironment', () => { 398d3f3824SCedric van Putten it('runs npm with ADBLOCK=1 and DISABLE_OPENCOLLECTIVE=1', async () => { 408d3f3824SCedric van Putten const pnpm = new PnpmPackageManager({ cwd: projectRoot }); 418d3f3824SCedric van Putten await pnpm.installAsync(); 428d3f3824SCedric van Putten 438d3f3824SCedric van Putten expect(spawnAsync).toBeCalledWith( 448d3f3824SCedric van Putten expect.anything(), 458d3f3824SCedric van Putten expect.anything(), 468d3f3824SCedric van Putten expect.objectContaining({ 478d3f3824SCedric van Putten env: expect.objectContaining({ ADBLOCK: '1', DISABLE_OPENCOLLECTIVE: '1' }), 488d3f3824SCedric van Putten }) 498d3f3824SCedric van Putten ); 508d3f3824SCedric van Putten }); 518d3f3824SCedric van Putten 528d3f3824SCedric van Putten it('runs with overwritten default environment', async () => { 538d3f3824SCedric van Putten const pnpm = new PnpmPackageManager({ cwd: projectRoot, env: { ADBLOCK: '0' } }); 548d3f3824SCedric van Putten await pnpm.installAsync(); 558d3f3824SCedric van Putten 568d3f3824SCedric van Putten expect(spawnAsync).toBeCalledWith( 578d3f3824SCedric van Putten expect.anything(), 588d3f3824SCedric van Putten expect.anything(), 598d3f3824SCedric van Putten expect.objectContaining({ 608d3f3824SCedric van Putten env: { ADBLOCK: '0', DISABLE_OPENCOLLECTIVE: '1' }, 618d3f3824SCedric van Putten }) 628d3f3824SCedric van Putten ); 638d3f3824SCedric van Putten }); 648d3f3824SCedric van Putten }); 658d3f3824SCedric van Putten 668d3f3824SCedric van Putten describe('runAsync', () => { 678d3f3824SCedric van Putten it('logs executed command', async () => { 688d3f3824SCedric van Putten const log = jest.fn(); 698d3f3824SCedric van Putten const pnpm = new PnpmPackageManager({ cwd: projectRoot, log }); 708d3f3824SCedric van Putten await pnpm.runAsync(['install', '--some-flag']); 718d3f3824SCedric van Putten expect(log).toHaveBeenCalledWith('> pnpm install --some-flag'); 728d3f3824SCedric van Putten }); 738d3f3824SCedric van Putten 74*efdcf92fSCedric van Putten it('inherits stdio output without silent', async () => { 758d3f3824SCedric van Putten const pnpm = new PnpmPackageManager({ cwd: projectRoot }); 76*efdcf92fSCedric van Putten await pnpm.runAsync(['install']); 778d3f3824SCedric van Putten 78*efdcf92fSCedric van Putten expect(spawnAsync).toBeCalledWith( 79*efdcf92fSCedric van Putten expect.anything(), 80*efdcf92fSCedric van Putten expect.anything(), 81*efdcf92fSCedric van Putten expect.objectContaining({ stdio: 'inherit' }) 828d3f3824SCedric van Putten ); 838d3f3824SCedric van Putten }); 848d3f3824SCedric van Putten 85*efdcf92fSCedric van Putten it('does not inherit stdio with silent', async () => { 868d3f3824SCedric van Putten const pnpm = new PnpmPackageManager({ cwd: projectRoot, silent: true }); 87*efdcf92fSCedric van Putten await pnpm.runAsync(['install']); 888d3f3824SCedric van Putten 89*efdcf92fSCedric van Putten expect(spawnAsync).toBeCalledWith( 90*efdcf92fSCedric van Putten expect.anything(), 91*efdcf92fSCedric van Putten expect.anything(), 92*efdcf92fSCedric van Putten expect.objectContaining({ stdio: undefined }) 938d3f3824SCedric van Putten ); 948d3f3824SCedric van Putten }); 958d3f3824SCedric van Putten 968d3f3824SCedric van Putten it('adds a single package with custom parameters', async () => { 978d3f3824SCedric van Putten const pnpm = new PnpmPackageManager({ cwd: projectRoot }); 988d3f3824SCedric van Putten await pnpm.runAsync(['add', '--save-peer', '@babel/core']); 998d3f3824SCedric van Putten 1008d3f3824SCedric van Putten expect(spawnAsync).toBeCalledWith( 1018d3f3824SCedric van Putten 'pnpm', 1028d3f3824SCedric van Putten ['add', '--save-peer', '@babel/core'], 1038d3f3824SCedric van Putten expect.objectContaining({ cwd: projectRoot }) 1048d3f3824SCedric van Putten ); 1058d3f3824SCedric van Putten }); 1068d3f3824SCedric van Putten 1078d3f3824SCedric van Putten it('adds multiple packages with custom parameters', async () => { 1088d3f3824SCedric van Putten const pnpm = new PnpmPackageManager({ cwd: projectRoot }); 1098d3f3824SCedric van Putten await pnpm.runAsync(['add', '--save-peer', '@babel/core', '@babel/runtime']); 1108d3f3824SCedric van Putten 1118d3f3824SCedric van Putten expect(spawnAsync).toBeCalledWith( 1128d3f3824SCedric van Putten 'pnpm', 1138d3f3824SCedric van Putten ['add', '--save-peer', '@babel/core', '@babel/runtime'], 1148d3f3824SCedric van Putten expect.objectContaining({ cwd: projectRoot }) 1158d3f3824SCedric van Putten ); 1168d3f3824SCedric van Putten }); 1178d3f3824SCedric van Putten }); 1188d3f3824SCedric van Putten 1198d3f3824SCedric van Putten describe('versionAsync', () => { 1208d3f3824SCedric van Putten it('returns version from pnpm', async () => { 1218d3f3824SCedric van Putten mockedSpawnAsync.mockImplementation(() => 1228d3f3824SCedric van Putten mockSpawnPromise(Promise.resolve({ stdout: '7.0.0\n' })) 1238d3f3824SCedric van Putten ); 1248d3f3824SCedric van Putten 1258d3f3824SCedric van Putten const pnpm = new PnpmPackageManager({ cwd: projectRoot }); 1268d3f3824SCedric van Putten 1278d3f3824SCedric van Putten expect(await pnpm.versionAsync()).toBe('7.0.0'); 1288d3f3824SCedric van Putten expect(spawnAsync).toBeCalledWith('pnpm', ['--version'], expect.anything()); 1298d3f3824SCedric van Putten }); 1308d3f3824SCedric van Putten }); 1318d3f3824SCedric van Putten 1328d3f3824SCedric van Putten describe('getConfigAsync', () => { 1338d3f3824SCedric van Putten it('returns a configuration key from pnpm', async () => { 1348d3f3824SCedric van Putten mockedSpawnAsync.mockImplementation(() => 1358d3f3824SCedric van Putten mockSpawnPromise(Promise.resolve({ stdout: 'https://custom.registry.org/\n' })) 1368d3f3824SCedric van Putten ); 1378d3f3824SCedric van Putten 1388d3f3824SCedric van Putten const pnpm = new PnpmPackageManager({ cwd: projectRoot }); 1398d3f3824SCedric van Putten 1408d3f3824SCedric van Putten expect(await pnpm.getConfigAsync('registry')).toBe('https://custom.registry.org/'); 1418d3f3824SCedric van Putten expect(spawnAsync).toBeCalledWith('pnpm', ['config', 'get', 'registry'], expect.anything()); 1428d3f3824SCedric van Putten }); 1438d3f3824SCedric van Putten }); 1448d3f3824SCedric van Putten 1458d3f3824SCedric van Putten describe('installAsync', () => { 1468d3f3824SCedric van Putten it('runs normal installation', async () => { 1478d3f3824SCedric van Putten const pnpm = new PnpmPackageManager({ cwd: projectRoot }); 1488d3f3824SCedric van Putten await pnpm.installAsync(); 1498d3f3824SCedric van Putten 1508d3f3824SCedric van Putten expect(spawnAsync).toBeCalledWith( 1518d3f3824SCedric van Putten 'pnpm', 1528d3f3824SCedric van Putten ['install'], 1538d3f3824SCedric van Putten expect.objectContaining({ cwd: projectRoot }) 1548d3f3824SCedric van Putten ); 1558d3f3824SCedric van Putten }); 1568d3f3824SCedric van Putten 1578d3f3824SCedric van Putten it('runs installation with flags', async () => { 1588d3f3824SCedric van Putten const pnpm = new PnpmPackageManager({ cwd: projectRoot }); 1598d3f3824SCedric van Putten await pnpm.installAsync(['--ignore-scripts']); 1608d3f3824SCedric van Putten 1618d3f3824SCedric van Putten expect(spawnAsync).toBeCalledWith( 1628d3f3824SCedric van Putten 'pnpm', 1638d3f3824SCedric van Putten ['install', '--ignore-scripts'], 1648d3f3824SCedric van Putten expect.objectContaining({ cwd: projectRoot }) 1658d3f3824SCedric van Putten ); 1668d3f3824SCedric van Putten }); 1678d3f3824SCedric van Putten 1688d3f3824SCedric van Putten describe('frozen lockfile', () => { 1698d3f3824SCedric van Putten it('does not add --no-frozen-lockfile when not in CI', async () => { 1708d3f3824SCedric van Putten const pnpm = new PnpmPackageManager({ cwd: projectRoot }); 1718d3f3824SCedric van Putten await pnpm.installAsync(); 1728d3f3824SCedric van Putten 1738d3f3824SCedric van Putten expect(spawnAsync).toBeCalledWith( 1748d3f3824SCedric van Putten 'pnpm', 1758d3f3824SCedric van Putten ['install'], 1768d3f3824SCedric van Putten expect.objectContaining({ cwd: projectRoot }) 1778d3f3824SCedric van Putten ); 1788d3f3824SCedric van Putten }); 1798d3f3824SCedric van Putten 1808d3f3824SCedric van Putten it('adds --no-frozen-lockfile when in CI', async () => { 1818d3f3824SCedric van Putten process.env.CI = 'true'; 1828d3f3824SCedric van Putten 1838d3f3824SCedric van Putten const pnpm = new PnpmPackageManager({ cwd: projectRoot }); 1848d3f3824SCedric van Putten await pnpm.installAsync(); 1858d3f3824SCedric van Putten 1868d3f3824SCedric van Putten expect(spawnAsync).toBeCalledWith( 1878d3f3824SCedric van Putten 'pnpm', 1888d3f3824SCedric van Putten ['install', '--no-frozen-lockfile'], 1898d3f3824SCedric van Putten expect.objectContaining({ cwd: projectRoot }) 1908d3f3824SCedric van Putten ); 1918d3f3824SCedric van Putten }); 1928d3f3824SCedric van Putten 1938d3f3824SCedric van Putten it('does not add --no-frozen-lockfile if passed as flag in CI', async () => { 1948d3f3824SCedric van Putten process.env.CI = 'true'; 1958d3f3824SCedric van Putten 1968d3f3824SCedric van Putten const pnpm = new PnpmPackageManager({ cwd: projectRoot }); 1978d3f3824SCedric van Putten await pnpm.installAsync(['--frozen-lockfile']); 1988d3f3824SCedric van Putten 1998d3f3824SCedric van Putten expect(spawnAsync).toBeCalledWith( 2008d3f3824SCedric van Putten 'pnpm', 2018d3f3824SCedric van Putten ['install', '--frozen-lockfile'], 2028d3f3824SCedric van Putten expect.objectContaining({ cwd: projectRoot }) 2038d3f3824SCedric van Putten ); 2048d3f3824SCedric van Putten }); 2058d3f3824SCedric van Putten }); 2068d3f3824SCedric van Putten }); 2078d3f3824SCedric van Putten 2088d3f3824SCedric van Putten describe('uninstallAsync', () => { 2098d3f3824SCedric van Putten afterEach(() => vol.reset()); 2108d3f3824SCedric van Putten 2118d3f3824SCedric van Putten it('removes node_modules folder relative to cwd', async () => { 2128d3f3824SCedric van Putten vol.fromJSON( 2138d3f3824SCedric van Putten { 2148d3f3824SCedric van Putten 'package.json': '{}', 2158d3f3824SCedric van Putten 'node_modules/expo/package.json': '{}', 2168d3f3824SCedric van Putten }, 2178d3f3824SCedric van Putten projectRoot 2188d3f3824SCedric van Putten ); 2198d3f3824SCedric van Putten 2208d3f3824SCedric van Putten const pnpm = new PnpmPackageManager({ cwd: projectRoot }); 2218d3f3824SCedric van Putten await pnpm.uninstallAsync(); 2228d3f3824SCedric van Putten 2238d3f3824SCedric van Putten expect(vol.existsSync(path.join(projectRoot, 'node_modules'))).toBe(false); 2248d3f3824SCedric van Putten }); 2258d3f3824SCedric van Putten 2268d3f3824SCedric van Putten it('skips removing non-existing node_modules folder', async () => { 2278d3f3824SCedric van Putten vol.fromJSON({ 'package.json': '{}' }, projectRoot); 2288d3f3824SCedric van Putten 2298d3f3824SCedric van Putten const pnpm = new PnpmPackageManager({ cwd: projectRoot }); 2308d3f3824SCedric van Putten await pnpm.uninstallAsync(); 2318d3f3824SCedric van Putten 2328d3f3824SCedric van Putten expect(vol.existsSync(path.join(projectRoot, 'node_modules'))).toBe(false); 2338d3f3824SCedric van Putten }); 2348d3f3824SCedric van Putten 2358d3f3824SCedric van Putten it('fails when no cwd is provided', async () => { 2368d3f3824SCedric van Putten const pnpm = new PnpmPackageManager({ cwd: undefined }); 2378d3f3824SCedric van Putten await expect(pnpm.uninstallAsync()).rejects.toThrow('cwd is required'); 2388d3f3824SCedric van Putten }); 2398d3f3824SCedric van Putten }); 2408d3f3824SCedric van Putten 2418d3f3824SCedric van Putten describe('addAsync', () => { 2428d3f3824SCedric van Putten it('installs project without packages', async () => { 2438d3f3824SCedric van Putten const pnpm = new PnpmPackageManager({ cwd: projectRoot }); 2448d3f3824SCedric van Putten await pnpm.addAsync(); 2458d3f3824SCedric van Putten 2468d3f3824SCedric van Putten expect(spawnAsync).toBeCalledWith( 2478d3f3824SCedric van Putten 'pnpm', 2488d3f3824SCedric van Putten ['install'], 2498d3f3824SCedric van Putten expect.objectContaining({ cwd: projectRoot }) 2508d3f3824SCedric van Putten ); 2518d3f3824SCedric van Putten }); 2528d3f3824SCedric van Putten 2538d3f3824SCedric van Putten it('adds a single package to dependencies', async () => { 2548d3f3824SCedric van Putten const pnpm = new PnpmPackageManager({ cwd: projectRoot }); 2558d3f3824SCedric van Putten await pnpm.addAsync(['@react-navigation/native']); 2568d3f3824SCedric van Putten 2578d3f3824SCedric van Putten expect(spawnAsync).toBeCalledWith( 2588d3f3824SCedric van Putten 'pnpm', 2598d3f3824SCedric van Putten ['add', '@react-navigation/native'], 2608d3f3824SCedric van Putten expect.objectContaining({ cwd: projectRoot }) 2618d3f3824SCedric van Putten ); 2628d3f3824SCedric van Putten }); 2638d3f3824SCedric van Putten 2648d3f3824SCedric van Putten it('adds multiple packages to dependencies', async () => { 2658d3f3824SCedric van Putten const pnpm = new PnpmPackageManager({ cwd: projectRoot }); 2668d3f3824SCedric van Putten await pnpm.addAsync(['@react-navigation/native', '@react-navigation/drawer']); 2678d3f3824SCedric van Putten 2688d3f3824SCedric van Putten expect(spawnAsync).toBeCalledWith( 2698d3f3824SCedric van Putten 'pnpm', 2708d3f3824SCedric van Putten ['add', '@react-navigation/native', '@react-navigation/drawer'], 2718d3f3824SCedric van Putten expect.objectContaining({ cwd: projectRoot }) 2728d3f3824SCedric van Putten ); 2738d3f3824SCedric van Putten }); 2748d3f3824SCedric van Putten }); 2758d3f3824SCedric van Putten 2768d3f3824SCedric van Putten describe('addDevAsync', () => { 2778d3f3824SCedric van Putten it('installs project without packages', async () => { 2788d3f3824SCedric van Putten const pnpm = new PnpmPackageManager({ cwd: projectRoot }); 2798d3f3824SCedric van Putten await pnpm.addDevAsync(); 2808d3f3824SCedric van Putten 2818d3f3824SCedric van Putten expect(spawnAsync).toBeCalledWith( 2828d3f3824SCedric van Putten 'pnpm', 2838d3f3824SCedric van Putten ['install'], 2848d3f3824SCedric van Putten expect.objectContaining({ cwd: projectRoot }) 2858d3f3824SCedric van Putten ); 2868d3f3824SCedric van Putten }); 2878d3f3824SCedric van Putten 2888d3f3824SCedric van Putten it('adds a single package to dev dependencies', async () => { 2898d3f3824SCedric van Putten const pnpm = new PnpmPackageManager({ cwd: projectRoot }); 2908d3f3824SCedric van Putten await pnpm.addDevAsync(['eslint']); 2918d3f3824SCedric van Putten 2928d3f3824SCedric van Putten expect(spawnAsync).toBeCalledWith( 2938d3f3824SCedric van Putten 'pnpm', 2948d3f3824SCedric van Putten ['add', '--save-dev', 'eslint'], 2958d3f3824SCedric van Putten expect.objectContaining({ cwd: projectRoot }) 2968d3f3824SCedric van Putten ); 2978d3f3824SCedric van Putten }); 2988d3f3824SCedric van Putten 2998d3f3824SCedric van Putten it('adds multiple packages to dev dependencies', async () => { 3008d3f3824SCedric van Putten const pnpm = new PnpmPackageManager({ cwd: projectRoot }); 3018d3f3824SCedric van Putten await pnpm.addDevAsync(['eslint', 'prettier']); 3028d3f3824SCedric van Putten 3038d3f3824SCedric van Putten expect(spawnAsync).toBeCalledWith( 3048d3f3824SCedric van Putten 'pnpm', 3058d3f3824SCedric van Putten ['add', '--save-dev', 'eslint', 'prettier'], 3068d3f3824SCedric van Putten expect.objectContaining({ cwd: projectRoot }) 3078d3f3824SCedric van Putten ); 3088d3f3824SCedric van Putten }); 3098d3f3824SCedric van Putten }); 3108d3f3824SCedric van Putten 3118d3f3824SCedric van Putten describe('addGlobalAsync', () => { 3128d3f3824SCedric van Putten it('installs project without packages', async () => { 3138d3f3824SCedric van Putten const pnpm = new PnpmPackageManager({ cwd: projectRoot }); 3148d3f3824SCedric van Putten await pnpm.addGlobalAsync(); 3158d3f3824SCedric van Putten 3168d3f3824SCedric van Putten expect(spawnAsync).toBeCalledWith( 3178d3f3824SCedric van Putten 'pnpm', 3188d3f3824SCedric van Putten ['install'], 3198d3f3824SCedric van Putten expect.objectContaining({ cwd: projectRoot }) 3208d3f3824SCedric van Putten ); 3218d3f3824SCedric van Putten }); 3228d3f3824SCedric van Putten 3238d3f3824SCedric van Putten it('adds a single package globally', async () => { 3248d3f3824SCedric van Putten const pnpm = new PnpmPackageManager({ cwd: projectRoot }); 3258d3f3824SCedric van Putten await pnpm.addGlobalAsync(['expo-cli@^5']); 3268d3f3824SCedric van Putten 3278d3f3824SCedric van Putten expect(spawnAsync).toBeCalledWith( 3288d3f3824SCedric van Putten 'pnpm', 3298d3f3824SCedric van Putten ['add', '--global', 'expo-cli@^5'], 3308d3f3824SCedric van Putten expect.anything() 3318d3f3824SCedric van Putten ); 3328d3f3824SCedric van Putten }); 3338d3f3824SCedric van Putten 3348d3f3824SCedric van Putten it('adds multiple packages globally', async () => { 3358d3f3824SCedric van Putten const pnpm = new PnpmPackageManager({ cwd: projectRoot }); 3368d3f3824SCedric van Putten await pnpm.addGlobalAsync(['expo-cli@^5', 'eas-cli']); 3378d3f3824SCedric van Putten 3388d3f3824SCedric van Putten expect(spawnAsync).toBeCalledWith( 3398d3f3824SCedric van Putten 'pnpm', 3408d3f3824SCedric van Putten ['add', '--global', 'expo-cli@^5', 'eas-cli'], 3418d3f3824SCedric van Putten expect.anything() 3428d3f3824SCedric van Putten ); 3438d3f3824SCedric van Putten }); 3448d3f3824SCedric van Putten }); 3458d3f3824SCedric van Putten 3468d3f3824SCedric van Putten describe('removeAsync', () => { 3478d3f3824SCedric van Putten it('removes a single package', async () => { 3488d3f3824SCedric van Putten const pnpm = new PnpmPackageManager({ cwd: projectRoot }); 3498d3f3824SCedric van Putten await pnpm.removeAsync(['metro']); 3508d3f3824SCedric van Putten 3518d3f3824SCedric van Putten expect(spawnAsync).toBeCalledWith( 3528d3f3824SCedric van Putten 'pnpm', 3538d3f3824SCedric van Putten ['remove', 'metro'], 3548d3f3824SCedric van Putten expect.objectContaining({ cwd: projectRoot }) 3558d3f3824SCedric van Putten ); 3568d3f3824SCedric van Putten }); 3578d3f3824SCedric van Putten 3588d3f3824SCedric van Putten it('removes multiple packages', async () => { 3598d3f3824SCedric van Putten const pnpm = new PnpmPackageManager({ cwd: projectRoot }); 3608d3f3824SCedric van Putten await pnpm.removeAsync(['metro', 'jest-haste-map']); 3618d3f3824SCedric van Putten 3628d3f3824SCedric van Putten expect(spawnAsync).toBeCalledWith( 3638d3f3824SCedric van Putten 'pnpm', 3648d3f3824SCedric van Putten ['remove', 'metro', 'jest-haste-map'], 3658d3f3824SCedric van Putten expect.objectContaining({ cwd: projectRoot }) 3668d3f3824SCedric van Putten ); 3678d3f3824SCedric van Putten }); 3688d3f3824SCedric van Putten }); 3698d3f3824SCedric van Putten 3708d3f3824SCedric van Putten describe('removeDevAsync', () => { 3718d3f3824SCedric van Putten it('removes a single package', async () => { 3728d3f3824SCedric van Putten const pnpm = new PnpmPackageManager({ cwd: projectRoot }); 3738d3f3824SCedric van Putten await pnpm.removeDevAsync(['metro']); 3748d3f3824SCedric van Putten 3758d3f3824SCedric van Putten expect(spawnAsync).toBeCalledWith( 3768d3f3824SCedric van Putten 'pnpm', 3778d3f3824SCedric van Putten ['remove', '--save-dev', 'metro'], 3788d3f3824SCedric van Putten expect.objectContaining({ cwd: projectRoot }) 3798d3f3824SCedric van Putten ); 3808d3f3824SCedric van Putten }); 3818d3f3824SCedric van Putten 3828d3f3824SCedric van Putten it('removes multiple packages', async () => { 3838d3f3824SCedric van Putten const pnpm = new PnpmPackageManager({ cwd: projectRoot }); 3848d3f3824SCedric van Putten await pnpm.removeDevAsync(['metro', 'jest-haste-map']); 3858d3f3824SCedric van Putten 3868d3f3824SCedric van Putten expect(spawnAsync).toBeCalledWith( 3878d3f3824SCedric van Putten 'pnpm', 3888d3f3824SCedric van Putten ['remove', '--save-dev', 'metro', 'jest-haste-map'], 3898d3f3824SCedric van Putten expect.objectContaining({ cwd: projectRoot }) 3908d3f3824SCedric van Putten ); 3918d3f3824SCedric van Putten }); 3928d3f3824SCedric van Putten }); 3938d3f3824SCedric van Putten 3948d3f3824SCedric van Putten describe('removeGlobalAsync', () => { 3958d3f3824SCedric van Putten it('removes a single package', async () => { 3968d3f3824SCedric van Putten const pnpm = new PnpmPackageManager({ cwd: projectRoot }); 3978d3f3824SCedric van Putten await pnpm.removeGlobalAsync(['expo-cli']); 3988d3f3824SCedric van Putten 3998d3f3824SCedric van Putten expect(spawnAsync).toBeCalledWith( 4008d3f3824SCedric van Putten 'pnpm', 4018d3f3824SCedric van Putten ['remove', '--global', 'expo-cli'], 4028d3f3824SCedric van Putten expect.objectContaining({ cwd: projectRoot }) 4038d3f3824SCedric van Putten ); 4048d3f3824SCedric van Putten }); 4058d3f3824SCedric van Putten 4068d3f3824SCedric van Putten it('removes multiple packages', async () => { 4078d3f3824SCedric van Putten const pnpm = new PnpmPackageManager({ cwd: projectRoot }); 4088d3f3824SCedric van Putten await pnpm.removeGlobalAsync(['expo-cli', 'eas-cli']); 4098d3f3824SCedric van Putten 4108d3f3824SCedric van Putten expect(spawnAsync).toBeCalledWith( 4118d3f3824SCedric van Putten 'pnpm', 4128d3f3824SCedric van Putten ['remove', '--global', 'expo-cli', 'eas-cli'], 4138d3f3824SCedric van Putten expect.objectContaining({ cwd: projectRoot }) 4148d3f3824SCedric van Putten ); 4158d3f3824SCedric van Putten }); 4168d3f3824SCedric van Putten }); 4178d3f3824SCedric van Putten 4188d3f3824SCedric van Putten describe('workspaceRoot', () => { 4198d3f3824SCedric van Putten const workspaceRoot = '/monorepo'; 4208d3f3824SCedric van Putten const projectRoot = '/monorepo/packages/test'; 4218d3f3824SCedric van Putten 4228d3f3824SCedric van Putten it('returns null for non-monorepo project', () => { 4238d3f3824SCedric van Putten vol.fromJSON( 4248d3f3824SCedric van Putten { 4258d3f3824SCedric van Putten 'package.json': JSON.stringify({ name: 'project' }), 4268d3f3824SCedric van Putten }, 4278d3f3824SCedric van Putten projectRoot 4288d3f3824SCedric van Putten ); 4298d3f3824SCedric van Putten 4308d3f3824SCedric van Putten const pnpm = new PnpmPackageManager({ cwd: projectRoot }); 4318d3f3824SCedric van Putten expect(pnpm.workspaceRoot()).toBeNull(); 4328d3f3824SCedric van Putten }); 4338d3f3824SCedric van Putten 4348d3f3824SCedric van Putten it('returns new instance for monorepo project', () => { 4358d3f3824SCedric van Putten vol.fromJSON( 4368d3f3824SCedric van Putten { 4378d3f3824SCedric van Putten 'packages/test/package.json': JSON.stringify({ name: 'project' }), 4388d3f3824SCedric van Putten 'package.json': JSON.stringify({ 4398d3f3824SCedric van Putten name: 'monorepo', 4408d3f3824SCedric van Putten }), 4418d3f3824SCedric van Putten [PNPM_WORKSPACE_FILE]: 'packages:\n - packages/*', 4428d3f3824SCedric van Putten }, 4438d3f3824SCedric van Putten workspaceRoot 4448d3f3824SCedric van Putten ); 4458d3f3824SCedric van Putten 4468d3f3824SCedric van Putten const pnpm = new PnpmPackageManager({ cwd: projectRoot }); 4478d3f3824SCedric van Putten const root = pnpm.workspaceRoot(); 4488d3f3824SCedric van Putten expect(root).toBeInstanceOf(PnpmPackageManager); 4498d3f3824SCedric van Putten expect(root).not.toBe(pnpm); 4508d3f3824SCedric van Putten }); 4518d3f3824SCedric van Putten }); 4528d3f3824SCedric van Putten}); 453