summaryrefslogtreecommitdiff
path: root/bin/wiki/ImportarDesdeURL/node_modules/metascraper-clearbit/index.js
blob: 102924db1fa58d3127bb4c686205dd19961b9d70 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
'use strict'

const { get, isString, isObject } = require('lodash')
const { createValidator } = require('@metascraper/helpers')
const { stringify } = require('querystring')
const memoizeOne = require('memoize-one')
const { getDomain } = require('tldts')
const got = require('got')

const ENDPOINT = 'https://autocomplete.clearbit.com/v1/companies/suggest'

const memoFn = (newArgs, oldArgs) => newArgs[0].url === oldArgs[0].url

const DEFAULT_GOT_OPTS = {
  json: true,
  timeout: 1500,
  retry: 0
}

const appendQuery = (data, query) => {
  if (!isObject(data) || !isObject(query)) return data
  const logoUrl = get(data, 'logo')
  if (!isString(logoUrl)) return data
  return { ...data, logo: `${logoUrl}?${stringify(query)}` }
}

const createClearbit = ({ gotOpts, logoOpts } = {}) =>
  memoizeOne(async ({ url }) => {
    const domain = getDomain(url)

    try {
      const { body } = await got(`${ENDPOINT}?query=${domain}`, {
        ...DEFAULT_GOT_OPTS,
        ...gotOpts
      })

      return appendQuery(body.find(item => domain === item.domain), logoOpts)
    } catch (err) {
      return null
    }
  }, memoFn)

module.exports = opts => {
  const getClearbit = createValidator(createClearbit(opts))

  return {
    logo: getClearbit({ from: 'logo' }),
    publisher: getClearbit({ from: 'name', to: 'publisher' })
  }
}