@@ -29,34 +29,57 @@ function isObjectKeysCall(node: ASTNode): boolean {
29
29
) ;
30
30
}
31
31
32
- export function resolveObjectExpressionToNameArray (
33
- objectExpression : NodePath ,
32
+ function isWhitelistedObjectProperty ( prop ) {
33
+ return (
34
+ ( types . Property . check ( prop ) &&
35
+ ( ( types . Identifier . check ( prop . key ) && ! prop . computed ) ||
36
+ types . Literal . check ( prop . key ) ) ) ||
37
+ types . SpreadElement . check ( prop )
38
+ ) ;
39
+ }
40
+
41
+ function isWhiteListedObjectTypeProperty ( prop ) {
42
+ return (
43
+ types . ObjectTypeProperty . check ( prop ) ||
44
+ types . ObjectTypeSpreadProperty . check ( prop )
45
+ ) ;
46
+ }
47
+
48
+ // Resolves an ObjectExpression or an ObjectTypeAnnotation
49
+ export function resolveObjectToNameArray (
50
+ object : NodePath ,
34
51
raw : boolean = false ,
35
52
) : ?Array < string > {
36
53
if (
37
- types . ObjectExpression . check ( objectExpression . value ) &&
38
- objectExpression . value . properties . every (
39
- prop =>
40
- ( types . Property . check ( prop ) &&
41
- ( ( types . Identifier . check ( prop . key ) && ! prop . computed ) ||
42
- types . Literal . check ( prop . key ) ) ) ||
43
- types . SpreadElement . check ( prop ) ,
44
- )
54
+ ( types . ObjectExpression . check ( object . value ) &&
55
+ object . value . properties . every ( isWhitelistedObjectProperty ) ) ||
56
+ ( types . ObjectTypeAnnotation . check ( object . value ) &&
57
+ object . value . properties . every ( isWhiteListedObjectTypeProperty ) )
45
58
) {
46
59
let values = [ ] ;
47
60
let error = false ;
48
- objectExpression . get ( 'properties' ) . each ( propPath => {
61
+ object . get ( 'properties' ) . each ( propPath => {
49
62
if ( error ) return ;
50
63
const prop = propPath . value ;
51
64
52
- if ( types . Property . check ( prop ) ) {
65
+ if ( types . Property . check ( prop ) || types . ObjectTypeProperty . check ( prop ) ) {
53
66
// Key is either Identifier or Literal
54
67
const name = prop . key . name || ( raw ? prop . key . raw : prop . key . value ) ;
55
68
56
69
values . push ( name ) ;
57
- } else if ( types . SpreadElement . check ( prop ) ) {
58
- const spreadObject = resolveToValue ( propPath . get ( 'argument' ) ) ;
59
- const spreadValues = resolveObjectExpressionToNameArray ( spreadObject ) ;
70
+ } else if (
71
+ types . SpreadElement . check ( prop ) ||
72
+ types . ObjectTypeSpreadProperty . check ( prop )
73
+ ) {
74
+ let spreadObject = resolveToValue ( propPath . get ( 'argument' ) ) ;
75
+ if ( types . GenericTypeAnnotation . check ( spreadObject . value ) ) {
76
+ const typeAlias = resolveToValue ( spreadObject . get ( 'id' ) ) ;
77
+ if ( types . ObjectTypeAnnotation . check ( typeAlias . get ( 'right' ) . value ) ) {
78
+ spreadObject = resolveToValue ( typeAlias . get ( 'right' ) ) ;
79
+ }
80
+ }
81
+
82
+ const spreadValues = resolveObjectToNameArray ( spreadObject ) ;
60
83
if ( ! spreadValues ) {
61
84
error = true ;
62
85
return ;
@@ -87,7 +110,7 @@ export default function resolveObjectKeysToArray(path: NodePath): ?NodePath {
87
110
88
111
if ( isObjectKeysCall ( node ) ) {
89
112
const objectExpression = resolveToValue ( path . get ( 'arguments' ) . get ( 0 ) ) ;
90
- const values = resolveObjectExpressionToNameArray ( objectExpression ) ;
113
+ const values = resolveObjectToNameArray ( objectExpression ) ;
91
114
92
115
if ( values ) {
93
116
const nodes = values
0 commit comments