code: function createEdge (input) {
    var headerPort = this.theme.anchor.header ? '__title' : null
    var context = {
      leftNode: {
        name: input.from.typeName,
        port: input.from.fieldName ? input.from.fieldName + 'port' : headerPort
      },
      rightNode: {
        name: input.to.typeName,
        port: input.to.fieldName ? input.to.fieldName + 'port:w' : headerPort
      },
      attributes: {
        color: input.color,
        fontcolor: input.color,
        label: input.label,
        weight: input.weight
      }
    }
    // converts {a: 'FOO', bar: 2} to ['a="FOO"', 'bar=2'];
    var attributes = _.reduce(
      context.attributes,
      (result, value, name) => {
        if (!_.isEmpty(value)) {
          result.push(templates.edgeAttr({ name: name, value: value }))
        }
        return result
      },
      []
    )
    return templates.edge(_.merge({}, context, { attributes: attributes }))
  }
docs: for the given input, creates the edge description, for example: `createEdge({from: {typeName: 'Foo'}, to: {typeName: 'Bar'}})` would output: `"Foo" -> "Bar"`