18d3f3824SCedric van Puttenimport { vol } from 'memfs';
28d3f3824SCedric van Puttenimport path from 'path';
38d3f3824SCedric van Putten
46a725f6fSColin McDonnellimport { BunPackageManager } from '../../node/BunPackageManager';
58d3f3824SCedric van Puttenimport { NpmPackageManager } from '../../node/NpmPackageManager';
68d3f3824SCedric van Puttenimport { PnpmPackageManager } from '../../node/PnpmPackageManager';
78d3f3824SCedric van Puttenimport { YarnPackageManager } from '../../node/YarnPackageManager';
88d3f3824SCedric van Puttenimport { createForProject, resolvePackageManager } from '../nodeManagers';
98d3f3824SCedric van Puttenimport {
106a725f6fSColin McDonnell  BUN_LOCK_FILE,
118d3f3824SCedric van Putten  NPM_LOCK_FILE,
128d3f3824SCedric van Putten  PNPM_LOCK_FILE,
138d3f3824SCedric van Putten  PNPM_WORKSPACE_FILE,
148d3f3824SCedric van Putten  YARN_LOCK_FILE,
158d3f3824SCedric van Putten} from '../nodeWorkspaces';
168d3f3824SCedric van Putten
178d3f3824SCedric van Puttenjest.mock('fs');
188d3f3824SCedric van Putten
198d3f3824SCedric van Puttendescribe(createForProject, () => {
208d3f3824SCedric van Putten  const projectRoot = '/foo';
218d3f3824SCedric van Putten
228d3f3824SCedric van Putten  afterEach(() => vol.reset());
238d3f3824SCedric van Putten
248d3f3824SCedric van Putten  it(`creates npm package manager from options`, () => {
258d3f3824SCedric van Putten    expect(createForProject(projectRoot, { npm: true })).toBeInstanceOf(NpmPackageManager);
268d3f3824SCedric van Putten  });
278d3f3824SCedric van Putten
288d3f3824SCedric van Putten  it(`creates yarn package manager from options`, () => {
298d3f3824SCedric van Putten    expect(createForProject(projectRoot, { yarn: true })).toBeInstanceOf(YarnPackageManager);
308d3f3824SCedric van Putten  });
318d3f3824SCedric van Putten
328d3f3824SCedric van Putten  it(`creates pnpm package manager from options`, () => {
338d3f3824SCedric van Putten    expect(createForProject(projectRoot, { pnpm: true })).toBeInstanceOf(PnpmPackageManager);
348d3f3824SCedric van Putten  });
358d3f3824SCedric van Putten
366a725f6fSColin McDonnell  it(`creates bun package manager from options`, () => {
376a725f6fSColin McDonnell    expect(createForProject(projectRoot, { bun: true })).toBeInstanceOf(BunPackageManager);
386a725f6fSColin McDonnell  });
396a725f6fSColin McDonnell
408d3f3824SCedric van Putten  it(`defaults to npm package manager`, () => {
418d3f3824SCedric van Putten    expect(createForProject(projectRoot)).toBeInstanceOf(NpmPackageManager);
428d3f3824SCedric van Putten  });
438d3f3824SCedric van Putten
448d3f3824SCedric van Putten  it(`creates npm package manager from project`, () => {
458d3f3824SCedric van Putten    vol.fromJSON(
468d3f3824SCedric van Putten      {
478d3f3824SCedric van Putten        'package.json': JSON.stringify({ name: 'project' }),
488d3f3824SCedric van Putten        [NPM_LOCK_FILE]: '',
498d3f3824SCedric van Putten      },
508d3f3824SCedric van Putten      projectRoot
518d3f3824SCedric van Putten    );
528d3f3824SCedric van Putten
538d3f3824SCedric van Putten    expect(createForProject(projectRoot)).toBeInstanceOf(NpmPackageManager);
548d3f3824SCedric van Putten  });
558d3f3824SCedric van Putten
568d3f3824SCedric van Putten  it(`creates yarn package manager from project`, () => {
578d3f3824SCedric van Putten    vol.fromJSON(
588d3f3824SCedric van Putten      {
598d3f3824SCedric van Putten        'package.json': JSON.stringify({ name: 'project' }),
608d3f3824SCedric van Putten        [YARN_LOCK_FILE]: '',
618d3f3824SCedric van Putten      },
628d3f3824SCedric van Putten      projectRoot
638d3f3824SCedric van Putten    );
648d3f3824SCedric van Putten
658d3f3824SCedric van Putten    expect(createForProject(projectRoot)).toBeInstanceOf(YarnPackageManager);
668d3f3824SCedric van Putten  });
678d3f3824SCedric van Putten
688d3f3824SCedric van Putten  it(`creates pnpm package manager from project`, () => {
698d3f3824SCedric van Putten    vol.fromJSON(
708d3f3824SCedric van Putten      {
718d3f3824SCedric van Putten        'package.json': JSON.stringify({ name: 'project' }),
728d3f3824SCedric van Putten        [PNPM_LOCK_FILE]: '',
738d3f3824SCedric van Putten      },
748d3f3824SCedric van Putten      projectRoot
758d3f3824SCedric van Putten    );
768d3f3824SCedric van Putten
778d3f3824SCedric van Putten    expect(createForProject(projectRoot)).toBeInstanceOf(PnpmPackageManager);
788d3f3824SCedric van Putten  });
798d3f3824SCedric van Putten
806a725f6fSColin McDonnell  it(`creates bun package manager from project`, () => {
816a725f6fSColin McDonnell    vol.fromJSON(
826a725f6fSColin McDonnell      {
836a725f6fSColin McDonnell        'package.json': JSON.stringify({ name: 'project' }),
846a725f6fSColin McDonnell        [BUN_LOCK_FILE]: '',
856a725f6fSColin McDonnell      },
866a725f6fSColin McDonnell      projectRoot
876a725f6fSColin McDonnell    );
886a725f6fSColin McDonnell
896a725f6fSColin McDonnell    expect(createForProject(projectRoot)).toBeInstanceOf(BunPackageManager);
906a725f6fSColin McDonnell  });
916a725f6fSColin McDonnell
92*82c7d456SCedric van Putten  it(`creates bun package manager from project using "yarn.lock" and "bun.lockb"`, () => {
93*82c7d456SCedric van Putten    vol.fromJSON(
94*82c7d456SCedric van Putten      {
95*82c7d456SCedric van Putten        'package.json': JSON.stringify({ name: 'project' }),
96*82c7d456SCedric van Putten        [BUN_LOCK_FILE]: '',
97*82c7d456SCedric van Putten        [YARN_LOCK_FILE]: '',
98*82c7d456SCedric van Putten      },
99*82c7d456SCedric van Putten      projectRoot
100*82c7d456SCedric van Putten    );
101*82c7d456SCedric van Putten
102*82c7d456SCedric van Putten    expect(createForProject(projectRoot)).toBeInstanceOf(BunPackageManager);
103*82c7d456SCedric van Putten  });
104*82c7d456SCedric van Putten
1058d3f3824SCedric van Putten  it(`defaults to npm package manager`, () => {
1068d3f3824SCedric van Putten    vol.fromJSON(
1078d3f3824SCedric van Putten      {
1088d3f3824SCedric van Putten        'package.json': JSON.stringify({ name: 'project' }),
1098d3f3824SCedric van Putten      },
1108d3f3824SCedric van Putten      projectRoot
1118d3f3824SCedric van Putten    );
1128d3f3824SCedric van Putten
1138d3f3824SCedric van Putten    expect(createForProject(projectRoot)).toBeInstanceOf(NpmPackageManager);
1148d3f3824SCedric van Putten  });
1158d3f3824SCedric van Putten});
1168d3f3824SCedric van Putten
1178d3f3824SCedric van Puttendescribe(resolvePackageManager, () => {
1188d3f3824SCedric van Putten  const workspaceRoot = path.resolve('/monorepo/');
1198d3f3824SCedric van Putten  const projectRoot = path.resolve('/monorepo/packages/test/');
1208d3f3824SCedric van Putten
1218d3f3824SCedric van Putten  afterEach(() => vol.reset());
1228d3f3824SCedric van Putten
1238d3f3824SCedric van Putten  it(`resolves npm from monorepo workspace`, () => {
1248d3f3824SCedric van Putten    vol.fromJSON(
1258d3f3824SCedric van Putten      {
1268d3f3824SCedric van Putten        'packages/test/package.json': JSON.stringify({ name: 'project' }),
1278d3f3824SCedric van Putten        'package.json': JSON.stringify({
1288d3f3824SCedric van Putten          private: true,
1298d3f3824SCedric van Putten          name: 'monorepo',
1308d3f3824SCedric van Putten          workspaces: ['packages/*'],
1318d3f3824SCedric van Putten        }),
1328d3f3824SCedric van Putten        [NPM_LOCK_FILE]: '',
1338d3f3824SCedric van Putten      },
1348d3f3824SCedric van Putten      workspaceRoot
1358d3f3824SCedric van Putten    );
1368d3f3824SCedric van Putten
1378d3f3824SCedric van Putten    expect(resolvePackageManager(projectRoot)).toBe('npm');
1388d3f3824SCedric van Putten    expect(resolvePackageManager(projectRoot, 'npm')).toBe('npm');
1398d3f3824SCedric van Putten    expect(resolvePackageManager(projectRoot, 'pnpm')).toBeNull();
1408d3f3824SCedric van Putten    expect(resolvePackageManager(projectRoot, 'yarn')).toBeNull();
1416a725f6fSColin McDonnell    expect(resolvePackageManager(projectRoot, 'bun')).toBeNull();
1428d3f3824SCedric van Putten  });
1438d3f3824SCedric van Putten
1448d3f3824SCedric van Putten  it(`resolves pnpm from monorepo workspace`, () => {
1458d3f3824SCedric van Putten    vol.fromJSON(
1468d3f3824SCedric van Putten      {
1478d3f3824SCedric van Putten        'packages/test/package.json': JSON.stringify({ name: 'project' }),
1488d3f3824SCedric van Putten        'package.json': JSON.stringify({
1498d3f3824SCedric van Putten          private: true,
1508d3f3824SCedric van Putten          name: 'monorepo',
1518d3f3824SCedric van Putten        }),
1528d3f3824SCedric van Putten        [PNPM_LOCK_FILE]: '',
1538d3f3824SCedric van Putten        [PNPM_WORKSPACE_FILE]: 'packages:\n  - packages/*',
1548d3f3824SCedric van Putten      },
1558d3f3824SCedric van Putten      workspaceRoot
1568d3f3824SCedric van Putten    );
1578d3f3824SCedric van Putten
1588d3f3824SCedric van Putten    expect(resolvePackageManager(projectRoot)).toBe('pnpm');
1598d3f3824SCedric van Putten    expect(resolvePackageManager(projectRoot, 'pnpm')).toBe('pnpm');
1608d3f3824SCedric van Putten    expect(resolvePackageManager(projectRoot, 'npm')).toBeNull();
1618d3f3824SCedric van Putten    expect(resolvePackageManager(projectRoot, 'yarn')).toBeNull();
1626a725f6fSColin McDonnell    expect(resolvePackageManager(projectRoot, 'bun')).toBeNull();
1638d3f3824SCedric van Putten  });
1648d3f3824SCedric van Putten
1658d3f3824SCedric van Putten  it(`resolves yarn from monorepo workspace`, () => {
1668d3f3824SCedric van Putten    vol.fromJSON(
1678d3f3824SCedric van Putten      {
1688d3f3824SCedric van Putten        'packages/test/package.json': JSON.stringify({ name: 'project' }),
1698d3f3824SCedric van Putten        'package.json': JSON.stringify({
1708d3f3824SCedric van Putten          private: true,
1718d3f3824SCedric van Putten          name: 'monorepo',
1728d3f3824SCedric van Putten          workspaces: ['packages/*'],
1738d3f3824SCedric van Putten        }),
1748d3f3824SCedric van Putten        [YARN_LOCK_FILE]: '',
1758d3f3824SCedric van Putten      },
1768d3f3824SCedric van Putten      workspaceRoot
1778d3f3824SCedric van Putten    );
1788d3f3824SCedric van Putten
1798d3f3824SCedric van Putten    expect(resolvePackageManager(projectRoot)).toBe('yarn');
1808d3f3824SCedric van Putten    expect(resolvePackageManager(projectRoot, 'yarn')).toBe('yarn');
1818d3f3824SCedric van Putten    expect(resolvePackageManager(projectRoot, 'npm')).toBeNull();
1828d3f3824SCedric van Putten    expect(resolvePackageManager(projectRoot, 'pnpm')).toBeNull();
1836a725f6fSColin McDonnell    expect(resolvePackageManager(projectRoot, 'bun')).toBeNull();
1846a725f6fSColin McDonnell  });
1856a725f6fSColin McDonnell
1866a725f6fSColin McDonnell  it(`resolves bun from monorepo workspace`, () => {
1876a725f6fSColin McDonnell    vol.fromJSON(
1886a725f6fSColin McDonnell      {
1896a725f6fSColin McDonnell        'packages/test/package.json': JSON.stringify({ name: 'project' }),
1906a725f6fSColin McDonnell        'package.json': JSON.stringify({
1916a725f6fSColin McDonnell          private: true,
1926a725f6fSColin McDonnell          name: 'monorepo',
1936a725f6fSColin McDonnell          workspaces: ['packages/*'],
1946a725f6fSColin McDonnell        }),
1956a725f6fSColin McDonnell        [BUN_LOCK_FILE]: '',
1966a725f6fSColin McDonnell      },
1976a725f6fSColin McDonnell      workspaceRoot
1986a725f6fSColin McDonnell    );
1996a725f6fSColin McDonnell
2006a725f6fSColin McDonnell    expect(resolvePackageManager(projectRoot)).toBe('bun');
2016a725f6fSColin McDonnell    expect(resolvePackageManager(projectRoot, 'bun')).toBe('bun');
2026a725f6fSColin McDonnell    expect(resolvePackageManager(projectRoot, 'npm')).toBeNull();
2036a725f6fSColin McDonnell    expect(resolvePackageManager(projectRoot, 'pnpm')).toBeNull();
2046a725f6fSColin McDonnell    expect(resolvePackageManager(projectRoot, 'yarn')).toBeNull();
2058d3f3824SCedric van Putten  });
206*82c7d456SCedric van Putten
207*82c7d456SCedric van Putten  it(`resolves bun from monorepo workspace using "yarn.lock" and "bun.lockb"`, () => {
208*82c7d456SCedric van Putten    vol.fromJSON(
209*82c7d456SCedric van Putten      {
210*82c7d456SCedric van Putten        'packages/test/package.json': JSON.stringify({ name: 'project' }),
211*82c7d456SCedric van Putten        'package.json': JSON.stringify({
212*82c7d456SCedric van Putten          private: true,
213*82c7d456SCedric van Putten          name: 'monorepo',
214*82c7d456SCedric van Putten          workspaces: ['packages/*'],
215*82c7d456SCedric van Putten        }),
216*82c7d456SCedric van Putten        [BUN_LOCK_FILE]: '',
217*82c7d456SCedric van Putten        [YARN_LOCK_FILE]: '',
218*82c7d456SCedric van Putten      },
219*82c7d456SCedric van Putten      workspaceRoot
220*82c7d456SCedric van Putten    );
221*82c7d456SCedric van Putten
222*82c7d456SCedric van Putten    expect(resolvePackageManager(projectRoot)).toBe('bun');
223*82c7d456SCedric van Putten    expect(resolvePackageManager(projectRoot, 'bun')).toBe('bun');
224*82c7d456SCedric van Putten    expect(resolvePackageManager(projectRoot, 'npm')).toBeNull();
225*82c7d456SCedric van Putten    expect(resolvePackageManager(projectRoot, 'pnpm')).toBeNull();
226*82c7d456SCedric van Putten
227*82c7d456SCedric van Putten    // Due to the `yarn.lock` file being present when running `bun install --yarn`,
228*82c7d456SCedric van Putten    // yarn can be returned as package manager when prefering `yarn`.
229*82c7d456SCedric van Putten    expect(resolvePackageManager(projectRoot, 'yarn')).toBe('yarn');
230*82c7d456SCedric van Putten  });
2318d3f3824SCedric van Putten});
232