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.
Files changed (42) hide show
  1. package/README.md +136 -0
  2. package/build/amazon-ads-client.d.ts +29 -0
  3. package/build/amazon-ads-client.d.ts.map +1 -0
  4. package/build/amazon-ads-client.js +323 -0
  5. package/build/amazon-ads-client.js.map +1 -0
  6. package/build/commands/ads.d.ts +6 -0
  7. package/build/commands/ads.d.ts.map +1 -0
  8. package/build/commands/ads.js +49 -0
  9. package/build/commands/ads.js.map +1 -0
  10. package/build/commands/auth.d.ts +3 -0
  11. package/build/commands/auth.d.ts.map +1 -0
  12. package/build/commands/auth.js +176 -0
  13. package/build/commands/auth.js.map +1 -0
  14. package/build/commands/campaigns.d.ts +6 -0
  15. package/build/commands/campaigns.d.ts.map +1 -0
  16. package/build/commands/campaigns.js +175 -0
  17. package/build/commands/campaigns.js.map +1 -0
  18. package/build/commands/keywords.d.ts +6 -0
  19. package/build/commands/keywords.d.ts.map +1 -0
  20. package/build/commands/keywords.js +79 -0
  21. package/build/commands/keywords.js.map +1 -0
  22. package/build/commands/profiles.d.ts +4 -0
  23. package/build/commands/profiles.d.ts.map +1 -0
  24. package/build/commands/profiles.js +32 -0
  25. package/build/commands/profiles.js.map +1 -0
  26. package/build/commands/reports.d.ts +6 -0
  27. package/build/commands/reports.d.ts.map +1 -0
  28. package/build/commands/reports.js +37 -0
  29. package/build/commands/reports.js.map +1 -0
  30. package/build/config.d.ts +13 -0
  31. package/build/config.d.ts.map +1 -0
  32. package/build/config.js +54 -0
  33. package/build/config.js.map +1 -0
  34. package/build/index.d.ts +3 -0
  35. package/build/index.d.ts.map +1 -0
  36. package/build/index.js +42 -0
  37. package/build/index.js.map +1 -0
  38. package/build/output.d.ts +8 -0
  39. package/build/output.d.ts.map +1 -0
  40. package/build/output.js +45 -0
  41. package/build/output.js.map +1 -0
  42. 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,4 @@
1
+ import { Command } from "commander";
2
+ import { AmazonAdsClient } from "../amazon-ads-client.js";
3
+ export declare function registerProfilesCommands(program: Command, client: AmazonAdsClient): void;
4
+ //# sourceMappingURL=profiles.d.ts.map
@@ -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"}