diff --git a/packages/instrumenter/src/mutators/string-literal-mutator.ts b/packages/instrumenter/src/mutators/string-literal-mutator.ts index 0534ecc158..0c1dd215bc 100644 --- a/packages/instrumenter/src/mutators/string-literal-mutator.ts +++ b/packages/instrumenter/src/mutators/string-literal-mutator.ts @@ -31,6 +31,7 @@ function isValidParent(child: NodePath): boolean { types.isObjectMethod(parent) || (types.isObjectProperty(parent) && parent.key === child.node) || (types.isClassProperty(parent) && parent.key === child.node) || - (types.isCallExpression(parent) && types.isIdentifier(parent.callee, { name: 'require' })) + (types.isCallExpression(parent) && types.isIdentifier(parent.callee, { name: 'require' })) || + (types.isCallExpression(parent) && types.isIdentifier(parent.callee, { name: 'Symbol' })) ); } diff --git a/packages/instrumenter/test/unit/mutators/string-literal-mutator.spec.ts b/packages/instrumenter/test/unit/mutators/string-literal-mutator.spec.ts index 6ae5090752..fd12ec05e3 100644 --- a/packages/instrumenter/test/unit/mutators/string-literal-mutator.spec.ts +++ b/packages/instrumenter/test/unit/mutators/string-literal-mutator.spec.ts @@ -39,6 +39,20 @@ describe(sut.name, () => { expectJSMutation(sut, '"use strict";"use asm";'); expectJSMutation(sut, 'function a() {"use strict";"use asm";}'); }); + + it('should not mutate string literals in symbols with descriptions', () => { + expectJSMutation(sut, "const a = Symbol('foo');"); + expectJSMutation(sut, 'const a = Symbol("foo");'); + }); + + it('should not mutate symbols without description', () => { + expectJSMutation(sut, 'const a = Symbol();'); + }); + + it('should mutate template literals in symbols with descriptions', () => { + expectJSMutation(sut, 'const a = Symbol(`foo`);', 'const a = Symbol(``);'); + expectJSMutation(sut, "const a = Symbol('foo' + 'bar');", 'const a = Symbol(\'foo\' + "");', 'const a = Symbol("" + \'bar\');'); + }); }); describe('imports/exports', () => {