@microlink/google 1.0.6 → 1.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@microlink/google",
3
3
  "description": "Structured Google data from 10 verticals through Microlink API",
4
4
  "homepage": "https://github.com/microlinkhq/microlink",
5
- "version": "1.0.6",
5
+ "version": "1.2.1",
6
6
  "exports": {
7
7
  "types": "./src/index.d.ts",
8
8
  "require": "./src/index.js",
@@ -36,7 +36,7 @@
36
36
  "serp"
37
37
  ],
38
38
  "dependencies": {
39
- "@microlink/mql": "0.18.0"
39
+ "@microlink/mql": "0.18.1"
40
40
  },
41
41
  "devDependencies": {
42
42
  "ava": "latest",
@@ -66,5 +66,5 @@
66
66
  "test": "exit 0"
67
67
  },
68
68
  "license": "MIT",
69
- "gitHead": "13e0818cc80bca85a19f16837095bd7d6b31f76a"
69
+ "gitHead": "755abe6066dfc709e3c7bff2ddf08377902fd42e"
70
70
  }
package/src/index.d.ts CHANGED
@@ -56,6 +56,9 @@ interface Options {
56
56
  limit?: number
57
57
  location?: Location
58
58
  period?: Period
59
+ page?: number
60
+ html?: boolean
61
+ markdown?: boolean
59
62
  }
60
63
 
61
64
  interface Sitelink {
@@ -315,6 +318,7 @@ export declare function buildUrl(
315
318
  location?: string
316
319
  type?: Type
317
320
  period?: Period
321
+ page?: number
318
322
  }
319
323
  ): URL
320
324
 
package/src/index.js CHANGED
@@ -9,10 +9,11 @@ const buildPath = (query, limit, location) =>
9
9
  .filter(v => v !== undefined)
10
10
  .join('/')
11
11
 
12
- const buildUrl = (query, { limit, location, type, period } = {}) => {
12
+ const buildUrl = (query, { limit, location, type, period, page } = {}) => {
13
13
  const url = new URL(`https://${DOMAIN}/${buildPath(query, limit, location)}`)
14
14
  if (type) url.searchParams.set('type', type)
15
15
  if (period) url.searchParams.set('period', period)
16
+ if (page > 1) url.searchParams.set('page', String(page))
16
17
  return url
17
18
  }
18
19
 
@@ -26,9 +27,11 @@ const fetchDataField = async (url, mqlOpts, field, attr) => {
26
27
  return data[field]
27
28
  }
28
29
 
29
- const fetchPage = async (url, mqlOpts, offset, query) => {
30
- url.searchParams.set('start', String(offset))
31
- const { data } = await mql(url.toString(), mqlOpts)
30
+ const fetchPage = async (url, mqlOpts, page, query, last) => {
31
+ if (page > 1) url.searchParams.set('page', String(page))
32
+ else url.searchParams.delete('page')
33
+ const { data, response } = await mql(url.toString(), mqlOpts)
34
+ last.response = response
32
35
  const { results, ...extra } = data
33
36
 
34
37
  return {
@@ -58,20 +61,40 @@ const fetchPage = async (url, mqlOpts, offset, query) => {
58
61
  }
59
62
  }),
60
63
  next: () =>
61
- fetchPage(
62
- new URL(url.toString()),
63
- mqlOpts,
64
- offset + results.length,
65
- query
66
- )
64
+ fetchPage(new URL(url.toString()), mqlOpts, page + 1, query, last)
67
65
  }
68
66
  }
69
67
 
68
+ const resolve = async (item, key) => {
69
+ if (typeof item[key] === 'function') item[key] = await item[key]()
70
+ }
71
+
70
72
  const createGoogleClient = ctxOpts => {
71
- return async (query, { limit, location, type, period, ...opts } = {}) => {
72
- const url = buildUrl(query, { limit, location, type, period })
73
- return fetchPage(url, { ...ctxOpts, ...opts }, 0, query)
73
+ const last = {}
74
+ const client = async (
75
+ query,
76
+ { limit, location, type, period, html, markdown, page = 1, ...opts } = {}
77
+ ) => {
78
+ const url = buildUrl(query, { limit, location, type, period, page })
79
+ const result = await fetchPage(
80
+ url,
81
+ { ...ctxOpts, ...opts },
82
+ page,
83
+ query,
84
+ last
85
+ )
86
+ if (html) {
87
+ await resolve(result, 'html')
88
+ await Promise.all(result.results.map(item => resolve(item, 'html')))
89
+ }
90
+ if (markdown) {
91
+ await resolve(result, 'markdown')
92
+ await Promise.all(result.results.map(item => resolve(item, 'markdown')))
93
+ }
94
+ return result
74
95
  }
96
+ Object.defineProperty(client, 'last', { value: last })
97
+ return client
75
98
  }
76
99
 
77
100
  module.exports = createGoogleClient