From 0da1acd865fc2eff9f9de3d59df5db57e7f8f3b2 Mon Sep 17 00:00:00 2001 From: Martin Lehmann Date: Tue, 11 Dec 2018 11:59:03 +0100 Subject: [PATCH 1/3] fix(jest-config): Allow exactly one project Fixes #7496 --- CHANGELOG.md | 1 + packages/jest-config/src/index.js | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 69eea7572b77..65689d71da28 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -80,6 +80,7 @@ - `[jest-haste-map]` Remove legacy condition for duplicate module detection ([#7333](https://github.com/facebook/jest/pull/7333)) - `[jest-haste-map]` Fix `require` detection with trailing commas and ignore `import typeof` modules ([#7385](https://github.com/facebook/jest/pull/7385)) - `[jest-cli]` Fix to set prettierPath via config file ([#7412](https://github.com/facebook/jest/pull/7412)) +- `[jest-config]` Allow exactly one project ([#7498](https://github.com/facebook/jest/pull/7498)) ### Chore & Maintenance diff --git a/packages/jest-config/src/index.js b/packages/jest-config/src/index.js index b1832b94af6a..79719e464767 100644 --- a/packages/jest-config/src/index.js +++ b/packages/jest-config/src/index.js @@ -277,7 +277,7 @@ export function readConfigs( } } - if (projects.length > 1) { + if (projects.length > 0) { const parsedConfigs = projects .filter(root => { // Ignore globbed files that cannot be `require`d. From eebc49447c5f8205b3c29edb2d6405a0c0714de8 Mon Sep 17 00:00:00 2001 From: Martin Lehmann Date: Tue, 11 Dec 2018 13:50:45 +0100 Subject: [PATCH 2/3] Add a test that demonstrates the issue --- e2e/__tests__/multi_project_runner.test.js | 36 ++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/e2e/__tests__/multi_project_runner.test.js b/e2e/__tests__/multi_project_runner.test.js index 237df8794c7b..2f5b96423d92 100644 --- a/e2e/__tests__/multi_project_runner.test.js +++ b/e2e/__tests__/multi_project_runner.test.js @@ -253,6 +253,42 @@ test('allows a single project', () => { expect(status).toEqual(0); }); +test.each([{projectPath: 'packages/somepackage'}, {projectPath: 'packages/*'}])( + 'allows a single non-root project', + ({projectPath}: {projectPath: string}) => { + writeFiles(DIR, { + 'package.json': ` + { + "jest": { + "testMatch": [], + "projects": [ + "${projectPath}" + ] + } + } + `, + 'packages/somepackage/package.json': ` + { + "jest": { + "displayName": "somepackage" + } + } + `, + 'packages/somepackage/test.js': ` + test('1+1', () => { + expect(1).toBe(1); + }); + `, + }); + + const {stdout, stderr, status} = runJest(DIR, ['--no-watchman']); + expect(stderr).toContain('PASS somepackage packages/somepackage/test.js'); + expect(stderr).toContain('Test Suites: 1 passed, 1 total'); + expect(stdout).toEqual(''); + expect(status).toEqual(0); + }, +); + test('resolves projects and their properly', () => { writeFiles(DIR, { '.watchmanconfig': '', From 528a3f3cf0669df40e2f360ad915dd84617abca2 Mon Sep 17 00:00:00 2001 From: Scott Hovestadt Date: Wed, 1 May 2019 20:45:14 -0700 Subject: [PATCH 3/3] fix single project run --- e2e/__tests__/multiProjectRunner.test.ts | 72 ++++++++++++------------ packages/jest-config/src/index.ts | 9 ++- 2 files changed, 44 insertions(+), 37 deletions(-) diff --git a/e2e/__tests__/multiProjectRunner.test.ts b/e2e/__tests__/multiProjectRunner.test.ts index 39d2415af710..a610f2cb6e63 100644 --- a/e2e/__tests__/multiProjectRunner.test.ts +++ b/e2e/__tests__/multiProjectRunner.test.ts @@ -170,6 +170,42 @@ test('"No tests found" message for projects', () => { ); }); +test.each([{projectPath: 'packages/somepackage'}, {projectPath: 'packages/*'}])( + 'allows a single non-root project', + ({projectPath}: {projectPath: string}) => { + writeFiles(DIR, { + 'package.json': ` + { + "jest": { + "testMatch": ["/packages/somepackage/test.js"], + "projects": [ + "${projectPath}" + ] + } + } + `, + 'packages/somepackage/package.json': ` + { + "jest": { + "displayName": "somepackage" + } + } + `, + 'packages/somepackage/test.js': ` + test('1+1', () => { + expect(1).toBe(1); + }); + `, + }); + + const {stdout, stderr, status} = runJest(DIR, ['--no-watchman']); + expect(stderr).toContain('PASS packages/somepackage/test.js'); + expect(stderr).toContain('Test Suites: 1 passed, 1 total'); + expect(stdout).toEqual(''); + expect(status).toEqual(0); + }, +); + test('projects can be workspaces with non-JS/JSON files', () => { writeFiles(DIR, { 'package.json': JSON.stringify({ @@ -249,42 +285,6 @@ test('allows a single project', () => { expect(status).toEqual(0); }); -test.each([{projectPath: 'packages/somepackage'}, {projectPath: 'packages/*'}])( - 'allows a single non-root project', - ({projectPath}: {projectPath: string}) => { - writeFiles(DIR, { - 'package.json': ` - { - "jest": { - "testMatch": [], - "projects": [ - "${projectPath}" - ] - } - } - `, - 'packages/somepackage/package.json': ` - { - "jest": { - "displayName": "somepackage" - } - } - `, - 'packages/somepackage/test.js': ` - test('1+1', () => { - expect(1).toBe(1); - }); - `, - }); - - const {stdout, stderr, status} = runJest(DIR, ['--no-watchman']); - expect(stderr).toContain('PASS somepackage packages/somepackage/test.js'); - expect(stderr).toContain('Test Suites: 1 passed, 1 total'); - expect(stdout).toEqual(''); - expect(status).toEqual(0); - }, -); - test('resolves projects and their properly', () => { writeFiles(DIR, { '.watchmanconfig': '', diff --git a/packages/jest-config/src/index.ts b/packages/jest-config/src/index.ts index 042c029d3391..337e7ab47c81 100644 --- a/packages/jest-config/src/index.ts +++ b/packages/jest-config/src/index.ts @@ -218,6 +218,10 @@ const ensureNoDuplicateConfigs = ( parsedConfigs: Array, projects: Config.GlobalConfig['projects'], ) => { + if (projects.length <= 1) { + return; + } + const configPathMap = new Map(); for (const config of parsedConfigs) { @@ -289,7 +293,10 @@ export function readConfigs( } } - if (projects.length > 0) { + if ( + projects.length > 1 || + (projects.length && typeof projects[0] === 'object') + ) { const parsedConfigs = projects .filter(root => { // Ignore globbed files that cannot be `require`d.