feat(testing): remove deprecated getJestProjects (#30844)
Remove the deprecated function `getJestProjects`. BREAKING CHANGE: The previously deprecated `getJestProjects` function was removed in favor of `getJestProjectsAsync`.
This commit is contained in:
parent
69ea6327d3
commit
c0aa245d9c
@ -2429,8 +2429,18 @@
|
||||
}
|
||||
},
|
||||
"migrations": {
|
||||
"/nx-api/jest/migrations/replace-getJestProjects-with-getJestProjectsAsync-v21": {
|
||||
"description": "Replace usage of `getJestProjects` with `getJestProjectsAsync`.",
|
||||
"file": "generated/packages/jest/migrations/replace-getJestProjects-with-getJestProjectsAsync-v21.json",
|
||||
"hidden": false,
|
||||
"name": "replace-getJestProjects-with-getJestProjectsAsync-v21",
|
||||
"version": "21.0.0-beta.9",
|
||||
"originalFilePath": "/packages/jest",
|
||||
"path": "/nx-api/jest/migrations/replace-getJestProjects-with-getJestProjectsAsync-v21",
|
||||
"type": "migration"
|
||||
},
|
||||
"/nx-api/jest/migrations/replace-getJestProjects-with-getJestProjectsAsync": {
|
||||
"description": "replace getJestProjects with getJestProjectsAsync",
|
||||
"description": "Replace usage of `getJestProjects` with `getJestProjectsAsync`.",
|
||||
"file": "generated/packages/jest/migrations/replace-getJestProjects-with-getJestProjectsAsync.json",
|
||||
"hidden": false,
|
||||
"name": "replace-getJestProjects-with-getJestProjectsAsync",
|
||||
|
||||
@ -2413,7 +2413,17 @@
|
||||
],
|
||||
"migrations": [
|
||||
{
|
||||
"description": "replace getJestProjects with getJestProjectsAsync",
|
||||
"description": "Replace usage of `getJestProjects` with `getJestProjectsAsync`.",
|
||||
"file": "generated/packages/jest/migrations/replace-getJestProjects-with-getJestProjectsAsync-v21.json",
|
||||
"hidden": false,
|
||||
"name": "replace-getJestProjects-with-getJestProjectsAsync-v21",
|
||||
"version": "21.0.0-beta.9",
|
||||
"originalFilePath": "/packages/jest",
|
||||
"path": "jest/migrations/replace-getJestProjects-with-getJestProjectsAsync-v21",
|
||||
"type": "migration"
|
||||
},
|
||||
{
|
||||
"description": "Replace usage of `getJestProjects` with `getJestProjectsAsync`.",
|
||||
"file": "generated/packages/jest/migrations/replace-getJestProjects-with-getJestProjectsAsync.json",
|
||||
"hidden": false,
|
||||
"name": "replace-getJestProjects-with-getJestProjectsAsync",
|
||||
|
||||
@ -0,0 +1,13 @@
|
||||
{
|
||||
"name": "replace-getJestProjects-with-getJestProjectsAsync-v21",
|
||||
"cli": "nx",
|
||||
"version": "21.0.0-beta.9",
|
||||
"description": "Replace usage of `getJestProjects` with `getJestProjectsAsync`.",
|
||||
"implementation": "/packages/jest/src/migrations/update-21-0-0/replace-getJestProjects-with-getJestProjectsAsync.ts",
|
||||
"aliases": [],
|
||||
"hidden": false,
|
||||
"path": "/packages/jest",
|
||||
"schema": null,
|
||||
"type": "migration",
|
||||
"examplesFile": "#### Replace Usage of `getJestProjects` with `getJestProjectsAsync`\n\nReplaces the usage of the removed `getJestProjects` function with the `getJestProjectsAsync` function.\n\n#### Sample Code Changes\n\n{% tabs %}\n{% tab label=\"Before\" %}\n\n```ts {% fileName=\"jest.config.ts\" %}\nimport { getJestProjects } from '@nx/jest';\n\nexport default {\n projects: getJestProjects(),\n};\n```\n\n{% /tab %}\n{% tab label=\"After\" %}\n\n```ts {% fileName=\"jest.config.ts\" %}\nimport { getJestProjectsAsync } from '@nx/jest';\n\nexport default async () => ({\n projects: await getJestProjectsAsync(),\n});\n```\n\n{% /tab %}\n{% /tabs %}\n"
|
||||
}
|
||||
@ -2,12 +2,12 @@
|
||||
"name": "replace-getJestProjects-with-getJestProjectsAsync",
|
||||
"cli": "nx",
|
||||
"version": "20.0.0-beta.5",
|
||||
"description": "replace getJestProjects with getJestProjectsAsync",
|
||||
"description": "Replace usage of `getJestProjects` with `getJestProjectsAsync`.",
|
||||
"implementation": "/packages/jest/src/migrations/update-20-0-0/replace-getJestProjects-with-getJestProjectsAsync.ts",
|
||||
"aliases": [],
|
||||
"hidden": false,
|
||||
"path": "/packages/jest",
|
||||
"schema": null,
|
||||
"type": "migration",
|
||||
"examplesFile": "#### Replace getJestProjects with getJestProjectsAsync\n\nReplace getJestProjects with getJestProjectsAsync\n\n#### Sample Code Changes\n\n{% tabs %}\n{% tab label=\"Before\" %}\n\n```ts {% fileName=\"jest.config.ts\" %}\nimport { getJestProjects } from '@nx/jest';\n\nexport default {\n projects: getJestProjects(),\n};\n```\n\n{% /tab %}\n{% tab label=\"After\" %}\n\n```ts {% fileName=\"jest.config.ts\" %}\nimport { getJestProjectsAsync } from '@nx/jest';\n\nexport default async () => ({\n projects: await getJestProjectsAsync(),\n});\n```\n\n{% /tab %}\n{% /tabs %}\n"
|
||||
"examplesFile": "#### Replace Usage of `getJestProjects` with `getJestProjectsAsync`\n\nReplaces the usage of the deprecated `getJestProjects` function with the `getJestProjectsAsync` function.\n\n#### Sample Code Changes\n\n{% tabs %}\n{% tab label=\"Before\" %}\n\n```ts {% fileName=\"jest.config.ts\" %}\nimport { getJestProjects } from '@nx/jest';\n\nexport default {\n projects: getJestProjects(),\n};\n```\n\n{% /tab %}\n{% tab label=\"After\" %}\n\n```ts {% fileName=\"jest.config.ts\" %}\nimport { getJestProjectsAsync } from '@nx/jest';\n\nexport default async () => ({\n projects: await getJestProjectsAsync(),\n});\n```\n\n{% /tab %}\n{% /tabs %}\n"
|
||||
}
|
||||
|
||||
@ -11,8 +11,4 @@ export {
|
||||
} from './src/utils/config/update-config';
|
||||
export { jestConfigObjectAst } from './src/utils/config/functions';
|
||||
export { jestInitGenerator } from './src/generators/init/init';
|
||||
export {
|
||||
getJestProjects,
|
||||
getJestProjectsAsync,
|
||||
getNestedJestProjects,
|
||||
} from './src/utils/config/get-jest-projects';
|
||||
export { getJestProjectsAsync } from './src/utils/config/get-jest-projects';
|
||||
|
||||
@ -8,8 +8,14 @@
|
||||
"replace-getJestProjects-with-getJestProjectsAsync": {
|
||||
"cli": "nx",
|
||||
"version": "20.0.0-beta.5",
|
||||
"description": "replace getJestProjects with getJestProjectsAsync",
|
||||
"description": "Replace usage of `getJestProjects` with `getJestProjectsAsync`.",
|
||||
"implementation": "./src/migrations/update-20-0-0/replace-getJestProjects-with-getJestProjectsAsync"
|
||||
},
|
||||
"replace-getJestProjects-with-getJestProjectsAsync-v21": {
|
||||
"cli": "nx",
|
||||
"version": "21.0.0-beta.9",
|
||||
"description": "Replace usage of `getJestProjects` with `getJestProjectsAsync`.",
|
||||
"implementation": "./src/migrations/update-21-0-0/replace-getJestProjects-with-getJestProjectsAsync"
|
||||
}
|
||||
},
|
||||
"packageJsonUpdates": {
|
||||
|
||||
@ -75,11 +75,11 @@ describe('createJestConfig', () => {
|
||||
},
|
||||
});
|
||||
const expected = `
|
||||
import { getJestProjects } from '@nx/jest';
|
||||
export default {
|
||||
projects: getJestProjects(),
|
||||
import { getJestProjectsAsync } from '@nx/jest';
|
||||
export default async () => ({
|
||||
projects: await getJestProjectsAsync(),
|
||||
extraThing: "Goes Here"
|
||||
}
|
||||
});
|
||||
`;
|
||||
tree.write('jest.config.ts', expected);
|
||||
|
||||
|
||||
@ -1,37 +0,0 @@
|
||||
import { readProjectConfiguration, type Tree } from '@nx/devkit';
|
||||
import { findRootJestConfig } from '../../../utils/config/config-file';
|
||||
import { addPropertyToJestConfig } from '../../../utils/config/update-config';
|
||||
import type { NormalizedJestProjectSchema } from '../schema';
|
||||
|
||||
function isUsingUtilityFunction(host: Tree) {
|
||||
const rootConfig = findRootJestConfig(host);
|
||||
if (!rootConfig) {
|
||||
return false;
|
||||
}
|
||||
|
||||
const rootConfigContent = host.read(rootConfig, 'utf-8');
|
||||
|
||||
return (
|
||||
rootConfigContent.includes('getJestProjects()') ||
|
||||
rootConfigContent.includes('getJestProjectsAsync()')
|
||||
);
|
||||
}
|
||||
|
||||
export function updateJestConfig(
|
||||
host: Tree,
|
||||
options: NormalizedJestProjectSchema
|
||||
) {
|
||||
if (isUsingUtilityFunction(host)) {
|
||||
return;
|
||||
}
|
||||
const project = readProjectConfiguration(host, options.project);
|
||||
const rootConfig = findRootJestConfig(host);
|
||||
if (rootConfig) {
|
||||
addPropertyToJestConfig(
|
||||
host,
|
||||
findRootJestConfig(host),
|
||||
'projects',
|
||||
`<rootDir>/${project.root}`
|
||||
);
|
||||
}
|
||||
}
|
||||
@ -1,6 +1,6 @@
|
||||
#### Replace getJestProjects with getJestProjectsAsync
|
||||
#### Replace Usage of `getJestProjects` with `getJestProjectsAsync`
|
||||
|
||||
Replace getJestProjects with getJestProjectsAsync
|
||||
Replaces the usage of the deprecated `getJestProjects` function with the `getJestProjectsAsync` function.
|
||||
|
||||
#### Sample Code Changes
|
||||
|
||||
|
||||
@ -0,0 +1,30 @@
|
||||
#### Replace Usage of `getJestProjects` with `getJestProjectsAsync`
|
||||
|
||||
Replaces the usage of the removed `getJestProjects` function with the `getJestProjectsAsync` function.
|
||||
|
||||
#### Sample Code Changes
|
||||
|
||||
{% tabs %}
|
||||
{% tab label="Before" %}
|
||||
|
||||
```ts {% fileName="jest.config.ts" %}
|
||||
import { getJestProjects } from '@nx/jest';
|
||||
|
||||
export default {
|
||||
projects: getJestProjects(),
|
||||
};
|
||||
```
|
||||
|
||||
{% /tab %}
|
||||
{% tab label="After" %}
|
||||
|
||||
```ts {% fileName="jest.config.ts" %}
|
||||
import { getJestProjectsAsync } from '@nx/jest';
|
||||
|
||||
export default async () => ({
|
||||
projects: await getJestProjectsAsync(),
|
||||
});
|
||||
```
|
||||
|
||||
{% /tab %}
|
||||
{% /tabs %}
|
||||
@ -0,0 +1,191 @@
|
||||
import { Tree } from '@nx/devkit';
|
||||
import { createTree } from '@nx/devkit/testing';
|
||||
import update from './replace-getJestProjects-with-getJestProjectsAsync';
|
||||
|
||||
describe('replace-getJestProjects-with-getJestProjectsAsync', () => {
|
||||
let tree: Tree;
|
||||
|
||||
beforeEach(() => {
|
||||
tree = createTree();
|
||||
});
|
||||
|
||||
it('should replace getJestProjects with getJestProjectsAsync using `require`', async () => {
|
||||
tree.write(
|
||||
'jest.config.ts',
|
||||
`
|
||||
const { getJestProjects } = require('@nx/jest');
|
||||
|
||||
module.exports = {
|
||||
projects: getJestProjects(),
|
||||
};
|
||||
`
|
||||
);
|
||||
await update(tree);
|
||||
const updatedJestConfig = tree.read('jest.config.ts')?.toString();
|
||||
expect(updatedJestConfig).toMatchInlineSnapshot(`
|
||||
"
|
||||
const { getJestProjectsAsync } = require('@nx/jest');
|
||||
|
||||
module.exports = async () => ({
|
||||
projects: await getJestProjectsAsync(),
|
||||
});
|
||||
"
|
||||
`);
|
||||
});
|
||||
|
||||
it('should replace getJestProjects with getJestProjectsAsync using `import`', async () => {
|
||||
tree.write(
|
||||
'jest.config.ts',
|
||||
`
|
||||
import { getJestProjects } from '@nx/jest';
|
||||
|
||||
export default {
|
||||
projects: getJestProjects(),
|
||||
};
|
||||
`
|
||||
);
|
||||
await update(tree);
|
||||
const updatedJestConfig = tree.read('jest.config.ts')?.toString();
|
||||
expect(updatedJestConfig).toMatchInlineSnapshot(`
|
||||
"
|
||||
import { getJestProjectsAsync } from '@nx/jest';
|
||||
|
||||
export default async () => ({
|
||||
projects: await getJestProjectsAsync(),
|
||||
});
|
||||
"
|
||||
`);
|
||||
});
|
||||
|
||||
it('should replace getJestProjects with getJestProjectsAsync using `require` with `export default`', async () => {
|
||||
tree.write(
|
||||
'jest.config.ts',
|
||||
`
|
||||
const { getJestProjects } = require('@nx/jest');
|
||||
|
||||
export default {
|
||||
projects: getJestProjects(),
|
||||
};
|
||||
`
|
||||
);
|
||||
await update(tree);
|
||||
const updatedJestConfig = tree.read('jest.config.ts')?.toString();
|
||||
expect(updatedJestConfig).toMatchInlineSnapshot(`
|
||||
"
|
||||
const { getJestProjectsAsync } = require('@nx/jest');
|
||||
|
||||
export default async () => ({
|
||||
projects: await getJestProjectsAsync(),
|
||||
});
|
||||
"
|
||||
`);
|
||||
});
|
||||
|
||||
it('should replace getJestProjects with getJestProjectsAsync using `import` with `module.exports`', async () => {
|
||||
tree.write(
|
||||
'jest.config.ts',
|
||||
`
|
||||
import { getJestProjects } from '@nx/jest';
|
||||
|
||||
module.exports = {
|
||||
projects: getJestProjects(),
|
||||
};
|
||||
`
|
||||
);
|
||||
await update(tree);
|
||||
const updatedJestConfig = tree.read('jest.config.ts')?.toString();
|
||||
expect(updatedJestConfig).toMatchInlineSnapshot(`
|
||||
"
|
||||
import { getJestProjectsAsync } from '@nx/jest';
|
||||
|
||||
module.exports = async () => ({
|
||||
projects: await getJestProjectsAsync(),
|
||||
});
|
||||
"
|
||||
`);
|
||||
});
|
||||
|
||||
it('should replace getJestProjects with getJestProjectsAsync with additional properties', async () => {
|
||||
tree.write(
|
||||
'jest.config.ts',
|
||||
`
|
||||
const { getJestProjects } = require('@nx/jest');
|
||||
|
||||
module.exports = {
|
||||
projects: getJestProjects(),
|
||||
filename: __filename,
|
||||
env: process.env,
|
||||
dirname: __dirname
|
||||
};
|
||||
`
|
||||
);
|
||||
await update(tree);
|
||||
const updatedJestConfig = tree.read('jest.config.ts')?.toString();
|
||||
expect(updatedJestConfig).toMatchInlineSnapshot(`
|
||||
"
|
||||
const { getJestProjectsAsync } = require('@nx/jest');
|
||||
|
||||
module.exports = async () => ({
|
||||
projects: await getJestProjectsAsync(),
|
||||
filename: __filename,
|
||||
env: process.env,
|
||||
dirname: __dirname
|
||||
});
|
||||
"
|
||||
`);
|
||||
});
|
||||
|
||||
it('should not update config that are not in supported format', async () => {
|
||||
// Users don't tend to update the root jest config file since it's only meant to be able to run
|
||||
// `jest` command from the root of the repo. If the AST doesn't match what we generate
|
||||
// then bail on the update. Users will still see that `getJestProjects` is deprecated when
|
||||
// viewing the file.
|
||||
tree.write(
|
||||
'jest.config.ts',
|
||||
`
|
||||
import { getJestProjects } from '@nx/jest';
|
||||
|
||||
const obj = {
|
||||
projects: getJestProjects(),
|
||||
};
|
||||
export default obj
|
||||
`
|
||||
);
|
||||
await update(tree);
|
||||
let updatedJestConfig = tree.read('jest.config.ts')?.toString();
|
||||
expect(updatedJestConfig).toMatchInlineSnapshot(`
|
||||
"
|
||||
import { getJestProjects } from '@nx/jest';
|
||||
|
||||
const obj = {
|
||||
projects: getJestProjects(),
|
||||
};
|
||||
export default obj
|
||||
"
|
||||
`);
|
||||
|
||||
tree.write(
|
||||
'jest.config.ts',
|
||||
`
|
||||
const { getJestProjects } = require('@nx/jest');
|
||||
|
||||
const obj = {
|
||||
projects: getJestProjects(),
|
||||
};
|
||||
module.exports = obj;
|
||||
`
|
||||
);
|
||||
await update(tree);
|
||||
updatedJestConfig = tree.read('jest.config.ts')?.toString();
|
||||
expect(updatedJestConfig).toMatchInlineSnapshot(`
|
||||
"
|
||||
const { getJestProjects } = require('@nx/jest');
|
||||
|
||||
const obj = {
|
||||
projects: getJestProjects(),
|
||||
};
|
||||
module.exports = obj;
|
||||
"
|
||||
`);
|
||||
});
|
||||
});
|
||||
@ -0,0 +1,140 @@
|
||||
// go through the jest.config files
|
||||
// see if it imports from @nx/jest and if it uses getJestProjects
|
||||
// replace getJestProjects with getJestProjectsAsync
|
||||
|
||||
import { globAsync, Tree } from '@nx/devkit';
|
||||
import { ensureTypescript } from '@nx/js/src/utils/typescript/ensure-typescript';
|
||||
import {
|
||||
BinaryExpression,
|
||||
ExpressionStatement,
|
||||
ExportAssignment,
|
||||
} from 'typescript';
|
||||
|
||||
let tsModule: typeof import('typescript');
|
||||
|
||||
export default async function update(tree: Tree) {
|
||||
if (!tsModule) {
|
||||
tsModule = ensureTypescript();
|
||||
}
|
||||
|
||||
const jestConfigPaths = await globAsync(tree, [
|
||||
'**/jest.config.{cjs,mjs,js,cts,mts,ts}',
|
||||
]);
|
||||
jestConfigPaths.forEach((jestConfigPath) => {
|
||||
const oldContent = tree.read(jestConfigPath).toString();
|
||||
if (oldContent?.includes('projects: getJestProjects()')) {
|
||||
let sourceFile = tsModule.createSourceFile(
|
||||
jestConfigPath,
|
||||
oldContent,
|
||||
tsModule.ScriptTarget.Latest,
|
||||
true
|
||||
);
|
||||
|
||||
// find `require('@nx/jest')` or `import { getJestProjects } from '@nx/jest`
|
||||
const requireStatement = sourceFile.statements.find(
|
||||
(statement) =>
|
||||
tsModule.isVariableStatement(statement) &&
|
||||
statement.declarationList.declarations.some(
|
||||
(declaration) =>
|
||||
tsModule.isCallExpression(declaration.initializer) &&
|
||||
tsModule.isIdentifier(declaration.initializer.expression) &&
|
||||
declaration.initializer.expression.escapedText === 'require' &&
|
||||
tsModule.isStringLiteral(declaration.initializer.arguments[0]) &&
|
||||
declaration.initializer.arguments[0].text === '@nx/jest'
|
||||
)
|
||||
);
|
||||
const importStatement = sourceFile.statements.find(
|
||||
(statement) =>
|
||||
tsModule.isImportDeclaration(statement) &&
|
||||
statement.moduleSpecifier.getText() === `'@nx/jest'`
|
||||
);
|
||||
if (requireStatement || importStatement) {
|
||||
// find `module.exports` statement with `projects: getJestProjects()`
|
||||
const moduleExports = sourceFile.statements.find(
|
||||
(statement) =>
|
||||
tsModule.isExpressionStatement(statement) &&
|
||||
tsModule.isBinaryExpression(statement.expression) &&
|
||||
tsModule.isPropertyAccessExpression(statement.expression.left) &&
|
||||
tsModule.isObjectLiteralExpression(statement.expression.right) &&
|
||||
statement.expression.operatorToken.kind ===
|
||||
tsModule.SyntaxKind.EqualsToken &&
|
||||
tsModule.isIdentifier(statement.expression.left.expression) &&
|
||||
statement.expression.left.expression.escapedText === 'module' &&
|
||||
tsModule.isIdentifier(statement.expression.left.name) &&
|
||||
statement.expression.left.name.escapedText === 'exports' &&
|
||||
statement.expression.right.properties.some(
|
||||
(property) =>
|
||||
tsModule.isPropertyAssignment(property) &&
|
||||
tsModule.isIdentifier(property.name) &&
|
||||
property.name.escapedText === 'projects' &&
|
||||
tsModule.isCallExpression(property.initializer) &&
|
||||
tsModule.isIdentifier(property.initializer.expression) &&
|
||||
property.initializer.expression.escapedText ===
|
||||
'getJestProjects'
|
||||
)
|
||||
) as ExpressionStatement;
|
||||
|
||||
if (moduleExports) {
|
||||
// replace getJestProjects with getJestProjectsAsync in export statement
|
||||
const rightExpression = (
|
||||
moduleExports.expression as BinaryExpression
|
||||
).right.getText();
|
||||
const newExpression = rightExpression.replace(
|
||||
'getJestProjects()',
|
||||
'await getJestProjectsAsync()'
|
||||
);
|
||||
const newStatement = `module.exports = async () => (${newExpression});`;
|
||||
let newContent = oldContent.replace(
|
||||
moduleExports.getText(),
|
||||
newStatement
|
||||
);
|
||||
|
||||
// replace getJestProjects with getJestProjectsAsync in import statement
|
||||
newContent = newContent.replace(
|
||||
'getJestProjects',
|
||||
'getJestProjectsAsync'
|
||||
);
|
||||
|
||||
tree.write(jestConfigPath, newContent);
|
||||
} else {
|
||||
// find `export default` statement with `projects: getJestProjects()`
|
||||
const exportAssignment = sourceFile.statements.find((statement) =>
|
||||
tsModule.isExportAssignment(statement)
|
||||
) as ExportAssignment;
|
||||
const defaultExport =
|
||||
exportAssignment?.expression &&
|
||||
tsModule.isObjectLiteralExpression(exportAssignment?.expression)
|
||||
? exportAssignment?.expression
|
||||
: null;
|
||||
const projectProperty = defaultExport?.properties.find(
|
||||
(property) =>
|
||||
tsModule.isPropertyAssignment(property) &&
|
||||
property.name.getText() === 'projects' &&
|
||||
tsModule.isCallExpression(property.initializer) &&
|
||||
tsModule.isIdentifier(property.initializer.expression) &&
|
||||
property.initializer.expression.escapedText === 'getJestProjects'
|
||||
);
|
||||
if (projectProperty) {
|
||||
// replace getJestProjects with getJestProjectsAsync in export statement
|
||||
const newExpression = defaultExport
|
||||
.getText()
|
||||
.replace('getJestProjects()', 'await getJestProjectsAsync()');
|
||||
const newStatement = `export default async () => (${newExpression});`;
|
||||
let newContent = oldContent.replace(
|
||||
exportAssignment.getText(),
|
||||
newStatement
|
||||
);
|
||||
|
||||
// replace getJestProjects with getJestProjectsAsync in import statement
|
||||
newContent = newContent.replace(
|
||||
'getJestProjects',
|
||||
'getJestProjectsAsync'
|
||||
);
|
||||
|
||||
tree.write(jestConfigPath, newContent);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
@ -18,72 +18,6 @@ describe('jestConfigObject', () => {
|
||||
foo: 'bar',
|
||||
});
|
||||
});
|
||||
|
||||
xit('should work with async functions', async () => {
|
||||
const tree = createTree();
|
||||
jest.mock('@nx/jest', () => ({
|
||||
getJestProjects: () => ['<rootDir>/project-a', '<rootDir>/project-b'],
|
||||
}));
|
||||
tree.write(
|
||||
'jest.config.js',
|
||||
`
|
||||
const { getJestProjects } = require('@nx/jest');
|
||||
module.exports = async () => ({
|
||||
foo: 'bar'
|
||||
});
|
||||
`
|
||||
);
|
||||
|
||||
expect(await jestConfigObject(tree, 'jest.config.js')).toEqual({
|
||||
foo: 'bar',
|
||||
});
|
||||
});
|
||||
|
||||
it('should work with `getJestConfig`', () => {
|
||||
const tree = createTree();
|
||||
jest.mock('@nx/jest', () => ({
|
||||
getJestProjects: () => ['<rootDir>/project-a', '<rootDir>/project-b'],
|
||||
}));
|
||||
tree.write(
|
||||
'jest.config.js',
|
||||
`
|
||||
const { getJestProjects } = require('@nx/jest');
|
||||
module.exports = {
|
||||
projects: getJestProjects()
|
||||
};
|
||||
`
|
||||
);
|
||||
|
||||
expect(jestConfigObject(tree, 'jest.config.js')).toEqual({
|
||||
projects: ['<rootDir>/project-a', '<rootDir>/project-b'],
|
||||
});
|
||||
});
|
||||
|
||||
it('should work with node globals (require, __dirname, process, __filename, console, and other globals)', () => {
|
||||
const tree = createTree();
|
||||
jest.mock('@nx/jest', () => ({
|
||||
getJestProjects: () => ['<rootDir>/project-a', '<rootDir>/project-b'],
|
||||
}));
|
||||
tree.write(
|
||||
'jest.config.js',
|
||||
`
|
||||
const { getJestProjects } = require('@nx/jest');
|
||||
module.exports = {
|
||||
projects: getJestProjects(),
|
||||
filename: __filename,
|
||||
env: process.env,
|
||||
dirname: __dirname
|
||||
};
|
||||
`
|
||||
);
|
||||
|
||||
expect(jestConfigObject(tree, 'jest.config.js')).toEqual({
|
||||
dirname: '/virtual',
|
||||
filename: '/virtual/jest.config.js',
|
||||
env: process.env,
|
||||
projects: ['<rootDir>/project-a', '<rootDir>/project-b'],
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe('export default', () => {
|
||||
|
||||
@ -1,190 +1,6 @@
|
||||
import type {
|
||||
ProjectConfiguration,
|
||||
ProjectGraph,
|
||||
WorkspaceJsonConfiguration,
|
||||
} from '@nx/devkit';
|
||||
import type { ProjectConfiguration, ProjectGraph } from '@nx/devkit';
|
||||
import * as devkit from '@nx/devkit';
|
||||
import * as Workspace from 'nx/src/project-graph/file-utils';
|
||||
import { getJestProjects, getJestProjectsAsync } from './get-jest-projects';
|
||||
|
||||
describe('getJestProjects', () => {
|
||||
test('single project', () => {
|
||||
const mockedWorkspaceConfig: WorkspaceJsonConfiguration = {
|
||||
projects: {
|
||||
'test-1': {
|
||||
root: 'blah',
|
||||
targets: {
|
||||
test: {
|
||||
executor: '@nx/jest:jest',
|
||||
options: {
|
||||
jestConfig: 'test/jest/config/location/jest.config.js',
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
version: 1,
|
||||
};
|
||||
jest
|
||||
.spyOn(Workspace, 'readWorkspaceConfig')
|
||||
.mockImplementation(() => mockedWorkspaceConfig);
|
||||
const expectedResults = [
|
||||
'<rootDir>/test/jest/config/location/jest.config.js',
|
||||
];
|
||||
expect(getJestProjects()).toEqual(expectedResults);
|
||||
});
|
||||
|
||||
test('custom target name', () => {
|
||||
const mockedWorkspaceConfig: WorkspaceJsonConfiguration = {
|
||||
projects: {
|
||||
'test-1': {
|
||||
root: 'blah',
|
||||
targets: {
|
||||
'test-with-jest': {
|
||||
executor: '@nx/jest:jest',
|
||||
options: {
|
||||
jestConfig: 'test/jest/config/location/jest.config.js',
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
version: 1,
|
||||
};
|
||||
jest
|
||||
.spyOn(Workspace, 'readWorkspaceConfig')
|
||||
.mockImplementation(() => mockedWorkspaceConfig);
|
||||
const expectedResults = [
|
||||
'<rootDir>/test/jest/config/location/jest.config.js',
|
||||
];
|
||||
expect(getJestProjects()).toEqual(expectedResults);
|
||||
});
|
||||
|
||||
test('root project', () => {
|
||||
const mockedWorkspaceConfig: WorkspaceJsonConfiguration = {
|
||||
projects: {
|
||||
'test-1': {
|
||||
root: '.',
|
||||
targets: {
|
||||
test: {
|
||||
executor: '@nx/jest:jest',
|
||||
options: {
|
||||
jestConfig: 'jest.config.app.js',
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
version: 1,
|
||||
};
|
||||
jest
|
||||
.spyOn(Workspace, 'readWorkspaceConfig')
|
||||
.mockImplementation(() => mockedWorkspaceConfig);
|
||||
const expectedResults = ['<rootDir>/jest.config.app.js'];
|
||||
expect(getJestProjects()).toEqual(expectedResults);
|
||||
});
|
||||
|
||||
test('configuration set with unique jestConfig', () => {
|
||||
const mockedWorkspaceConfig: WorkspaceJsonConfiguration = {
|
||||
projects: {
|
||||
test: {
|
||||
root: 'blah',
|
||||
targets: {
|
||||
'test-with-jest': {
|
||||
executor: '@nx/jest:jest',
|
||||
options: {
|
||||
jestConfig: 'test/jest/config/location/jest.config.js',
|
||||
},
|
||||
configurations: {
|
||||
prod: {
|
||||
jestConfig: 'configuration-specific/jest.config.js',
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
version: 1,
|
||||
};
|
||||
jest
|
||||
.spyOn(Workspace, 'readWorkspaceConfig')
|
||||
.mockImplementation(() => mockedWorkspaceConfig);
|
||||
const expectedResults = [
|
||||
'<rootDir>/test/jest/config/location/jest.config.js',
|
||||
'<rootDir>/configuration-specific/jest.config.js',
|
||||
];
|
||||
expect(getJestProjects()).toEqual(expectedResults);
|
||||
});
|
||||
|
||||
test('configuration, set with same jestConfig on configuration', () => {
|
||||
const mockedWorkspaceConfig: WorkspaceJsonConfiguration = {
|
||||
projects: {
|
||||
test: {
|
||||
root: 'blah',
|
||||
targets: {
|
||||
'test-with-jest': {
|
||||
executor: '@nx/jest:jest',
|
||||
options: {
|
||||
jestConfig: 'test/jest/config/location/jest.config.js',
|
||||
},
|
||||
configurations: {
|
||||
prod: {
|
||||
jestConfig: 'test/jest/config/location/jest.config.js',
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
version: 1,
|
||||
};
|
||||
jest
|
||||
.spyOn(Workspace, 'readWorkspaceConfig')
|
||||
.mockImplementation(() => mockedWorkspaceConfig);
|
||||
const expectedResults = [
|
||||
'<rootDir>/test/jest/config/location/jest.config.js',
|
||||
];
|
||||
expect(getJestProjects()).toEqual(expectedResults);
|
||||
});
|
||||
|
||||
test('other projects and targets that do not use the nx jest test runner', () => {
|
||||
const mockedWorkspaceConfig: WorkspaceJsonConfiguration = {
|
||||
projects: {
|
||||
otherTarget: {
|
||||
root: 'test',
|
||||
targets: {
|
||||
test: {
|
||||
executor: 'something else',
|
||||
options: {},
|
||||
},
|
||||
},
|
||||
},
|
||||
test: {
|
||||
root: 'blah',
|
||||
targets: {
|
||||
'test-with-jest': {
|
||||
executor: 'something else',
|
||||
options: {
|
||||
jestConfig: 'something random',
|
||||
},
|
||||
configurations: {
|
||||
prod: {
|
||||
jestConfig: 'configuration-specific/jest.config.js',
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
version: 1,
|
||||
};
|
||||
jest
|
||||
.spyOn(Workspace, 'readWorkspaceConfig')
|
||||
.mockImplementation(() => mockedWorkspaceConfig);
|
||||
const expectedResults = [];
|
||||
expect(getJestProjects()).toEqual(expectedResults);
|
||||
});
|
||||
});
|
||||
import { getJestProjectsAsync } from './get-jest-projects';
|
||||
|
||||
describe('getJestProjectsAsync', () => {
|
||||
let projectGraph: ProjectGraph;
|
||||
|
||||
@ -1,9 +1,4 @@
|
||||
import {
|
||||
createProjectGraphAsync,
|
||||
type ProjectsConfigurations,
|
||||
type TargetConfiguration,
|
||||
} from '@nx/devkit';
|
||||
import { readWorkspaceConfig } from 'nx/src/project-graph/file-utils';
|
||||
import { createProjectGraphAsync, type TargetConfiguration } from '@nx/devkit';
|
||||
import { join, parse } from 'path';
|
||||
import * as yargs from 'yargs-parser';
|
||||
|
||||
@ -11,72 +6,6 @@ function getJestConfigProjectPath(projectJestConfigPath: string): string {
|
||||
return join('<rootDir>', projectJestConfigPath);
|
||||
}
|
||||
|
||||
/**
|
||||
* TODO(v21): Remove this function
|
||||
* @deprecated To get projects use {@link getJestProjectsAsync} instead. This will be removed in v21.
|
||||
* Get a list of paths to all the jest config files
|
||||
* using the Nx Jest executor.
|
||||
*
|
||||
* This is used to configure Jest multi-project support. To support projects
|
||||
* using inferred targets @see getJestProjectsAsync
|
||||
*
|
||||
* To add a project not using the Nx Jest executor:
|
||||
* export default {
|
||||
* projects: [...getJestProjects(), '<rootDir>/path/to/jest.config.ts'];
|
||||
* }
|
||||
*
|
||||
**/
|
||||
export function getJestProjects() {
|
||||
const ws = readWorkspaceConfig({
|
||||
format: 'nx',
|
||||
}) as ProjectsConfigurations;
|
||||
const jestConfigurationSet = new Set<string>();
|
||||
for (const projectConfig of Object.values(ws.projects)) {
|
||||
if (!projectConfig.targets) {
|
||||
continue;
|
||||
}
|
||||
for (const targetConfiguration of Object.values(projectConfig.targets)) {
|
||||
if (
|
||||
targetConfiguration.executor !== '@nx/jest:jest' &&
|
||||
targetConfiguration.executor !== '@nrwl/jest:jest'
|
||||
) {
|
||||
continue;
|
||||
}
|
||||
if (targetConfiguration.options?.jestConfig) {
|
||||
jestConfigurationSet.add(
|
||||
getJestConfigProjectPath(targetConfiguration.options.jestConfig)
|
||||
);
|
||||
}
|
||||
if (targetConfiguration.configurations) {
|
||||
for (const configurationObject of Object.values(
|
||||
targetConfiguration.configurations
|
||||
)) {
|
||||
if (configurationObject.jestConfig) {
|
||||
jestConfigurationSet.add(
|
||||
getJestConfigProjectPath(configurationObject.jestConfig)
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return Array.from(jestConfigurationSet);
|
||||
}
|
||||
|
||||
/**
|
||||
* a list of nested projects that have jest configured
|
||||
* to be used in the testPathIgnorePatterns property of a given jest config
|
||||
* https://jestjs.io/docs/configuration#testpathignorepatterns-arraystring
|
||||
* */
|
||||
export function getNestedJestProjects() {
|
||||
// TODO(caleb): get current project path and list of all projects and their rootDir
|
||||
// return a list of all projects that are nested in the current projects path
|
||||
// always include node_modules as that's the default
|
||||
|
||||
const allProjects = getJestProjects();
|
||||
return ['/node_modules/'];
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a list of paths to all the jest config files
|
||||
* using the Nx Jest executor and `@nx/run:commands`
|
||||
|
||||
@ -143,7 +143,7 @@ describe('updateJestConfig', () => {
|
||||
expect(rootJestConfigAfter).toContain('getJestProjectsAsync()');
|
||||
});
|
||||
|
||||
it('updates the root config if not using `getJestProjects()`', async () => {
|
||||
it('updates the root config if not using `getJestProjectsAsync()`', async () => {
|
||||
const rootJestConfigPath = '/jest.config.ts';
|
||||
await libraryGenerator(tree, {
|
||||
name: 'some-test-dir-my-source',
|
||||
@ -180,7 +180,7 @@ describe('updateJestConfig', () => {
|
||||
);
|
||||
});
|
||||
|
||||
it('updates the root config if `getJestProjects()` is used but old path exists', async () => {
|
||||
it('updates the root config if `getJestProjectsAsync()` is used but old path exists', async () => {
|
||||
const rootJestConfigPath = '/jest.config.ts';
|
||||
await libraryGenerator(tree, {
|
||||
name: 'some-test-dir-my-source',
|
||||
@ -188,11 +188,11 @@ describe('updateJestConfig', () => {
|
||||
});
|
||||
tree.write(
|
||||
rootJestConfigPath,
|
||||
`const { getJestProjects } = require('@nx/jest');
|
||||
`const { getJestProjectsAsync } = require('@nx/jest');
|
||||
|
||||
module.exports = {
|
||||
projects: [...getJestProjects(), '<rootDir>/some/test/dir/my-source']
|
||||
};
|
||||
module.exports = async () => ({
|
||||
projects: [...(await getJestProjectsAsync()), '<rootDir>/some/test/dir/my-source']
|
||||
});
|
||||
`
|
||||
);
|
||||
const projectConfig = readProjectConfiguration(
|
||||
@ -217,10 +217,10 @@ module.exports = {
|
||||
expect(rootJestConfigAfter).not.toContain(
|
||||
'<rootDir>/other/test/dir/my-destination'
|
||||
);
|
||||
expect(rootJestConfigAfter).toContain('getJestProjects()');
|
||||
expect(rootJestConfigAfter).toContain('getJestProjectsAsync()');
|
||||
});
|
||||
|
||||
it('updates the root config if `getJestProjects()` is used with other projects in the array', async () => {
|
||||
it('updates the root config if `getJestProjectsAsync()` is used with other projects in the array', async () => {
|
||||
const rootJestConfigPath = '/jest.config.ts';
|
||||
await libraryGenerator(tree, {
|
||||
name: 'some-test-dir-my-source',
|
||||
@ -228,11 +228,11 @@ module.exports = {
|
||||
});
|
||||
tree.write(
|
||||
rootJestConfigPath,
|
||||
`const { getJestProjects } = require('@nx/jest');
|
||||
`const { getJestProjectsAsync } = require('@nx/jest');
|
||||
|
||||
module.exports = {
|
||||
projects: [...getJestProjects(), '<rootDir>/some/test/dir/my-source', '<rootDir>/foo']
|
||||
};
|
||||
module.exports = async () => ({
|
||||
projects: [...(await getJestProjectsAsync()), '<rootDir>/some/test/dir/my-source', '<rootDir>/foo']
|
||||
});
|
||||
`
|
||||
);
|
||||
const projectConfig = readProjectConfiguration(
|
||||
@ -258,6 +258,6 @@ module.exports = {
|
||||
'<rootDir>/other/test/dir/my-destination'
|
||||
);
|
||||
expect(rootJestConfigAfter).toContain('<rootDir>/foo');
|
||||
expect(rootJestConfigAfter).toContain('getJestProjects()');
|
||||
expect(rootJestConfigAfter).toContain('getJestProjectsAsync()');
|
||||
});
|
||||
});
|
||||
|
||||
@ -68,9 +68,9 @@ export function updateJestConfig(
|
||||
const findProject = `'<rootDir>/${project.root}'`;
|
||||
|
||||
const oldRootJestConfigContent = tree.read(rootJestConfigPath, 'utf-8');
|
||||
const usingJestProjects =
|
||||
oldRootJestConfigContent.includes('getJestProjects()') ||
|
||||
oldRootJestConfigContent.includes('getJestProjectsAsync()');
|
||||
const usingJestProjects = oldRootJestConfigContent.includes(
|
||||
'getJestProjectsAsync()'
|
||||
);
|
||||
|
||||
const newRootJestConfigContent = oldRootJestConfigContent.replace(
|
||||
findProject,
|
||||
|
||||
@ -26,10 +26,7 @@ function isUsingUtilityFunction(host: Tree) {
|
||||
|
||||
const rootConfig = host.read(rootConfigPath, 'utf-8');
|
||||
|
||||
return (
|
||||
rootConfig.includes('getJestProjects()') ||
|
||||
rootConfig.includes('getJestProjectsAsync()')
|
||||
);
|
||||
return rootConfig.includes('getJestProjectsAsync()');
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user