@@ -1926,5 +1926,349 @@ export default function retrieveSchemaTest(testValidator: TestValidatorType) {
1926
1926
] ) ;
1927
1927
} ) ;
1928
1928
} ) ;
1929
+ describe ( 'resolveReference() with experimental_customMergeAllOf' , ( ) => {
1930
+ it ( 'should pass experimental_customMergeAllOf parameter to retrieveSchemaInternal' , ( ) => {
1931
+ const schema : RJSFSchema = {
1932
+ $ref : '#/definitions/testRef' ,
1933
+ allOf : [
1934
+ {
1935
+ type : 'object' ,
1936
+ properties : {
1937
+ string : { type : 'string' } ,
1938
+ } ,
1939
+ } ,
1940
+ {
1941
+ type : 'object' ,
1942
+ properties : {
1943
+ number : { type : 'number' } ,
1944
+ } ,
1945
+ } ,
1946
+ ] ,
1947
+ } ;
1948
+ const rootSchema : RJSFSchema = {
1949
+ definitions : {
1950
+ testRef : {
1951
+ type : 'object' ,
1952
+ properties : {
1953
+ base : { type : 'string' } ,
1954
+ } ,
1955
+ } ,
1956
+ } ,
1957
+ } ;
1958
+ const customMergeAllOf = jest . fn ( ) . mockReturnValue ( {
1959
+ type : 'object' ,
1960
+ properties : {
1961
+ base : { type : 'string' } ,
1962
+ string : { type : 'string' } ,
1963
+ number : { type : 'number' } ,
1964
+ } ,
1965
+ } ) ;
1966
+ const result = retrieveSchema ( testValidator , schema , rootSchema , { } , customMergeAllOf ) ;
1967
+ expect ( customMergeAllOf ) . toHaveBeenCalled ( ) ;
1968
+ expect ( result ) . toEqual ( {
1969
+ type : 'object' ,
1970
+ properties : {
1971
+ base : { type : 'string' } ,
1972
+ string : { type : 'string' } ,
1973
+ number : { type : 'number' } ,
1974
+ } ,
1975
+ } ) ;
1976
+ } ) ;
1977
+ } ) ;
1978
+ describe ( 'resolveDependencies() with experimental_customMergeAllOf' , ( ) => {
1979
+ it ( 'should pass experimental_customMergeAllOf parameter through dependency resolution' , ( ) => {
1980
+ const schema : RJSFSchema = {
1981
+ type : 'object' ,
1982
+ properties : {
1983
+ a : { type : 'string' } ,
1984
+ } ,
1985
+ dependencies : {
1986
+ a : {
1987
+ allOf : [
1988
+ {
1989
+ type : 'object' ,
1990
+ properties : {
1991
+ string : { type : 'string' } ,
1992
+ } ,
1993
+ } ,
1994
+ {
1995
+ type : 'object' ,
1996
+ properties : {
1997
+ number : { type : 'number' } ,
1998
+ } ,
1999
+ } ,
2000
+ ] ,
2001
+ } ,
2002
+ } ,
2003
+ } ;
2004
+ const rootSchema : RJSFSchema = { definitions : { } } ;
2005
+ const formData = { a : 'test' } ;
2006
+ const customMergeAllOf = jest . fn ( ) . mockReturnValue ( {
2007
+ type : 'object' ,
2008
+ properties : {
2009
+ string : { type : 'string' } ,
2010
+ number : { type : 'number' } ,
2011
+ } ,
2012
+ } ) ;
2013
+ const result = retrieveSchema ( testValidator , schema , rootSchema , formData , customMergeAllOf ) ;
2014
+ expect ( customMergeAllOf ) . toHaveBeenCalled ( ) ;
2015
+ expect ( result ) . toEqual ( {
2016
+ type : 'object' ,
2017
+ properties : {
2018
+ a : { type : 'string' } ,
2019
+ string : { type : 'string' } ,
2020
+ number : { type : 'number' } ,
2021
+ } ,
2022
+ } ) ;
2023
+ } ) ;
2024
+ } ) ;
2025
+ describe ( 'resolveSchema() integration with experimental_customMergeAllOf' , ( ) => {
2026
+ it ( 'should properly pass experimental_customMergeAllOf through all resolution paths' , ( ) => {
2027
+ const schema : RJSFSchema = {
2028
+ $ref : '#/definitions/baseSchema' ,
2029
+ dependencies : {
2030
+ trigger : {
2031
+ allOf : [
2032
+ {
2033
+ type : 'object' ,
2034
+ properties : {
2035
+ prop1 : { type : 'string' } ,
2036
+ } ,
2037
+ } ,
2038
+ {
2039
+ type : 'object' ,
2040
+ properties : {
2041
+ prop2 : { type : 'number' } ,
2042
+ } ,
2043
+ } ,
2044
+ ] ,
2045
+ } ,
2046
+ } ,
2047
+ } ;
2048
+ const rootSchema : RJSFSchema = {
2049
+ definitions : {
2050
+ baseSchema : {
2051
+ type : 'object' ,
2052
+ properties : {
2053
+ base : { type : 'string' } ,
2054
+ } ,
2055
+ allOf : [
2056
+ {
2057
+ type : 'object' ,
2058
+ properties : {
2059
+ additional : { type : 'boolean' } ,
2060
+ } ,
2061
+ } ,
2062
+ ] ,
2063
+ } ,
2064
+ } ,
2065
+ } ;
2066
+ const formData = { trigger : 'value' } ;
2067
+ const customMergeAllOf = jest . fn ( ) . mockImplementation ( ( schema ) => {
2068
+ // Custom merge logic that combines all properties
2069
+ const allProperties : any = { } ;
2070
+ if ( schema . properties ) {
2071
+ Object . assign ( allProperties , schema . properties ) ;
2072
+ }
2073
+ if ( schema . allOf ) {
2074
+ schema . allOf . forEach ( ( subSchema : any ) => {
2075
+ if ( subSchema . properties ) {
2076
+ Object . assign ( allProperties , subSchema . properties ) ;
2077
+ }
2078
+ } ) ;
2079
+ }
2080
+ return {
2081
+ ...schema ,
2082
+ properties : allProperties ,
2083
+ allOf : undefined ,
2084
+ } ;
2085
+ } ) ;
2086
+ const result = retrieveSchema ( testValidator , schema , rootSchema , formData , customMergeAllOf ) ;
2087
+ // Verify that customMergeAllOf was called multiple times (for different allOf blocks)
2088
+ expect ( customMergeAllOf ) . toHaveBeenCalledTimes ( 3 ) ;
2089
+ expect ( result ) . toEqual ( {
2090
+ type : 'object' ,
2091
+ properties : {
2092
+ base : { type : 'string' } ,
2093
+ additional : { type : 'boolean' } ,
2094
+ } ,
2095
+ allOf : undefined ,
2096
+ } ) ;
2097
+ } ) ;
2098
+ it ( 'should handle experimental_customMergeAllOf with nested $ref resolution' , ( ) => {
2099
+ const schema : RJSFSchema = {
2100
+ $ref : '#/definitions/nestedRef' ,
2101
+ } ;
2102
+ const rootSchema : RJSFSchema = {
2103
+ definitions : {
2104
+ nestedRef : {
2105
+ $ref : '#/definitions/finalSchema' ,
2106
+ allOf : [
2107
+ {
2108
+ type : 'object' ,
2109
+ properties : {
2110
+ nested : { type : 'string' } ,
2111
+ } ,
2112
+ } ,
2113
+ ] ,
2114
+ } ,
2115
+ finalSchema : {
2116
+ type : 'object' ,
2117
+ properties : {
2118
+ final : { type : 'number' } ,
2119
+ } ,
2120
+ } ,
2121
+ } ,
2122
+ } ;
2123
+ const customMergeAllOf = jest . fn ( ) . mockReturnValue ( {
2124
+ type : 'object' ,
2125
+ properties : {
2126
+ final : { type : 'number' } ,
2127
+ nested : { type : 'string' } ,
2128
+ } ,
2129
+ } ) ;
2130
+ const result = retrieveSchema ( testValidator , schema , rootSchema , { } , customMergeAllOf ) ;
2131
+ expect ( customMergeAllOf ) . toHaveBeenCalled ( ) ;
2132
+ expect ( result ) . toEqual ( {
2133
+ type : 'object' ,
2134
+ properties : {
2135
+ final : { type : 'number' } ,
2136
+ nested : { type : 'string' } ,
2137
+ } ,
2138
+ } ) ;
2139
+ } ) ;
2140
+ } ) ;
2141
+ describe ( 'Edge cases for experimental_customMergeAllOf fix' , ( ) => {
2142
+ it ( 'should handle undefined experimental_customMergeAllOf parameter gracefully' , ( ) => {
2143
+ const schema : RJSFSchema = {
2144
+ $ref : '#/definitions/testRef' ,
2145
+ dependencies : {
2146
+ trigger : {
2147
+ allOf : [
2148
+ {
2149
+ type : 'object' ,
2150
+ properties : {
2151
+ prop : { type : 'string' } ,
2152
+ } ,
2153
+ } ,
2154
+ ] ,
2155
+ } ,
2156
+ } ,
2157
+ } ;
2158
+ const rootSchema : RJSFSchema = {
2159
+ definitions : {
2160
+ testRef : {
2161
+ type : 'object' ,
2162
+ properties : {
2163
+ base : { type : 'string' } ,
2164
+ } ,
2165
+ } ,
2166
+ } ,
2167
+ } ;
2168
+ const formData = { trigger : 'value' } ;
2169
+ // Test with undefined experimental_customMergeAllOf (should use default mergeAllOf)
2170
+ const result = retrieveSchema ( testValidator , schema , rootSchema , formData , undefined ) ;
2171
+ expect ( result ) . toEqual ( {
2172
+ type : 'object' ,
2173
+ properties : {
2174
+ base : { type : 'string' } ,
2175
+ } ,
2176
+ } ) ;
2177
+ } ) ;
2178
+ it ( 'should handle experimental_customMergeAllOf that throws an error' , ( ) => {
2179
+ const schema : RJSFSchema = {
2180
+ allOf : [
2181
+ {
2182
+ type : 'object' ,
2183
+ properties : {
2184
+ string : { type : 'string' } ,
2185
+ } ,
2186
+ } ,
2187
+ {
2188
+ type : 'object' ,
2189
+ properties : {
2190
+ number : { type : 'number' } ,
2191
+ } ,
2192
+ } ,
2193
+ ] ,
2194
+ } ;
2195
+ const rootSchema : RJSFSchema = { definitions : { } } ;
2196
+ const customMergeAllOf = jest . fn ( ) . mockImplementation ( ( ) => {
2197
+ throw new Error ( 'Custom merge failed' ) ;
2198
+ } ) ;
2199
+ const result = retrieveSchema ( testValidator , schema , rootSchema , { } , customMergeAllOf ) ;
2200
+ // Should fall back to default behavior when custom merge fails
2201
+ expect ( result ) . toEqual ( { } ) ;
2202
+ expect ( consoleWarnSpy ) . toHaveBeenCalledWith ( 'could not merge subschemas in allOf:\n' , expect . any ( Error ) ) ;
2203
+ } ) ;
2204
+ it ( 'should pass experimental_customMergeAllOf through complex nested resolution chains' , ( ) => {
2205
+ const schema : RJSFSchema = {
2206
+ $ref : '#/definitions/level1' ,
2207
+ } ;
2208
+ const rootSchema : RJSFSchema = {
2209
+ definitions : {
2210
+ level1 : {
2211
+ $ref : '#/definitions/level2' ,
2212
+ dependencies : {
2213
+ dep1 : {
2214
+ allOf : [
2215
+ {
2216
+ type : 'object' ,
2217
+ properties : {
2218
+ nested1 : { type : 'string' } ,
2219
+ } ,
2220
+ } ,
2221
+ ] ,
2222
+ } ,
2223
+ } ,
2224
+ } ,
2225
+ level2 : {
2226
+ type : 'object' ,
2227
+ properties : {
2228
+ base : { type : 'string' } ,
2229
+ } ,
2230
+ allOf : [
2231
+ {
2232
+ type : 'object' ,
2233
+ properties : {
2234
+ additional : { type : 'number' } ,
2235
+ } ,
2236
+ } ,
2237
+ ] ,
2238
+ } ,
2239
+ } ,
2240
+ } ;
2241
+ const formData = { dep1 : 'value' } ;
2242
+ const customMergeAllOf = jest . fn ( ) . mockImplementation ( ( schema ) => {
2243
+ const allProperties : any = { } ;
2244
+ if ( schema . properties ) {
2245
+ Object . assign ( allProperties , schema . properties ) ;
2246
+ }
2247
+ if ( schema . allOf ) {
2248
+ schema . allOf . forEach ( ( subSchema : any ) => {
2249
+ if ( subSchema . properties ) {
2250
+ Object . assign ( allProperties , subSchema . properties ) ;
2251
+ }
2252
+ } ) ;
2253
+ }
2254
+ return {
2255
+ ...schema ,
2256
+ properties : allProperties ,
2257
+ allOf : undefined ,
2258
+ } ;
2259
+ } ) ;
2260
+ const result = retrieveSchema ( testValidator , schema , rootSchema , formData , customMergeAllOf ) ;
2261
+ // Should be called for both allOf blocks (level2 and dependency)
2262
+ expect ( customMergeAllOf ) . toHaveBeenCalledTimes ( 3 ) ;
2263
+ expect ( result ) . toEqual ( {
2264
+ type : 'object' ,
2265
+ properties : {
2266
+ base : { type : 'string' } ,
2267
+ additional : { type : 'number' } ,
2268
+ } ,
2269
+ allOf : undefined ,
2270
+ } ) ;
2271
+ } ) ;
2272
+ } ) ;
1929
2273
} ) ;
1930
2274
}
0 commit comments