@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.
- package/README.md +21 -0
- package/lib/CodegenSchema.js +11 -0
- package/lib/CodegenSchema.js.flow +351 -0
- package/lib/SchemaValidator.js +54 -0
- package/lib/SchemaValidator.js.flow +67 -0
- package/lib/cli/combine/combine-js-to-schema-cli.js +50 -0
- package/lib/cli/combine/combine-js-to-schema-cli.js.flow +49 -0
- package/lib/cli/combine/combine-js-to-schema.js +110 -0
- package/lib/cli/combine/combine-js-to-schema.js.flow +48 -0
- package/lib/cli/combine/combine-utils.js +118 -0
- package/lib/cli/combine/combine-utils.js.flow +85 -0
- package/lib/cli/generators/generate-all.js +65 -0
- package/lib/cli/generators/generate-all.js.flow +66 -0
- package/lib/cli/parser/parser-cli.js +55 -0
- package/lib/cli/parser/parser-cli.js.flow +18 -0
- package/lib/cli/parser/parser.js +35 -0
- package/lib/cli/parser/parser.js.flow +37 -0
- package/lib/cli/parser/parser.sh +15 -0
- package/lib/generators/RNCodegen.js +207 -0
- package/lib/generators/RNCodegen.js.flow +284 -0
- package/lib/generators/Utils.js +31 -0
- package/lib/generators/Utils.js.flow +33 -0
- package/lib/generators/__test_fixtures__/fixtures.js +79 -0
- package/lib/generators/__test_fixtures__/fixtures.js.flow +82 -0
- package/lib/generators/components/ComponentsGeneratorUtils.js +217 -0
- package/lib/generators/components/ComponentsGeneratorUtils.js.flow +304 -0
- package/lib/generators/components/CppHelpers.js +188 -0
- package/lib/generators/components/CppHelpers.js.flow +228 -0
- package/lib/generators/components/GenerateComponentDescriptorH.js +75 -0
- package/lib/generators/components/GenerateComponentDescriptorH.js.flow +95 -0
- package/lib/generators/components/GenerateComponentHObjCpp.js +327 -0
- package/lib/generators/components/GenerateComponentHObjCpp.js.flow +418 -0
- package/lib/generators/components/GenerateEventEmitterCpp.js +199 -0
- package/lib/generators/components/GenerateEventEmitterCpp.js.flow +273 -0
- package/lib/generators/components/GenerateEventEmitterH.js +224 -0
- package/lib/generators/components/GenerateEventEmitterH.js.flow +315 -0
- package/lib/generators/components/GeneratePropsCpp.js +126 -0
- package/lib/generators/components/GeneratePropsCpp.js.flow +161 -0
- package/lib/generators/components/GeneratePropsH.js +606 -0
- package/lib/generators/components/GeneratePropsH.js.flow +778 -0
- package/lib/generators/components/GeneratePropsJavaDelegate.js +287 -0
- package/lib/generators/components/GeneratePropsJavaDelegate.js.flow +348 -0
- package/lib/generators/components/GeneratePropsJavaInterface.js +237 -0
- package/lib/generators/components/GeneratePropsJavaInterface.js.flow +288 -0
- package/lib/generators/components/GeneratePropsJavaPojo/PojoCollector.js +157 -0
- package/lib/generators/components/GeneratePropsJavaPojo/PojoCollector.js.flow +187 -0
- package/lib/generators/components/GeneratePropsJavaPojo/index.js +66 -0
- package/lib/generators/components/GeneratePropsJavaPojo/index.js.flow +80 -0
- package/lib/generators/components/GeneratePropsJavaPojo/serializePojo.js +273 -0
- package/lib/generators/components/GeneratePropsJavaPojo/serializePojo.js.flow +296 -0
- package/lib/generators/components/GenerateShadowNodeCpp.js +73 -0
- package/lib/generators/components/GenerateShadowNodeCpp.js.flow +95 -0
- package/lib/generators/components/GenerateShadowNodeH.js +91 -0
- package/lib/generators/components/GenerateShadowNodeH.js.flow +124 -0
- package/lib/generators/components/GenerateStateCpp.js +70 -0
- package/lib/generators/components/GenerateStateCpp.js.flow +92 -0
- package/lib/generators/components/GenerateStateH.js +93 -0
- package/lib/generators/components/GenerateStateH.js.flow +111 -0
- package/lib/generators/components/GenerateTests.js +165 -0
- package/lib/generators/components/GenerateTests.js.flow +219 -0
- package/lib/generators/components/GenerateThirdPartyFabricComponentsProviderH.js +91 -0
- package/lib/generators/components/GenerateThirdPartyFabricComponentsProviderH.js.flow +107 -0
- package/lib/generators/components/GenerateThirdPartyFabricComponentsProviderObjCpp.js +89 -0
- package/lib/generators/components/GenerateThirdPartyFabricComponentsProviderObjCpp.js.flow +105 -0
- package/lib/generators/components/GenerateViewConfigJs.js +410 -0
- package/lib/generators/components/GenerateViewConfigJs.js.flow +484 -0
- package/lib/generators/components/JavaHelpers.js +87 -0
- package/lib/generators/components/JavaHelpers.js.flow +119 -0
- package/lib/generators/components/__test_fixtures__/fixtures.js +1641 -0
- package/lib/generators/components/__test_fixtures__/fixtures.js.flow +1672 -0
- package/lib/generators/modules/GenerateModuleCpp.js +299 -0
- package/lib/generators/modules/GenerateModuleCpp.js.flow +278 -0
- package/lib/generators/modules/GenerateModuleH.js +373 -0
- package/lib/generators/modules/GenerateModuleH.js.flow +355 -0
- package/lib/generators/modules/GenerateModuleJavaSpec.js +571 -0
- package/lib/generators/modules/GenerateModuleJavaSpec.js.flow +553 -0
- package/lib/generators/modules/GenerateModuleJniCpp.js +505 -0
- package/lib/generators/modules/GenerateModuleJniCpp.js.flow +523 -0
- package/lib/generators/modules/GenerateModuleJniH.js +138 -0
- package/lib/generators/modules/GenerateModuleJniH.js.flow +148 -0
- package/lib/generators/modules/GenerateModuleObjCpp/StructCollector.js +262 -0
- package/lib/generators/modules/GenerateModuleObjCpp/StructCollector.js.flow +208 -0
- package/lib/generators/modules/GenerateModuleObjCpp/Utils.js +25 -0
- package/lib/generators/modules/GenerateModuleObjCpp/Utils.js.flow +32 -0
- package/lib/generators/modules/GenerateModuleObjCpp/header/serializeConstantsStruct.js +337 -0
- package/lib/generators/modules/GenerateModuleObjCpp/header/serializeConstantsStruct.js.flow +288 -0
- package/lib/generators/modules/GenerateModuleObjCpp/header/serializeRegularStruct.js +330 -0
- package/lib/generators/modules/GenerateModuleObjCpp/header/serializeRegularStruct.js.flow +279 -0
- package/lib/generators/modules/GenerateModuleObjCpp/header/serializeStruct.js +25 -0
- package/lib/generators/modules/GenerateModuleObjCpp/header/serializeStruct.js.flow +35 -0
- package/lib/generators/modules/GenerateModuleObjCpp/index.js +185 -0
- package/lib/generators/modules/GenerateModuleObjCpp/index.js.flow +219 -0
- package/lib/generators/modules/GenerateModuleObjCpp/serializeMethod.js +529 -0
- package/lib/generators/modules/GenerateModuleObjCpp/serializeMethod.js.flow +510 -0
- package/lib/generators/modules/GenerateModuleObjCpp/source/serializeModule.js +96 -0
- package/lib/generators/modules/GenerateModuleObjCpp/source/serializeModule.js.flow +121 -0
- package/lib/generators/modules/Utils.js +34 -0
- package/lib/generators/modules/Utils.js.flow +53 -0
- package/lib/generators/modules/__test_fixtures__/fixtures.js +1658 -0
- package/lib/generators/modules/__test_fixtures__/fixtures.js.flow +1669 -0
- package/lib/parsers/consistency/compareSnaps.js +84 -0
- package/lib/parsers/error-utils.js +284 -0
- package/lib/parsers/error-utils.js.flow +295 -0
- package/lib/parsers/errors.js +350 -0
- package/lib/parsers/errors.js.flow +439 -0
- package/lib/parsers/flow/components/__test_fixtures__/failures.js +583 -0
- package/lib/parsers/flow/components/__test_fixtures__/failures.js.flow +600 -0
- package/lib/parsers/flow/components/__test_fixtures__/fixtures.js +1001 -0
- package/lib/parsers/flow/components/__test_fixtures__/fixtures.js.flow +1016 -0
- package/lib/parsers/flow/components/commands.js +104 -0
- package/lib/parsers/flow/components/commands.js.flow +123 -0
- package/lib/parsers/flow/components/componentsUtils.js +446 -0
- package/lib/parsers/flow/components/componentsUtils.js.flow +496 -0
- package/lib/parsers/flow/components/events.js +233 -0
- package/lib/parsers/flow/components/events.js.flow +262 -0
- package/lib/parsers/flow/components/extends.js +52 -0
- package/lib/parsers/flow/components/extends.js.flow +66 -0
- package/lib/parsers/flow/components/index.js +267 -0
- package/lib/parsers/flow/components/index.js.flow +226 -0
- package/lib/parsers/flow/components/options.js +72 -0
- package/lib/parsers/flow/components/options.js.flow +87 -0
- package/lib/parsers/flow/components/props.js +47 -0
- package/lib/parsers/flow/components/props.js.flow +60 -0
- package/lib/parsers/flow/components/schema.js +106 -0
- package/lib/parsers/flow/components/schema.js.flow +62 -0
- package/lib/parsers/flow/index.js +80 -0
- package/lib/parsers/flow/index.js.flow +85 -0
- package/lib/parsers/flow/modules/__test_fixtures__/failures.js +215 -0
- package/lib/parsers/flow/modules/__test_fixtures__/failures.js.flow +223 -0
- package/lib/parsers/flow/modules/__test_fixtures__/fixtures.js +724 -0
- package/lib/parsers/flow/modules/__test_fixtures__/fixtures.js.flow +747 -0
- package/lib/parsers/flow/modules/index.js +528 -0
- package/lib/parsers/flow/modules/index.js.flow +420 -0
- package/lib/parsers/flow/parser.js +109 -0
- package/lib/parsers/flow/parser.js.flow +83 -0
- package/lib/parsers/flow/utils.js +108 -0
- package/lib/parsers/flow/utils.js.flow +123 -0
- package/lib/parsers/parser.js +11 -0
- package/lib/parsers/parser.js.flow +70 -0
- package/lib/parsers/parserMock.js +96 -0
- package/lib/parsers/parserMock.js.flow +68 -0
- package/lib/parsers/parsers-commons.js +448 -0
- package/lib/parsers/parsers-commons.js.flow +447 -0
- package/lib/parsers/parsers-primitives.js +387 -0
- package/lib/parsers/parsers-primitives.js.flow +383 -0
- package/lib/parsers/parsers-utils.js +18 -0
- package/lib/parsers/parsers-utils.js.flow +19 -0
- package/lib/parsers/schema/index.js +23 -0
- package/lib/parsers/schema/index.js.flow +26 -0
- package/lib/parsers/typescript/components/__test_fixtures__/failures.js +489 -0
- package/lib/parsers/typescript/components/__test_fixtures__/failures.js.flow +505 -0
- package/lib/parsers/typescript/components/__test_fixtures__/fixtures.js +1151 -0
- package/lib/parsers/typescript/components/__test_fixtures__/fixtures.js.flow +1168 -0
- package/lib/parsers/typescript/components/commands.js +132 -0
- package/lib/parsers/typescript/components/commands.js.flow +151 -0
- package/lib/parsers/typescript/components/componentsUtils.js +471 -0
- package/lib/parsers/typescript/components/componentsUtils.js.flow +521 -0
- package/lib/parsers/typescript/components/events.js +240 -0
- package/lib/parsers/typescript/components/events.js.flow +262 -0
- package/lib/parsers/typescript/components/extends.js +88 -0
- package/lib/parsers/typescript/components/extends.js.flow +103 -0
- package/lib/parsers/typescript/components/index.js +277 -0
- package/lib/parsers/typescript/components/index.js.flow +239 -0
- package/lib/parsers/typescript/components/options.js +72 -0
- package/lib/parsers/typescript/components/options.js.flow +87 -0
- package/lib/parsers/typescript/components/props.js +39 -0
- package/lib/parsers/typescript/components/props.js.flow +48 -0
- package/lib/parsers/typescript/components/schema.js +106 -0
- package/lib/parsers/typescript/components/schema.js.flow +62 -0
- package/lib/parsers/typescript/index.js +85 -0
- package/lib/parsers/typescript/index.js.flow +94 -0
- package/lib/parsers/typescript/modules/__test_fixtures__/failures.js +160 -0
- package/lib/parsers/typescript/modules/__test_fixtures__/failures.js.flow +167 -0
- package/lib/parsers/typescript/modules/__test_fixtures__/fixtures.js +701 -0
- package/lib/parsers/typescript/modules/__test_fixtures__/fixtures.js.flow +727 -0
- package/lib/parsers/typescript/modules/index.js +543 -0
- package/lib/parsers/typescript/modules/index.js.flow +435 -0
- package/lib/parsers/typescript/parseTopLevelType.js +203 -0
- package/lib/parsers/typescript/parseTopLevelType.js.flow +243 -0
- package/lib/parsers/typescript/parser.js +105 -0
- package/lib/parsers/typescript/parser.js.flow +87 -0
- package/lib/parsers/typescript/utils.js +101 -0
- package/lib/parsers/typescript/utils.js.flow +115 -0
- package/lib/parsers/utils.js +273 -0
- package/lib/parsers/utils.js.flow +266 -0
- 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
|
+
};
|