amazonads-cli 0.1.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 +136 -0
- package/build/amazon-ads-client.d.ts +29 -0
- package/build/amazon-ads-client.d.ts.map +1 -0
- package/build/amazon-ads-client.js +323 -0
- package/build/amazon-ads-client.js.map +1 -0
- package/build/commands/ads.d.ts +6 -0
- package/build/commands/ads.d.ts.map +1 -0
- package/build/commands/ads.js +49 -0
- package/build/commands/ads.js.map +1 -0
- package/build/commands/auth.d.ts +3 -0
- package/build/commands/auth.d.ts.map +1 -0
- package/build/commands/auth.js +176 -0
- package/build/commands/auth.js.map +1 -0
- package/build/commands/campaigns.d.ts +6 -0
- package/build/commands/campaigns.d.ts.map +1 -0
- package/build/commands/campaigns.js +175 -0
- package/build/commands/campaigns.js.map +1 -0
- package/build/commands/keywords.d.ts +6 -0
- package/build/commands/keywords.d.ts.map +1 -0
- package/build/commands/keywords.js +79 -0
- package/build/commands/keywords.js.map +1 -0
- package/build/commands/profiles.d.ts +4 -0
- package/build/commands/profiles.d.ts.map +1 -0
- package/build/commands/profiles.js +32 -0
- package/build/commands/profiles.js.map +1 -0
- package/build/commands/reports.d.ts +6 -0
- package/build/commands/reports.d.ts.map +1 -0
- package/build/commands/reports.js +37 -0
- package/build/commands/reports.js.map +1 -0
- package/build/config.d.ts +13 -0
- package/build/config.d.ts.map +1 -0
- package/build/config.js +54 -0
- package/build/config.js.map +1 -0
- package/build/index.d.ts +3 -0
- package/build/index.d.ts.map +1 -0
- package/build/index.js +42 -0
- package/build/index.js.map +1 -0
- package/build/output.d.ts +8 -0
- package/build/output.d.ts.map +1 -0
- package/build/output.js +45 -0
- package/build/output.js.map +1 -0
- package/package.json +34 -0
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
import http from "http";
|
|
2
|
+
import { URL } from "url";
|
|
3
|
+
import readline from "readline/promises";
|
|
4
|
+
import { loadConfig, saveConfig, deleteConfig, getConfigPath } from "../config.js";
|
|
5
|
+
import { printSuccess, printError, printWarning } from "../output.js";
|
|
6
|
+
const REDIRECT_URI = "http://localhost:3000/callback";
|
|
7
|
+
const SCOPES = "advertising::campaign_management";
|
|
8
|
+
function maskSecret(value) {
|
|
9
|
+
if (!value)
|
|
10
|
+
return "(not set)";
|
|
11
|
+
if (value.length <= 8)
|
|
12
|
+
return "****";
|
|
13
|
+
return value.slice(0, 4) + "****" + value.slice(-4);
|
|
14
|
+
}
|
|
15
|
+
export function registerAuthCommands(program) {
|
|
16
|
+
const auth = program.command("auth").description("Manage authentication");
|
|
17
|
+
auth
|
|
18
|
+
.command("login")
|
|
19
|
+
.description("Authenticate with Amazon Ads OAuth")
|
|
20
|
+
.action(async () => {
|
|
21
|
+
const rl = readline.createInterface({
|
|
22
|
+
input: process.stdin,
|
|
23
|
+
output: process.stdout,
|
|
24
|
+
});
|
|
25
|
+
try {
|
|
26
|
+
console.log("\nAmazon Ads CLI — OAuth Login");
|
|
27
|
+
console.log("=============================\n");
|
|
28
|
+
const clientId = await rl.question("Client ID: ");
|
|
29
|
+
const clientSecret = await rl.question("Client Secret: ");
|
|
30
|
+
if (!clientId.trim() || !clientSecret.trim()) {
|
|
31
|
+
printError("Client ID and Client Secret are required.");
|
|
32
|
+
process.exit(1);
|
|
33
|
+
}
|
|
34
|
+
// Build the authorization URL
|
|
35
|
+
const authUrl = new URL("https://www.amazon.com/ap/oa");
|
|
36
|
+
authUrl.searchParams.set("client_id", clientId.trim());
|
|
37
|
+
authUrl.searchParams.set("scope", SCOPES);
|
|
38
|
+
authUrl.searchParams.set("response_type", "code");
|
|
39
|
+
authUrl.searchParams.set("redirect_uri", REDIRECT_URI);
|
|
40
|
+
console.log("\nStarting local callback server on http://localhost:3000...");
|
|
41
|
+
await new Promise((resolve, reject) => {
|
|
42
|
+
const server = http.createServer(async (req, res) => {
|
|
43
|
+
const url = new URL(req.url || "", `http://${req.headers.host}`);
|
|
44
|
+
if (url.pathname !== "/callback") {
|
|
45
|
+
res.writeHead(404);
|
|
46
|
+
res.end("Not found");
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
const code = url.searchParams.get("code");
|
|
50
|
+
const error = url.searchParams.get("error");
|
|
51
|
+
if (error) {
|
|
52
|
+
res.writeHead(400, { "Content-Type": "text/html" });
|
|
53
|
+
res.end(htmlPage("Authorization Failed", `Error: ${error}`));
|
|
54
|
+
printError(`\nAuthorization failed: ${error}`);
|
|
55
|
+
server.close();
|
|
56
|
+
reject(new Error(error));
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
if (!code) {
|
|
60
|
+
res.writeHead(400, { "Content-Type": "text/html" });
|
|
61
|
+
res.end(htmlPage("Missing Authorization Code", "No code received."));
|
|
62
|
+
server.close();
|
|
63
|
+
reject(new Error("No authorization code received"));
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
try {
|
|
67
|
+
const tokenData = new URLSearchParams({
|
|
68
|
+
grant_type: "authorization_code",
|
|
69
|
+
code,
|
|
70
|
+
redirect_uri: REDIRECT_URI,
|
|
71
|
+
client_id: clientId.trim(),
|
|
72
|
+
client_secret: clientSecret.trim(),
|
|
73
|
+
});
|
|
74
|
+
const response = await fetch("https://api.amazon.com/auth/o2/token", {
|
|
75
|
+
method: "POST",
|
|
76
|
+
headers: { "Content-Type": "application/x-www-form-urlencoded" },
|
|
77
|
+
body: tokenData.toString(),
|
|
78
|
+
});
|
|
79
|
+
if (!response.ok) {
|
|
80
|
+
const errText = await response.text();
|
|
81
|
+
throw new Error(`Token exchange failed: ${errText}`);
|
|
82
|
+
}
|
|
83
|
+
const tokens = await response.json();
|
|
84
|
+
res.writeHead(200, { "Content-Type": "text/html" });
|
|
85
|
+
res.end(htmlPage("Success!", "Your token has been saved. You can close this window."));
|
|
86
|
+
server.close(async () => {
|
|
87
|
+
try {
|
|
88
|
+
const regionAnswer = await rl.question("\nRegion (NA/EU/FE) [NA]: ");
|
|
89
|
+
const sandboxAnswer = await rl.question("Sandbox mode? (y/N): ");
|
|
90
|
+
const region = regionAnswer.trim().toUpperCase() || "NA";
|
|
91
|
+
const sandbox = sandboxAnswer.trim().toLowerCase() === "y";
|
|
92
|
+
const existing = loadConfig();
|
|
93
|
+
saveConfig({
|
|
94
|
+
...existing,
|
|
95
|
+
clientId: clientId.trim(),
|
|
96
|
+
clientSecret: clientSecret.trim(),
|
|
97
|
+
refreshToken: tokens.refresh_token,
|
|
98
|
+
region,
|
|
99
|
+
sandbox,
|
|
100
|
+
});
|
|
101
|
+
printSuccess(`\nAuthentication successful! Config saved to ${getConfigPath()}`);
|
|
102
|
+
resolve();
|
|
103
|
+
}
|
|
104
|
+
catch (e) {
|
|
105
|
+
reject(e);
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
catch (e) {
|
|
110
|
+
res.writeHead(500, { "Content-Type": "text/html" });
|
|
111
|
+
res.end(htmlPage("Token Exchange Failed", String(e)));
|
|
112
|
+
server.close();
|
|
113
|
+
reject(e);
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
server.listen(3000, "127.0.0.1", async () => {
|
|
117
|
+
console.log("Callback server started.\n");
|
|
118
|
+
console.log("Opening browser to Amazon OAuth...");
|
|
119
|
+
console.log(`\n ${authUrl.toString()}\n`);
|
|
120
|
+
console.log("If the browser doesn't open, copy and paste the URL above.\n");
|
|
121
|
+
console.log("Waiting for authorization...\n");
|
|
122
|
+
try {
|
|
123
|
+
const open = await import("open");
|
|
124
|
+
await open.default(authUrl.toString());
|
|
125
|
+
}
|
|
126
|
+
catch {
|
|
127
|
+
// open not available; user will copy/paste
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
server.on("error", (err) => {
|
|
131
|
+
reject(err);
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
catch (err) {
|
|
136
|
+
printError(`Login failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
137
|
+
process.exit(1);
|
|
138
|
+
}
|
|
139
|
+
finally {
|
|
140
|
+
rl.close();
|
|
141
|
+
}
|
|
142
|
+
});
|
|
143
|
+
auth
|
|
144
|
+
.command("status")
|
|
145
|
+
.description("Show current authentication status")
|
|
146
|
+
.action(() => {
|
|
147
|
+
const config = loadConfig();
|
|
148
|
+
console.log("\nAmazon Ads CLI — Auth Status");
|
|
149
|
+
console.log("=============================\n");
|
|
150
|
+
console.log(`Client ID: ${maskSecret(config.clientId)}`);
|
|
151
|
+
console.log(`Client Secret: ${maskSecret(config.clientSecret)}`);
|
|
152
|
+
console.log(`Refresh Token: ${maskSecret(config.refreshToken)}`);
|
|
153
|
+
console.log(`Region: ${config.region || "(not set)"}`);
|
|
154
|
+
console.log(`Sandbox: ${config.sandbox ? "yes" : "no"}`);
|
|
155
|
+
console.log(`Default Profile: ${config.defaultProfileId || "(not set)"}`);
|
|
156
|
+
console.log(`Config File: ${getConfigPath()}\n`);
|
|
157
|
+
const hasCredentials = config.clientId && config.clientSecret && config.refreshToken;
|
|
158
|
+
if (hasCredentials) {
|
|
159
|
+
printSuccess("Status: Authenticated");
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
printWarning('Status: Not authenticated — run "amazonads auth login"');
|
|
163
|
+
}
|
|
164
|
+
});
|
|
165
|
+
auth
|
|
166
|
+
.command("logout")
|
|
167
|
+
.description("Remove saved credentials")
|
|
168
|
+
.action(() => {
|
|
169
|
+
deleteConfig();
|
|
170
|
+
printSuccess("Logged out. Config file deleted.");
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
function htmlPage(title, body) {
|
|
174
|
+
return `<html><body style="font-family:Arial,sans-serif;padding:50px;text-align:center"><h1>${title}</h1><p>${body}</p></body></html>`;
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { AmazonAdsClient } from "../amazon-ads-client.js";
|
|
3
|
+
export declare function registerCampaignsCommands(program: Command, client: AmazonAdsClient, resolveProfileId: (opts: {
|
|
4
|
+
profile?: string;
|
|
5
|
+
}) => string): void;
|
|
6
|
+
//# sourceMappingURL=campaigns.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"campaigns.d.ts","sourceRoot":"","sources":["../../src/commands/campaigns.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAgC1D,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,eAAe,EACvB,gBAAgB,EAAE,CAAC,IAAI,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,KAAK,MAAM,GACvD,IAAI,CA8LN"}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import readline from "readline/promises";
|
|
2
|
+
import { printTable, printJson, printSuccess, printError, printWarning, colorState, formatCurrency, } from "../output.js";
|
|
3
|
+
function resolveCampaigns(data) {
|
|
4
|
+
if (Array.isArray(data))
|
|
5
|
+
return data;
|
|
6
|
+
const resp = data;
|
|
7
|
+
if (resp.campaigns && Array.isArray(resp.campaigns))
|
|
8
|
+
return resp.campaigns;
|
|
9
|
+
return [];
|
|
10
|
+
}
|
|
11
|
+
export function registerCampaignsCommands(program, client, resolveProfileId) {
|
|
12
|
+
const campaigns = program.command("campaigns").description("Manage campaigns");
|
|
13
|
+
campaigns
|
|
14
|
+
.command("list")
|
|
15
|
+
.description("List campaigns")
|
|
16
|
+
.option("--profile <id>", "Profile ID")
|
|
17
|
+
.option("--state <state>", "Filter by state (ENABLED, PAUSED, ARCHIVED)")
|
|
18
|
+
.option("--type <type>", "Campaign type (sponsoredProducts, sponsoredBrands, sponsoredDisplay)")
|
|
19
|
+
.option("--json", "Output as JSON")
|
|
20
|
+
.action(async (opts) => {
|
|
21
|
+
try {
|
|
22
|
+
const profileId = resolveProfileId(opts);
|
|
23
|
+
const data = await client.getCampaigns(profileId, opts.state, opts.type);
|
|
24
|
+
if (opts.json) {
|
|
25
|
+
printJson(data);
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
const list = resolveCampaigns(data);
|
|
29
|
+
if (list.length === 0) {
|
|
30
|
+
console.log("No campaigns found.");
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
const headers = ["Campaign ID", "Name", "State", "Budget", "Start Date", "Targeting"];
|
|
34
|
+
const rows = list.map((c) => [
|
|
35
|
+
String(c.campaignId || ""),
|
|
36
|
+
c.name || "",
|
|
37
|
+
colorState(c.state || ""),
|
|
38
|
+
formatCurrency(c.budget?.budget),
|
|
39
|
+
c.startDate || "",
|
|
40
|
+
c.targetingType || "",
|
|
41
|
+
]);
|
|
42
|
+
printTable(headers, rows);
|
|
43
|
+
}
|
|
44
|
+
catch (err) {
|
|
45
|
+
printError(`Error: ${err instanceof Error ? err.message : String(err)}`);
|
|
46
|
+
process.exit(1);
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
campaigns
|
|
50
|
+
.command("performance")
|
|
51
|
+
.description("Get campaign performance report")
|
|
52
|
+
.requiredOption("--campaign <id>", "Campaign ID")
|
|
53
|
+
.requiredOption("--start <date>", "Start date (YYYY-MM-DD)")
|
|
54
|
+
.requiredOption("--end <date>", "End date (YYYY-MM-DD)")
|
|
55
|
+
.option("--profile <id>", "Profile ID")
|
|
56
|
+
.option("--json", "Output as JSON")
|
|
57
|
+
.action(async (opts) => {
|
|
58
|
+
try {
|
|
59
|
+
const profileId = resolveProfileId(opts);
|
|
60
|
+
const data = await client.getCampaignPerformance(profileId, opts.campaign, opts.start, opts.end);
|
|
61
|
+
const result = data;
|
|
62
|
+
if (result.status === "PENDING") {
|
|
63
|
+
printWarning(`Report still processing. Report ID: ${result.reportId}`);
|
|
64
|
+
console.log(`Check status with: amazonads reports get --report ${result.reportId} --profile ${profileId}`);
|
|
65
|
+
if (opts.json)
|
|
66
|
+
printJson(data);
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
if (opts.json) {
|
|
70
|
+
printJson(data);
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
const rows = Array.isArray(data) ? data : [];
|
|
74
|
+
if (rows.length === 0) {
|
|
75
|
+
console.log("No performance data found.");
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
const headers = ["Campaign ID", "Name", "Impressions", "Clicks", "Spend", "Sales", "ACOS"];
|
|
79
|
+
const tableRows = rows.map((r) => {
|
|
80
|
+
const spend = typeof r.spend === "number" ? r.spend : parseFloat(String(r.spend || 0));
|
|
81
|
+
const sales = typeof r.sales14d === "number" ? r.sales14d : parseFloat(String(r.sales14d || 0));
|
|
82
|
+
const acos = sales > 0 ? ((spend / sales) * 100).toFixed(1) + "%" : "N/A";
|
|
83
|
+
return [
|
|
84
|
+
String(r.campaignId || ""),
|
|
85
|
+
String(r.campaignName || ""),
|
|
86
|
+
String(r.impressions || 0),
|
|
87
|
+
String(r.clicks || 0),
|
|
88
|
+
formatCurrency(spend),
|
|
89
|
+
formatCurrency(sales),
|
|
90
|
+
acos,
|
|
91
|
+
];
|
|
92
|
+
});
|
|
93
|
+
printTable(headers, tableRows);
|
|
94
|
+
}
|
|
95
|
+
catch (err) {
|
|
96
|
+
printError(`Error: ${err instanceof Error ? err.message : String(err)}`);
|
|
97
|
+
process.exit(1);
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
campaigns
|
|
101
|
+
.command("create")
|
|
102
|
+
.description("Create a new campaign (created in PAUSED state)")
|
|
103
|
+
.requiredOption("--name <name>", "Campaign name")
|
|
104
|
+
.requiredOption("--type <type>", "Campaign type (sponsoredProducts, sponsoredBrands, sponsoredDisplay)")
|
|
105
|
+
.requiredOption("--targeting <type>", "Targeting type (MANUAL or AUTO)")
|
|
106
|
+
.requiredOption("--budget <amount>", "Daily budget amount")
|
|
107
|
+
.requiredOption("--start <date>", "Start date (YYYY-MM-DD)")
|
|
108
|
+
.option("--profile <id>", "Profile ID")
|
|
109
|
+
.option("--json", "Output as JSON")
|
|
110
|
+
.action(async (opts) => {
|
|
111
|
+
try {
|
|
112
|
+
const profileId = resolveProfileId(opts);
|
|
113
|
+
const budget = parseFloat(opts.budget);
|
|
114
|
+
if (isNaN(budget) || budget <= 0) {
|
|
115
|
+
printError("Budget must be a positive number.");
|
|
116
|
+
process.exit(1);
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
const data = await client.createCampaign(profileId, opts.name, opts.type, opts.targeting.toUpperCase(), budget, opts.start);
|
|
120
|
+
printWarning("Campaign created in PAUSED state. Enable it in the Amazon Ads console when ready.");
|
|
121
|
+
if (opts.json) {
|
|
122
|
+
printJson(data);
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
printSuccess("Campaign created successfully.");
|
|
126
|
+
printJson(data);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
catch (err) {
|
|
130
|
+
printError(`Error: ${err instanceof Error ? err.message : String(err)}`);
|
|
131
|
+
process.exit(1);
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
campaigns
|
|
135
|
+
.command("archive")
|
|
136
|
+
.description("Archive a campaign")
|
|
137
|
+
.requiredOption("--campaign <id>", "Campaign ID")
|
|
138
|
+
.requiredOption("--type <type>", "Campaign type (sponsoredProducts, sponsoredBrands, sponsoredDisplay)")
|
|
139
|
+
.option("--profile <id>", "Profile ID")
|
|
140
|
+
.option("--confirm", "Skip confirmation prompt")
|
|
141
|
+
.option("--json", "Output as JSON")
|
|
142
|
+
.action(async (opts) => {
|
|
143
|
+
try {
|
|
144
|
+
const profileId = resolveProfileId(opts);
|
|
145
|
+
if (!opts.confirm) {
|
|
146
|
+
const rl = readline.createInterface({
|
|
147
|
+
input: process.stdin,
|
|
148
|
+
output: process.stdout,
|
|
149
|
+
});
|
|
150
|
+
try {
|
|
151
|
+
const answer = await rl.question(`Archive campaign ${opts.campaign}? This cannot be undone. (y/N): `);
|
|
152
|
+
if (answer.trim().toLowerCase() !== "y") {
|
|
153
|
+
console.log("Aborted.");
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
finally {
|
|
158
|
+
rl.close();
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
const data = await client.archiveCampaign(profileId, opts.campaign, opts.type);
|
|
162
|
+
if (opts.json) {
|
|
163
|
+
printJson(data);
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
printSuccess(`Campaign ${opts.campaign} archived successfully.`);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
catch (err) {
|
|
170
|
+
printError(`Error: ${err instanceof Error ? err.message : String(err)}`);
|
|
171
|
+
process.exit(1);
|
|
172
|
+
}
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=campaigns.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"campaigns.js","sourceRoot":"","sources":["../../src/commands/campaigns.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { AmazonAdsClient } from "../amazon-ads-client.js";
|
|
3
|
+
export declare function registerKeywordsCommands(program: Command, client: AmazonAdsClient, resolveProfileId: (opts: {
|
|
4
|
+
profile?: string;
|
|
5
|
+
}) => string): void;
|
|
6
|
+
//# sourceMappingURL=keywords.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keywords.d.ts","sourceRoot":"","sources":["../../src/commands/keywords.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AA+B1D,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,eAAe,EACvB,gBAAgB,EAAE,CAAC,IAAI,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,KAAK,MAAM,GACvD,IAAI,CA0EN"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { printTable, printJson, printSuccess, printError, colorState, formatCurrency, } from "../output.js";
|
|
2
|
+
function resolveKeywords(data) {
|
|
3
|
+
if (Array.isArray(data))
|
|
4
|
+
return data;
|
|
5
|
+
const resp = data;
|
|
6
|
+
if (resp.keywords && Array.isArray(resp.keywords))
|
|
7
|
+
return resp.keywords;
|
|
8
|
+
return [];
|
|
9
|
+
}
|
|
10
|
+
export function registerKeywordsCommands(program, client, resolveProfileId) {
|
|
11
|
+
const keywords = program.command("keywords").description("Manage keywords");
|
|
12
|
+
keywords
|
|
13
|
+
.command("list")
|
|
14
|
+
.description("List keywords")
|
|
15
|
+
.option("--profile <id>", "Profile ID")
|
|
16
|
+
.option("--campaign <id>", "Filter by campaign ID")
|
|
17
|
+
.option("--ad-group <id>", "Filter by ad group ID")
|
|
18
|
+
.option("--json", "Output as JSON")
|
|
19
|
+
.action(async (opts) => {
|
|
20
|
+
try {
|
|
21
|
+
const profileId = resolveProfileId(opts);
|
|
22
|
+
const data = await client.getKeywords(profileId, opts.campaign, opts.adGroup);
|
|
23
|
+
if (opts.json) {
|
|
24
|
+
printJson(data);
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
const list = resolveKeywords(data);
|
|
28
|
+
if (list.length === 0) {
|
|
29
|
+
console.log("No keywords found.");
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
const headers = ["Keyword ID", "Keyword", "Match Type", "State", "Bid", "Campaign ID", "Ad Group ID"];
|
|
33
|
+
const rows = list.map((k) => [
|
|
34
|
+
String(k.keywordId || ""),
|
|
35
|
+
k.keywordText || "",
|
|
36
|
+
k.matchType || "",
|
|
37
|
+
colorState(k.state || ""),
|
|
38
|
+
formatCurrency(k.bid),
|
|
39
|
+
String(k.campaignId || ""),
|
|
40
|
+
String(k.adGroupId || ""),
|
|
41
|
+
]);
|
|
42
|
+
printTable(headers, rows);
|
|
43
|
+
}
|
|
44
|
+
catch (err) {
|
|
45
|
+
printError(`Error: ${err instanceof Error ? err.message : String(err)}`);
|
|
46
|
+
process.exit(1);
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
keywords
|
|
50
|
+
.command("update-bid")
|
|
51
|
+
.description("Update keyword bid")
|
|
52
|
+
.requiredOption("--keyword <id>", "Keyword ID")
|
|
53
|
+
.requiredOption("--bid <amount>", "New bid amount")
|
|
54
|
+
.option("--profile <id>", "Profile ID")
|
|
55
|
+
.option("--json", "Output as JSON")
|
|
56
|
+
.action(async (opts) => {
|
|
57
|
+
try {
|
|
58
|
+
const profileId = resolveProfileId(opts);
|
|
59
|
+
const bid = parseFloat(opts.bid);
|
|
60
|
+
if (isNaN(bid) || bid <= 0) {
|
|
61
|
+
printError("Bid must be a positive number.");
|
|
62
|
+
process.exit(1);
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
const data = await client.updateKeywordBid(profileId, opts.keyword, bid);
|
|
66
|
+
if (opts.json) {
|
|
67
|
+
printJson(data);
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
printSuccess(`Keyword ${opts.keyword} bid updated to ${formatCurrency(bid)}.`);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
catch (err) {
|
|
74
|
+
printError(`Error: ${err instanceof Error ? err.message : String(err)}`);
|
|
75
|
+
process.exit(1);
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=keywords.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keywords.js","sourceRoot":"","sources":["../../src/commands/keywords.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profiles.d.ts","sourceRoot":"","sources":["../../src/commands/profiles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAe1D,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,eAAe,GACtB,IAAI,CA+BN"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { printTable, printJson, printError } from "../output.js";
|
|
2
|
+
export function registerProfilesCommands(program, client) {
|
|
3
|
+
program
|
|
4
|
+
.command("profiles")
|
|
5
|
+
.description("List Amazon Ads profiles")
|
|
6
|
+
.option("--json", "Output as JSON")
|
|
7
|
+
.action(async (opts) => {
|
|
8
|
+
try {
|
|
9
|
+
const data = await client.getProfiles();
|
|
10
|
+
const profiles = data;
|
|
11
|
+
if (opts.json) {
|
|
12
|
+
printJson(profiles);
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
const headers = ["Profile ID", "Name", "Type", "Country", "Currency", "Timezone"];
|
|
16
|
+
const rows = profiles.map((p) => [
|
|
17
|
+
String(p.profileId),
|
|
18
|
+
p.accountInfo?.name || "",
|
|
19
|
+
p.accountInfo?.type || "",
|
|
20
|
+
p.countryCode || p.accountInfo?.marketplaceStringId || "",
|
|
21
|
+
p.currencyCode || "",
|
|
22
|
+
p.timezone || "",
|
|
23
|
+
]);
|
|
24
|
+
printTable(headers, rows);
|
|
25
|
+
}
|
|
26
|
+
catch (err) {
|
|
27
|
+
printError(`Error: ${err instanceof Error ? err.message : String(err)}`);
|
|
28
|
+
process.exit(1);
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=profiles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profiles.js","sourceRoot":"","sources":["../../src/commands/profiles.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAcjE,MAAM,UAAU,wBAAwB,CACtC,OAAgB,EAChB,MAAuB;IAEvB,OAAO;SACJ,OAAO,CAAC,UAAU,CAAC;SACnB,WAAW,CAAC,0BAA0B,CAAC;SACvC,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC;YACxC,MAAM,QAAQ,GAAG,IAAiB,CAAC;YAEnC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACd,SAAS,CAAC,QAAQ,CAAC,CAAC;gBACpB,OAAO;YACT,CAAC;YAED,MAAM,OAAO,GAAG,CAAC,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;YAClF,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;gBAC/B,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;gBACnB,CAAC,CAAC,WAAW,EAAE,IAAI,IAAI,EAAE;gBACzB,CAAC,CAAC,WAAW,EAAE,IAAI,IAAI,EAAE;gBACzB,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,WAAW,EAAE,mBAAmB,IAAI,EAAE;gBACzD,CAAC,CAAC,YAAY,IAAI,EAAE;gBACpB,CAAC,CAAC,QAAQ,IAAI,EAAE;aACjB,CAAC,CAAC;YAEH,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC5B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,UAAU,CAAC,UAAU,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACzE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { AmazonAdsClient } from "../amazon-ads-client.js";
|
|
3
|
+
export declare function registerReportsCommands(program: Command, client: AmazonAdsClient, resolveProfileId: (opts: {
|
|
4
|
+
profile?: string;
|
|
5
|
+
}) => string): void;
|
|
6
|
+
//# sourceMappingURL=reports.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reports.d.ts","sourceRoot":"","sources":["../../src/commands/reports.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAG1D,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,eAAe,EACvB,gBAAgB,EAAE,CAAC,IAAI,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,KAAK,MAAM,GACvD,IAAI,CAmCN"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { printJson, printError, printWarning } from "../output.js";
|
|
2
|
+
export function registerReportsCommands(program, client, resolveProfileId) {
|
|
3
|
+
const reports = program.command("reports").description("Manage reports");
|
|
4
|
+
reports
|
|
5
|
+
.command("get")
|
|
6
|
+
.description("Get a report by ID")
|
|
7
|
+
.requiredOption("--report <id>", "Report ID")
|
|
8
|
+
.option("--profile <id>", "Profile ID")
|
|
9
|
+
.option("--json", "Output as JSON")
|
|
10
|
+
.action(async (opts) => {
|
|
11
|
+
try {
|
|
12
|
+
const profileId = resolveProfileId(opts);
|
|
13
|
+
const data = await client.getReport(profileId, opts.report);
|
|
14
|
+
const result = data;
|
|
15
|
+
if (result.status === "PENDING" || result.status === "IN_PROGRESS") {
|
|
16
|
+
printWarning(`Report ${opts.report} is still processing (status: ${result.status}).`);
|
|
17
|
+
console.log("Try again in a few seconds.");
|
|
18
|
+
if (opts.json)
|
|
19
|
+
printJson(data);
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
if (result.status === "FAILURE") {
|
|
23
|
+
printError(`Report failed: ${result.reason || "Unknown error"}`);
|
|
24
|
+
if (opts.json)
|
|
25
|
+
printJson(data);
|
|
26
|
+
process.exit(1);
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
printJson(opts.json ? data : result.data ?? data);
|
|
30
|
+
}
|
|
31
|
+
catch (err) {
|
|
32
|
+
printError(`Error: ${err instanceof Error ? err.message : String(err)}`);
|
|
33
|
+
process.exit(1);
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=reports.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reports.js","sourceRoot":"","sources":["../../src/commands/reports.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEnE,MAAM,UAAU,uBAAuB,CACrC,OAAgB,EAChB,MAAuB,EACvB,gBAAwD;IAExD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAC;IAEzE,OAAO;SACJ,OAAO,CAAC,KAAK,CAAC;SACd,WAAW,CAAC,oBAAoB,CAAC;SACjC,cAAc,CAAC,eAAe,EAAE,WAAW,CAAC;SAC5C,MAAM,CAAC,gBAAgB,EAAE,YAAY,CAAC;SACtC,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;YACzC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YAC5D,MAAM,MAAM,GAAG,IAA+B,CAAC;YAE/C,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,MAAM,KAAK,aAAa,EAAE,CAAC;gBACnE,YAAY,CAAC,UAAU,IAAI,CAAC,MAAM,iCAAiC,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;gBACtF,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;gBAC3C,IAAI,IAAI,CAAC,IAAI;oBAAE,SAAS,CAAC,IAAI,CAAC,CAAC;gBAC/B,OAAO;YACT,CAAC;YAED,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBAChC,UAAU,CAAC,kBAAkB,MAAM,CAAC,MAAM,IAAI,eAAe,EAAE,CAAC,CAAC;gBACjE,IAAI,IAAI,CAAC,IAAI;oBAAE,SAAS,CAAC,IAAI,CAAC,CAAC;gBAC/B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAChB,OAAO;YACT,CAAC;YAED,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC;QACpD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,UAAU,CAAC,UAAU,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACzE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface CliConfig {
|
|
2
|
+
clientId?: string;
|
|
3
|
+
clientSecret?: string;
|
|
4
|
+
refreshToken?: string;
|
|
5
|
+
region?: string;
|
|
6
|
+
sandbox?: boolean;
|
|
7
|
+
defaultProfileId?: string;
|
|
8
|
+
}
|
|
9
|
+
export declare function getConfigPath(): string;
|
|
10
|
+
export declare function loadConfig(): CliConfig;
|
|
11
|
+
export declare function saveConfig(config: CliConfig): void;
|
|
12
|
+
export declare function deleteConfig(): void;
|
|
13
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,wBAAgB,UAAU,IAAI,SAAS,CAkCtC;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAMlD;AAED,wBAAgB,YAAY,IAAI,IAAI,CAOnC"}
|