@graphext/cuery 0.7.0 → 0.8.2

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.
@@ -0,0 +1,133 @@
1
+ /* eslint no-console: ["warn", { allow: ["log", "warn", "error"] }] */
2
+ import { mapParallel } from '../../helpers/async.js';
3
+ import { fetchHasDataWithRetry, HASDATA_CONCURRENCY, parseAIO } from './helpers.js';
4
+ const SEARCH_TYPE_TO_TBM = {
5
+ images: 'isch',
6
+ videos: 'vid',
7
+ news: 'nws',
8
+ shopping: 'shop',
9
+ local: 'lcl'
10
+ };
11
+ const SERP_ENDPOINT = 'https://api.hasdata.com/scrape/google/serp';
12
+ function appendParam(url, key, value) {
13
+ url.searchParams.set(key, String(value));
14
+ }
15
+ function appendOptionalParam(url, key, value) {
16
+ if (value === undefined || value === null) {
17
+ return;
18
+ }
19
+ appendParam(url, key, value);
20
+ }
21
+ function formatBooleanParam(value, trueToken, falseToken) {
22
+ if (typeof value === 'boolean') {
23
+ return value ? trueToken : falseToken;
24
+ }
25
+ return String(value);
26
+ }
27
+ function normalizeLocale(value) {
28
+ return value ? value.toLowerCase() : undefined;
29
+ }
30
+ function normalizeDevice(device) {
31
+ if (!device) {
32
+ return undefined;
33
+ }
34
+ const normalized = device.toLowerCase();
35
+ if (normalized === 'desktop' || normalized === 'mobile' || normalized === 'tablet') {
36
+ return normalized;
37
+ }
38
+ return undefined;
39
+ }
40
+ function normalizeTbs(value) {
41
+ if (!value) {
42
+ return undefined;
43
+ }
44
+ if (Array.isArray(value)) {
45
+ return value.map(entry => entry.trim()).filter(Boolean).join(',');
46
+ }
47
+ return value;
48
+ }
49
+ function normalizeTbm(searchType) {
50
+ if (!searchType || searchType === 'all') {
51
+ return undefined;
52
+ }
53
+ const key = searchType.toLowerCase();
54
+ return SEARCH_TYPE_TO_TBM[key] || searchType;
55
+ }
56
+ function applySerpParams(url, options) {
57
+ appendOptionalParam(url, 'location', options.location);
58
+ appendOptionalParam(url, 'gl', normalizeLocale(options.country));
59
+ appendOptionalParam(url, 'hl', normalizeLocale(options.language));
60
+ appendOptionalParam(url, 'lr', options.contentLanguage);
61
+ appendOptionalParam(url, 'domain', options.domain);
62
+ appendOptionalParam(url, 'uule', options.encodedLocation);
63
+ const tbs = normalizeTbs(options.filters);
64
+ if (tbs) {
65
+ appendParam(url, 'tbs', tbs);
66
+ }
67
+ if (options.safeSearch !== undefined) {
68
+ const safeValue = typeof options.safeSearch === 'boolean'
69
+ ? options.safeSearch
70
+ ? 'active'
71
+ : 'off'
72
+ : options.safeSearch;
73
+ appendParam(url, 'safe', safeValue);
74
+ }
75
+ if (options.filterResults !== undefined) {
76
+ const filterValue = formatBooleanParam(options.filterResults, '1', '0');
77
+ appendParam(url, 'filter', filterValue);
78
+ }
79
+ if (options.preventAutoCorrect !== undefined) {
80
+ const nfprValue = formatBooleanParam(options.preventAutoCorrect, '1', '0');
81
+ appendParam(url, 'nfpr', nfprValue);
82
+ }
83
+ const tbm = normalizeTbm(options.type);
84
+ if (typeof options.offset === 'number' && options.offset >= 0) {
85
+ let start = Math.floor(options.offset);
86
+ if (tbm === 'lcl' && start % 20 !== 0) {
87
+ start = Math.floor(start / 20) * 20;
88
+ }
89
+ appendParam(url, 'start', start);
90
+ }
91
+ if (typeof options.resultsPerPage === 'number' && options.resultsPerPage > 0) {
92
+ const num = Math.min(Math.max(Math.floor(options.resultsPerPage), 10), 100);
93
+ appendParam(url, 'num', num);
94
+ }
95
+ if (tbm) {
96
+ appendParam(url, 'tbm', tbm);
97
+ }
98
+ const device = normalizeDevice(options.device);
99
+ if (device) {
100
+ appendParam(url, 'deviceType', device);
101
+ }
102
+ appendOptionalParam(url, 'ludocid', options.placeId);
103
+ appendOptionalParam(url, 'lsig', options.lsig);
104
+ appendOptionalParam(url, 'kgmid', options.entityId);
105
+ appendOptionalParam(url, 'si', options.searchId);
106
+ }
107
+ async function fetchSerpInternal(url) {
108
+ const response = await fetchHasDataWithRetry(url);
109
+ const content = (await response.json());
110
+ let aio = content.aiOverview;
111
+ if (aio && aio.pageToken && aio.hasdataLink) {
112
+ const aioResponse = await fetchHasDataWithRetry(aio.hasdataLink);
113
+ aio = await aioResponse.json();
114
+ }
115
+ if (aio) {
116
+ content.aiOverview = parseAIO(aio);
117
+ }
118
+ return content;
119
+ }
120
+ export async function fetchSerp(query, options) {
121
+ const url = new URL(SERP_ENDPOINT);
122
+ url.searchParams.set('q', query);
123
+ applySerpParams(url, options);
124
+ return fetchSerpInternal(url.toString());
125
+ }
126
+ export async function fetchSerpBatch(queries, options, maxConcurrency = HASDATA_CONCURRENCY) {
127
+ const url = new URL(SERP_ENDPOINT);
128
+ applySerpParams(url, options);
129
+ return mapParallel(queries, maxConcurrency, async (query) => {
130
+ url.searchParams.set('q', query);
131
+ return await fetchSerpInternal(url.toString());
132
+ });
133
+ }
@@ -12,11 +12,15 @@
12
12
  */
13
13
  export type * from './persona.schema.js';
14
14
  export type * from './brand.schema.js';
15
+ export type * from './entity.schema.js';
15
16
  export type * from './funnel.schema.js';
16
17
  export type * from './keyword.schema.js';
17
18
  export type * from './models.schema.js';
19
+ export type * from './prompt.schema.js';
20
+ export type * from './search.schema.js';
18
21
  export type * from './seedKeyword.schema.js';
19
- export type * from './topics.schema.js';
22
+ export type * from './sentiment.schema.js';
23
+ export type * from './sources.schema.js';
20
24
  export type * from './summary.schema.js';
21
- export type * from './prompt.schema.js';
25
+ export type * from './topics.schema.js';
22
26
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/src/schemas/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,mBAAmB,qBAAqB,CAAC;AACzC,mBAAmB,mBAAmB,CAAC;AACvC,mBAAmB,oBAAoB,CAAC;AACxC,mBAAmB,qBAAqB,CAAC;AACzC,mBAAmB,oBAAoB,CAAC;AACxC,mBAAmB,yBAAyB,CAAC;AAC7C,mBAAmB,oBAAoB,CAAC;AACxC,mBAAmB,qBAAqB,CAAC;AACzC,mBAAmB,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/src/schemas/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,mBAAmB,qBAAqB,CAAC;AACzC,mBAAmB,mBAAmB,CAAC;AACvC,mBAAmB,oBAAoB,CAAC;AACxC,mBAAmB,oBAAoB,CAAC;AACxC,mBAAmB,qBAAqB,CAAC;AACzC,mBAAmB,oBAAoB,CAAC;AACxC,mBAAmB,oBAAoB,CAAC;AACxC,mBAAmB,oBAAoB,CAAC;AACxC,mBAAmB,yBAAyB,CAAC;AAC7C,mBAAmB,uBAAuB,CAAC;AAC3C,mBAAmB,qBAAqB,CAAC;AACzC,mBAAmB,qBAAqB,CAAC;AACzC,mBAAmB,oBAAoB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@graphext/cuery",
3
- "version": "0.7.0",
3
+ "version": "0.8.2",
4
4
  "description": "Cuery tools for AI-powered keyword research and brand analysis",
5
5
  "repository": {
6
6
  "type": "git",
package/script/mod.d.ts CHANGED
@@ -13,6 +13,8 @@ export * from './src/tools/personas.js';
13
13
  export * from './src/tools/search.js';
14
14
  export * from './src/tools/topics.js';
15
15
  export * from './src/helpers/utils.js';
16
+ export * from './src/helpers/async.js';
17
+ export * from './src/helpers/urls.js';
16
18
  export * from './src/tools/brands.js';
17
19
  export * from './src/tools/translate.js';
18
20
  export * from './src/tools/sentiment.js';
@@ -20,9 +22,10 @@ export * from './src/tools/summarize.js';
20
22
  export * from './src/tools/sources.js';
21
23
  export * from './src/tools/entities.js';
22
24
  export * from './src/tools/prompts.js';
25
+ export * from './src/tools/scorer.js';
23
26
  export * from './src/helpers/seedKeywords.js';
24
27
  export * from './src/tools/generic.js';
25
- export * from './src/api.js';
28
+ export * from './src/apis/hasdata/index.js';
26
29
  export * from './src/apis/chatgptScraper/index.js';
27
30
  export * from './src/apis/googleAds/keywordPlanner.js';
28
31
  export * from './src/schemas/index.js';
@@ -1 +1 @@
1
- {"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../src/mod.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,cAAc,cAAc,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EACN,WAAW,EACX,mBAAmB,EACnB,eAAe,EACf,YAAY,EACZ,aAAa,EACb,KAAK,YAAY,EACjB,KAAK,SAAS,GACd,MAAM,0BAA0B,CAAC;AAGlC,cAAc,yBAAyB,CAAC;AACxC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,0BAA0B,CAAC;AACzC,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,wBAAwB,CAAC;AACvC,cAAc,cAAc,CAAC;AAC7B,cAAc,oCAAoC,CAAC;AACnD,cAAc,wCAAwC,CAAC;AACvD,cAAc,wBAAwB,CAAC"}
1
+ {"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../src/mod.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,cAAc,cAAc,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EACN,WAAW,EACX,mBAAmB,EACnB,eAAe,EACf,YAAY,EACZ,aAAa,EACb,KAAK,YAAY,EACjB,KAAK,SAAS,GACd,MAAM,0BAA0B,CAAC;AAGlC,cAAc,yBAAyB,CAAC;AACxC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,0BAA0B,CAAC;AACzC,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC;AACtC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,wBAAwB,CAAC;AACvC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,oCAAoC,CAAC;AACnD,cAAc,wCAAwC,CAAC;AACvD,cAAc,wBAAwB,CAAC"}
package/script/mod.js CHANGED
@@ -38,6 +38,8 @@ __exportStar(require("./src/tools/personas.js"), exports);
38
38
  __exportStar(require("./src/tools/search.js"), exports);
39
39
  __exportStar(require("./src/tools/topics.js"), exports);
40
40
  __exportStar(require("./src/helpers/utils.js"), exports);
41
+ __exportStar(require("./src/helpers/async.js"), exports);
42
+ __exportStar(require("./src/helpers/urls.js"), exports);
41
43
  __exportStar(require("./src/tools/brands.js"), exports);
42
44
  __exportStar(require("./src/tools/translate.js"), exports);
43
45
  __exportStar(require("./src/tools/sentiment.js"), exports);
@@ -45,9 +47,10 @@ __exportStar(require("./src/tools/summarize.js"), exports);
45
47
  __exportStar(require("./src/tools/sources.js"), exports);
46
48
  __exportStar(require("./src/tools/entities.js"), exports);
47
49
  __exportStar(require("./src/tools/prompts.js"), exports);
50
+ __exportStar(require("./src/tools/scorer.js"), exports);
48
51
  __exportStar(require("./src/helpers/seedKeywords.js"), exports);
49
52
  __exportStar(require("./src/tools/generic.js"), exports);
50
- __exportStar(require("./src/api.js"), exports);
53
+ __exportStar(require("./src/apis/hasdata/index.js"), exports);
51
54
  __exportStar(require("./src/apis/chatgptScraper/index.js"), exports);
52
55
  __exportStar(require("./src/apis/googleAds/keywordPlanner.js"), exports);
53
56
  __exportStar(require("./src/schemas/index.js"), exports);
@@ -0,0 +1,6 @@
1
+ export * from './helpers.js';
2
+ export * from './aio.js';
3
+ export * from './aim.js';
4
+ export * from './serp.js';
5
+ export * from './scrape.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/src/apis/hasdata/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC"}
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./helpers.js"), exports);
18
+ __exportStar(require("./aio.js"), exports);
19
+ __exportStar(require("./aim.js"), exports);
20
+ __exportStar(require("./serp.js"), exports);
21
+ __exportStar(require("./scrape.js"), exports);
@@ -0,0 +1,73 @@
1
+ type ProxyType = 'datacenter' | 'residential';
2
+ type OutputFormat = 'markdown' | 'text' | 'html';
3
+ interface JSScenarioAction {
4
+ click?: string;
5
+ fill?: [string, string];
6
+ wait?: number;
7
+ waitFor?: string;
8
+ scroll?: string;
9
+ evaluate?: string;
10
+ }
11
+ export interface ScrapeOptions {
12
+ formats: Array<OutputFormat>;
13
+ proxyType?: ProxyType;
14
+ proxyCountry?: string;
15
+ extractLinks?: boolean;
16
+ wait?: number;
17
+ waitFor?: string;
18
+ blockResources?: boolean;
19
+ blockAds?: boolean;
20
+ blockUrls?: Array<string>;
21
+ jsRendering?: boolean;
22
+ jsScenario?: Array<JSScenarioAction>;
23
+ headers?: Record<string, string>;
24
+ }
25
+ export interface ScrapeResponse {
26
+ url?: string;
27
+ markdown?: string;
28
+ text?: string;
29
+ html?: string;
30
+ links?: Array<string>;
31
+ }
32
+ export interface BatchJobResponse {
33
+ jobId: string;
34
+ status: string;
35
+ }
36
+ export interface BatchJobStatus {
37
+ jobId: string;
38
+ status: string;
39
+ data: {
40
+ status: string;
41
+ requestsCount: number;
42
+ responsesCount: number;
43
+ };
44
+ }
45
+ /**
46
+ * In batch jobs, results are only links to json files containing the actual scrape results.
47
+ */
48
+ export interface BatchResultItem {
49
+ query: Record<string, unknown>;
50
+ result: {
51
+ id: string;
52
+ status: string;
53
+ json?: string;
54
+ };
55
+ }
56
+ export interface BatchResults {
57
+ page: number;
58
+ limit: number;
59
+ total: number;
60
+ results: Array<BatchResultItem>;
61
+ }
62
+ export declare function scrapeWeb(url: string, options: ScrapeOptions): Promise<ScrapeResponse>;
63
+ export declare function scrapeWebBatch(urls: Array<string>, options: ScrapeOptions, maxConcurrency?: number): Promise<Array<ScrapeResponse>>;
64
+ /** Submit a batch scrape job to HasData API.
65
+ * IMPORTANT: results are not returned in original order! You need to match them by jobId and query.url.
66
+ */
67
+ export declare function submitBatchScrapeJob(urls: Array<string>, options: ScrapeOptions): Promise<BatchJobResponse>;
68
+ export declare function getBatchJobStatus(jobId: string): Promise<BatchJobStatus>;
69
+ export declare function waitForBatchCompletion(jobId: string, pollInterval?: number, maxWaitTime?: number): Promise<BatchJobStatus>;
70
+ export declare function getBatchJobPage(jobId: string, page?: number, limit?: number): Promise<BatchResults>;
71
+ export declare function runBatchScrape(urls: Array<string>, options: ScrapeOptions, pageSize?: number, pollInterval?: number, maxWaitTime?: number): Promise<Array<ScrapeResponse>>;
72
+ export {};
73
+ //# sourceMappingURL=scrape.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scrape.d.ts","sourceRoot":"","sources":["../../../../src/src/apis/hasdata/scrape.ts"],"names":[],"mappings":"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"}