Skip to content

Commit 72dd0a8

Browse files
authored
feat(jasmine): also replace jasmine.Spy/SpyObj on nested types (#613)
* feat(jasmine): also replace jasmine.Spy/SpyObj on nested types * feat(jasmine): also replace jasmine.Spy/SpyObj on nested types
1 parent e0c97cd commit 72dd0a8

File tree

2 files changed

+29
-40
lines changed

2 files changed

+29
-40
lines changed

src/transformers/jasmine-globals.test.ts

+6
Original file line numberDiff line numberDiff line change
@@ -444,11 +444,17 @@ describe('types', () => {
444444
let setLanguageSpy: jasmine.Spy;
445445
let logSpy: jasmine.Spy<(message: string) => void>;
446446
const handleErrorSpy: jasmine.Spy<ErrorHandler['handleError']> = jasmine.createSpy();
447+
let translateMock: { translate: jasmine.Spy };
448+
class Foo { something: jasmine.Spy<(value: string) => void>; }
449+
type MySpy = jasmine.Spy<(value: string) => void>;
447450
`,
448451
`
449452
let setLanguageSpy: jest.Mock;
450453
let logSpy: jest.Mock<(message: string) => void>;
451454
const handleErrorSpy: jest.Mock<ErrorHandler['handleError']> = jest.fn();
455+
let translateMock: { translate: jest.Mock };
456+
class Foo { something: jest.Mock<(value: string) => void>; }
457+
type MySpy = jest.Mock<(value: string) => void>;
452458
`,
453459
{ parser: 'ts' }
454460
))

src/transformers/jasmine-globals.ts

+23-40
Original file line numberDiff line numberDiff line change
@@ -685,47 +685,30 @@ export default function jasmineGlobals(fileInfo, api, options) {
685685
j(path).replaceWith(j.objectExpression(properties))
686686
})
687687

688-
root
689-
.find(j.VariableDeclarator)
690-
.filter((path) => {
691-
const { typeAnnotation } = path.value.id
692-
if (!typeAnnotation) return false
693-
694-
const { typeName } = typeAnnotation.typeAnnotation
688+
const isJasmineSpyType = (typeAnnotation) =>
689+
typeAnnotation &&
690+
typeAnnotation.type === 'TSTypeReference' &&
691+
typeAnnotation.typeName.type === 'TSQualifiedName' &&
692+
typeAnnotation.typeName.left.name === 'jasmine' &&
693+
(typeAnnotation.typeName.right.name === 'Spy' ||
694+
typeAnnotation.typeName.right.name === 'SpyObj')
695+
696+
const transformJasmineTypeToJest = (type) => {
697+
if (!type) return type
698+
699+
const typeArgument = type.typeParameters?.params[0]
700+
const jestType = type.typeName.right.name === 'Spy' ? 'Mock' : 'Mocked'
701+
702+
return j.tsTypeReference(
703+
j.tsQualifiedName(j.identifier('jest'), j.identifier(jestType)),
704+
typeArgument ? j.tsTypeParameterInstantiation([typeArgument]) : null
705+
)
706+
}
695707

696-
return (
697-
typeName &&
698-
typeName.type === 'TSQualifiedName' &&
699-
typeName.left.name === 'jasmine' &&
700-
(typeName.right.name === 'Spy' || typeName.right.name === 'SpyObj')
701-
)
702-
})
703-
.forEach((path) => {
704-
const { typeAnnotation } = path.value.id
705-
const { typeName } = typeAnnotation.typeAnnotation
706-
const typeArgument = typeAnnotation.typeAnnotation.typeParameters?.params[0]
707-
708-
switch (typeName.right.name) {
709-
case 'Spy': {
710-
path.value.id.typeAnnotation = j.tsTypeAnnotation(
711-
j.tsTypeReference(
712-
j.tsQualifiedName(j.identifier('jest'), j.identifier('Mock')),
713-
typeArgument ? j.tsTypeParameterInstantiation([typeArgument]) : null
714-
)
715-
)
716-
break
717-
}
718-
case 'SpyObj': {
719-
path.value.id.typeAnnotation = j.tsTypeAnnotation(
720-
j.tsTypeReference(
721-
j.tsQualifiedName(j.identifier('jest'), j.identifier('Mocked')),
722-
j.tsTypeParameterInstantiation([typeArgument])
723-
)
724-
)
725-
break
726-
}
727-
}
728-
})
708+
root
709+
.find(j.TSTypeReference)
710+
.filter((path) => isJasmineSpyType(path.value))
711+
.forEach((path) => path.replace(transformJasmineTypeToJest(path.value)))
729712

730713
root
731714
.find(j.CallExpression, {

0 commit comments

Comments
 (0)