NaturalCycles/js-lib

View on GitHub
src/json-schema/jsonSchema.util.ts

Summary

Maintainability
A
0 mins
Test Coverage
A
92%
import { _uniq, AnyObject } from '../index'
import { _filterNullishValues } from '../object/object.util'
import type { JsonSchemaObject } from './jsonSchema.model'

/**
 * Merges s2 into s1 (mutates s1) and returns s1.
 * Does not mutate s2.
 * API similar to Object.assign(s1, s2)
 */
export function mergeJsonSchemaObjects<T1 extends AnyObject, T2 extends AnyObject>(
  s1: JsonSchemaObject<T1>,
  s2: JsonSchemaObject<T2>,
): JsonSchemaObject<T1 & T2> {
  // Merge `properties`
  Object.entries(s2.properties).forEach(([k, v]) => {
    ;(s1.properties as any)[k] = v
  })

  // Merge `patternProperties`
  Object.entries(s2.patternProperties || {}).forEach(([k, v]) => {
    ;(s1.patternProperties as any)[k] = v
  })

  s1.propertyNames = s2.propertyNames || s1.propertyNames
  s1.minProperties = s2.minProperties ?? s1.minProperties
  s1.maxProperties = s2.maxProperties ?? s1.maxProperties

  // Merge `required`
  s1.required.push(...(s2.required as any))
  s1.required = _uniq(s1.required).sort()

  // `additionalProperties` remains the same

  return _filterNullishValues(s1, true) as any
}