@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,207 @@
|
|
|
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
|
+
/*
|
|
14
|
+
TODO:
|
|
15
|
+
|
|
16
|
+
- ViewConfigs should spread in View's valid attributes
|
|
17
|
+
*/
|
|
18
|
+
const fs = require('fs');
|
|
19
|
+
const generateComponentDescriptorH = require('./components/GenerateComponentDescriptorH.js');
|
|
20
|
+
const generateComponentHObjCpp = require('./components/GenerateComponentHObjCpp.js');
|
|
21
|
+
const generateEventEmitterCpp = require('./components/GenerateEventEmitterCpp.js');
|
|
22
|
+
const generateEventEmitterH = require('./components/GenerateEventEmitterH.js');
|
|
23
|
+
const generatePropsCpp = require('./components/GeneratePropsCpp.js');
|
|
24
|
+
const generatePropsH = require('./components/GeneratePropsH.js');
|
|
25
|
+
const generateStateCpp = require('./components/GenerateStateCpp.js');
|
|
26
|
+
const generateStateH = require('./components/GenerateStateH.js');
|
|
27
|
+
const generateModuleH = require('./modules/GenerateModuleH.js');
|
|
28
|
+
const generateModuleCpp = require('./modules/GenerateModuleCpp.js');
|
|
29
|
+
const generateModuleObjCpp = require('./modules/GenerateModuleObjCpp');
|
|
30
|
+
const generateModuleJavaSpec = require('./modules/GenerateModuleJavaSpec.js');
|
|
31
|
+
const GenerateModuleJniCpp = require('./modules/GenerateModuleJniCpp.js');
|
|
32
|
+
const GenerateModuleJniH = require('./modules/GenerateModuleJniH.js');
|
|
33
|
+
const generatePropsJavaInterface = require('./components/GeneratePropsJavaInterface.js');
|
|
34
|
+
const generatePropsJavaDelegate = require('./components/GeneratePropsJavaDelegate.js');
|
|
35
|
+
const generateTests = require('./components/GenerateTests.js');
|
|
36
|
+
const generateShadowNodeCpp = require('./components/GenerateShadowNodeCpp.js');
|
|
37
|
+
const generateShadowNodeH = require('./components/GenerateShadowNodeH.js');
|
|
38
|
+
const generateThirdPartyFabricComponentsProviderObjCpp = require('./components/GenerateThirdPartyFabricComponentsProviderObjCpp.js');
|
|
39
|
+
const generateThirdPartyFabricComponentsProviderH = require('./components/GenerateThirdPartyFabricComponentsProviderH.js');
|
|
40
|
+
const generateViewConfigJs = require('./components/GenerateViewConfigJs.js');
|
|
41
|
+
const path = require('path');
|
|
42
|
+
const schemaValidator = require('../SchemaValidator.js');
|
|
43
|
+
const LIBRARY_GENERATORS = {
|
|
44
|
+
descriptors: [generateComponentDescriptorH.generate],
|
|
45
|
+
events: [generateEventEmitterCpp.generate, generateEventEmitterH.generate],
|
|
46
|
+
states: [generateStateCpp.generate, generateStateH.generate],
|
|
47
|
+
props: [
|
|
48
|
+
generateComponentHObjCpp.generate,
|
|
49
|
+
generatePropsCpp.generate,
|
|
50
|
+
generatePropsH.generate,
|
|
51
|
+
generatePropsJavaInterface.generate,
|
|
52
|
+
generatePropsJavaDelegate.generate,
|
|
53
|
+
],
|
|
54
|
+
// TODO: Refactor this to consolidate various C++ output variation instead of forking per platform.
|
|
55
|
+
componentsAndroid: [
|
|
56
|
+
// JNI/C++ files
|
|
57
|
+
generateComponentDescriptorH.generate,
|
|
58
|
+
generateEventEmitterCpp.generate,
|
|
59
|
+
generateEventEmitterH.generate,
|
|
60
|
+
generatePropsCpp.generate,
|
|
61
|
+
generatePropsH.generate,
|
|
62
|
+
generateStateCpp.generate,
|
|
63
|
+
generateStateH.generate,
|
|
64
|
+
generateShadowNodeCpp.generate,
|
|
65
|
+
generateShadowNodeH.generate,
|
|
66
|
+
// Java files
|
|
67
|
+
generatePropsJavaInterface.generate,
|
|
68
|
+
generatePropsJavaDelegate.generate,
|
|
69
|
+
],
|
|
70
|
+
componentsIOS: [
|
|
71
|
+
generateComponentDescriptorH.generate,
|
|
72
|
+
generateEventEmitterCpp.generate,
|
|
73
|
+
generateEventEmitterH.generate,
|
|
74
|
+
generateComponentHObjCpp.generate,
|
|
75
|
+
generatePropsCpp.generate,
|
|
76
|
+
generatePropsH.generate,
|
|
77
|
+
generateStateCpp.generate,
|
|
78
|
+
generateStateH.generate,
|
|
79
|
+
generateShadowNodeCpp.generate,
|
|
80
|
+
generateShadowNodeH.generate,
|
|
81
|
+
],
|
|
82
|
+
modulesAndroid: [
|
|
83
|
+
GenerateModuleJniCpp.generate,
|
|
84
|
+
GenerateModuleJniH.generate,
|
|
85
|
+
generateModuleJavaSpec.generate,
|
|
86
|
+
],
|
|
87
|
+
modulesCxx: [generateModuleCpp.generate, generateModuleH.generate],
|
|
88
|
+
modulesIOS: [generateModuleObjCpp.generate],
|
|
89
|
+
tests: [generateTests.generate],
|
|
90
|
+
'shadow-nodes': [
|
|
91
|
+
generateShadowNodeCpp.generate,
|
|
92
|
+
generateShadowNodeH.generate,
|
|
93
|
+
],
|
|
94
|
+
};
|
|
95
|
+
const SCHEMAS_GENERATORS = {
|
|
96
|
+
providerIOS: [
|
|
97
|
+
generateThirdPartyFabricComponentsProviderObjCpp.generate,
|
|
98
|
+
generateThirdPartyFabricComponentsProviderH.generate,
|
|
99
|
+
],
|
|
100
|
+
};
|
|
101
|
+
function writeMapToFiles(map) {
|
|
102
|
+
let success = true;
|
|
103
|
+
map.forEach(file => {
|
|
104
|
+
try {
|
|
105
|
+
const location = path.join(file.outputDir, file.name);
|
|
106
|
+
const dirName = path.dirname(location);
|
|
107
|
+
if (!fs.existsSync(dirName)) {
|
|
108
|
+
fs.mkdirSync(dirName, {
|
|
109
|
+
recursive: true,
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
fs.writeFileSync(location, file.content);
|
|
113
|
+
} catch (error) {
|
|
114
|
+
success = false;
|
|
115
|
+
console.error(`Failed to write ${file.name} to ${file.outputDir}`, error);
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
return success;
|
|
119
|
+
}
|
|
120
|
+
function checkFilesForChanges(generated) {
|
|
121
|
+
let hasChanged = false;
|
|
122
|
+
generated.forEach(file => {
|
|
123
|
+
const location = path.join(file.outputDir, file.name);
|
|
124
|
+
const currentContents = fs.readFileSync(location, 'utf8');
|
|
125
|
+
if (currentContents !== file.content) {
|
|
126
|
+
console.error(`- ${file.name} has changed`);
|
|
127
|
+
hasChanged = true;
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
return !hasChanged;
|
|
131
|
+
}
|
|
132
|
+
function checkOrWriteFiles(generatedFiles, test) {
|
|
133
|
+
if (test === true) {
|
|
134
|
+
return checkFilesForChanges(generatedFiles);
|
|
135
|
+
}
|
|
136
|
+
return writeMapToFiles(generatedFiles);
|
|
137
|
+
}
|
|
138
|
+
module.exports = {
|
|
139
|
+
generate(
|
|
140
|
+
{libraryName, schema, outputDirectory, packageName, assumeNonnull},
|
|
141
|
+
{generators, test},
|
|
142
|
+
) {
|
|
143
|
+
schemaValidator.validate(schema);
|
|
144
|
+
function composePath(intermediate) {
|
|
145
|
+
return path.join(outputDirectory, intermediate, libraryName);
|
|
146
|
+
}
|
|
147
|
+
const componentIOSOutput = composePath('react/renderer/components/');
|
|
148
|
+
const modulesIOSOutput = composePath('./');
|
|
149
|
+
const outputFoldersForGenerators = {
|
|
150
|
+
componentsIOS: componentIOSOutput,
|
|
151
|
+
modulesIOS: modulesIOSOutput,
|
|
152
|
+
descriptors: outputDirectory,
|
|
153
|
+
events: outputDirectory,
|
|
154
|
+
props: outputDirectory,
|
|
155
|
+
states: outputDirectory,
|
|
156
|
+
componentsAndroid: outputDirectory,
|
|
157
|
+
modulesAndroid: outputDirectory,
|
|
158
|
+
modulesCxx: outputDirectory,
|
|
159
|
+
tests: outputDirectory,
|
|
160
|
+
'shadow-nodes': outputDirectory,
|
|
161
|
+
};
|
|
162
|
+
const generatedFiles = [];
|
|
163
|
+
for (const name of generators) {
|
|
164
|
+
for (const generator of LIBRARY_GENERATORS[name]) {
|
|
165
|
+
generator(libraryName, schema, packageName, assumeNonnull).forEach(
|
|
166
|
+
(contents, fileName) => {
|
|
167
|
+
generatedFiles.push({
|
|
168
|
+
name: fileName,
|
|
169
|
+
content: contents,
|
|
170
|
+
outputDir: outputFoldersForGenerators[name],
|
|
171
|
+
});
|
|
172
|
+
},
|
|
173
|
+
);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
return checkOrWriteFiles(generatedFiles, test);
|
|
177
|
+
},
|
|
178
|
+
generateFromSchemas({schemas, outputDirectory}, {generators, test}) {
|
|
179
|
+
Object.keys(schemas).forEach(libraryName =>
|
|
180
|
+
schemaValidator.validate(schemas[libraryName]),
|
|
181
|
+
);
|
|
182
|
+
const generatedFiles = [];
|
|
183
|
+
for (const name of generators) {
|
|
184
|
+
for (const generator of SCHEMAS_GENERATORS[name]) {
|
|
185
|
+
generator(schemas).forEach((contents, fileName) => {
|
|
186
|
+
generatedFiles.push({
|
|
187
|
+
name: fileName,
|
|
188
|
+
content: contents,
|
|
189
|
+
outputDir: outputDirectory,
|
|
190
|
+
});
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
return checkOrWriteFiles(generatedFiles, test);
|
|
195
|
+
},
|
|
196
|
+
generateViewConfig({libraryName, schema}) {
|
|
197
|
+
schemaValidator.validate(schema);
|
|
198
|
+
const result = generateViewConfigJs
|
|
199
|
+
.generate(libraryName, schema)
|
|
200
|
+
.values()
|
|
201
|
+
.next();
|
|
202
|
+
if (typeof result.value !== 'string') {
|
|
203
|
+
throw new Error(`Failed to generate view config for ${libraryName}`);
|
|
204
|
+
}
|
|
205
|
+
return result.value;
|
|
206
|
+
},
|
|
207
|
+
};
|
|
@@ -0,0 +1,284 @@
|
|
|
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-local
|
|
8
|
+
* @format
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
'use strict';
|
|
12
|
+
|
|
13
|
+
/*
|
|
14
|
+
TODO:
|
|
15
|
+
|
|
16
|
+
- ViewConfigs should spread in View's valid attributes
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
const fs = require('fs');
|
|
20
|
+
const generateComponentDescriptorH = require('./components/GenerateComponentDescriptorH.js');
|
|
21
|
+
const generateComponentHObjCpp = require('./components/GenerateComponentHObjCpp.js');
|
|
22
|
+
const generateEventEmitterCpp = require('./components/GenerateEventEmitterCpp.js');
|
|
23
|
+
const generateEventEmitterH = require('./components/GenerateEventEmitterH.js');
|
|
24
|
+
const generatePropsCpp = require('./components/GeneratePropsCpp.js');
|
|
25
|
+
const generatePropsH = require('./components/GeneratePropsH.js');
|
|
26
|
+
const generateStateCpp = require('./components/GenerateStateCpp.js');
|
|
27
|
+
const generateStateH = require('./components/GenerateStateH.js');
|
|
28
|
+
const generateModuleH = require('./modules/GenerateModuleH.js');
|
|
29
|
+
const generateModuleCpp = require('./modules/GenerateModuleCpp.js');
|
|
30
|
+
const generateModuleObjCpp = require('./modules/GenerateModuleObjCpp');
|
|
31
|
+
const generateModuleJavaSpec = require('./modules/GenerateModuleJavaSpec.js');
|
|
32
|
+
const GenerateModuleJniCpp = require('./modules/GenerateModuleJniCpp.js');
|
|
33
|
+
const GenerateModuleJniH = require('./modules/GenerateModuleJniH.js');
|
|
34
|
+
const generatePropsJavaInterface = require('./components/GeneratePropsJavaInterface.js');
|
|
35
|
+
const generatePropsJavaDelegate = require('./components/GeneratePropsJavaDelegate.js');
|
|
36
|
+
const generateTests = require('./components/GenerateTests.js');
|
|
37
|
+
const generateShadowNodeCpp = require('./components/GenerateShadowNodeCpp.js');
|
|
38
|
+
const generateShadowNodeH = require('./components/GenerateShadowNodeH.js');
|
|
39
|
+
const generateThirdPartyFabricComponentsProviderObjCpp = require('./components/GenerateThirdPartyFabricComponentsProviderObjCpp.js');
|
|
40
|
+
const generateThirdPartyFabricComponentsProviderH = require('./components/GenerateThirdPartyFabricComponentsProviderH.js');
|
|
41
|
+
const generateViewConfigJs = require('./components/GenerateViewConfigJs.js');
|
|
42
|
+
const path = require('path');
|
|
43
|
+
const schemaValidator = require('../SchemaValidator.js');
|
|
44
|
+
|
|
45
|
+
import type {SchemaType} from '../CodegenSchema';
|
|
46
|
+
|
|
47
|
+
type LibraryOptions = $ReadOnly<{
|
|
48
|
+
libraryName: string,
|
|
49
|
+
schema: SchemaType,
|
|
50
|
+
outputDirectory: string,
|
|
51
|
+
packageName?: string, // Some platforms have a notion of package, which should be configurable.
|
|
52
|
+
assumeNonnull: boolean,
|
|
53
|
+
}>;
|
|
54
|
+
|
|
55
|
+
type SchemasOptions = $ReadOnly<{
|
|
56
|
+
schemas: {[string]: SchemaType},
|
|
57
|
+
outputDirectory: string,
|
|
58
|
+
}>;
|
|
59
|
+
|
|
60
|
+
type LibraryGenerators =
|
|
61
|
+
| 'componentsAndroid'
|
|
62
|
+
| 'componentsIOS'
|
|
63
|
+
| 'descriptors'
|
|
64
|
+
| 'events'
|
|
65
|
+
| 'props'
|
|
66
|
+
| 'states'
|
|
67
|
+
| 'tests'
|
|
68
|
+
| 'shadow-nodes'
|
|
69
|
+
| 'modulesAndroid'
|
|
70
|
+
| 'modulesCxx'
|
|
71
|
+
| 'modulesIOS';
|
|
72
|
+
|
|
73
|
+
type SchemasGenerators = 'providerIOS';
|
|
74
|
+
|
|
75
|
+
type LibraryConfig = $ReadOnly<{
|
|
76
|
+
generators: Array<LibraryGenerators>,
|
|
77
|
+
test?: boolean,
|
|
78
|
+
}>;
|
|
79
|
+
|
|
80
|
+
type SchemasConfig = $ReadOnly<{
|
|
81
|
+
generators: Array<SchemasGenerators>,
|
|
82
|
+
test?: boolean,
|
|
83
|
+
}>;
|
|
84
|
+
|
|
85
|
+
const LIBRARY_GENERATORS = {
|
|
86
|
+
descriptors: [generateComponentDescriptorH.generate],
|
|
87
|
+
events: [generateEventEmitterCpp.generate, generateEventEmitterH.generate],
|
|
88
|
+
states: [generateStateCpp.generate, generateStateH.generate],
|
|
89
|
+
props: [
|
|
90
|
+
generateComponentHObjCpp.generate,
|
|
91
|
+
generatePropsCpp.generate,
|
|
92
|
+
generatePropsH.generate,
|
|
93
|
+
generatePropsJavaInterface.generate,
|
|
94
|
+
generatePropsJavaDelegate.generate,
|
|
95
|
+
],
|
|
96
|
+
// TODO: Refactor this to consolidate various C++ output variation instead of forking per platform.
|
|
97
|
+
componentsAndroid: [
|
|
98
|
+
// JNI/C++ files
|
|
99
|
+
generateComponentDescriptorH.generate,
|
|
100
|
+
generateEventEmitterCpp.generate,
|
|
101
|
+
generateEventEmitterH.generate,
|
|
102
|
+
generatePropsCpp.generate,
|
|
103
|
+
generatePropsH.generate,
|
|
104
|
+
generateStateCpp.generate,
|
|
105
|
+
generateStateH.generate,
|
|
106
|
+
generateShadowNodeCpp.generate,
|
|
107
|
+
generateShadowNodeH.generate,
|
|
108
|
+
// Java files
|
|
109
|
+
generatePropsJavaInterface.generate,
|
|
110
|
+
generatePropsJavaDelegate.generate,
|
|
111
|
+
],
|
|
112
|
+
componentsIOS: [
|
|
113
|
+
generateComponentDescriptorH.generate,
|
|
114
|
+
generateEventEmitterCpp.generate,
|
|
115
|
+
generateEventEmitterH.generate,
|
|
116
|
+
generateComponentHObjCpp.generate,
|
|
117
|
+
generatePropsCpp.generate,
|
|
118
|
+
generatePropsH.generate,
|
|
119
|
+
generateStateCpp.generate,
|
|
120
|
+
generateStateH.generate,
|
|
121
|
+
generateShadowNodeCpp.generate,
|
|
122
|
+
generateShadowNodeH.generate,
|
|
123
|
+
],
|
|
124
|
+
modulesAndroid: [
|
|
125
|
+
GenerateModuleJniCpp.generate,
|
|
126
|
+
GenerateModuleJniH.generate,
|
|
127
|
+
generateModuleJavaSpec.generate,
|
|
128
|
+
],
|
|
129
|
+
modulesCxx: [generateModuleCpp.generate, generateModuleH.generate],
|
|
130
|
+
modulesIOS: [generateModuleObjCpp.generate],
|
|
131
|
+
tests: [generateTests.generate],
|
|
132
|
+
'shadow-nodes': [
|
|
133
|
+
generateShadowNodeCpp.generate,
|
|
134
|
+
generateShadowNodeH.generate,
|
|
135
|
+
],
|
|
136
|
+
};
|
|
137
|
+
|
|
138
|
+
const SCHEMAS_GENERATORS = {
|
|
139
|
+
providerIOS: [
|
|
140
|
+
generateThirdPartyFabricComponentsProviderObjCpp.generate,
|
|
141
|
+
generateThirdPartyFabricComponentsProviderH.generate,
|
|
142
|
+
],
|
|
143
|
+
};
|
|
144
|
+
|
|
145
|
+
type CodeGenFile = {
|
|
146
|
+
name: string,
|
|
147
|
+
content: string,
|
|
148
|
+
outputDir: string,
|
|
149
|
+
};
|
|
150
|
+
|
|
151
|
+
function writeMapToFiles(map: Array<CodeGenFile>) {
|
|
152
|
+
let success = true;
|
|
153
|
+
map.forEach(file => {
|
|
154
|
+
try {
|
|
155
|
+
const location = path.join(file.outputDir, file.name);
|
|
156
|
+
const dirName = path.dirname(location);
|
|
157
|
+
if (!fs.existsSync(dirName)) {
|
|
158
|
+
fs.mkdirSync(dirName, {recursive: true});
|
|
159
|
+
}
|
|
160
|
+
fs.writeFileSync(location, file.content);
|
|
161
|
+
} catch (error) {
|
|
162
|
+
success = false;
|
|
163
|
+
console.error(`Failed to write ${file.name} to ${file.outputDir}`, error);
|
|
164
|
+
}
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
return success;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
function checkFilesForChanges(generated: Array<CodeGenFile>): boolean {
|
|
171
|
+
let hasChanged = false;
|
|
172
|
+
|
|
173
|
+
generated.forEach(file => {
|
|
174
|
+
const location = path.join(file.outputDir, file.name);
|
|
175
|
+
const currentContents = fs.readFileSync(location, 'utf8');
|
|
176
|
+
if (currentContents !== file.content) {
|
|
177
|
+
console.error(`- ${file.name} has changed`);
|
|
178
|
+
|
|
179
|
+
hasChanged = true;
|
|
180
|
+
}
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
return !hasChanged;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
function checkOrWriteFiles(
|
|
187
|
+
generatedFiles: Array<CodeGenFile>,
|
|
188
|
+
test: void | boolean,
|
|
189
|
+
): boolean {
|
|
190
|
+
if (test === true) {
|
|
191
|
+
return checkFilesForChanges(generatedFiles);
|
|
192
|
+
}
|
|
193
|
+
return writeMapToFiles(generatedFiles);
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
module.exports = {
|
|
197
|
+
generate(
|
|
198
|
+
{
|
|
199
|
+
libraryName,
|
|
200
|
+
schema,
|
|
201
|
+
outputDirectory,
|
|
202
|
+
packageName,
|
|
203
|
+
assumeNonnull,
|
|
204
|
+
}: LibraryOptions,
|
|
205
|
+
{generators, test}: LibraryConfig,
|
|
206
|
+
): boolean {
|
|
207
|
+
schemaValidator.validate(schema);
|
|
208
|
+
|
|
209
|
+
function composePath(intermediate: string) {
|
|
210
|
+
return path.join(outputDirectory, intermediate, libraryName);
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
const componentIOSOutput = composePath('react/renderer/components/');
|
|
214
|
+
const modulesIOSOutput = composePath('./');
|
|
215
|
+
|
|
216
|
+
const outputFoldersForGenerators = {
|
|
217
|
+
componentsIOS: componentIOSOutput,
|
|
218
|
+
modulesIOS: modulesIOSOutput,
|
|
219
|
+
descriptors: outputDirectory,
|
|
220
|
+
events: outputDirectory,
|
|
221
|
+
props: outputDirectory,
|
|
222
|
+
states: outputDirectory,
|
|
223
|
+
componentsAndroid: outputDirectory,
|
|
224
|
+
modulesAndroid: outputDirectory,
|
|
225
|
+
modulesCxx: outputDirectory,
|
|
226
|
+
tests: outputDirectory,
|
|
227
|
+
'shadow-nodes': outputDirectory,
|
|
228
|
+
};
|
|
229
|
+
|
|
230
|
+
const generatedFiles: Array<CodeGenFile> = [];
|
|
231
|
+
|
|
232
|
+
for (const name of generators) {
|
|
233
|
+
for (const generator of LIBRARY_GENERATORS[name]) {
|
|
234
|
+
generator(libraryName, schema, packageName, assumeNonnull).forEach(
|
|
235
|
+
(contents: string, fileName: string) => {
|
|
236
|
+
generatedFiles.push({
|
|
237
|
+
name: fileName,
|
|
238
|
+
content: contents,
|
|
239
|
+
outputDir: outputFoldersForGenerators[name],
|
|
240
|
+
});
|
|
241
|
+
},
|
|
242
|
+
);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
return checkOrWriteFiles(generatedFiles, test);
|
|
246
|
+
},
|
|
247
|
+
generateFromSchemas(
|
|
248
|
+
{schemas, outputDirectory}: SchemasOptions,
|
|
249
|
+
{generators, test}: SchemasConfig,
|
|
250
|
+
): boolean {
|
|
251
|
+
Object.keys(schemas).forEach(libraryName =>
|
|
252
|
+
schemaValidator.validate(schemas[libraryName]),
|
|
253
|
+
);
|
|
254
|
+
|
|
255
|
+
const generatedFiles: Array<CodeGenFile> = [];
|
|
256
|
+
|
|
257
|
+
for (const name of generators) {
|
|
258
|
+
for (const generator of SCHEMAS_GENERATORS[name]) {
|
|
259
|
+
generator(schemas).forEach((contents: string, fileName: string) => {
|
|
260
|
+
generatedFiles.push({
|
|
261
|
+
name: fileName,
|
|
262
|
+
content: contents,
|
|
263
|
+
outputDir: outputDirectory,
|
|
264
|
+
});
|
|
265
|
+
});
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
return checkOrWriteFiles(generatedFiles, test);
|
|
269
|
+
},
|
|
270
|
+
generateViewConfig({libraryName, schema}: LibraryOptions): string {
|
|
271
|
+
schemaValidator.validate(schema);
|
|
272
|
+
|
|
273
|
+
const result = generateViewConfigJs
|
|
274
|
+
.generate(libraryName, schema)
|
|
275
|
+
.values()
|
|
276
|
+
.next();
|
|
277
|
+
|
|
278
|
+
if (typeof result.value !== 'string') {
|
|
279
|
+
throw new Error(`Failed to generate view config for ${libraryName}`);
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
return result.value;
|
|
283
|
+
},
|
|
284
|
+
};
|
|
@@ -0,0 +1,31 @@
|
|
|
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 capitalize(string) {
|
|
14
|
+
return string.charAt(0).toUpperCase() + string.slice(1);
|
|
15
|
+
}
|
|
16
|
+
function indent(nice, spaces) {
|
|
17
|
+
return nice
|
|
18
|
+
.split('\n')
|
|
19
|
+
.map((line, index) => {
|
|
20
|
+
if (line.length === 0 || index === 0) {
|
|
21
|
+
return line;
|
|
22
|
+
}
|
|
23
|
+
const emptySpaces = new Array(spaces + 1).join(' ');
|
|
24
|
+
return emptySpaces + line;
|
|
25
|
+
})
|
|
26
|
+
.join('\n');
|
|
27
|
+
}
|
|
28
|
+
module.exports = {
|
|
29
|
+
capitalize,
|
|
30
|
+
indent,
|
|
31
|
+
};
|
|
@@ -0,0 +1,33 @@
|
|
|
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
|
+
function capitalize(string: string): string {
|
|
14
|
+
return string.charAt(0).toUpperCase() + string.slice(1);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
function indent(nice: string, spaces: number): string {
|
|
18
|
+
return nice
|
|
19
|
+
.split('\n')
|
|
20
|
+
.map((line, index) => {
|
|
21
|
+
if (line.length === 0 || index === 0) {
|
|
22
|
+
return line;
|
|
23
|
+
}
|
|
24
|
+
const emptySpaces = new Array<mixed>(spaces + 1).join(' ');
|
|
25
|
+
return emptySpaces + line;
|
|
26
|
+
})
|
|
27
|
+
.join('\n');
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
module.exports = {
|
|
31
|
+
capitalize,
|
|
32
|
+
indent,
|
|
33
|
+
};
|
|
@@ -0,0 +1,79 @@
|
|
|
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 SCHEMA_WITH_TM_AND_FC = {
|
|
14
|
+
modules: {
|
|
15
|
+
ColoredView: {
|
|
16
|
+
type: 'Component',
|
|
17
|
+
components: {
|
|
18
|
+
ColoredView: {
|
|
19
|
+
extendsProps: [
|
|
20
|
+
{
|
|
21
|
+
type: 'ReactNativeBuiltInType',
|
|
22
|
+
knownTypeName: 'ReactNativeCoreViewProps',
|
|
23
|
+
},
|
|
24
|
+
],
|
|
25
|
+
events: [],
|
|
26
|
+
props: [
|
|
27
|
+
{
|
|
28
|
+
name: 'color',
|
|
29
|
+
optional: false,
|
|
30
|
+
typeAnnotation: {
|
|
31
|
+
type: 'StringTypeAnnotation',
|
|
32
|
+
default: null,
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
],
|
|
36
|
+
commands: [],
|
|
37
|
+
},
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
NativeCalculator: {
|
|
41
|
+
type: 'NativeModule',
|
|
42
|
+
aliases: {},
|
|
43
|
+
spec: {
|
|
44
|
+
properties: [
|
|
45
|
+
{
|
|
46
|
+
name: 'add',
|
|
47
|
+
optional: false,
|
|
48
|
+
typeAnnotation: {
|
|
49
|
+
type: 'FunctionTypeAnnotation',
|
|
50
|
+
returnTypeAnnotation: {
|
|
51
|
+
type: 'PromiseTypeAnnotation',
|
|
52
|
+
},
|
|
53
|
+
params: [
|
|
54
|
+
{
|
|
55
|
+
name: 'a',
|
|
56
|
+
optional: false,
|
|
57
|
+
typeAnnotation: {
|
|
58
|
+
type: 'NumberTypeAnnotation',
|
|
59
|
+
},
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
name: 'b',
|
|
63
|
+
optional: false,
|
|
64
|
+
typeAnnotation: {
|
|
65
|
+
type: 'NumberTypeAnnotation',
|
|
66
|
+
},
|
|
67
|
+
},
|
|
68
|
+
],
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
],
|
|
72
|
+
},
|
|
73
|
+
moduleName: 'Calculator',
|
|
74
|
+
},
|
|
75
|
+
},
|
|
76
|
+
};
|
|
77
|
+
module.exports = {
|
|
78
|
+
all: SCHEMA_WITH_TM_AND_FC,
|
|
79
|
+
};
|