@@ -19,6 +19,10 @@ type TextWithLoc = {
1919 loc ?: SourceLocation
2020}
2121
22+ type MessageDescriptorElementTransforms = {
23+ transformElement ?: ( value : Expression ) => Expression
24+ }
25+
2226function isObjectProperty (
2327 node : TextWithLoc | ObjectProperty ,
2428) : node is ObjectProperty {
@@ -35,9 +39,21 @@ export function createMessageDescriptorFromTokens(
3539 context ?: TextWithLoc | ObjectProperty
3640 comment ?: TextWithLoc | ObjectProperty
3741 } = { } ,
42+ transforms : MessageDescriptorElementTransforms = { } ,
3843) {
44+ const result = buildICUFromTokens ( tokens )
45+
46+ if ( result . elements && transforms . transformElement ) {
47+ result . elements = Object . fromEntries (
48+ Object . entries ( result . elements ) . map ( ( [ key , value ] ) => [
49+ key ,
50+ transforms . transformElement ( value ) ,
51+ ] ) ,
52+ )
53+ }
54+
3955 return createMessageDescriptor (
40- buildICUFromTokens ( tokens ) ,
56+ result ,
4157 oldLoc ,
4258 stripNonEssentialProps ,
4359 stripMessageProp ,
@@ -150,6 +166,33 @@ function createValuesProperty(key: string, values: Record<string, Expression>) {
150166 )
151167}
152168
169+ export function wrapJsxElementAsComponent ( value : Expression ) : Expression {
170+ if ( ! types . isJSXElement ( value ) ) {
171+ return value
172+ }
173+
174+ const props = types . identifier ( "props" )
175+
176+ return types . arrowFunctionExpression (
177+ [ props ] ,
178+ types . jsxElement (
179+ types . jsxOpeningElement (
180+ types . cloneNode ( value . openingElement . name ) ,
181+ [
182+ ...value . openingElement . attributes . map ( ( attribute ) =>
183+ types . cloneNode ( attribute ) ,
184+ ) ,
185+ types . jsxSpreadAttribute ( props ) ,
186+ ] ,
187+ true ,
188+ ) ,
189+ null ,
190+ [ ] ,
191+ true ,
192+ ) ,
193+ )
194+ }
195+
153196export function createStringObjectProperty (
154197 key : string ,
155198 value : string ,
0 commit comments