Skip to content

Commit e7d955b

Browse files
committed
feat(@schematics/angular): add matcher transformations to jasmine-to-vitest schematic
This commit adds transformers for a wide range of Jasmine matchers. Coverage includes: - Syntactic sugar matchers (toBeTrue, toHaveSize, etc.) - Asymmetric matchers (jasmine.any, jasmine.objectContaining) - Async matchers (expectAsync) - Complex structural rewrites for matchers like 'toHaveBeenCalledOnceWith' and 'arrayWithExactContents'.
1 parent b429af4 commit e7d955b

File tree

4 files changed

+1046
-2
lines changed

4 files changed

+1046
-2
lines changed

packages/schematics/angular/refactor/jasmine-vitest/test-file-transformer.ts

Lines changed: 40 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,18 @@ import {
1212
transformFocusedAndSkippedTests,
1313
transformPending,
1414
} from './transformers/jasmine-lifecycle';
15+
import {
16+
transformArrayWithExactContents,
17+
transformAsymmetricMatchers,
18+
transformCalledOnceWith,
19+
transformComplexMatchers,
20+
transformExpectAsync,
21+
transformExpectNothing,
22+
transformSyntacticSugarMatchers,
23+
transformToHaveClass,
24+
transformWithContext,
25+
transformtoHaveBeenCalledBefore,
26+
} from './transformers/jasmine-matcher';
1527
import { RefactorContext } from './utils/refactor-context';
1628
import { RefactorReporter } from './utils/refactor-reporter';
1729

@@ -48,29 +60,55 @@ export function transformJasmineToVitest(
4860
// Transform the node itself based on its type
4961
if (ts.isCallExpression(transformedNode)) {
5062
const transformations = [
63+
transformWithContext,
64+
transformExpectAsync,
65+
transformSyntacticSugarMatchers,
5166
transformFocusedAndSkippedTests,
67+
transformComplexMatchers,
5268
transformPending,
5369
transformDoneCallback,
70+
transformtoHaveBeenCalledBefore,
71+
transformToHaveClass,
5472
];
5573

5674
for (const transformer of transformations) {
5775
transformedNode = transformer(transformedNode, refactorCtx);
5876
}
77+
} else if (ts.isPropertyAccessExpression(transformedNode)) {
78+
const transformations = [transformAsymmetricMatchers];
79+
80+
for (const transformer of transformations) {
81+
transformedNode = transformer(transformedNode, refactorCtx);
82+
}
83+
} else if (ts.isExpressionStatement(transformedNode)) {
84+
const statementTransformers = [
85+
transformCalledOnceWith,
86+
transformArrayWithExactContents,
87+
transformExpectNothing,
88+
];
89+
90+
for (const transformer of statementTransformers) {
91+
const result = transformer(transformedNode, refactorCtx);
92+
if (result !== transformedNode) {
93+
transformedNode = result;
94+
break;
95+
}
96+
}
5997
}
6098

6199
// Visit the children of the node to ensure they are transformed
62100
if (Array.isArray(transformedNode)) {
63101
return transformedNode.map((node) => ts.visitEachChild(node, visitor, context));
64102
} else {
65-
return ts.visitEachChild(transformedNode, visitor, context);
103+
return ts.visitEachChild(transformedNode as ts.Node, visitor, context);
66104
}
67105
};
68106

69107
return (node) => ts.visitNode(node, visitor) as ts.SourceFile;
70108
};
71109

72110
const result = ts.transform(sourceFile, [transformer]);
73-
if (result.transformed[0] === sourceFile) {
111+
if (result.transformed[0] === sourceFile && !reporter.hasTodos) {
74112
return content;
75113
}
76114

0 commit comments

Comments
 (0)