Skip to content

Commit c772a92

Browse files
committed
Resolve identifiers and correctly use string/number literals
1 parent 89c7daf commit c772a92

File tree

2 files changed

+55
-14
lines changed

2 files changed

+55
-14
lines changed

src/utils/__tests__/getPropertyName-test.js

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,18 @@
88
*
99
*/
1010

11+
import { parse, expression } from '../../../tests/utils';
12+
1113
describe('getPropertyName', () => {
1214
let getPropertyName;
13-
let expression;
15+
16+
function parsePath(src) {
17+
const root = parse(src.trim());
18+
return root.get('body', root.node.body.length - 1, 'expression');
19+
}
1420

1521
beforeEach(() => {
1622
getPropertyName = require('../getPropertyName').default;
17-
({ expression } = require('../../../tests/utils'));
1823
});
1924

2025
it('returns the name for a normal property', () => {
@@ -42,14 +47,14 @@ describe('getPropertyName', () => {
4247
const def = expression('{ ["foo"]: 21 }');
4348
const param = def.get('properties', 0);
4449

45-
expect(getPropertyName(param)).toBe('@computed#foo');
50+
expect(getPropertyName(param)).toBe('foo');
4651
});
4752

4853
it('creates name for computed properties from int', () => {
4954
const def = expression('{ [31]: 21 }');
5055
const param = def.get('properties', 0);
5156

52-
expect(getPropertyName(param)).toBe('@computed#31');
57+
expect(getPropertyName(param)).toBe('31');
5358
});
5459

5560
it('returns null for computed properties from regex', () => {
@@ -65,4 +70,26 @@ describe('getPropertyName', () => {
6570

6671
expect(getPropertyName(param)).toBe(null);
6772
});
73+
74+
it('resolves simple variables', () => {
75+
const def = parsePath(`
76+
const foo = "name";
77+
78+
({ [foo]: 21 });
79+
`);
80+
const param = def.get('properties', 0);
81+
82+
expect(getPropertyName(param)).toBe('name');
83+
});
84+
85+
it('resolves simple member expressions', () => {
86+
const def = parsePath(`
87+
const a = { foo: "name" };
88+
89+
({ [a.foo]: 21 });
90+
`);
91+
const param = def.get('properties', 0);
92+
93+
expect(getPropertyName(param)).toBe('name');
94+
});
6895
});

src/utils/getPropertyName.js

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
import recast from 'recast';
1111
import getNameOrValue from './getNameOrValue';
12+
import resolveToValue from './resolveToValue';
1213

1314
const {
1415
types: { namedTypes: types },
@@ -25,17 +26,30 @@ export default function getPropertyName(propertyPath: NodePath): ?string {
2526
if (types.ObjectTypeSpreadProperty.check(propertyPath.node)) {
2627
return getNameOrValue(propertyPath.get('argument').get('id'), false);
2728
} else if (propertyPath.node.computed) {
28-
if (types.Identifier.check(propertyPath.node.key)) {
29-
return `${COMPUTED_PREFIX}${getNameOrValue(
30-
propertyPath.get('key'),
31-
false,
32-
)}`;
33-
} else if (
34-
types.Literal.check(propertyPath.node.key) &&
35-
(typeof propertyPath.node.key.value === 'string' ||
36-
typeof propertyPath.node.key.value === 'number')
29+
const key = propertyPath.get('key');
30+
31+
// Try to resolve variables and member expressions
32+
if (types.Identifier.check(key.node) || types.MemberExpression.check(key.node)) {
33+
const value = resolveToValue(key).node;
34+
35+
if (
36+
types.Literal.check(value) &&
37+
(typeof value.value === 'string' || typeof value.value === 'number')
38+
) {
39+
return `${value.value}`;
40+
}
41+
}
42+
43+
// generate name for identifier
44+
if (types.Identifier.check(key.node)) {
45+
return `${COMPUTED_PREFIX}${key.node.name}`;
46+
}
47+
48+
if (
49+
types.Literal.check(key.node) &&
50+
(typeof key.node.value === 'string' || typeof key.node.value === 'number')
3751
) {
38-
return `${COMPUTED_PREFIX}${propertyPath.node.key.value}`;
52+
return `${key.node.value}`;
3953
}
4054

4155
return null;

0 commit comments

Comments
 (0)