Skip to content

Commit 77a01ca

Browse files
authored
feat(testing): add getJestProjectsAsync to support inferred targets (#21897)
1 parent dd2c7d2 commit 77a01ca

File tree

14 files changed

+565
-45
lines changed

14 files changed

+565
-45
lines changed

packages/jest/index.ts

+1
Original file line numberDiff line numberDiff line change
@@ -13,5 +13,6 @@ export { jestConfigObjectAst } from './src/utils/config/functions';
1313
export { jestInitGenerator } from './src/generators/init/init';
1414
export {
1515
getJestProjects,
16+
getJestProjectsAsync,
1617
getNestedJestProjects,
1718
} from './src/utils/config/get-jest-projects';

packages/jest/package.json

+3-2
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@
3636
"dependencies": {
3737
"@jest/reporters": "^29.4.1",
3838
"@jest/test-result": "^29.4.1",
39+
"@nx/devkit": "file:../devkit",
40+
"@nx/js": "file:../js",
3941
"@phenomnomnominal/tsquery": "~5.0.1",
4042
"chalk": "^4.1.0",
4143
"identity-obj-proxy": "3.0.0",
@@ -45,8 +47,7 @@
4547
"minimatch": "9.0.3",
4648
"resolve.exports": "1.1.0",
4749
"tslib": "^2.3.0",
48-
"@nx/devkit": "file:../devkit",
49-
"@nx/js": "file:../js"
50+
"yargs-parser": "21.1.1"
5051
},
5152
"publishConfig": {
5253
"access": "public"

packages/jest/src/generators/configuration/lib/__snapshots__/create-jest-config.spec.ts.snap

+8-8
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
// Jest Snapshot v1, https://goo.gl/fbAQLP
22

33
exports[`createJestConfig should generate files 1`] = `
4-
"import { getJestProjects } from '@nx/jest';
4+
"import { getJestProjectsAsync } from '@nx/jest';
55
6-
export default {
7-
projects: getJestProjects()
8-
};"
6+
export default async () => ({
7+
projects: await getJestProjectsAsync()
8+
});"
99
`;
1010

1111
exports[`createJestConfig should generate files 2`] = `
@@ -15,11 +15,11 @@ module.exports = { ...nxPreset }"
1515
`;
1616

1717
exports[`createJestConfig should generate files with --js flag 1`] = `
18-
"const { getJestProjects } = require('@nx/jest');
18+
"const { getJestProjectsAsync } = require('@nx/jest');
1919
20-
module.exports = {
21-
projects: getJestProjects()
22-
};"
20+
module.exports = async () => ({
21+
projects: await getJestProjectsAsync()
22+
});"
2323
`;
2424

2525
exports[`createJestConfig should generate files with --js flag 2`] = `

packages/jest/src/generators/configuration/lib/create-jest-config.spec.ts

+8-8
Original file line numberDiff line numberDiff line change
@@ -162,11 +162,11 @@ export default {
162162
"
163163
`);
164164
expect(tree.read('jest.config.ts', 'utf-8'))
165-
.toEqual(`import { getJestProjects } from '@nx/jest';
165+
.toEqual(`import { getJestProjectsAsync } from '@nx/jest';
166166
167-
export default {
168-
projects: getJestProjects()
169-
};`);
167+
export default async () => ({
168+
projects: await getJestProjectsAsync()
169+
});`);
170170
expect(readProjectConfiguration(tree, 'my-project').targets.test)
171171
.toMatchInlineSnapshot(`
172172
{
@@ -214,11 +214,11 @@ module.exports = {
214214

215215
expect(tree.exists('jest.config.app.js')).toBeTruthy();
216216
expect(tree.read('jest.config.js', 'utf-8'))
217-
.toEqual(`const { getJestProjects } = require('@nx/jest');
217+
.toEqual(`const { getJestProjectsAsync } = require('@nx/jest');
218218
219-
module.exports = {
220-
projects: getJestProjects()
221-
};`);
219+
module.exports = async () => ({
220+
projects: await getJestProjectsAsync()
221+
});`);
222222
});
223223
});
224224
});

packages/jest/src/generators/configuration/lib/create-jest-config.ts

+8-8
Original file line numberDiff line numberDiff line change
@@ -129,16 +129,16 @@ export async function createJestConfig(
129129
function generateGlobalConfig(tree: Tree, isJS: boolean) {
130130
const contents = isJS
131131
? stripIndents`
132-
const { getJestProjects } = require('@nx/jest');
132+
const { getJestProjectsAsync } = require('@nx/jest');
133133
134-
module.exports = {
135-
projects: getJestProjects()
136-
};`
134+
module.exports = async () => ({
135+
projects: await getJestProjectsAsync()
136+
});`
137137
: stripIndents`
138-
import { getJestProjects } from '@nx/jest';
138+
import { getJestProjectsAsync } from '@nx/jest';
139139
140-
export default {
141-
projects: getJestProjects()
142-
};`;
140+
export default async () => ({
141+
projects: await getJestProjectsAsync()
142+
});`;
143143
tree.write(`jest.config.${isJS ? 'js' : 'ts'}`, contents);
144144
}

packages/jest/src/generators/configuration/lib/update-jestconfig.ts

+8-1
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,15 @@ import { readProjectConfiguration, Tree } from '@nx/devkit';
55

66
function isUsingUtilityFunction(host: Tree) {
77
const rootConfig = findRootJestConfig(host);
8+
if (!rootConfig) {
9+
return false;
10+
}
11+
12+
const rootConfigContent = host.read(rootConfig, 'utf-8');
13+
814
return (
9-
rootConfig && host.read(rootConfig).toString().includes('getJestProjects()')
15+
rootConfigContent.includes('getJestProjects()') ||
16+
rootConfigContent.includes('getJestProjectsAsync()')
1017
);
1118
}
1219

packages/jest/src/plugins/plugin.spec.ts

+1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ describe('@nx/jest/plugin', () => {
1111

1212
beforeEach(async () => {
1313
tempFs = new TempFs('test');
14+
process.chdir(tempFs.tempDir);
1415
context = {
1516
nxJsonConfiguration: {
1617
namedInputs: {

packages/jest/src/plugins/plugin.ts

+12-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import { dirname, join, relative, resolve } from 'path';
1212

1313
import { readTargetDefaultsForTarget } from 'nx/src/project-graph/utils/project-configuration-utils';
1414
import { getNamedInputs } from '@nx/devkit/src/utils/get-named-inputs';
15-
import { existsSync, readdirSync } from 'fs';
15+
import { existsSync, readdirSync, readFileSync } from 'fs';
1616
import { readConfig } from 'jest-config';
1717
import { projectGraphCacheDirectory } from 'nx/src/utils/cache-directory';
1818
import { calculateHashForCreateNodes } from '@nx/devkit/src/utils/calculate-hash-for-create-nodes';
@@ -82,6 +82,17 @@ export const createNodes: CreateNodes<JestPluginOptions> = [
8282
}
8383
}
8484

85+
const jestConfigContent = readFileSync(
86+
resolve(context.workspaceRoot, configFilePath),
87+
'utf-8'
88+
);
89+
if (jestConfigContent.includes('getJestProjectsAsync()')) {
90+
// The `getJestProjectsAsync` function uses the project graph, which leads to a
91+
// circular dependency. We can skip this since it's no intended to be used for
92+
// an Nx project.
93+
return {};
94+
}
95+
8596
options = normalizeOptions(options);
8697

8798
const hash = calculateHashForCreateNodes(projectRoot, options, context);

0 commit comments

Comments
 (0)