@react-native/codegen
Advanced tools
@@ -62,2 +62,3 @@ /** | ||
| includeGetDebugPropsImplementation = false, | ||
| generateOptionalProperties = false, | ||
| ) { | ||
@@ -72,12 +73,44 @@ const diffProps = component.props | ||
| case 'MixedTypeAnnotation': | ||
| return ` | ||
| if ( | ||
| prop.optional && | ||
| prop.typeAnnotation.default == null && | ||
| generateOptionalProperties | ||
| ) { | ||
| return ` | ||
| if (${prop.name} != oldProps->${prop.name}) { | ||
| if (${prop.name}.has_value()) { | ||
| result["${prop.name}"] = ${prop.name}.value(); | ||
| } else { | ||
| result["${prop.name}"] = folly::dynamic(nullptr); | ||
| } | ||
| }`; | ||
| } else { | ||
| return ` | ||
| if (${prop.name} != oldProps->${prop.name}) { | ||
| result["${prop.name}"] = ${prop.name}; | ||
| }`; | ||
| } | ||
| case 'DoubleTypeAnnotation': | ||
| case 'FloatTypeAnnotation': | ||
| return ` | ||
| if ( | ||
| prop.optional && | ||
| prop.typeAnnotation.default == null && | ||
| generateOptionalProperties | ||
| ) { | ||
| return ` | ||
| if ((${prop.name} != oldProps->${prop.name})) { | ||
| if (${prop.name}.has_value()) { | ||
| if (!oldProps->${prop.name}.has_value() || !(std::isnan(${prop.name}.value()) && std::isnan(oldProps->${prop.name}.value()))) { | ||
| result["${prop.name}"] = ${prop.name}.value(); | ||
| } | ||
| } else { | ||
| result["${prop.name}"] = folly::dynamic(nullptr); | ||
| } | ||
| }`; | ||
| } else { | ||
| return ` | ||
| if ((${prop.name} != oldProps->${prop.name}) && !(std::isnan(${prop.name}) && std::isnan(oldProps->${prop.name}))) { | ||
| result["${prop.name}"] = ${prop.name}; | ||
| }`; | ||
| } | ||
| case 'ArrayTypeAnnotation': | ||
@@ -87,13 +120,43 @@ case 'ObjectTypeAnnotation': | ||
| case 'Int32EnumTypeAnnotation': | ||
| return ` | ||
| if ( | ||
| prop.optional && | ||
| prop.typeAnnotation.default == null && | ||
| generateOptionalProperties | ||
| ) { | ||
| return ` | ||
| if (${prop.name} != oldProps->${prop.name}) { | ||
| if (${prop.name}.has_value()) { | ||
| result["${prop.name}"] = toDynamic(${prop.name}.value()); | ||
| } else { | ||
| result["${prop.name}"] = folly::dynamic(nullptr); | ||
| } | ||
| }`; | ||
| } else { | ||
| return ` | ||
| if (${prop.name} != oldProps->${prop.name}) { | ||
| result["${prop.name}"] = toDynamic(${prop.name}); | ||
| }`; | ||
| } | ||
| case 'ReservedPropTypeAnnotation': | ||
| switch (typeAnnotation.name) { | ||
| case 'ColorPrimitive': | ||
| return ` | ||
| if ( | ||
| prop.optional && | ||
| prop.typeAnnotation.default == null && | ||
| generateOptionalProperties | ||
| ) { | ||
| return ` | ||
| if (${prop.name} != oldProps->${prop.name}) { | ||
| if (${prop.name}.has_value()) { | ||
| result["${prop.name}"] = *${prop.name}.value(); | ||
| } else { | ||
| result["${prop.name}"] = folly::dynamic(nullptr); | ||
| } | ||
| }`; | ||
| } else { | ||
| return ` | ||
| if (${prop.name} != oldProps->${prop.name}) { | ||
| result["${prop.name}"] = *${prop.name}; | ||
| }`; | ||
| } | ||
| case 'ImageSourcePrimitive': | ||
@@ -103,6 +166,21 @@ case 'PointPrimitive': | ||
| case 'DimensionPrimitive': | ||
| return ` | ||
| if ( | ||
| prop.optional && | ||
| prop.typeAnnotation.default == null && | ||
| generateOptionalProperties | ||
| ) { | ||
| return ` | ||
| if (${prop.name} != oldProps->${prop.name}) { | ||
| if (${prop.name}.has_value()) { | ||
| result["${prop.name}"] = toDynamic(${prop.name}.value()); | ||
| } else { | ||
| result["${prop.name}"] = folly::dynamic(nullptr); | ||
| } | ||
| }`; | ||
| } else { | ||
| return ` | ||
| if (${prop.name} != oldProps->${prop.name}) { | ||
| result["${prop.name}"] = toDynamic(${prop.name}); | ||
| }`; | ||
| } | ||
| case 'ImageRequestPrimitive': | ||
@@ -246,2 +324,3 @@ // Shouldn't be used in props | ||
| includeGetDebugPropsImplementation, | ||
| component.generateOptionalProperties, | ||
| ); | ||
@@ -248,0 +327,0 @@ const imports = getImports(component.props); |
@@ -405,3 +405,8 @@ /** | ||
| } | ||
| function generatePropsString(componentName, props, nameParts) { | ||
| function generatePropsString( | ||
| componentName, | ||
| props, | ||
| nameParts, | ||
| generateOptionalProperties = false, | ||
| ) { | ||
| return props | ||
@@ -418,2 +423,9 @@ .map(prop => { | ||
| ); | ||
| if ( | ||
| prop.optional && | ||
| prop.typeAnnotation.default == null && | ||
| generateOptionalProperties | ||
| ) { | ||
| return `std::optional<${nativeType}> ${prop.name}${defaultInitializer};`; | ||
| } | ||
| return `${nativeType} ${prop.name}${defaultInitializer};`; | ||
@@ -448,3 +460,8 @@ }) | ||
| function generateStructsForComponent(componentName, component) { | ||
| const structs = generateStructs(componentName, component.props, []); | ||
| const structs = generateStructs( | ||
| componentName, | ||
| component.props, | ||
| [], | ||
| component.generateOptionalObjectProperties, | ||
| ); | ||
| const structArray = Array.from(structs.values()); | ||
@@ -456,3 +473,8 @@ if (structArray.length < 1) { | ||
| } | ||
| function generateStructs(componentName, properties, nameParts) { | ||
| function generateStructs( | ||
| componentName, | ||
| properties, | ||
| nameParts, | ||
| generateOptionalObjectProperties = false, | ||
| ) { | ||
| const structs = new Map(); | ||
@@ -469,2 +491,3 @@ properties.forEach(prop => { | ||
| nameParts.concat([prop.name]), | ||
| generateOptionalObjectProperties, | ||
| ); | ||
@@ -479,2 +502,3 @@ nestedStructs.forEach(function (value, key) { | ||
| typeAnnotation.properties, | ||
| generateOptionalObjectProperties, | ||
| ); | ||
@@ -493,2 +517,3 @@ } | ||
| nameParts.concat([prop.name]), | ||
| generateOptionalObjectProperties, | ||
| ); | ||
@@ -505,2 +530,3 @@ nestedStructs.forEach(function (value, key) { | ||
| elementProperties, | ||
| generateOptionalObjectProperties, | ||
| ); | ||
@@ -534,2 +560,3 @@ | ||
| nameParts.concat([prop.name]), | ||
| generateOptionalObjectProperties, | ||
| ); | ||
@@ -546,2 +573,3 @@ nestedStructs.forEach(function (value, key) { | ||
| elementProperties, | ||
| generateOptionalObjectProperties, | ||
| ); | ||
@@ -564,3 +592,9 @@ | ||
| } | ||
| function generateStruct(structs, componentName, nameParts, properties) { | ||
| function generateStruct( | ||
| structs, | ||
| componentName, | ||
| nameParts, | ||
| properties, | ||
| generateOptionalObjectProperties = false, | ||
| ) { | ||
| const structNameParts = nameParts; | ||
@@ -572,2 +606,3 @@ const structName = generateStructName(componentName, structNameParts); | ||
| structNameParts, | ||
| generateOptionalObjectProperties, | ||
| ); | ||
@@ -602,3 +637,9 @@ properties.forEach(property => { | ||
| } | ||
| generateStruct(structs, componentName, nameParts.concat([name]), props); | ||
| generateStruct( | ||
| structs, | ||
| componentName, | ||
| nameParts.concat([name]), | ||
| props, | ||
| generateOptionalObjectProperties, | ||
| ); | ||
| return; | ||
@@ -633,5 +674,25 @@ case 'MixedTypeAnnotation': | ||
| case 'MixedTypeAnnotation': | ||
| return `result["${name}"] = ${name};`; | ||
| if ( | ||
| property.optional && | ||
| property.typeAnnotation.default == null && | ||
| generateOptionalObjectProperties | ||
| ) { | ||
| return `if (${name}.has_value()) { | ||
| result["${name}"] = ${name}.value(); | ||
| }`; | ||
| } else { | ||
| return `result["${name}"] = ${name};`; | ||
| } | ||
| default: | ||
| return `result["${name}"] = ::facebook::react::toDynamic(${name});`; | ||
| if ( | ||
| property.optional && | ||
| property.typeAnnotation.default == null && | ||
| generateOptionalObjectProperties | ||
| ) { | ||
| return `if (${name}.has_value()) { | ||
| result["${name}"] = ::facebook::react::toDynamic(${name}.value()); | ||
| }`; | ||
| } else { | ||
| return `result["${name}"] = ::facebook::react::toDynamic(${name});`; | ||
| } | ||
| } | ||
@@ -685,2 +746,3 @@ }) | ||
| [], | ||
| component.generateOptionalProperties, | ||
| ); | ||
@@ -687,0 +749,0 @@ const extendString = getClassExtendString(component); |
+1
-1
| { | ||
| "name": "@react-native/codegen", | ||
| "version": "0.84.0-nightly-20251211-80e384a80", | ||
| "version": "0.84.0-nightly-20251212-dd390dbbe", | ||
| "description": "Code generation tools for React Native", | ||
@@ -5,0 +5,0 @@ "license": "MIT", |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
1110846
0.74%17067
0.83%