@@ -340,6 +340,7 @@ extension DereferencedJSONSchema {
340340 public let maxProperties : Int ?
341341 let _minProperties : Int ?
342342 public let properties : OrderedDictionary < String , DereferencedJSONSchema >
343+ public let patternProperties : OrderedDictionary < String , DereferencedJSONSchema >
343344 public let additionalProperties : Either < Bool , DereferencedJSONSchema > ?
344345
345346 // NOTE that an object's required properties
@@ -372,7 +373,16 @@ extension DereferencedJSONSchema {
372373 otherProperties [ name] = dereferencedProperty
373374 }
374375
376+ var otherPatternProperties = OrderedDictionary < String , DereferencedJSONSchema > ( )
377+ for (pattern, property) in objectContext. patternProperties {
378+ guard let dereferencedPatternProperty = property. dereferenced ( ) else {
379+ return nil
380+ }
381+ otherPatternProperties [ pattern] = dereferencedPatternProperty
382+ }
383+
375384 properties = otherProperties
385+ patternProperties = otherPatternProperties
376386 maxProperties = objectContext. maxProperties
377387 _minProperties = objectContext. _minProperties
378388 switch objectContext. additionalProperties {
@@ -394,6 +404,7 @@ extension DereferencedJSONSchema {
394404 following references: Set < AnyHashable >
395405 ) throws {
396406 properties = try objectContext. properties. mapValues { try $0. _dereferenced ( in: components, following: references, dereferencedFromComponentNamed: nil ) }
407+ patternProperties = try objectContext. patternProperties. mapValues { try $0. _dereferenced ( in: components, following: references, dereferencedFromComponentNamed: nil ) }
397408 maxProperties = objectContext. maxProperties
398409 _minProperties = objectContext. _minProperties
399410 switch objectContext. additionalProperties {
@@ -408,11 +419,13 @@ extension DereferencedJSONSchema {
408419
409420 internal init (
410421 properties: OrderedDictionary < String , DereferencedJSONSchema > ,
422+ patternProperties: OrderedDictionary < String , DereferencedJSONSchema > = [ : ] ,
411423 additionalProperties: Either < Bool , DereferencedJSONSchema > ? = nil ,
412424 maxProperties: Int ? = nil ,
413425 minProperties: Int ? = nil
414426 ) {
415427 self . properties = properties
428+ self . patternProperties = patternProperties
416429 self . additionalProperties = additionalProperties
417430 self . maxProperties = maxProperties
418431 self . _minProperties = minProperties
@@ -431,6 +444,7 @@ extension DereferencedJSONSchema {
431444
432445 return . init(
433446 properties: properties. mapValues { $0. jsonSchema } ,
447+ patternProperties: patternProperties. mapValues { $0. jsonSchema } ,
434448 additionalProperties: underlyingAdditionalProperties,
435449 maxProperties: maxProperties,
436450 minProperties: _minProperties
@@ -573,11 +587,15 @@ extension JSONSchema: ExternallyDereferenceable {
573587 try components. merge ( c1)
574588 messages += m1
575589
590+ let ( newPatternProperties, c2, m2) = try await object. patternProperties. externallyDereferenced ( with: loader)
591+ try components. merge ( c2)
592+ messages += m2
593+
576594 let newAdditionalProperties : Either < Bool , JSONSchema > ?
577595 if case . b( let schema) = object. additionalProperties {
578- let ( additionalProperties, c2 , m2 ) = try await schema. externallyDereferenced ( with: loader)
579- try components. merge ( c2 )
580- messages += m2
596+ let ( additionalProperties, c3 , m3 ) = try await schema. externallyDereferenced ( with: loader)
597+ try components. merge ( c3 )
598+ messages += m3
581599 newAdditionalProperties = . b( additionalProperties)
582600 } else {
583601 newAdditionalProperties = object. additionalProperties
@@ -589,6 +607,7 @@ extension JSONSchema: ExternallyDereferenceable {
589607 core,
590608 . init(
591609 properties: newProperties,
610+ patternProperties: newPatternProperties,
592611 additionalProperties: newAdditionalProperties,
593612 maxProperties: object. maxProperties,
594613 minProperties: object. _minProperties
0 commit comments