@react-native/codegen 0.72.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (186) hide show
  1. package/README.md +21 -0
  2. package/lib/CodegenSchema.js +11 -0
  3. package/lib/CodegenSchema.js.flow +351 -0
  4. package/lib/SchemaValidator.js +54 -0
  5. package/lib/SchemaValidator.js.flow +67 -0
  6. package/lib/cli/combine/combine-js-to-schema-cli.js +50 -0
  7. package/lib/cli/combine/combine-js-to-schema-cli.js.flow +49 -0
  8. package/lib/cli/combine/combine-js-to-schema.js +110 -0
  9. package/lib/cli/combine/combine-js-to-schema.js.flow +48 -0
  10. package/lib/cli/combine/combine-utils.js +118 -0
  11. package/lib/cli/combine/combine-utils.js.flow +85 -0
  12. package/lib/cli/generators/generate-all.js +65 -0
  13. package/lib/cli/generators/generate-all.js.flow +66 -0
  14. package/lib/cli/parser/parser-cli.js +55 -0
  15. package/lib/cli/parser/parser-cli.js.flow +18 -0
  16. package/lib/cli/parser/parser.js +35 -0
  17. package/lib/cli/parser/parser.js.flow +37 -0
  18. package/lib/cli/parser/parser.sh +15 -0
  19. package/lib/generators/RNCodegen.js +207 -0
  20. package/lib/generators/RNCodegen.js.flow +284 -0
  21. package/lib/generators/Utils.js +31 -0
  22. package/lib/generators/Utils.js.flow +33 -0
  23. package/lib/generators/__test_fixtures__/fixtures.js +79 -0
  24. package/lib/generators/__test_fixtures__/fixtures.js.flow +82 -0
  25. package/lib/generators/components/ComponentsGeneratorUtils.js +217 -0
  26. package/lib/generators/components/ComponentsGeneratorUtils.js.flow +304 -0
  27. package/lib/generators/components/CppHelpers.js +188 -0
  28. package/lib/generators/components/CppHelpers.js.flow +228 -0
  29. package/lib/generators/components/GenerateComponentDescriptorH.js +75 -0
  30. package/lib/generators/components/GenerateComponentDescriptorH.js.flow +95 -0
  31. package/lib/generators/components/GenerateComponentHObjCpp.js +327 -0
  32. package/lib/generators/components/GenerateComponentHObjCpp.js.flow +418 -0
  33. package/lib/generators/components/GenerateEventEmitterCpp.js +199 -0
  34. package/lib/generators/components/GenerateEventEmitterCpp.js.flow +273 -0
  35. package/lib/generators/components/GenerateEventEmitterH.js +224 -0
  36. package/lib/generators/components/GenerateEventEmitterH.js.flow +315 -0
  37. package/lib/generators/components/GeneratePropsCpp.js +126 -0
  38. package/lib/generators/components/GeneratePropsCpp.js.flow +161 -0
  39. package/lib/generators/components/GeneratePropsH.js +606 -0
  40. package/lib/generators/components/GeneratePropsH.js.flow +778 -0
  41. package/lib/generators/components/GeneratePropsJavaDelegate.js +287 -0
  42. package/lib/generators/components/GeneratePropsJavaDelegate.js.flow +348 -0
  43. package/lib/generators/components/GeneratePropsJavaInterface.js +237 -0
  44. package/lib/generators/components/GeneratePropsJavaInterface.js.flow +288 -0
  45. package/lib/generators/components/GeneratePropsJavaPojo/PojoCollector.js +157 -0
  46. package/lib/generators/components/GeneratePropsJavaPojo/PojoCollector.js.flow +187 -0
  47. package/lib/generators/components/GeneratePropsJavaPojo/index.js +66 -0
  48. package/lib/generators/components/GeneratePropsJavaPojo/index.js.flow +80 -0
  49. package/lib/generators/components/GeneratePropsJavaPojo/serializePojo.js +273 -0
  50. package/lib/generators/components/GeneratePropsJavaPojo/serializePojo.js.flow +296 -0
  51. package/lib/generators/components/GenerateShadowNodeCpp.js +73 -0
  52. package/lib/generators/components/GenerateShadowNodeCpp.js.flow +95 -0
  53. package/lib/generators/components/GenerateShadowNodeH.js +91 -0
  54. package/lib/generators/components/GenerateShadowNodeH.js.flow +124 -0
  55. package/lib/generators/components/GenerateStateCpp.js +70 -0
  56. package/lib/generators/components/GenerateStateCpp.js.flow +92 -0
  57. package/lib/generators/components/GenerateStateH.js +93 -0
  58. package/lib/generators/components/GenerateStateH.js.flow +111 -0
  59. package/lib/generators/components/GenerateTests.js +165 -0
  60. package/lib/generators/components/GenerateTests.js.flow +219 -0
  61. package/lib/generators/components/GenerateThirdPartyFabricComponentsProviderH.js +91 -0
  62. package/lib/generators/components/GenerateThirdPartyFabricComponentsProviderH.js.flow +107 -0
  63. package/lib/generators/components/GenerateThirdPartyFabricComponentsProviderObjCpp.js +89 -0
  64. package/lib/generators/components/GenerateThirdPartyFabricComponentsProviderObjCpp.js.flow +105 -0
  65. package/lib/generators/components/GenerateViewConfigJs.js +410 -0
  66. package/lib/generators/components/GenerateViewConfigJs.js.flow +484 -0
  67. package/lib/generators/components/JavaHelpers.js +87 -0
  68. package/lib/generators/components/JavaHelpers.js.flow +119 -0
  69. package/lib/generators/components/__test_fixtures__/fixtures.js +1641 -0
  70. package/lib/generators/components/__test_fixtures__/fixtures.js.flow +1672 -0
  71. package/lib/generators/modules/GenerateModuleCpp.js +299 -0
  72. package/lib/generators/modules/GenerateModuleCpp.js.flow +278 -0
  73. package/lib/generators/modules/GenerateModuleH.js +373 -0
  74. package/lib/generators/modules/GenerateModuleH.js.flow +355 -0
  75. package/lib/generators/modules/GenerateModuleJavaSpec.js +571 -0
  76. package/lib/generators/modules/GenerateModuleJavaSpec.js.flow +553 -0
  77. package/lib/generators/modules/GenerateModuleJniCpp.js +505 -0
  78. package/lib/generators/modules/GenerateModuleJniCpp.js.flow +523 -0
  79. package/lib/generators/modules/GenerateModuleJniH.js +138 -0
  80. package/lib/generators/modules/GenerateModuleJniH.js.flow +148 -0
  81. package/lib/generators/modules/GenerateModuleObjCpp/StructCollector.js +262 -0
  82. package/lib/generators/modules/GenerateModuleObjCpp/StructCollector.js.flow +208 -0
  83. package/lib/generators/modules/GenerateModuleObjCpp/Utils.js +25 -0
  84. package/lib/generators/modules/GenerateModuleObjCpp/Utils.js.flow +32 -0
  85. package/lib/generators/modules/GenerateModuleObjCpp/header/serializeConstantsStruct.js +337 -0
  86. package/lib/generators/modules/GenerateModuleObjCpp/header/serializeConstantsStruct.js.flow +288 -0
  87. package/lib/generators/modules/GenerateModuleObjCpp/header/serializeRegularStruct.js +330 -0
  88. package/lib/generators/modules/GenerateModuleObjCpp/header/serializeRegularStruct.js.flow +279 -0
  89. package/lib/generators/modules/GenerateModuleObjCpp/header/serializeStruct.js +25 -0
  90. package/lib/generators/modules/GenerateModuleObjCpp/header/serializeStruct.js.flow +35 -0
  91. package/lib/generators/modules/GenerateModuleObjCpp/index.js +185 -0
  92. package/lib/generators/modules/GenerateModuleObjCpp/index.js.flow +219 -0
  93. package/lib/generators/modules/GenerateModuleObjCpp/serializeMethod.js +529 -0
  94. package/lib/generators/modules/GenerateModuleObjCpp/serializeMethod.js.flow +510 -0
  95. package/lib/generators/modules/GenerateModuleObjCpp/source/serializeModule.js +96 -0
  96. package/lib/generators/modules/GenerateModuleObjCpp/source/serializeModule.js.flow +121 -0
  97. package/lib/generators/modules/Utils.js +34 -0
  98. package/lib/generators/modules/Utils.js.flow +53 -0
  99. package/lib/generators/modules/__test_fixtures__/fixtures.js +1658 -0
  100. package/lib/generators/modules/__test_fixtures__/fixtures.js.flow +1669 -0
  101. package/lib/parsers/consistency/compareSnaps.js +84 -0
  102. package/lib/parsers/error-utils.js +284 -0
  103. package/lib/parsers/error-utils.js.flow +295 -0
  104. package/lib/parsers/errors.js +350 -0
  105. package/lib/parsers/errors.js.flow +439 -0
  106. package/lib/parsers/flow/components/__test_fixtures__/failures.js +583 -0
  107. package/lib/parsers/flow/components/__test_fixtures__/failures.js.flow +600 -0
  108. package/lib/parsers/flow/components/__test_fixtures__/fixtures.js +1001 -0
  109. package/lib/parsers/flow/components/__test_fixtures__/fixtures.js.flow +1016 -0
  110. package/lib/parsers/flow/components/commands.js +104 -0
  111. package/lib/parsers/flow/components/commands.js.flow +123 -0
  112. package/lib/parsers/flow/components/componentsUtils.js +446 -0
  113. package/lib/parsers/flow/components/componentsUtils.js.flow +496 -0
  114. package/lib/parsers/flow/components/events.js +233 -0
  115. package/lib/parsers/flow/components/events.js.flow +262 -0
  116. package/lib/parsers/flow/components/extends.js +52 -0
  117. package/lib/parsers/flow/components/extends.js.flow +66 -0
  118. package/lib/parsers/flow/components/index.js +267 -0
  119. package/lib/parsers/flow/components/index.js.flow +226 -0
  120. package/lib/parsers/flow/components/options.js +72 -0
  121. package/lib/parsers/flow/components/options.js.flow +87 -0
  122. package/lib/parsers/flow/components/props.js +47 -0
  123. package/lib/parsers/flow/components/props.js.flow +60 -0
  124. package/lib/parsers/flow/components/schema.js +106 -0
  125. package/lib/parsers/flow/components/schema.js.flow +62 -0
  126. package/lib/parsers/flow/index.js +80 -0
  127. package/lib/parsers/flow/index.js.flow +85 -0
  128. package/lib/parsers/flow/modules/__test_fixtures__/failures.js +215 -0
  129. package/lib/parsers/flow/modules/__test_fixtures__/failures.js.flow +223 -0
  130. package/lib/parsers/flow/modules/__test_fixtures__/fixtures.js +724 -0
  131. package/lib/parsers/flow/modules/__test_fixtures__/fixtures.js.flow +747 -0
  132. package/lib/parsers/flow/modules/index.js +528 -0
  133. package/lib/parsers/flow/modules/index.js.flow +420 -0
  134. package/lib/parsers/flow/parser.js +109 -0
  135. package/lib/parsers/flow/parser.js.flow +83 -0
  136. package/lib/parsers/flow/utils.js +108 -0
  137. package/lib/parsers/flow/utils.js.flow +123 -0
  138. package/lib/parsers/parser.js +11 -0
  139. package/lib/parsers/parser.js.flow +70 -0
  140. package/lib/parsers/parserMock.js +96 -0
  141. package/lib/parsers/parserMock.js.flow +68 -0
  142. package/lib/parsers/parsers-commons.js +448 -0
  143. package/lib/parsers/parsers-commons.js.flow +447 -0
  144. package/lib/parsers/parsers-primitives.js +387 -0
  145. package/lib/parsers/parsers-primitives.js.flow +383 -0
  146. package/lib/parsers/parsers-utils.js +18 -0
  147. package/lib/parsers/parsers-utils.js.flow +19 -0
  148. package/lib/parsers/schema/index.js +23 -0
  149. package/lib/parsers/schema/index.js.flow +26 -0
  150. package/lib/parsers/typescript/components/__test_fixtures__/failures.js +489 -0
  151. package/lib/parsers/typescript/components/__test_fixtures__/failures.js.flow +505 -0
  152. package/lib/parsers/typescript/components/__test_fixtures__/fixtures.js +1151 -0
  153. package/lib/parsers/typescript/components/__test_fixtures__/fixtures.js.flow +1168 -0
  154. package/lib/parsers/typescript/components/commands.js +132 -0
  155. package/lib/parsers/typescript/components/commands.js.flow +151 -0
  156. package/lib/parsers/typescript/components/componentsUtils.js +471 -0
  157. package/lib/parsers/typescript/components/componentsUtils.js.flow +521 -0
  158. package/lib/parsers/typescript/components/events.js +240 -0
  159. package/lib/parsers/typescript/components/events.js.flow +262 -0
  160. package/lib/parsers/typescript/components/extends.js +88 -0
  161. package/lib/parsers/typescript/components/extends.js.flow +103 -0
  162. package/lib/parsers/typescript/components/index.js +277 -0
  163. package/lib/parsers/typescript/components/index.js.flow +239 -0
  164. package/lib/parsers/typescript/components/options.js +72 -0
  165. package/lib/parsers/typescript/components/options.js.flow +87 -0
  166. package/lib/parsers/typescript/components/props.js +39 -0
  167. package/lib/parsers/typescript/components/props.js.flow +48 -0
  168. package/lib/parsers/typescript/components/schema.js +106 -0
  169. package/lib/parsers/typescript/components/schema.js.flow +62 -0
  170. package/lib/parsers/typescript/index.js +85 -0
  171. package/lib/parsers/typescript/index.js.flow +94 -0
  172. package/lib/parsers/typescript/modules/__test_fixtures__/failures.js +160 -0
  173. package/lib/parsers/typescript/modules/__test_fixtures__/failures.js.flow +167 -0
  174. package/lib/parsers/typescript/modules/__test_fixtures__/fixtures.js +701 -0
  175. package/lib/parsers/typescript/modules/__test_fixtures__/fixtures.js.flow +727 -0
  176. package/lib/parsers/typescript/modules/index.js +543 -0
  177. package/lib/parsers/typescript/modules/index.js.flow +435 -0
  178. package/lib/parsers/typescript/parseTopLevelType.js +203 -0
  179. package/lib/parsers/typescript/parseTopLevelType.js.flow +243 -0
  180. package/lib/parsers/typescript/parser.js +105 -0
  181. package/lib/parsers/typescript/parser.js.flow +87 -0
  182. package/lib/parsers/typescript/utils.js +101 -0
  183. package/lib/parsers/typescript/utils.js.flow +115 -0
  184. package/lib/parsers/utils.js +273 -0
  185. package/lib/parsers/utils.js.flow +266 -0
  186. package/package.json +45 -0
@@ -0,0 +1,243 @@
1
+ /**
2
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ *
7
+ * @flow strict
8
+ * @format
9
+ */
10
+
11
+ 'use strict';
12
+
13
+ import type {TypeDeclarationMap} from '../utils';
14
+
15
+ export type LegalDefaultValues = string | number | boolean | null;
16
+
17
+ type TopLevelTypeInternal = {
18
+ unions: Array<$FlowFixMe>,
19
+ optional: boolean,
20
+ defaultValue?: LegalDefaultValues,
21
+ };
22
+
23
+ export type TopLevelType = {
24
+ type: $FlowFixMe,
25
+ optional: boolean,
26
+ defaultValue?: LegalDefaultValues,
27
+ };
28
+
29
+ function getValueFromTypes(
30
+ value: $FlowFixMe,
31
+ types: TypeDeclarationMap,
32
+ ): $FlowFixMe {
33
+ switch (value.type) {
34
+ case 'TSTypeReference':
35
+ if (types[value.typeName.name]) {
36
+ return getValueFromTypes(types[value.typeName.name], types);
37
+ } else {
38
+ return value;
39
+ }
40
+ case 'TSTypeAliasDeclaration':
41
+ return getValueFromTypes(value.typeAnnotation, types);
42
+ default:
43
+ return value;
44
+ }
45
+ }
46
+
47
+ function isNull(t: $FlowFixMe) {
48
+ return t.type === 'TSNullKeyword' || t.type === 'TSUndefinedKeyword';
49
+ }
50
+
51
+ function isNullOrVoid(t: $FlowFixMe) {
52
+ return isNull(t) || t.type === 'TSVoidKeyword';
53
+ }
54
+
55
+ function couldBeNumericLiteral(type: string) {
56
+ return type === 'Literal' || type === 'NumericLiteral';
57
+ }
58
+
59
+ function couldBeSimpleLiteral(type: string) {
60
+ return (
61
+ couldBeNumericLiteral(type) ||
62
+ type === 'StringLiteral' ||
63
+ type === 'BooleanLiteral'
64
+ );
65
+ }
66
+
67
+ function evaluateLiteral(
68
+ literalNode: $FlowFixMe,
69
+ ): string | number | boolean | null {
70
+ const valueType = literalNode.type;
71
+ if (valueType === 'TSLiteralType') {
72
+ const literal = literalNode.literal;
73
+ if (couldBeSimpleLiteral(literal.type)) {
74
+ if (
75
+ typeof literal.value === 'string' ||
76
+ typeof literal.value === 'number' ||
77
+ typeof literal.value === 'boolean'
78
+ ) {
79
+ return literal.value;
80
+ }
81
+ } else if (
82
+ literal.type === 'UnaryExpression' &&
83
+ literal.operator === '-' &&
84
+ couldBeNumericLiteral(literal.argument.type) &&
85
+ typeof literal.argument.value === 'number'
86
+ ) {
87
+ return -literal.argument.value;
88
+ }
89
+ } else if (isNull(literalNode)) {
90
+ return null;
91
+ }
92
+
93
+ throw new Error(
94
+ 'The default value in WithDefault must be string, number, boolean or null .',
95
+ );
96
+ }
97
+
98
+ function handleUnionAndParen(
99
+ type: $FlowFixMe,
100
+ result: TopLevelTypeInternal,
101
+ knownTypes?: TypeDeclarationMap,
102
+ ): void {
103
+ switch (type.type) {
104
+ case 'TSParenthesizedType': {
105
+ handleUnionAndParen(type.typeAnnotation, result, knownTypes);
106
+ break;
107
+ }
108
+ case 'TSUnionType': {
109
+ // the order is important
110
+ // result.optional must be set first
111
+ for (const t of type.types) {
112
+ if (isNullOrVoid(t)) {
113
+ result.optional = true;
114
+ }
115
+ }
116
+ for (const t of type.types) {
117
+ if (!isNullOrVoid(t)) {
118
+ handleUnionAndParen(t, result, knownTypes);
119
+ }
120
+ }
121
+ break;
122
+ }
123
+ case 'TSTypeReference':
124
+ if (type.typeName.name === 'Readonly') {
125
+ handleUnionAndParen(type.typeParameters.params[0], result, knownTypes);
126
+ } else if (type.typeName.name === 'WithDefault') {
127
+ if (result.optional) {
128
+ throw new Error(
129
+ 'WithDefault<> is optional and does not need to be marked as optional. Please remove the union of undefined and/or null',
130
+ );
131
+ }
132
+ if (type.typeParameters.params.length !== 2) {
133
+ throw new Error(
134
+ 'WithDefault requires two parameters: type and default value.',
135
+ );
136
+ }
137
+ if (result.defaultValue !== undefined) {
138
+ throw new Error(
139
+ 'Multiple WithDefault is not allowed nested or in a union type.',
140
+ );
141
+ }
142
+ result.optional = true;
143
+ result.defaultValue = evaluateLiteral(type.typeParameters.params[1]);
144
+ handleUnionAndParen(type.typeParameters.params[0], result, knownTypes);
145
+ } else if (!knownTypes) {
146
+ result.unions.push(type);
147
+ } else {
148
+ const resolvedType = getValueFromTypes(type, knownTypes);
149
+ if (
150
+ resolvedType.type === 'TSTypeReference' &&
151
+ resolvedType.typeName.name === type.typeName.name
152
+ ) {
153
+ result.unions.push(type);
154
+ } else {
155
+ handleUnionAndParen(resolvedType, result, knownTypes);
156
+ }
157
+ }
158
+ break;
159
+ default:
160
+ result.unions.push(type);
161
+ }
162
+ }
163
+
164
+ function parseTopLevelType(
165
+ type: $FlowFixMe,
166
+ knownTypes?: TypeDeclarationMap,
167
+ ): TopLevelType {
168
+ let result: TopLevelTypeInternal = {unions: [], optional: false};
169
+ handleUnionAndParen(type, result, knownTypes);
170
+ if (result.unions.length === 0) {
171
+ throw new Error('Union type could not be just null or undefined.');
172
+ } else if (result.unions.length === 1) {
173
+ return {
174
+ type: result.unions[0],
175
+ optional: result.optional,
176
+ defaultValue: result.defaultValue,
177
+ };
178
+ } else {
179
+ return {
180
+ type: {type: 'TSUnionType', types: result.unions},
181
+ optional: result.optional,
182
+ defaultValue: result.defaultValue,
183
+ };
184
+ }
185
+ }
186
+
187
+ function handleIntersectionAndParen(
188
+ type: $FlowFixMe,
189
+ result: Array<$FlowFixMe>,
190
+ knownTypes?: TypeDeclarationMap,
191
+ ): void {
192
+ switch (type.type) {
193
+ case 'TSParenthesizedType': {
194
+ handleIntersectionAndParen(type.typeAnnotation, result, knownTypes);
195
+ break;
196
+ }
197
+ case 'TSIntersectionType': {
198
+ for (const t of type.types) {
199
+ handleIntersectionAndParen(t, result, knownTypes);
200
+ }
201
+ break;
202
+ }
203
+ case 'TSTypeReference':
204
+ if (type.typeName.name === 'Readonly') {
205
+ handleIntersectionAndParen(
206
+ type.typeParameters.params[0],
207
+ result,
208
+ knownTypes,
209
+ );
210
+ } else if (type.typeName.name === 'WithDefault') {
211
+ throw new Error('WithDefault<> is now allowed in intersection types.');
212
+ } else if (!knownTypes) {
213
+ result.push(type);
214
+ } else {
215
+ const resolvedType = getValueFromTypes(type, knownTypes);
216
+ if (
217
+ resolvedType.type === 'TSTypeReference' &&
218
+ resolvedType.typeName.name === type.typeName.name
219
+ ) {
220
+ result.push(type);
221
+ } else {
222
+ handleIntersectionAndParen(resolvedType, result, knownTypes);
223
+ }
224
+ }
225
+ break;
226
+ default:
227
+ result.push(type);
228
+ }
229
+ }
230
+
231
+ function flattenIntersectionType(
232
+ type: $FlowFixMe,
233
+ knownTypes?: TypeDeclarationMap,
234
+ ): Array<$FlowFixMe> {
235
+ const result: Array<$FlowFixMe> = [];
236
+ handleIntersectionAndParen(type, result, knownTypes);
237
+ return result;
238
+ }
239
+
240
+ module.exports = {
241
+ parseTopLevelType,
242
+ flattenIntersectionType,
243
+ };
@@ -0,0 +1,105 @@
1
+ /**
2
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ *
7
+ *
8
+ * @format
9
+ */
10
+
11
+ 'use strict';
12
+
13
+ function _defineProperty(obj, key, value) {
14
+ key = _toPropertyKey(key);
15
+ if (key in obj) {
16
+ Object.defineProperty(obj, key, {
17
+ value: value,
18
+ enumerable: true,
19
+ configurable: true,
20
+ writable: true,
21
+ });
22
+ } else {
23
+ obj[key] = value;
24
+ }
25
+ return obj;
26
+ }
27
+ function _toPropertyKey(arg) {
28
+ var key = _toPrimitive(arg, 'string');
29
+ return typeof key === 'symbol' ? key : String(key);
30
+ }
31
+ function _toPrimitive(input, hint) {
32
+ if (typeof input !== 'object' || input === null) return input;
33
+ var prim = input[Symbol.toPrimitive];
34
+ if (prim !== undefined) {
35
+ var res = prim.call(input, hint || 'default');
36
+ if (typeof res !== 'object') return res;
37
+ throw new TypeError('@@toPrimitive must return a primitive value.');
38
+ }
39
+ return (hint === 'string' ? String : Number)(input);
40
+ }
41
+ const _require = require('../errors'),
42
+ UnsupportedObjectPropertyTypeAnnotationParserError =
43
+ _require.UnsupportedObjectPropertyTypeAnnotationParserError;
44
+ class TypeScriptParser {
45
+ constructor() {
46
+ _defineProperty(
47
+ this,
48
+ 'typeParameterInstantiation',
49
+ 'TSTypeParameterInstantiation',
50
+ );
51
+ }
52
+ getKeyName(propertyOrIndex, hasteModuleName) {
53
+ switch (propertyOrIndex.type) {
54
+ case 'TSPropertySignature':
55
+ return propertyOrIndex.key.name;
56
+ case 'TSIndexSignature':
57
+ return propertyOrIndex.parameters[0].name;
58
+ default:
59
+ throw new UnsupportedObjectPropertyTypeAnnotationParserError(
60
+ hasteModuleName,
61
+ propertyOrIndex,
62
+ propertyOrIndex.type,
63
+ this.language(),
64
+ );
65
+ }
66
+ }
67
+ getMaybeEnumMemberType(maybeEnumDeclaration) {
68
+ if (maybeEnumDeclaration.members[0].initializer) {
69
+ return maybeEnumDeclaration.members[0].initializer.type
70
+ .replace('NumericLiteral', 'NumberTypeAnnotation')
71
+ .replace('StringLiteral', 'StringTypeAnnotation');
72
+ }
73
+ return 'StringTypeAnnotation';
74
+ }
75
+ isEnumDeclaration(maybeEnumDeclaration) {
76
+ return maybeEnumDeclaration.type === 'TSEnumDeclaration';
77
+ }
78
+ language() {
79
+ return 'TypeScript';
80
+ }
81
+ nameForGenericTypeAnnotation(typeAnnotation) {
82
+ return typeAnnotation.typeName.name;
83
+ }
84
+ checkIfInvalidModule(typeArguments) {
85
+ return (
86
+ typeArguments.type !== 'TSTypeParameterInstantiation' ||
87
+ typeArguments.params.length !== 1 ||
88
+ typeArguments.params[0].type !== 'TSTypeReference' ||
89
+ typeArguments.params[0].typeName.name !== 'Spec'
90
+ );
91
+ }
92
+ remapUnionTypeAnnotationMemberNames(membersTypes) {
93
+ const remapLiteral = item => {
94
+ return item.literal
95
+ ? item.literal.type
96
+ .replace('NumericLiteral', 'NumberTypeAnnotation')
97
+ .replace('StringLiteral', 'StringTypeAnnotation')
98
+ : 'ObjectTypeAnnotation';
99
+ };
100
+ return [...new Set(membersTypes.map(remapLiteral))];
101
+ }
102
+ }
103
+ module.exports = {
104
+ TypeScriptParser,
105
+ };
@@ -0,0 +1,87 @@
1
+ /**
2
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ *
7
+ * @flow strict
8
+ * @format
9
+ */
10
+
11
+ 'use strict';
12
+
13
+ import type {UnionTypeAnnotationMemberType} from '../../CodegenSchema.js';
14
+ import type {ParserType} from '../errors';
15
+ import type {Parser} from '../parser';
16
+
17
+ const {
18
+ UnsupportedObjectPropertyTypeAnnotationParserError,
19
+ } = require('../errors');
20
+
21
+ class TypeScriptParser implements Parser {
22
+ typeParameterInstantiation: string = 'TSTypeParameterInstantiation';
23
+
24
+ getKeyName(propertyOrIndex: $FlowFixMe, hasteModuleName: string): string {
25
+ switch (propertyOrIndex.type) {
26
+ case 'TSPropertySignature':
27
+ return propertyOrIndex.key.name;
28
+ case 'TSIndexSignature':
29
+ return propertyOrIndex.parameters[0].name;
30
+ default:
31
+ throw new UnsupportedObjectPropertyTypeAnnotationParserError(
32
+ hasteModuleName,
33
+ propertyOrIndex,
34
+ propertyOrIndex.type,
35
+ this.language(),
36
+ );
37
+ }
38
+ }
39
+
40
+ getMaybeEnumMemberType(maybeEnumDeclaration: $FlowFixMe): string {
41
+ if (maybeEnumDeclaration.members[0].initializer) {
42
+ return maybeEnumDeclaration.members[0].initializer.type
43
+ .replace('NumericLiteral', 'NumberTypeAnnotation')
44
+ .replace('StringLiteral', 'StringTypeAnnotation');
45
+ }
46
+
47
+ return 'StringTypeAnnotation';
48
+ }
49
+
50
+ isEnumDeclaration(maybeEnumDeclaration: $FlowFixMe): boolean {
51
+ return maybeEnumDeclaration.type === 'TSEnumDeclaration';
52
+ }
53
+
54
+ language(): ParserType {
55
+ return 'TypeScript';
56
+ }
57
+
58
+ nameForGenericTypeAnnotation(typeAnnotation: $FlowFixMe): string {
59
+ return typeAnnotation.typeName.name;
60
+ }
61
+
62
+ checkIfInvalidModule(typeArguments: $FlowFixMe): boolean {
63
+ return (
64
+ typeArguments.type !== 'TSTypeParameterInstantiation' ||
65
+ typeArguments.params.length !== 1 ||
66
+ typeArguments.params[0].type !== 'TSTypeReference' ||
67
+ typeArguments.params[0].typeName.name !== 'Spec'
68
+ );
69
+ }
70
+
71
+ remapUnionTypeAnnotationMemberNames(
72
+ membersTypes: $FlowFixMe[],
73
+ ): UnionTypeAnnotationMemberType[] {
74
+ const remapLiteral = (item: $FlowFixMe) => {
75
+ return item.literal
76
+ ? item.literal.type
77
+ .replace('NumericLiteral', 'NumberTypeAnnotation')
78
+ .replace('StringLiteral', 'StringTypeAnnotation')
79
+ : 'ObjectTypeAnnotation';
80
+ };
81
+
82
+ return [...new Set(membersTypes.map(remapLiteral))];
83
+ }
84
+ }
85
+ module.exports = {
86
+ TypeScriptParser,
87
+ };
@@ -0,0 +1,101 @@
1
+ /**
2
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ *
7
+ *
8
+ * @format
9
+ */
10
+
11
+ 'use strict';
12
+
13
+ const _require = require('./parseTopLevelType'),
14
+ parseTopLevelType = _require.parseTopLevelType;
15
+
16
+ /**
17
+ * TODO(T108222691): Use flow-types for @babel/parser
18
+ */
19
+
20
+ function getTypes(ast) {
21
+ return ast.body.reduce((types, node) => {
22
+ switch (node.type) {
23
+ case 'ExportNamedDeclaration': {
24
+ if (node.declaration) {
25
+ switch (node.declaration.type) {
26
+ case 'TSTypeAliasDeclaration':
27
+ case 'TSInterfaceDeclaration':
28
+ case 'TSEnumDeclaration': {
29
+ types[node.declaration.id.name] = node.declaration;
30
+ break;
31
+ }
32
+ }
33
+ }
34
+ break;
35
+ }
36
+ case 'TSTypeAliasDeclaration':
37
+ case 'TSInterfaceDeclaration':
38
+ case 'TSEnumDeclaration': {
39
+ types[node.id.name] = node;
40
+ break;
41
+ }
42
+ }
43
+ return types;
44
+ }, {});
45
+ }
46
+
47
+ // $FlowFixMe[unclear-type] Use flow-types for @babel/parser
48
+
49
+ const invariant = require('invariant');
50
+ function resolveTypeAnnotation(
51
+ // TODO(T108222691): Use flow-types for @babel/parser
52
+ typeAnnotation,
53
+ types,
54
+ ) {
55
+ invariant(
56
+ typeAnnotation != null,
57
+ 'resolveTypeAnnotation(): typeAnnotation cannot be null',
58
+ );
59
+ let node =
60
+ typeAnnotation.type === 'TSTypeAnnotation'
61
+ ? typeAnnotation.typeAnnotation
62
+ : typeAnnotation;
63
+ let nullable = false;
64
+ let typeAliasResolutionStatus = {
65
+ successful: false,
66
+ };
67
+ for (;;) {
68
+ const topLevelType = parseTopLevelType(node);
69
+ nullable = nullable || topLevelType.optional;
70
+ node = topLevelType.type;
71
+ if (node.type === 'TSTypeReference') {
72
+ typeAliasResolutionStatus = {
73
+ successful: true,
74
+ aliasName: node.typeName.name,
75
+ };
76
+ const resolvedTypeAnnotation = types[node.typeName.name];
77
+ if (
78
+ resolvedTypeAnnotation == null ||
79
+ resolvedTypeAnnotation.type === 'TSEnumDeclaration'
80
+ ) {
81
+ break;
82
+ }
83
+ invariant(
84
+ resolvedTypeAnnotation.type === 'TSTypeAliasDeclaration',
85
+ `GenericTypeAnnotation '${node.typeName.name}' must resolve to a TSTypeAliasDeclaration. Instead, it resolved to a '${resolvedTypeAnnotation.type}'`,
86
+ );
87
+ node = resolvedTypeAnnotation.typeAnnotation;
88
+ } else {
89
+ break;
90
+ }
91
+ }
92
+ return {
93
+ nullable: nullable,
94
+ typeAnnotation: node,
95
+ typeAliasResolutionStatus,
96
+ };
97
+ }
98
+ module.exports = {
99
+ resolveTypeAnnotation,
100
+ getTypes,
101
+ };
@@ -0,0 +1,115 @@
1
+ /**
2
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ *
7
+ * @flow strict
8
+ * @format
9
+ */
10
+
11
+ 'use strict';
12
+
13
+ import type {TypeAliasResolutionStatus, TypeDeclarationMap} from '../utils';
14
+
15
+ const {parseTopLevelType} = require('./parseTopLevelType');
16
+
17
+ /**
18
+ * TODO(T108222691): Use flow-types for @babel/parser
19
+ */
20
+
21
+ function getTypes(ast: $FlowFixMe): TypeDeclarationMap {
22
+ return ast.body.reduce((types, node) => {
23
+ switch (node.type) {
24
+ case 'ExportNamedDeclaration': {
25
+ if (node.declaration) {
26
+ switch (node.declaration.type) {
27
+ case 'TSTypeAliasDeclaration':
28
+ case 'TSInterfaceDeclaration':
29
+ case 'TSEnumDeclaration': {
30
+ types[node.declaration.id.name] = node.declaration;
31
+ break;
32
+ }
33
+ }
34
+ }
35
+ break;
36
+ }
37
+ case 'TSTypeAliasDeclaration':
38
+ case 'TSInterfaceDeclaration':
39
+ case 'TSEnumDeclaration': {
40
+ types[node.id.name] = node;
41
+ break;
42
+ }
43
+ }
44
+ return types;
45
+ }, {});
46
+ }
47
+
48
+ // $FlowFixMe[unclear-type] Use flow-types for @babel/parser
49
+ export type ASTNode = Object;
50
+
51
+ const invariant = require('invariant');
52
+
53
+ function resolveTypeAnnotation(
54
+ // TODO(T108222691): Use flow-types for @babel/parser
55
+ typeAnnotation: $FlowFixMe,
56
+ types: TypeDeclarationMap,
57
+ ): {
58
+ nullable: boolean,
59
+ typeAnnotation: $FlowFixMe,
60
+ typeAliasResolutionStatus: TypeAliasResolutionStatus,
61
+ } {
62
+ invariant(
63
+ typeAnnotation != null,
64
+ 'resolveTypeAnnotation(): typeAnnotation cannot be null',
65
+ );
66
+
67
+ let node =
68
+ typeAnnotation.type === 'TSTypeAnnotation'
69
+ ? typeAnnotation.typeAnnotation
70
+ : typeAnnotation;
71
+ let nullable = false;
72
+ let typeAliasResolutionStatus: TypeAliasResolutionStatus = {
73
+ successful: false,
74
+ };
75
+
76
+ for (;;) {
77
+ const topLevelType = parseTopLevelType(node);
78
+ nullable = nullable || topLevelType.optional;
79
+ node = topLevelType.type;
80
+
81
+ if (node.type === 'TSTypeReference') {
82
+ typeAliasResolutionStatus = {
83
+ successful: true,
84
+ aliasName: node.typeName.name,
85
+ };
86
+ const resolvedTypeAnnotation = types[node.typeName.name];
87
+ if (
88
+ resolvedTypeAnnotation == null ||
89
+ resolvedTypeAnnotation.type === 'TSEnumDeclaration'
90
+ ) {
91
+ break;
92
+ }
93
+
94
+ invariant(
95
+ resolvedTypeAnnotation.type === 'TSTypeAliasDeclaration',
96
+ `GenericTypeAnnotation '${node.typeName.name}' must resolve to a TSTypeAliasDeclaration. Instead, it resolved to a '${resolvedTypeAnnotation.type}'`,
97
+ );
98
+
99
+ node = resolvedTypeAnnotation.typeAnnotation;
100
+ } else {
101
+ break;
102
+ }
103
+ }
104
+
105
+ return {
106
+ nullable: nullable,
107
+ typeAnnotation: node,
108
+ typeAliasResolutionStatus,
109
+ };
110
+ }
111
+
112
+ module.exports = {
113
+ resolveTypeAnnotation,
114
+ getTypes,
115
+ };