@react-native/codegen 0.74.0 → 0.75.0-nightly-20240221-a1171f79f

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 (147) hide show
  1. package/lib/CodegenSchema.d.ts +10 -1
  2. package/lib/CodegenSchema.js.flow +2 -1
  3. package/lib/SchemaValidator.js.flow +2 -2
  4. package/lib/cli/combine/combine-js-to-schema-cli.js +59 -40
  5. package/lib/cli/combine/combine-js-to-schema-cli.js.flow +23 -39
  6. package/lib/cli/combine/combine-js-to-schema.js +49 -1
  7. package/lib/cli/combine/combine-js-to-schema.js.flow +59 -1
  8. package/lib/cli/combine/combine-schemas-cli.js +77 -0
  9. package/lib/cli/combine/combine-schemas-cli.js.flow +87 -0
  10. package/lib/cli/combine/combine-utils.js +3 -65
  11. package/lib/cli/combine/combine-utils.js.flow +7 -28
  12. package/lib/cli/parser/parser.js +1 -1
  13. package/lib/cli/parser/parser.js.flow +1 -1
  14. package/lib/generators/RNCodegen.d.ts +1 -0
  15. package/lib/generators/RNCodegen.js +58 -31
  16. package/lib/generators/RNCodegen.js.flow +52 -32
  17. package/lib/generators/TypeUtils/Cxx/index.js +17 -0
  18. package/lib/generators/TypeUtils/Cxx/index.js.flow +18 -0
  19. package/lib/generators/TypeUtils/Java/index.js +31 -0
  20. package/lib/generators/TypeUtils/Java/index.js.flow +27 -0
  21. package/lib/generators/TypeUtils/Objective-C/index.js +17 -0
  22. package/lib/generators/TypeUtils/Objective-C/index.js.flow +18 -0
  23. package/lib/generators/components/ComponentsGeneratorUtils.js +7 -7
  24. package/lib/generators/components/ComponentsGeneratorUtils.js.flow +8 -10
  25. package/lib/generators/components/ComponentsProviderUtils.js +55 -0
  26. package/lib/generators/components/ComponentsProviderUtils.js.flow +60 -0
  27. package/lib/generators/components/CppHelpers.js +7 -0
  28. package/lib/generators/components/CppHelpers.js.flow +14 -0
  29. package/lib/generators/components/GenerateComponentDescriptorCpp.js +89 -0
  30. package/lib/generators/components/GenerateComponentDescriptorCpp.js.flow +101 -0
  31. package/lib/generators/components/GenerateComponentDescriptorH.js +28 -12
  32. package/lib/generators/components/GenerateComponentDescriptorH.js.flow +20 -12
  33. package/lib/generators/components/GenerateComponentHObjCpp.js +15 -1
  34. package/lib/generators/components/GenerateComponentHObjCpp.js.flow +11 -2
  35. package/lib/generators/components/GenerateEventEmitterCpp.js +28 -15
  36. package/lib/generators/components/GenerateEventEmitterCpp.js.flow +16 -17
  37. package/lib/generators/components/GenerateEventEmitterH.js +20 -13
  38. package/lib/generators/components/GenerateEventEmitterH.js.flow +13 -15
  39. package/lib/generators/components/GeneratePropsCpp.js +17 -8
  40. package/lib/generators/components/GeneratePropsCpp.js.flow +13 -9
  41. package/lib/generators/components/GeneratePropsH.js +23 -16
  42. package/lib/generators/components/GeneratePropsH.js.flow +12 -16
  43. package/lib/generators/components/GeneratePropsJavaDelegate.js +11 -3
  44. package/lib/generators/components/GeneratePropsJavaDelegate.js.flow +7 -4
  45. package/lib/generators/components/GeneratePropsJavaInterface.js +11 -3
  46. package/lib/generators/components/GeneratePropsJavaInterface.js.flow +6 -3
  47. package/lib/generators/components/GeneratePropsJavaPojo/PojoCollector.js.flow +6 -6
  48. package/lib/generators/components/GeneratePropsJavaPojo/index.js +1 -1
  49. package/lib/generators/components/GeneratePropsJavaPojo/index.js.flow +1 -1
  50. package/lib/generators/components/GeneratePropsJavaPojo/serializePojo.js.flow +1 -0
  51. package/lib/generators/components/GenerateShadowNodeCpp.js +19 -8
  52. package/lib/generators/components/GenerateShadowNodeCpp.js.flow +9 -8
  53. package/lib/generators/components/GenerateShadowNodeH.js +27 -11
  54. package/lib/generators/components/GenerateShadowNodeH.js.flow +11 -14
  55. package/lib/generators/components/GenerateStateCpp.js +19 -8
  56. package/lib/generators/components/GenerateStateCpp.js.flow +9 -8
  57. package/lib/generators/components/GenerateStateH.js +9 -5
  58. package/lib/generators/components/GenerateStateH.js.flow +3 -4
  59. package/lib/generators/components/GenerateTests.js +11 -5
  60. package/lib/generators/components/GenerateTests.js.flow +2 -2
  61. package/lib/generators/components/GenerateThirdPartyFabricComponentsProviderH.js +16 -3
  62. package/lib/generators/components/GenerateThirdPartyFabricComponentsProviderH.js.flow +18 -3
  63. package/lib/generators/components/GenerateThirdPartyFabricComponentsProviderObjCpp.js +18 -3
  64. package/lib/generators/components/GenerateThirdPartyFabricComponentsProviderObjCpp.js.flow +21 -3
  65. package/lib/generators/components/GenerateViewConfigJs.js +2 -2
  66. package/lib/generators/components/GenerateViewConfigJs.js.flow +2 -2
  67. package/lib/generators/components/JavaHelpers.js +8 -0
  68. package/lib/generators/components/JavaHelpers.js.flow +9 -0
  69. package/lib/generators/components/__test_fixtures__/fixtures.js +22 -0
  70. package/lib/generators/components/__test_fixtures__/fixtures.js.flow +22 -0
  71. package/lib/generators/modules/GenerateModuleCpp.js +14 -10
  72. package/lib/generators/modules/GenerateModuleCpp.js.flow +9 -10
  73. package/lib/generators/modules/GenerateModuleH.js +198 -72
  74. package/lib/generators/modules/GenerateModuleH.js.flow +186 -71
  75. package/lib/generators/modules/GenerateModuleJavaSpec.js +50 -57
  76. package/lib/generators/modules/GenerateModuleJavaSpec.js.flow +45 -50
  77. package/lib/generators/modules/GenerateModuleJniCpp.js +16 -12
  78. package/lib/generators/modules/GenerateModuleJniCpp.js.flow +11 -12
  79. package/lib/generators/modules/GenerateModuleJniH.js +12 -5
  80. package/lib/generators/modules/GenerateModuleJniH.js.flow +8 -6
  81. package/lib/generators/modules/GenerateModuleObjCpp/StructCollector.js +5 -5
  82. package/lib/generators/modules/GenerateModuleObjCpp/StructCollector.js.flow +11 -12
  83. package/lib/generators/modules/GenerateModuleObjCpp/header/serializeConstantsStruct.js +23 -21
  84. package/lib/generators/modules/GenerateModuleObjCpp/header/serializeConstantsStruct.js.flow +19 -18
  85. package/lib/generators/modules/GenerateModuleObjCpp/header/serializeRegularStruct.js +23 -21
  86. package/lib/generators/modules/GenerateModuleObjCpp/header/serializeRegularStruct.js.flow +19 -18
  87. package/lib/generators/modules/GenerateModuleObjCpp/index.js +18 -20
  88. package/lib/generators/modules/GenerateModuleObjCpp/index.js.flow +11 -14
  89. package/lib/generators/modules/GenerateModuleObjCpp/serializeMethod.js +40 -42
  90. package/lib/generators/modules/GenerateModuleObjCpp/serializeMethod.js.flow +38 -44
  91. package/lib/generators/modules/GenerateModuleObjCpp/source/serializeModule.js +25 -27
  92. package/lib/generators/modules/GenerateModuleObjCpp/source/serializeModule.js.flow +26 -28
  93. package/lib/generators/modules/Utils.js +98 -0
  94. package/lib/generators/modules/Utils.js.flow +34 -2
  95. package/lib/generators/modules/__test_fixtures__/fixtures.js +685 -64
  96. package/lib/generators/modules/__test_fixtures__/fixtures.js.flow +686 -64
  97. package/lib/parsers/error-utils.js +17 -17
  98. package/lib/parsers/error-utils.js.flow +10 -10
  99. package/lib/parsers/errors.js +10 -0
  100. package/lib/parsers/errors.js.flow +15 -1
  101. package/lib/parsers/flow/components/__test_fixtures__/fixtures.js +7 -1
  102. package/lib/parsers/flow/components/__test_fixtures__/fixtures.js.flow +7 -1
  103. package/lib/parsers/flow/components/commands.js +24 -0
  104. package/lib/parsers/flow/components/commands.js.flow +45 -3
  105. package/lib/parsers/flow/components/componentsUtils.js +5 -4
  106. package/lib/parsers/flow/components/componentsUtils.js.flow +4 -3
  107. package/lib/parsers/flow/components/events.js +7 -7
  108. package/lib/parsers/flow/components/events.js.flow +7 -7
  109. package/lib/parsers/flow/components/index.js +8 -8
  110. package/lib/parsers/flow/components/index.js.flow +3 -3
  111. package/lib/parsers/flow/modules/__test_fixtures__/fixtures.js +13 -0
  112. package/lib/parsers/flow/modules/__test_fixtures__/fixtures.js.flow +13 -0
  113. package/lib/parsers/flow/modules/index.js +20 -19
  114. package/lib/parsers/flow/modules/index.js.flow +10 -11
  115. package/lib/parsers/flow/parseFlowAndThrowErrors.js +105 -0
  116. package/lib/parsers/flow/parseFlowAndThrowErrors.js.flow +41 -0
  117. package/lib/parsers/flow/parser.js +24 -25
  118. package/lib/parsers/flow/parser.js.flow +27 -36
  119. package/lib/parsers/flow/utils.js.flow +1 -1
  120. package/lib/parsers/parser.js.flow +12 -10
  121. package/lib/parsers/parserMock.js +11 -12
  122. package/lib/parsers/parserMock.js.flow +25 -28
  123. package/lib/parsers/parsers-commons.js +85 -36
  124. package/lib/parsers/parsers-commons.js.flow +71 -37
  125. package/lib/parsers/parsers-primitives.js +17 -17
  126. package/lib/parsers/parsers-primitives.js.flow +14 -16
  127. package/lib/parsers/schema.js.flow +3 -3
  128. package/lib/parsers/typescript/components/__test_fixtures__/fixtures.js +8 -1
  129. package/lib/parsers/typescript/components/__test_fixtures__/fixtures.js.flow +8 -1
  130. package/lib/parsers/typescript/components/commands.js +23 -15
  131. package/lib/parsers/typescript/components/commands.js.flow +24 -16
  132. package/lib/parsers/typescript/components/componentsUtils.js +34 -20
  133. package/lib/parsers/typescript/components/componentsUtils.js.flow +36 -19
  134. package/lib/parsers/typescript/components/events.js +22 -22
  135. package/lib/parsers/typescript/components/events.js.flow +11 -10
  136. package/lib/parsers/typescript/components/extends.js.flow +1 -0
  137. package/lib/parsers/typescript/components/index.js +10 -10
  138. package/lib/parsers/typescript/components/index.js.flow +4 -4
  139. package/lib/parsers/typescript/modules/__test_fixtures__/fixtures.js +13 -0
  140. package/lib/parsers/typescript/modules/__test_fixtures__/fixtures.js.flow +13 -0
  141. package/lib/parsers/typescript/modules/index.js +25 -20
  142. package/lib/parsers/typescript/modules/index.js.flow +16 -14
  143. package/lib/parsers/typescript/parser.js +25 -26
  144. package/lib/parsers/typescript/parser.js.flow +23 -27
  145. package/lib/parsers/utils.js +5 -0
  146. package/lib/parsers/utils.js.flow +6 -1
  147. package/package.json +8 -6
@@ -93,6 +93,14 @@ function getImports(component, type) {
93
93
  }
94
94
  }
95
95
  });
96
+ component.commands.forEach(command => {
97
+ command.typeAnnotation.params.forEach(param => {
98
+ const cmdParamType = param.typeAnnotation.type;
99
+ if (cmdParamType === 'ArrayTypeAnnotation') {
100
+ imports.add('import com.facebook.react.bridge.ReadableArray;');
101
+ }
102
+ });
103
+ });
96
104
  return imports;
97
105
  }
98
106
  module.exports = {
@@ -127,6 +127,15 @@ function getImports(
127
127
  }
128
128
  });
129
129
 
130
+ component.commands.forEach(command => {
131
+ command.typeAnnotation.params.forEach(param => {
132
+ const cmdParamType = param.typeAnnotation.type;
133
+ if (cmdParamType === 'ArrayTypeAnnotation') {
134
+ imports.add('import com.facebook.react.bridge.ReadableArray;');
135
+ }
136
+ });
137
+ });
138
+
130
139
  return imports;
131
140
  }
132
141
 
@@ -1697,6 +1697,28 @@ const COMMANDS_AND_PROPS = {
1697
1697
  },
1698
1698
  },
1699
1699
  },
1700
+ {
1701
+ name: 'addItems',
1702
+ optional: false,
1703
+ typeAnnotation: {
1704
+ type: 'FunctionTypeAnnotation',
1705
+ params: [
1706
+ {
1707
+ name: 'items',
1708
+ optional: false,
1709
+ typeAnnotation: {
1710
+ type: 'ArrayTypeAnnotation',
1711
+ elementType: {
1712
+ type: 'StringTypeAnnotation',
1713
+ },
1714
+ },
1715
+ },
1716
+ ],
1717
+ returnTypeAnnotation: {
1718
+ type: 'VoidTypeAnnotation',
1719
+ },
1720
+ },
1721
+ },
1700
1722
  ],
1701
1723
  },
1702
1724
  },
@@ -1726,6 +1726,28 @@ const COMMANDS_AND_PROPS: SchemaType = {
1726
1726
  },
1727
1727
  },
1728
1728
  },
1729
+ {
1730
+ name: 'addItems',
1731
+ optional: false,
1732
+ typeAnnotation: {
1733
+ type: 'FunctionTypeAnnotation',
1734
+ params: [
1735
+ {
1736
+ name: 'items',
1737
+ optional: false,
1738
+ typeAnnotation: {
1739
+ type: 'ArrayTypeAnnotation',
1740
+ elementType: {
1741
+ type: 'StringTypeAnnotation',
1742
+ },
1743
+ },
1744
+ },
1745
+ ],
1746
+ returnTypeAnnotation: {
1747
+ type: 'VoidTypeAnnotation',
1748
+ },
1749
+ },
1750
+ },
1729
1751
  ],
1730
1752
  },
1731
1753
  },
@@ -78,11 +78,11 @@ function _iterableToArrayLimit(arr, i) {
78
78
  function _arrayWithHoles(arr) {
79
79
  if (Array.isArray(arr)) return arr;
80
80
  }
81
- const _require = require('./Utils'),
82
- createAliasResolver = _require.createAliasResolver,
83
- getModules = _require.getModules;
84
- const _require2 = require('../../parsers/parsers-commons'),
85
- unwrapNullable = _require2.unwrapNullable;
81
+ const _require = require('../../parsers/parsers-commons'),
82
+ unwrapNullable = _require.unwrapNullable;
83
+ const _require2 = require('./Utils'),
84
+ createAliasResolver = _require2.createAliasResolver,
85
+ getModules = _require2.getModules;
86
86
  const HostFunctionTemplate = ({
87
87
  hasteModuleName,
88
88
  methodName,
@@ -138,14 +138,12 @@ const FileTemplate = ({libraryName, modules}) => {
138
138
 
139
139
  #include "${libraryName}JSI.h"
140
140
 
141
- namespace facebook {
142
- namespace react {
141
+ namespace facebook::react {
143
142
 
144
143
  ${modules}
145
144
 
146
145
 
147
- } // namespace react
148
- } // namespace facebook
146
+ } // namespace facebook::react
149
147
  `;
150
148
  };
151
149
  function serializeArg(moduleName, arg, index, resolveAlias, enumMap) {
@@ -257,7 +255,13 @@ function serializePropertyIntoHostFunction(
257
255
  });
258
256
  }
259
257
  module.exports = {
260
- generate(libraryName, schema, packageName, assumeNonnull = false) {
258
+ generate(
259
+ libraryName,
260
+ schema,
261
+ packageName,
262
+ assumeNonnull = false,
263
+ headerPrefix,
264
+ ) {
261
265
  const nativeModules = getModules(schema);
262
266
  const modules = Object.keys(nativeModules)
263
267
  .map(hasteModuleName => {
@@ -11,19 +11,19 @@
11
11
  'use strict';
12
12
 
13
13
  import type {
14
- SchemaType,
15
- Nullable,
16
14
  NamedShape,
17
- NativeModulePropertyShape,
15
+ NativeModuleEnumMap,
18
16
  NativeModuleFunctionTypeAnnotation,
19
17
  NativeModuleParamTypeAnnotation,
18
+ NativeModulePropertyShape,
20
19
  NativeModuleTypeAnnotation,
21
- NativeModuleEnumMap,
20
+ Nullable,
21
+ SchemaType,
22
22
  } from '../../CodegenSchema';
23
-
24
23
  import type {AliasResolver} from './Utils';
25
- const {createAliasResolver, getModules} = require('./Utils');
24
+
26
25
  const {unwrapNullable} = require('../../parsers/parsers-commons');
26
+ const {createAliasResolver, getModules} = require('./Utils');
27
27
 
28
28
  type FilesOutput = Map<string, string>;
29
29
 
@@ -101,14 +101,12 @@ const FileTemplate = ({
101
101
 
102
102
  #include "${libraryName}JSI.h"
103
103
 
104
- namespace facebook {
105
- namespace react {
104
+ namespace facebook::react {
106
105
 
107
106
  ${modules}
108
107
 
109
108
 
110
- } // namespace react
111
- } // namespace facebook
109
+ } // namespace facebook::react
112
110
  `;
113
111
  };
114
112
 
@@ -236,6 +234,7 @@ module.exports = {
236
234
  schema: SchemaType,
237
235
  packageName?: string,
238
236
  assumeNonnull: boolean = false,
237
+ headerPrefix?: string,
239
238
  ): FilesOutput {
240
239
  const nativeModules = getModules(schema);
241
240
 
@@ -78,17 +78,21 @@ function _iterableToArrayLimit(arr, i) {
78
78
  function _arrayWithHoles(arr) {
79
79
  if (Array.isArray(arr)) return arr;
80
80
  }
81
- const _require = require('../Utils'),
82
- getEnumName = _require.getEnumName,
83
- toSafeCppString = _require.toSafeCppString;
84
- const _require2 = require('./Utils'),
85
- createAliasResolver = _require2.createAliasResolver,
86
- getModules = _require2.getModules,
87
- getAreEnumMembersInteger = _require2.getAreEnumMembersInteger;
81
+ const _require = require('../../parsers/parsers-commons'),
82
+ unwrapNullable = _require.unwrapNullable;
83
+ const _require2 = require('../TypeUtils/Cxx'),
84
+ wrapOptional = _require2.wrapOptional;
88
85
  const _require3 = require('../Utils'),
89
- indent = _require3.indent;
90
- const _require4 = require('../../parsers/parsers-commons'),
91
- unwrapNullable = _require4.unwrapNullable;
86
+ getEnumName = _require3.getEnumName,
87
+ toSafeCppString = _require3.toSafeCppString;
88
+ const _require4 = require('../Utils'),
89
+ indent = _require4.indent;
90
+ const _require5 = require('./Utils'),
91
+ createAliasResolver = _require5.createAliasResolver,
92
+ getAreEnumMembersInteger = _require5.getAreEnumMembersInteger,
93
+ getModules = _require5.getModules,
94
+ isArrayRecursiveMember = _require5.isArrayRecursiveMember,
95
+ isDirectRecursiveMember = _require5.isDirectRecursiveMember;
92
96
  const ModuleClassDeclarationTemplate = ({
93
97
  hasteModuleName,
94
98
  moduleProperties,
@@ -122,7 +126,7 @@ public:
122
126
  protected:
123
127
  ${hasteModuleName}CxxSpec(std::shared_ptr<CallInvoker> jsInvoker)
124
128
  : TurboModule(std::string{${hasteModuleName}CxxSpec::kModuleName}, jsInvoker),
125
- delegate_(static_cast<T*>(this), jsInvoker) {}
129
+ delegate_(reinterpret_cast<T*>(this), jsInvoker) {}
126
130
 
127
131
  private:
128
132
  class Delegate : public ${hasteModuleName}CxxSpecJSI {
@@ -154,17 +158,16 @@ const FileTemplate = ({modules}) => {
154
158
  #include <ReactCommon/TurboModule.h>
155
159
  #include <react/bridging/Bridging.h>
156
160
 
157
- namespace facebook {
158
- namespace react {
161
+ namespace facebook::react {
159
162
 
160
163
  ${modules.join('\n\n')}
161
164
 
162
- } // namespace react
163
- } // namespace facebook
165
+ } // namespace facebook::react
164
166
  `;
165
167
  };
166
168
  function translatePrimitiveJSTypeToCpp(
167
169
  moduleName,
170
+ parentObjectAliasName,
168
171
  nullableTypeAnnotation,
169
172
  optional,
170
173
  createErrorMessage,
@@ -175,19 +178,20 @@ function translatePrimitiveJSTypeToCpp(
175
178
  _unwrapNullable2 = _slicedToArray(_unwrapNullable, 2),
176
179
  typeAnnotation = _unwrapNullable2[0],
177
180
  nullable = _unwrapNullable2[1];
178
- const isRequired = !optional && !nullable;
181
+ const isRecursiveType = isDirectRecursiveMember(
182
+ parentObjectAliasName,
183
+ nullableTypeAnnotation,
184
+ );
185
+ const isRequired = (!optional && !nullable) || isRecursiveType;
179
186
  let realTypeAnnotation = typeAnnotation;
180
187
  if (realTypeAnnotation.type === 'TypeAliasTypeAnnotation') {
181
188
  realTypeAnnotation = resolveAlias(realTypeAnnotation.name);
182
189
  }
183
- function wrap(type) {
184
- return isRequired ? type : `std::optional<${type}>`;
185
- }
186
190
  switch (realTypeAnnotation.type) {
187
191
  case 'ReservedTypeAnnotation':
188
192
  switch (realTypeAnnotation.name) {
189
193
  case 'RootTag':
190
- return wrap('double');
194
+ return wrapOptional('double', isRequired);
191
195
  default:
192
196
  realTypeAnnotation.name;
193
197
  throw new Error(createErrorMessage(realTypeAnnotation.name));
@@ -195,95 +199,96 @@ function translatePrimitiveJSTypeToCpp(
195
199
  case 'VoidTypeAnnotation':
196
200
  return 'void';
197
201
  case 'StringTypeAnnotation':
198
- return wrap('jsi::String');
202
+ return wrapOptional('jsi::String', isRequired);
199
203
  case 'NumberTypeAnnotation':
200
- return wrap('double');
204
+ return wrapOptional('double', isRequired);
201
205
  case 'DoubleTypeAnnotation':
202
- return wrap('double');
206
+ return wrapOptional('double', isRequired);
203
207
  case 'FloatTypeAnnotation':
204
- return wrap('double');
208
+ return wrapOptional('double', isRequired);
205
209
  case 'Int32TypeAnnotation':
206
- return wrap('int');
210
+ return wrapOptional('int', isRequired);
207
211
  case 'BooleanTypeAnnotation':
208
- return wrap('bool');
212
+ return wrapOptional('bool', isRequired);
209
213
  case 'EnumDeclaration':
210
214
  switch (realTypeAnnotation.memberType) {
211
215
  case 'NumberTypeAnnotation':
212
- return getAreEnumMembersInteger(
213
- enumMap[realTypeAnnotation.name].members,
214
- )
215
- ? wrap('int')
216
- : wrap('double');
216
+ return wrapOptional('jsi::Value', isRequired);
217
217
  case 'StringTypeAnnotation':
218
- return wrap('jsi::String');
218
+ return wrapOptional('jsi::String', isRequired);
219
219
  default:
220
220
  throw new Error(createErrorMessage(realTypeAnnotation.type));
221
221
  }
222
222
  case 'GenericObjectTypeAnnotation':
223
- return wrap('jsi::Object');
223
+ return wrapOptional('jsi::Object', isRequired);
224
224
  case 'UnionTypeAnnotation':
225
225
  switch (typeAnnotation.memberType) {
226
226
  case 'NumberTypeAnnotation':
227
- return wrap('double');
227
+ return wrapOptional('double', isRequired);
228
228
  case 'ObjectTypeAnnotation':
229
- return wrap('jsi::Object');
229
+ return wrapOptional('jsi::Object', isRequired);
230
230
  case 'StringTypeAnnotation':
231
- return wrap('jsi::String');
231
+ return wrapOptional('jsi::String', isRequired);
232
232
  default:
233
233
  throw new Error(createErrorMessage(realTypeAnnotation.type));
234
234
  }
235
235
  case 'ObjectTypeAnnotation':
236
- return wrap('jsi::Object');
236
+ return wrapOptional('jsi::Object', isRequired);
237
237
  case 'ArrayTypeAnnotation':
238
- return wrap('jsi::Array');
238
+ return wrapOptional('jsi::Array', isRequired);
239
239
  case 'FunctionTypeAnnotation':
240
- return wrap('jsi::Function');
240
+ return wrapOptional('jsi::Function', isRequired);
241
241
  case 'PromiseTypeAnnotation':
242
- return wrap('jsi::Value');
242
+ return wrapOptional('jsi::Value', isRequired);
243
243
  case 'MixedTypeAnnotation':
244
- return wrap('jsi::Value');
244
+ return wrapOptional('jsi::Value', isRequired);
245
245
  default:
246
246
  realTypeAnnotation.type;
247
247
  throw new Error(createErrorMessage(realTypeAnnotation.type));
248
248
  }
249
249
  }
250
250
  function createStructsString(moduleName, aliasMap, resolveAlias, enumMap) {
251
- const getCppType = v =>
251
+ const getCppType = (parentObjectAlias, v) =>
252
252
  translatePrimitiveJSTypeToCpp(
253
253
  moduleName,
254
+ parentObjectAlias,
254
255
  v.typeAnnotation,
255
256
  false,
256
257
  typeName => `Unsupported type for param "${v.name}". Found: ${typeName}`,
257
258
  resolveAlias,
258
259
  enumMap,
259
260
  );
260
- return Object.keys(aliasMap)
261
- .map(alias => {
262
- const value = aliasMap[alias];
263
- if (value.properties.length === 0) {
264
- return '';
265
- }
266
- const structName = `${moduleName}Base${alias}`;
267
- const templateParameterWithTypename = value.properties
268
- .map((v, i) => `typename P${i}`)
269
- .join(', ');
270
- const templateParameter = value.properties
271
- .map((v, i) => 'P' + i)
272
- .join(', ');
273
- const debugParameterConversion = value.properties
274
- .map(
275
- (v, i) => ` static ${getCppType(v)} ${
276
- v.name
277
- }ToJs(jsi::Runtime &rt, P${i} value) {
261
+
262
+ // TODO: T171006733 [Begin] Remove deprecated Cxx TMs structs after a new release.
263
+ return (
264
+ Object.keys(aliasMap)
265
+ .map(alias => {
266
+ const value = aliasMap[alias];
267
+ if (value.properties.length === 0) {
268
+ return '';
269
+ }
270
+ const structName = `${moduleName}Base${alias}`;
271
+ const structNameNew = `${moduleName}${alias}`;
272
+ const templateParameterWithTypename = value.properties
273
+ .map((v, i) => `typename P${i}`)
274
+ .join(', ');
275
+ const templateParameter = value.properties
276
+ .map((v, i) => 'P' + i)
277
+ .join(', ');
278
+ const debugParameterConversion = value.properties
279
+ .map(
280
+ (v, i) => ` static ${getCppType(alias, v)} ${
281
+ v.name
282
+ }ToJs(jsi::Runtime &rt, P${i} value) {
278
283
  return bridging::toJs(rt, value);
279
284
  }`,
280
- )
281
- .join('\n\n');
282
- return `
285
+ )
286
+ .join('\n\n');
287
+ return `
283
288
  #pragma mark - ${structName}
284
289
 
285
290
  template <${templateParameterWithTypename}>
286
- struct ${structName} {
291
+ struct [[deprecated("Use ${structNameNew} instead.")]] ${structName} {
287
292
  ${value.properties.map((v, i) => ' P' + i + ' ' + v.name).join(';\n')};
288
293
  bool operator==(const ${structName} &other) const {
289
294
  return ${value.properties
@@ -293,7 +298,7 @@ ${value.properties.map((v, i) => ' P' + i + ' ' + v.name).join(';\n')};
293
298
  };
294
299
 
295
300
  template <${templateParameterWithTypename}>
296
- struct ${structName}Bridging {
301
+ struct [[deprecated("Use ${structNameNew}Bridging instead.")]] ${structName}Bridging {
297
302
  static ${structName}<${templateParameter}> fromJs(
298
303
  jsi::Runtime &rt,
299
304
  const jsi::Object &value,
@@ -333,8 +338,121 @@ ${value.properties
333
338
  };
334
339
 
335
340
  `;
336
- })
337
- .join('\n');
341
+ })
342
+ .join('\n') +
343
+ // TODO: T171006733 [End] Remove deprecated Cxx TMs structs after a new release.
344
+ Object.keys(aliasMap)
345
+ .map(alias => {
346
+ const value = aliasMap[alias];
347
+ if (value.properties.length === 0) {
348
+ return '';
349
+ }
350
+ const structName = `${moduleName}${alias}`;
351
+ const templateParameter = value.properties.filter(
352
+ v =>
353
+ !isDirectRecursiveMember(alias, v.typeAnnotation) &&
354
+ !isArrayRecursiveMember(alias, v.typeAnnotation),
355
+ );
356
+ const templateParameterWithTypename = templateParameter
357
+ .map((v, i) => `typename P${i}`)
358
+ .join(', ');
359
+ const templateParameterWithoutTypename = templateParameter
360
+ .map((v, i) => `P${i}`)
361
+ .join(', ');
362
+ let i = -1;
363
+ const templateMemberTypes = value.properties.map(v => {
364
+ if (isDirectRecursiveMember(alias, v.typeAnnotation)) {
365
+ return `std::unique_ptr<${structName}<${templateParameterWithoutTypename}>> ${v.name}`;
366
+ } else if (isArrayRecursiveMember(alias, v.typeAnnotation)) {
367
+ const _unwrapNullable3 = unwrapNullable(v.typeAnnotation),
368
+ _unwrapNullable4 = _slicedToArray(_unwrapNullable3, 1),
369
+ nullable = _unwrapNullable4[0];
370
+ return (
371
+ (nullable
372
+ ? `std::optional<std::vector<${structName}<${templateParameterWithoutTypename}>>>`
373
+ : `std::vector<${structName}<${templateParameterWithoutTypename}>>`) +
374
+ ` ${v.name}`
375
+ );
376
+ } else {
377
+ i++;
378
+ return `P${i} ${v.name}`;
379
+ }
380
+ });
381
+ const debugParameterConversion = value.properties
382
+ .map(
383
+ v => ` static ${getCppType(alias, v)} ${
384
+ v.name
385
+ }ToJs(jsi::Runtime &rt, decltype(types.${v.name}) value) {
386
+ return bridging::toJs(rt, value);
387
+ }`,
388
+ )
389
+ .join('\n\n');
390
+ return `
391
+ #pragma mark - ${structName}
392
+
393
+ template <${templateParameterWithTypename}>
394
+ struct ${structName} {
395
+ ${templateMemberTypes.map(v => ' ' + v).join(';\n')};
396
+ bool operator==(const ${structName} &other) const {
397
+ return ${value.properties
398
+ .map(v => `${v.name} == other.${v.name}`)
399
+ .join(' && ')};
400
+ }
401
+ };
402
+
403
+ template <typename T>
404
+ struct ${structName}Bridging {
405
+ static T types;
406
+
407
+ static T fromJs(
408
+ jsi::Runtime &rt,
409
+ const jsi::Object &value,
410
+ const std::shared_ptr<CallInvoker> &jsInvoker) {
411
+ T result{
412
+ ${value.properties
413
+ .map(v => {
414
+ if (isDirectRecursiveMember(alias, v.typeAnnotation)) {
415
+ return ` value.hasProperty(rt, "${v.name}") ? std::make_unique<T>(bridging::fromJs<T>(rt, value.getProperty(rt, "${v.name}"), jsInvoker)) : nullptr`;
416
+ } else {
417
+ return ` bridging::fromJs<decltype(types.${v.name})>(rt, value.getProperty(rt, "${v.name}"), jsInvoker)`;
418
+ }
419
+ })
420
+ .join(',\n')}};
421
+ return result;
422
+ }
423
+
424
+ #ifdef DEBUG
425
+ ${debugParameterConversion}
426
+ #endif
427
+
428
+ static jsi::Object toJs(
429
+ jsi::Runtime &rt,
430
+ const T &value,
431
+ const std::shared_ptr<CallInvoker> &jsInvoker) {
432
+ auto result = facebook::jsi::Object(rt);
433
+ ${value.properties
434
+ .map(v => {
435
+ if (isDirectRecursiveMember(alias, v.typeAnnotation)) {
436
+ return ` if (value.${v.name}) {
437
+ result.setProperty(rt, "${v.name}", bridging::toJs(rt, *value.${v.name}, jsInvoker));
438
+ }`;
439
+ } else if (v.optional) {
440
+ return ` if (value.${v.name}) {
441
+ result.setProperty(rt, "${v.name}", bridging::toJs(rt, value.${v.name}.value(), jsInvoker));
442
+ }`;
443
+ } else {
444
+ return ` result.setProperty(rt, "${v.name}", bridging::toJs(rt, value.${v.name}, jsInvoker));`;
445
+ }
446
+ })
447
+ .join('\n')}
448
+ return result;
449
+ }
450
+ };
451
+
452
+ `;
453
+ })
454
+ .join('\n')
455
+ );
338
456
  }
339
457
  const EnumTemplate = ({
340
458
  enumName,
@@ -362,7 +480,7 @@ const EnumTemplate = ({
362
480
  return `
363
481
  #pragma mark - ${enumName}
364
482
 
365
- enum ${enumName} { ${values} };
483
+ enum class ${enumName} { ${values} };
366
484
 
367
485
  template <>
368
486
  struct Bridging<${enumName}> {
@@ -438,15 +556,16 @@ function translatePropertyToCpp(
438
556
  enumMap,
439
557
  abstract = false,
440
558
  ) {
441
- const _unwrapNullable3 = unwrapNullable(prop.typeAnnotation),
442
- _unwrapNullable4 = _slicedToArray(_unwrapNullable3, 1),
443
- propTypeAnnotation = _unwrapNullable4[0];
559
+ const _unwrapNullable5 = unwrapNullable(prop.typeAnnotation),
560
+ _unwrapNullable6 = _slicedToArray(_unwrapNullable5, 1),
561
+ propTypeAnnotation = _unwrapNullable6[0];
444
562
  const params = propTypeAnnotation.params.map(
445
563
  param => `std::move(${param.name})`,
446
564
  );
447
565
  const paramTypes = propTypeAnnotation.params.map(param => {
448
566
  const translatedParam = translatePrimitiveJSTypeToCpp(
449
567
  moduleName,
568
+ null,
450
569
  param.typeAnnotation,
451
570
  param.optional,
452
571
  typeName =>
@@ -458,6 +577,7 @@ function translatePropertyToCpp(
458
577
  });
459
578
  const returnType = translatePrimitiveJSTypeToCpp(
460
579
  moduleName,
580
+ null,
461
581
  propTypeAnnotation.returnTypeAnnotation,
462
582
  false,
463
583
  typeName => `Unsupported return type for ${prop.name}. Found: ${typeName}`,
@@ -481,7 +601,13 @@ function translatePropertyToCpp(
481
601
  }`;
482
602
  }
483
603
  module.exports = {
484
- generate(libraryName, schema, packageName, assumeNonnull = false) {
604
+ generate(
605
+ libraryName,
606
+ schema,
607
+ packageName,
608
+ assumeNonnull = false,
609
+ headerPrefix,
610
+ ) {
485
611
  const nativeModules = getModules(schema);
486
612
  const modules = Object.keys(nativeModules).flatMap(hasteModuleName => {
487
613
  const _nativeModules$hasteM = nativeModules[hasteModuleName],