matteodem/graphqlizer

View on GitHub
lib/TypeFieldsStructureMapper.js

Summary

Maintainability
A
0 mins
Test Coverage
const typeMap = {
  [String]: 'String',
  [Boolean]: 'Boolean',
  [Number]: 'Int',
}

export const registerType = (type, graphqlType) => {
  typeMap[type] = graphqlType
}

const getSingularTypeString = ({ type, decimal }) => {
  if (type === Number && decimal) {
    return 'Float'
  }

  const singularType = typeMap[type]

  if (!singularType) {
    throw new Error(`Type not found for "${type.toString()}"`)
  }

  return singularType
}

const getTypeString = ({ type, decimal, optional }, multipleFieldType) => {
  const isMultipleType = !!multipleFieldType
  const openingBracket = isMultipleType ? '[' : ''
  const closingBracket = isMultipleType ? ']' : ''

  if (isMultipleType) {
    type = multipleFieldType.type
  }

  const singleType = getSingularTypeString({ type, decimal })

  return `${openingBracket}${singleType}${closingBracket}${optional ? '' : '!'}`
}

const getFieldDescription = (def, multipleFieldType) => ({
  type: getTypeString(def, multipleFieldType),
})

export const mapSchemaToTypeFields = (schema, customFields = {}) => Object
  .keys({
    ...schema.schema(),
    ...customFields,
  })
  .reduce(
    (acc, field) => ({
      ...acc,
      ...(customFields[field] === false ? {} : {
        [field]: customFields[field] ? customFields[field] : getFieldDescription(
          schema.schema(field),
          schema.schema(`${field}.$`)
        ),
      }),
    }),
    {},
  )