1import { vol } from 'memfs'; 2import path from 'path'; 3 4import { findPnpmWorkspaceRoot, PNPM_WORKSPACE_FILE } from '../nodeWorkspaces'; 5 6jest.mock('@expo/spawn-async'); 7jest.mock('fs'); 8jest.mock('path', () => jest.requireActual('path').posix); // Make tests run on Windows 9 10describe(findPnpmWorkspaceRoot, () => { 11 const workspaceRoot = '/monorepo'; 12 const projectRoot = '/monorepo/packages/test'; 13 14 afterEach(() => vol.reset()); 15 16 it('resolves root from project', () => { 17 vol.fromJSON( 18 { 19 'package.json': JSON.stringify({ private: true, name: '@acme/monorepo' }), 20 [PNPM_WORKSPACE_FILE]: 'packages:\n - packages/*', 21 [path.join(projectRoot, 'package.json')]: JSON.stringify({ name: '@acme/test' }), 22 }, 23 workspaceRoot 24 ); 25 26 expect(findPnpmWorkspaceRoot(projectRoot)).toBe(workspaceRoot); 27 }); 28 29 it('resolves root from workspace', () => { 30 vol.fromJSON( 31 { 32 'package.json': JSON.stringify({ private: true, name: '@acme/monorepo' }), 33 [PNPM_WORKSPACE_FILE]: 'packages:\n - packages/*', 34 [path.join(projectRoot, 'package.json')]: JSON.stringify({ name: '@acme/test' }), 35 }, 36 workspaceRoot 37 ); 38 39 expect(findPnpmWorkspaceRoot(workspaceRoot)).toBe(workspaceRoot); 40 }); 41 42 it('ignores root from uncoupled project', () => { 43 vol.fromJSON( 44 { 45 'package.json': JSON.stringify({ private: true, name: '@acme/monorepo' }), 46 [PNPM_WORKSPACE_FILE]: 'packages:\n - packages-not-included/*', 47 [path.join(projectRoot, 'package.json')]: JSON.stringify({ name: '@acme/test' }), 48 }, 49 workspaceRoot 50 ); 51 52 expect(findPnpmWorkspaceRoot(projectRoot)).toBeNull(); 53 }); 54}); 55