@koda-sl/baker-cli 0.23.0 → 0.24.0-dev.55a07065
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 +63 -0
- package/dist/cli.js +1 -1
- package/dist/commands/ads/index.d.ts.map +1 -1
- package/dist/commands/ads/index.js +8 -2
- package/dist/commands/ads/index.js.map +1 -1
- package/dist/commands/ads/meta/account.d.ts +11 -0
- package/dist/commands/ads/meta/account.d.ts.map +1 -0
- package/dist/commands/ads/meta/account.js +32 -0
- package/dist/commands/ads/meta/account.js.map +1 -0
- package/dist/commands/ads/meta/accounts.d.ts +20 -0
- package/dist/commands/ads/meta/accounts.d.ts.map +1 -0
- package/dist/commands/ads/meta/accounts.js +55 -0
- package/dist/commands/ads/meta/accounts.js.map +1 -0
- package/dist/commands/ads/meta/activities.d.ts +24 -0
- package/dist/commands/ads/meta/activities.d.ts.map +1 -0
- package/dist/commands/ads/meta/activities.js +44 -0
- package/dist/commands/ads/meta/activities.js.map +1 -0
- package/dist/commands/ads/meta/ads.d.ts +32 -0
- package/dist/commands/ads/meta/ads.d.ts.map +1 -0
- package/dist/commands/ads/meta/ads.js +54 -0
- package/dist/commands/ads/meta/ads.js.map +1 -0
- package/dist/commands/ads/meta/adsets.d.ts +28 -0
- package/dist/commands/ads/meta/adsets.d.ts.map +1 -0
- package/dist/commands/ads/meta/adsets.js +47 -0
- package/dist/commands/ads/meta/adsets.js.map +1 -0
- package/dist/commands/ads/meta/audiences.d.ts +20 -0
- package/dist/commands/ads/meta/audiences.d.ts.map +1 -0
- package/dist/commands/ads/meta/audiences.js +41 -0
- package/dist/commands/ads/meta/audiences.js.map +1 -0
- package/dist/commands/ads/meta/businesses.d.ts +12 -0
- package/dist/commands/ads/meta/businesses.d.ts.map +1 -0
- package/dist/commands/ads/meta/businesses.js +35 -0
- package/dist/commands/ads/meta/businesses.js.map +1 -0
- package/dist/commands/ads/meta/campaigns.d.ts +24 -0
- package/dist/commands/ads/meta/campaigns.d.ts.map +1 -0
- package/dist/commands/ads/meta/campaigns.js +48 -0
- package/dist/commands/ads/meta/campaigns.js.map +1 -0
- package/dist/commands/ads/meta/catalogs.d.ts +17 -0
- package/dist/commands/ads/meta/catalogs.d.ts.map +1 -0
- package/dist/commands/ads/meta/catalogs.js +37 -0
- package/dist/commands/ads/meta/catalogs.js.map +1 -0
- package/dist/commands/ads/meta/creatives.d.ts +24 -0
- package/dist/commands/ads/meta/creatives.d.ts.map +1 -0
- package/dist/commands/ads/meta/creatives.js +51 -0
- package/dist/commands/ads/meta/creatives.js.map +1 -0
- package/dist/commands/ads/meta/currency.d.ts +11 -0
- package/dist/commands/ads/meta/currency.d.ts.map +1 -0
- package/dist/commands/ads/meta/currency.js +31 -0
- package/dist/commands/ads/meta/currency.js.map +1 -0
- package/dist/commands/ads/meta/high-demand-periods.d.ts +17 -0
- package/dist/commands/ads/meta/high-demand-periods.d.ts.map +1 -0
- package/dist/commands/ads/meta/high-demand-periods.js +33 -0
- package/dist/commands/ads/meta/high-demand-periods.js.map +1 -0
- package/dist/commands/ads/meta/images.d.ts +24 -0
- package/dist/commands/ads/meta/images.d.ts.map +1 -0
- package/dist/commands/ads/meta/images.js +45 -0
- package/dist/commands/ads/meta/images.js.map +1 -0
- package/dist/commands/ads/meta/index.d.ts +2 -0
- package/dist/commands/ads/meta/index.d.ts.map +1 -0
- package/dist/commands/ads/meta/index.js +76 -0
- package/dist/commands/ads/meta/index.js.map +1 -0
- package/dist/commands/ads/meta/insights.d.ts +81 -0
- package/dist/commands/ads/meta/insights.d.ts.map +1 -0
- package/dist/commands/ads/meta/insights.js +178 -0
- package/dist/commands/ads/meta/insights.js.map +1 -0
- package/dist/commands/ads/meta/labels.d.ts +16 -0
- package/dist/commands/ads/meta/labels.d.ts.map +1 -0
- package/dist/commands/ads/meta/labels.js +34 -0
- package/dist/commands/ads/meta/labels.js.map +1 -0
- package/dist/commands/ads/meta/pixels.d.ts +33 -0
- package/dist/commands/ads/meta/pixels.d.ts.map +1 -0
- package/dist/commands/ads/meta/pixels.js +69 -0
- package/dist/commands/ads/meta/pixels.js.map +1 -0
- package/dist/commands/ads/meta/presets.d.ts +18 -0
- package/dist/commands/ads/meta/presets.d.ts.map +1 -0
- package/dist/commands/ads/meta/presets.js +110 -0
- package/dist/commands/ads/meta/presets.js.map +1 -0
- package/dist/commands/ads/meta/preview.d.ts +32 -0
- package/dist/commands/ads/meta/preview.d.ts.map +1 -0
- package/dist/commands/ads/meta/preview.js +90 -0
- package/dist/commands/ads/meta/preview.js.map +1 -0
- package/dist/commands/ads/meta/shared.d.ts +12 -0
- package/dist/commands/ads/meta/shared.d.ts.map +1 -0
- package/dist/commands/ads/meta/shared.js +59 -0
- package/dist/commands/ads/meta/shared.js.map +1 -0
- package/dist/commands/ads/meta/studies.d.ts +24 -0
- package/dist/commands/ads/meta/studies.d.ts.map +1 -0
- package/dist/commands/ads/meta/studies.js +56 -0
- package/dist/commands/ads/meta/studies.js.map +1 -0
- package/dist/env.d.ts +1 -0
- package/dist/env.d.ts.map +1 -1
- package/dist/env.js +1 -0
- package/dist/env.js.map +1 -1
- package/dist/error-handler.d.ts +1 -1
- package/dist/error-handler.d.ts.map +1 -1
- package/dist/error-handler.js +3 -0
- package/dist/error-handler.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"insights.d.ts","sourceRoot":"","sources":["../../../../src/commands/ads/meta/insights.ts"],"names":[],"mappings":"AAqHA,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2F1B,CAAC"}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
import { defineCommand } from "citty";
|
|
2
|
+
import { apiPost } from "../../../client.js";
|
|
3
|
+
import { writeAdsJson, writeAdsOutput } from "../output.js";
|
|
4
|
+
import { getPreset, listPresets } from "./presets.js";
|
|
5
|
+
import { csvOrJson, getDateRange, handleMetaError } from "./shared.js";
|
|
6
|
+
const POLL_INTERVAL_MS = 5_000;
|
|
7
|
+
const POLL_MAX_MS = 10 * 60_000;
|
|
8
|
+
function commaSplit(input) {
|
|
9
|
+
if (!input)
|
|
10
|
+
return undefined;
|
|
11
|
+
return input
|
|
12
|
+
.split(",")
|
|
13
|
+
.map((s) => s.trim())
|
|
14
|
+
.filter(Boolean);
|
|
15
|
+
}
|
|
16
|
+
function parseFiltering(raw) {
|
|
17
|
+
if (!raw)
|
|
18
|
+
return undefined;
|
|
19
|
+
try {
|
|
20
|
+
return JSON.parse(raw);
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
handleMetaError(new Error("Invalid --filtering JSON"));
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
function pickLevel(args, preset) {
|
|
27
|
+
const level = args.level ?? preset?.level;
|
|
28
|
+
if (!level) {
|
|
29
|
+
handleMetaError(new Error("--level is required (account|campaign|adset|ad)"));
|
|
30
|
+
}
|
|
31
|
+
return level;
|
|
32
|
+
}
|
|
33
|
+
function pickFields(fieldsArg, preset) {
|
|
34
|
+
const fields = fieldsArg ?? preset?.fields;
|
|
35
|
+
if (!fields || fields.length === 0) {
|
|
36
|
+
handleMetaError(new Error("--fields is required (comma-separated, e.g. impressions,spend,ctr)"));
|
|
37
|
+
}
|
|
38
|
+
return fields;
|
|
39
|
+
}
|
|
40
|
+
function applyDateRange(body, args, preset) {
|
|
41
|
+
const range = getDateRange(args);
|
|
42
|
+
if (range.datePreset)
|
|
43
|
+
body.datePreset = range.datePreset;
|
|
44
|
+
if (range.since)
|
|
45
|
+
body.since = range.since;
|
|
46
|
+
if (range.until)
|
|
47
|
+
body.until = range.until;
|
|
48
|
+
if (!body.datePreset && !(body.since && body.until)) {
|
|
49
|
+
body.datePreset = preset?.defaultDatePreset ?? "last_7d";
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
function buildBodyFromArgs(args, preset) {
|
|
53
|
+
const fieldsArg = commaSplit(args.fields);
|
|
54
|
+
const breakdowns = commaSplit(args.breakdowns);
|
|
55
|
+
const actionBreakdowns = commaSplit(args["action-breakdowns"]);
|
|
56
|
+
const attributionWindows = commaSplit(args["attribution-windows"]);
|
|
57
|
+
const body = {
|
|
58
|
+
object: args.object,
|
|
59
|
+
level: pickLevel(args, preset),
|
|
60
|
+
fields: pickFields(fieldsArg, preset),
|
|
61
|
+
timeIncrement: args["time-increment"],
|
|
62
|
+
breakdowns: breakdowns ?? preset?.breakdowns,
|
|
63
|
+
actionBreakdowns: actionBreakdowns ?? preset?.actionBreakdowns,
|
|
64
|
+
filtering: parseFiltering(args.filtering),
|
|
65
|
+
attributionWindows: attributionWindows ?? preset?.attributionWindows,
|
|
66
|
+
useAccountAttributionSetting: Boolean(args["use-account-attribution"]),
|
|
67
|
+
useUnifiedAttributionSetting: Boolean(args["use-unified-attribution"]),
|
|
68
|
+
limit: args.limit ? Number(args.limit) : preset?.defaultLimit,
|
|
69
|
+
skipCache: Boolean(args["skip-cache"]),
|
|
70
|
+
};
|
|
71
|
+
applyDateRange(body, args, preset);
|
|
72
|
+
return body;
|
|
73
|
+
}
|
|
74
|
+
async function pollAsync(reportRunId) {
|
|
75
|
+
const start = Date.now();
|
|
76
|
+
while (Date.now() - start < POLL_MAX_MS) {
|
|
77
|
+
const status = await apiPost(`/api/ads/meta/insights/async/status?report-run-id=${encodeURIComponent(reportRunId)}`, {});
|
|
78
|
+
if (status.async_status === "Job Completed")
|
|
79
|
+
return;
|
|
80
|
+
if (status.async_status === "Job Failed" || status.async_status === "Job Skipped") {
|
|
81
|
+
handleMetaError(new Error(`Async insights job ${status.async_status}`));
|
|
82
|
+
}
|
|
83
|
+
process.stderr.write(`Async insights ${status.async_status ?? "queued"} (${Math.round(status.async_percent_completion ?? 0)}%)…\n`);
|
|
84
|
+
await new Promise((resolve) => setTimeout(resolve, POLL_INTERVAL_MS));
|
|
85
|
+
}
|
|
86
|
+
handleMetaError(new Error("Async insights polling timed out after 10 minutes"));
|
|
87
|
+
}
|
|
88
|
+
export const insightsCommand = defineCommand({
|
|
89
|
+
meta: {
|
|
90
|
+
name: "insights",
|
|
91
|
+
description: `Run Meta Marketing API insights queries.
|
|
92
|
+
|
|
93
|
+
Synchronous unless --async is set, or auto-fallback if Meta returns a "too large" error.
|
|
94
|
+
Use presets for the marketing team's standard reports.
|
|
95
|
+
|
|
96
|
+
Presets (run with --preset <name>):
|
|
97
|
+
${listPresets()
|
|
98
|
+
.map((p) => ` ${p.name} — ${p.description}`)
|
|
99
|
+
.join("\n")}
|
|
100
|
+
|
|
101
|
+
Examples:
|
|
102
|
+
baker ads meta insights --object act_123 --level ad --fields impressions,spend --date-preset last_7d
|
|
103
|
+
baker ads meta insights --object 6123456 --preset campaign-performance
|
|
104
|
+
baker ads meta insights --object act_123 --preset placement-breakdown --since 2026-01-01 --until 2026-03-31 --async
|
|
105
|
+
baker ads meta insights --object act_123 --level ad --fields ad_id,impressions \\
|
|
106
|
+
--filtering '[{"field":"spend","operator":"GREATER_THAN","value":0}]'`,
|
|
107
|
+
},
|
|
108
|
+
args: {
|
|
109
|
+
object: {
|
|
110
|
+
type: "string",
|
|
111
|
+
description: "Object ID — act_<id> for account, or campaign/adset/ad ID",
|
|
112
|
+
required: true,
|
|
113
|
+
},
|
|
114
|
+
level: { type: "string", description: "account|campaign|adset|ad" },
|
|
115
|
+
fields: { type: "string", description: "Comma-separated fields list" },
|
|
116
|
+
preset: { type: "string", description: "Insights preset name" },
|
|
117
|
+
"list-presets": { type: "boolean", description: "List available presets and exit" },
|
|
118
|
+
"date-preset": { type: "string", description: "Meta date preset (last_7d, last_28d, today, ...)" },
|
|
119
|
+
since: { type: "string", description: "Custom start date YYYY-MM-DD" },
|
|
120
|
+
until: { type: "string", description: "Custom end date YYYY-MM-DD" },
|
|
121
|
+
"time-increment": { type: "string", description: "1 (day) | monthly | all_days" },
|
|
122
|
+
breakdowns: { type: "string", description: "Comma-separated breakdowns" },
|
|
123
|
+
"action-breakdowns": { type: "string", description: "Comma-separated action_breakdowns" },
|
|
124
|
+
filtering: { type: "string", description: "JSON array of {field,operator,value}" },
|
|
125
|
+
"attribution-windows": {
|
|
126
|
+
type: "string",
|
|
127
|
+
description: "Comma-separated. Only 1d_view, 1d_click, 7d_click, 28d_click work as of Jan 2026",
|
|
128
|
+
},
|
|
129
|
+
"use-account-attribution": { type: "boolean", description: "Use account-saved attribution setting" },
|
|
130
|
+
"use-unified-attribution": { type: "boolean", description: "Use ad-set unified attribution setting" },
|
|
131
|
+
limit: { type: "string", description: "Max rows (default per preset)" },
|
|
132
|
+
async: { type: "boolean", description: "Submit as async job, poll, then dump results" },
|
|
133
|
+
"skip-cache": { type: "boolean", description: "Bypass server-side cache" },
|
|
134
|
+
output: { type: "string", description: "Output format", default: "json" },
|
|
135
|
+
},
|
|
136
|
+
run: async ({ args }) => {
|
|
137
|
+
if (args["list-presets"]) {
|
|
138
|
+
writeAdsJson({ ok: true, data: listPresets() });
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
const presetName = args.preset;
|
|
142
|
+
const preset = presetName ? getPreset(presetName) : undefined;
|
|
143
|
+
if (presetName && !preset) {
|
|
144
|
+
handleMetaError(new Error(`Unknown preset: ${presetName}. Use --list-presets.`));
|
|
145
|
+
}
|
|
146
|
+
const body = buildBodyFromArgs(args, preset);
|
|
147
|
+
try {
|
|
148
|
+
if (args.async) {
|
|
149
|
+
const submit = await apiPost("/api/ads/meta/insights/async", body);
|
|
150
|
+
process.stderr.write(`Submitted async insights job: ${submit.reportRunId}\n`);
|
|
151
|
+
await pollAsync(submit.reportRunId);
|
|
152
|
+
const result = await apiPost("/api/ads/meta/insights/async/result", {
|
|
153
|
+
reportRunId: submit.reportRunId,
|
|
154
|
+
fields: body.fields,
|
|
155
|
+
limit: body.limit,
|
|
156
|
+
});
|
|
157
|
+
const fmt = csvOrJson(args);
|
|
158
|
+
if (fmt !== "json") {
|
|
159
|
+
writeAdsOutput(result, fmt, body.fields);
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
writeAdsJson({ ok: true, data: result });
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
const data = await apiPost("/api/ads/meta/insights", body);
|
|
166
|
+
const fmt = csvOrJson(args);
|
|
167
|
+
if (fmt !== "json") {
|
|
168
|
+
writeAdsOutput(data, fmt, body.fields);
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
writeAdsJson({ ok: true, data });
|
|
172
|
+
}
|
|
173
|
+
catch (err) {
|
|
174
|
+
handleMetaError(err);
|
|
175
|
+
}
|
|
176
|
+
},
|
|
177
|
+
});
|
|
178
|
+
//# sourceMappingURL=insights.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"insights.js","sourceRoot":"","sources":["../../../../src/commands/ads/meta/insights.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export declare const labelsCommand: import("citty").CommandDef<{
|
|
2
|
+
readonly "account-id": {
|
|
3
|
+
readonly type: "string";
|
|
4
|
+
readonly description: "Meta ad account ID";
|
|
5
|
+
};
|
|
6
|
+
readonly "skip-cache": {
|
|
7
|
+
readonly type: "boolean";
|
|
8
|
+
readonly description: "Bypass server-side cache";
|
|
9
|
+
};
|
|
10
|
+
readonly output: {
|
|
11
|
+
readonly type: "string";
|
|
12
|
+
readonly description: "Output format";
|
|
13
|
+
readonly default: "json";
|
|
14
|
+
};
|
|
15
|
+
}>;
|
|
16
|
+
//# sourceMappingURL=labels.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"labels.d.ts","sourceRoot":"","sources":["../../../../src/commands/ads/meta/labels.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,aAAa;;;;;;;;;;;;;;EA0BxB,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { defineCommand } from "citty";
|
|
2
|
+
import { apiGet } from "../../../client.js";
|
|
3
|
+
import { writeAdsJson, writeAdsOutput } from "../output.js";
|
|
4
|
+
import { csvOrJson, handleMetaError, resolveAccountIdArg } from "./shared.js";
|
|
5
|
+
export const labelsCommand = defineCommand({
|
|
6
|
+
meta: {
|
|
7
|
+
name: "labels",
|
|
8
|
+
description: `List ad labels for a Meta ad account.`,
|
|
9
|
+
},
|
|
10
|
+
args: {
|
|
11
|
+
"account-id": { type: "string", description: "Meta ad account ID" },
|
|
12
|
+
"skip-cache": { type: "boolean", description: "Bypass server-side cache" },
|
|
13
|
+
output: { type: "string", description: "Output format", default: "json" },
|
|
14
|
+
},
|
|
15
|
+
run: async ({ args }) => {
|
|
16
|
+
const accountId = resolveAccountIdArg(args);
|
|
17
|
+
try {
|
|
18
|
+
const params = { "account-id": accountId };
|
|
19
|
+
if (args["skip-cache"])
|
|
20
|
+
params["skip-cache"] = "true";
|
|
21
|
+
const data = await apiGet("/api/ads/meta/labels", params);
|
|
22
|
+
const fmt = csvOrJson(args);
|
|
23
|
+
if (fmt !== "json") {
|
|
24
|
+
writeAdsOutput(data, fmt);
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
writeAdsJson({ ok: true, data });
|
|
28
|
+
}
|
|
29
|
+
catch (err) {
|
|
30
|
+
handleMetaError(err);
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
});
|
|
34
|
+
//# sourceMappingURL=labels.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"labels.js","sourceRoot":"","sources":["../../../../src/commands/ads/meta/labels.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAE9E,MAAM,CAAC,MAAM,aAAa,GAAG,aAAa,CAAC;IACzC,IAAI,EAAE;QACJ,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,uCAAuC;KACrD;IACD,IAAI,EAAE;QACJ,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,oBAAoB,EAAE;QACnE,YAAY,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,0BAA0B,EAAE;QAC1E,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,EAAE;KAC1E;IACD,GAAG,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;QACtB,MAAM,SAAS,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,CAAC;YACH,MAAM,MAAM,GAA2B,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC;YACnE,IAAI,IAAI,CAAC,YAAY,CAAC;gBAAE,MAAM,CAAC,YAAY,CAAC,GAAG,MAAM,CAAC;YACtD,MAAM,IAAI,GAAG,MAAM,MAAM,CAAiC,sBAAsB,EAAE,MAAM,CAAC,CAAC;YAC1F,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;YAC5B,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;gBACnB,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;gBAC1B,OAAO;YACT,CAAC;YACD,YAAY,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACnC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,eAAe,CAAC,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export declare const pixelsCommand: import("citty").CommandDef<{
|
|
2
|
+
readonly "account-id": {
|
|
3
|
+
readonly type: "string";
|
|
4
|
+
readonly description: "Meta ad account ID";
|
|
5
|
+
};
|
|
6
|
+
readonly "pixel-id": {
|
|
7
|
+
readonly type: "string";
|
|
8
|
+
readonly description: "Pixel ID for --stats";
|
|
9
|
+
};
|
|
10
|
+
readonly stats: {
|
|
11
|
+
readonly type: "boolean";
|
|
12
|
+
readonly description: "Fetch firing stats for the pixel";
|
|
13
|
+
};
|
|
14
|
+
readonly aggregation: {
|
|
15
|
+
readonly type: "string";
|
|
16
|
+
readonly description: "stats aggregation: event|browser_type|host|pixel_fire";
|
|
17
|
+
readonly default: "event";
|
|
18
|
+
};
|
|
19
|
+
readonly days: {
|
|
20
|
+
readonly type: "string";
|
|
21
|
+
readonly description: "Lookback days for --stats (default 7)";
|
|
22
|
+
};
|
|
23
|
+
readonly "skip-cache": {
|
|
24
|
+
readonly type: "boolean";
|
|
25
|
+
readonly description: "Bypass server-side cache";
|
|
26
|
+
};
|
|
27
|
+
readonly output: {
|
|
28
|
+
readonly type: "string";
|
|
29
|
+
readonly description: "Output format";
|
|
30
|
+
readonly default: "json";
|
|
31
|
+
};
|
|
32
|
+
}>;
|
|
33
|
+
//# sourceMappingURL=pixels.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pixels.d.ts","sourceRoot":"","sources":["../../../../src/commands/ads/meta/pixels.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4DxB,CAAC"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { defineCommand } from "citty";
|
|
2
|
+
import { apiGet } from "../../../client.js";
|
|
3
|
+
import { writeAdsJson, writeAdsOutput } from "../output.js";
|
|
4
|
+
import { csvOrJson, daysAgoIso, handleMetaError, resolveAccountIdArg, todayIso } from "./shared.js";
|
|
5
|
+
export const pixelsCommand = defineCommand({
|
|
6
|
+
meta: {
|
|
7
|
+
name: "pixels",
|
|
8
|
+
description: `List Meta Pixels for an ad account, or fetch firing stats for one pixel.
|
|
9
|
+
|
|
10
|
+
Examples:
|
|
11
|
+
baker ads meta pixels --account-id act_123
|
|
12
|
+
baker ads meta pixels --account-id act_123 --pixel-id 9876 --stats --days 7`,
|
|
13
|
+
},
|
|
14
|
+
args: {
|
|
15
|
+
"account-id": { type: "string", description: "Meta ad account ID" },
|
|
16
|
+
"pixel-id": { type: "string", description: "Pixel ID for --stats" },
|
|
17
|
+
stats: { type: "boolean", description: "Fetch firing stats for the pixel" },
|
|
18
|
+
aggregation: {
|
|
19
|
+
type: "string",
|
|
20
|
+
description: "stats aggregation: event|browser_type|host|pixel_fire",
|
|
21
|
+
default: "event",
|
|
22
|
+
},
|
|
23
|
+
days: { type: "string", description: "Lookback days for --stats (default 7)" },
|
|
24
|
+
"skip-cache": { type: "boolean", description: "Bypass server-side cache" },
|
|
25
|
+
output: { type: "string", description: "Output format", default: "json" },
|
|
26
|
+
},
|
|
27
|
+
run: async ({ args }) => {
|
|
28
|
+
try {
|
|
29
|
+
if (args.stats) {
|
|
30
|
+
const pixelId = args["pixel-id"];
|
|
31
|
+
if (!pixelId) {
|
|
32
|
+
handleMetaError(new Error("--pixel-id is required when --stats is set"));
|
|
33
|
+
}
|
|
34
|
+
const days = args.days ? Number(args.days) : 7;
|
|
35
|
+
const params = {
|
|
36
|
+
"pixel-id": pixelId,
|
|
37
|
+
aggregation: args.aggregation ?? "event",
|
|
38
|
+
"start-time": daysAgoIso(days),
|
|
39
|
+
"end-time": todayIso(),
|
|
40
|
+
};
|
|
41
|
+
if (args["skip-cache"])
|
|
42
|
+
params["skip-cache"] = "true";
|
|
43
|
+
const data = await apiGet("/api/ads/meta/pixel-stats", params);
|
|
44
|
+
const fmt = csvOrJson(args);
|
|
45
|
+
if (fmt !== "json") {
|
|
46
|
+
writeAdsOutput(data, fmt);
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
writeAdsJson({ ok: true, data });
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
const accountId = resolveAccountIdArg(args);
|
|
53
|
+
const params = { "account-id": accountId };
|
|
54
|
+
if (args["skip-cache"])
|
|
55
|
+
params["skip-cache"] = "true";
|
|
56
|
+
const data = await apiGet("/api/ads/meta/pixels", params);
|
|
57
|
+
const fmt = csvOrJson(args);
|
|
58
|
+
if (fmt !== "json") {
|
|
59
|
+
writeAdsOutput(data, fmt);
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
writeAdsJson({ ok: true, data });
|
|
63
|
+
}
|
|
64
|
+
catch (err) {
|
|
65
|
+
handleMetaError(err);
|
|
66
|
+
}
|
|
67
|
+
},
|
|
68
|
+
});
|
|
69
|
+
//# sourceMappingURL=pixels.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pixels.js","sourceRoot":"","sources":["../../../../src/commands/ads/meta/pixels.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,eAAe,EAAE,mBAAmB,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEpG,MAAM,CAAC,MAAM,aAAa,GAAG,aAAa,CAAC;IACzC,IAAI,EAAE;QACJ,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE;;;;8EAI6D;KAC3E;IACD,IAAI,EAAE;QACJ,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,oBAAoB,EAAE;QACnE,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,sBAAsB,EAAE;QACnE,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,kCAAkC,EAAE;QAC3E,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,uDAAuD;YACpE,OAAO,EAAE,OAAO;SACjB;QACD,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,uCAAuC,EAAE;QAC9E,YAAY,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,0BAA0B,EAAE;QAC1E,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,EAAE;KAC1E;IACD,GAAG,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;QACtB,IAAI,CAAC;YACH,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;gBACf,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAuB,CAAC;gBACvD,IAAI,CAAC,OAAO,EAAE,CAAC;oBACb,eAAe,CAAC,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC,CAAC;gBAC3E,CAAC;gBACD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC/C,MAAM,MAAM,GAA2B;oBACrC,UAAU,EAAE,OAAO;oBACnB,WAAW,EAAG,IAAI,CAAC,WAAsB,IAAI,OAAO;oBACpD,YAAY,EAAE,UAAU,CAAC,IAAI,CAAC;oBAC9B,UAAU,EAAE,QAAQ,EAAE;iBACvB,CAAC;gBACF,IAAI,IAAI,CAAC,YAAY,CAAC;oBAAE,MAAM,CAAC,YAAY,CAAC,GAAG,MAAM,CAAC;gBACtD,MAAM,IAAI,GAAG,MAAM,MAAM,CAAiC,2BAA2B,EAAE,MAAM,CAAC,CAAC;gBAC/F,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;gBAC5B,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;oBACnB,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;oBAC1B,OAAO;gBACT,CAAC;gBACD,YAAY,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;gBACjC,OAAO;YACT,CAAC;YACD,MAAM,SAAS,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;YAC5C,MAAM,MAAM,GAA2B,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC;YACnE,IAAI,IAAI,CAAC,YAAY,CAAC;gBAAE,MAAM,CAAC,YAAY,CAAC,GAAG,MAAM,CAAC;YACtD,MAAM,IAAI,GAAG,MAAM,MAAM,CAAiC,sBAAsB,EAAE,MAAM,CAAC,CAAC;YAC1F,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;YAC5B,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;gBACnB,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;gBAC1B,OAAO;YACT,CAAC;YACD,YAAY,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACnC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,eAAe,CAAC,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Meta-native insights presets. Names + fields chosen for our marketing team's
|
|
3
|
+
* review workflows — not parity-aligned with the Google Ads presets.
|
|
4
|
+
*/
|
|
5
|
+
export interface MetaInsightsPreset {
|
|
6
|
+
name: string;
|
|
7
|
+
description: string;
|
|
8
|
+
level: "account" | "campaign" | "adset" | "ad";
|
|
9
|
+
fields: string[];
|
|
10
|
+
breakdowns?: string[];
|
|
11
|
+
actionBreakdowns?: string[];
|
|
12
|
+
attributionWindows?: string[];
|
|
13
|
+
defaultDatePreset: string;
|
|
14
|
+
defaultLimit: number;
|
|
15
|
+
}
|
|
16
|
+
export declare function getPreset(name: string): MetaInsightsPreset | undefined;
|
|
17
|
+
export declare function listPresets(): MetaInsightsPreset[];
|
|
18
|
+
//# sourceMappingURL=presets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presets.d.ts","sourceRoot":"","sources":["../../../../src/commands/ads/meta/presets.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,SAAS,GAAG,UAAU,GAAG,OAAO,GAAG,IAAI,CAAC;IAC/C,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;CACtB;AAsGD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS,CAEtE;AAED,wBAAgB,WAAW,IAAI,kBAAkB,EAAE,CAElD"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Meta-native insights presets. Names + fields chosen for our marketing team's
|
|
3
|
+
* review workflows — not parity-aligned with the Google Ads presets.
|
|
4
|
+
*/
|
|
5
|
+
const META_INSIGHTS_PRESETS = {
|
|
6
|
+
"campaign-performance": {
|
|
7
|
+
name: "campaign-performance",
|
|
8
|
+
description: "Per-campaign spend, ROAS, and purchase metrics over the last 7 days.",
|
|
9
|
+
level: "campaign",
|
|
10
|
+
fields: [
|
|
11
|
+
"campaign_id",
|
|
12
|
+
"campaign_name",
|
|
13
|
+
"objective",
|
|
14
|
+
"impressions",
|
|
15
|
+
"spend",
|
|
16
|
+
"clicks",
|
|
17
|
+
"ctr",
|
|
18
|
+
"cpc",
|
|
19
|
+
"actions",
|
|
20
|
+
"action_values",
|
|
21
|
+
"purchase_roas",
|
|
22
|
+
],
|
|
23
|
+
actionBreakdowns: ["action_type"],
|
|
24
|
+
defaultDatePreset: "last_7d",
|
|
25
|
+
defaultLimit: 1000,
|
|
26
|
+
},
|
|
27
|
+
"creative-performance": {
|
|
28
|
+
name: "creative-performance",
|
|
29
|
+
description: "Per-ad ranking + delivery quality. Use to flag creatives for refresh.",
|
|
30
|
+
level: "ad",
|
|
31
|
+
fields: [
|
|
32
|
+
"ad_id",
|
|
33
|
+
"ad_name",
|
|
34
|
+
"campaign_name",
|
|
35
|
+
"adset_name",
|
|
36
|
+
"impressions",
|
|
37
|
+
"spend",
|
|
38
|
+
"ctr",
|
|
39
|
+
"cpc",
|
|
40
|
+
"quality_ranking",
|
|
41
|
+
"engagement_rate_ranking",
|
|
42
|
+
"conversion_rate_ranking",
|
|
43
|
+
],
|
|
44
|
+
defaultDatePreset: "last_7d",
|
|
45
|
+
defaultLimit: 2000,
|
|
46
|
+
},
|
|
47
|
+
"placement-breakdown": {
|
|
48
|
+
name: "placement-breakdown",
|
|
49
|
+
description: "Spend & CPM by Facebook/Instagram placement and device.",
|
|
50
|
+
level: "adset",
|
|
51
|
+
fields: ["adset_id", "adset_name", "impressions", "spend", "ctr", "cpm", "actions"],
|
|
52
|
+
breakdowns: ["publisher_platform", "platform_position", "impression_device"],
|
|
53
|
+
defaultDatePreset: "last_14d",
|
|
54
|
+
defaultLimit: 5000,
|
|
55
|
+
},
|
|
56
|
+
"device-breakdown": {
|
|
57
|
+
name: "device-breakdown",
|
|
58
|
+
description: "Conversion performance by device + OS.",
|
|
59
|
+
level: "ad",
|
|
60
|
+
fields: ["ad_id", "ad_name", "impressions", "clicks", "spend", "actions", "purchase_roas"],
|
|
61
|
+
breakdowns: ["device_platform", "impression_device"],
|
|
62
|
+
defaultDatePreset: "last_7d",
|
|
63
|
+
defaultLimit: 5000,
|
|
64
|
+
},
|
|
65
|
+
"audience-breakdown": {
|
|
66
|
+
name: "audience-breakdown",
|
|
67
|
+
description: "Demographic split (age/gender/country) at adset level.",
|
|
68
|
+
level: "adset",
|
|
69
|
+
fields: ["adset_id", "adset_name", "impressions", "spend", "actions"],
|
|
70
|
+
breakdowns: ["age", "gender", "country"],
|
|
71
|
+
defaultDatePreset: "last_28d",
|
|
72
|
+
defaultLimit: 10000,
|
|
73
|
+
},
|
|
74
|
+
funnel: {
|
|
75
|
+
name: "funnel",
|
|
76
|
+
description: "Impression → click → landing page view → lead/purchase funnel.",
|
|
77
|
+
level: "ad",
|
|
78
|
+
fields: ["ad_id", "ad_name", "impressions", "clicks", "inline_link_clicks", "actions", "action_values", "spend"],
|
|
79
|
+
actionBreakdowns: ["action_type"],
|
|
80
|
+
defaultDatePreset: "last_7d",
|
|
81
|
+
defaultLimit: 2000,
|
|
82
|
+
},
|
|
83
|
+
"video-performance": {
|
|
84
|
+
name: "video-performance",
|
|
85
|
+
description: "Video watch funnel and per-thruplay cost.",
|
|
86
|
+
level: "ad",
|
|
87
|
+
fields: [
|
|
88
|
+
"ad_id",
|
|
89
|
+
"ad_name",
|
|
90
|
+
"impressions",
|
|
91
|
+
"spend",
|
|
92
|
+
"video_play_actions",
|
|
93
|
+
"video_p25_watched_actions",
|
|
94
|
+
"video_p50_watched_actions",
|
|
95
|
+
"video_p75_watched_actions",
|
|
96
|
+
"video_p100_watched_actions",
|
|
97
|
+
"video_thruplay_watched_actions",
|
|
98
|
+
"cost_per_thruplay",
|
|
99
|
+
],
|
|
100
|
+
defaultDatePreset: "last_14d",
|
|
101
|
+
defaultLimit: 2000,
|
|
102
|
+
},
|
|
103
|
+
};
|
|
104
|
+
export function getPreset(name) {
|
|
105
|
+
return META_INSIGHTS_PRESETS[name];
|
|
106
|
+
}
|
|
107
|
+
export function listPresets() {
|
|
108
|
+
return Object.values(META_INSIGHTS_PRESETS);
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=presets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presets.js","sourceRoot":"","sources":["../../../../src/commands/ads/meta/presets.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAcH,MAAM,qBAAqB,GAAuC;IAChE,sBAAsB,EAAE;QACtB,IAAI,EAAE,sBAAsB;QAC5B,WAAW,EAAE,sEAAsE;QACnF,KAAK,EAAE,UAAU;QACjB,MAAM,EAAE;YACN,aAAa;YACb,eAAe;YACf,WAAW;YACX,aAAa;YACb,OAAO;YACP,QAAQ;YACR,KAAK;YACL,KAAK;YACL,SAAS;YACT,eAAe;YACf,eAAe;SAChB;QACD,gBAAgB,EAAE,CAAC,aAAa,CAAC;QACjC,iBAAiB,EAAE,SAAS;QAC5B,YAAY,EAAE,IAAI;KACnB;IACD,sBAAsB,EAAE;QACtB,IAAI,EAAE,sBAAsB;QAC5B,WAAW,EAAE,uEAAuE;QACpF,KAAK,EAAE,IAAI;QACX,MAAM,EAAE;YACN,OAAO;YACP,SAAS;YACT,eAAe;YACf,YAAY;YACZ,aAAa;YACb,OAAO;YACP,KAAK;YACL,KAAK;YACL,iBAAiB;YACjB,yBAAyB;YACzB,yBAAyB;SAC1B;QACD,iBAAiB,EAAE,SAAS;QAC5B,YAAY,EAAE,IAAI;KACnB;IACD,qBAAqB,EAAE;QACrB,IAAI,EAAE,qBAAqB;QAC3B,WAAW,EAAE,yDAAyD;QACtE,KAAK,EAAE,OAAO;QACd,MAAM,EAAE,CAAC,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,CAAC;QACnF,UAAU,EAAE,CAAC,oBAAoB,EAAE,mBAAmB,EAAE,mBAAmB,CAAC;QAC5E,iBAAiB,EAAE,UAAU;QAC7B,YAAY,EAAE,IAAI;KACnB;IACD,kBAAkB,EAAE;QAClB,IAAI,EAAE,kBAAkB;QACxB,WAAW,EAAE,wCAAwC;QACrD,KAAK,EAAE,IAAI;QACX,MAAM,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,eAAe,CAAC;QAC1F,UAAU,EAAE,CAAC,iBAAiB,EAAE,mBAAmB,CAAC;QACpD,iBAAiB,EAAE,SAAS;QAC5B,YAAY,EAAE,IAAI;KACnB;IACD,oBAAoB,EAAE;QACpB,IAAI,EAAE,oBAAoB;QAC1B,WAAW,EAAE,wDAAwD;QACrE,KAAK,EAAE,OAAO;QACd,MAAM,EAAE,CAAC,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,OAAO,EAAE,SAAS,CAAC;QACrE,UAAU,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,SAAS,CAAC;QACxC,iBAAiB,EAAE,UAAU;QAC7B,YAAY,EAAE,KAAK;KACpB;IACD,MAAM,EAAE;QACN,IAAI,EAAE,QAAQ;QACd,WAAW,EAAE,gEAAgE;QAC7E,KAAK,EAAE,IAAI;QACX,MAAM,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,QAAQ,EAAE,oBAAoB,EAAE,SAAS,EAAE,eAAe,EAAE,OAAO,CAAC;QAChH,gBAAgB,EAAE,CAAC,aAAa,CAAC;QACjC,iBAAiB,EAAE,SAAS;QAC5B,YAAY,EAAE,IAAI;KACnB;IACD,mBAAmB,EAAE;QACnB,IAAI,EAAE,mBAAmB;QACzB,WAAW,EAAE,2CAA2C;QACxD,KAAK,EAAE,IAAI;QACX,MAAM,EAAE;YACN,OAAO;YACP,SAAS;YACT,aAAa;YACb,OAAO;YACP,oBAAoB;YACpB,2BAA2B;YAC3B,2BAA2B;YAC3B,2BAA2B;YAC3B,4BAA4B;YAC5B,gCAAgC;YAChC,mBAAmB;SACpB;QACD,iBAAiB,EAAE,UAAU;QAC7B,YAAY,EAAE,IAAI;KACnB;CACF,CAAC;AAEF,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,OAAO,qBAAqB,CAAC,IAAI,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,OAAO,MAAM,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC;AAC9C,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export declare const previewCommand: import("citty").CommandDef<{
|
|
2
|
+
readonly "creative-id": {
|
|
3
|
+
readonly type: "string";
|
|
4
|
+
readonly description: "Existing creative ID";
|
|
5
|
+
};
|
|
6
|
+
readonly "ad-id": {
|
|
7
|
+
readonly type: "string";
|
|
8
|
+
readonly description: "Existing ad ID";
|
|
9
|
+
};
|
|
10
|
+
readonly "account-id": {
|
|
11
|
+
readonly type: "string";
|
|
12
|
+
readonly description: "Required when previewing an unpublished --creative spec";
|
|
13
|
+
};
|
|
14
|
+
readonly creative: {
|
|
15
|
+
readonly type: "string";
|
|
16
|
+
readonly description: "JSON spec of an unpublished creative (e.g. object_story_spec)";
|
|
17
|
+
};
|
|
18
|
+
readonly "ad-format": {
|
|
19
|
+
readonly type: "string";
|
|
20
|
+
readonly description: "Meta ad_format enum value";
|
|
21
|
+
readonly required: true;
|
|
22
|
+
};
|
|
23
|
+
readonly "out-file": {
|
|
24
|
+
readonly type: "string";
|
|
25
|
+
readonly description: "Save iframe HTML to this path";
|
|
26
|
+
};
|
|
27
|
+
readonly "skip-cache": {
|
|
28
|
+
readonly type: "boolean";
|
|
29
|
+
readonly description: "Bypass server-side cache";
|
|
30
|
+
};
|
|
31
|
+
}>;
|
|
32
|
+
//# sourceMappingURL=preview.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preview.d.ts","sourceRoot":"","sources":["../../../../src/commands/ads/meta/preview.ts"],"names":[],"mappings":"AAwCA,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6CzB,CAAC"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { writeFileSync } from "node:fs";
|
|
2
|
+
import { defineCommand } from "citty";
|
|
3
|
+
import { apiPost } from "../../../client.js";
|
|
4
|
+
import { writeAdsJson } from "../output.js";
|
|
5
|
+
import { handleMetaError } from "./shared.js";
|
|
6
|
+
const VALID_AD_FORMATS = [
|
|
7
|
+
"DESKTOP_FEED_STANDARD",
|
|
8
|
+
"MOBILE_FEED_STANDARD",
|
|
9
|
+
"MOBILE_FEED_BASIC",
|
|
10
|
+
"RIGHT_COLUMN_STANDARD",
|
|
11
|
+
"MOBILE_FULLWIDTH",
|
|
12
|
+
"MOBILE_INTERSTITIAL",
|
|
13
|
+
"MOBILE_BANNER",
|
|
14
|
+
"MOBILE_MEDIUM_RECTANGLE",
|
|
15
|
+
"MOBILE_NATIVE",
|
|
16
|
+
"FACEBOOK_STORY_MOBILE",
|
|
17
|
+
"FACEBOOK_REELS_MOBILE",
|
|
18
|
+
"INSTAGRAM_STORY",
|
|
19
|
+
"INSTAGRAM_REELS",
|
|
20
|
+
"INSTAGRAM_REELS_OVERLAY",
|
|
21
|
+
"INSTAGRAM_STANDARD",
|
|
22
|
+
"INSTAGRAM_EXPLORE_CONTEXTUAL",
|
|
23
|
+
"INSTAGRAM_EXPLORE_GRID_HOME",
|
|
24
|
+
"INSTAGRAM_SHOP",
|
|
25
|
+
"INSTAGRAM_PROFILE_FEED",
|
|
26
|
+
"INSTREAM_VIDEO_DESKTOP",
|
|
27
|
+
"INSTREAM_VIDEO_MOBILE",
|
|
28
|
+
"FACEBOOK_REELS_BANNER",
|
|
29
|
+
"FACEBOOK_REELS_STICKER",
|
|
30
|
+
"MESSENGER_MOBILE_INBOX_MEDIA",
|
|
31
|
+
"MESSENGER_MOBILE_STORY_MEDIA",
|
|
32
|
+
"AUDIENCE_NETWORK_OUTSTREAM_VIDEO",
|
|
33
|
+
"AUDIENCE_NETWORK_INSTREAM_VIDEO_MOBILE",
|
|
34
|
+
"AUDIENCE_NETWORK_REWARDED_VIDEO",
|
|
35
|
+
"INSTANT_ARTICLE_STANDARD",
|
|
36
|
+
"MARKETPLACE_MOBILE",
|
|
37
|
+
"BIZ_DISCO_FEED_MOBILE",
|
|
38
|
+
];
|
|
39
|
+
export const previewCommand = defineCommand({
|
|
40
|
+
meta: {
|
|
41
|
+
name: "preview",
|
|
42
|
+
description: `Generate a Meta-hosted preview iframe for a creative or ad. Returns iframe HTML which you
|
|
43
|
+
can embed or save to a file. The iframe URL contains a short-lived access token — treat as secret.
|
|
44
|
+
|
|
45
|
+
Examples:
|
|
46
|
+
baker ads meta preview --creative-id 6123 --ad-format MOBILE_FEED_STANDARD
|
|
47
|
+
baker ads meta preview --ad-id 9988 --ad-format INSTAGRAM_REELS --out-file /tmp/preview.html
|
|
48
|
+
baker ads meta preview --account-id act_123 --creative '{"object_story_spec":{...}}' --ad-format MOBILE_FEED_STANDARD`,
|
|
49
|
+
},
|
|
50
|
+
args: {
|
|
51
|
+
"creative-id": { type: "string", description: "Existing creative ID" },
|
|
52
|
+
"ad-id": { type: "string", description: "Existing ad ID" },
|
|
53
|
+
"account-id": { type: "string", description: "Required when previewing an unpublished --creative spec" },
|
|
54
|
+
creative: { type: "string", description: "JSON spec of an unpublished creative (e.g. object_story_spec)" },
|
|
55
|
+
"ad-format": { type: "string", description: "Meta ad_format enum value", required: true },
|
|
56
|
+
"out-file": { type: "string", description: "Save iframe HTML to this path" },
|
|
57
|
+
"skip-cache": { type: "boolean", description: "Bypass server-side cache" },
|
|
58
|
+
},
|
|
59
|
+
run: async ({ args }) => {
|
|
60
|
+
const adFormat = args["ad-format"];
|
|
61
|
+
if (!VALID_AD_FORMATS.includes(adFormat)) {
|
|
62
|
+
process.stderr.write(`Warning: ad-format "${adFormat}" not in known list — Meta may reject it\n`);
|
|
63
|
+
}
|
|
64
|
+
const body = { adFormat };
|
|
65
|
+
if (args["creative-id"])
|
|
66
|
+
body.creativeId = args["creative-id"];
|
|
67
|
+
if (args["ad-id"])
|
|
68
|
+
body.adId = args["ad-id"];
|
|
69
|
+
if (args["account-id"])
|
|
70
|
+
body.accountId = args["account-id"];
|
|
71
|
+
if (args.creative)
|
|
72
|
+
body.creative = args.creative;
|
|
73
|
+
if (args["skip-cache"])
|
|
74
|
+
body.skipCache = true;
|
|
75
|
+
try {
|
|
76
|
+
const data = await apiPost("/api/ads/meta/preview", body);
|
|
77
|
+
const html = data.map((d) => d.body).join("\n");
|
|
78
|
+
if (args["out-file"]) {
|
|
79
|
+
writeFileSync(args["out-file"], html, "utf-8");
|
|
80
|
+
writeAdsJson({ ok: true, data: { file: args["out-file"], rows: data.length } });
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
writeAdsJson({ ok: true, data });
|
|
84
|
+
}
|
|
85
|
+
catch (err) {
|
|
86
|
+
handleMetaError(err);
|
|
87
|
+
}
|
|
88
|
+
},
|
|
89
|
+
});
|
|
90
|
+
//# sourceMappingURL=preview.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preview.js","sourceRoot":"","sources":["../../../../src/commands/ads/meta/preview.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,MAAM,gBAAgB,GAAG;IACvB,uBAAuB;IACvB,sBAAsB;IACtB,mBAAmB;IACnB,uBAAuB;IACvB,kBAAkB;IAClB,qBAAqB;IACrB,eAAe;IACf,yBAAyB;IACzB,eAAe;IACf,uBAAuB;IACvB,uBAAuB;IACvB,iBAAiB;IACjB,iBAAiB;IACjB,yBAAyB;IACzB,oBAAoB;IACpB,8BAA8B;IAC9B,6BAA6B;IAC7B,gBAAgB;IAChB,wBAAwB;IACxB,wBAAwB;IACxB,uBAAuB;IACvB,uBAAuB;IACvB,wBAAwB;IACxB,8BAA8B;IAC9B,8BAA8B;IAC9B,kCAAkC;IAClC,wCAAwC;IACxC,iCAAiC;IACjC,0BAA0B;IAC1B,oBAAoB;IACpB,uBAAuB;CACxB,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,aAAa,CAAC;IAC1C,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,WAAW,EAAE;;;;;;wHAMuG;KACrH;IACD,IAAI,EAAE;QACJ,aAAa,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,sBAAsB,EAAE;QACtE,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,gBAAgB,EAAE;QAC1D,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,yDAAyD,EAAE;QACxG,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,+DAA+D,EAAE;QAC1G,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,2BAA2B,EAAE,QAAQ,EAAE,IAAI,EAAE;QACzF,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,+BAA+B,EAAE;QAC5E,YAAY,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,0BAA0B,EAAE;KAC3E;IACD,GAAG,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;QACtB,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAW,CAAC;QAC7C,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,uBAAuB,QAAQ,4CAA4C,CAAC,CAAC;QACpG,CAAC;QACD,MAAM,IAAI,GAA4B,EAAE,QAAQ,EAAE,CAAC;QACnD,IAAI,IAAI,CAAC,aAAa,CAAC;YAAE,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC;QAC/D,IAAI,IAAI,CAAC,OAAO,CAAC;YAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;QAC7C,IAAI,IAAI,CAAC,YAAY,CAAC;YAAE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC;QAC5D,IAAI,IAAI,CAAC,QAAQ;YAAE,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QACjD,IAAI,IAAI,CAAC,YAAY,CAAC;YAAE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QAE9C,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,OAAO,CAA0B,uBAAuB,EAAE,IAAI,CAAC,CAAC;YACnF,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAChD,IAAI,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;gBACrB,aAAa,CAAC,IAAI,CAAC,UAAU,CAAW,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;gBACzD,YAAY,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;gBAChF,OAAO;YACT,CAAC;YACD,YAAY,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACnC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,eAAe,CAAC,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;CACF,CAAC,CAAC"}
|