@react-native/codegen 0.72.3 → 0.73.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/lib/CodegenSchema.d.ts +10 -10
  2. package/lib/CodegenSchema.js.flow +6 -1
  3. package/lib/SchemaValidator.d.ts +1 -1
  4. package/lib/generators/RNCodegen.d.ts +98 -0
  5. package/lib/generators/RNCodegen.js +33 -4
  6. package/lib/generators/RNCodegen.js.flow +35 -4
  7. package/lib/generators/components/ComponentsGeneratorUtils.js +2 -0
  8. package/lib/generators/components/ComponentsGeneratorUtils.js.flow +2 -0
  9. package/lib/generators/components/CppHelpers.js +2 -0
  10. package/lib/generators/components/CppHelpers.js.flow +2 -0
  11. package/lib/generators/components/GenerateEventEmitterCpp.js +33 -44
  12. package/lib/generators/components/GenerateEventEmitterCpp.js.flow +35 -44
  13. package/lib/generators/components/GenerateEventEmitterH.js +0 -2
  14. package/lib/generators/components/GenerateEventEmitterH.js.flow +0 -2
  15. package/lib/generators/components/GeneratePropsH.js +2 -0
  16. package/lib/generators/components/GeneratePropsH.js.flow +2 -0
  17. package/lib/generators/components/GeneratePropsJavaDelegate.js +2 -0
  18. package/lib/generators/components/GeneratePropsJavaDelegate.js.flow +2 -0
  19. package/lib/generators/components/GeneratePropsJavaInterface.js +2 -0
  20. package/lib/generators/components/GeneratePropsJavaInterface.js.flow +2 -0
  21. package/lib/generators/components/GeneratePropsJavaPojo/PojoCollector.js.flow +3 -1
  22. package/lib/generators/components/GeneratePropsJavaPojo/serializePojo.js +5 -0
  23. package/lib/generators/components/GeneratePropsJavaPojo/serializePojo.js.flow +6 -0
  24. package/lib/generators/components/GenerateViewConfigJs.js +1 -0
  25. package/lib/generators/components/GenerateViewConfigJs.js.flow +1 -0
  26. package/lib/generators/components/JavaHelpers.js +7 -0
  27. package/lib/generators/components/JavaHelpers.js.flow +8 -0
  28. package/lib/generators/components/__test_fixtures__/fixtures.js +29 -0
  29. package/lib/generators/components/__test_fixtures__/fixtures.js.flow +30 -0
  30. package/lib/generators/modules/GenerateModuleCpp.js +3 -3
  31. package/lib/generators/modules/GenerateModuleCpp.js.flow +3 -3
  32. package/lib/generators/modules/GenerateModuleJavaSpec.js +1 -2
  33. package/lib/generators/modules/GenerateModuleJavaSpec.js.flow +1 -2
  34. package/lib/parsers/error-utils.js +9 -15
  35. package/lib/parsers/error-utils.js.flow +12 -15
  36. package/lib/parsers/flow/components/__test_fixtures__/fixtures.js +5 -1
  37. package/lib/parsers/flow/components/__test_fixtures__/fixtures.js.flow +5 -1
  38. package/lib/parsers/flow/components/componentsUtils.js +4 -0
  39. package/lib/parsers/flow/components/componentsUtils.js.flow +4 -0
  40. package/lib/parsers/flow/components/index.js +35 -168
  41. package/lib/parsers/flow/components/index.js.flow +33 -107
  42. package/lib/parsers/flow/modules/__test_fixtures__/fixtures.js +4 -4
  43. package/lib/parsers/flow/modules/__test_fixtures__/fixtures.js.flow +4 -4
  44. package/lib/parsers/flow/modules/index.js +51 -327
  45. package/lib/parsers/flow/modules/index.js.flow +34 -258
  46. package/lib/parsers/flow/parser.js +84 -13
  47. package/lib/parsers/flow/parser.js.flow +80 -4
  48. package/lib/parsers/parser.d.ts +2 -2
  49. package/lib/parsers/parser.js.flow +84 -3
  50. package/lib/parsers/parserMock.js +53 -0
  51. package/lib/parsers/parserMock.js.flow +64 -1
  52. package/lib/parsers/parsers-commons.js +397 -4
  53. package/lib/parsers/parsers-commons.js.flow +391 -4
  54. package/lib/parsers/parsers-primitives.js +121 -3
  55. package/lib/parsers/parsers-primitives.js.flow +134 -3
  56. package/lib/parsers/schema/index.d.ts +1 -1
  57. package/lib/parsers/typescript/components/__test_fixtures__/fixtures.js +5 -1
  58. package/lib/parsers/typescript/components/__test_fixtures__/fixtures.js.flow +5 -1
  59. package/lib/parsers/typescript/components/componentsUtils.js +8 -0
  60. package/lib/parsers/typescript/components/componentsUtils.js.flow +8 -0
  61. package/lib/parsers/typescript/components/index.js +37 -170
  62. package/lib/parsers/typescript/components/index.js.flow +33 -109
  63. package/lib/parsers/typescript/modules/index.js +113 -441
  64. package/lib/parsers/typescript/modules/index.js.flow +100 -309
  65. package/lib/parsers/typescript/parser.js +97 -13
  66. package/lib/parsers/typescript/parser.js.flow +94 -4
  67. package/lib/parsers/utils.js +4 -0
  68. package/lib/parsers/utils.js.flow +3 -0
  69. package/package.json +1 -1
  70. package/lib/parsers/flow/Visitor.js +0 -37
  71. package/lib/parsers/flow/Visitor.js.flow +0 -41
  72. package/lib/parsers/flow/components/options.js +0 -72
  73. package/lib/parsers/flow/components/options.js.flow +0 -87
  74. package/lib/parsers/typescript/Visitor.js +0 -42
  75. package/lib/parsers/typescript/Visitor.js.flow +0 -47
  76. package/lib/parsers/typescript/components/options.js +0 -72
  77. package/lib/parsers/typescript/components/options.js.flow +0 -87
@@ -47,7 +47,7 @@ export interface VoidTypeAnnotation {
47
47
  export interface ObjectTypeAnnotation<T> {
48
48
  readonly type: 'ObjectTypeAnnotation';
49
49
  readonly properties: readonly NamedShape<T>[];
50
- readonly baseTypes?: readonly string[];
50
+ readonly baseTypes?: readonly string[] | undefined;
51
51
  }
52
52
 
53
53
  export interface FunctionTypeAnnotation<P, R> {
@@ -77,10 +77,10 @@ export interface ComponentShape extends OptionsShape {
77
77
  }
78
78
 
79
79
  export interface OptionsShape {
80
- readonly interfaceOnly?: boolean;
81
- readonly paperComponentName?: string;
82
- readonly excludedPlatforms?: readonly PlatformType[];
83
- readonly paperComponentNameDeprecated?: string;
80
+ readonly interfaceOnly?: boolean | undefined;
81
+ readonly paperComponentName?: string | undefined;
82
+ readonly excludedPlatforms?: readonly PlatformType[] | undefined;
83
+ readonly paperComponentNameDeprecated?: string | undefined;
84
84
  }
85
85
 
86
86
  export interface ExtendsPropsShape {
@@ -94,10 +94,10 @@ export interface EventTypeShape {
94
94
  | 'direct'
95
95
  | 'bubble';
96
96
  readonly optional: boolean;
97
- readonly paperTopLevelNameDeprecated?: string;
97
+ readonly paperTopLevelNameDeprecated?: string | undefined;
98
98
  readonly typeAnnotation: {
99
99
  readonly type: 'EventTypeAnnotation';
100
- readonly argument?: ObjectTypeAnnotation<EventTypeAnnotation>;
100
+ readonly argument?: ObjectTypeAnnotation<EventTypeAnnotation> | undefined;
101
101
  };
102
102
  }
103
103
 
@@ -211,7 +211,7 @@ export interface NativeModuleSchema {
211
211
  readonly enumMap: NativeModuleEnumMap;
212
212
  readonly spec: NativeModuleSpec;
213
213
  readonly moduleName: string;
214
- readonly excludedPlatforms?: readonly PlatformType[];
214
+ readonly excludedPlatforms?: readonly PlatformType[] | undefined;
215
215
  }
216
216
 
217
217
  export interface NativeModuleSpec {
@@ -234,7 +234,7 @@ export type NativeModuleObjectTypeAnnotation = ObjectTypeAnnotation<Nullable<Nat
234
234
 
235
235
  export interface NativeModuleArrayTypeAnnotation<T extends Nullable<NativeModuleBaseTypeAnnotation>> {
236
236
  readonly type: 'ArrayTypeAnnotation';
237
- readonly elementType?: T;
237
+ readonly elementType?: T | undefined;
238
238
  }
239
239
 
240
240
  export interface NativeModuleStringTypeAnnotation {
@@ -294,7 +294,7 @@ export interface NativeModuleTypeAliasTypeAnnotation {
294
294
 
295
295
  export interface NativeModulePromiseTypeAnnotation {
296
296
  readonly type: 'PromiseTypeAnnotation';
297
- readonly elementType?: Nullable<NativeModuleBaseTypeAnnotation>;
297
+ readonly elementType?: Nullable<NativeModuleBaseTypeAnnotation> | undefined;
298
298
  }
299
299
 
300
300
  export type UnionTypeAnnotationMemberType =
@@ -58,6 +58,10 @@ export type ObjectTypeAnnotation<+T> = $ReadOnly<{
58
58
  baseTypes?: $ReadOnlyArray<string>,
59
59
  }>;
60
60
 
61
+ export type MixedTypeAnnotation = $ReadOnly<{
62
+ type: 'MixedTypeAnnotation',
63
+ }>;
64
+
61
65
  type FunctionTypeAnnotation<+P, +R> = $ReadOnly<{
62
66
  type: 'FunctionTypeAnnotation',
63
67
  params: $ReadOnlyArray<NamedShape<P>>,
@@ -177,7 +181,8 @@ export type PropTypeAnnotation =
177
181
  type: 'ArrayTypeAnnotation',
178
182
  elementType: ObjectTypeAnnotation<PropTypeAnnotation>,
179
183
  }>,
180
- }>;
184
+ }>
185
+ | MixedTypeAnnotation;
181
186
 
182
187
  export type ReservedPropTypeAnnotation = $ReadOnly<{
183
188
  type: 'ReservedPropTypeAnnotation',
@@ -5,7 +5,7 @@
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  */
7
7
 
8
- import type { SchemaType } from "./CodegenSchema";
8
+ import type { SchemaType } from './CodegenSchema';
9
9
 
10
10
  export declare function getErrors(schema: SchemaType): readonly string[];
11
11
  export declare function validate(schema: SchemaType): void;
@@ -0,0 +1,98 @@
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
+ import type { SchemaType } from '../CodegenSchema';
9
+
10
+ export type FilesOutput = Map<string, string>;
11
+ export type LibraryGeneratorFunction = (libraryName: string, schema: SchemaType, packageName: string | undefined, assumeNonnull: boolean) => FilesOutput;
12
+ export type SchemaGeneratorFunction = (schemas: { [key: string]: SchemaType }) => FilesOutput;
13
+ export type ViewGeneratorFunction = (libraryName: string, schema: SchemaType) => FilesOutput;
14
+
15
+ type LibraryGeneratorNames =
16
+ | 'generateComponentDescriptorH'
17
+ | 'generateComponentHObjCpp'
18
+ | 'generateEventEmitterCpp'
19
+ | 'generateEventEmitterH'
20
+ | 'generatePropsCpp'
21
+ | 'generatePropsH'
22
+ | 'generateStateCpp'
23
+ | 'generateStateH'
24
+ | 'generateModuleH'
25
+ | 'generateModuleCpp'
26
+ | 'generateModuleObjCpp'
27
+ | 'generateModuleJavaSpec'
28
+ | 'generateModuleJniCpp'
29
+ | 'generateModuleJniH'
30
+ | 'generatePropsJavaInterface'
31
+ | 'generatePropsJavaDelegate'
32
+ | 'generateTests'
33
+ | 'generateShadowNodeCpp'
34
+ | 'generateShadowNodeH'
35
+ ;
36
+
37
+ type SchemaGeneratorNames =
38
+ | 'generateThirdPartyFabricComponentsProviderObjCpp'
39
+ | 'generateThirdPartyFabricComponentsProviderH'
40
+ ;
41
+
42
+ type ViewGeneratorNames =
43
+ | 'generateViewConfigJs'
44
+ ;
45
+
46
+ export type AllGenerators =
47
+ & { readonly [key in LibraryGeneratorNames]: LibraryGeneratorFunction; }
48
+ & { readonly [key in SchemaGeneratorNames]: SchemaGeneratorFunction; }
49
+ & { readonly [key in ViewGeneratorNames]: ViewGeneratorFunction; }
50
+ ;
51
+
52
+ export type LibraryGenerators =
53
+ | 'componentsAndroid'
54
+ | 'componentsIOS'
55
+ | 'descriptors'
56
+ | 'events'
57
+ | 'props'
58
+ | 'states'
59
+ | 'tests'
60
+ | 'shadow-nodes'
61
+ | 'modulesAndroid'
62
+ | 'modulesCxx'
63
+ | 'modulesIOS'
64
+ ;
65
+
66
+ export type SchemaGenerators =
67
+ | 'providerIOS'
68
+ ;
69
+
70
+ export interface LibraryOptions {
71
+ libraryName: string;
72
+ schema: SchemaType;
73
+ outputDirectory: string;
74
+ packageName?: string | undefined;
75
+ assumeNonnull: boolean;
76
+ }
77
+
78
+ export interface LibraryConfig {
79
+ generators: LibraryGenerators[];
80
+ test?: boolean | undefined;
81
+ }
82
+
83
+ export interface SchemasOptions {
84
+ schemas: { [key: string]: SchemaType };
85
+ outputDirectory: string;
86
+ }
87
+
88
+ export interface SchemasConfig {
89
+ generators: SchemaGenerators[];
90
+ test?: boolean | undefined;
91
+ }
92
+
93
+ export declare const allGenerators: AllGenerators;
94
+ export declare const libraryGenerators: { readonly [key in LibraryGenerators]: LibraryGeneratorFunction };
95
+ export declare const schemaGenerators: { readonly [key in SchemaGenerators]: SchemaGeneratorFunction };
96
+ export declare function generate(options: LibraryOptions, config: LibraryConfig): boolean;
97
+ export declare function generateFromSchemas(options: SchemasOptions, config: SchemasConfig): boolean;
98
+ export declare function generateViewConfig(options: LibraryOptions): string;
@@ -28,8 +28,8 @@ const generateModuleH = require('./modules/GenerateModuleH.js');
28
28
  const generateModuleCpp = require('./modules/GenerateModuleCpp.js');
29
29
  const generateModuleObjCpp = require('./modules/GenerateModuleObjCpp');
30
30
  const generateModuleJavaSpec = require('./modules/GenerateModuleJavaSpec.js');
31
- const GenerateModuleJniCpp = require('./modules/GenerateModuleJniCpp.js');
32
- const GenerateModuleJniH = require('./modules/GenerateModuleJniH.js');
31
+ const generateModuleJniCpp = require('./modules/GenerateModuleJniCpp.js');
32
+ const generateModuleJniH = require('./modules/GenerateModuleJniH.js');
33
33
  const generatePropsJavaInterface = require('./components/GeneratePropsJavaInterface.js');
34
34
  const generatePropsJavaDelegate = require('./components/GeneratePropsJavaDelegate.js');
35
35
  const generateTests = require('./components/GenerateTests.js');
@@ -40,6 +40,32 @@ const generateThirdPartyFabricComponentsProviderH = require('./components/Genera
40
40
  const generateViewConfigJs = require('./components/GenerateViewConfigJs.js');
41
41
  const path = require('path');
42
42
  const schemaValidator = require('../SchemaValidator.js');
43
+ const ALL_GENERATORS = {
44
+ generateComponentDescriptorH: generateComponentDescriptorH.generate,
45
+ generateComponentHObjCpp: generateComponentHObjCpp.generate,
46
+ generateEventEmitterCpp: generateEventEmitterCpp.generate,
47
+ generateEventEmitterH: generateEventEmitterH.generate,
48
+ generatePropsCpp: generatePropsCpp.generate,
49
+ generatePropsH: generatePropsH.generate,
50
+ generateStateCpp: generateStateCpp.generate,
51
+ generateStateH: generateStateH.generate,
52
+ generateModuleH: generateModuleH.generate,
53
+ generateModuleCpp: generateModuleCpp.generate,
54
+ generateModuleObjCpp: generateModuleObjCpp.generate,
55
+ generateModuleJavaSpec: generateModuleJavaSpec.generate,
56
+ generateModuleJniCpp: generateModuleJniCpp.generate,
57
+ generateModuleJniH: generateModuleJniH.generate,
58
+ generatePropsJavaInterface: generatePropsJavaInterface.generate,
59
+ generatePropsJavaDelegate: generatePropsJavaDelegate.generate,
60
+ generateTests: generateTests.generate,
61
+ generateShadowNodeCpp: generateShadowNodeCpp.generate,
62
+ generateShadowNodeH: generateShadowNodeH.generate,
63
+ generateThirdPartyFabricComponentsProviderObjCpp:
64
+ generateThirdPartyFabricComponentsProviderObjCpp.generate,
65
+ generateThirdPartyFabricComponentsProviderH:
66
+ generateThirdPartyFabricComponentsProviderH.generate,
67
+ generateViewConfigJs: generateViewConfigJs.generate,
68
+ };
43
69
  const LIBRARY_GENERATORS = {
44
70
  descriptors: [generateComponentDescriptorH.generate],
45
71
  events: [generateEventEmitterCpp.generate, generateEventEmitterH.generate],
@@ -80,8 +106,8 @@ const LIBRARY_GENERATORS = {
80
106
  generateShadowNodeH.generate,
81
107
  ],
82
108
  modulesAndroid: [
83
- GenerateModuleJniCpp.generate,
84
- GenerateModuleJniH.generate,
109
+ generateModuleJniCpp.generate,
110
+ generateModuleJniH.generate,
85
111
  generateModuleJavaSpec.generate,
86
112
  ],
87
113
  modulesCxx: [generateModuleCpp.generate, generateModuleH.generate],
@@ -136,6 +162,9 @@ function checkOrWriteFiles(generatedFiles, test) {
136
162
  return writeMapToFiles(generatedFiles);
137
163
  }
138
164
  module.exports = {
165
+ allGenerators: ALL_GENERATORS,
166
+ libraryGenerators: LIBRARY_GENERATORS,
167
+ schemaGenerators: SCHEMAS_GENERATORS,
139
168
  generate(
140
169
  {libraryName, schema, outputDirectory, packageName, assumeNonnull},
141
170
  {generators, test},
@@ -29,8 +29,8 @@ const generateModuleH = require('./modules/GenerateModuleH.js');
29
29
  const generateModuleCpp = require('./modules/GenerateModuleCpp.js');
30
30
  const generateModuleObjCpp = require('./modules/GenerateModuleObjCpp');
31
31
  const generateModuleJavaSpec = require('./modules/GenerateModuleJavaSpec.js');
32
- const GenerateModuleJniCpp = require('./modules/GenerateModuleJniCpp.js');
33
- const GenerateModuleJniH = require('./modules/GenerateModuleJniH.js');
32
+ const generateModuleJniCpp = require('./modules/GenerateModuleJniCpp.js');
33
+ const generateModuleJniH = require('./modules/GenerateModuleJniH.js');
34
34
  const generatePropsJavaInterface = require('./components/GeneratePropsJavaInterface.js');
35
35
  const generatePropsJavaDelegate = require('./components/GeneratePropsJavaDelegate.js');
36
36
  const generateTests = require('./components/GenerateTests.js');
@@ -42,6 +42,33 @@ const generateViewConfigJs = require('./components/GenerateViewConfigJs.js');
42
42
  const path = require('path');
43
43
  const schemaValidator = require('../SchemaValidator.js');
44
44
 
45
+ const ALL_GENERATORS = {
46
+ generateComponentDescriptorH: generateComponentDescriptorH.generate,
47
+ generateComponentHObjCpp: generateComponentHObjCpp.generate,
48
+ generateEventEmitterCpp: generateEventEmitterCpp.generate,
49
+ generateEventEmitterH: generateEventEmitterH.generate,
50
+ generatePropsCpp: generatePropsCpp.generate,
51
+ generatePropsH: generatePropsH.generate,
52
+ generateStateCpp: generateStateCpp.generate,
53
+ generateStateH: generateStateH.generate,
54
+ generateModuleH: generateModuleH.generate,
55
+ generateModuleCpp: generateModuleCpp.generate,
56
+ generateModuleObjCpp: generateModuleObjCpp.generate,
57
+ generateModuleJavaSpec: generateModuleJavaSpec.generate,
58
+ generateModuleJniCpp: generateModuleJniCpp.generate,
59
+ generateModuleJniH: generateModuleJniH.generate,
60
+ generatePropsJavaInterface: generatePropsJavaInterface.generate,
61
+ generatePropsJavaDelegate: generatePropsJavaDelegate.generate,
62
+ generateTests: generateTests.generate,
63
+ generateShadowNodeCpp: generateShadowNodeCpp.generate,
64
+ generateShadowNodeH: generateShadowNodeH.generate,
65
+ generateThirdPartyFabricComponentsProviderObjCpp:
66
+ generateThirdPartyFabricComponentsProviderObjCpp.generate,
67
+ generateThirdPartyFabricComponentsProviderH:
68
+ generateThirdPartyFabricComponentsProviderH.generate,
69
+ generateViewConfigJs: generateViewConfigJs.generate,
70
+ };
71
+
45
72
  import type {SchemaType} from '../CodegenSchema';
46
73
 
47
74
  type LibraryOptions = $ReadOnly<{
@@ -122,8 +149,8 @@ const LIBRARY_GENERATORS = {
122
149
  generateShadowNodeH.generate,
123
150
  ],
124
151
  modulesAndroid: [
125
- GenerateModuleJniCpp.generate,
126
- GenerateModuleJniH.generate,
152
+ generateModuleJniCpp.generate,
153
+ generateModuleJniH.generate,
127
154
  generateModuleJavaSpec.generate,
128
155
  ],
129
156
  modulesCxx: [generateModuleCpp.generate, generateModuleH.generate],
@@ -194,6 +221,10 @@ function checkOrWriteFiles(
194
221
  }
195
222
 
196
223
  module.exports = {
224
+ allGenerators: ALL_GENERATORS,
225
+ libraryGenerators: LIBRARY_GENERATORS,
226
+ schemaGenerators: SCHEMAS_GENERATORS,
227
+
197
228
  generate(
198
229
  {
199
230
  libraryName,
@@ -84,6 +84,8 @@ function getNativeTypeFromAnnotation(componentName, prop, nameParts) {
84
84
  return getEnumName(componentName, prop.name);
85
85
  case 'Int32EnumTypeAnnotation':
86
86
  return getEnumName(componentName, prop.name);
87
+ case 'MixedTypeAnnotation':
88
+ return 'folly::dynamic';
87
89
  default:
88
90
  typeAnnotation;
89
91
  throw new Error(
@@ -122,6 +122,8 @@ function getNativeTypeFromAnnotation(
122
122
  return getEnumName(componentName, prop.name);
123
123
  case 'Int32EnumTypeAnnotation':
124
124
  return getEnumName(componentName, prop.name);
125
+ case 'MixedTypeAnnotation':
126
+ return 'folly::dynamic';
125
127
  default:
126
128
  (typeAnnotation: empty);
127
129
  throw new Error(
@@ -165,6 +165,8 @@ function convertDefaultTypeToString(componentName, prop) {
165
165
  prop.name,
166
166
  typeAnnotation.default,
167
167
  )}`;
168
+ case 'MixedTypeAnnotation':
169
+ return '';
168
170
  default:
169
171
  typeAnnotation;
170
172
  throw new Error(`Unsupported type annotation: ${typeAnnotation.type}`);
@@ -200,6 +200,8 @@ function convertDefaultTypeToString(
200
200
  prop.name,
201
201
  typeAnnotation.default,
202
202
  )}`;
203
+ case 'MixedTypeAnnotation':
204
+ return '';
203
205
  default:
204
206
  (typeAnnotation: empty);
205
207
  throw new Error(`Unsupported type annotation: ${typeAnnotation.type}`);
@@ -26,9 +26,7 @@ const FileTemplate = ({events, libraryName}) => `
26
26
 
27
27
  namespace facebook {
28
28
  namespace react {
29
-
30
29
  ${events}
31
-
32
30
  } // namespace react
33
31
  } // namespace facebook
34
32
  `;
@@ -39,16 +37,16 @@ const ComponentTemplate = ({
39
37
  dispatchEventName,
40
38
  implementation,
41
39
  }) => {
42
- const capture = implementation.includes('event')
43
- ? 'event=std::move(event)'
40
+ const capture = implementation.includes('$event')
41
+ ? '$event=std::move($event)'
44
42
  : '';
45
43
  return `
46
- void ${className}EventEmitter::${eventName}(${structName} event) const {
44
+ void ${className}EventEmitter::${eventName}(${structName} $event) const {
47
45
  dispatchEvent("${dispatchEventName}", [${capture}](jsi::Runtime &runtime) {
48
46
  ${implementation}
49
47
  });
50
48
  }
51
- `.trim();
49
+ `;
52
50
  };
53
51
  const BasicComponentTemplate = ({className, eventName, dispatchEventName}) =>
54
52
  `
@@ -58,47 +56,45 @@ void ${className}EventEmitter::${eventName}() const {
58
56
  `.trim();
59
57
  function generateSetter(variableName, propertyName, propertyParts) {
60
58
  const trailingPeriod = propertyParts.length === 0 ? '' : '.';
61
- const eventChain = `event.${propertyParts.join(
59
+ const eventChain = `$event.${propertyParts.join(
62
60
  '.',
63
61
  )}${trailingPeriod}${propertyName});`;
64
62
  return `${variableName}.setProperty(runtime, "${propertyName}", ${eventChain}`;
65
63
  }
66
64
  function generateEnumSetter(variableName, propertyName, propertyParts) {
67
65
  const trailingPeriod = propertyParts.length === 0 ? '' : '.';
68
- const eventChain = `event.${propertyParts.join(
66
+ const eventChain = `$event.${propertyParts.join(
69
67
  '.',
70
68
  )}${trailingPeriod}${propertyName})`;
71
69
  return `${variableName}.setProperty(runtime, "${propertyName}", toString(${eventChain});`;
72
70
  }
71
+ function generateObjectSetter(
72
+ variableName,
73
+ propertyName,
74
+ propertyParts,
75
+ typeAnnotation,
76
+ ) {
77
+ return `
78
+ {
79
+ auto ${propertyName} = jsi::Object(runtime);
80
+ ${generateSetters(
81
+ propertyName,
82
+ typeAnnotation.properties,
83
+ propertyParts.concat([propertyName]),
84
+ )}
85
+ ${variableName}.setProperty(runtime, "${propertyName}", ${propertyName});
86
+ }
87
+ `.trim();
88
+ }
73
89
  function generateSetters(parentPropertyName, properties, propertyParts) {
74
90
  const propSetters = properties
75
91
  .map(eventProperty => {
76
92
  const typeAnnotation = eventProperty.typeAnnotation;
77
93
  switch (typeAnnotation.type) {
78
94
  case 'BooleanTypeAnnotation':
79
- return generateSetter(
80
- parentPropertyName,
81
- eventProperty.name,
82
- propertyParts,
83
- );
84
95
  case 'StringTypeAnnotation':
85
- return generateSetter(
86
- parentPropertyName,
87
- eventProperty.name,
88
- propertyParts,
89
- );
90
96
  case 'Int32TypeAnnotation':
91
- return generateSetter(
92
- parentPropertyName,
93
- eventProperty.name,
94
- propertyParts,
95
- );
96
97
  case 'DoubleTypeAnnotation':
97
- return generateSetter(
98
- parentPropertyName,
99
- eventProperty.name,
100
- propertyParts,
101
- );
102
98
  case 'FloatTypeAnnotation':
103
99
  return generateSetter(
104
100
  parentPropertyName,
@@ -112,19 +108,12 @@ function generateSetters(parentPropertyName, properties, propertyParts) {
112
108
  propertyParts,
113
109
  );
114
110
  case 'ObjectTypeAnnotation':
115
- const propertyName = eventProperty.name;
116
- return `
117
- {
118
- auto ${propertyName} = jsi::Object(runtime);
119
- ${generateSetters(
120
- propertyName,
121
- typeAnnotation.properties,
122
- propertyParts.concat([propertyName]),
123
- )}
124
-
125
- ${parentPropertyName}.setProperty(runtime, "${propertyName}", ${propertyName});
126
- }
127
- `.trim();
111
+ return generateObjectSetter(
112
+ parentPropertyName,
113
+ eventProperty.name,
114
+ propertyParts,
115
+ typeAnnotation,
116
+ );
128
117
  default:
129
118
  typeAnnotation.type;
130
119
  throw new Error('Received invalid event property type');
@@ -145,9 +134,9 @@ function generateEvent(componentName, event) {
145
134
  )}`;
146
135
  if (event.typeAnnotation.argument) {
147
136
  const implementation = `
148
- auto payload = jsi::Object(runtime);
149
- ${generateSetters('payload', event.typeAnnotation.argument.properties, [])}
150
- return payload;
137
+ auto $payload = jsi::Object(runtime);
138
+ ${generateSetters('$payload', event.typeAnnotation.argument.properties, [])}
139
+ return $payload;
151
140
  `.trim();
152
141
  if (!event.name.startsWith('on')) {
153
142
  throw new Error('Expected the event name to start with `on`');
@@ -18,6 +18,7 @@ import type {
18
18
  NamedShape,
19
19
  EventTypeAnnotation,
20
20
  SchemaType,
21
+ ObjectTypeAnnotation,
21
22
  } from '../../CodegenSchema';
22
23
 
23
24
  // File path -> contents
@@ -48,9 +49,7 @@ const FileTemplate = ({
48
49
 
49
50
  namespace facebook {
50
51
  namespace react {
51
-
52
52
  ${events}
53
-
54
53
  } // namespace react
55
54
  } // namespace facebook
56
55
  `;
@@ -68,16 +67,16 @@ const ComponentTemplate = ({
68
67
  dispatchEventName: string,
69
68
  implementation: string,
70
69
  }) => {
71
- const capture = implementation.includes('event')
72
- ? 'event=std::move(event)'
70
+ const capture = implementation.includes('$event')
71
+ ? '$event=std::move($event)'
73
72
  : '';
74
73
  return `
75
- void ${className}EventEmitter::${eventName}(${structName} event) const {
74
+ void ${className}EventEmitter::${eventName}(${structName} $event) const {
76
75
  dispatchEvent("${dispatchEventName}", [${capture}](jsi::Runtime &runtime) {
77
76
  ${implementation}
78
77
  });
79
78
  }
80
- `.trim();
79
+ `;
81
80
  };
82
81
 
83
82
  const BasicComponentTemplate = ({
@@ -101,7 +100,7 @@ function generateSetter(
101
100
  propertyParts: $ReadOnlyArray<string>,
102
101
  ) {
103
102
  const trailingPeriod = propertyParts.length === 0 ? '' : '.';
104
- const eventChain = `event.${propertyParts.join(
103
+ const eventChain = `$event.${propertyParts.join(
105
104
  '.',
106
105
  )}${trailingPeriod}${propertyName});`;
107
106
 
@@ -114,13 +113,32 @@ function generateEnumSetter(
114
113
  propertyParts: $ReadOnlyArray<string>,
115
114
  ) {
116
115
  const trailingPeriod = propertyParts.length === 0 ? '' : '.';
117
- const eventChain = `event.${propertyParts.join(
116
+ const eventChain = `$event.${propertyParts.join(
118
117
  '.',
119
118
  )}${trailingPeriod}${propertyName})`;
120
119
 
121
120
  return `${variableName}.setProperty(runtime, "${propertyName}", toString(${eventChain});`;
122
121
  }
123
122
 
123
+ function generateObjectSetter(
124
+ variableName: string,
125
+ propertyName: string,
126
+ propertyParts: $ReadOnlyArray<string>,
127
+ typeAnnotation: ObjectTypeAnnotation<EventTypeAnnotation>,
128
+ ) {
129
+ return `
130
+ {
131
+ auto ${propertyName} = jsi::Object(runtime);
132
+ ${generateSetters(
133
+ propertyName,
134
+ typeAnnotation.properties,
135
+ propertyParts.concat([propertyName]),
136
+ )}
137
+ ${variableName}.setProperty(runtime, "${propertyName}", ${propertyName});
138
+ }
139
+ `.trim();
140
+ }
141
+
124
142
  function generateSetters(
125
143
  parentPropertyName: string,
126
144
  properties: $ReadOnlyArray<NamedShape<EventTypeAnnotation>>,
@@ -131,29 +149,9 @@ function generateSetters(
131
149
  const {typeAnnotation} = eventProperty;
132
150
  switch (typeAnnotation.type) {
133
151
  case 'BooleanTypeAnnotation':
134
- return generateSetter(
135
- parentPropertyName,
136
- eventProperty.name,
137
- propertyParts,
138
- );
139
152
  case 'StringTypeAnnotation':
140
- return generateSetter(
141
- parentPropertyName,
142
- eventProperty.name,
143
- propertyParts,
144
- );
145
153
  case 'Int32TypeAnnotation':
146
- return generateSetter(
147
- parentPropertyName,
148
- eventProperty.name,
149
- propertyParts,
150
- );
151
154
  case 'DoubleTypeAnnotation':
152
- return generateSetter(
153
- parentPropertyName,
154
- eventProperty.name,
155
- propertyParts,
156
- );
157
155
  case 'FloatTypeAnnotation':
158
156
  return generateSetter(
159
157
  parentPropertyName,
@@ -167,19 +165,12 @@ function generateSetters(
167
165
  propertyParts,
168
166
  );
169
167
  case 'ObjectTypeAnnotation':
170
- const propertyName = eventProperty.name;
171
- return `
172
- {
173
- auto ${propertyName} = jsi::Object(runtime);
174
- ${generateSetters(
175
- propertyName,
176
- typeAnnotation.properties,
177
- propertyParts.concat([propertyName]),
178
- )}
179
-
180
- ${parentPropertyName}.setProperty(runtime, "${propertyName}", ${propertyName});
181
- }
182
- `.trim();
168
+ return generateObjectSetter(
169
+ parentPropertyName,
170
+ eventProperty.name,
171
+ propertyParts,
172
+ typeAnnotation,
173
+ );
183
174
  default:
184
175
  (typeAnnotation.type: empty);
185
176
  throw new Error('Received invalid event property type');
@@ -203,9 +194,9 @@ function generateEvent(componentName: string, event: EventTypeShape): string {
203
194
 
204
195
  if (event.typeAnnotation.argument) {
205
196
  const implementation = `
206
- auto payload = jsi::Object(runtime);
207
- ${generateSetters('payload', event.typeAnnotation.argument.properties, [])}
208
- return payload;
197
+ auto $payload = jsi::Object(runtime);
198
+ ${generateSetters('$payload', event.typeAnnotation.argument.properties, [])}
199
+ return $payload;
209
200
  `.trim();
210
201
 
211
202
  if (!event.name.startsWith('on')) {
@@ -33,9 +33,7 @@ const FileTemplate = ({componentEmitters}) => `
33
33
 
34
34
  namespace facebook {
35
35
  namespace react {
36
-
37
36
  ${componentEmitters}
38
-
39
37
  } // namespace react
40
38
  } // namespace facebook
41
39
  `;
@@ -51,9 +51,7 @@ const FileTemplate = ({componentEmitters}: {componentEmitters: string}) => `
51
51
 
52
52
  namespace facebook {
53
53
  namespace react {
54
-
55
54
  ${componentEmitters}
56
-
57
55
  } // namespace react
58
56
  } // namespace facebook
59
57
  `;
@@ -522,6 +522,8 @@ function generateStruct(structs, componentName, nameParts, properties) {
522
522
  }
523
523
  generateStruct(structs, componentName, nameParts.concat([name]), props);
524
524
  return;
525
+ case 'MixedTypeAnnotation':
526
+ return;
525
527
  default:
526
528
  property.typeAnnotation.type;
527
529
  throw new Error(