diff --git a/src/packageManager.ts b/src/packageManager.ts index 4281361..03521e6 100644 --- a/src/packageManager.ts +++ b/src/packageManager.ts @@ -49,6 +49,20 @@ class NPM implements PackageManager { class Yarn implements PackageManager { name = 'Yarn' cli = 'yarn' + private workspace: boolean + + constructor(rootDir: string) { + this.workspace = this.isWorkspace(rootDir); + } + + private isWorkspace(rootDir: string) { + try { + const packageJSON = JSON.parse(fs.readFileSync(path.join(rootDir, 'package.json'), 'utf-8')); + return !!packageJSON.workspaces; + } catch (e) { + return false; + } + } init(): string { return 'yarn init -y' @@ -67,7 +81,7 @@ class Yarn implements PackageManager { } installDevDependency(name: string): string { - return `yarn add --dev ${name}` + return `yarn add --dev ${this.workspace ? '-W ' : ''}${name}` } runPlaywrightTest(args: string): string { @@ -82,8 +96,10 @@ class Yarn implements PackageManager { class PNPM implements PackageManager { name = 'pnpm' cli = 'pnpm' + private workspace: boolean; - constructor(private workspace: boolean) { + constructor(rootDir: string) { + this.workspace = fs.existsSync(path.resolve(rootDir, 'pnpm-workspace.yaml')); } init(): string { @@ -118,10 +134,9 @@ class PNPM implements PackageManager { export function determinePackageManager(rootDir: string): PackageManager { if (process.env.npm_config_user_agent) { if (process.env.npm_config_user_agent.includes('yarn')) - return new Yarn(); + return new Yarn(rootDir); if (process.env.npm_config_user_agent.includes('pnpm')) - return new PNPM(fs.existsSync(path.resolve(rootDir, 'pnpm-workspace.yaml'))); - return new NPM(); + return new PNPM(rootDir); } return new NPM(); } diff --git a/tests/integration.spec.ts b/tests/integration.spec.ts index 0156561..534811a 100644 --- a/tests/integration.spec.ts +++ b/tests/integration.spec.ts @@ -112,6 +112,31 @@ test('should generate in the root of pnpm workspace', async ({ run, packageManag expect(fs.existsSync(path.join(dir, 'playwright.config.ts'))).toBeTruthy(); }); +test('should generate in the root of yarn workspaces', async ({ run, packageManager }) => { + test.skip(packageManager !== 'yarn'); + + const dir = test.info().outputDir; + fs.mkdirSync(dir, { recursive: true }); + fs.writeFileSync(path.join(dir, 'package.json'), `{ + "name": "yarn-monorepo", + "version": "1.0.0", + "private": true, + "workspaces": ["packages/*"] +}`); + for (const pkg of ['foo', 'bar']) { + const packageDir = path.join(dir, 'packages', pkg); + fs.mkdirSync(packageDir, { recursive: true }); + childProcess.execSync('yarn init -y', { cwd: packageDir }); + } + childProcess.execSync('yarn install', { cwd: dir }); + + await run([], { installGitHubActions: false, testDir: 'tests', language: 'TypeScript', installPlaywrightDependencies: false, installPlaywrightBrowsers: false }); + assertLockFilesExist(dir, packageManager); + expect(fs.existsSync(path.join(dir, 'tests/example.spec.ts'))).toBeTruthy(); + expect(fs.existsSync(path.join(dir, 'node_modules/playwright'))).toBeTruthy(); + expect(fs.existsSync(path.join(dir, 'playwright.config.ts'))).toBeTruthy(); +}); + test('should not duplicate gitignore entries', async ({ run, dir }) => { fs.writeFileSync(path.join(dir, '.gitignore'), validGitignore);