_(routes) // Add implicit data and defaults .map((config, url) => ([url, _.merge({primary: false, attributes: {}, id: null, original_url: url}, config)])) // Replace URL defaults .map(route => ([replaceDefault(route[0], domain), route[1]])) // Replace config defaults .map(route => ([route[0], _.merge(route[1], replaceDefault(_.omit(route[1], ['original_url']), domain))])) // Strip upstream if needed .map(route => { if (route[1].upstream) route[1].upstream = _.first(route[1].upstream.split(':')); return [route[0], route[1]]; }) // Back to object .fromPairs() // Set the primary route .thru(routes => setPrimaryRoute(routes)) // Return .value()