@wipperoz/wipperoz-core 1.4.4 → 1.5.0

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,43 @@
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
+ sortBy?: string;
26
+ sortOrder?: 'asc' | 'desc';
27
+ }
28
+ export interface SpyFuMostValuableKeywordsOptions {
29
+ startingRow?: number;
30
+ pageSize?: number;
31
+ countryCode?: string;
32
+ }
33
+ export interface SpyFuTopSeoCompetitorsOptions {
34
+ pageSize?: number;
35
+ }
36
+ export interface SpyFuQuestionKeywordsOptions {
37
+ pageSize?: number;
38
+ }
39
+ export interface SpyFuWhereTheyOutrankYouOptions {
40
+ startingRow?: number;
41
+ pageSize?: number;
42
+ }
43
+ //# 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,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,gCAAgC;IAC/C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;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,26 @@
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
+ }
26
+ //# 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;IAuBpB,uBAAuB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,gCAAgC,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAW5G,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,6BAA6B,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IA0BzG,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,4BAA4B,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IASrG,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;YAwCX,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;CAGd"}
@@ -0,0 +1,232 @@
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
+ domains,
32
+ ...(exclude ? { excludeDomains: exclude } : {}),
33
+ ...(options?.startingRow !== undefined ? { startingRow: String(options.startingRow) } : {}),
34
+ ...(options?.pageSize !== undefined ? { pageSize: String(options.pageSize) } : {}),
35
+ ...(options?.sortBy ? { sortBy: options.sortBy } : {}),
36
+ ...(options?.sortOrder ? { sortOrder: options.sortOrder } : {}),
37
+ });
38
+ return this.mapKeywords(response, 'kombat');
39
+ }
40
+ async getMostValuableKeywords(domain, options) {
41
+ const response = await this.makeRequest('/serp_api/v2/seo/getMostValuableKeywords', {
42
+ domain,
43
+ ...(options?.startingRow !== undefined ? { startingRow: String(options.startingRow) } : {}),
44
+ ...(options?.pageSize !== undefined ? { pageSize: String(options.pageSize) } : {}),
45
+ ...(options?.countryCode ? { countryCode: options.countryCode } : {}),
46
+ });
47
+ return this.mapKeywords(response, 'most-valuable', domain);
48
+ }
49
+ async getTopSeoCompetitors(domain, options) {
50
+ const response = await this.makeRequest('/competitors_api/v2/seo/getTopCompetitors', {
51
+ domain,
52
+ ...(options?.pageSize !== undefined ? { pageSize: String(options.pageSize) } : {}),
53
+ });
54
+ const rows = this.extractRows(response);
55
+ return rows
56
+ .map(row => {
57
+ const candidate = row;
58
+ const competitorDomain = this.asString(candidate.domain ?? candidate.competitorDomain);
59
+ if (!competitorDomain) {
60
+ return null;
61
+ }
62
+ return {
63
+ domain: competitorDomain,
64
+ commonKeywords: this.asNumber(candidate.commonKeywords ?? candidate.sharedKeywords),
65
+ relevanceScore: this.asNumber(candidate.relevanceScore ?? candidate.score),
66
+ };
67
+ })
68
+ .filter((item) => item !== null);
69
+ }
70
+ async getQuestionKeywords(keyword, options) {
71
+ const response = await this.makeRequest('/keyword_api/v2/related/getQuestionKeywords', {
72
+ keyword,
73
+ ...(options?.pageSize !== undefined ? { pageSize: String(options.pageSize) } : {}),
74
+ });
75
+ return this.mapKeywords(response, 'question');
76
+ }
77
+ async getWhereTheyOutrankYou(domain, competitorDomain, options) {
78
+ const response = await this.makeRequest('/serp_api/v2/seo/getWhereTheyOutRankYou', {
79
+ domain,
80
+ competitorDomain,
81
+ ...(options?.startingRow !== undefined ? { startingRow: String(options.startingRow) } : {}),
82
+ ...(options?.pageSize !== undefined ? { pageSize: String(options.pageSize) } : {}),
83
+ });
84
+ return this.mapKeywords(response, 'outranking', competitorDomain);
85
+ }
86
+ async getKeywordInformationBulk(keywords) {
87
+ const cleanedKeywords = keywords.map(keyword => keyword.trim()).filter(Boolean);
88
+ if (cleanedKeywords.length === 0) {
89
+ return [];
90
+ }
91
+ const response = await this.makeRequest('/keyword_api/v2/related/getKeywordInformation', { keywords: cleanedKeywords.join(',') }, { method: 'POST', body: JSON.stringify({ keywords: cleanedKeywords }) });
92
+ return this.mapKeywords(response, 'bulk');
93
+ }
94
+ async makeRequest(endpoint, params, options) {
95
+ const method = options?.method ?? 'GET';
96
+ const query = new URLSearchParams(params);
97
+ const url = `${this.baseUrl}${endpoint}?${query.toString()}`;
98
+ return this.withRetry(async () => this.withRateLimit(async () => {
99
+ const response = await fetch(url, {
100
+ method,
101
+ headers: {
102
+ Authorization: `Bearer ${this.apiKey}`,
103
+ Accept: 'application/json',
104
+ ...(method === 'POST' ? { 'Content-Type': 'application/json' } : {}),
105
+ },
106
+ ...(options?.body ? { body: options.body } : {}),
107
+ signal: AbortSignal.timeout(30000),
108
+ });
109
+ if (!response.ok) {
110
+ const error = new Error(`[SpyFuService] ${method} ${endpoint} failed with ${response.status}`);
111
+ error.status = response.status;
112
+ const retryAfter = response.headers.get('retry-after');
113
+ if (retryAfter) {
114
+ const retryAfterSeconds = Number(retryAfter);
115
+ if (!Number.isNaN(retryAfterSeconds) && retryAfterSeconds > 0) {
116
+ error.retryAfterMs = retryAfterSeconds * 1000;
117
+ }
118
+ }
119
+ throw error;
120
+ }
121
+ return (await response.json());
122
+ }));
123
+ }
124
+ async withRateLimit(fn) {
125
+ const now = Date.now();
126
+ const elapsed = now - this.lastRequestAt;
127
+ const waitMs = Math.max(0, this.rateLimitDelayMs - elapsed);
128
+ if (waitMs > 0) {
129
+ await this.sleep(waitMs);
130
+ }
131
+ this.lastRequestAt = Date.now();
132
+ return fn();
133
+ }
134
+ async withRetry(fn, retries = this.maxRetries) {
135
+ let lastError;
136
+ for (let attempt = 0; attempt <= retries; attempt++) {
137
+ try {
138
+ return await fn();
139
+ }
140
+ catch (error) {
141
+ lastError = error;
142
+ const isLastAttempt = attempt >= retries;
143
+ if (isLastAttempt) {
144
+ break;
145
+ }
146
+ const typedError = error;
147
+ const retryDelayMs = typedError.status === 429 && typedError.retryAfterMs ? typedError.retryAfterMs : 250 * 2 ** attempt;
148
+ await this.sleep(retryDelayMs);
149
+ }
150
+ }
151
+ throw lastError;
152
+ }
153
+ mapKeywords(payload, source, fallbackCompetitorDomain = '') {
154
+ const rows = this.extractRows(payload);
155
+ return rows
156
+ .map(row => {
157
+ if (typeof row === 'string') {
158
+ return this.buildKeywordRecord({ keyword: row }, source, fallbackCompetitorDomain);
159
+ }
160
+ return this.buildKeywordRecord(row, source, fallbackCompetitorDomain);
161
+ })
162
+ .filter((item) => item !== null);
163
+ }
164
+ buildKeywordRecord(raw, source, fallbackCompetitorDomain) {
165
+ const keyword = this.asString(raw.keyword ?? raw.searchTerm ?? raw.term ?? raw.query);
166
+ if (!keyword) {
167
+ return null;
168
+ }
169
+ return {
170
+ keyword,
171
+ searchVolume: this.asNumber(raw.searchVolume ?? raw.monthlySearches ?? raw.volume),
172
+ rankPosition: this.asNumber(raw.rankPosition ?? raw.position ?? raw.rank),
173
+ difficulty: this.asNumber(raw.difficulty ?? raw.keywordDifficulty),
174
+ cpc: this.asNumber(raw.cpc ?? raw.costPerClick),
175
+ clicksPerMonth: this.asNumber(raw.clicksPerMonth ?? raw.clicks),
176
+ competitorDomain: this.asString(raw.competitorDomain ?? raw.domain ?? raw.url) || fallbackCompetitorDomain,
177
+ source,
178
+ };
179
+ }
180
+ extractRows(payload) {
181
+ const candidateLists = [
182
+ payload.results,
183
+ payload.data,
184
+ payload.keywords,
185
+ payload.rows,
186
+ payload.items,
187
+ payload.result,
188
+ payload,
189
+ ];
190
+ for (const candidate of candidateLists) {
191
+ if (Array.isArray(candidate)) {
192
+ return candidate;
193
+ }
194
+ if (candidate && typeof candidate === 'object') {
195
+ const nested = candidate;
196
+ if (Array.isArray(nested.results)) {
197
+ return nested.results;
198
+ }
199
+ if (Array.isArray(nested.rows)) {
200
+ return nested.rows;
201
+ }
202
+ if (Array.isArray(nested.keywords)) {
203
+ return nested.keywords;
204
+ }
205
+ }
206
+ }
207
+ return [];
208
+ }
209
+ asString(value) {
210
+ if (typeof value === 'string') {
211
+ return value.trim();
212
+ }
213
+ return '';
214
+ }
215
+ asNumber(value) {
216
+ if (typeof value === 'number' && Number.isFinite(value)) {
217
+ return value;
218
+ }
219
+ if (typeof value === 'string') {
220
+ const parsed = Number(value);
221
+ if (Number.isFinite(parsed)) {
222
+ return parsed;
223
+ }
224
+ }
225
+ return 0;
226
+ }
227
+ sleep(ms) {
228
+ return new Promise(resolve => setTimeout(resolve, ms));
229
+ }
230
+ }
231
+ exports.SpyFuService = SpyFuService;
232
+ //# 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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"}