@taskmagic/apps-serpstat 0.0.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/README.md ADDED
@@ -0,0 +1,3 @@
1
+ # Serpstat
2
+
3
+ Serpstat is an all-in-one SEO platform for keyword research, competitor analysis, and rank tracking. This piece exposes Serpstat's Keyword Analysis API.
package/package.json ADDED
@@ -0,0 +1,47 @@
1
+ {
2
+ "name": "@taskmagic/apps-serpstat",
3
+ "version": "0.0.1",
4
+ "dependencies": {
5
+ "@anthropic-ai/sdk": "0.33.1",
6
+ "@sinclair/typebox": "0.34.11",
7
+ "axios": "1.17.0",
8
+ "axios-retry": "4.4.1",
9
+ "deepmerge-ts": "7.1.0",
10
+ "mime-types": "2.1.35",
11
+ "nanoid": "3.3.8",
12
+ "openai": "4.67.1",
13
+ "replicate": "0.34.1",
14
+ "semver": "7.6.0",
15
+ "zod": "3.25.76",
16
+ "@taskmagic/pieces-common": "0.4.4",
17
+ "@taskmagic/pieces-framework": "0.7.46",
18
+ "@taskmagic/shared": "0.10.171",
19
+ "tslib": "1.14.1"
20
+ },
21
+ "overrides": {
22
+ "cross-spawn": "7.0.6",
23
+ "elliptic": "^6.6.1",
24
+ "fast-xml-parser": "^4.4.1",
25
+ "protobufjs": "^7.5.5",
26
+ "tmp": "^0.2.4",
27
+ "koa": "^2.16.4",
28
+ "picomatch": "^4.0.4",
29
+ "langsmith": "^0.6.0",
30
+ "serialize-javascript": "^6.0.2",
31
+ "elevenlabs": {
32
+ "form-data": "^4.0.4"
33
+ },
34
+ "@tryfabric/martian": {
35
+ "@notionhq/client": "$@notionhq/client"
36
+ },
37
+ "vite": {
38
+ "rollup": "npm:@rollup/wasm-node@^4.61.1"
39
+ }
40
+ },
41
+ "resolutions": {
42
+ "rollup": "npm:@rollup/wasm-node@^4.61.1"
43
+ },
44
+ "types": "./src/index.d.ts",
45
+ "main": "./src/index.js",
46
+ "type": "commonjs"
47
+ }
package/src/index.d.ts ADDED
@@ -0,0 +1 @@
1
+ export declare const serpstat: import("@taskmagic/pieces-framework").Piece<import("@taskmagic/pieces-framework").SecretTextProperty<true>>;
package/src/index.js ADDED
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.serpstat = void 0;
4
+ const pieces_framework_1 = require("@taskmagic/pieces-framework");
5
+ const pieces_common_1 = require("@taskmagic/pieces-common");
6
+ const shared_1 = require("@taskmagic/shared");
7
+ const auth_1 = require("./lib/common/auth");
8
+ const client_1 = require("./lib/common/client");
9
+ const get_keywords_1 = require("./lib/actions/keyword-analysis/get-keywords");
10
+ const get_suggestions_1 = require("./lib/actions/keyword-analysis/get-suggestions");
11
+ exports.serpstat = (0, pieces_framework_1.createPiece)({
12
+ displayName: 'Serpstat',
13
+ description: 'Research keywords with Serpstat: look up organic keyword data (search volume, CPC, competition) for a seed term and discover related keyword suggestions on a chosen search engine and region.',
14
+ auth: auth_1.serpstatAuth,
15
+ categories: [shared_1.PieceCategory.PRODUCTIVITY],
16
+ minimumSupportedRelease: '0.30.0',
17
+ logoUrl: 'https://cdn.activepieces.com/pieces/serpstat.png',
18
+ authors: ['geekyme'],
19
+ ai: {
20
+ description: 'Research keywords with Serpstat keyword analysis: get organic keyword data (search volume, CPC, competition, results count) that a seed keyword ranks for, and fetch related keyword suggestions, on a chosen search engine/region.',
21
+ keywords: [
22
+ 'serpstat',
23
+ 'seo',
24
+ 'keyword research',
25
+ 'keyword analysis',
26
+ 'search volume',
27
+ 'cpc',
28
+ 'keyword suggestions',
29
+ 'competition',
30
+ 'serp',
31
+ ],
32
+ },
33
+ actions: [
34
+ get_keywords_1.getKeywords,
35
+ get_suggestions_1.getSuggestions,
36
+ (0, pieces_common_1.createCustomApiCallAction)({
37
+ auth: auth_1.serpstatAuth,
38
+ baseUrl: () => client_1.BASE_URL,
39
+ }),
40
+ ],
41
+ triggers: [],
42
+ });
43
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../packages/pieces/community/serpstat/src/index.ts"],"names":[],"mappings":";;;AAAA,kEAA0D;AAC1D,4DAAqE;AACrE,8CAAkD;AAClD,4CAAiD;AACjD,gDAA+C;AAC/C,8EAA0E;AAC1E,oFAAgF;AAEnE,QAAA,QAAQ,GAAG,IAAA,8BAAW,EAAC;IAClC,WAAW,EAAE,UAAU;IACvB,WAAW,EACT,gMAAgM;IAClM,IAAI,EAAE,mBAAY;IAClB,UAAU,EAAE,CAAC,sBAAa,CAAC,YAAY,CAAC;IACxC,uBAAuB,EAAE,QAAQ;IACjC,OAAO,EAAE,kDAAkD;IAC3D,OAAO,EAAE,CAAC,SAAS,CAAC;IACpB,EAAE,EAAE;QACF,WAAW,EACT,qOAAqO;QACvO,QAAQ,EAAE;YACR,UAAU;YACV,KAAK;YACL,kBAAkB;YAClB,kBAAkB;YAClB,eAAe;YACf,KAAK;YACL,qBAAqB;YACrB,aAAa;YACb,MAAM;SACP;KACF;IACD,OAAO,EAAE;QACP,0BAAW;QACX,gCAAc;QACd,IAAA,yCAAyB,EAAC;YACxB,IAAI,EAAE,mBAAY;YAClB,OAAO,EAAE,GAAG,EAAE,CAAC,iBAAQ;SACxB,CAAC;KACH;IACD,QAAQ,EAAE,EAAE;CACb,CAAC,CAAC"}
@@ -0,0 +1,11 @@
1
+ export declare const getKeywords: import("@taskmagic/pieces-framework").IAction<import("@taskmagic/pieces-framework").SecretTextProperty<true>, {
2
+ query: import("@taskmagic/pieces-framework").ShortTextProperty<true>;
3
+ se: import("@taskmagic/pieces-framework").StaticDropdownProperty<string, true>;
4
+ minusKeywords: import("@taskmagic/pieces-framework").ArrayProperty<false>;
5
+ withIntents: import("@taskmagic/pieces-framework").CheckboxProperty<false>;
6
+ sortField: import("@taskmagic/pieces-framework").StaticDropdownProperty<string, false>;
7
+ sortOrder: import("@taskmagic/pieces-framework").StaticDropdownProperty<string, false>;
8
+ size: import("@taskmagic/pieces-framework").NumberProperty<false>;
9
+ page: import("@taskmagic/pieces-framework").NumberProperty<false>;
10
+ filters: import("@taskmagic/pieces-framework").JsonProperty<false>;
11
+ }>;
@@ -0,0 +1,119 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getKeywords = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const pieces_framework_1 = require("@taskmagic/pieces-framework");
6
+ const pieces_common_1 = require("@taskmagic/pieces-common");
7
+ const crypto_1 = require("crypto");
8
+ const search_engines_1 = require("../../common/search-engines");
9
+ const client_1 = require("../../common/client");
10
+ const auth_1 = require("../../common/auth");
11
+ exports.getKeywords = (0, pieces_framework_1.createAction)({
12
+ name: 'get_keywords',
13
+ auth: auth_1.serpstatAuth,
14
+ displayName: 'Get Keywords',
15
+ description: 'Get keywords data from Serpstat > Keyword Analysis.',
16
+ props: {
17
+ query: pieces_framework_1.Property.ShortText({
18
+ displayName: 'Query',
19
+ description: 'The search query to find keywords for',
20
+ required: true,
21
+ }),
22
+ se: pieces_framework_1.Property.StaticDropdown({
23
+ displayName: 'Search Engine',
24
+ description: 'Search engine to use for keyword analysis',
25
+ required: true,
26
+ defaultValue: 'g_us',
27
+ options: {
28
+ options: search_engines_1.SEARCH_ENGINE_OPTIONS,
29
+ },
30
+ }),
31
+ minusKeywords: pieces_framework_1.Property.Array({
32
+ displayName: 'Minus Keywords',
33
+ description: 'List of keywords to exclude from the search',
34
+ required: false,
35
+ }),
36
+ withIntents: pieces_framework_1.Property.Checkbox({
37
+ displayName: 'With Intents',
38
+ description: 'Include keyword intent (works for g_au and g_us only)',
39
+ required: false,
40
+ }),
41
+ sortField: pieces_framework_1.Property.StaticDropdown({
42
+ displayName: 'Sort Field',
43
+ description: 'Field to sort by (any numeric fields in response data)',
44
+ required: false,
45
+ defaultValue: 'region_queries_count',
46
+ options: {
47
+ options: [
48
+ { label: 'Region Queries Count', value: 'region_queries_count' },
49
+ { label: 'Search Volume', value: 'search_volume' },
50
+ { label: 'CPC', value: 'cpc' },
51
+ { label: 'Competition', value: 'competition' },
52
+ { label: 'Results Count', value: 'results_count' },
53
+ ],
54
+ },
55
+ }),
56
+ sortOrder: pieces_framework_1.Property.StaticDropdown({
57
+ displayName: 'Sort Order',
58
+ description: 'Sort direction',
59
+ required: false,
60
+ defaultValue: 'desc',
61
+ options: {
62
+ options: [
63
+ { label: 'Descending', value: 'desc' },
64
+ { label: 'Ascending', value: 'asc' },
65
+ ],
66
+ },
67
+ }),
68
+ size: pieces_framework_1.Property.Number({
69
+ displayName: 'Size',
70
+ description: 'Number of results to return (max 100)',
71
+ required: false,
72
+ defaultValue: 10,
73
+ }),
74
+ page: pieces_framework_1.Property.Number({
75
+ displayName: 'Page',
76
+ description: 'Page number for pagination',
77
+ required: false,
78
+ defaultValue: 1,
79
+ }),
80
+ filters: pieces_framework_1.Property.Json({
81
+ displayName: 'Filters',
82
+ description: 'See the docs for syntax - https://api-docs.serpstat.com/docs/serpstat-public-api/w7jh5sk9kc0cm-get-keywords',
83
+ required: false,
84
+ }),
85
+ },
86
+ run(_a) {
87
+ return tslib_1.__awaiter(this, arguments, void 0, function* ({ auth, propsValue }) {
88
+ const token = auth;
89
+ const id = (0, crypto_1.randomUUID)();
90
+ const params = {
91
+ keyword: propsValue['query'],
92
+ se: propsValue['se'],
93
+ page: propsValue['page'],
94
+ size: propsValue['size'],
95
+ };
96
+ if (propsValue['minusKeywords'])
97
+ params['minusKeywords'] = propsValue['minusKeywords'];
98
+ if (propsValue['withIntents'] !== undefined)
99
+ params['withIntents'] = propsValue['withIntents'];
100
+ if (propsValue['sortField'] && propsValue['sortOrder']) {
101
+ params['sort'] = { [propsValue['sortField']]: propsValue['sortOrder'] };
102
+ }
103
+ if (propsValue['filters'])
104
+ params['filters'] = propsValue['filters'];
105
+ const body = {
106
+ id,
107
+ method: 'SerpstatKeywordProcedure.getKeywords',
108
+ params,
109
+ };
110
+ return yield (0, client_1.serpstatApiCall)({
111
+ apiToken: token,
112
+ method: pieces_common_1.HttpMethod.POST,
113
+ resourceUri: '/',
114
+ body,
115
+ });
116
+ });
117
+ },
118
+ });
119
+ //# sourceMappingURL=get-keywords.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-keywords.js","sourceRoot":"","sources":["../../../../../../../../../packages/pieces/community/serpstat/src/lib/actions/keyword-analysis/get-keywords.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export declare const getSuggestions: import("@taskmagic/pieces-framework").IAction<import("@taskmagic/pieces-framework").SecretTextProperty<true>, {
2
+ keyword: import("@taskmagic/pieces-framework").ShortTextProperty<true>;
3
+ se: import("@taskmagic/pieces-framework").StaticDropdownProperty<string, true>;
4
+ filters: import("@taskmagic/pieces-framework").JsonProperty<false>;
5
+ page: import("@taskmagic/pieces-framework").NumberProperty<false>;
6
+ size: import("@taskmagic/pieces-framework").NumberProperty<false>;
7
+ }>;
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getSuggestions = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const pieces_framework_1 = require("@taskmagic/pieces-framework");
6
+ const pieces_common_1 = require("@taskmagic/pieces-common");
7
+ const crypto_1 = require("crypto");
8
+ const search_engines_1 = require("../../common/search-engines");
9
+ const client_1 = require("../../common/client");
10
+ const auth_1 = require("../../common/auth");
11
+ exports.getSuggestions = (0, pieces_framework_1.createAction)({
12
+ name: 'get_suggestions',
13
+ displayName: 'Get Suggestions',
14
+ description: 'Get keyword suggestions from Serpstat > Keyword Analysis.',
15
+ auth: auth_1.serpstatAuth,
16
+ props: {
17
+ keyword: pieces_framework_1.Property.ShortText({
18
+ displayName: 'Keyword',
19
+ description: 'The keyword to get suggestions for.',
20
+ required: true,
21
+ }),
22
+ se: pieces_framework_1.Property.StaticDropdown({
23
+ displayName: 'Search Engine',
24
+ description: 'Search engine to use for suggestions.',
25
+ required: true,
26
+ defaultValue: 'g_us',
27
+ options: {
28
+ options: search_engines_1.SEARCH_ENGINE_OPTIONS,
29
+ },
30
+ }),
31
+ filters: pieces_framework_1.Property.Json({
32
+ displayName: 'Filters',
33
+ description: 'See the docs for syntax - https://api-docs.serpstat.com/docs/serpstat-public-api/mmd9zlcqjaoe4-get-suggestions',
34
+ required: false,
35
+ }),
36
+ page: pieces_framework_1.Property.Number({
37
+ displayName: 'Page',
38
+ description: 'Page number in response.',
39
+ required: false,
40
+ defaultValue: 1,
41
+ }),
42
+ size: pieces_framework_1.Property.Number({
43
+ displayName: 'Size',
44
+ description: 'Number of results per page in response.',
45
+ required: false,
46
+ defaultValue: 100,
47
+ }),
48
+ },
49
+ run(_a) {
50
+ return tslib_1.__awaiter(this, arguments, void 0, function* ({ auth, propsValue }) {
51
+ const token = auth;
52
+ const id = (0, crypto_1.randomUUID)();
53
+ const params = {
54
+ keyword: propsValue['keyword'],
55
+ se: propsValue['se'],
56
+ page: propsValue['page'],
57
+ size: propsValue['size'],
58
+ };
59
+ if (propsValue['filters'])
60
+ params['filters'] = propsValue['filters'];
61
+ const body = {
62
+ id,
63
+ method: 'SerpstatKeywordProcedure.getSuggestions',
64
+ params,
65
+ };
66
+ return yield (0, client_1.serpstatApiCall)({
67
+ apiToken: token,
68
+ method: pieces_common_1.HttpMethod.POST,
69
+ resourceUri: '/',
70
+ body,
71
+ });
72
+ });
73
+ },
74
+ });
75
+ //# sourceMappingURL=get-suggestions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-suggestions.js","sourceRoot":"","sources":["../../../../../../../../../packages/pieces/community/serpstat/src/lib/actions/keyword-analysis/get-suggestions.ts"],"names":[],"mappings":";;;;AAAA,kEAAqE;AACrE,4DAAsD;AACtD,mCAAoC;AACpC,gEAAoE;AACpE,gDAAsD;AACtD,4CAAiD;AAEpC,QAAA,cAAc,GAAG,IAAA,+BAAY,EAAC;IACzC,IAAI,EAAE,iBAAiB;IACvB,WAAW,EAAE,iBAAiB;IAC9B,WAAW,EAAE,2DAA2D;IACxE,IAAI,EAAE,mBAAY;IAClB,KAAK,EAAE;QACL,OAAO,EAAE,2BAAQ,CAAC,SAAS,CAAC;YAC1B,WAAW,EAAE,SAAS;YACtB,WAAW,EAAE,qCAAqC;YAClD,QAAQ,EAAE,IAAI;SACf,CAAC;QACF,EAAE,EAAE,2BAAQ,CAAC,cAAc,CAAC;YAC1B,WAAW,EAAE,eAAe;YAC5B,WAAW,EAAE,uCAAuC;YACpD,QAAQ,EAAE,IAAI;YACd,YAAY,EAAE,MAAM;YACpB,OAAO,EAAE;gBACP,OAAO,EAAE,sCAAqB;aAC/B;SACF,CAAC;QACF,OAAO,EAAE,2BAAQ,CAAC,IAAI,CAAC;YACrB,WAAW,EAAE,SAAS;YACtB,WAAW,EAAE,gHAAgH;YAC7H,QAAQ,EAAE,KAAK;SAChB,CAAC;QACF,IAAI,EAAE,2BAAQ,CAAC,MAAM,CAAC;YACpB,WAAW,EAAE,MAAM;YACnB,WAAW,EAAE,0BAA0B;YACvC,QAAQ,EAAE,KAAK;YACf,YAAY,EAAE,CAAC;SAChB,CAAC;QACF,IAAI,EAAE,2BAAQ,CAAC,MAAM,CAAC;YACpB,WAAW,EAAE,MAAM;YACnB,WAAW,EAAE,yCAAyC;YACtD,QAAQ,EAAE,KAAK;YACf,YAAY,EAAE,GAAG;SAClB,CAAC;KACH;IACK,GAAG;qEAAC,EAAE,IAAI,EAAE,UAAU,EAAE;YAC5B,MAAM,KAAK,GAAG,IAAc,CAAC;YAC7B,MAAM,EAAE,GAAG,IAAA,mBAAU,GAAE,CAAC;YAExB,MAAM,MAAM,GAAwB;gBAClC,OAAO,EAAE,UAAU,CAAC,SAAS,CAAC;gBAC9B,EAAE,EAAE,UAAU,CAAC,IAAI,CAAC;gBACpB,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC;gBACxB,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC;aACzB,CAAC;YACF,IAAI,UAAU,CAAC,SAAS,CAAC;gBAAE,MAAM,CAAC,SAAS,CAAC,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;YAErE,MAAM,IAAI,GAAG;gBACX,EAAE;gBACF,MAAM,EAAE,yCAAyC;gBACjD,MAAM;aACP,CAAC;YAEF,OAAO,MAAM,IAAA,wBAAe,EAAC;gBAC3B,QAAQ,EAAE,KAAK;gBACf,MAAM,EAAE,0BAAU,CAAC,IAAI;gBACvB,WAAW,EAAE,GAAG;gBAChB,IAAI;aACL,CAAC,CAAC;QACL,CAAC;KAAA;CACF,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ export declare const serpstatAuth: import("@taskmagic/pieces-framework").SecretTextProperty<true>;
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.serpstatAuth = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const pieces_framework_1 = require("@taskmagic/pieces-framework");
6
+ const pieces_common_1 = require("@taskmagic/pieces-common");
7
+ exports.serpstatAuth = pieces_framework_1.PieceAuth.SecretText({
8
+ displayName: 'API Token',
9
+ description: `You can obtain your API token from your Serpstat account. Go to your Serpstat dashboard and navigate to API settings to get your token.`,
10
+ required: true,
11
+ validate: (_a) => tslib_1.__awaiter(void 0, [_a], void 0, function* ({ auth }) {
12
+ var _b;
13
+ try {
14
+ yield pieces_common_1.httpClient.sendRequest({
15
+ method: pieces_common_1.HttpMethod.GET,
16
+ url: 'https://api.serpstat.com/v4/',
17
+ queryParams: {
18
+ token: auth,
19
+ },
20
+ });
21
+ return { valid: true };
22
+ }
23
+ catch (error) {
24
+ if (((_b = error.response) === null || _b === void 0 ? void 0 : _b.status) === 401) {
25
+ return {
26
+ valid: false,
27
+ error: 'Invalid API token. Please check your token and try again.',
28
+ };
29
+ }
30
+ return {
31
+ valid: false,
32
+ error: 'Authentication failed. Please check your API token.',
33
+ };
34
+ }
35
+ }),
36
+ });
37
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../../../../../../packages/pieces/community/serpstat/src/lib/common/auth.ts"],"names":[],"mappings":";;;;AAAA,kEAAwD;AACxD,4DAAkE;AAErD,QAAA,YAAY,GAAG,4BAAS,CAAC,UAAU,CAAC;IAC/C,WAAW,EAAE,WAAW;IACxB,WAAW,EAAE,yIAAyI;IACtJ,QAAQ,EAAE,IAAI;IACd,QAAQ,EAAE,KAAiB,EAAE,oDAAZ,EAAE,IAAI,EAAE;;QACvB,IAAI,CAAC;YACH,MAAM,0BAAU,CAAC,WAAW,CAAC;gBAC3B,MAAM,EAAE,0BAAU,CAAC,GAAG;gBACtB,GAAG,EAAE,8BAA8B;gBACnC,WAAW,EAAE;oBACX,KAAK,EAAE,IAAc;iBACtB;aACF,CAAC,CAAC;YACH,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QACzB,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,IAAI,CAAA,MAAA,KAAK,CAAC,QAAQ,0CAAE,MAAM,MAAK,GAAG,EAAE,CAAC;gBACnC,OAAO;oBACL,KAAK,EAAE,KAAK;oBACZ,KAAK,EAAE,2DAA2D;iBACnE,CAAC;YACJ,CAAC;YACD,OAAO;gBACL,KAAK,EAAE,KAAK;gBACZ,KAAK,EAAE,qDAAqD;aAC7D,CAAC;QACJ,CAAC;IACH,CAAC,CAAA;CACF,CAAC,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { HttpMethod } from '@taskmagic/pieces-common';
2
+ export declare const BASE_URL = "https://api.serpstat.com/v4";
3
+ export interface SerpstatApiCallProps {
4
+ apiToken: string;
5
+ method: HttpMethod;
6
+ resourceUri: string;
7
+ queryParams?: Record<string, any>;
8
+ body?: any;
9
+ }
10
+ export declare const serpstatApiCall: ({ apiToken, method, resourceUri, queryParams, body, }: SerpstatApiCallProps) => Promise<any>;
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.serpstatApiCall = exports.BASE_URL = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const pieces_common_1 = require("@taskmagic/pieces-common");
6
+ exports.BASE_URL = 'https://api.serpstat.com/v4';
7
+ const serpstatApiCall = (_a) => tslib_1.__awaiter(void 0, [_a], void 0, function* ({ apiToken, method, resourceUri, queryParams, body, }) {
8
+ const request = {
9
+ method,
10
+ url: `${exports.BASE_URL}${resourceUri}`,
11
+ headers: {
12
+ 'Content-Type': 'application/json',
13
+ },
14
+ queryParams: Object.assign({ token: apiToken }, queryParams),
15
+ body,
16
+ };
17
+ const response = yield pieces_common_1.httpClient.sendRequest(request);
18
+ return response.body;
19
+ });
20
+ exports.serpstatApiCall = serpstatApiCall;
21
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../../../../../../packages/pieces/community/serpstat/src/lib/common/client.ts"],"names":[],"mappings":";;;;AAAA,4DAA+E;AAElE,QAAA,QAAQ,GAAG,6BAA6B,CAAC;AAU/C,MAAM,eAAe,GAAG,KAMN,EAAE,oDANW,EACpC,QAAQ,EACR,MAAM,EACN,WAAW,EACX,WAAW,EACX,IAAI,GACiB;IACrB,MAAM,OAAO,GAAgB;QAC3B,MAAM;QACN,GAAG,EAAE,GAAG,gBAAQ,GAAG,WAAW,EAAE;QAChC,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;SACnC;QACD,WAAW,kBACT,KAAK,EAAE,QAAQ,IACZ,WAAW,CACf;QACD,IAAI;KACL,CAAC;IAEF,MAAM,QAAQ,GAAG,MAAM,0BAAU,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IACvD,OAAO,QAAQ,CAAC,IAAI,CAAC;AACvB,CAAC,CAAA,CAAC;AAtBW,QAAA,eAAe,mBAsB1B"}
@@ -0,0 +1,4 @@
1
+ export declare const SEARCH_ENGINE_OPTIONS: {
2
+ label: string;
3
+ value: string;
4
+ }[];
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SEARCH_ENGINE_OPTIONS = void 0;
4
+ exports.SEARCH_ENGINE_OPTIONS = [
5
+ { label: 'United States', value: 'g_us' },
6
+ { label: 'Singapore', value: 'g_sg' },
7
+ { label: 'Indonesia', value: 'g_id' },
8
+ { label: 'Malaysia', value: 'g_my' },
9
+ { label: 'Vietnam', value: 'g_vn' },
10
+ { label: 'Thailand', value: 'g_th' },
11
+ ];
12
+ //# sourceMappingURL=search-engines.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-engines.js","sourceRoot":"","sources":["../../../../../../../../packages/pieces/community/serpstat/src/lib/common/search-engines.ts"],"names":[],"mappings":";;;AAAa,QAAA,qBAAqB,GAAG;IACnC,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,EAAE;IACzC,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE;IACrC,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE;IACrC,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE;IACpC,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE;IACnC,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE;CACrC,CAAC"}