@wipperoz/wipperoz-core 1.4.4 → 1.5.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/dist/index.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  export * from './billing';
2
2
  export * from './account/services/account.service';
3
3
  export * from './feedIntelligence';
4
+ export * from './spyFu';
4
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,oCAAoC,CAAC;AACnD,cAAc,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,oCAAoC,CAAC;AACnD,cAAc,oBAAoB,CAAC;AACnC,cAAc,SAAS,CAAC"}
package/dist/index.js CHANGED
@@ -4,4 +4,5 @@ const tslib_1 = require("tslib");
4
4
  tslib_1.__exportStar(require("./billing"), exports);
5
5
  tslib_1.__exportStar(require("./account/services/account.service"), exports);
6
6
  tslib_1.__exportStar(require("./feedIntelligence"), exports);
7
+ tslib_1.__exportStar(require("./spyFu"), exports);
7
8
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,oDAA0B;AAC1B,6EAAmD;AACnD,6DAAmC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,oDAA0B;AAC1B,6EAAmD;AACnD,6DAAmC;AACnC,kDAAwB"}
@@ -0,0 +1,3 @@
1
+ export * from './interfaces';
2
+ export * from './services';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/spyFu/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC"}
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ tslib_1.__exportStar(require("./interfaces"), exports);
5
+ tslib_1.__exportStar(require("./services"), exports);
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/spyFu/index.ts"],"names":[],"mappings":";;;AAAA,uDAA6B;AAC7B,qDAA2B"}
@@ -0,0 +1,56 @@
1
+ export interface SpyFuConfig {
2
+ apiKey: string;
3
+ baseUrl?: string;
4
+ maxRetries?: number;
5
+ rateLimitDelayMs?: number;
6
+ }
7
+ export interface SpyFuKeyword {
8
+ keyword: string;
9
+ searchVolume: number;
10
+ rankPosition: number;
11
+ difficulty: number;
12
+ cpc: number;
13
+ clicksPerMonth: number;
14
+ competitorDomain: string;
15
+ source: 'kombat' | 'most-valuable' | 'outranking' | 'question' | 'bulk';
16
+ }
17
+ export interface SpyFuCompetitor {
18
+ domain: string;
19
+ commonKeywords: number;
20
+ relevanceScore: number;
21
+ }
22
+ export interface SpyFuCompetingSeoKeywordsOptions {
23
+ startingRow?: number;
24
+ pageSize?: number;
25
+ countryCode?: string;
26
+ sortBy?: string;
27
+ sortOrder?: 'asc' | 'desc' | 'Ascending' | 'Descending';
28
+ }
29
+ export interface SpyFuMostValuableKeywordsOptions {
30
+ startingRow?: number;
31
+ pageSize?: number;
32
+ countryCode?: string;
33
+ compareDomain?: string;
34
+ sortBy?: string;
35
+ sortOrder?: 'asc' | 'desc' | 'Ascending' | 'Descending';
36
+ exactMatch?: boolean;
37
+ }
38
+ export interface SpyFuTopSeoCompetitorsOptions {
39
+ startingRow?: number;
40
+ pageSize?: number;
41
+ countryCode?: string;
42
+ sortBy?: string;
43
+ sortOrder?: 'asc' | 'desc' | 'Ascending' | 'Descending';
44
+ }
45
+ export interface SpyFuQuestionKeywordsOptions {
46
+ startingRow?: number;
47
+ pageSize?: number;
48
+ countryCode?: string;
49
+ sortBy?: string;
50
+ sortOrder?: 'asc' | 'desc' | 'Ascending' | 'Descending';
51
+ }
52
+ export interface SpyFuWhereTheyOutrankYouOptions {
53
+ startingRow?: number;
54
+ pageSize?: number;
55
+ }
56
+ //# sourceMappingURL=interfaces.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../src/spyFu/interfaces.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,QAAQ,GAAG,eAAe,GAAG,YAAY,GAAG,UAAU,GAAG,MAAM,CAAC;CACzE;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,gCAAgC;IAC/C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,WAAW,GAAG,YAAY,CAAC;CACzD;AAED,MAAM,WAAW,gCAAgC;IAC/C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,WAAW,GAAG,YAAY,CAAC;IACxD,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,6BAA6B;IAC5C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,WAAW,GAAG,YAAY,CAAC;CACzD;AAED,MAAM,WAAW,4BAA4B;IAC3C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,WAAW,GAAG,YAAY,CAAC;CACzD;AAED,MAAM,WAAW,+BAA+B;IAC9C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=interfaces.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../../src/spyFu/interfaces.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export * from './spyFu.service';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/spyFu/services/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC"}
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ tslib_1.__exportStar(require("./spyFu.service"), exports);
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/spyFu/services/index.ts"],"names":[],"mappings":";;;AAAA,0DAAgC"}
@@ -0,0 +1,28 @@
1
+ import { SpyFuCompetingSeoKeywordsOptions, SpyFuConfig, SpyFuKeyword, SpyFuCompetitor, SpyFuMostValuableKeywordsOptions, SpyFuQuestionKeywordsOptions, SpyFuTopSeoCompetitorsOptions, SpyFuWhereTheyOutrankYouOptions } from '../interfaces';
2
+ export declare class SpyFuService {
3
+ private config;
4
+ private readonly apiKey;
5
+ private readonly baseUrl;
6
+ private readonly maxRetries;
7
+ private readonly rateLimitDelayMs;
8
+ private lastRequestAt;
9
+ constructor(config: SpyFuConfig);
10
+ getCompetingSeoKeywords(includedDomains: string[], excludedDomains?: string[], options?: SpyFuCompetingSeoKeywordsOptions): Promise<SpyFuKeyword[]>;
11
+ getMostValuableKeywords(domain: string, options?: SpyFuMostValuableKeywordsOptions): Promise<SpyFuKeyword[]>;
12
+ getTopSeoCompetitors(domain: string, options?: SpyFuTopSeoCompetitorsOptions): Promise<SpyFuCompetitor[]>;
13
+ getQuestionKeywords(keyword: string, options?: SpyFuQuestionKeywordsOptions): Promise<SpyFuKeyword[]>;
14
+ getWhereTheyOutrankYou(domain: string, competitorDomain: string, options?: SpyFuWhereTheyOutrankYouOptions): Promise<SpyFuKeyword[]>;
15
+ getKeywordInformationBulk(keywords: string[]): Promise<SpyFuKeyword[]>;
16
+ private makeRequest;
17
+ private withRateLimit;
18
+ private withRetry;
19
+ private mapKeywords;
20
+ private buildKeywordRecord;
21
+ private extractRows;
22
+ private asString;
23
+ private asNumber;
24
+ private sleep;
25
+ private redactApiKey;
26
+ private normalizeSortOrder;
27
+ }
28
+ //# sourceMappingURL=spyFu.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spyFu.service.d.ts","sourceRoot":"","sources":["../../../src/spyFu/services/spyFu.service.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gCAAgC,EAChC,WAAW,EACX,YAAY,EACZ,eAAe,EACf,gCAAgC,EAChC,4BAA4B,EAC5B,6BAA6B,EAC7B,+BAA+B,EAChC,MAAM,eAAe,CAAC;AAYvB,qBAAa,YAAY;IAOX,OAAO,CAAC,MAAM;IAN1B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,aAAa,CAAK;gBAEN,MAAM,EAAE,WAAW;IAWjC,uBAAuB,CAC3B,eAAe,EAAE,MAAM,EAAE,EACzB,eAAe,CAAC,EAAE,MAAM,EAAE,EAC1B,OAAO,CAAC,EAAE,gCAAgC,GACzC,OAAO,CAAC,YAAY,EAAE,CAAC;IAwBpB,uBAAuB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,gCAAgC,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAe5G,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,6BAA6B,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IA8BzG,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,4BAA4B,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAarG,sBAAsB,CAC1B,MAAM,EAAE,MAAM,EACd,gBAAgB,EAAE,MAAM,EACxB,OAAO,CAAC,EAAE,+BAA+B,GACxC,OAAO,CAAC,YAAY,EAAE,CAAC;IAWpB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;YAgB9D,WAAW;YA+EX,aAAa;YAab,SAAS;IAyBvB,OAAO,CAAC,WAAW;IAkBnB,OAAO,CAAC,kBAAkB;IAuB1B,OAAO,CAAC,WAAW;IAoCnB,OAAO,CAAC,QAAQ;IAQhB,OAAO,CAAC,QAAQ;IAehB,OAAO,CAAC,KAAK;IAIb,OAAO,CAAC,YAAY;IAapB,OAAO,CAAC,kBAAkB;CAG3B"}
@@ -0,0 +1,293 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SpyFuService = void 0;
4
+ class SpyFuService {
5
+ config;
6
+ apiKey;
7
+ baseUrl;
8
+ maxRetries;
9
+ rateLimitDelayMs;
10
+ lastRequestAt = 0;
11
+ constructor(config) {
12
+ this.config = config;
13
+ if (!config.apiKey?.trim()) {
14
+ throw new Error('[SpyFuService] apiKey is required');
15
+ }
16
+ this.apiKey = config.apiKey.trim();
17
+ this.baseUrl = (config.baseUrl ?? 'https://api.spyfu.com').replace(/\/$/, '');
18
+ this.maxRetries = config.maxRetries ?? 3;
19
+ this.rateLimitDelayMs = config.rateLimitDelayMs ?? 150;
20
+ }
21
+ async getCompetingSeoKeywords(includedDomains, excludedDomains, options) {
22
+ const domains = includedDomains
23
+ .map(domain => domain.trim())
24
+ .filter(Boolean)
25
+ .join(',');
26
+ const exclude = (excludedDomains ?? [])
27
+ .map(domain => domain.trim())
28
+ .filter(Boolean)
29
+ .join(',');
30
+ const response = await this.makeRequest('/keyword_api/v2/kombat/getCompetingSeoKeywords', {
31
+ includedDomains: domains,
32
+ ...(exclude ? { excludedDomains: exclude } : {}),
33
+ ...(options?.startingRow !== undefined ? { startingRow: String(options.startingRow) } : {}),
34
+ ...(options?.pageSize !== undefined ? { pageSize: String(options.pageSize) } : {}),
35
+ ...(options?.countryCode ? { countryCode: options.countryCode } : {}),
36
+ ...(options?.sortBy ? { sortBy: options.sortBy } : {}),
37
+ ...(options?.sortOrder ? { sortOrder: this.normalizeSortOrder(options.sortOrder) } : {}),
38
+ });
39
+ return this.mapKeywords(response, 'kombat');
40
+ }
41
+ async getMostValuableKeywords(domain, options) {
42
+ const response = await this.makeRequest('/serp_api/v2/seo/getMostValuableKeywords', {
43
+ query: domain,
44
+ ...(options?.startingRow !== undefined ? { startingRow: String(options.startingRow) } : {}),
45
+ ...(options?.pageSize !== undefined ? { pageSize: String(options.pageSize) } : {}),
46
+ ...(options?.countryCode ? { countryCode: options.countryCode } : {}),
47
+ ...(options?.compareDomain ? { compareDomain: options.compareDomain } : {}),
48
+ ...(options?.sortBy ? { sortBy: options.sortBy } : {}),
49
+ ...(options?.sortOrder ? { sortOrder: this.normalizeSortOrder(options.sortOrder) } : {}),
50
+ ...(options?.exactMatch !== undefined ? { exactMatch: String(options.exactMatch) } : {}),
51
+ });
52
+ return this.mapKeywords(response, 'most-valuable', domain);
53
+ }
54
+ async getTopSeoCompetitors(domain, options) {
55
+ const response = await this.makeRequest('/competitors_api/v2/seo/getTopCompetitors', {
56
+ query: domain,
57
+ ...(options?.startingRow !== undefined ? { startingRow: String(options.startingRow) } : {}),
58
+ ...(options?.pageSize !== undefined ? { pageSize: String(options.pageSize) } : {}),
59
+ ...(options?.countryCode ? { countryCode: options.countryCode } : {}),
60
+ ...(options?.sortBy ? { sortBy: options.sortBy } : {}),
61
+ ...(options?.sortOrder ? { sortOrder: this.normalizeSortOrder(options.sortOrder) } : {}),
62
+ });
63
+ const rows = this.extractRows(response);
64
+ return rows
65
+ .map(row => {
66
+ const candidate = row;
67
+ const competitorDomain = this.asString(candidate.domain ?? candidate.competitorDomain);
68
+ if (!competitorDomain) {
69
+ return null;
70
+ }
71
+ return {
72
+ domain: competitorDomain,
73
+ commonKeywords: this.asNumber(candidate.commonKeywords ?? candidate.sharedKeywords),
74
+ relevanceScore: this.asNumber(candidate.relevanceScore ?? candidate.score),
75
+ };
76
+ })
77
+ .filter((item) => item !== null);
78
+ }
79
+ async getQuestionKeywords(keyword, options) {
80
+ const response = await this.makeRequest('/keyword_api/v2/related/getQuestionKeywords', {
81
+ query: keyword,
82
+ ...(options?.startingRow !== undefined ? { startingRow: String(options.startingRow) } : {}),
83
+ ...(options?.pageSize !== undefined ? { pageSize: String(options.pageSize) } : {}),
84
+ ...(options?.countryCode ? { countryCode: options.countryCode } : {}),
85
+ ...(options?.sortBy ? { sortBy: options.sortBy } : {}),
86
+ ...(options?.sortOrder ? { sortOrder: this.normalizeSortOrder(options.sortOrder) } : {}),
87
+ });
88
+ return this.mapKeywords(response, 'question');
89
+ }
90
+ async getWhereTheyOutrankYou(domain, competitorDomain, options) {
91
+ const response = await this.makeRequest('/serp_api/v2/seo/getWhereTheyOutRankYou', {
92
+ query: domain,
93
+ compareDomain: competitorDomain,
94
+ ...(options?.startingRow !== undefined ? { startingRow: String(options.startingRow) } : {}),
95
+ ...(options?.pageSize !== undefined ? { pageSize: String(options.pageSize) } : {}),
96
+ });
97
+ return this.mapKeywords(response, 'outranking', competitorDomain);
98
+ }
99
+ async getKeywordInformationBulk(keywords) {
100
+ const cleanedKeywords = keywords.map(keyword => keyword.trim()).filter(Boolean);
101
+ if (cleanedKeywords.length === 0) {
102
+ return [];
103
+ }
104
+ const response = await this.makeRequest('/keyword_api/v2/related/getKeywordsByBulkSearchPost', {}, { method: 'POST', body: JSON.stringify({ keywords: cleanedKeywords.join(',') }) });
105
+ return this.mapKeywords(response, 'bulk');
106
+ }
107
+ async makeRequest(endpoint, params, options) {
108
+ const method = options?.method ?? 'GET';
109
+ const requestParams = {
110
+ ...params,
111
+ api_key: params.api_key ?? this.apiKey,
112
+ };
113
+ const query = new URLSearchParams(requestParams);
114
+ const url = `${this.baseUrl}${endpoint}?${query.toString()}`;
115
+ const redactedParams = {
116
+ ...requestParams,
117
+ ...(requestParams.api_key ? { api_key: this.redactApiKey(requestParams.api_key) } : {}),
118
+ };
119
+ const redactedUrl = `${this.baseUrl}${endpoint}?${new URLSearchParams(redactedParams).toString()}`;
120
+ console.log('[SpyFuService] Outgoing request', {
121
+ method,
122
+ endpoint,
123
+ url: redactedUrl,
124
+ params: redactedParams,
125
+ hasBody: Boolean(options?.body),
126
+ bodyLength: options?.body?.length ?? 0,
127
+ });
128
+ return this.withRetry(async () => this.withRateLimit(async () => {
129
+ const response = await fetch(url, {
130
+ method,
131
+ headers: {
132
+ Authorization: `Bearer ${this.apiKey}`,
133
+ Accept: 'application/json',
134
+ ...(method === 'POST' ? { 'Content-Type': 'application/json' } : {}),
135
+ },
136
+ ...(options?.body ? { body: options.body } : {}),
137
+ signal: AbortSignal.timeout(30000),
138
+ });
139
+ if (!response.ok) {
140
+ let responseBody = '';
141
+ try {
142
+ responseBody = await response.text();
143
+ }
144
+ catch {
145
+ responseBody = '';
146
+ }
147
+ console.warn('[SpyFuService] Request failed', {
148
+ method,
149
+ endpoint,
150
+ status: response.status,
151
+ responseBody,
152
+ });
153
+ const error = new Error(`[SpyFuService] ${method} ${endpoint} failed with ${response.status}`);
154
+ error.status = response.status;
155
+ const retryAfter = response.headers.get('retry-after');
156
+ if (retryAfter) {
157
+ const retryAfterSeconds = Number(retryAfter);
158
+ if (!Number.isNaN(retryAfterSeconds) && retryAfterSeconds > 0) {
159
+ error.retryAfterMs = retryAfterSeconds * 1000;
160
+ }
161
+ }
162
+ throw error;
163
+ }
164
+ console.log('[SpyFuService] Request succeeded', {
165
+ method,
166
+ endpoint,
167
+ status: response.status,
168
+ });
169
+ return (await response.json());
170
+ }));
171
+ }
172
+ async withRateLimit(fn) {
173
+ const now = Date.now();
174
+ const elapsed = now - this.lastRequestAt;
175
+ const waitMs = Math.max(0, this.rateLimitDelayMs - elapsed);
176
+ if (waitMs > 0) {
177
+ await this.sleep(waitMs);
178
+ }
179
+ this.lastRequestAt = Date.now();
180
+ return fn();
181
+ }
182
+ async withRetry(fn, retries = this.maxRetries) {
183
+ let lastError;
184
+ for (let attempt = 0; attempt <= retries; attempt++) {
185
+ try {
186
+ return await fn();
187
+ }
188
+ catch (error) {
189
+ lastError = error;
190
+ const isLastAttempt = attempt >= retries;
191
+ if (isLastAttempt) {
192
+ break;
193
+ }
194
+ const typedError = error;
195
+ const retryDelayMs = typedError.status === 429 && typedError.retryAfterMs ? typedError.retryAfterMs : 250 * 2 ** attempt;
196
+ await this.sleep(retryDelayMs);
197
+ }
198
+ }
199
+ throw lastError;
200
+ }
201
+ mapKeywords(payload, source, fallbackCompetitorDomain = '') {
202
+ const rows = this.extractRows(payload);
203
+ return rows
204
+ .map(row => {
205
+ if (typeof row === 'string') {
206
+ return this.buildKeywordRecord({ keyword: row }, source, fallbackCompetitorDomain);
207
+ }
208
+ return this.buildKeywordRecord(row, source, fallbackCompetitorDomain);
209
+ })
210
+ .filter((item) => item !== null);
211
+ }
212
+ buildKeywordRecord(raw, source, fallbackCompetitorDomain) {
213
+ const keyword = this.asString(raw.keyword ?? raw.searchTerm ?? raw.term ?? raw.query);
214
+ if (!keyword) {
215
+ return null;
216
+ }
217
+ return {
218
+ keyword,
219
+ searchVolume: this.asNumber(raw.searchVolume ?? raw.monthlySearches ?? raw.volume),
220
+ rankPosition: this.asNumber(raw.rankPosition ?? raw.position ?? raw.rank),
221
+ difficulty: this.asNumber(raw.difficulty ?? raw.keywordDifficulty),
222
+ cpc: this.asNumber(raw.cpc ?? raw.costPerClick),
223
+ clicksPerMonth: this.asNumber(raw.clicksPerMonth ?? raw.clicks),
224
+ competitorDomain: this.asString(raw.competitorDomain ?? raw.domain ?? raw.url) || fallbackCompetitorDomain,
225
+ source,
226
+ };
227
+ }
228
+ extractRows(payload) {
229
+ const candidateLists = [
230
+ payload.results,
231
+ payload.data,
232
+ payload.keywords,
233
+ payload.rows,
234
+ payload.items,
235
+ payload.result,
236
+ payload,
237
+ ];
238
+ for (const candidate of candidateLists) {
239
+ if (Array.isArray(candidate)) {
240
+ return candidate;
241
+ }
242
+ if (candidate && typeof candidate === 'object') {
243
+ const nested = candidate;
244
+ if (Array.isArray(nested.results)) {
245
+ return nested.results;
246
+ }
247
+ if (Array.isArray(nested.rows)) {
248
+ return nested.rows;
249
+ }
250
+ if (Array.isArray(nested.keywords)) {
251
+ return nested.keywords;
252
+ }
253
+ }
254
+ }
255
+ return [];
256
+ }
257
+ asString(value) {
258
+ if (typeof value === 'string') {
259
+ return value.trim();
260
+ }
261
+ return '';
262
+ }
263
+ asNumber(value) {
264
+ if (typeof value === 'number' && Number.isFinite(value)) {
265
+ return value;
266
+ }
267
+ if (typeof value === 'string') {
268
+ const parsed = Number(value);
269
+ if (Number.isFinite(parsed)) {
270
+ return parsed;
271
+ }
272
+ }
273
+ return 0;
274
+ }
275
+ sleep(ms) {
276
+ return new Promise(resolve => setTimeout(resolve, ms));
277
+ }
278
+ redactApiKey(value) {
279
+ const trimmed = value.trim();
280
+ if (!trimmed) {
281
+ return '***';
282
+ }
283
+ if (trimmed.length <= 6) {
284
+ return `${trimmed.slice(0, 2)}***`;
285
+ }
286
+ return `${trimmed.slice(0, 2)}***${trimmed.slice(-2)}`;
287
+ }
288
+ normalizeSortOrder(sortOrder) {
289
+ return sortOrder === 'asc' || sortOrder === 'Ascending' ? 'Ascending' : 'Descending';
290
+ }
291
+ }
292
+ exports.SpyFuService = SpyFuService;
293
+ //# sourceMappingURL=spyFu.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spyFu.service.js","sourceRoot":"","sources":["../../../src/spyFu/services/spyFu.service.ts"],"names":[],"mappings":"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"}