@koda-sl/baker-cli 0.526.0 → 0.528.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 +2 -0
- package/dist/{account-APMJVG2F.js → account-CQJFUII3.js} +3 -3
- package/dist/{account-APMJVG2F.js.map → account-CQJFUII3.js.map} +1 -1
- package/dist/{account-assets-TAUEBCY5.js → account-assets-IDVG4DGK.js} +12 -12
- package/dist/account-assets-IDVG4DGK.js.map +1 -0
- package/dist/{account-level-2MYDHOID.js → account-level-GK7M2MMQ.js} +14 -14
- package/dist/account-level-GK7M2MMQ.js.map +1 -0
- package/dist/{accounts-VIAQC3PA.js → accounts-KRW3JNCW.js} +2 -2
- package/dist/{activities-MJMAV3SI.js → activities-2RAJXP3J.js} +3 -3
- package/dist/{activities-MJMAV3SI.js.map → activities-2RAJXP3J.js.map} +1 -1
- package/dist/{ads-O4RL4JXD.js → ads-6ESCXPHK.js} +3 -3
- package/dist/{ads-NNKUR4HG.js → ads-JVBLNTBF.js} +20 -15
- package/dist/ads-JVBLNTBF.js.map +1 -0
- package/dist/{adsets-VO5C7PDM.js → adsets-FN5ZWSYF.js} +11 -11
- package/dist/adsets-FN5ZWSYF.js.map +1 -0
- package/dist/{asset-writes-PQNENVYY.js → asset-writes-SSI3CO2A.js} +4 -4
- package/dist/{audience-writes-QDDADCYE.js → audience-writes-G64754LR.js} +6 -6
- package/dist/audience-writes-G64754LR.js.map +1 -0
- package/dist/{audiences-TQ5ZEWIR.js → audiences-JAVNJ5NC.js} +8 -8
- package/dist/audiences-JAVNJ5NC.js.map +1 -0
- package/dist/{businesses-CW4RB36R.js → businesses-DXRDQIFP.js} +2 -2
- package/dist/{campaigns-IQYYYD2S.js → campaigns-GQWFSKGC.js} +11 -11
- package/dist/campaigns-GQWFSKGC.js.map +1 -0
- package/dist/{catalogs-PLBY32BE.js → catalogs-TBRONC2D.js} +15 -15
- package/dist/catalogs-TBRONC2D.js.map +1 -0
- package/dist/{chunk-OEJNZSJG.js → chunk-4XXA4WCS.js} +4 -4
- package/dist/chunk-4XXA4WCS.js.map +1 -0
- package/dist/{chunk-HPAGYPAF.js → chunk-BN4TDL5L.js} +65 -23
- package/dist/chunk-BN4TDL5L.js.map +1 -0
- package/dist/{chunk-5LN7GWRE.js → chunk-GEFZVG4P.js} +10 -10
- package/dist/chunk-GEFZVG4P.js.map +1 -0
- package/dist/{chunk-XB2FODWU.js → chunk-TKDOVFO6.js} +2 -2
- package/dist/cli.js +1 -1
- package/dist/{copy-writes-GZ744FHU.js → copy-writes-EUFEVWDW.js} +5 -5
- package/dist/{copy-writes-GZ744FHU.js.map → copy-writes-EUFEVWDW.js.map} +1 -1
- package/dist/{creatives-GTRQAZSB.js → creatives-6VJDUHEY.js} +6 -6
- package/dist/creatives-6VJDUHEY.js.map +1 -0
- package/dist/{custom-conversions-VQ3LBWYV.js → custom-conversions-NDY5RHSM.js} +6 -6
- package/dist/{custom-conversions-VQ3LBWYV.js.map → custom-conversions-NDY5RHSM.js.map} +1 -1
- package/dist/{draft-ME4TNPO7.js → draft-G432FJ7N.js} +2 -2
- package/dist/{insights-INIFHYR7.js → insights-IVW6W5CP.js} +2 -2
- package/dist/{instant-experiences-NMJUWNP3.js → instant-experiences-6F6GXZ67.js} +5 -5
- package/dist/{instant-experiences-NMJUWNP3.js.map → instant-experiences-6F6GXZ67.js.map} +1 -1
- package/dist/{leads-QBWR7FKT.js → leads-CJKRKB2Q.js} +6 -6
- package/dist/{leads-QBWR7FKT.js.map → leads-CJKRKB2Q.js.map} +1 -1
- package/dist/{media-23IW442U.js → media-HDHZULQ7.js} +3 -3
- package/dist/{meta-H3KBPU33.js → meta-MOSJVYIE.js} +38 -38
- package/dist/{page-photos-SHIGXDYE.js → page-photos-4JTIKXAW.js} +5 -5
- package/dist/page-photos-4JTIKXAW.js.map +1 -0
- package/dist/{pages-XJF3FBOJ.js → pages-BAUS7LQM.js} +2 -2
- package/dist/{performance-L3Q57H4H.js → performance-6XFKDJGY.js} +11 -2
- package/dist/performance-6XFKDJGY.js.map +1 -0
- package/dist/{pixels-AZCIWWXK.js → pixels-QOSEYXCP.js} +3 -3
- package/dist/pixels-QOSEYXCP.js.map +1 -0
- package/dist/{preview-BIEVHIDJ.js → preview-X6EJGPAY.js} +2 -2
- package/dist/{rule-writes-QLZNJ7CT.js → rule-writes-A4BFYHPA.js} +7 -7
- package/dist/rule-writes-A4BFYHPA.js.map +1 -0
- package/dist/{rules-FJHYG4SJ.js → rules-HLREXY2M.js} +11 -11
- package/dist/rules-HLREXY2M.js.map +1 -0
- package/dist/{shared-HY2VP7PT.js → shared-I3SB77VH.js} +2 -2
- package/dist/{studies-Z2ZIWLTO.js → studies-IGOCWM7F.js} +7 -7
- package/dist/{studies-Z2ZIWLTO.js.map → studies-IGOCWM7F.js.map} +1 -1
- package/dist/{study-writes-V7BXLTQG.js → study-writes-Z5P2W7JH.js} +6 -6
- package/dist/study-writes-Z5P2W7JH.js.map +1 -0
- package/dist/{targeting-YBIWD27C.js → targeting-7HXKBXWY.js} +12 -12
- package/dist/targeting-7HXKBXWY.js.map +1 -0
- package/dist/{write-commands-R5SN6CVQ.js → write-commands-CY734U34.js} +22 -22
- package/dist/write-commands-CY734U34.js.map +1 -0
- package/package.json +1 -1
- package/dist/account-assets-TAUEBCY5.js.map +0 -1
- package/dist/account-level-2MYDHOID.js.map +0 -1
- package/dist/ads-NNKUR4HG.js.map +0 -1
- package/dist/adsets-VO5C7PDM.js.map +0 -1
- package/dist/audience-writes-QDDADCYE.js.map +0 -1
- package/dist/audiences-TQ5ZEWIR.js.map +0 -1
- package/dist/campaigns-IQYYYD2S.js.map +0 -1
- package/dist/catalogs-PLBY32BE.js.map +0 -1
- package/dist/chunk-5LN7GWRE.js.map +0 -1
- package/dist/chunk-HPAGYPAF.js.map +0 -1
- package/dist/chunk-OEJNZSJG.js.map +0 -1
- package/dist/creatives-GTRQAZSB.js.map +0 -1
- package/dist/page-photos-SHIGXDYE.js.map +0 -1
- package/dist/performance-L3Q57H4H.js.map +0 -1
- package/dist/pixels-AZCIWWXK.js.map +0 -1
- package/dist/rule-writes-QLZNJ7CT.js.map +0 -1
- package/dist/rules-FJHYG4SJ.js.map +0 -1
- package/dist/study-writes-V7BXLTQG.js.map +0 -1
- package/dist/targeting-YBIWD27C.js.map +0 -1
- package/dist/write-commands-R5SN6CVQ.js.map +0 -1
- /package/dist/{accounts-VIAQC3PA.js.map → accounts-KRW3JNCW.js.map} +0 -0
- /package/dist/{ads-O4RL4JXD.js.map → ads-6ESCXPHK.js.map} +0 -0
- /package/dist/{asset-writes-PQNENVYY.js.map → asset-writes-SSI3CO2A.js.map} +0 -0
- /package/dist/{businesses-CW4RB36R.js.map → businesses-DXRDQIFP.js.map} +0 -0
- /package/dist/{chunk-XB2FODWU.js.map → chunk-TKDOVFO6.js.map} +0 -0
- /package/dist/{draft-ME4TNPO7.js.map → draft-G432FJ7N.js.map} +0 -0
- /package/dist/{insights-INIFHYR7.js.map → insights-IVW6W5CP.js.map} +0 -0
- /package/dist/{media-23IW442U.js.map → media-HDHZULQ7.js.map} +0 -0
- /package/dist/{meta-H3KBPU33.js.map → meta-MOSJVYIE.js.map} +0 -0
- /package/dist/{pages-XJF3FBOJ.js.map → pages-BAUS7LQM.js.map} +0 -0
- /package/dist/{preview-BIEVHIDJ.js.map → preview-X6EJGPAY.js.map} +0 -0
- /package/dist/{shared-HY2VP7PT.js.map → shared-I3SB77VH.js.map} +0 -0
|
@@ -11,7 +11,7 @@ import {
|
|
|
11
11
|
resolveAccountIdArg,
|
|
12
12
|
resolveEffectiveStatus,
|
|
13
13
|
statusFilterHints
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-BN4TDL5L.js";
|
|
15
15
|
import "./chunk-QALAJNBG.js";
|
|
16
16
|
import "./chunk-HPDGVK6R.js";
|
|
17
17
|
import {
|
|
@@ -28,8 +28,12 @@ import "./chunk-YQSBHWOI.js";
|
|
|
28
28
|
|
|
29
29
|
// src/commands/ads/meta/ads.ts
|
|
30
30
|
import { defineCommand } from "citty";
|
|
31
|
+
var ACCOUNT_SELECTION = "Account: --account-id, else BAKER_META_AD_ACCOUNT_ID, else the company's only connected Meta ad account. With several connected it refuses with MISSING_ACCOUNT_ID listing each \u2014 re-run naming one.";
|
|
31
32
|
var listArgs = {
|
|
32
|
-
"account-id": {
|
|
33
|
+
"account-id": {
|
|
34
|
+
type: "string",
|
|
35
|
+
description: "Meta ad account ID (act_123). Optional when the company connected only one account (or BAKER_META_AD_ACCOUNT_ID is set); required when several are connected."
|
|
36
|
+
},
|
|
33
37
|
"adset-id": { type: "string", description: "Filter to one adset" },
|
|
34
38
|
"campaign-id": { type: "string", description: "Filter to one campaign" },
|
|
35
39
|
"effective-status": { type: "string", description: "Comma-separated effective_status filter (overrides default)" },
|
|
@@ -41,17 +45,17 @@ var listArgs = {
|
|
|
41
45
|
};
|
|
42
46
|
registerMetaListSchema(
|
|
43
47
|
"ads",
|
|
44
|
-
|
|
48
|
+
`List ads in a Meta ad account, as a table by default: id, name, adset_id, campaign_id, effective_status, creative_id, issues (why an ad is WITH_ISSUES), created_time. Start here: baker ads meta ads --adset-id 6123. --fields takes dotted paths (e.g. id,tracking_specs); --full returns every field Meta sent; --output json returns the rows in the envelope. ${ACCOUNT_SELECTION}`,
|
|
45
49
|
listArgs
|
|
46
50
|
);
|
|
47
51
|
var listCommand = defineCommand({
|
|
48
52
|
meta: {
|
|
49
53
|
name: "list",
|
|
50
|
-
description:
|
|
54
|
+
description: `List ads in a Meta ad account. Runs by default when no subcommand is given. ${ACCOUNT_SELECTION} Example: baker ads meta ads --account-id act_123`
|
|
51
55
|
},
|
|
52
56
|
args: listArgs,
|
|
53
57
|
run: async ({ args }) => {
|
|
54
|
-
const accountId = resolveAccountIdArg(args);
|
|
58
|
+
const accountId = await resolveAccountIdArg(args);
|
|
55
59
|
const effectiveStatus = resolveEffectiveStatus(args);
|
|
56
60
|
try {
|
|
57
61
|
const params = { "account-id": accountId };
|
|
@@ -74,6 +78,7 @@ var adsListCommand = defineCommand({
|
|
|
74
78
|
name: "ads",
|
|
75
79
|
description: `List ads in a Meta ad account, or stage writes (create/update/pause/resume/archive/delete/duplicate/copy/retag).
|
|
76
80
|
Defaults to ACTIVE only \u2014 pass --all-statuses to widen. Write subcommands stage ops on this chat's draft.
|
|
81
|
+
${ACCOUNT_SELECTION}
|
|
77
82
|
|
|
78
83
|
The dashboard shows effective_status (e.g. WITH_ISSUES, PENDING_REVIEW, DISAPPROVED, ADSET_PAUSED), not status.
|
|
79
84
|
|
|
@@ -92,15 +97,15 @@ Examples:
|
|
|
92
97
|
},
|
|
93
98
|
subCommands: {
|
|
94
99
|
list: listCommand,
|
|
95
|
-
create: () => import("./write-commands-
|
|
96
|
-
update: () => import("./write-commands-
|
|
97
|
-
pause: () => import("./write-commands-
|
|
98
|
-
resume: () => import("./write-commands-
|
|
99
|
-
archive: () => import("./write-commands-
|
|
100
|
-
delete: () => import("./write-commands-
|
|
101
|
-
duplicate: () => import("./write-commands-
|
|
102
|
-
copy: () => import("./copy-writes-
|
|
103
|
-
retag: () => import("./write-commands-
|
|
100
|
+
create: () => import("./write-commands-CY734U34.js").then((m) => m.adsCreateCommand),
|
|
101
|
+
update: () => import("./write-commands-CY734U34.js").then((m) => m.adsUpdateCommand),
|
|
102
|
+
pause: () => import("./write-commands-CY734U34.js").then((m) => m.adsPauseCommand),
|
|
103
|
+
resume: () => import("./write-commands-CY734U34.js").then((m) => m.adsResumeCommand),
|
|
104
|
+
archive: () => import("./write-commands-CY734U34.js").then((m) => m.adsArchiveCommand),
|
|
105
|
+
delete: () => import("./write-commands-CY734U34.js").then((m) => m.adsDeleteCommand),
|
|
106
|
+
duplicate: () => import("./write-commands-CY734U34.js").then((m) => m.adsDuplicateCommand),
|
|
107
|
+
copy: () => import("./copy-writes-EUFEVWDW.js").then((m) => m.adsCopyCommand),
|
|
108
|
+
retag: () => import("./write-commands-CY734U34.js").then((m) => m.adsRetagCommand)
|
|
104
109
|
},
|
|
105
110
|
// `args` stays even though the parent has no `run`: citty scans rawArgs for the
|
|
106
111
|
// subcommand name using THIS command's arg defs, so without them `--account-id act_1`
|
|
@@ -112,4 +117,4 @@ Examples:
|
|
|
112
117
|
export {
|
|
113
118
|
adsListCommand
|
|
114
119
|
};
|
|
115
|
-
//# sourceMappingURL=ads-
|
|
120
|
+
//# sourceMappingURL=ads-JVBLNTBF.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/ads/meta/ads.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport { NO_CACHE_ARG } from \"../../../cache-flag.ts\";\nimport { apiGet } from \"../../../client.ts\";\nimport { META_LIST_SHAPE_ARGS, registerMetaListSchema, shapeMetaListRows, writeMetaListRows } from \"./list-rows.ts\";\nimport {\n csvOrJson,\n handleMetaError,\n NAME_CONTAINS_ARG,\n resolveAccountIdArg,\n resolveEffectiveStatus,\n statusFilterHints,\n} from \"./shared.ts\";\n\nconst ACCOUNT_SELECTION =\n \"Account: --account-id, else BAKER_META_AD_ACCOUNT_ID, else the company's only connected Meta ad account. With several connected it refuses with MISSING_ACCOUNT_ID listing each — re-run naming one.\";\n\nconst listArgs = {\n \"account-id\": {\n type: \"string\",\n description:\n \"Meta ad account ID (act_123). Optional when the company connected only one account (or BAKER_META_AD_ACCOUNT_ID is set); required when several are connected.\",\n },\n \"adset-id\": { type: \"string\", description: \"Filter to one adset\" },\n \"campaign-id\": { type: \"string\", description: \"Filter to one campaign\" },\n \"effective-status\": { type: \"string\", description: \"Comma-separated effective_status filter (overrides default)\" },\n \"all-statuses\": { type: \"boolean\", description: \"Drop the default ACTIVE filter\" },\n \"name-contains\": NAME_CONTAINS_ARG,\n limit: { type: \"string\", description: \"Max rows (default 1000)\" },\n \"no-cache\": NO_CACHE_ARG,\n ...META_LIST_SHAPE_ARGS,\n} as const;\n\nregisterMetaListSchema(\n \"ads\",\n `List ads in a Meta ad account, as a table by default: id, name, adset_id, campaign_id, effective_status, creative_id, issues (why an ad is WITH_ISSUES), created_time. Start here: baker ads meta ads --adset-id 6123. --fields takes dotted paths (e.g. id,tracking_specs); --full returns every field Meta sent; --output json returns the rows in the envelope. ${ACCOUNT_SELECTION}`,\n listArgs,\n);\n\nconst listCommand = defineCommand({\n meta: {\n name: \"list\",\n description: `List ads in a Meta ad account. Runs by default when no subcommand is given. ${ACCOUNT_SELECTION} Example: baker ads meta ads --account-id act_123`,\n },\n args: listArgs,\n run: async ({ args }) => {\n const accountId = await resolveAccountIdArg(args);\n const effectiveStatus = resolveEffectiveStatus(args);\n try {\n const params: Record<string, string> = { \"account-id\": accountId };\n if (args[\"adset-id\"]) params[\"adset-id\"] = args[\"adset-id\"] as string;\n if (args[\"campaign-id\"]) params[\"campaign-id\"] = args[\"campaign-id\"] as string;\n if (effectiveStatus) params[\"effective-status\"] = effectiveStatus;\n if (args[\"name-contains\"]) params[\"name-contains\"] = args[\"name-contains\"] as string;\n if (args.limit) params.limit = args.limit as string;\n if (args[\"no-cache\"]) params[\"skip-cache\"] = \"true\";\n const data = await apiGet<Array<Record<string, unknown>>>(\"/api/ads/meta/ads\", params);\n const shaped = shapeMetaListRows(\"ads\", data, args);\n writeMetaListRows(\"ads\", shaped, csvOrJson(args), statusFilterHints(data, effectiveStatus, \"ads\"));\n } catch (err) {\n handleMetaError(err);\n }\n },\n});\n\nexport const adsListCommand = defineCommand({\n meta: {\n name: \"ads\",\n description: `List ads in a Meta ad account, or stage writes (create/update/pause/resume/archive/delete/duplicate/copy/retag).\nDefaults to ACTIVE only — pass --all-statuses to widen. Write subcommands stage ops on this chat's draft.\n${ACCOUNT_SELECTION}\n\nThe dashboard shows effective_status (e.g. WITH_ISSUES, PENDING_REVIEW, DISAPPROVED, ADSET_PAUSED), not status.\n\nListings print a table by default: id, name, adset_id, campaign_id, effective_status, creative_id, issues\n(why an ad is WITH_ISSUES), created_time. --fields takes dotted paths (e.g. tracking_specs,\npreview_shareable_link); --full returns every field; --output json returns the rows as JSON.\n\nExamples:\n baker ads meta ads --account-id act_123\n baker ads meta ads --adset-id 6123\n baker ads meta ads --account-id act_123 --all-statuses --name-contains octubre --fields id,name,adset_id,creative_id — find one ad by name\n baker ads meta ads --adset-id 6123 --fields id,name,preview_shareable_link\n baker ads meta ads create --name \"Ad 1\" --adset meta_temp_as01 --creative meta_temp_cr01\n baker ads meta ads pause 6123 --account-id act_123\n baker ads meta ads retag 6123 --set \"utm_medium=paid-social\" — fix tracking on a LIVE ad, keeping everything else`,\n },\n subCommands: {\n list: listCommand,\n create: () => import(\"./write-commands.ts\").then((m) => m.adsCreateCommand),\n update: () => import(\"./write-commands.ts\").then((m) => m.adsUpdateCommand),\n pause: () => import(\"./write-commands.ts\").then((m) => m.adsPauseCommand),\n resume: () => import(\"./write-commands.ts\").then((m) => m.adsResumeCommand),\n archive: () => import(\"./write-commands.ts\").then((m) => m.adsArchiveCommand),\n delete: () => import(\"./write-commands.ts\").then((m) => m.adsDeleteCommand),\n duplicate: () => import(\"./write-commands.ts\").then((m) => m.adsDuplicateCommand),\n copy: () => import(\"./copy-writes.ts\").then((m) => m.adsCopyCommand),\n retag: () => import(\"./write-commands.ts\").then((m) => m.adsRetagCommand),\n },\n // `args` stays even though the parent has no `run`: citty scans rawArgs for the\n // subcommand name using THIS command's arg defs, so without them `--account-id act_1`\n // would read `act_1` as a subcommand. `default` (not `run`) dispatches the bare\n // invocation — citty falls through to `run` after a subcommand, double-executing it.\n args: listArgs,\n default: \"list\",\n});\n"],"mappings":"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","names":[]}
|
|
@@ -19,7 +19,7 @@ import {
|
|
|
19
19
|
resolveAccountIdArg,
|
|
20
20
|
resolveEffectiveStatus,
|
|
21
21
|
statusFilterHints
|
|
22
|
-
} from "./chunk-
|
|
22
|
+
} from "./chunk-BN4TDL5L.js";
|
|
23
23
|
import {
|
|
24
24
|
rememberedJev
|
|
25
25
|
} from "./chunk-FBG3JDET.js";
|
|
@@ -113,7 +113,7 @@ var listCommand = defineCommand({
|
|
|
113
113
|
},
|
|
114
114
|
args: listArgs,
|
|
115
115
|
run: async ({ args }) => {
|
|
116
|
-
const accountId = resolveAccountIdArg(args);
|
|
116
|
+
const accountId = await resolveAccountIdArg(args);
|
|
117
117
|
const effectiveStatus = resolveEffectiveStatus(args);
|
|
118
118
|
try {
|
|
119
119
|
const params = { "account-id": accountId };
|
|
@@ -160,14 +160,14 @@ Examples:
|
|
|
160
160
|
},
|
|
161
161
|
subCommands: {
|
|
162
162
|
list: listCommand,
|
|
163
|
-
create: () => import("./write-commands-
|
|
164
|
-
update: () => import("./write-commands-
|
|
165
|
-
pause: () => import("./write-commands-
|
|
166
|
-
resume: () => import("./write-commands-
|
|
167
|
-
archive: () => import("./write-commands-
|
|
168
|
-
delete: () => import("./write-commands-
|
|
169
|
-
duplicate: () => import("./write-commands-
|
|
170
|
-
copy: () => import("./copy-writes-
|
|
163
|
+
create: () => import("./write-commands-CY734U34.js").then((m) => m.adSetsCreateCommand),
|
|
164
|
+
update: () => import("./write-commands-CY734U34.js").then((m) => m.adSetsUpdateCommand),
|
|
165
|
+
pause: () => import("./write-commands-CY734U34.js").then((m) => m.adSetsPauseCommand),
|
|
166
|
+
resume: () => import("./write-commands-CY734U34.js").then((m) => m.adSetsResumeCommand),
|
|
167
|
+
archive: () => import("./write-commands-CY734U34.js").then((m) => m.adSetsArchiveCommand),
|
|
168
|
+
delete: () => import("./write-commands-CY734U34.js").then((m) => m.adSetsDeleteCommand),
|
|
169
|
+
duplicate: () => import("./write-commands-CY734U34.js").then((m) => m.adSetsDuplicateCommand),
|
|
170
|
+
copy: () => import("./copy-writes-EUFEVWDW.js").then((m) => m.adSetsCopyCommand)
|
|
171
171
|
},
|
|
172
172
|
// `args` stays even though the parent has no `run`: citty scans rawArgs for the
|
|
173
173
|
// subcommand name using THIS command's arg defs, so without them `--account-id act_1`
|
|
@@ -179,4 +179,4 @@ Examples:
|
|
|
179
179
|
export {
|
|
180
180
|
adsetsCommand
|
|
181
181
|
};
|
|
182
|
-
//# sourceMappingURL=adsets-
|
|
182
|
+
//# sourceMappingURL=adsets-FN5ZWSYF.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/ads/meta/adsets.ts"],"sourcesContent":["import path from \"node:path\";\nimport { defineCommand } from \"citty\";\nimport { readAudienceNames } from \"../../../audience-names.ts\";\nimport { NO_CACHE_ARG } from \"../../../cache-flag.ts\";\nimport { apiGet } from \"../../../client.ts\";\nimport { rememberedJev } from \"../../../engine/lib/remembered-nouls.ts\";\nimport type { ReviewUsage } from \"../../../engine/nodes/local/lib/render-review.ts\";\nimport { findWorkspaceRoot } from \"../../canvas/normalize-paths.ts\";\nimport { holdUnbilledSpend } from \"../../canvas/unbilled-spend.ts\";\nimport { writeAdsOutput } from \"../output.ts\";\nimport { adSetViewerRows, audienceNamesOf, flattenViewerRows, VIEWER_TABLE_COLUMNS } from \"./adset-viewers.ts\";\nimport {\n budgetUnitHints,\n META_LIST_SHAPE_ARGS,\n registerMetaListSchema,\n shapeMetaListRows,\n writeMetaListRows,\n} from \"./list-rows.ts\";\nimport {\n csvOrJson,\n handleMetaError,\n NAME_CONTAINS_ARG,\n resolveAccountIdArg,\n resolveEffectiveStatus,\n statusFilterHints,\n} from \"./shared.ts\";\n\nconst listArgs = {\n \"account-id\": { type: \"string\", description: \"Meta ad account ID\" },\n \"campaign-id\": { type: \"string\", description: \"Filter to one campaign\" },\n \"effective-status\": { type: \"string\", description: \"Comma-separated effective_status filter (overrides default)\" },\n \"all-statuses\": { type: \"boolean\", description: \"Drop the default ACTIVE filter\" },\n \"name-contains\": NAME_CONTAINS_ARG,\n limit: { type: \"string\", description: \"Max rows (default 1000)\" },\n \"no-cache\": NO_CACHE_ARG,\n audience: {\n type: \"boolean\",\n description:\n \"Who each ad set reaches, instead of the compact row: a viewer per ad set — temperature (cold|warm|hot), what they already know (brand/offer/product), placements, and the reasons, read from its targeting, the account's audiences and the campaign objective. Start here before writing an ad for an ad set: baker ads meta adsets --campaign-id 6123 --audience --output json\",\n },\n ...META_LIST_SHAPE_ARGS,\n} as const;\n\ntype MetaRow = Record<string, unknown>;\n\n/**\n * The audience list and the campaign objectives only sharpen the read: without them\n * each audience is read from its name and the objective is left out, so a refused\n * read degrades the viewer rather than failing the listing.\n */\nasync function readOrEmpty(path: string, params: Record<string, string>, label: string, hints: string[]) {\n try {\n return await apiGet<MetaRow[]>(path, params);\n } catch (err) {\n const message = err instanceof Error ? err.message : \"unknown error\";\n hints.push(`Could not read the account's ${label} (${message}); the viewer was read without them.`);\n return [];\n }\n}\n\nasync function writeAdSetViewers(\n adSets: MetaRow[],\n accountParams: Record<string, string>,\n format: string,\n hints: string[],\n): Promise<void> {\n const [audiences, campaigns] = await Promise.all([\n readOrEmpty(\"/api/ads/meta/audiences\", accountParams, \"audiences\", hints),\n readOrEmpty(\"/api/ads/meta/campaigns\", accountParams, \"campaigns\", hints),\n ]);\n const root = findWorkspaceRoot(process.cwd()) ?? process.cwd();\n const cacheDir = path.join(root, \"canvas\", \".cache\");\n const spent: ReviewUsage[] = [];\n const readName = await readAudienceNames(\n audienceNamesOf(adSets, audiences),\n rememberedJev(path.join(cacheDir, \"audience-names.json\"), (u) => spent.push(u)),\n );\n await holdUnbilledSpend(cacheDir, spent).catch(() => undefined);\n const rows = adSetViewerRows(adSets, audiences, campaigns, readName);\n if (rows.length > 0) {\n hints.push(\n 'Write each ad for the viewer of the ad set it will run in, then record it in the creative\\'s _definition.md: targetAdSet: \"<ad set id>\" and viewer: { temperature, knows, placements, source }.',\n );\n }\n if (format === \"md\" || format === \"csv\") {\n writeAdsOutput(flattenViewerRows(rows), format, [...VIEWER_TABLE_COLUMNS], hints);\n return;\n }\n writeAdsOutput(rows as unknown as MetaRow[], format, undefined, hints);\n}\n\nregisterMetaListSchema(\n \"adsets\",\n \"List ad sets in a Meta ad account, as a table by default: id, name, campaign_id, effective_status, optimization_goal, billing_event, bid_strategy, budgets, destination_type, is_dynamic_creative, learning_stage, end_time, created_time. Targeting is not in the compact row — ask for it with --fields id,name,targeting (or --full). --audience replaces the row with who each ad set reaches (a viewer: temperature, what they already know, placements, reasons) — read it before writing an ad for an ad set. Start here: baker ads meta adsets --campaign-id 6123 --all-statuses. --output json returns the rows in the envelope.\",\n listArgs,\n);\n\nconst listCommand = defineCommand({\n meta: {\n name: \"list\",\n description:\n \"List ad sets in a Meta ad account. Runs by default when no subcommand is given. Example: baker ads meta adsets --account-id act_123\",\n },\n args: listArgs,\n run: async ({ args }) => {\n const accountId = await resolveAccountIdArg(args);\n const effectiveStatus = resolveEffectiveStatus(args);\n try {\n const params: Record<string, string> = { \"account-id\": accountId };\n if (args[\"campaign-id\"]) params[\"campaign-id\"] = args[\"campaign-id\"] as string;\n if (effectiveStatus) params[\"effective-status\"] = effectiveStatus;\n if (args[\"name-contains\"]) params[\"name-contains\"] = args[\"name-contains\"] as string;\n if (args.limit) params.limit = args.limit as string;\n if (args[\"no-cache\"]) params[\"skip-cache\"] = \"true\";\n const data = await apiGet<Array<Record<string, unknown>>>(\"/api/ads/meta/adsets\", params);\n if (args.audience) {\n const hints = statusFilterHints(data, effectiveStatus, \"ad sets\");\n const accountParams: Record<string, string> = { \"account-id\": accountId };\n if (args[\"no-cache\"]) accountParams[\"skip-cache\"] = \"true\";\n await writeAdSetViewers(data, accountParams, csvOrJson(args), hints);\n return;\n }\n const shaped = shapeMetaListRows(\"adsets\", data, args);\n writeMetaListRows(\"adsets\", shaped, csvOrJson(args), [\n ...statusFilterHints(data, effectiveStatus, \"ad sets\"),\n ...budgetUnitHints(data),\n ]);\n } catch (err) {\n handleMetaError(err);\n }\n },\n});\n\nexport const adsetsCommand = defineCommand({\n meta: {\n name: \"adsets\",\n description: `List ad sets in a Meta ad account, or stage writes (create/update/pause/resume/archive/delete/duplicate/copy).\nDefaults to ACTIVE only. Write subcommands stage ops on this chat's draft.\n\nListings print a table by default: id, name, campaign_id, effective_status, optimization_goal, billing_event,\nbid_strategy, budgets, destination_type, is_dynamic_creative, learning_stage, end_time, created_time. Targeting\nis not in the compact row — ask for it with --fields (dotted paths) or --full. --output json returns the rows as JSON.\n\nExamples:\n baker ads meta adsets --account-id act_123\n baker ads meta adsets --campaign-id 6123456789\n baker ads meta adsets --account-id act_123 --all-statuses --name-contains retargeting — find one ad set by name\n baker ads meta adsets --campaign-id 6123456789 --fields id,name,targeting.geo_locations\n baker ads meta adsets --campaign-id 6123456789 --audience --output json — who each ad set reaches (viewer per ad set)\n baker ads meta adsets create --campaign meta_temp_ab12 --name \"US 25-54\" --optimization-goal LINK_CLICKS --billing-event IMPRESSIONS --daily-budget 50 --targeting-file t.json`,\n },\n subCommands: {\n list: listCommand,\n create: () => import(\"./write-commands.ts\").then((m) => m.adSetsCreateCommand),\n update: () => import(\"./write-commands.ts\").then((m) => m.adSetsUpdateCommand),\n pause: () => import(\"./write-commands.ts\").then((m) => m.adSetsPauseCommand),\n resume: () => import(\"./write-commands.ts\").then((m) => m.adSetsResumeCommand),\n archive: () => import(\"./write-commands.ts\").then((m) => m.adSetsArchiveCommand),\n delete: () => import(\"./write-commands.ts\").then((m) => m.adSetsDeleteCommand),\n duplicate: () => import(\"./write-commands.ts\").then((m) => m.adSetsDuplicateCommand),\n copy: () => import(\"./copy-writes.ts\").then((m) => m.adSetsCopyCommand),\n },\n // `args` stays even though the parent has no `run`: citty scans rawArgs for the\n // subcommand name using THIS command's arg defs, so without them `--account-id act_1`\n // would read `act_1` as a subcommand. `default` (not `run`) dispatches the bare\n // invocation — citty falls through to `run` after a subcommand, double-executing it.\n args: listArgs,\n default: \"list\",\n});\n"],"mappings":"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","names":["path"]}
|
|
@@ -9,11 +9,11 @@ import {
|
|
|
9
9
|
labelsDetachCommand,
|
|
10
10
|
labelsRenameCommand,
|
|
11
11
|
mediaDeleteCommand
|
|
12
|
-
} from "./chunk-
|
|
13
|
-
import "./chunk-
|
|
12
|
+
} from "./chunk-GEFZVG4P.js";
|
|
13
|
+
import "./chunk-4XXA4WCS.js";
|
|
14
14
|
import "./chunk-GC5P4KWY.js";
|
|
15
15
|
import "./chunk-GDFJOCDO.js";
|
|
16
|
-
import "./chunk-
|
|
16
|
+
import "./chunk-BN4TDL5L.js";
|
|
17
17
|
import "./chunk-ERSX3MKH.js";
|
|
18
18
|
import "./chunk-WPAW6EVY.js";
|
|
19
19
|
import "./chunk-4NZ47VXO.js";
|
|
@@ -47,4 +47,4 @@ export {
|
|
|
47
47
|
labelsRenameCommand,
|
|
48
48
|
mediaDeleteCommand
|
|
49
49
|
};
|
|
50
|
-
//# sourceMappingURL=asset-writes-
|
|
50
|
+
//# sourceMappingURL=asset-writes-SSI3CO2A.js.map
|
|
@@ -10,7 +10,7 @@ import {
|
|
|
10
10
|
repeatedListFlag,
|
|
11
11
|
requireTarget,
|
|
12
12
|
stageOp
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-4XXA4WCS.js";
|
|
14
14
|
import {
|
|
15
15
|
CUSTOMER_LIST_BATCH_ROWS,
|
|
16
16
|
CUSTOMER_LIST_MAX_BATCHES,
|
|
@@ -21,7 +21,7 @@ import {
|
|
|
21
21
|
csvOrJson,
|
|
22
22
|
handleMetaError,
|
|
23
23
|
resolveAccountIdArg
|
|
24
|
-
} from "./chunk-
|
|
24
|
+
} from "./chunk-BN4TDL5L.js";
|
|
25
25
|
import "./chunk-ERSX3MKH.js";
|
|
26
26
|
import "./chunk-WPAW6EVY.js";
|
|
27
27
|
import "./chunk-4NZ47VXO.js";
|
|
@@ -149,7 +149,7 @@ function listHints(list) {
|
|
|
149
149
|
return hints;
|
|
150
150
|
}
|
|
151
151
|
async function stageMembers(action, args, rawArgs) {
|
|
152
|
-
const accountId = bareAccountId(args);
|
|
152
|
+
const accountId = await bareAccountId(args);
|
|
153
153
|
const audienceId = requireTarget(args, "audience");
|
|
154
154
|
const list = readList(args, rawArgs);
|
|
155
155
|
if (list.rows.length === 0) {
|
|
@@ -241,7 +241,7 @@ var audiencesDeleteCommand = defineCommand({
|
|
|
241
241
|
run: async ({ args }) => {
|
|
242
242
|
await stageOp({
|
|
243
243
|
kind: "customAudience.update",
|
|
244
|
-
accountId: bareAccountId(args),
|
|
244
|
+
accountId: await bareAccountId(args),
|
|
245
245
|
target: requireTarget(args, "audience"),
|
|
246
246
|
payload: { status: "DELETED" }
|
|
247
247
|
});
|
|
@@ -273,7 +273,7 @@ var savedAudiencesCommand = defineCommand({
|
|
|
273
273
|
output: { type: "string", description: "json|csv|jsonl|md", default: "json" }
|
|
274
274
|
},
|
|
275
275
|
run: async ({ args }) => {
|
|
276
|
-
const accountId = resolveAccountIdArg(args);
|
|
276
|
+
const accountId = await resolveAccountIdArg(args);
|
|
277
277
|
try {
|
|
278
278
|
const params = { "account-id": accountId };
|
|
279
279
|
if (args["saved-audience-id"]) params["saved-audience-id"] = String(args["saved-audience-id"]);
|
|
@@ -324,4 +324,4 @@ export {
|
|
|
324
324
|
savedAudiencesCommand,
|
|
325
325
|
targetingFromSavedAudience
|
|
326
326
|
};
|
|
327
|
-
//# sourceMappingURL=audience-writes-
|
|
327
|
+
//# sourceMappingURL=audience-writes-G64754LR.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/ads/meta/audience-writes.ts"],"sourcesContent":["import { readFileSync } from \"node:fs\";\nimport { brandSafetyTargetingFields } from \"@baker/api/ads-meta/brandSafety\";\nimport {\n CUSTOMER_LIST_BATCH_ROWS,\n CUSTOMER_LIST_MAX_BATCHES,\n type CustomerListAction,\n type CustomerListBatchResponse,\n} from \"@baker/api/ads-meta/customerList\";\nimport { defineCommand } from \"citty\";\nimport { apiGet, apiPost } from \"../../../client.ts\";\nimport { requireChatId } from \"../../../env.ts\";\nimport { registerSchema } from \"../../../schemas.ts\";\nimport { writeAdsOutput, writeJsonEnvelope } from \"../output.ts\";\nimport {\n customerListBatches,\n customerListFromFile,\n customerListUploadRefusal,\n DATE_ORDERS,\n type DateOrder,\n type HashedCustomerList,\n} from \"./customer-list.ts\";\nimport { csvOrJson, handleMetaError, resolveAccountIdArg } from \"./shared.ts\";\nimport { bareAccountId, failWriteValidation, repeatedListFlag, requireTarget, stageOp } from \"./write-shared.ts\";\n\n/**\n * Staged writes on who is in a customer list, deleting an audience, and the\n * saved audiences an ad set can copy. The people are read from a file in the\n * workspace and hashed here; only their digests are held by Baker until the\n * chat publishes, and only counts are ever printed.\n */\n\nconst STAGED_NOTE = \"Staged until publish — review with `baker ads meta draft`.\";\n\nconst membersArgs = {\n id: {\n type: \"positional\",\n description: \"Customer-list audience id, or a meta_temp_* ref created in this chat\",\n required: true,\n },\n \"account-id\": { type: \"string\", description: \"Meta ad account ID (act_123)\" },\n file: {\n type: \"string\",\n description:\n \"CSV (or ;/tab separated) in the workspace with a header row: email, phone, first name, last name, city, state, zip, country, birthday, gender, madid, external id\",\n },\n country: {\n type: \"string\",\n description:\n \"Two-letter country for phones written without their country code (when the row has no country column)\",\n },\n \"value-column\": {\n type: \"string\",\n description: \"Value-based list only: the column with each person's value (e.g. revenue)\",\n },\n columns: {\n type: \"string\",\n description:\n \"For a file without a header row: what each column is, in order (email,phone,country — comma-separated or repeated)\",\n },\n \"date-format\": {\n type: \"string\",\n description:\n \"How birthdays like 03/07/1990 are written: DMY (day first) or MDY (month first, US). Needed only when no date in the file shows it\",\n },\n} as const;\n\nfunction schemaArgs<T extends Record<string, { type: string; description: string; required?: boolean }>>(args: T) {\n return Object.fromEntries(\n Object.entries(args).map(([key, arg]) => [\n key,\n { type: arg.type, description: arg.description, required: arg.required === true },\n ]),\n );\n}\n\nconst ACTION_NOTES: Record<CustomerListAction, string> = {\n add: \"Adds the people in the file to the list; those already in it stay.\",\n remove: \"Removes the people in the file from the list.\",\n replace:\n \"Replaces the whole list with the file — everyone not in it leaves. Runs alone: not beside another change to the same list in this chat.\",\n};\n\nfunction dateFormatFlag(value: unknown): DateOrder | undefined {\n if (value === undefined) return undefined;\n const upperValue = String(value).toUpperCase();\n if (!(DATE_ORDERS as readonly string[]).includes(upperValue)) {\n failWriteValidation(`--date-format takes ${DATE_ORDERS.join(\" or \")}, not ${String(value)}`);\n }\n return upperValue as DateOrder;\n}\n\nfunction readList(args: Record<string, unknown>, rawArgs: readonly string[] | undefined): HashedCustomerList {\n const path = typeof args.file === \"string\" ? args.file : \"\";\n if (!path) {\n failWriteValidation(\"pass --file with the customer list (CSV in the workspace)\");\n }\n let content: string;\n try {\n content = readFileSync(path, \"utf8\");\n } catch (err) {\n failWriteValidation(`could not read ${path}: ${err instanceof Error ? err.message : String(err)}`);\n }\n try {\n return customerListFromFile(content, {\n defaultCountry: typeof args.country === \"string\" ? args.country : undefined,\n valueColumn: typeof args[\"value-column\"] === \"string\" ? args[\"value-column\"] : undefined,\n columns: repeatedListFlag(rawArgs, \"columns\", args.columns),\n dateFormat: dateFormatFlag(args[\"date-format\"]),\n });\n } catch (err) {\n failWriteValidation(err instanceof Error ? err.message : String(err));\n }\n}\n\n/** What the agent learns about the file: counts only. */\nfunction listHints(list: HashedCustomerList): string[] {\n const hints = [`${list.rows.length.toLocaleString(\"en-US\")} people read from the file, hashed before upload`];\n const unreadable = Object.entries(list.unreadable).map(([key, count]) => `${count} ${key}`);\n if (unreadable.length > 0) {\n hints.push(`values that could not be read and were left out: ${unreadable.join(\", \")}`);\n }\n if (list.skippedRows > 0) {\n hints.push(\n `${list.skippedRows} rows had nothing Meta can match on (no readable email, phone or id${list.schema.includes(\"LOOKALIKE_VALUE\") ? \", or no readable value\" : \"\"}) and were left out`,\n );\n }\n if (list.ignoredColumns.length > 0) {\n hints.push(`columns not sent (Meta does not match on them): ${list.ignoredColumns.join(\", \")}`);\n }\n if (list.rows.length < 100) {\n hints.push(\"Meta needs about 100 matched people before a list can be used for ads or as a lookalike seed\");\n }\n return hints;\n}\n\nasync function stageMembers(\n action: CustomerListAction,\n args: Record<string, unknown>,\n rawArgs: readonly string[] | undefined,\n): Promise<void> {\n const accountId = await bareAccountId(args);\n const audienceId = requireTarget(args, \"audience\");\n const list = readList(args, rawArgs);\n if (list.rows.length === 0) {\n failWriteValidation(\"no one in this file can be matched — check the columns (email, phone, …) and their values\");\n }\n const batches = customerListBatches(list);\n if (batches.length > CUSTOMER_LIST_MAX_BATCHES) {\n failWriteValidation(\n `this file holds ${list.rows.length.toLocaleString(\"en-US\")} people; one change carries at most ${(CUSTOMER_LIST_BATCH_ROWS * CUSTOMER_LIST_MAX_BATCHES).toLocaleString(\"en-US\")} — split the file and stage one add per part`,\n );\n }\n const refusal = customerListUploadRefusal(audienceId, action, list);\n if (refusal) {\n failWriteValidation(refusal);\n }\n const stored: CustomerListBatchResponse[] = [];\n try {\n const chatId = requireChatId();\n for (const batch of batches) {\n const response = await apiPost<{ ok: true; data: CustomerListBatchResponse }>(\n \"/api/ads/meta/draft/customer-list-batch\",\n { chatId, accountId, batch },\n { timeoutMs: 120_000 },\n );\n stored.push(response.data);\n }\n } catch (err) {\n handleMetaError(err);\n }\n await stageOp(\n {\n kind: \"customAudience.members\",\n accountId,\n payload: { audience_id: audienceId, action, schema: list.schema, batches: stored },\n },\n listHints(list),\n );\n}\n\nfunction membersCommand(action: CustomerListAction) {\n registerSchema({\n command: `ads.meta.audiences.members.${action}`,\n description: `Stage ${action === \"add\" ? \"adding people to\" : action === \"remove\" ? \"removing people from\" : \"replacing everyone in\"} a Meta customer list from a CSV in the workspace. ${ACTION_NOTES[action]} Every value is normalized and SHA-256 hashed on this machine before upload, as Meta asks, with a masked copy of each person (l***@empresa.com) for the review; only counts are printed. Applied at publish; Meta takes up to 24h to match.`,\n args: schemaArgs(membersArgs),\n });\n return defineCommand({\n meta: {\n name: action,\n description: `${ACTION_NOTES[action]} ${STAGED_NOTE}\nExample: baker ads meta audiences members ${action} 120249492603650208 --file customers.csv --country ES`,\n },\n args: membersArgs,\n run: async ({ args, rawArgs }) => {\n await stageMembers(action, args as Record<string, unknown>, rawArgs);\n },\n });\n}\n\nexport const audiencesMembersCommand = defineCommand({\n meta: {\n name: \"members\",\n description: `Change who is in a customer-list audience, from a CSV in the workspace. Hashed here before upload. ${STAGED_NOTE}\n baker ads meta audiences members add <audienceId|meta_temp_…> --file customers.csv [--country ES]\n baker ads meta audiences members remove <audienceId> --file unsubscribed.csv\n baker ads meta audiences members replace <audienceId> --file customers.csv\n value-based list: add --value-column revenue`,\n },\n subCommands: {\n add: membersCommand(\"add\"),\n remove: membersCommand(\"remove\"),\n replace: membersCommand(\"replace\"),\n },\n});\n\n// --- Delete ---\n\nregisterSchema({\n command: \"ads.meta.audiences.delete\",\n description:\n \"Stage deleting a Meta custom audience — permanent, applied at publish. Every ad that targets it stops and cannot be restarted; Meta refuses while a lookalike is built from it (delete the lookalike first).\",\n args: {\n id: { type: \"positional\", description: \"Audience id\", required: true },\n \"account-id\": { type: \"string\", description: \"Meta ad account ID (act_123)\", required: false },\n },\n});\n\nexport const audiencesDeleteCommand = defineCommand({\n meta: {\n name: \"delete\",\n description: `Stage deleting an audience — permanent: ads that target it stop for good. Only when the user asked to delete it. ${STAGED_NOTE}`,\n },\n args: {\n id: { type: \"positional\", description: \"Audience id\", required: true },\n \"account-id\": { type: \"string\", description: \"Meta ad account ID (act_123)\" },\n },\n run: async ({ args }) => {\n await stageOp({\n kind: \"customAudience.update\",\n accountId: await bareAccountId(args as Record<string, unknown>),\n target: requireTarget(args as Record<string, unknown>, \"audience\"),\n payload: { status: \"DELETED\" },\n });\n },\n});\n\n// --- Saved audiences ---\n\nregisterSchema({\n command: \"ads.meta.audiences.saved\",\n description:\n \"List the ad account's saved audiences (targeting saved in Ads Manager), or one with --saved-audience-id. Read-only — Meta's API cannot create or change one. Use one on a new ad set with `adsets create --saved-audience <id>`.\",\n args: {\n \"account-id\": { type: \"string\", description: \"Meta ad account ID (act_123)\", required: false },\n \"saved-audience-id\": {\n type: \"string\",\n description: \"One saved audience, with its full targeting\",\n required: false,\n },\n full: { type: \"boolean\", description: \"Include each audience's whole targeting spec\", required: false },\n output: { type: \"string\", description: \"json|csv|jsonl|md\", required: false, default: \"json\" },\n },\n});\n\nexport const savedAudiencesCommand = defineCommand({\n meta: {\n name: \"saved\",\n description:\n \"Saved audiences on the account (read-only). Example: baker ads meta audiences saved --account-id act_123; use one with `adsets create --saved-audience <id>`\",\n },\n args: {\n \"account-id\": { type: \"string\", description: \"Meta ad account ID (act_123)\" },\n \"saved-audience-id\": { type: \"string\", description: \"One saved audience, with its full targeting\" },\n full: { type: \"boolean\", description: \"Include each audience's whole targeting spec\" },\n output: { type: \"string\", description: \"json|csv|jsonl|md\", default: \"json\" },\n },\n run: async ({ args }) => {\n const accountId = await resolveAccountIdArg(args);\n try {\n const params: Record<string, string> = { \"account-id\": accountId };\n if (args[\"saved-audience-id\"]) params[\"saved-audience-id\"] = String(args[\"saved-audience-id\"]);\n const rows = await apiGet<Array<Record<string, unknown>>>(\"/api/ads/meta/saved-audiences\", params);\n const shown =\n args.full || args[\"saved-audience-id\"] ? rows : rows.map(({ targeting: _targeting, ...row }) => row);\n const hints =\n rows.length === 0\n ? [\n \"This account has no saved audiences — Meta's API cannot create one; build the targeting on the ad set instead.\",\n ]\n : [\n \"Use one on a new ad set: `baker ads meta adsets create … --saved-audience <id>` (its targeting is copied).\",\n ];\n const fmt = csvOrJson(args);\n if (fmt !== \"json\") {\n writeAdsOutput(shown, fmt, undefined, hints);\n return;\n }\n writeJsonEnvelope({ ok: true, data: shown, hints });\n } catch (err) {\n handleMetaError(err);\n }\n },\n});\n\n/**\n * A saved audience's targeting with the command's own targeting laid over it:\n * the brand-safety flags (`--block-list`, …) join it, while a targeting file\n * would replace it whole, so the two are refused together.\n */\nexport function targetingFromSavedAudience(\n saved: Record<string, unknown>,\n flagged: Record<string, unknown> | undefined,\n): { targeting: Record<string, unknown> } | { refusal: string } {\n if (flagged === undefined) return { targeting: saved };\n if (!Object.keys(flagged).every((key) => key in brandSafetyTargetingFields)) {\n return { refusal: \"--saved-audience brings the targeting — pass it or --targeting-file, not both\" };\n }\n return { targeting: { ...saved, ...flagged } };\n}\n\n/** A saved audience's targeting, to start an ad set from. */\nexport async function savedAudienceTargeting(\n accountId: string,\n savedAudienceId: string,\n): Promise<Record<string, unknown>> {\n try {\n const rows = await apiGet<Array<{ targeting?: Record<string, unknown> }>>(\"/api/ads/meta/saved-audiences\", {\n \"account-id\": accountId,\n \"saved-audience-id\": savedAudienceId,\n });\n const targeting = rows[0]?.targeting;\n if (!targeting) {\n failWriteValidation(`saved audience ${savedAudienceId} has no targeting to copy`);\n }\n return targeting;\n } catch (err) {\n handleMetaError(err);\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -2,7 +2,7 @@ import {
|
|
|
2
2
|
csvOrJson,
|
|
3
3
|
handleMetaError,
|
|
4
4
|
resolveAccountIdArg
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-BN4TDL5L.js";
|
|
6
6
|
import "./chunk-QALAJNBG.js";
|
|
7
7
|
import {
|
|
8
8
|
writeAdsJson,
|
|
@@ -34,7 +34,7 @@ var listCommand = defineCommand({
|
|
|
34
34
|
},
|
|
35
35
|
args: listArgs,
|
|
36
36
|
run: async ({ args }) => {
|
|
37
|
-
const accountId = resolveAccountIdArg(args);
|
|
37
|
+
const accountId = await resolveAccountIdArg(args);
|
|
38
38
|
try {
|
|
39
39
|
const params = { "account-id": accountId };
|
|
40
40
|
if (args.limit) params.limit = args.limit;
|
|
@@ -67,11 +67,11 @@ Examples:
|
|
|
67
67
|
},
|
|
68
68
|
subCommands: {
|
|
69
69
|
list: listCommand,
|
|
70
|
-
create: () => import("./write-commands-
|
|
71
|
-
update: () => import("./write-commands-
|
|
72
|
-
delete: () => import("./audience-writes-
|
|
73
|
-
members: () => import("./audience-writes-
|
|
74
|
-
saved: () => import("./audience-writes-
|
|
70
|
+
create: () => import("./write-commands-CY734U34.js").then((m) => m.audiencesCreateCommand),
|
|
71
|
+
update: () => import("./write-commands-CY734U34.js").then((m) => m.audiencesUpdateCommand),
|
|
72
|
+
delete: () => import("./audience-writes-G64754LR.js").then((m) => m.audiencesDeleteCommand),
|
|
73
|
+
members: () => import("./audience-writes-G64754LR.js").then((m) => m.audiencesMembersCommand),
|
|
74
|
+
saved: () => import("./audience-writes-G64754LR.js").then((m) => m.savedAudiencesCommand)
|
|
75
75
|
},
|
|
76
76
|
// `args` stays even though the parent has no `run`: citty scans rawArgs for the
|
|
77
77
|
// subcommand name using THIS command's arg defs, so without them `--account-id act_1`
|
|
@@ -83,4 +83,4 @@ Examples:
|
|
|
83
83
|
export {
|
|
84
84
|
audiencesCommand
|
|
85
85
|
};
|
|
86
|
-
//# sourceMappingURL=audiences-
|
|
86
|
+
//# sourceMappingURL=audiences-JAVNJ5NC.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/ads/meta/audiences.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport { NO_CACHE_ARG } from \"../../../cache-flag.ts\";\nimport { apiGet } from \"../../../client.ts\";\nimport { writeAdsJson, writeAdsOutput } from \"../output.ts\";\nimport { csvOrJson, handleMetaError, resolveAccountIdArg } from \"./shared.ts\";\n\nconst listArgs = {\n \"account-id\": { type: \"string\", description: \"Meta ad account ID\" },\n limit: { type: \"string\", description: \"Max rows\" },\n \"no-cache\": NO_CACHE_ARG,\n output: { type: \"string\", description: \"Output format\", default: \"json\" },\n} as const;\n\nconst listCommand = defineCommand({\n meta: {\n name: \"list\",\n description:\n \"List custom audiences. Runs by default when no subcommand is given. Example: baker ads meta audiences --account-id act_123\",\n },\n args: listArgs,\n run: async ({ args }) => {\n const accountId = await resolveAccountIdArg(args);\n try {\n const params: Record<string, string> = { \"account-id\": accountId };\n if (args.limit) params.limit = args.limit as string;\n if (args[\"no-cache\"]) params[\"skip-cache\"] = \"true\";\n const data = await apiGet<Array<Record<string, unknown>>>(\"/api/ads/meta/audiences\", params);\n const fmt = csvOrJson(args);\n if (fmt !== \"json\") {\n writeAdsOutput(data, fmt);\n return;\n }\n writeAdsJson({ ok: true, data });\n } catch (err) {\n handleMetaError(err);\n }\n },\n});\n\nexport const audiencesCommand = defineCommand({\n meta: {\n name: \"audiences\",\n description: `List custom audiences, or stage writes (create/update/delete, members add|remove|replace). Write subcommands stage ops on this chat's draft.\nIncludes lookalikes, website-pixel audiences, customer-file audiences. Meta hides exact size when count < 1000.\n\nExamples:\n baker ads meta audiences --account-id act_123\n baker ads meta audiences create --name \"Site 30d\" --subtype WEBSITE --file rule.json\n baker ads meta audiences create --name \"Past buyers\" --subtype CUSTOM --file buyers.json # {\"members\":[{\"email\":\"…\"}]}\n baker ads meta audiences create --name \"Customers\" --subtype CUSTOM --customer-file-source USER_PROVIDED_ONLY\n baker ads meta audiences members add meta_temp_ab12 --file customers.csv --country ES\n baker ads meta audiences saved --account-id act_123 — saved audiences (read-only)`,\n },\n subCommands: {\n list: listCommand,\n create: () => import(\"./write-commands.ts\").then((m) => m.audiencesCreateCommand),\n update: () => import(\"./write-commands.ts\").then((m) => m.audiencesUpdateCommand),\n delete: () => import(\"./audience-writes.ts\").then((m) => m.audiencesDeleteCommand),\n members: () => import(\"./audience-writes.ts\").then((m) => m.audiencesMembersCommand),\n saved: () => import(\"./audience-writes.ts\").then((m) => m.savedAudiencesCommand),\n },\n // `args` stays even though the parent has no `run`: citty scans rawArgs for the\n // subcommand name using THIS command's arg defs, so without them `--account-id act_1`\n // would read `act_1` as a subcommand. `default` (not `run`) dispatches the bare\n // invocation — citty falls through to `run` after a subcommand, double-executing it.\n args: listArgs,\n default: \"list\",\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,qBAAqB;AAM9B,IAAM,WAAW;AAAA,EACf,cAAc,EAAE,MAAM,UAAU,aAAa,qBAAqB;AAAA,EAClE,OAAO,EAAE,MAAM,UAAU,aAAa,WAAW;AAAA,EACjD,YAAY;AAAA,EACZ,QAAQ,EAAE,MAAM,UAAU,aAAa,iBAAiB,SAAS,OAAO;AAC1E;AAEA,IAAM,cAAc,cAAc;AAAA,EAChC,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aACE;AAAA,EACJ;AAAA,EACA,MAAM;AAAA,EACN,KAAK,OAAO,EAAE,KAAK,MAAM;AACvB,UAAM,YAAY,MAAM,oBAAoB,IAAI;AAChD,QAAI;AACF,YAAM,SAAiC,EAAE,cAAc,UAAU;AACjE,UAAI,KAAK,MAAO,QAAO,QAAQ,KAAK;AACpC,UAAI,KAAK,UAAU,EAAG,QAAO,YAAY,IAAI;AAC7C,YAAM,OAAO,MAAM,OAAuC,2BAA2B,MAAM;AAC3F,YAAM,MAAM,UAAU,IAAI;AAC1B,UAAI,QAAQ,QAAQ;AAClB,uBAAe,MAAM,GAAG;AACxB;AAAA,MACF;AACA,mBAAa,EAAE,IAAI,MAAM,KAAK,CAAC;AAAA,IACjC,SAAS,KAAK;AACZ,sBAAgB,GAAG;AAAA,IACrB;AAAA,EACF;AACF,CAAC;AAEM,IAAM,mBAAmB,cAAc;AAAA,EAC5C,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUf;AAAA,EACA,aAAa;AAAA,IACX,MAAM;AAAA,IACN,QAAQ,MAAM,OAAO,8BAAqB,EAAE,KAAK,CAAC,MAAM,EAAE,sBAAsB;AAAA,IAChF,QAAQ,MAAM,OAAO,8BAAqB,EAAE,KAAK,CAAC,MAAM,EAAE,sBAAsB;AAAA,IAChF,QAAQ,MAAM,OAAO,+BAAsB,EAAE,KAAK,CAAC,MAAM,EAAE,sBAAsB;AAAA,IACjF,SAAS,MAAM,OAAO,+BAAsB,EAAE,KAAK,CAAC,MAAM,EAAE,uBAAuB;AAAA,IACnF,OAAO,MAAM,OAAO,+BAAsB,EAAE,KAAK,CAAC,MAAM,EAAE,qBAAqB;AAAA,EACjF;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM;AAAA,EACN,SAAS;AACX,CAAC;","names":[]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
csvOrJson,
|
|
3
3
|
handleMetaError
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-BN4TDL5L.js";
|
|
5
5
|
import "./chunk-QALAJNBG.js";
|
|
6
6
|
import {
|
|
7
7
|
writeAdsJson,
|
|
@@ -51,4 +51,4 @@ Examples:
|
|
|
51
51
|
export {
|
|
52
52
|
businessesCommand
|
|
53
53
|
};
|
|
54
|
-
//# sourceMappingURL=businesses-
|
|
54
|
+
//# sourceMappingURL=businesses-DXRDQIFP.js.map
|
|
@@ -12,7 +12,7 @@ import {
|
|
|
12
12
|
resolveAccountIdArg,
|
|
13
13
|
resolveEffectiveStatus,
|
|
14
14
|
statusFilterHints
|
|
15
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-BN4TDL5L.js";
|
|
16
16
|
import "./chunk-QALAJNBG.js";
|
|
17
17
|
import "./chunk-HPDGVK6R.js";
|
|
18
18
|
import {
|
|
@@ -60,7 +60,7 @@ var listCommand = defineCommand({
|
|
|
60
60
|
},
|
|
61
61
|
args: listArgs,
|
|
62
62
|
run: async ({ args }) => {
|
|
63
|
-
const accountId = resolveAccountIdArg(args);
|
|
63
|
+
const accountId = await resolveAccountIdArg(args);
|
|
64
64
|
const effectiveStatus = resolveEffectiveStatus(args);
|
|
65
65
|
try {
|
|
66
66
|
const params = { "account-id": accountId };
|
|
@@ -107,14 +107,14 @@ Examples:
|
|
|
107
107
|
},
|
|
108
108
|
subCommands: {
|
|
109
109
|
list: listCommand,
|
|
110
|
-
create: () => import("./write-commands-
|
|
111
|
-
update: () => import("./write-commands-
|
|
112
|
-
pause: () => import("./write-commands-
|
|
113
|
-
resume: () => import("./write-commands-
|
|
114
|
-
archive: () => import("./write-commands-
|
|
115
|
-
delete: () => import("./write-commands-
|
|
116
|
-
duplicate: () => import("./write-commands-
|
|
117
|
-
copy: () => import("./copy-writes-
|
|
110
|
+
create: () => import("./write-commands-CY734U34.js").then((m) => m.campaignsCreateCommand),
|
|
111
|
+
update: () => import("./write-commands-CY734U34.js").then((m) => m.campaignsUpdateCommand),
|
|
112
|
+
pause: () => import("./write-commands-CY734U34.js").then((m) => m.campaignsPauseCommand),
|
|
113
|
+
resume: () => import("./write-commands-CY734U34.js").then((m) => m.campaignsResumeCommand),
|
|
114
|
+
archive: () => import("./write-commands-CY734U34.js").then((m) => m.campaignsArchiveCommand),
|
|
115
|
+
delete: () => import("./write-commands-CY734U34.js").then((m) => m.campaignsDeleteCommand),
|
|
116
|
+
duplicate: () => import("./write-commands-CY734U34.js").then((m) => m.campaignsDuplicateCommand),
|
|
117
|
+
copy: () => import("./copy-writes-EUFEVWDW.js").then((m) => m.campaignsCopyCommand)
|
|
118
118
|
},
|
|
119
119
|
// `args` stays even though the parent has no `run`: citty scans rawArgs for the
|
|
120
120
|
// subcommand name using THIS command's arg defs, so without them `--account-id act_1`
|
|
@@ -127,4 +127,4 @@ export {
|
|
|
127
127
|
advantagePlusHints,
|
|
128
128
|
campaignsCommand
|
|
129
129
|
};
|
|
130
|
-
//# sourceMappingURL=campaigns-
|
|
130
|
+
//# sourceMappingURL=campaigns-GQWFSKGC.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/commands/ads/meta/campaigns.ts"],"sourcesContent":["import { defineCommand } from \"citty\";\nimport { NO_CACHE_ARG } from \"../../../cache-flag.ts\";\nimport { apiGet } from \"../../../client.ts\";\nimport {\n budgetUnitHints,\n META_LIST_SHAPE_ARGS,\n registerMetaListSchema,\n shapeMetaListRows,\n writeMetaListRows,\n} from \"./list-rows.ts\";\nimport {\n csvOrJson,\n handleMetaError,\n NAME_CONTAINS_ARG,\n resolveAccountIdArg,\n resolveEffectiveStatus,\n statusFilterHints,\n} from \"./shared.ts\";\n\n/**\n * Which listed campaigns Meta counts as Advantage+, read off the derived\n * `advantage_state_info` — a hint rather than a column, so the compact row of a\n * 100-campaign account stays small. Advantage+ is not a switch: it follows from\n * a campaign budget, Advantage+ audience and automatic placements.\n */\nexport function advantagePlusHints(rows: ReadonlyArray<Record<string, unknown>>): string[] {\n const named = rows.flatMap((row) => {\n const info = row.advantage_state_info as { advantage_state?: unknown } | undefined;\n const state = info?.advantage_state;\n return typeof state === \"string\" && state.startsWith(\"ADVANTAGE_PLUS_\")\n ? [`${String(row.id)} (${state.slice(\"ADVANTAGE_PLUS_\".length).toLowerCase()})`]\n : [];\n });\n return named.length > 0\n ? [\n `Advantage+ campaigns: ${named.join(\", \")}. Per-lever states (budget, audience, placements): --fields id,name,advantage_state_info.`,\n ]\n : [];\n}\n\nconst listArgs = {\n \"account-id\": { type: \"string\", description: \"Meta ad account ID\" },\n \"effective-status\": { type: \"string\", description: \"Comma-separated effective_status filter (overrides default)\" },\n \"all-statuses\": { type: \"boolean\", description: \"Drop the default ACTIVE filter and return everything\" },\n \"name-contains\": NAME_CONTAINS_ARG,\n limit: { type: \"string\", description: \"Max rows (default 1000)\" },\n \"no-cache\": NO_CACHE_ARG,\n ...META_LIST_SHAPE_ARGS,\n} as const;\n\nregisterMetaListSchema(\n \"campaigns\",\n \"List campaigns in a Meta ad account, as a table by default: id, name, effective_status, daily_budget, lifetime_budget, created_date. ACTIVE only unless --all-statuses. Start here: baker ads meta campaigns --account-id act_123 --all-statuses. --fields takes dotted paths for anything else (e.g. id,name,objective,bid_strategy,special_ad_categories,advantage_state_info); --full returns every field Meta sent; --output json returns the rows in the envelope. A hint names the campaigns Meta counts as Advantage+.\",\n listArgs,\n);\n\nconst listCommand = defineCommand({\n meta: {\n name: \"list\",\n description:\n \"List campaigns for a Meta ad account. Runs by default when no subcommand is given. Example: baker ads meta campaigns --account-id act_123\",\n },\n args: listArgs,\n run: async ({ args }) => {\n const accountId = await resolveAccountIdArg(args);\n const effectiveStatus = resolveEffectiveStatus(args);\n try {\n const params: Record<string, string> = { \"account-id\": accountId };\n if (effectiveStatus) params[\"effective-status\"] = effectiveStatus;\n if (args[\"name-contains\"]) params[\"name-contains\"] = args[\"name-contains\"] as string;\n if (args.limit) params.limit = args.limit as string;\n if (args[\"no-cache\"]) params[\"skip-cache\"] = \"true\";\n const data = await apiGet<Array<Record<string, unknown>>>(\"/api/ads/meta/campaigns\", params);\n const shaped = shapeMetaListRows(\"campaigns\", data, args);\n writeMetaListRows(\"campaigns\", shaped, csvOrJson(args), [\n ...statusFilterHints(data, effectiveStatus, \"campaigns\"),\n ...advantagePlusHints(data),\n ...budgetUnitHints(data),\n ]);\n } catch (err) {\n handleMetaError(err);\n }\n },\n});\n\nexport const campaignsCommand = defineCommand({\n meta: {\n name: \"campaigns\",\n description: `List campaigns for a Meta ad account, or stage writes (create/update/pause/resume/archive/delete/duplicate/copy).\nDefaults to ACTIVE only — pass --all-statuses to widen. Write subcommands stage ops on this chat's draft and\napply only when the chat is published.\n\nIn Meta's API \"campaign\" is the top-of-tree object (what marketers usually call a campaign group).\nThe dashboard shows effective_status: ACTIVE, PAUSED, DELETED, ARCHIVED, IN_PROCESS, WITH_ISSUES, etc.\n\nListings print a table by default: id, name, effective_status, daily/lifetime budget, created_date.\n--fields takes dotted paths for anything else (objective, bid_strategy, special_ad_categories, created_time,\nadvantage_state_info). A hint names the campaigns Meta counts as Advantage+ — a state Meta derives from a\ncampaign budget, Advantage+ audience and automatic placements on every ad set, not a setting;\n--full returns every field; --output json returns the same rows in the { ok, data } envelope.\n\nExamples:\n baker ads meta campaigns --account-id act_123 # ACTIVE only\n baker ads meta campaigns --account-id act_123 --all-statuses # everything\n baker ads meta campaigns --account-id act_123 --all-statuses --name-contains Q3 # find one by name\n baker ads meta campaigns --account-id act_123 --fields id,name,objective,bid_strategy,special_ad_categories\n baker ads meta campaigns --account-id act_123 --output json # rows as JSON\n baker ads meta campaigns create --account-id act_123 --name \"Q3\" --objective OUTCOME_LEADS --daily-budget 50\n baker ads meta campaigns pause 6123 --account-id act_123`,\n },\n subCommands: {\n list: listCommand,\n create: () => import(\"./write-commands.ts\").then((m) => m.campaignsCreateCommand),\n update: () => import(\"./write-commands.ts\").then((m) => m.campaignsUpdateCommand),\n pause: () => import(\"./write-commands.ts\").then((m) => m.campaignsPauseCommand),\n resume: () => import(\"./write-commands.ts\").then((m) => m.campaignsResumeCommand),\n archive: () => import(\"./write-commands.ts\").then((m) => m.campaignsArchiveCommand),\n delete: () => import(\"./write-commands.ts\").then((m) => m.campaignsDeleteCommand),\n duplicate: () => import(\"./write-commands.ts\").then((m) => m.campaignsDuplicateCommand),\n copy: () => import(\"./copy-writes.ts\").then((m) => m.campaignsCopyCommand),\n },\n // `args` stays even though the parent has no `run`: citty scans rawArgs for the\n // subcommand name using THIS command's arg defs, so without them `--account-id act_1`\n // would read `act_1` as a subcommand. `default` (not `run`) dispatches the bare\n // invocation — citty falls through to `run` after a subcommand, double-executing it.\n args: listArgs,\n default: \"list\",\n});\n"],"mappings":"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","names":[]}
|
|
@@ -7,7 +7,7 @@ import {
|
|
|
7
7
|
requireTarget,
|
|
8
8
|
stageOp,
|
|
9
9
|
upper
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-4XXA4WCS.js";
|
|
11
11
|
import {
|
|
12
12
|
retailerIdFilter
|
|
13
13
|
} from "./chunk-GC5P4KWY.js";
|
|
@@ -15,7 +15,7 @@ import "./chunk-GDFJOCDO.js";
|
|
|
15
15
|
import {
|
|
16
16
|
csvOrJson,
|
|
17
17
|
handleMetaError
|
|
18
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-BN4TDL5L.js";
|
|
19
19
|
import {
|
|
20
20
|
repeatedValues
|
|
21
21
|
} from "./chunk-ERSX3MKH.js";
|
|
@@ -182,7 +182,7 @@ Example: baker ads meta catalogs create --account-id act_123 --name "Spring shop
|
|
|
182
182
|
await stageOp(
|
|
183
183
|
{
|
|
184
184
|
kind: "productCatalog.create",
|
|
185
|
-
accountId: bareAccountId(args),
|
|
185
|
+
accountId: await bareAccountId(args),
|
|
186
186
|
payload: { name: args.name, event_sources: pixels.length > 0 ? pixels : void 0 }
|
|
187
187
|
},
|
|
188
188
|
[
|
|
@@ -220,7 +220,7 @@ Example: baker ads meta catalogs update 1798573158016525 --account-id act_123 --
|
|
|
220
220
|
const unlink = repeatedValues(rawArgs, "unlink-pixel", args["unlink-pixel"]);
|
|
221
221
|
await stageOp({
|
|
222
222
|
kind: "productCatalog.update",
|
|
223
|
-
accountId: bareAccountId(args),
|
|
223
|
+
accountId: await bareAccountId(args),
|
|
224
224
|
target: requireTarget(args, "catalog"),
|
|
225
225
|
payload: {
|
|
226
226
|
name: args.name,
|
|
@@ -245,7 +245,7 @@ Example: baker ads meta catalogs delete 1798573158016525 --account-id act_123`
|
|
|
245
245
|
run: async ({ args }) => {
|
|
246
246
|
await stageOp({
|
|
247
247
|
kind: "productCatalog.update",
|
|
248
|
-
accountId: bareAccountId(args),
|
|
248
|
+
accountId: await bareAccountId(args),
|
|
249
249
|
target: requireTarget(args, "catalog"),
|
|
250
250
|
payload: { status: "DELETED" }
|
|
251
251
|
});
|
|
@@ -355,7 +355,7 @@ Example: baker ads meta catalogs products create --account-id act_123 --catalog-
|
|
|
355
355
|
retailer_id: args["retailer-id"],
|
|
356
356
|
...productFieldsFromArgs(args, rawArgs)
|
|
357
357
|
});
|
|
358
|
-
await stageOp({ kind: "product.create", accountId: bareAccountId(args), payload }, [
|
|
358
|
+
await stageOp({ kind: "product.create", accountId: await bareAccountId(args), payload }, [
|
|
359
359
|
"Group products for an ad with `catalogs sets create --catalog-id <id> --retailer-id <sku> \u2026`."
|
|
360
360
|
]);
|
|
361
361
|
}
|
|
@@ -383,7 +383,7 @@ Example: baker ads meta catalogs products update 39108967418750368 --account-id
|
|
|
383
383
|
run: async ({ args, rawArgs }) => {
|
|
384
384
|
await stageOp({
|
|
385
385
|
kind: "product.update",
|
|
386
|
-
accountId: bareAccountId(args),
|
|
386
|
+
accountId: await bareAccountId(args),
|
|
387
387
|
target: requireTarget(args, "product"),
|
|
388
388
|
payload: productFieldsFromArgs(args, rawArgs)
|
|
389
389
|
});
|
|
@@ -404,7 +404,7 @@ Example: baker ads meta catalogs products delete 39108967418750368 --account-id
|
|
|
404
404
|
run: async ({ args }) => {
|
|
405
405
|
await stageOp({
|
|
406
406
|
kind: "product.update",
|
|
407
|
-
accountId: bareAccountId(args),
|
|
407
|
+
accountId: await bareAccountId(args),
|
|
408
408
|
target: requireTarget(args, "product"),
|
|
409
409
|
payload: { status: "DELETED" }
|
|
410
410
|
});
|
|
@@ -505,7 +505,7 @@ Rule: --filter '{"brand":{"eq":"Acme"}}'. Without --retailer-id or --filter the
|
|
|
505
505
|
await stageOp(
|
|
506
506
|
{
|
|
507
507
|
kind: "productSet.create",
|
|
508
|
-
accountId: bareAccountId(args),
|
|
508
|
+
accountId: await bareAccountId(args),
|
|
509
509
|
payload: {
|
|
510
510
|
catalog_id: args["catalog-id"],
|
|
511
511
|
name: args.name,
|
|
@@ -544,7 +544,7 @@ Example: baker ads meta catalogs sets update 1748674113031942 --account-id act_1
|
|
|
544
544
|
run: async ({ args, rawArgs }) => {
|
|
545
545
|
await stageOp({
|
|
546
546
|
kind: "productSet.update",
|
|
547
|
-
accountId: bareAccountId(args),
|
|
547
|
+
accountId: await bareAccountId(args),
|
|
548
548
|
target: requireTarget(args, "product set"),
|
|
549
549
|
payload: { name: args.name, filter: productSetFilterFromArgs(args, rawArgs) }
|
|
550
550
|
});
|
|
@@ -565,7 +565,7 @@ Example: baker ads meta catalogs sets delete 1748674113031942 --account-id act_1
|
|
|
565
565
|
run: async ({ args }) => {
|
|
566
566
|
await stageOp({
|
|
567
567
|
kind: "productSet.update",
|
|
568
|
-
accountId: bareAccountId(args),
|
|
568
|
+
accountId: await bareAccountId(args),
|
|
569
569
|
target: requireTarget(args, "product set"),
|
|
570
570
|
payload: { status: "DELETED" }
|
|
571
571
|
});
|
|
@@ -648,7 +648,7 @@ Example: baker ads meta catalogs feeds create --account-id act_123 --catalog-id
|
|
|
648
648
|
run: async ({ args }) => {
|
|
649
649
|
await stageOp({
|
|
650
650
|
kind: "productFeed.create",
|
|
651
|
-
accountId: bareAccountId(args),
|
|
651
|
+
accountId: await bareAccountId(args),
|
|
652
652
|
payload: { catalog_id: args["catalog-id"], name: args.name, schedule: feedScheduleFromArgs(args) }
|
|
653
653
|
});
|
|
654
654
|
}
|
|
@@ -681,7 +681,7 @@ Example: baker ads meta catalogs feeds update 1157910959893469 --account-id act_
|
|
|
681
681
|
run: async ({ args }) => {
|
|
682
682
|
await stageOp({
|
|
683
683
|
kind: "productFeed.update",
|
|
684
|
-
accountId: bareAccountId(args),
|
|
684
|
+
accountId: await bareAccountId(args),
|
|
685
685
|
target: requireTarget(args, "feed"),
|
|
686
686
|
payload: { name: args.name, schedule: feedScheduleFromArgs(args) }
|
|
687
687
|
});
|
|
@@ -702,7 +702,7 @@ Example: baker ads meta catalogs feeds delete 1157910959893469 --account-id act_
|
|
|
702
702
|
run: async ({ args }) => {
|
|
703
703
|
await stageOp({
|
|
704
704
|
kind: "productFeed.update",
|
|
705
|
-
accountId: bareAccountId(args),
|
|
705
|
+
accountId: await bareAccountId(args),
|
|
706
706
|
target: requireTarget(args, "feed"),
|
|
707
707
|
payload: { status: "DELETED" }
|
|
708
708
|
});
|
|
@@ -778,4 +778,4 @@ export {
|
|
|
778
778
|
productFieldsFromArgs,
|
|
779
779
|
productSetFilterFromArgs
|
|
780
780
|
};
|
|
781
|
-
//# sourceMappingURL=catalogs-
|
|
781
|
+
//# sourceMappingURL=catalogs-TBRONC2D.js.map
|