Skip to content

Commit deab6e8

Browse files
committed
refactor(codegen): add emitObjectProp in parser primitives
1 parent b03c5af commit deab6e8

File tree

4 files changed

+140
-24
lines changed

4 files changed

+140
-24
lines changed

packages/react-native-codegen/src/parsers/__tests__/parsers-primitives-test.js

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,12 +42,14 @@ const {
4242
typeEnumResolution,
4343
Visitor,
4444
emitStringProp,
45+
emitObjectProp,
4546
} = require('../parsers-primitives.js');
4647
const {MockedParser} = require('../parserMock');
4748
const {emitUnion} = require('../parsers-primitives');
4849
const {UnsupportedUnionTypeAnnotationParserError} = require('../errors');
4950
const {FlowParser} = require('../flow/parser');
5051
const {TypeScriptParser} = require('../typescript/parser');
52+
const {extractArrayElementType} = require('../flow/components/events');
5153

5254
const parser = new MockedParser();
5355
const flowParser = new FlowParser();
@@ -1671,3 +1673,106 @@ describe('emitBoolProp', () => {
16711673
});
16721674
});
16731675
});
1676+
1677+
describe('emitObjectProp', () => {
1678+
const name = 'someProp';
1679+
describe('when property is optional', () => {
1680+
it('returns optional Object Prop', () => {
1681+
const typeAnnotation = {
1682+
type: 'GenericTypeAnnotation',
1683+
id: {
1684+
name: 'ObjectTypeAnnotation',
1685+
},
1686+
properties: [
1687+
{
1688+
key: {
1689+
name: 'someKey',
1690+
},
1691+
optional: true,
1692+
value: {
1693+
type: 'StringTypeAnnotation',
1694+
typeAnnotation: {
1695+
type: 'StringTypeAnnotation',
1696+
},
1697+
},
1698+
},
1699+
],
1700+
};
1701+
const result = emitObjectProp(
1702+
name,
1703+
true,
1704+
flowParser,
1705+
typeAnnotation,
1706+
extractArrayElementType,
1707+
);
1708+
const expected = {
1709+
name: 'someProp',
1710+
optional: true,
1711+
typeAnnotation: {
1712+
properties: [
1713+
{
1714+
name: 'someKey',
1715+
optional: true,
1716+
typeAnnotation: {
1717+
type: 'StringTypeAnnotation',
1718+
},
1719+
},
1720+
],
1721+
type: 'ObjectTypeAnnotation',
1722+
},
1723+
};
1724+
1725+
expect(result).toEqual(expected);
1726+
});
1727+
});
1728+
1729+
describe('when property is required', () => {
1730+
it('returns required Object Prop', () => {
1731+
const typeAnnotation = {
1732+
type: 'GenericTypeAnnotation',
1733+
id: {
1734+
name: 'ObjectTypeAnnotation',
1735+
},
1736+
properties: [
1737+
{
1738+
key: {
1739+
name: 'someKey',
1740+
},
1741+
optional: false,
1742+
value: {
1743+
type: 'StringTypeAnnotation',
1744+
typeAnnotation: {
1745+
type: 'StringTypeAnnotation',
1746+
},
1747+
},
1748+
},
1749+
],
1750+
};
1751+
const result = emitObjectProp(
1752+
name,
1753+
false,
1754+
flowParser,
1755+
typeAnnotation,
1756+
extractArrayElementType,
1757+
);
1758+
const expected = {
1759+
name: 'someProp',
1760+
optional: false,
1761+
typeAnnotation: {
1762+
properties: [
1763+
{
1764+
name: 'someKey',
1765+
optional: false,
1766+
typeAnnotation: {
1767+
type: 'StringTypeAnnotation',
1768+
},
1769+
},
1770+
],
1771+
type: 'ObjectTypeAnnotation',
1772+
},
1773+
};
1774+
1775+
expect(result).toEqual(expected);
1776+
});
1777+
});
1778+
});

packages/react-native-codegen/src/parsers/flow/components/events.js

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ const {
3333
emitMixedProp,
3434
emitStringProp,
3535
emitInt32Prop,
36+
emitObjectProp,
3637
} = require('../../parsers-primitives');
3738

3839
function getPropertyType(
@@ -64,18 +65,13 @@ function getPropertyType(
6465
parser,
6566
);
6667
case 'ObjectTypeAnnotation':
67-
return {
68+
return emitObjectProp(
6869
name,
6970
optional,
70-
typeAnnotation: {
71-
type: 'ObjectTypeAnnotation',
72-
properties: parser
73-
.getObjectProperties(typeAnnotation)
74-
.map(member =>
75-
buildPropertiesForEvent(member, parser, getPropertyType),
76-
),
77-
},
78-
};
71+
parser,
72+
typeAnnotation,
73+
extractArrayElementType,
74+
);
7975
case 'UnionTypeAnnotation':
8076
return {
8177
name,
@@ -315,4 +311,5 @@ function getEvents(
315311

316312
module.exports = {
317313
getEvents,
314+
extractArrayElementType,
318315
};

packages/react-native-codegen/src/parsers/parsers-primitives.js

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ const {
6060
wrapNullable,
6161
unwrapNullable,
6262
translateFunctionTypeAnnotation,
63+
buildPropertiesForEvent,
6364
} = require('./parsers-commons');
6465

6566
const {isModuleRegistryCall} = require('./utils');
@@ -657,6 +658,24 @@ function emitMixedProp(
657658
};
658659
}
659660

661+
function emitObjectProp(
662+
name: string,
663+
optional: boolean,
664+
parser: Parser,
665+
typeAnnotation: $FlowFixMe,
666+
extractArrayElementType: (
667+
typeAnnotation: $FlowFixMe,
668+
name: string,
669+
parser: Parser,
670+
) => EventTypeAnnotation,
671+
): NamedShape<EventTypeAnnotation> {
672+
return {
673+
name,
674+
optional,
675+
typeAnnotation: extractArrayElementType(typeAnnotation, name, parser),
676+
};
677+
}
678+
660679
module.exports = {
661680
emitArrayType,
662681
emitBoolean,
@@ -687,4 +706,5 @@ module.exports = {
687706
typeEnumResolution,
688707
translateArrayTypeAnnotation,
689708
Visitor,
709+
emitObjectProp,
690710
};

packages/react-native-codegen/src/parsers/typescript/components/events.js

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ const {
3535
emitMixedProp,
3636
emitStringProp,
3737
emitInt32Prop,
38+
emitObjectProp,
3839
} = require('../../parsers-primitives');
3940
function getPropertyType(
4041
/* $FlowFixMe[missing-local-annot] The type annotation(s) required by Flow's
@@ -49,10 +50,7 @@ function getPropertyType(
4950
const topLevelType = parseTopLevelType(annotation);
5051
const typeAnnotation = topLevelType.type;
5152
const optional = optionalProperty || topLevelType.optional;
52-
const type =
53-
typeAnnotation.type === 'TSTypeReference'
54-
? typeAnnotation.typeName.name
55-
: typeAnnotation.type;
53+
const type = parser.extractTypeFromTypeAnnotation(typeAnnotation);
5654

5755
switch (type) {
5856
case 'TSBooleanKeyword':
@@ -66,18 +64,13 @@ function getPropertyType(
6664
case 'Float':
6765
return emitFloatProp(name, optional);
6866
case 'TSTypeLiteral':
69-
return {
67+
return emitObjectProp(
7068
name,
7169
optional,
72-
typeAnnotation: {
73-
type: 'ObjectTypeAnnotation',
74-
properties: parser
75-
.getObjectProperties(typeAnnotation)
76-
.map(member =>
77-
buildPropertiesForEvent(member, parser, getPropertyType),
78-
),
79-
},
80-
};
70+
parser,
71+
typeAnnotation,
72+
extractArrayElementType,
73+
);
8174
case 'TSUnionType':
8275
return {
8376
name,
@@ -318,4 +311,5 @@ function getEvents(
318311

319312
module.exports = {
320313
getEvents,
314+
extractArrayElementType,
321315
};

0 commit comments

Comments
 (0)