@koda-sl/baker-cli 0.11.0 → 0.13.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/README.md +22 -13
- package/dist/cli.js +1 -1
- package/dist/commands/ads/google/changes.js +1 -1
- package/dist/commands/ads/google/changes.js.map +1 -1
- package/dist/commands/ads/google/currency.js +1 -1
- package/dist/commands/ads/google/currency.js.map +1 -1
- package/dist/commands/ads/google/keywords/discover.d.ts.map +1 -1
- package/dist/commands/ads/google/keywords/discover.js +18 -6
- package/dist/commands/ads/google/keywords/discover.js.map +1 -1
- package/dist/commands/ads/google/keywords/index.d.ts.map +1 -1
- package/dist/commands/ads/google/keywords/index.js +8 -2
- package/dist/commands/ads/google/keywords/index.js.map +1 -1
- package/dist/commands/ads/google/keywords/languages.d.ts +2 -0
- package/dist/commands/ads/google/keywords/languages.d.ts.map +1 -0
- package/dist/commands/ads/google/keywords/languages.js +23 -0
- package/dist/commands/ads/google/keywords/languages.js.map +1 -0
- package/dist/commands/ads/google/keywords/locations.d.ts +2 -0
- package/dist/commands/ads/google/keywords/locations.d.ts.map +1 -0
- package/dist/commands/ads/google/keywords/locations.js +23 -0
- package/dist/commands/ads/google/keywords/locations.js.map +1 -0
- package/dist/commands/ads/google/keywords/metrics.d.ts.map +1 -1
- package/dist/commands/ads/google/keywords/metrics.js +18 -6
- package/dist/commands/ads/google/keywords/metrics.js.map +1 -1
- package/dist/commands/ads/google/query.js +3 -3
- package/dist/commands/ads/google/query.js.map +1 -1
- package/dist/commands/ads/output.d.ts +5 -1
- package/dist/commands/ads/output.d.ts.map +1 -1
- package/dist/commands/ads/output.js +53 -4
- package/dist/commands/ads/output.js.map +1 -1
- package/dist/commands/research/advertisers.d.ts.map +1 -1
- package/dist/commands/research/advertisers.js +7 -4
- package/dist/commands/research/advertisers.js.map +1 -1
- package/dist/commands/research/intent.d.ts.map +1 -1
- package/dist/commands/research/intent.js +10 -3
- package/dist/commands/research/intent.js.map +1 -1
- package/dist/commands/research/keyword-gap.d.ts.map +1 -1
- package/dist/commands/research/keyword-gap.js +11 -3
- package/dist/commands/research/keyword-gap.js.map +1 -1
- package/dist/commands/research/keywords-for-site.d.ts.map +1 -1
- package/dist/commands/research/keywords-for-site.js +11 -4
- package/dist/commands/research/keywords-for-site.js.map +1 -1
- package/dist/geo-context.d.ts +21 -0
- package/dist/geo-context.d.ts.map +1 -0
- package/dist/geo-context.js +208 -0
- package/dist/geo-context.js.map +1 -0
- package/package.json +1 -1
|
@@ -1,4 +1,6 @@
|
|
|
1
|
+
import { apiGet } from "../../client.js";
|
|
1
2
|
import { getEnv } from "../../env.js";
|
|
3
|
+
import { cacheGet, cacheSet } from "./cache.js";
|
|
2
4
|
export function writeAdsJson(envelope) {
|
|
3
5
|
process.stdout.write(`${JSON.stringify(envelope, null, 2)}\n`);
|
|
4
6
|
}
|
|
@@ -60,19 +62,66 @@ export function writeAdsOutput(data, format, fields) {
|
|
|
60
62
|
writeAdsJson({ ok: true, data });
|
|
61
63
|
}
|
|
62
64
|
}
|
|
63
|
-
|
|
65
|
+
async function fetchAccounts() {
|
|
66
|
+
const cached = cacheGet("accounts", "list");
|
|
67
|
+
if (cached)
|
|
68
|
+
return cached.data;
|
|
69
|
+
const data = await apiGet("/api/ads/google/accounts");
|
|
70
|
+
cacheSet("accounts", "list", data, 60 * 60 * 1000);
|
|
71
|
+
return data;
|
|
72
|
+
}
|
|
73
|
+
export async function resolveCustomerId(args) {
|
|
64
74
|
const fromArgs = args["customer-id"];
|
|
65
75
|
const customerId = fromArgs || getEnv().BAKER_GOOGLE_ADS_CUSTOMER_ID;
|
|
66
|
-
if (
|
|
76
|
+
if (customerId) {
|
|
77
|
+
if (!/^\d{10}$/.test(customerId)) {
|
|
78
|
+
writeAdsJson({
|
|
79
|
+
ok: false,
|
|
80
|
+
error: {
|
|
81
|
+
code: "INVALID_CUSTOMER_ID",
|
|
82
|
+
message: "Customer ID must be exactly 10 digits without dashes. Pass --customer-id or set BAKER_GOOGLE_ADS_CUSTOMER_ID.",
|
|
83
|
+
},
|
|
84
|
+
});
|
|
85
|
+
process.exit(1);
|
|
86
|
+
}
|
|
87
|
+
return customerId;
|
|
88
|
+
}
|
|
89
|
+
try {
|
|
90
|
+
const accounts = await fetchAccounts();
|
|
91
|
+
const [single] = accounts;
|
|
92
|
+
if (accounts.length === 1 && single) {
|
|
93
|
+
process.stderr.write(`Using account "${single.name}" (${single.id})\n`);
|
|
94
|
+
return single.id;
|
|
95
|
+
}
|
|
96
|
+
if (accounts.length === 0) {
|
|
97
|
+
writeAdsJson({
|
|
98
|
+
ok: false,
|
|
99
|
+
error: {
|
|
100
|
+
code: "NO_ACCOUNTS",
|
|
101
|
+
message: "No Google Ads accounts found. Connect Google Ads in dashboard settings first.",
|
|
102
|
+
},
|
|
103
|
+
});
|
|
104
|
+
process.exit(1);
|
|
105
|
+
}
|
|
106
|
+
const list = accounts.map((a) => ` ${a.id} ${a.name}`).join("\n");
|
|
107
|
+
writeAdsJson({
|
|
108
|
+
ok: false,
|
|
109
|
+
error: {
|
|
110
|
+
code: "MULTIPLE_ACCOUNTS",
|
|
111
|
+
message: `Multiple accounts found. Pass --customer-id or set BAKER_GOOGLE_ADS_CUSTOMER_ID:\n${list}`,
|
|
112
|
+
},
|
|
113
|
+
});
|
|
114
|
+
process.exit(1);
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
67
117
|
writeAdsJson({
|
|
68
118
|
ok: false,
|
|
69
119
|
error: {
|
|
70
120
|
code: "INVALID_CUSTOMER_ID",
|
|
71
|
-
message: "
|
|
121
|
+
message: "Could not auto-detect account. Pass --customer-id or set BAKER_GOOGLE_ADS_CUSTOMER_ID.",
|
|
72
122
|
},
|
|
73
123
|
});
|
|
74
124
|
process.exit(1);
|
|
75
125
|
}
|
|
76
|
-
return customerId;
|
|
77
126
|
}
|
|
78
127
|
//# sourceMappingURL=output.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../../src/commands/ads/output.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../../src/commands/ads/output.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"advertisers.d.ts","sourceRoot":"","sources":["../../../src/commands/research/advertisers.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"advertisers.d.ts","sourceRoot":"","sources":["../../../src/commands/research/advertisers.ts"],"names":[],"mappings":"AA6CA,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA8C7B,CAAC"}
|
|
@@ -1,20 +1,21 @@
|
|
|
1
1
|
import { defineCommand } from "citty";
|
|
2
2
|
import { apiPost } from "../../client.js";
|
|
3
|
+
import { buildResearchQueryContext, warnDefaults } from "../../geo-context.js";
|
|
3
4
|
import { registerSchema } from "../../schemas.js";
|
|
4
5
|
import { handleResearchError, RESEARCH_DATA_NOTE, writeResearchJson, writeResearchOutput } from "./output.js";
|
|
5
6
|
registerSchema({
|
|
6
7
|
command: "research.advertisers",
|
|
7
|
-
description: "Find domains competing for a keyword in Google SERPs. Shows who's competing for the same search term with their visibility and estimated traffic.",
|
|
8
|
+
description: "Find domains competing for a keyword in Google SERPs. Shows who's competing for the same search term with their visibility and estimated traffic. IMPORTANT: If --location and --language are omitted, defaults to United States (us) and English (en). The response includes a query_context object showing which location/language were used.",
|
|
8
9
|
args: {
|
|
9
10
|
keyword: { type: "string", description: "Keyword to search (positional)", required: true },
|
|
10
11
|
location: {
|
|
11
12
|
type: "string",
|
|
12
|
-
description: "Country code (us, uk, es, de...) or DataForSEO location code.
|
|
13
|
+
description: "Country code (us, uk, es, de...) or DataForSEO location code. DEFAULTS TO us (United States) if omitted — always set this for non-US markets",
|
|
13
14
|
required: false,
|
|
14
15
|
},
|
|
15
16
|
language: {
|
|
16
17
|
type: "string",
|
|
17
|
-
description: "Language code or name (en, es, spanish...).
|
|
18
|
+
description: "Language code or name (en, es, spanish...). DEFAULTS TO en (English) if omitted — always set this for non-English markets",
|
|
18
19
|
required: false,
|
|
19
20
|
},
|
|
20
21
|
limit: { type: "string", description: "Max results (default: 20, max: 100)", required: false },
|
|
@@ -52,6 +53,7 @@ Examples:
|
|
|
52
53
|
const language = args.language || undefined;
|
|
53
54
|
const limit = args.limit ? Number(args.limit) : undefined;
|
|
54
55
|
const skipCache = args["no-cache"] ? true : undefined;
|
|
56
|
+
const queryContext = buildResearchQueryContext(location, language);
|
|
55
57
|
try {
|
|
56
58
|
const data = await apiPost("/api/research/advertisers", {
|
|
57
59
|
keyword,
|
|
@@ -60,12 +62,13 @@ Examples:
|
|
|
60
62
|
limit,
|
|
61
63
|
skipCache,
|
|
62
64
|
});
|
|
65
|
+
warnDefaults(queryContext);
|
|
63
66
|
const format = args.output || "json";
|
|
64
67
|
if (format !== "json") {
|
|
65
68
|
writeResearchOutput(data, format);
|
|
66
69
|
return;
|
|
67
70
|
}
|
|
68
|
-
writeResearchJson({ ok: true, data, fields: FIELDS, note: RESEARCH_DATA_NOTE });
|
|
71
|
+
writeResearchJson({ ok: true, data, fields: FIELDS, note: RESEARCH_DATA_NOTE, query_context: queryContext });
|
|
69
72
|
}
|
|
70
73
|
catch (err) {
|
|
71
74
|
handleResearchError(err);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"advertisers.js","sourceRoot":"","sources":["../../../src/commands/research/advertisers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAE9G,cAAc,CAAC;IACb,OAAO,EAAE,sBAAsB;IAC/B,WAAW,EACT,
|
|
1
|
+
{"version":3,"file":"advertisers.js","sourceRoot":"","sources":["../../../src/commands/research/advertisers.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"intent.d.ts","sourceRoot":"","sources":["../../../src/commands/research/intent.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"intent.d.ts","sourceRoot":"","sources":["../../../src/commands/research/intent.ts"],"names":[],"mappings":"AAsCA,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;EAoDxB,CAAC"}
|
|
@@ -1,17 +1,22 @@
|
|
|
1
1
|
import { defineCommand } from "citty";
|
|
2
2
|
import { apiPost } from "../../client.js";
|
|
3
|
+
import { buildResearchQueryContext, warnDefaults } from "../../geo-context.js";
|
|
3
4
|
import { registerSchema } from "../../schemas.js";
|
|
4
5
|
import { handleResearchError, writeResearchJson, writeResearchOutput } from "./output.js";
|
|
5
6
|
registerSchema({
|
|
6
7
|
command: "research.intent",
|
|
7
|
-
description: "Classify Google Search intent for keywords. Determines if someone searching is looking to buy, research, or navigate.",
|
|
8
|
+
description: "Classify Google Search intent for keywords. Determines if someone searching is looking to buy, research, or navigate. IMPORTANT: If --language is omitted, defaults to English (en). The response includes a query_context object showing which language was used.",
|
|
8
9
|
args: {
|
|
9
10
|
keywords: {
|
|
10
11
|
type: "string",
|
|
11
12
|
description: "Comma-separated keywords (min 3 chars each, max 1000 keywords)",
|
|
12
13
|
required: true,
|
|
13
14
|
},
|
|
14
|
-
language: {
|
|
15
|
+
language: {
|
|
16
|
+
type: "string",
|
|
17
|
+
description: "Language code or name. DEFAULTS TO en (English) if omitted — always set this for non-English keywords",
|
|
18
|
+
required: false,
|
|
19
|
+
},
|
|
15
20
|
"no-cache": { type: "boolean", description: "Skip server cache, hit API directly", required: false },
|
|
16
21
|
},
|
|
17
22
|
});
|
|
@@ -50,18 +55,20 @@ Examples:
|
|
|
50
55
|
}
|
|
51
56
|
const language = args.language || undefined;
|
|
52
57
|
const skipCache = args["no-cache"] ? true : undefined;
|
|
58
|
+
const queryContext = buildResearchQueryContext(undefined, language, { skipLocation: true });
|
|
53
59
|
try {
|
|
54
60
|
const data = await apiPost("/api/research/intent", {
|
|
55
61
|
keywords,
|
|
56
62
|
language,
|
|
57
63
|
skipCache,
|
|
58
64
|
});
|
|
65
|
+
warnDefaults(queryContext);
|
|
59
66
|
const format = args.output || "json";
|
|
60
67
|
if (format !== "json") {
|
|
61
68
|
writeResearchOutput(data, format);
|
|
62
69
|
return;
|
|
63
70
|
}
|
|
64
|
-
writeResearchJson({ ok: true, data, fields: FIELDS });
|
|
71
|
+
writeResearchJson({ ok: true, data, fields: FIELDS, query_context: queryContext });
|
|
65
72
|
}
|
|
66
73
|
catch (err) {
|
|
67
74
|
handleResearchError(err);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"intent.js","sourceRoot":"","sources":["../../../src/commands/research/intent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAE1F,cAAc,CAAC;IACb,OAAO,EAAE,iBAAiB;IAC1B,WAAW,EACT,
|
|
1
|
+
{"version":3,"file":"intent.js","sourceRoot":"","sources":["../../../src/commands/research/intent.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keyword-gap.d.ts","sourceRoot":"","sources":["../../../src/commands/research/keyword-gap.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"keyword-gap.d.ts","sourceRoot":"","sources":["../../../src/commands/research/keyword-gap.ts"],"names":[],"mappings":"AA8CA,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA0E5B,CAAC"}
|
|
@@ -1,19 +1,24 @@
|
|
|
1
1
|
import { defineCommand } from "citty";
|
|
2
2
|
import { apiPost } from "../../client.js";
|
|
3
|
+
import { buildResearchQueryContext, warnDefaults } from "../../geo-context.js";
|
|
3
4
|
import { registerSchema } from "../../schemas.js";
|
|
4
5
|
import { handleResearchError, RESEARCH_DATA_NOTE, writeResearchJson, writeResearchOutput } from "./output.js";
|
|
5
6
|
registerSchema({
|
|
6
7
|
command: "research.keyword-gap",
|
|
7
|
-
description: "Find keywords a competitor ranks for (organic or paid) that you don't. Discovers expansion opportunities.",
|
|
8
|
+
description: "Find keywords a competitor ranks for (organic or paid) that you don't. Discovers expansion opportunities. IMPORTANT: If --location and --language are omitted, defaults to United States (us) and English (en). The response includes a query_context object showing which location/language were used.",
|
|
8
9
|
args: {
|
|
9
10
|
competitor: { type: "string", description: "Competitor domain (positional 1)", required: true },
|
|
10
11
|
ours: { type: "string", description: "Your domain (positional 2)", required: true },
|
|
11
12
|
location: {
|
|
12
13
|
type: "string",
|
|
13
|
-
description: "Country code (us, uk, es, de...) or DataForSEO location code.
|
|
14
|
+
description: "Country code (us, uk, es, de...) or DataForSEO location code. DEFAULTS TO us (United States) if omitted — always set this for non-US markets",
|
|
15
|
+
required: false,
|
|
16
|
+
},
|
|
17
|
+
language: {
|
|
18
|
+
type: "string",
|
|
19
|
+
description: "Language code or name. DEFAULTS TO en (English) if omitted — always set this for non-English markets",
|
|
14
20
|
required: false,
|
|
15
21
|
},
|
|
16
|
-
language: { type: "string", description: "Language code or name (default: en)", required: false },
|
|
17
22
|
type: { type: "string", description: "Filter: paid, organic, all (default: all)", required: false },
|
|
18
23
|
limit: { type: "string", description: "Max results per page (default: 50, max: 1000)", required: false },
|
|
19
24
|
offset: { type: "string", description: "Pagination offset (default: 0)", required: false },
|
|
@@ -56,6 +61,7 @@ Examples:
|
|
|
56
61
|
const limit = args.limit ? Number(args.limit) : undefined;
|
|
57
62
|
const offset = args.offset ? Number(args.offset) : undefined;
|
|
58
63
|
const skipCache = args["no-cache"] ? true : undefined;
|
|
64
|
+
const queryContext = buildResearchQueryContext(location, language);
|
|
59
65
|
try {
|
|
60
66
|
const result = await apiPost("/api/research/keyword-gap", {
|
|
61
67
|
competitor,
|
|
@@ -70,6 +76,7 @@ Examples:
|
|
|
70
76
|
const currentOffset = offset ?? 0;
|
|
71
77
|
const currentLimit = limit ?? 50;
|
|
72
78
|
const hasMore = currentOffset + result.data.length < result.total_count;
|
|
79
|
+
warnDefaults(queryContext);
|
|
73
80
|
const format = args.output || "json";
|
|
74
81
|
if (format !== "json") {
|
|
75
82
|
writeResearchOutput(result.data, format);
|
|
@@ -83,6 +90,7 @@ Examples:
|
|
|
83
90
|
fields: FIELDS,
|
|
84
91
|
note: RESEARCH_DATA_NOTE,
|
|
85
92
|
total_count: result.total_count,
|
|
93
|
+
query_context: queryContext,
|
|
86
94
|
pagination: {
|
|
87
95
|
offset: currentOffset,
|
|
88
96
|
limit: currentLimit,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keyword-gap.js","sourceRoot":"","sources":["../../../src/commands/research/keyword-gap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAE9G,cAAc,CAAC;IACb,OAAO,EAAE,sBAAsB;IAC/B,WAAW,EACT,
|
|
1
|
+
{"version":3,"file":"keyword-gap.js","sourceRoot":"","sources":["../../../src/commands/research/keyword-gap.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keywords-for-site.d.ts","sourceRoot":"","sources":["../../../src/commands/research/keywords-for-site.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"keywords-for-site.d.ts","sourceRoot":"","sources":["../../../src/commands/research/keywords-for-site.ts"],"names":[],"mappings":"AAmDA,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoDjC,CAAC"}
|
|
@@ -1,18 +1,23 @@
|
|
|
1
1
|
import { defineCommand } from "citty";
|
|
2
2
|
import { apiPost } from "../../client.js";
|
|
3
|
+
import { buildResearchQueryContext, warnDefaults } from "../../geo-context.js";
|
|
3
4
|
import { registerSchema } from "../../schemas.js";
|
|
4
5
|
import { handleResearchError, RESEARCH_DATA_NOTE, writeResearchJson, writeResearchOutput } from "./output.js";
|
|
5
6
|
registerSchema({
|
|
6
7
|
command: "research.keywords-for-site",
|
|
7
|
-
description: "Get keywords a competitor targets in Google. Use --type paid to see only paid keywords, --type organic for organic only.",
|
|
8
|
+
description: "Get keywords a competitor targets in Google. Use --type paid to see only paid keywords, --type organic for organic only. IMPORTANT: If --location and --language are omitted, defaults to United States (us) and English (en). The response includes a query_context object showing which location/language were used.",
|
|
8
9
|
args: {
|
|
9
10
|
target: { type: "string", description: "Domain or URL to analyze (positional)", required: true },
|
|
10
11
|
location: {
|
|
11
12
|
type: "string",
|
|
12
|
-
description: "Country code (us, uk, es, de...) or DataForSEO location code.
|
|
13
|
+
description: "Country code (us, uk, es, de...) or DataForSEO location code. DEFAULTS TO us (United States) if omitted — always set this for non-US markets",
|
|
14
|
+
required: false,
|
|
15
|
+
},
|
|
16
|
+
language: {
|
|
17
|
+
type: "string",
|
|
18
|
+
description: "Language code or name. DEFAULTS TO en (English) if omitted — always set this for non-English markets",
|
|
13
19
|
required: false,
|
|
14
20
|
},
|
|
15
|
-
language: { type: "string", description: "Language code or name (default: en)", required: false },
|
|
16
21
|
sort: {
|
|
17
22
|
type: "string",
|
|
18
23
|
description: "Sort: relevance, search_volume, competition, cpc (default: search_volume)",
|
|
@@ -58,6 +63,7 @@ Examples:
|
|
|
58
63
|
const type = args.type || undefined;
|
|
59
64
|
const limit = args.limit ? Number(args.limit) : undefined;
|
|
60
65
|
const skipCache = args["no-cache"] ? true : undefined;
|
|
66
|
+
const queryContext = buildResearchQueryContext(location, language);
|
|
61
67
|
try {
|
|
62
68
|
const data = await apiPost("/api/research/keywords-for-site", {
|
|
63
69
|
target,
|
|
@@ -68,12 +74,13 @@ Examples:
|
|
|
68
74
|
limit,
|
|
69
75
|
skipCache,
|
|
70
76
|
});
|
|
77
|
+
warnDefaults(queryContext);
|
|
71
78
|
const format = args.output || "json";
|
|
72
79
|
if (format !== "json") {
|
|
73
80
|
writeResearchOutput(data, format);
|
|
74
81
|
return;
|
|
75
82
|
}
|
|
76
|
-
writeResearchJson({ ok: true, data, fields: FIELDS, note: RESEARCH_DATA_NOTE });
|
|
83
|
+
writeResearchJson({ ok: true, data, fields: FIELDS, note: RESEARCH_DATA_NOTE, query_context: queryContext });
|
|
77
84
|
}
|
|
78
85
|
catch (err) {
|
|
79
86
|
handleResearchError(err);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keywords-for-site.js","sourceRoot":"","sources":["../../../src/commands/research/keywords-for-site.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAE9G,cAAc,CAAC;IACb,OAAO,EAAE,4BAA4B;IACrC,WAAW,EACT,
|
|
1
|
+
{"version":3,"file":"keywords-for-site.js","sourceRoot":"","sources":["../../../src/commands/research/keywords-for-site.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export declare const GOOGLE_ADS_LOCATIONS: Array<{
|
|
2
|
+
id: string;
|
|
3
|
+
name: string;
|
|
4
|
+
}>;
|
|
5
|
+
export declare const GOOGLE_ADS_LANGUAGES: Array<{
|
|
6
|
+
id: string;
|
|
7
|
+
name: string;
|
|
8
|
+
}>;
|
|
9
|
+
export interface QueryContext {
|
|
10
|
+
location: string;
|
|
11
|
+
language: string;
|
|
12
|
+
location_is_default: boolean;
|
|
13
|
+
language_is_default: boolean;
|
|
14
|
+
defaults_warning?: string;
|
|
15
|
+
}
|
|
16
|
+
export declare function buildAdsQueryContext(locationArg: string | undefined, languageArg: string | undefined): QueryContext;
|
|
17
|
+
export declare function buildResearchQueryContext(locationArg: string | undefined, languageArg: string | undefined, options?: {
|
|
18
|
+
skipLocation?: boolean;
|
|
19
|
+
}): QueryContext;
|
|
20
|
+
export declare function warnDefaults(ctx: QueryContext): void;
|
|
21
|
+
//# sourceMappingURL=geo-context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"geo-context.d.ts","sourceRoot":"","sources":["../src/geo-context.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,oBAAoB,EAAE,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CA8CpE,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAmBpE,CAAC;AAsFF,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,mBAAmB,EAAE,OAAO,CAAC;IAC7B,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,EAAE,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,YAAY,CA2BnH;AAED,wBAAgB,yBAAyB,CACvC,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,OAAO,CAAC,EAAE;IAAE,YAAY,CAAC,EAAE,OAAO,CAAA;CAAE,GACnC,YAAY,CA8Bd;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,YAAY,GAAG,IAAI,CAIpD"}
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
export const GOOGLE_ADS_LOCATIONS = [
|
|
2
|
+
{ id: "2840", name: "United States" },
|
|
3
|
+
{ id: "2826", name: "United Kingdom" },
|
|
4
|
+
{ id: "2124", name: "Canada" },
|
|
5
|
+
{ id: "2036", name: "Australia" },
|
|
6
|
+
{ id: "2276", name: "Germany" },
|
|
7
|
+
{ id: "2250", name: "France" },
|
|
8
|
+
{ id: "2724", name: "Spain" },
|
|
9
|
+
{ id: "2380", name: "Italy" },
|
|
10
|
+
{ id: "2076", name: "Brazil" },
|
|
11
|
+
{ id: "2484", name: "Mexico" },
|
|
12
|
+
{ id: "2528", name: "Netherlands" },
|
|
13
|
+
{ id: "2056", name: "Belgium" },
|
|
14
|
+
{ id: "2040", name: "Austria" },
|
|
15
|
+
{ id: "2756", name: "Switzerland" },
|
|
16
|
+
{ id: "2620", name: "Portugal" },
|
|
17
|
+
{ id: "2752", name: "Sweden" },
|
|
18
|
+
{ id: "2578", name: "Norway" },
|
|
19
|
+
{ id: "2208", name: "Denmark" },
|
|
20
|
+
{ id: "2246", name: "Finland" },
|
|
21
|
+
{ id: "2372", name: "Ireland" },
|
|
22
|
+
{ id: "2554", name: "New Zealand" },
|
|
23
|
+
{ id: "2356", name: "India" },
|
|
24
|
+
{ id: "2392", name: "Japan" },
|
|
25
|
+
{ id: "2410", name: "South Korea" },
|
|
26
|
+
{ id: "2702", name: "Singapore" },
|
|
27
|
+
{ id: "2032", name: "Argentina" },
|
|
28
|
+
{ id: "2152", name: "Chile" },
|
|
29
|
+
{ id: "2170", name: "Colombia" },
|
|
30
|
+
{ id: "2604", name: "Peru" },
|
|
31
|
+
{ id: "2616", name: "Poland" },
|
|
32
|
+
{ id: "2203", name: "Czech Republic" },
|
|
33
|
+
{ id: "2642", name: "Romania" },
|
|
34
|
+
{ id: "2348", name: "Hungary" },
|
|
35
|
+
{ id: "2710", name: "South Africa" },
|
|
36
|
+
{ id: "2376", name: "Israel" },
|
|
37
|
+
{ id: "2784", name: "United Arab Emirates" },
|
|
38
|
+
{ id: "2682", name: "Saudi Arabia" },
|
|
39
|
+
{ id: "2792", name: "Turkey" },
|
|
40
|
+
{ id: "2608", name: "Philippines" },
|
|
41
|
+
{ id: "2764", name: "Thailand" },
|
|
42
|
+
{ id: "2458", name: "Malaysia" },
|
|
43
|
+
{ id: "2360", name: "Indonesia" },
|
|
44
|
+
{ id: "2704", name: "Vietnam" },
|
|
45
|
+
{ id: "2158", name: "Taiwan" },
|
|
46
|
+
{ id: "2344", name: "Hong Kong" },
|
|
47
|
+
];
|
|
48
|
+
export const GOOGLE_ADS_LANGUAGES = [
|
|
49
|
+
{ id: "1000", name: "English" },
|
|
50
|
+
{ id: "1003", name: "Spanish" },
|
|
51
|
+
{ id: "1001", name: "German" },
|
|
52
|
+
{ id: "1002", name: "French" },
|
|
53
|
+
{ id: "1004", name: "Italian" },
|
|
54
|
+
{ id: "1014", name: "Portuguese" },
|
|
55
|
+
{ id: "1010", name: "Japanese" },
|
|
56
|
+
{ id: "1012", name: "Korean" },
|
|
57
|
+
{ id: "1017", name: "Chinese (Simplified)" },
|
|
58
|
+
{ id: "1019", name: "Arabic" },
|
|
59
|
+
{ id: "1031", name: "Russian" },
|
|
60
|
+
{ id: "1030", name: "Polish" },
|
|
61
|
+
{ id: "1037", name: "Turkish" },
|
|
62
|
+
{ id: "1015", name: "Swedish" },
|
|
63
|
+
{ id: "1013", name: "Norwegian" },
|
|
64
|
+
{ id: "1009", name: "Danish" },
|
|
65
|
+
{ id: "1011", name: "Finnish" },
|
|
66
|
+
{ id: "1005", name: "Dutch" },
|
|
67
|
+
];
|
|
68
|
+
const DATAFORSEO_LOCATIONS = [
|
|
69
|
+
{ code: "us", name: "United States" },
|
|
70
|
+
{ code: "uk", name: "United Kingdom" },
|
|
71
|
+
{ code: "gb", name: "United Kingdom" },
|
|
72
|
+
{ code: "ca", name: "Canada" },
|
|
73
|
+
{ code: "au", name: "Australia" },
|
|
74
|
+
{ code: "de", name: "Germany" },
|
|
75
|
+
{ code: "fr", name: "France" },
|
|
76
|
+
{ code: "es", name: "Spain" },
|
|
77
|
+
{ code: "it", name: "Italy" },
|
|
78
|
+
{ code: "br", name: "Brazil" },
|
|
79
|
+
{ code: "mx", name: "Mexico" },
|
|
80
|
+
{ code: "nl", name: "Netherlands" },
|
|
81
|
+
{ code: "be", name: "Belgium" },
|
|
82
|
+
{ code: "at", name: "Austria" },
|
|
83
|
+
{ code: "ch", name: "Switzerland" },
|
|
84
|
+
{ code: "pt", name: "Portugal" },
|
|
85
|
+
{ code: "se", name: "Sweden" },
|
|
86
|
+
{ code: "no", name: "Norway" },
|
|
87
|
+
{ code: "dk", name: "Denmark" },
|
|
88
|
+
{ code: "fi", name: "Finland" },
|
|
89
|
+
{ code: "ie", name: "Ireland" },
|
|
90
|
+
{ code: "nz", name: "New Zealand" },
|
|
91
|
+
{ code: "in", name: "India" },
|
|
92
|
+
{ code: "jp", name: "Japan" },
|
|
93
|
+
{ code: "kr", name: "South Korea" },
|
|
94
|
+
{ code: "sg", name: "Singapore" },
|
|
95
|
+
{ code: "ar", name: "Argentina" },
|
|
96
|
+
{ code: "cl", name: "Chile" },
|
|
97
|
+
{ code: "co", name: "Colombia" },
|
|
98
|
+
{ code: "pe", name: "Peru" },
|
|
99
|
+
{ code: "pl", name: "Poland" },
|
|
100
|
+
{ code: "cz", name: "Czech Republic" },
|
|
101
|
+
{ code: "ro", name: "Romania" },
|
|
102
|
+
{ code: "hu", name: "Hungary" },
|
|
103
|
+
{ code: "za", name: "South Africa" },
|
|
104
|
+
{ code: "il", name: "Israel" },
|
|
105
|
+
{ code: "ae", name: "United Arab Emirates" },
|
|
106
|
+
{ code: "sa", name: "Saudi Arabia" },
|
|
107
|
+
{ code: "tr", name: "Turkey" },
|
|
108
|
+
{ code: "ph", name: "Philippines" },
|
|
109
|
+
{ code: "th", name: "Thailand" },
|
|
110
|
+
{ code: "my", name: "Malaysia" },
|
|
111
|
+
{ code: "id", name: "Indonesia" },
|
|
112
|
+
{ code: "vn", name: "Vietnam" },
|
|
113
|
+
{ code: "tw", name: "Taiwan" },
|
|
114
|
+
{ code: "hk", name: "Hong Kong" },
|
|
115
|
+
];
|
|
116
|
+
const DATAFORSEO_LANGUAGES = [
|
|
117
|
+
{ code: "en", name: "English" },
|
|
118
|
+
{ code: "es", name: "Spanish" },
|
|
119
|
+
{ code: "fr", name: "French" },
|
|
120
|
+
{ code: "de", name: "German" },
|
|
121
|
+
{ code: "it", name: "Italian" },
|
|
122
|
+
{ code: "pt", name: "Portuguese" },
|
|
123
|
+
{ code: "nl", name: "Dutch" },
|
|
124
|
+
{ code: "ja", name: "Japanese" },
|
|
125
|
+
{ code: "ko", name: "Korean" },
|
|
126
|
+
{ code: "zh", name: "Chinese" },
|
|
127
|
+
{ code: "ar", name: "Arabic" },
|
|
128
|
+
{ code: "ru", name: "Russian" },
|
|
129
|
+
{ code: "pl", name: "Polish" },
|
|
130
|
+
{ code: "tr", name: "Turkish" },
|
|
131
|
+
{ code: "sv", name: "Swedish" },
|
|
132
|
+
{ code: "no", name: "Norwegian" },
|
|
133
|
+
{ code: "da", name: "Danish" },
|
|
134
|
+
{ code: "fi", name: "Finnish" },
|
|
135
|
+
];
|
|
136
|
+
function toRecord(list) {
|
|
137
|
+
const map = {};
|
|
138
|
+
for (const item of list) {
|
|
139
|
+
const key = item.id ?? item.code;
|
|
140
|
+
if (key)
|
|
141
|
+
map[key] = item.name;
|
|
142
|
+
}
|
|
143
|
+
return map;
|
|
144
|
+
}
|
|
145
|
+
const adsLocationMap = toRecord(GOOGLE_ADS_LOCATIONS);
|
|
146
|
+
const adsLanguageMap = toRecord(GOOGLE_ADS_LANGUAGES);
|
|
147
|
+
const researchLocationMap = toRecord(DATAFORSEO_LOCATIONS);
|
|
148
|
+
const researchLanguageMap = toRecord(DATAFORSEO_LANGUAGES);
|
|
149
|
+
export function buildAdsQueryContext(locationArg, languageArg) {
|
|
150
|
+
const locationId = locationArg ?? "2840";
|
|
151
|
+
const languageId = languageArg ?? "1000";
|
|
152
|
+
const locationIsDefault = !locationArg;
|
|
153
|
+
const languageIsDefault = !languageArg;
|
|
154
|
+
const locationName = adsLocationMap[locationId] ?? `ID ${locationId}`;
|
|
155
|
+
const languageName = adsLanguageMap[languageId] ?? `ID ${languageId}`;
|
|
156
|
+
const ctx = {
|
|
157
|
+
location: `${locationName} (${locationId})`,
|
|
158
|
+
language: `${languageName} (${languageId})`,
|
|
159
|
+
location_is_default: locationIsDefault,
|
|
160
|
+
language_is_default: languageIsDefault,
|
|
161
|
+
};
|
|
162
|
+
if (locationIsDefault || languageIsDefault) {
|
|
163
|
+
const parts = [];
|
|
164
|
+
if (locationIsDefault)
|
|
165
|
+
parts.push("--location");
|
|
166
|
+
if (languageIsDefault)
|
|
167
|
+
parts.push("--language");
|
|
168
|
+
ctx.defaults_warning =
|
|
169
|
+
`Location and/or language were not specified — using defaults. ` +
|
|
170
|
+
`Results are for ${locationName} in ${languageName}. ` +
|
|
171
|
+
`Pass ${parts.join(" and ")} to target a different market.`;
|
|
172
|
+
}
|
|
173
|
+
return ctx;
|
|
174
|
+
}
|
|
175
|
+
export function buildResearchQueryContext(locationArg, languageArg, options) {
|
|
176
|
+
const skipLocation = options?.skipLocation ?? false;
|
|
177
|
+
const locationCode = locationArg ?? "us";
|
|
178
|
+
const languageCode = languageArg ?? "en";
|
|
179
|
+
const locationIsDefault = !locationArg && !skipLocation;
|
|
180
|
+
const languageIsDefault = !languageArg;
|
|
181
|
+
const locationName = researchLocationMap[locationCode.toLowerCase()] ?? `code ${locationCode}`;
|
|
182
|
+
const languageName = researchLanguageMap[languageCode.toLowerCase()] ?? `code ${languageCode}`;
|
|
183
|
+
const ctx = {
|
|
184
|
+
location: skipLocation ? "N/A" : `${locationName} (${locationCode})`,
|
|
185
|
+
language: `${languageName} (${languageCode})`,
|
|
186
|
+
location_is_default: locationIsDefault,
|
|
187
|
+
language_is_default: languageIsDefault,
|
|
188
|
+
};
|
|
189
|
+
const defaultParts = [];
|
|
190
|
+
if (locationIsDefault)
|
|
191
|
+
defaultParts.push("--location");
|
|
192
|
+
if (languageIsDefault)
|
|
193
|
+
defaultParts.push("--language");
|
|
194
|
+
if (defaultParts.length > 0) {
|
|
195
|
+
const market = skipLocation ? `${languageName}` : `${locationName} in ${languageName}`;
|
|
196
|
+
ctx.defaults_warning =
|
|
197
|
+
`Location and/or language were not specified — using defaults. ` +
|
|
198
|
+
`Results are for ${market}. ` +
|
|
199
|
+
`Pass ${defaultParts.join(" and ")} to target a different market.`;
|
|
200
|
+
}
|
|
201
|
+
return ctx;
|
|
202
|
+
}
|
|
203
|
+
export function warnDefaults(ctx) {
|
|
204
|
+
if (ctx.defaults_warning) {
|
|
205
|
+
process.stderr.write(`\n[WARNING] ${ctx.defaults_warning}\n\n`);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
//# sourceMappingURL=geo-context.js.map
|