@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,273 @@
|
|
|
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 _slicedToArray(arr, i) {
|
|
14
|
+
return (
|
|
15
|
+
_arrayWithHoles(arr) ||
|
|
16
|
+
_iterableToArrayLimit(arr, i) ||
|
|
17
|
+
_unsupportedIterableToArray(arr, i) ||
|
|
18
|
+
_nonIterableRest()
|
|
19
|
+
);
|
|
20
|
+
}
|
|
21
|
+
function _nonIterableRest() {
|
|
22
|
+
throw new TypeError(
|
|
23
|
+
'Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.',
|
|
24
|
+
);
|
|
25
|
+
}
|
|
26
|
+
function _unsupportedIterableToArray(o, minLen) {
|
|
27
|
+
if (!o) return;
|
|
28
|
+
if (typeof o === 'string') return _arrayLikeToArray(o, minLen);
|
|
29
|
+
var n = Object.prototype.toString.call(o).slice(8, -1);
|
|
30
|
+
if (n === 'Object' && o.constructor) n = o.constructor.name;
|
|
31
|
+
if (n === 'Map' || n === 'Set') return Array.from(o);
|
|
32
|
+
if (n === 'Arguments' || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))
|
|
33
|
+
return _arrayLikeToArray(o, minLen);
|
|
34
|
+
}
|
|
35
|
+
function _arrayLikeToArray(arr, len) {
|
|
36
|
+
if (len == null || len > arr.length) len = arr.length;
|
|
37
|
+
for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];
|
|
38
|
+
return arr2;
|
|
39
|
+
}
|
|
40
|
+
function _iterableToArrayLimit(arr, i) {
|
|
41
|
+
var _i =
|
|
42
|
+
null == arr
|
|
43
|
+
? null
|
|
44
|
+
: ('undefined' != typeof Symbol && arr[Symbol.iterator]) ||
|
|
45
|
+
arr['@@iterator'];
|
|
46
|
+
if (null != _i) {
|
|
47
|
+
var _s,
|
|
48
|
+
_e,
|
|
49
|
+
_x,
|
|
50
|
+
_r,
|
|
51
|
+
_arr = [],
|
|
52
|
+
_n = !0,
|
|
53
|
+
_d = !1;
|
|
54
|
+
try {
|
|
55
|
+
if (((_x = (_i = _i.call(arr)).next), 0 === i)) {
|
|
56
|
+
if (Object(_i) !== _i) return;
|
|
57
|
+
_n = !1;
|
|
58
|
+
} else
|
|
59
|
+
for (
|
|
60
|
+
;
|
|
61
|
+
!(_n = (_s = _x.call(_i)).done) &&
|
|
62
|
+
(_arr.push(_s.value), _arr.length !== i);
|
|
63
|
+
_n = !0
|
|
64
|
+
);
|
|
65
|
+
} catch (err) {
|
|
66
|
+
(_d = !0), (_e = err);
|
|
67
|
+
} finally {
|
|
68
|
+
try {
|
|
69
|
+
if (!_n && null != _i.return && ((_r = _i.return()), Object(_r) !== _r))
|
|
70
|
+
return;
|
|
71
|
+
} finally {
|
|
72
|
+
if (_d) throw _e;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return _arr;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
function _arrayWithHoles(arr) {
|
|
79
|
+
if (Array.isArray(arr)) return arr;
|
|
80
|
+
}
|
|
81
|
+
const _require = require('./errors'),
|
|
82
|
+
ParserError = _require.ParserError;
|
|
83
|
+
const _require2 = require('./parsers-commons'),
|
|
84
|
+
wrapModuleSchema = _require2.wrapModuleSchema;
|
|
85
|
+
const fs = require('fs');
|
|
86
|
+
const path = require('path');
|
|
87
|
+
const invariant = require('invariant');
|
|
88
|
+
function extractNativeModuleName(filename) {
|
|
89
|
+
// this should drop everything after the file name. For Example it will drop:
|
|
90
|
+
// .android.js, .android.ts, .android.tsx, .ios.js, .ios.ts, .ios.tsx, .js, .ts, .tsx
|
|
91
|
+
return path.basename(filename).split('.')[0];
|
|
92
|
+
}
|
|
93
|
+
function createParserErrorCapturer() {
|
|
94
|
+
const errors = [];
|
|
95
|
+
function guard(fn) {
|
|
96
|
+
try {
|
|
97
|
+
return fn();
|
|
98
|
+
} catch (error) {
|
|
99
|
+
if (!(error instanceof ParserError)) {
|
|
100
|
+
throw error;
|
|
101
|
+
}
|
|
102
|
+
errors.push(error);
|
|
103
|
+
return null;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return [errors, guard];
|
|
107
|
+
}
|
|
108
|
+
function verifyPlatforms(hasteModuleName, moduleName) {
|
|
109
|
+
let cxxOnly = false;
|
|
110
|
+
const excludedPlatforms = new Set();
|
|
111
|
+
const namesToValidate = [moduleName, hasteModuleName];
|
|
112
|
+
namesToValidate.forEach(name => {
|
|
113
|
+
if (name.endsWith('Android')) {
|
|
114
|
+
excludedPlatforms.add('iOS');
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
if (name.endsWith('IOS')) {
|
|
118
|
+
excludedPlatforms.add('android');
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
if (name.endsWith('Cxx')) {
|
|
122
|
+
cxxOnly = true;
|
|
123
|
+
excludedPlatforms.add('iOS');
|
|
124
|
+
excludedPlatforms.add('android');
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
return {
|
|
129
|
+
cxxOnly,
|
|
130
|
+
excludedPlatforms: Array.from(excludedPlatforms),
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
function parseFile(filename, callback) {
|
|
134
|
+
const contents = fs.readFileSync(filename, 'utf8');
|
|
135
|
+
return callback(contents, filename);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
// TODO(T108222691): Use flow-types for @babel/parser
|
|
139
|
+
function visit(astNode, visitor) {
|
|
140
|
+
const queue = [astNode];
|
|
141
|
+
while (queue.length !== 0) {
|
|
142
|
+
let item = queue.shift();
|
|
143
|
+
if (!(typeof item === 'object' && item != null)) {
|
|
144
|
+
continue;
|
|
145
|
+
}
|
|
146
|
+
if (
|
|
147
|
+
typeof item.type === 'string' &&
|
|
148
|
+
typeof visitor[item.type] === 'function'
|
|
149
|
+
) {
|
|
150
|
+
// Don't visit any children
|
|
151
|
+
visitor[item.type](item);
|
|
152
|
+
} else if (Array.isArray(item)) {
|
|
153
|
+
queue.push(...item);
|
|
154
|
+
} else {
|
|
155
|
+
queue.push(...Object.values(item));
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
function buildSchemaFromConfigType(
|
|
160
|
+
configType,
|
|
161
|
+
filename,
|
|
162
|
+
ast,
|
|
163
|
+
wrapComponentSchema,
|
|
164
|
+
buildComponentSchema,
|
|
165
|
+
buildModuleSchema,
|
|
166
|
+
) {
|
|
167
|
+
switch (configType) {
|
|
168
|
+
case 'component': {
|
|
169
|
+
return wrapComponentSchema(buildComponentSchema(ast));
|
|
170
|
+
}
|
|
171
|
+
case 'module': {
|
|
172
|
+
if (filename === undefined || filename === null) {
|
|
173
|
+
throw new Error('Filepath expected while parasing a module');
|
|
174
|
+
}
|
|
175
|
+
const nativeModuleName = extractNativeModuleName(filename);
|
|
176
|
+
const _createParserErrorCap = createParserErrorCapturer(),
|
|
177
|
+
_createParserErrorCap2 = _slicedToArray(_createParserErrorCap, 2),
|
|
178
|
+
parsingErrors = _createParserErrorCap2[0],
|
|
179
|
+
tryParse = _createParserErrorCap2[1];
|
|
180
|
+
const schema = tryParse(() =>
|
|
181
|
+
buildModuleSchema(nativeModuleName, ast, tryParse),
|
|
182
|
+
);
|
|
183
|
+
if (parsingErrors.length > 0) {
|
|
184
|
+
/**
|
|
185
|
+
* TODO(T77968131): We have two options:
|
|
186
|
+
* - Throw the first error, but indicate there are more then one errors.
|
|
187
|
+
* - Display all errors, nicely formatted.
|
|
188
|
+
*
|
|
189
|
+
* For the time being, we're just throw the first error.
|
|
190
|
+
**/
|
|
191
|
+
|
|
192
|
+
throw parsingErrors[0];
|
|
193
|
+
}
|
|
194
|
+
invariant(
|
|
195
|
+
schema != null,
|
|
196
|
+
'When there are no parsing errors, the schema should not be null',
|
|
197
|
+
);
|
|
198
|
+
return wrapModuleSchema(schema, nativeModuleName);
|
|
199
|
+
}
|
|
200
|
+
default:
|
|
201
|
+
return {
|
|
202
|
+
modules: {},
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
function getConfigType(
|
|
207
|
+
// TODO(T71778680): Flow-type this node.
|
|
208
|
+
ast,
|
|
209
|
+
Visitor,
|
|
210
|
+
) {
|
|
211
|
+
let infoMap = {
|
|
212
|
+
isComponent: false,
|
|
213
|
+
isModule: false,
|
|
214
|
+
};
|
|
215
|
+
visit(ast, Visitor(infoMap));
|
|
216
|
+
const isModule = infoMap.isModule,
|
|
217
|
+
isComponent = infoMap.isComponent;
|
|
218
|
+
if (isModule && isComponent) {
|
|
219
|
+
throw new Error(
|
|
220
|
+
'Found type extending "TurboModule" and exported "codegenNativeComponent" declaration in one file. Split them into separated files.',
|
|
221
|
+
);
|
|
222
|
+
}
|
|
223
|
+
if (isModule) {
|
|
224
|
+
return 'module';
|
|
225
|
+
} else if (isComponent) {
|
|
226
|
+
return 'component';
|
|
227
|
+
} else {
|
|
228
|
+
return 'none';
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
// TODO(T71778680): Flow-type ASTNodes.
|
|
233
|
+
function isModuleRegistryCall(node) {
|
|
234
|
+
if (node.type !== 'CallExpression') {
|
|
235
|
+
return false;
|
|
236
|
+
}
|
|
237
|
+
const callExpression = node;
|
|
238
|
+
if (callExpression.callee.type !== 'MemberExpression') {
|
|
239
|
+
return false;
|
|
240
|
+
}
|
|
241
|
+
const memberExpression = callExpression.callee;
|
|
242
|
+
if (
|
|
243
|
+
!(
|
|
244
|
+
memberExpression.object.type === 'Identifier' &&
|
|
245
|
+
memberExpression.object.name === 'TurboModuleRegistry'
|
|
246
|
+
)
|
|
247
|
+
) {
|
|
248
|
+
return false;
|
|
249
|
+
}
|
|
250
|
+
if (
|
|
251
|
+
!(
|
|
252
|
+
memberExpression.property.type === 'Identifier' &&
|
|
253
|
+
(memberExpression.property.name === 'get' ||
|
|
254
|
+
memberExpression.property.name === 'getEnforcing')
|
|
255
|
+
)
|
|
256
|
+
) {
|
|
257
|
+
return false;
|
|
258
|
+
}
|
|
259
|
+
if (memberExpression.computed) {
|
|
260
|
+
return false;
|
|
261
|
+
}
|
|
262
|
+
return true;
|
|
263
|
+
}
|
|
264
|
+
module.exports = {
|
|
265
|
+
getConfigType,
|
|
266
|
+
extractNativeModuleName,
|
|
267
|
+
createParserErrorCapturer,
|
|
268
|
+
verifyPlatforms,
|
|
269
|
+
parseFile,
|
|
270
|
+
visit,
|
|
271
|
+
buildSchemaFromConfigType,
|
|
272
|
+
isModuleRegistryCall,
|
|
273
|
+
};
|
|
@@ -0,0 +1,266 @@
|
|
|
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 {ComponentSchemaBuilderConfig} from './flow/components/schema';
|
|
14
|
+
import type {NativeModuleSchema, SchemaType} from '../CodegenSchema';
|
|
15
|
+
const {ParserError} = require('./errors');
|
|
16
|
+
const {wrapModuleSchema} = require('./parsers-commons');
|
|
17
|
+
|
|
18
|
+
const fs = require('fs');
|
|
19
|
+
const path = require('path');
|
|
20
|
+
const invariant = require('invariant');
|
|
21
|
+
|
|
22
|
+
export type TypeDeclarationMap = {[declarationName: string]: $FlowFixMe};
|
|
23
|
+
|
|
24
|
+
export type TypeAliasResolutionStatus =
|
|
25
|
+
| $ReadOnly<{
|
|
26
|
+
successful: true,
|
|
27
|
+
aliasName: string,
|
|
28
|
+
}>
|
|
29
|
+
| $ReadOnly<{
|
|
30
|
+
successful: false,
|
|
31
|
+
}>;
|
|
32
|
+
|
|
33
|
+
function extractNativeModuleName(filename: string): string {
|
|
34
|
+
// this should drop everything after the file name. For Example it will drop:
|
|
35
|
+
// .android.js, .android.ts, .android.tsx, .ios.js, .ios.ts, .ios.tsx, .js, .ts, .tsx
|
|
36
|
+
return path.basename(filename).split('.')[0];
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export type ParserErrorCapturer = <T>(fn: () => T) => ?T;
|
|
40
|
+
|
|
41
|
+
function createParserErrorCapturer(): [
|
|
42
|
+
Array<ParserError>,
|
|
43
|
+
ParserErrorCapturer,
|
|
44
|
+
] {
|
|
45
|
+
const errors = [];
|
|
46
|
+
function guard<T>(fn: () => T): ?T {
|
|
47
|
+
try {
|
|
48
|
+
return fn();
|
|
49
|
+
} catch (error) {
|
|
50
|
+
if (!(error instanceof ParserError)) {
|
|
51
|
+
throw error;
|
|
52
|
+
}
|
|
53
|
+
errors.push(error);
|
|
54
|
+
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
return [errors, guard];
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function verifyPlatforms(
|
|
63
|
+
hasteModuleName: string,
|
|
64
|
+
moduleName: string,
|
|
65
|
+
): $ReadOnly<{
|
|
66
|
+
cxxOnly: boolean,
|
|
67
|
+
excludedPlatforms: Array<'iOS' | 'android'>,
|
|
68
|
+
}> {
|
|
69
|
+
let cxxOnly = false;
|
|
70
|
+
const excludedPlatforms = new Set<'iOS' | 'android'>();
|
|
71
|
+
const namesToValidate = [moduleName, hasteModuleName];
|
|
72
|
+
|
|
73
|
+
namesToValidate.forEach(name => {
|
|
74
|
+
if (name.endsWith('Android')) {
|
|
75
|
+
excludedPlatforms.add('iOS');
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
if (name.endsWith('IOS')) {
|
|
80
|
+
excludedPlatforms.add('android');
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
if (name.endsWith('Cxx')) {
|
|
85
|
+
cxxOnly = true;
|
|
86
|
+
excludedPlatforms.add('iOS');
|
|
87
|
+
excludedPlatforms.add('android');
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
return {
|
|
93
|
+
cxxOnly,
|
|
94
|
+
excludedPlatforms: Array.from(excludedPlatforms),
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
function parseFile(
|
|
99
|
+
filename: string,
|
|
100
|
+
callback: (contents: string, filename: string) => SchemaType,
|
|
101
|
+
): SchemaType {
|
|
102
|
+
const contents = fs.readFileSync(filename, 'utf8');
|
|
103
|
+
|
|
104
|
+
return callback(contents, filename);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// TODO(T108222691): Use flow-types for @babel/parser
|
|
108
|
+
function visit(
|
|
109
|
+
astNode: $FlowFixMe,
|
|
110
|
+
visitor: {
|
|
111
|
+
[type: string]: (node: $FlowFixMe) => void,
|
|
112
|
+
},
|
|
113
|
+
) {
|
|
114
|
+
const queue = [astNode];
|
|
115
|
+
while (queue.length !== 0) {
|
|
116
|
+
let item = queue.shift();
|
|
117
|
+
|
|
118
|
+
if (!(typeof item === 'object' && item != null)) {
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
if (
|
|
123
|
+
typeof item.type === 'string' &&
|
|
124
|
+
typeof visitor[item.type] === 'function'
|
|
125
|
+
) {
|
|
126
|
+
// Don't visit any children
|
|
127
|
+
visitor[item.type](item);
|
|
128
|
+
} else if (Array.isArray(item)) {
|
|
129
|
+
queue.push(...item);
|
|
130
|
+
} else {
|
|
131
|
+
queue.push(...Object.values(item));
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
function buildSchemaFromConfigType(
|
|
137
|
+
configType: 'module' | 'component' | 'none',
|
|
138
|
+
filename: ?string,
|
|
139
|
+
ast: $FlowFixMe,
|
|
140
|
+
wrapComponentSchema: (config: ComponentSchemaBuilderConfig) => SchemaType,
|
|
141
|
+
buildComponentSchema: (ast: $FlowFixMe) => ComponentSchemaBuilderConfig,
|
|
142
|
+
buildModuleSchema: (
|
|
143
|
+
hasteModuleName: string,
|
|
144
|
+
ast: $FlowFixMe,
|
|
145
|
+
tryParse: ParserErrorCapturer,
|
|
146
|
+
) => NativeModuleSchema,
|
|
147
|
+
): SchemaType {
|
|
148
|
+
switch (configType) {
|
|
149
|
+
case 'component': {
|
|
150
|
+
return wrapComponentSchema(buildComponentSchema(ast));
|
|
151
|
+
}
|
|
152
|
+
case 'module': {
|
|
153
|
+
if (filename === undefined || filename === null) {
|
|
154
|
+
throw new Error('Filepath expected while parasing a module');
|
|
155
|
+
}
|
|
156
|
+
const nativeModuleName = extractNativeModuleName(filename);
|
|
157
|
+
|
|
158
|
+
const [parsingErrors, tryParse] = createParserErrorCapturer();
|
|
159
|
+
|
|
160
|
+
const schema = tryParse(() =>
|
|
161
|
+
buildModuleSchema(nativeModuleName, ast, tryParse),
|
|
162
|
+
);
|
|
163
|
+
|
|
164
|
+
if (parsingErrors.length > 0) {
|
|
165
|
+
/**
|
|
166
|
+
* TODO(T77968131): We have two options:
|
|
167
|
+
* - Throw the first error, but indicate there are more then one errors.
|
|
168
|
+
* - Display all errors, nicely formatted.
|
|
169
|
+
*
|
|
170
|
+
* For the time being, we're just throw the first error.
|
|
171
|
+
**/
|
|
172
|
+
|
|
173
|
+
throw parsingErrors[0];
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
invariant(
|
|
177
|
+
schema != null,
|
|
178
|
+
'When there are no parsing errors, the schema should not be null',
|
|
179
|
+
);
|
|
180
|
+
|
|
181
|
+
return wrapModuleSchema(schema, nativeModuleName);
|
|
182
|
+
}
|
|
183
|
+
default:
|
|
184
|
+
return {modules: {}};
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
function getConfigType(
|
|
189
|
+
// TODO(T71778680): Flow-type this node.
|
|
190
|
+
ast: $FlowFixMe,
|
|
191
|
+
Visitor: ({isComponent: boolean, isModule: boolean}) => {
|
|
192
|
+
[type: string]: (node: $FlowFixMe) => void,
|
|
193
|
+
},
|
|
194
|
+
): 'module' | 'component' | 'none' {
|
|
195
|
+
let infoMap = {
|
|
196
|
+
isComponent: false,
|
|
197
|
+
isModule: false,
|
|
198
|
+
};
|
|
199
|
+
|
|
200
|
+
visit(ast, Visitor(infoMap));
|
|
201
|
+
|
|
202
|
+
const {isModule, isComponent} = infoMap;
|
|
203
|
+
if (isModule && isComponent) {
|
|
204
|
+
throw new Error(
|
|
205
|
+
'Found type extending "TurboModule" and exported "codegenNativeComponent" declaration in one file. Split them into separated files.',
|
|
206
|
+
);
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
if (isModule) {
|
|
210
|
+
return 'module';
|
|
211
|
+
} else if (isComponent) {
|
|
212
|
+
return 'component';
|
|
213
|
+
} else {
|
|
214
|
+
return 'none';
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
// TODO(T71778680): Flow-type ASTNodes.
|
|
219
|
+
function isModuleRegistryCall(node: $FlowFixMe): boolean {
|
|
220
|
+
if (node.type !== 'CallExpression') {
|
|
221
|
+
return false;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
const callExpression = node;
|
|
225
|
+
|
|
226
|
+
if (callExpression.callee.type !== 'MemberExpression') {
|
|
227
|
+
return false;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
const memberExpression = callExpression.callee;
|
|
231
|
+
if (
|
|
232
|
+
!(
|
|
233
|
+
memberExpression.object.type === 'Identifier' &&
|
|
234
|
+
memberExpression.object.name === 'TurboModuleRegistry'
|
|
235
|
+
)
|
|
236
|
+
) {
|
|
237
|
+
return false;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
if (
|
|
241
|
+
!(
|
|
242
|
+
memberExpression.property.type === 'Identifier' &&
|
|
243
|
+
(memberExpression.property.name === 'get' ||
|
|
244
|
+
memberExpression.property.name === 'getEnforcing')
|
|
245
|
+
)
|
|
246
|
+
) {
|
|
247
|
+
return false;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
if (memberExpression.computed) {
|
|
251
|
+
return false;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
return true;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
module.exports = {
|
|
258
|
+
getConfigType,
|
|
259
|
+
extractNativeModuleName,
|
|
260
|
+
createParserErrorCapturer,
|
|
261
|
+
verifyPlatforms,
|
|
262
|
+
parseFile,
|
|
263
|
+
visit,
|
|
264
|
+
buildSchemaFromConfigType,
|
|
265
|
+
isModuleRegistryCall,
|
|
266
|
+
};
|
package/package.json
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@react-native/codegen",
|
|
3
|
+
"version": "0.72.1",
|
|
4
|
+
"description": "⚛️ Code generation tools for React Native",
|
|
5
|
+
"homepage": "https://github.com/facebook/react-native/tree/HEAD/packages/react-native-codegen",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "git@github.com:facebook/react-native.git",
|
|
9
|
+
"directory": "packages/react-native-codegen"
|
|
10
|
+
},
|
|
11
|
+
"scripts": {
|
|
12
|
+
"build": "yarn clean && node scripts/build.js --verbose",
|
|
13
|
+
"clean": "rimraf lib",
|
|
14
|
+
"prepare": "yarn run build"
|
|
15
|
+
},
|
|
16
|
+
"license": "MIT",
|
|
17
|
+
"files": [
|
|
18
|
+
"lib"
|
|
19
|
+
],
|
|
20
|
+
"dependencies": {
|
|
21
|
+
"@babel/parser": "^7.20.0",
|
|
22
|
+
"flow-parser": "^0.185.0",
|
|
23
|
+
"jscodeshift": "^0.14.0",
|
|
24
|
+
"nullthrows": "^1.1.1"
|
|
25
|
+
},
|
|
26
|
+
"devDependencies": {
|
|
27
|
+
"@babel/core": "^7.20.0",
|
|
28
|
+
"@babel/plugin-proposal-class-properties": "^7.0.0",
|
|
29
|
+
"@babel/plugin-proposal-nullish-coalescing-operator": "^7.0.0",
|
|
30
|
+
"@babel/plugin-proposal-object-rest-spread": "^7.0.0",
|
|
31
|
+
"@babel/plugin-proposal-optional-chaining": "^7.0.0",
|
|
32
|
+
"@babel/plugin-syntax-dynamic-import": "^7.0.0",
|
|
33
|
+
"@babel/plugin-transform-async-to-generator": "^7.0.0",
|
|
34
|
+
"@babel/plugin-transform-destructuring": "^7.0.0",
|
|
35
|
+
"@babel/plugin-transform-flow-strip-types": "^7.0.0",
|
|
36
|
+
"@babel/preset-env": "^7.14.0",
|
|
37
|
+
"chalk": "^4.0.0",
|
|
38
|
+
"glob": "^7.1.1",
|
|
39
|
+
"invariant": "^2.2.4",
|
|
40
|
+
"micromatch": "^4.0.4",
|
|
41
|
+
"mkdirp": "^0.5.1",
|
|
42
|
+
"prettier": "^2.4.1",
|
|
43
|
+
"rimraf": "^3.0.2"
|
|
44
|
+
}
|
|
45
|
+
}
|