@koda-sl/baker-cli 0.455.0 → 0.456.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 +100 -17
- package/dist/{account-2OBWFPRG.js → account-AO6PNNPO.js} +6 -6
- package/dist/account-reads-W3XO7CIW.js +218 -0
- package/dist/account-reads-W3XO7CIW.js.map +1 -0
- package/dist/{accounts-TDTME6RQ.js → accounts-4TM4UZEJ.js} +5 -5
- package/dist/{accounts-TZQVAJ3V.js → accounts-XDC26KK6.js} +7 -7
- package/dist/{actions-FHYESJEE.js → actions-CJB4GZYA.js} +18 -18
- package/dist/{add-Q6YFHEOR.js → add-BP4CUUKB.js} +4 -4
- package/dist/{add-7XB5X3D3.js → add-RYR3QGOP.js} +5 -5
- package/dist/{ads-PGTFZA5Q.js → ads-GII5LEOH.js} +6 -6
- package/dist/{ads-6UEDYT3O.js → ads-SATXH4OD.js} +9 -9
- package/dist/{adsets-Q5DWGANV.js → adsets-PMXNW3EG.js} +8 -8
- package/dist/{advertisers-RKWQDCOI.js → advertisers-GM5UFI44.js} +7 -7
- package/dist/{analytics-DEJKJNLN.js → analytics-4CD7CH7H.js} +5 -5
- package/dist/{analytics-U5TTTX7K.js → analytics-JDPRLCHQ.js} +15 -15
- package/dist/{assign-RHUKQWH2.js → assign-XI4HIIIM.js} +5 -5
- package/dist/{audience-size-ICEKQRE4.js → audience-size-DHZ65PGA.js} +5 -5
- package/dist/{audiences-AMRFZRZ7.js → audiences-D7CXP3ZF.js} +3 -3
- package/dist/{audit-GWLQVB4A.js → audit-M7BZYBIS.js} +5 -5
- package/dist/{autocomplete-NAEVFMKZ.js → autocomplete-B45I26R4.js} +7 -7
- package/dist/{avatars-PMV6IMFV.js → avatars-75BALNB7.js} +4 -4
- package/dist/{bid-pricing-XF3LD65L.js → bid-pricing-4RCP24BE.js} +5 -5
- package/dist/{brand-ZC5HDP7B.js → brand-2TOLKYDY.js} +2 -2
- package/dist/{brief-3EZ2JS5F.js → brief-5G4NEZ4O.js} +16 -16
- package/dist/{campaign-groups-JSHBFYDG.js → campaign-groups-G7B26V7K.js} +10 -10
- package/dist/{campaign-writes-5PHXENPN.js → campaign-writes-HZ7ART7W.js} +5 -5
- package/dist/{campaigns-D6B6Z67Y.js → campaigns-MEEM3CNC.js} +8 -8
- package/dist/{campaigns-HPRQVXTH.js → campaigns-OIJGTO7W.js} +5 -5
- package/dist/{campaigns-LQXELRHZ.js → campaigns-RW3QJQ2F.js} +13 -13
- package/dist/{canvas-4NVEZNW5.js → canvas-LXRLDE5G.js} +12 -12
- package/dist/{capabilities-VQRNPBOZ.js → capabilities-BWSB7IFT.js} +5 -5
- package/dist/{changes-TP7ZZHB3.js → changes-AYLNY6KN.js} +5 -5
- package/dist/{chatgpt-QNUN63YS.js → chatgpt-TNSRA3L3.js} +1 -1
- package/dist/{chats-Q4QPA3OQ.js → chats-MMHBJQFM.js} +5 -5
- package/dist/{chunk-RXGR63TP.js → chunk-24GELJP3.js} +2 -2
- package/dist/{chunk-ZKYNGME7.js → chunk-2D4ASTGN.js} +3 -3
- package/dist/{chunk-PRIHMSJH.js → chunk-2K4LMCV2.js} +2 -2
- package/dist/{chunk-4GACYQUI.js → chunk-2YJL6MEB.js} +3 -3
- package/dist/{chunk-L27H2R2N.js → chunk-2ZY7HON7.js} +2 -2
- package/dist/{chunk-RZTNH2TX.js → chunk-45OQOUJA.js} +2 -2
- package/dist/{chunk-LLOOWRBB.js → chunk-4KCKNAVW.js} +189 -20
- package/dist/chunk-4KCKNAVW.js.map +1 -0
- package/dist/{chunk-GX6VAHY7.js → chunk-5FWMRTNB.js} +31 -15
- package/dist/chunk-5FWMRTNB.js.map +1 -0
- package/dist/{chunk-YT2BSTD3.js → chunk-7TNPEURJ.js} +2 -2
- package/dist/chunk-7VHPAGPK.js +228 -0
- package/dist/chunk-7VHPAGPK.js.map +1 -0
- package/dist/{chunk-WKS6ZDUP.js → chunk-BSOWFWEU.js} +7 -7
- package/dist/{chunk-X5ECCSHP.js → chunk-D23EKXOP.js} +2 -2
- package/dist/{chunk-FC3U5XKS.js → chunk-D7PFF6UC.js} +4 -4
- package/dist/{chunk-OU5YA2QX.js → chunk-DT2XXF6O.js} +2 -2
- package/dist/{chunk-ARBKEE6E.js → chunk-DYOI4FQ7.js} +2 -2
- package/dist/{chunk-4EVLVA2R.js → chunk-EFM7OODQ.js} +2 -2
- package/dist/{chunk-P6KWFODZ.js → chunk-EIIANSBX.js} +2 -2
- package/dist/{chunk-HJMRWBR5.js → chunk-EYK6G4XE.js} +2 -2
- package/dist/{chunk-PKC6QBYJ.js → chunk-EZWYX343.js} +4 -4
- package/dist/{chunk-LIQ4SQ2T.js → chunk-FEELV5IV.js} +2 -2
- package/dist/{chunk-YCWIGXH6.js → chunk-GP7QUF5A.js} +2 -2
- package/dist/{chunk-ZGGGA3JR.js → chunk-HOXZOOVA.js} +8 -8
- package/dist/{chunk-CYEO5ZIO.js → chunk-JPK34QPS.js} +3 -2
- package/dist/{chunk-CYEO5ZIO.js.map → chunk-JPK34QPS.js.map} +1 -1
- package/dist/{chunk-TJOGO2MK.js → chunk-JU7FIHQ2.js} +2 -2
- package/dist/{chunk-MVYLY2SF.js → chunk-KN7DFVKW.js} +2 -2
- package/dist/{chunk-K5H3XOYQ.js → chunk-LI6PGY3L.js} +2 -2
- package/dist/{chunk-3KEWXALS.js → chunk-MCWYIEWI.js} +3 -3
- package/dist/{chunk-LIWBVGRE.js → chunk-MFQ5SUJT.js} +3 -3
- package/dist/{credentials-4V55RYZ6.js → chunk-ML7DLFFY.js} +3421 -249
- package/dist/chunk-ML7DLFFY.js.map +1 -0
- package/dist/{chunk-HEOWTR7Z.js → chunk-OW4XDJV2.js} +2 -2
- package/dist/{chunk-KYR4EG3E.js → chunk-PHEEJUFL.js} +2 -2
- package/dist/chunk-QM6T4BFA.js +76 -0
- package/dist/chunk-QM6T4BFA.js.map +1 -0
- package/dist/{chunk-KHV5GALI.js → chunk-QNDLOCAI.js} +2 -2
- package/dist/{chunk-GQ7JE7A7.js → chunk-UZUHXN7H.js} +2 -2
- package/dist/{chunk-YWK4UBVU.js → chunk-V5QJBDBC.js} +2 -2
- package/dist/{chunk-LP2QDRO4.js → chunk-WBUMUELD.js} +7 -7
- package/dist/{chunk-EP5TYLNV.js → chunk-WEU6GKUQ.js} +3 -3
- package/dist/{chunk-46TPPYCI.js → chunk-X5VHGXFB.js} +2 -2
- package/dist/{chunk-3V57D7GE.js → chunk-XJRBFLBD.js} +2 -2
- package/dist/{query-IEZRY6HV.js → chunk-XPOIIQCI.js} +406 -148
- package/dist/chunk-XPOIIQCI.js.map +1 -0
- package/dist/{chunk-ZJWUBJYQ.js → chunk-XQIOCIDO.js} +1 -1
- package/dist/chunk-XQIOCIDO.js.map +1 -0
- package/dist/{chunk-T4DD5YMP.js → chunk-XY7BZSDQ.js} +12 -12
- package/dist/{chunk-T4DD5YMP.js.map → chunk-XY7BZSDQ.js.map} +1 -1
- package/dist/{chunk-QS2BDKFL.js → chunk-Y63Y4QSY.js} +2 -2
- package/dist/{chunk-PAQ3T6OT.js → chunk-YRVDCIJ2.js} +2 -2
- package/dist/{claim-RHZVTMQZ.js → claim-UDNXCJIU.js} +5 -5
- package/dist/cli.js +29 -29
- package/dist/{companies-LIKSVYSR.js → companies-RPZN4JTR.js} +5 -5
- package/dist/{complete-OM7R6VOC.js → complete-HLSRQE3N.js} +5 -5
- package/dist/{connect-AVX3NKP6.js → connect-TIJZO7OV.js} +8 -8
- package/dist/{conversation-3HGRWXKO.js → conversation-BS7TF6LZ.js} +5 -5
- package/dist/{conversion-upload-command-AUF3LNTH.js → conversion-upload-command-CSD344BY.js} +6 -6
- package/dist/{conversions-XADFSQ4W.js → conversions-FEWAX64H.js} +9 -9
- package/dist/{create-PQSDE4J3.js → create-4SH4BZXP.js} +5 -5
- package/dist/{create-BWHYYATN.js → create-B4UVIJZI.js} +4 -4
- package/dist/{create-Z4JLLTPG.js → create-F5FNHJKE.js} +5 -5
- package/dist/{create-3I64N6RJ.js → create-L3JHP6J4.js} +5 -5
- package/dist/{creatives-WPRN6CU4.js → creatives-LK2NZHRX.js} +10 -10
- package/dist/{creatives-UEPLNCPN.js → creatives-RQ2DFHGI.js} +3 -3
- package/dist/{creatives-6Z7CEW5O.js → creatives-UILBPOKO.js} +10 -10
- package/dist/credentials-GC34ZPYP.js +287 -0
- package/dist/credentials-GC34ZPYP.js.map +1 -0
- package/dist/{critique-M5TMIG2D.js → critique-FAOH4FCP.js} +7 -7
- package/dist/{critique-K632OHFP.js → critique-X7HYYEJ4.js} +5 -5
- package/dist/{crm-CWT6BMMX.js → crm-RB5TVV3M.js} +6 -6
- package/dist/{crm-Q2QK4ZMS.js → crm-XEQDSU2U.js} +6 -6
- package/dist/{currency-XCGKQ7FE.js → currency-47QHFHDA.js} +4 -4
- package/dist/{custom-conversions-2VLJGPRV.js → custom-conversions-7HOWR6X6.js} +2 -2
- package/dist/{customers-7TS64ZM5.js → customers-P5WOUY6G.js} +7 -7
- package/dist/{delete-H7W3V6QG.js → delete-DLQ2ZZDA.js} +4 -4
- package/dist/{delete-BPSOLCGB.js → delete-GZKGPBBD.js} +5 -5
- package/dist/{delete-RIY5VUTU.js → delete-SW5OSIGN.js} +5 -5
- package/dist/{demographics-NHGM4QP7.js → demographics-ZLZOIWUE.js} +5 -5
- package/dist/{discard-IBMOGEYB.js → discard-VNVNJWNX.js} +5 -5
- package/dist/{discover-BJPZNXUQ.js → discover-P6TUGZ45.js} +4 -4
- package/dist/{domain-Y3N2UY5I.js → domain-OBICRJP3.js} +5 -5
- package/dist/draft-666YKA3P.js +307 -0
- package/dist/draft-666YKA3P.js.map +1 -0
- package/dist/{draft-322ZG6JG.js → draft-UECMJ6B4.js} +5 -5
- package/dist/{draft-6KBILDJK.js → draft-V75RBORX.js} +5 -5
- package/dist/{draft-P5T2QHCY.js → draft-Z3VUQ4LJ.js} +7 -7
- package/dist/{facets-3SDK42HY.js → facets-7J66L3NK.js} +5 -5
- package/dist/{feedback-P2JZTJY5.js → feedback-3LDG4WVJ.js} +2 -2
- package/dist/{feedback-record-5O6UUWTZ.js → feedback-record-CTAUHLMF.js} +9 -9
- package/dist/{fetch-LN5W3J4E.js → fetch-4RXXZGO4.js} +5 -5
- package/dist/{flows-MN26KBWB.js → flows-GGB46DLH.js} +12 -12
- package/dist/{fonts-7TXPTNCS.js → fonts-S3GWKOUJ.js} +7 -7
- package/dist/{forecast-ZHBKYQFP.js → forecast-6JVKXNFB.js} +5 -5
- package/dist/forecast-SVD3LMMY.js +168 -0
- package/dist/forecast-SVD3LMMY.js.map +1 -0
- package/dist/{funnel-UAXVM7JN.js → funnel-RCQOIQZ5.js} +6 -6
- package/dist/{ga4-DV2AXCSL.js → ga4-U6DMJ6K4.js} +1 -1
- package/dist/{get-EKYSQHNB.js → get-KQSM2MXM.js} +5 -5
- package/dist/{get-P7SSZ46N.js → get-MN2GRXGZ.js} +5 -5
- package/dist/{google-M7KEXVK5.js → google-CI2AMJKN.js} +1518 -200
- package/dist/google-CI2AMJKN.js.map +1 -0
- package/dist/{google-ads-LZDXDFPW.js → google-ads-YAJ33LTW.js} +5 -5
- package/dist/{history-BFGVCJ4J.js → history-QWYLRQBO.js} +5 -5
- package/dist/{hubspot-I3PNNF3E.js → hubspot-DDONLJ7R.js} +9 -9
- package/dist/{ideas-ZNP5BOGE.js → ideas-N44Z2SIT.js} +4 -4
- package/dist/{images-MWWGN672.js → images-BKHCBCE7.js} +4 -4
- package/dist/{ingest-H7BWHY7L.js → ingest-HBECWLOB.js} +4 -4
- package/dist/{ingest-NYP2ZAAK.js → ingest-VNRTFD4Y.js} +5 -5
- package/dist/{inspect-FNNDBZQX.js → inspect-7GGJDJBJ.js} +5 -5
- package/dist/{inspiration-S3DU4CMQ.js → inspiration-CGM3NK6X.js} +1 -1
- package/dist/{intent-E3UIVZBN.js → intent-HKNBXEDS.js} +4 -4
- package/dist/{keyword-gap-BG6M665A.js → keyword-gap-HUSP6MOT.js} +4 -4
- package/dist/{keyword-metrics-WG5LLBUW.js → keyword-metrics-2C3VFGDQ.js} +7 -7
- package/dist/{keywords-for-site-HVEAAODA.js → keywords-for-site-4GV4KS4X.js} +7 -7
- package/dist/{landing-G5MLO4CZ.js → landing-V2FMPQOK.js} +3 -3
- package/dist/{languages-HORKPDNH.js → languages-75YJZAHL.js} +4 -4
- package/dist/{leads-XCAE4OVV.js → leads-DTULNGMU.js} +5 -5
- package/dist/{leads-ARUWPHBM.js → leads-OPRVJBQG.js} +4 -4
- package/dist/{learn-5WSN4PT5.js → learn-EW2CKOFS.js} +9 -9
- package/dist/{line-item-writes-4EOQBQSC.js → line-item-writes-EF3BJ5KV.js} +5 -5
- package/dist/{line-items-45X5BVQW.js → line-items-G467XOZF.js} +5 -5
- package/dist/{link-XAXNBIKU.js → link-5SU4MR6M.js} +5 -5
- package/dist/{linkedin-62HOT3HB.js → linkedin-OFM3VVOB.js} +29 -29
- package/dist/{list-PLWORN75.js → list-HEWXAVCL.js} +4 -4
- package/dist/{list-NYTQ3DBH.js → list-SUTCQLGI.js} +5 -5
- package/dist/{list-H4SN4QYE.js → list-VFZPXFMA.js} +5 -5
- package/dist/{locations-J4G5RNPH.js → locations-6XADFU3V.js} +4 -4
- package/dist/{log-S7TEGEPL.js → log-I3MAU44R.js} +5 -5
- package/dist/{make-F6FOFAS4.js → make-ALBJZKJZ.js} +21 -21
- package/dist/{map-V3YC6Y5I.js → map-OT6F33VF.js} +6 -6
- package/dist/{mcp-3R3FOL2H.js → mcp-LC3L2JQO.js} +4 -4
- package/dist/{media-53DJRC4N.js → media-MYZ5I7WK.js} +2 -2
- package/dist/{media-sources-356UORTR.js → media-sources-RK6EJYBQ.js} +2 -2
- package/dist/{members-KATLJNPJ.js → members-7CHDHW7H.js} +5 -5
- package/dist/{meta-A7KM6TF5.js → meta-7XP5AWYU.js} +10 -10
- package/dist/{metrics-SQDJ5NQO.js → metrics-73LI743C.js} +4 -4
- package/dist/{normalize-RUPEDCAV.js → normalize-CXMYHNSA.js} +5 -5
- package/dist/{options-SCYGSRQX.js → options-E4IO5SR5.js} +8 -8
- package/dist/{performance-U3MA6YXN.js → performance-UQLSBPYN.js} +6 -6
- package/dist/{plan-4QP2G7GV.js → plan-NBFLYAOW.js} +2 -2
- package/dist/{promoted-tweet-writes-5UMGETBC.js → promoted-tweet-writes-ZW3FUPFG.js} +5 -5
- package/dist/{promoted-tweets-A3V53KZI.js → promoted-tweets-ZLQ6GZD5.js} +3 -3
- package/dist/{publish-V22K43GA.js → publish-H2PBR5XN.js} +5 -5
- package/dist/query-GDUTZ4R7.js +61 -0
- package/dist/{reddit-UACCQN3B.js → reddit-TGQYQUNZ.js} +6 -6
- package/dist/{refresh-PSXGRCJE.js → refresh-HVBCC2ZI.js} +4 -4
- package/dist/{release-S2X7UL4U.js → release-VI3JT6O6.js} +5 -5
- package/dist/{relevant-pages-OWMNUCP7.js → relevant-pages-2FW3E5KD.js} +4 -4
- package/dist/{remove-4GTKRBUW.js → remove-4EE7STMS.js} +4 -4
- package/dist/{reopen-3KUS6UZ2.js → reopen-LEGLAOMA.js} +5 -5
- package/dist/{rerun-ZHD7C4W2.js → rerun-A5DPZFOO.js} +14 -14
- package/dist/{research-7LO3G3EP.js → research-O6YMV2TG.js} +13 -13
- package/dist/{research-UF6PKQPH.js → research-WOJELJ4K.js} +4 -4
- package/dist/{reset-PVXTS3FZ.js → reset-PQHURJDC.js} +4 -4
- package/dist/{reset-PU57HTAP.js → reset-V2X7DFHD.js} +4 -4
- package/dist/{resolve-KBIYWRF7.js → resolve-Q4AACDIC.js} +5 -5
- package/dist/{retry-HKWNIGON.js → retry-BB6NJBC4.js} +4 -4
- package/dist/{retry-LSCVGZM5.js → retry-WMGEUJPB.js} +4 -4
- package/dist/{run-HMFS4KQZ.js → run-OBYA2F3E.js} +14 -14
- package/dist/{run-DU6RVXPA.js → run-V6E36GXW.js} +5 -5
- package/dist/{scaffold-ad-SLUGKZIW.js → scaffold-ad-KKYI7FZJ.js} +10 -10
- package/dist/{scaffold-static-ad-NRFAA5HL.js → scaffold-static-ad-R5UE4YIZ.js} +16 -16
- package/dist/{scaffold-video-Q7BSFVS4.js → scaffold-video-Y2BWXZSX.js} +12 -12
- package/dist/{schedule-VNTGMFLQ.js → schedule-EO27AZTT.js} +4 -4
- package/dist/{scheduled-agents-6TNWXJVH.js → scheduled-agents-OIJBX7OO.js} +11 -11
- package/dist/{schema-ZEOL467O.js → schema-7GSCTQIC.js} +6 -6
- package/dist/{search-XUINK3C2.js → search-Q7PAV7NY.js} +4 -4
- package/dist/{select-U3DVKV72.js → select-ASR5SBYE.js} +9 -9
- package/dist/{set-prompt-EQIVJ5LR.js → set-prompt-I32464V4.js} +7 -7
- package/dist/{setup-links-CLPE6UUM.js → setup-links-NP2HULRC.js} +5 -5
- package/dist/{site-GIZB7NWB.js → site-PTIYQQ3Z.js} +6 -6
- package/dist/{sources-7RGXA35S.js → sources-5FRMFKDA.js} +6 -6
- package/dist/{sources-2PG4U4BC.js → sources-FJLCIG6X.js} +8 -8
- package/dist/{stale-ODM7IOO2.js → stale-YUYMETFC.js} +8 -8
- package/dist/{stats-NNXZMPZR.js → stats-F5JZVPYG.js} +1 -1
- package/dist/{status-HKCIXG7P.js → status-UYIQFC7L.js} +5 -5
- package/dist/{studio-EKIPLLHD.js → studio-6ZL76TZR.js} +1 -1
- package/dist/{sync-LGDTHM6C.js → sync-527ZCA4A.js} +4 -4
- package/dist/{sync-definition-6WBQN4Q3.js → sync-definition-M4KRPGTN.js} +9 -9
- package/dist/sync-definition-M4KRPGTN.js.map +1 -0
- package/dist/{tags-BQFPK55V.js → tags-2MX3332V.js} +5 -5
- package/dist/{tags-N72F6AMR.js → tags-7767I2D6.js} +4 -4
- package/dist/{tags-DRZ7GPP4.js → tags-J3BGX3E6.js} +5 -5
- package/dist/{tags-Q5NWILJO.js → tags-O27SK3YX.js} +4 -4
- package/dist/{tags-4NICM2LC.js → tags-VAYVSQM6.js} +5 -5
- package/dist/{targeting-criteria-DXHMEEC2.js → targeting-criteria-GOTI75Y4.js} +3 -3
- package/dist/{targets-A325AP5G.js → targets-FC7CGFRD.js} +5 -5
- package/dist/{templates-WWY4ZVKR.js → templates-EF5LOWP5.js} +5 -5
- package/dist/{testimonials-YVHSZTWW.js → testimonials-MRMRWF2T.js} +6 -6
- package/dist/themes-2ZV7OCJ3.js +94 -0
- package/dist/themes-2ZV7OCJ3.js.map +1 -0
- package/dist/{top-companies-S2Y4I5HF.js → top-companies-VTLR6GTW.js} +5 -5
- package/dist/{translate-BTUMXQSK.js → translate-UMTKAUJ3.js} +15 -15
- package/dist/{triggers-T47AIYVB.js → triggers-Y7ZMMY3C.js} +5 -5
- package/dist/{unlink-XRKX6DVP.js → unlink-HZCFLXH4.js} +5 -5
- package/dist/{unstage-77RAGX3F.js → unstage-562HOOE7.js} +5 -5
- package/dist/{update-R3QSTHUD.js → update-ATSXY5UN.js} +5 -5
- package/dist/{update-RJLMUP7I.js → update-DKU2UDFA.js} +4 -4
- package/dist/{update-YRO5IHDX.js → update-I5A5TOZJ.js} +5 -5
- package/dist/{update-NQIRRGOW.js → update-ZF3VFYLB.js} +5 -5
- package/dist/{upload-KWFKNKAF.js → upload-SIAI6NMH.js} +5 -5
- package/dist/{url-options-GGXAL3J4.js → url-options-JSX6HBZL.js} +10 -7
- package/dist/url-options-JSX6HBZL.js.map +1 -0
- package/dist/{url-params-IMC43AIM.js → url-params-AZUI3CW3.js} +5 -5
- package/dist/{validate-Y6R6F5T3.js → validate-MC4EIQI5.js} +7 -7
- package/dist/{videos-U2FPMNFS.js → videos-S7BYFSU3.js} +5 -5
- package/dist/{web-AHTOJNQY.js → web-5R7LHKIT.js} +5 -5
- package/dist/{winning-ads-TUYN2BST.js → winning-ads-PDCY4YW5.js} +2 -2
- package/dist/{write-commands-CT74VHH6.js → write-commands-MFRZD6Q6.js} +4 -4
- package/dist/{write-commands-2XFNH4BW.js → write-commands-VXL5QKMT.js} +7 -7
- package/dist/{x-5GDVUJ2I.js → x-22PKVRYX.js} +7 -7
- package/package.json +1 -1
- package/dist/chunk-GX6VAHY7.js.map +0 -1
- package/dist/chunk-LLOOWRBB.js.map +0 -1
- package/dist/chunk-NE4F3FHN.js +0 -1854
- package/dist/chunk-NE4F3FHN.js.map +0 -1
- package/dist/chunk-XCM6XWOB.js +0 -417
- package/dist/chunk-XCM6XWOB.js.map +0 -1
- package/dist/chunk-ZJWUBJYQ.js.map +0 -1
- package/dist/credentials-4V55RYZ6.js.map +0 -1
- package/dist/draft-5YAYCEYY.js +0 -107
- package/dist/draft-5YAYCEYY.js.map +0 -1
- package/dist/google-M7KEXVK5.js.map +0 -1
- package/dist/query-IEZRY6HV.js.map +0 -1
- package/dist/url-options-GGXAL3J4.js.map +0 -1
- /package/dist/{account-2OBWFPRG.js.map → account-AO6PNNPO.js.map} +0 -0
- /package/dist/{accounts-TDTME6RQ.js.map → accounts-4TM4UZEJ.js.map} +0 -0
- /package/dist/{accounts-TZQVAJ3V.js.map → accounts-XDC26KK6.js.map} +0 -0
- /package/dist/{actions-FHYESJEE.js.map → actions-CJB4GZYA.js.map} +0 -0
- /package/dist/{add-Q6YFHEOR.js.map → add-BP4CUUKB.js.map} +0 -0
- /package/dist/{add-7XB5X3D3.js.map → add-RYR3QGOP.js.map} +0 -0
- /package/dist/{ads-PGTFZA5Q.js.map → ads-GII5LEOH.js.map} +0 -0
- /package/dist/{ads-6UEDYT3O.js.map → ads-SATXH4OD.js.map} +0 -0
- /package/dist/{adsets-Q5DWGANV.js.map → adsets-PMXNW3EG.js.map} +0 -0
- /package/dist/{advertisers-RKWQDCOI.js.map → advertisers-GM5UFI44.js.map} +0 -0
- /package/dist/{analytics-DEJKJNLN.js.map → analytics-4CD7CH7H.js.map} +0 -0
- /package/dist/{analytics-U5TTTX7K.js.map → analytics-JDPRLCHQ.js.map} +0 -0
- /package/dist/{assign-RHUKQWH2.js.map → assign-XI4HIIIM.js.map} +0 -0
- /package/dist/{audience-size-ICEKQRE4.js.map → audience-size-DHZ65PGA.js.map} +0 -0
- /package/dist/{audiences-AMRFZRZ7.js.map → audiences-D7CXP3ZF.js.map} +0 -0
- /package/dist/{audit-GWLQVB4A.js.map → audit-M7BZYBIS.js.map} +0 -0
- /package/dist/{autocomplete-NAEVFMKZ.js.map → autocomplete-B45I26R4.js.map} +0 -0
- /package/dist/{avatars-PMV6IMFV.js.map → avatars-75BALNB7.js.map} +0 -0
- /package/dist/{bid-pricing-XF3LD65L.js.map → bid-pricing-4RCP24BE.js.map} +0 -0
- /package/dist/{brand-ZC5HDP7B.js.map → brand-2TOLKYDY.js.map} +0 -0
- /package/dist/{brief-3EZ2JS5F.js.map → brief-5G4NEZ4O.js.map} +0 -0
- /package/dist/{campaign-groups-JSHBFYDG.js.map → campaign-groups-G7B26V7K.js.map} +0 -0
- /package/dist/{campaign-writes-5PHXENPN.js.map → campaign-writes-HZ7ART7W.js.map} +0 -0
- /package/dist/{campaigns-D6B6Z67Y.js.map → campaigns-MEEM3CNC.js.map} +0 -0
- /package/dist/{campaigns-HPRQVXTH.js.map → campaigns-OIJGTO7W.js.map} +0 -0
- /package/dist/{campaigns-LQXELRHZ.js.map → campaigns-RW3QJQ2F.js.map} +0 -0
- /package/dist/{canvas-4NVEZNW5.js.map → canvas-LXRLDE5G.js.map} +0 -0
- /package/dist/{capabilities-VQRNPBOZ.js.map → capabilities-BWSB7IFT.js.map} +0 -0
- /package/dist/{changes-TP7ZZHB3.js.map → changes-AYLNY6KN.js.map} +0 -0
- /package/dist/{chatgpt-QNUN63YS.js.map → chatgpt-TNSRA3L3.js.map} +0 -0
- /package/dist/{chats-Q4QPA3OQ.js.map → chats-MMHBJQFM.js.map} +0 -0
- /package/dist/{chunk-RXGR63TP.js.map → chunk-24GELJP3.js.map} +0 -0
- /package/dist/{chunk-ZKYNGME7.js.map → chunk-2D4ASTGN.js.map} +0 -0
- /package/dist/{chunk-PRIHMSJH.js.map → chunk-2K4LMCV2.js.map} +0 -0
- /package/dist/{chunk-4GACYQUI.js.map → chunk-2YJL6MEB.js.map} +0 -0
- /package/dist/{chunk-L27H2R2N.js.map → chunk-2ZY7HON7.js.map} +0 -0
- /package/dist/{chunk-RZTNH2TX.js.map → chunk-45OQOUJA.js.map} +0 -0
- /package/dist/{chunk-YT2BSTD3.js.map → chunk-7TNPEURJ.js.map} +0 -0
- /package/dist/{chunk-WKS6ZDUP.js.map → chunk-BSOWFWEU.js.map} +0 -0
- /package/dist/{chunk-X5ECCSHP.js.map → chunk-D23EKXOP.js.map} +0 -0
- /package/dist/{chunk-FC3U5XKS.js.map → chunk-D7PFF6UC.js.map} +0 -0
- /package/dist/{chunk-OU5YA2QX.js.map → chunk-DT2XXF6O.js.map} +0 -0
- /package/dist/{chunk-ARBKEE6E.js.map → chunk-DYOI4FQ7.js.map} +0 -0
- /package/dist/{chunk-4EVLVA2R.js.map → chunk-EFM7OODQ.js.map} +0 -0
- /package/dist/{chunk-P6KWFODZ.js.map → chunk-EIIANSBX.js.map} +0 -0
- /package/dist/{chunk-HJMRWBR5.js.map → chunk-EYK6G4XE.js.map} +0 -0
- /package/dist/{chunk-PKC6QBYJ.js.map → chunk-EZWYX343.js.map} +0 -0
- /package/dist/{chunk-LIQ4SQ2T.js.map → chunk-FEELV5IV.js.map} +0 -0
- /package/dist/{chunk-YCWIGXH6.js.map → chunk-GP7QUF5A.js.map} +0 -0
- /package/dist/{chunk-ZGGGA3JR.js.map → chunk-HOXZOOVA.js.map} +0 -0
- /package/dist/{chunk-TJOGO2MK.js.map → chunk-JU7FIHQ2.js.map} +0 -0
- /package/dist/{chunk-MVYLY2SF.js.map → chunk-KN7DFVKW.js.map} +0 -0
- /package/dist/{chunk-K5H3XOYQ.js.map → chunk-LI6PGY3L.js.map} +0 -0
- /package/dist/{chunk-3KEWXALS.js.map → chunk-MCWYIEWI.js.map} +0 -0
- /package/dist/{chunk-LIWBVGRE.js.map → chunk-MFQ5SUJT.js.map} +0 -0
- /package/dist/{chunk-HEOWTR7Z.js.map → chunk-OW4XDJV2.js.map} +0 -0
- /package/dist/{chunk-KYR4EG3E.js.map → chunk-PHEEJUFL.js.map} +0 -0
- /package/dist/{chunk-KHV5GALI.js.map → chunk-QNDLOCAI.js.map} +0 -0
- /package/dist/{chunk-GQ7JE7A7.js.map → chunk-UZUHXN7H.js.map} +0 -0
- /package/dist/{chunk-YWK4UBVU.js.map → chunk-V5QJBDBC.js.map} +0 -0
- /package/dist/{chunk-LP2QDRO4.js.map → chunk-WBUMUELD.js.map} +0 -0
- /package/dist/{chunk-EP5TYLNV.js.map → chunk-WEU6GKUQ.js.map} +0 -0
- /package/dist/{chunk-46TPPYCI.js.map → chunk-X5VHGXFB.js.map} +0 -0
- /package/dist/{chunk-3V57D7GE.js.map → chunk-XJRBFLBD.js.map} +0 -0
- /package/dist/{chunk-QS2BDKFL.js.map → chunk-Y63Y4QSY.js.map} +0 -0
- /package/dist/{chunk-PAQ3T6OT.js.map → chunk-YRVDCIJ2.js.map} +0 -0
- /package/dist/{claim-RHZVTMQZ.js.map → claim-UDNXCJIU.js.map} +0 -0
- /package/dist/{companies-LIKSVYSR.js.map → companies-RPZN4JTR.js.map} +0 -0
- /package/dist/{complete-OM7R6VOC.js.map → complete-HLSRQE3N.js.map} +0 -0
- /package/dist/{connect-AVX3NKP6.js.map → connect-TIJZO7OV.js.map} +0 -0
- /package/dist/{conversation-3HGRWXKO.js.map → conversation-BS7TF6LZ.js.map} +0 -0
- /package/dist/{conversion-upload-command-AUF3LNTH.js.map → conversion-upload-command-CSD344BY.js.map} +0 -0
- /package/dist/{conversions-XADFSQ4W.js.map → conversions-FEWAX64H.js.map} +0 -0
- /package/dist/{create-PQSDE4J3.js.map → create-4SH4BZXP.js.map} +0 -0
- /package/dist/{create-BWHYYATN.js.map → create-B4UVIJZI.js.map} +0 -0
- /package/dist/{create-Z4JLLTPG.js.map → create-F5FNHJKE.js.map} +0 -0
- /package/dist/{create-3I64N6RJ.js.map → create-L3JHP6J4.js.map} +0 -0
- /package/dist/{creatives-WPRN6CU4.js.map → creatives-LK2NZHRX.js.map} +0 -0
- /package/dist/{creatives-UEPLNCPN.js.map → creatives-RQ2DFHGI.js.map} +0 -0
- /package/dist/{creatives-6Z7CEW5O.js.map → creatives-UILBPOKO.js.map} +0 -0
- /package/dist/{critique-M5TMIG2D.js.map → critique-FAOH4FCP.js.map} +0 -0
- /package/dist/{critique-K632OHFP.js.map → critique-X7HYYEJ4.js.map} +0 -0
- /package/dist/{crm-CWT6BMMX.js.map → crm-RB5TVV3M.js.map} +0 -0
- /package/dist/{crm-Q2QK4ZMS.js.map → crm-XEQDSU2U.js.map} +0 -0
- /package/dist/{currency-XCGKQ7FE.js.map → currency-47QHFHDA.js.map} +0 -0
- /package/dist/{custom-conversions-2VLJGPRV.js.map → custom-conversions-7HOWR6X6.js.map} +0 -0
- /package/dist/{customers-7TS64ZM5.js.map → customers-P5WOUY6G.js.map} +0 -0
- /package/dist/{delete-H7W3V6QG.js.map → delete-DLQ2ZZDA.js.map} +0 -0
- /package/dist/{delete-BPSOLCGB.js.map → delete-GZKGPBBD.js.map} +0 -0
- /package/dist/{delete-RIY5VUTU.js.map → delete-SW5OSIGN.js.map} +0 -0
- /package/dist/{demographics-NHGM4QP7.js.map → demographics-ZLZOIWUE.js.map} +0 -0
- /package/dist/{discard-IBMOGEYB.js.map → discard-VNVNJWNX.js.map} +0 -0
- /package/dist/{discover-BJPZNXUQ.js.map → discover-P6TUGZ45.js.map} +0 -0
- /package/dist/{domain-Y3N2UY5I.js.map → domain-OBICRJP3.js.map} +0 -0
- /package/dist/{draft-322ZG6JG.js.map → draft-UECMJ6B4.js.map} +0 -0
- /package/dist/{draft-6KBILDJK.js.map → draft-V75RBORX.js.map} +0 -0
- /package/dist/{draft-P5T2QHCY.js.map → draft-Z3VUQ4LJ.js.map} +0 -0
- /package/dist/{facets-3SDK42HY.js.map → facets-7J66L3NK.js.map} +0 -0
- /package/dist/{feedback-P2JZTJY5.js.map → feedback-3LDG4WVJ.js.map} +0 -0
- /package/dist/{feedback-record-5O6UUWTZ.js.map → feedback-record-CTAUHLMF.js.map} +0 -0
- /package/dist/{fetch-LN5W3J4E.js.map → fetch-4RXXZGO4.js.map} +0 -0
- /package/dist/{flows-MN26KBWB.js.map → flows-GGB46DLH.js.map} +0 -0
- /package/dist/{fonts-7TXPTNCS.js.map → fonts-S3GWKOUJ.js.map} +0 -0
- /package/dist/{forecast-ZHBKYQFP.js.map → forecast-6JVKXNFB.js.map} +0 -0
- /package/dist/{funnel-UAXVM7JN.js.map → funnel-RCQOIQZ5.js.map} +0 -0
- /package/dist/{ga4-DV2AXCSL.js.map → ga4-U6DMJ6K4.js.map} +0 -0
- /package/dist/{get-EKYSQHNB.js.map → get-KQSM2MXM.js.map} +0 -0
- /package/dist/{get-P7SSZ46N.js.map → get-MN2GRXGZ.js.map} +0 -0
- /package/dist/{google-ads-LZDXDFPW.js.map → google-ads-YAJ33LTW.js.map} +0 -0
- /package/dist/{history-BFGVCJ4J.js.map → history-QWYLRQBO.js.map} +0 -0
- /package/dist/{hubspot-I3PNNF3E.js.map → hubspot-DDONLJ7R.js.map} +0 -0
- /package/dist/{ideas-ZNP5BOGE.js.map → ideas-N44Z2SIT.js.map} +0 -0
- /package/dist/{images-MWWGN672.js.map → images-BKHCBCE7.js.map} +0 -0
- /package/dist/{ingest-H7BWHY7L.js.map → ingest-HBECWLOB.js.map} +0 -0
- /package/dist/{ingest-NYP2ZAAK.js.map → ingest-VNRTFD4Y.js.map} +0 -0
- /package/dist/{inspect-FNNDBZQX.js.map → inspect-7GGJDJBJ.js.map} +0 -0
- /package/dist/{inspiration-S3DU4CMQ.js.map → inspiration-CGM3NK6X.js.map} +0 -0
- /package/dist/{intent-E3UIVZBN.js.map → intent-HKNBXEDS.js.map} +0 -0
- /package/dist/{keyword-gap-BG6M665A.js.map → keyword-gap-HUSP6MOT.js.map} +0 -0
- /package/dist/{keyword-metrics-WG5LLBUW.js.map → keyword-metrics-2C3VFGDQ.js.map} +0 -0
- /package/dist/{keywords-for-site-HVEAAODA.js.map → keywords-for-site-4GV4KS4X.js.map} +0 -0
- /package/dist/{landing-G5MLO4CZ.js.map → landing-V2FMPQOK.js.map} +0 -0
- /package/dist/{languages-HORKPDNH.js.map → languages-75YJZAHL.js.map} +0 -0
- /package/dist/{leads-XCAE4OVV.js.map → leads-DTULNGMU.js.map} +0 -0
- /package/dist/{leads-ARUWPHBM.js.map → leads-OPRVJBQG.js.map} +0 -0
- /package/dist/{learn-5WSN4PT5.js.map → learn-EW2CKOFS.js.map} +0 -0
- /package/dist/{line-item-writes-4EOQBQSC.js.map → line-item-writes-EF3BJ5KV.js.map} +0 -0
- /package/dist/{line-items-45X5BVQW.js.map → line-items-G467XOZF.js.map} +0 -0
- /package/dist/{link-XAXNBIKU.js.map → link-5SU4MR6M.js.map} +0 -0
- /package/dist/{linkedin-62HOT3HB.js.map → linkedin-OFM3VVOB.js.map} +0 -0
- /package/dist/{list-PLWORN75.js.map → list-HEWXAVCL.js.map} +0 -0
- /package/dist/{list-NYTQ3DBH.js.map → list-SUTCQLGI.js.map} +0 -0
- /package/dist/{list-H4SN4QYE.js.map → list-VFZPXFMA.js.map} +0 -0
- /package/dist/{locations-J4G5RNPH.js.map → locations-6XADFU3V.js.map} +0 -0
- /package/dist/{log-S7TEGEPL.js.map → log-I3MAU44R.js.map} +0 -0
- /package/dist/{make-F6FOFAS4.js.map → make-ALBJZKJZ.js.map} +0 -0
- /package/dist/{map-V3YC6Y5I.js.map → map-OT6F33VF.js.map} +0 -0
- /package/dist/{mcp-3R3FOL2H.js.map → mcp-LC3L2JQO.js.map} +0 -0
- /package/dist/{media-53DJRC4N.js.map → media-MYZ5I7WK.js.map} +0 -0
- /package/dist/{media-sources-356UORTR.js.map → media-sources-RK6EJYBQ.js.map} +0 -0
- /package/dist/{members-KATLJNPJ.js.map → members-7CHDHW7H.js.map} +0 -0
- /package/dist/{meta-A7KM6TF5.js.map → meta-7XP5AWYU.js.map} +0 -0
- /package/dist/{metrics-SQDJ5NQO.js.map → metrics-73LI743C.js.map} +0 -0
- /package/dist/{normalize-RUPEDCAV.js.map → normalize-CXMYHNSA.js.map} +0 -0
- /package/dist/{options-SCYGSRQX.js.map → options-E4IO5SR5.js.map} +0 -0
- /package/dist/{performance-U3MA6YXN.js.map → performance-UQLSBPYN.js.map} +0 -0
- /package/dist/{plan-4QP2G7GV.js.map → plan-NBFLYAOW.js.map} +0 -0
- /package/dist/{promoted-tweet-writes-5UMGETBC.js.map → promoted-tweet-writes-ZW3FUPFG.js.map} +0 -0
- /package/dist/{promoted-tweets-A3V53KZI.js.map → promoted-tweets-ZLQ6GZD5.js.map} +0 -0
- /package/dist/{publish-V22K43GA.js.map → publish-H2PBR5XN.js.map} +0 -0
- /package/dist/{reddit-UACCQN3B.js.map → query-GDUTZ4R7.js.map} +0 -0
- /package/dist/{run-HMFS4KQZ.js.map → reddit-TGQYQUNZ.js.map} +0 -0
- /package/dist/{refresh-PSXGRCJE.js.map → refresh-HVBCC2ZI.js.map} +0 -0
- /package/dist/{release-S2X7UL4U.js.map → release-VI3JT6O6.js.map} +0 -0
- /package/dist/{relevant-pages-OWMNUCP7.js.map → relevant-pages-2FW3E5KD.js.map} +0 -0
- /package/dist/{remove-4GTKRBUW.js.map → remove-4EE7STMS.js.map} +0 -0
- /package/dist/{reopen-3KUS6UZ2.js.map → reopen-LEGLAOMA.js.map} +0 -0
- /package/dist/{rerun-ZHD7C4W2.js.map → rerun-A5DPZFOO.js.map} +0 -0
- /package/dist/{research-7LO3G3EP.js.map → research-O6YMV2TG.js.map} +0 -0
- /package/dist/{research-UF6PKQPH.js.map → research-WOJELJ4K.js.map} +0 -0
- /package/dist/{reset-PVXTS3FZ.js.map → reset-PQHURJDC.js.map} +0 -0
- /package/dist/{reset-PU57HTAP.js.map → reset-V2X7DFHD.js.map} +0 -0
- /package/dist/{resolve-KBIYWRF7.js.map → resolve-Q4AACDIC.js.map} +0 -0
- /package/dist/{retry-HKWNIGON.js.map → retry-BB6NJBC4.js.map} +0 -0
- /package/dist/{retry-LSCVGZM5.js.map → retry-WMGEUJPB.js.map} +0 -0
- /package/dist/{sync-definition-6WBQN4Q3.js.map → run-OBYA2F3E.js.map} +0 -0
- /package/dist/{run-DU6RVXPA.js.map → run-V6E36GXW.js.map} +0 -0
- /package/dist/{scaffold-ad-SLUGKZIW.js.map → scaffold-ad-KKYI7FZJ.js.map} +0 -0
- /package/dist/{scaffold-static-ad-NRFAA5HL.js.map → scaffold-static-ad-R5UE4YIZ.js.map} +0 -0
- /package/dist/{scaffold-video-Q7BSFVS4.js.map → scaffold-video-Y2BWXZSX.js.map} +0 -0
- /package/dist/{schedule-VNTGMFLQ.js.map → schedule-EO27AZTT.js.map} +0 -0
- /package/dist/{scheduled-agents-6TNWXJVH.js.map → scheduled-agents-OIJBX7OO.js.map} +0 -0
- /package/dist/{schema-ZEOL467O.js.map → schema-7GSCTQIC.js.map} +0 -0
- /package/dist/{search-XUINK3C2.js.map → search-Q7PAV7NY.js.map} +0 -0
- /package/dist/{select-U3DVKV72.js.map → select-ASR5SBYE.js.map} +0 -0
- /package/dist/{set-prompt-EQIVJ5LR.js.map → set-prompt-I32464V4.js.map} +0 -0
- /package/dist/{setup-links-CLPE6UUM.js.map → setup-links-NP2HULRC.js.map} +0 -0
- /package/dist/{site-GIZB7NWB.js.map → site-PTIYQQ3Z.js.map} +0 -0
- /package/dist/{sources-7RGXA35S.js.map → sources-5FRMFKDA.js.map} +0 -0
- /package/dist/{sources-2PG4U4BC.js.map → sources-FJLCIG6X.js.map} +0 -0
- /package/dist/{stale-ODM7IOO2.js.map → stale-YUYMETFC.js.map} +0 -0
- /package/dist/{stats-NNXZMPZR.js.map → stats-F5JZVPYG.js.map} +0 -0
- /package/dist/{status-HKCIXG7P.js.map → status-UYIQFC7L.js.map} +0 -0
- /package/dist/{studio-EKIPLLHD.js.map → studio-6ZL76TZR.js.map} +0 -0
- /package/dist/{sync-LGDTHM6C.js.map → sync-527ZCA4A.js.map} +0 -0
- /package/dist/{tags-BQFPK55V.js.map → tags-2MX3332V.js.map} +0 -0
- /package/dist/{tags-N72F6AMR.js.map → tags-7767I2D6.js.map} +0 -0
- /package/dist/{tags-DRZ7GPP4.js.map → tags-J3BGX3E6.js.map} +0 -0
- /package/dist/{tags-Q5NWILJO.js.map → tags-O27SK3YX.js.map} +0 -0
- /package/dist/{tags-4NICM2LC.js.map → tags-VAYVSQM6.js.map} +0 -0
- /package/dist/{targeting-criteria-DXHMEEC2.js.map → targeting-criteria-GOTI75Y4.js.map} +0 -0
- /package/dist/{targets-A325AP5G.js.map → targets-FC7CGFRD.js.map} +0 -0
- /package/dist/{templates-WWY4ZVKR.js.map → templates-EF5LOWP5.js.map} +0 -0
- /package/dist/{testimonials-YVHSZTWW.js.map → testimonials-MRMRWF2T.js.map} +0 -0
- /package/dist/{top-companies-S2Y4I5HF.js.map → top-companies-VTLR6GTW.js.map} +0 -0
- /package/dist/{translate-BTUMXQSK.js.map → translate-UMTKAUJ3.js.map} +0 -0
- /package/dist/{triggers-T47AIYVB.js.map → triggers-Y7ZMMY3C.js.map} +0 -0
- /package/dist/{unlink-XRKX6DVP.js.map → unlink-HZCFLXH4.js.map} +0 -0
- /package/dist/{unstage-77RAGX3F.js.map → unstage-562HOOE7.js.map} +0 -0
- /package/dist/{update-R3QSTHUD.js.map → update-ATSXY5UN.js.map} +0 -0
- /package/dist/{update-RJLMUP7I.js.map → update-DKU2UDFA.js.map} +0 -0
- /package/dist/{update-YRO5IHDX.js.map → update-I5A5TOZJ.js.map} +0 -0
- /package/dist/{update-NQIRRGOW.js.map → update-ZF3VFYLB.js.map} +0 -0
- /package/dist/{upload-KWFKNKAF.js.map → upload-SIAI6NMH.js.map} +0 -0
- /package/dist/{url-params-IMC43AIM.js.map → url-params-AZUI3CW3.js.map} +0 -0
- /package/dist/{validate-Y6R6F5T3.js.map → validate-MC4EIQI5.js.map} +0 -0
- /package/dist/{videos-U2FPMNFS.js.map → videos-S7BYFSU3.js.map} +0 -0
- /package/dist/{web-AHTOJNQY.js.map → web-5R7LHKIT.js.map} +0 -0
- /package/dist/{winning-ads-TUYN2BST.js.map → winning-ads-PDCY4YW5.js.map} +0 -0
- /package/dist/{write-commands-CT74VHH6.js.map → write-commands-MFRZD6Q6.js.map} +0 -0
- /package/dist/{write-commands-2XFNH4BW.js.map → write-commands-VXL5QKMT.js.map} +0 -0
- /package/dist/{x-5GDVUJ2I.js.map → x-22PKVRYX.js.map} +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
getFieldDescriptions
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-JPK34QPS.js";
|
|
4
4
|
import {
|
|
5
5
|
LIST_FIELDS,
|
|
6
6
|
duringLiteralExplanation,
|
|
@@ -8,8 +8,7 @@ import {
|
|
|
8
8
|
isDuringLiteral,
|
|
9
9
|
listFieldGuidance,
|
|
10
10
|
parseApiError
|
|
11
|
-
} from "./chunk-
|
|
12
|
-
import "./chunk-XCM6XWOB.js";
|
|
11
|
+
} from "./chunk-5FWMRTNB.js";
|
|
13
12
|
import {
|
|
14
13
|
buildQueryCacheKey,
|
|
15
14
|
cacheGet,
|
|
@@ -22,17 +21,14 @@ import {
|
|
|
22
21
|
} from "./chunk-VFIOJD5M.js";
|
|
23
22
|
import {
|
|
24
23
|
GOOGLE_ADS_QUERY_MAX_PAGE_SIZE
|
|
25
|
-
} from "./chunk-
|
|
24
|
+
} from "./chunk-ML7DLFFY.js";
|
|
26
25
|
import {
|
|
27
26
|
ApiError,
|
|
28
27
|
apiPost
|
|
29
28
|
} from "./chunk-XBOK23HI.js";
|
|
30
|
-
import "./chunk-IFWP3ZDO.js";
|
|
31
|
-
import "./chunk-NAWWC5I3.js";
|
|
32
29
|
import {
|
|
33
30
|
registerSchema
|
|
34
31
|
} from "./chunk-NU7JSWVA.js";
|
|
35
|
-
import "./chunk-YQSBHWOI.js";
|
|
36
32
|
|
|
37
33
|
// src/commands/ads/google/query.ts
|
|
38
34
|
import { appendFileSync, existsSync, readFileSync, writeFileSync } from "fs";
|
|
@@ -67,11 +63,11 @@ var SERVING_CHAINS = {
|
|
|
67
63
|
campaign_asset: ["campaign.status", "campaign_asset.status"],
|
|
68
64
|
ad_group_asset: ["campaign.status", "ad_group.status", "ad_group_asset.status"]
|
|
69
65
|
};
|
|
70
|
-
var
|
|
66
|
+
var CORE_PRESETS = [
|
|
71
67
|
{
|
|
72
68
|
name: "campaign-performance",
|
|
73
69
|
description: "Campaign-level metrics overview",
|
|
74
|
-
gaqlTemplate: `SELECT campaign.id, campaign.name, campaign.status, campaign.advertising_channel_type, metrics.impressions, metrics.clicks, metrics.cost_micros, metrics.conversions, metrics.conversions_value, metrics.ctr, metrics.average_cpc FROM campaign WHERE segments.date DURING {dateRange}{statusScope} ORDER BY metrics.cost_micros DESC
|
|
70
|
+
gaqlTemplate: `SELECT campaign.id, campaign.name, campaign.status, campaign.advertising_channel_type, metrics.impressions, metrics.clicks, metrics.cost_micros, metrics.conversions, metrics.conversions_value, metrics.ctr, metrics.average_cpc FROM campaign WHERE segments.date DURING {dateRange}{statusScope} ORDER BY metrics.cost_micros DESC`,
|
|
75
71
|
defaultDateRange: "LAST_30_DAYS",
|
|
76
72
|
defaultLimit: 200,
|
|
77
73
|
statusFields: ["campaign.status"]
|
|
@@ -79,7 +75,7 @@ var PRESETS = [
|
|
|
79
75
|
{
|
|
80
76
|
name: "budget-limited",
|
|
81
77
|
description: "Campaigns Google reports as limited by budget, with each one's bid target next to its actual cost per conversion \u2014 the state where a target above actual now drives delivery up to the target instead of holding recent cost",
|
|
82
|
-
gaqlTemplate: `SELECT campaign.id, campaign.name, campaign.status, campaign.advertising_channel_type, campaign.bidding_strategy_type, campaign.primary_status, campaign.primary_status_reasons, campaign.target_cpa.target_cpa_micros, campaign.maximize_conversions.target_cpa_micros, campaign.target_roas.target_roas, campaign.maximize_conversion_value.target_roas, campaign.target_cpc.target_cpc_micros, campaign_budget.amount_micros, metrics.cost_micros, metrics.conversions, metrics.conversions_value, metrics.cost_per_conversion, metrics.search_budget_lost_impression_share FROM campaign WHERE campaign.primary_status_reasons CONTAINS ANY (BUDGET_CONSTRAINED) AND segments.date DURING {dateRange}{statusScope} ORDER BY metrics.cost_micros DESC
|
|
78
|
+
gaqlTemplate: `SELECT campaign.id, campaign.name, campaign.status, campaign.advertising_channel_type, campaign.bidding_strategy_type, campaign.primary_status, campaign.primary_status_reasons, campaign.target_cpa.target_cpa_micros, campaign.maximize_conversions.target_cpa_micros, campaign.target_roas.target_roas, campaign.maximize_conversion_value.target_roas, campaign.target_cpc.target_cpc_micros, campaign_budget.amount_micros, metrics.cost_micros, metrics.conversions, metrics.conversions_value, metrics.cost_per_conversion, metrics.search_budget_lost_impression_share FROM campaign WHERE campaign.primary_status_reasons CONTAINS ANY (BUDGET_CONSTRAINED) AND segments.date DURING {dateRange}{statusScope} ORDER BY metrics.cost_micros DESC`,
|
|
83
79
|
defaultDateRange: "LAST_30_DAYS",
|
|
84
80
|
defaultLimit: 200,
|
|
85
81
|
statusFields: ["campaign.status"]
|
|
@@ -87,7 +83,7 @@ var PRESETS = [
|
|
|
87
83
|
{
|
|
88
84
|
name: "conversions-by-action",
|
|
89
85
|
description: "Which conversion action each campaign's conversions actually are \u2014 the read that says whether two campaigns' conversion rates are measuring the same event",
|
|
90
|
-
gaqlTemplate: `SELECT campaign.id, campaign.name, segments.conversion_action_name, segments.conversion_action_category, metrics.conversions, metrics.all_conversions FROM campaign WHERE segments.date DURING {dateRange}{statusScope} ORDER BY metrics.conversions DESC
|
|
86
|
+
gaqlTemplate: `SELECT campaign.id, campaign.name, segments.conversion_action_name, segments.conversion_action_category, metrics.conversions, metrics.all_conversions FROM campaign WHERE segments.date DURING {dateRange}{statusScope} ORDER BY metrics.conversions DESC`,
|
|
91
87
|
defaultDateRange: "LAST_30_DAYS",
|
|
92
88
|
defaultLimit: 200,
|
|
93
89
|
statusFields: ["campaign.status"]
|
|
@@ -95,7 +91,7 @@ var PRESETS = [
|
|
|
95
91
|
{
|
|
96
92
|
name: "keyword-analysis",
|
|
97
93
|
description: "Keyword performance with match type and quality",
|
|
98
|
-
gaqlTemplate: `SELECT campaign.id, campaign.name, campaign.status, ad_group.id, ad_group.name, ad_group.status, ad_group_criterion.criterion_id, ad_group_criterion.keyword.text, ad_group_criterion.keyword.match_type, ad_group_criterion.status, ad_group_criterion.quality_info.quality_score, metrics.impressions, metrics.clicks, metrics.cost_micros, metrics.conversions, metrics.ctr FROM keyword_view WHERE segments.date DURING {dateRange}{statusScope} ORDER BY metrics.impressions DESC
|
|
94
|
+
gaqlTemplate: `SELECT campaign.id, campaign.name, campaign.status, ad_group.id, ad_group.name, ad_group.status, ad_group_criterion.criterion_id, ad_group_criterion.keyword.text, ad_group_criterion.keyword.match_type, ad_group_criterion.status, ad_group_criterion.quality_info.quality_score, metrics.impressions, metrics.clicks, metrics.cost_micros, metrics.conversions, metrics.ctr FROM keyword_view WHERE segments.date DURING {dateRange}{statusScope} ORDER BY metrics.impressions DESC`,
|
|
99
95
|
defaultDateRange: "LAST_30_DAYS",
|
|
100
96
|
defaultLimit: 200,
|
|
101
97
|
statusFields: ["campaign.status", "ad_group.status", "ad_group_criterion.status"]
|
|
@@ -103,7 +99,7 @@ var PRESETS = [
|
|
|
103
99
|
{
|
|
104
100
|
name: "keyword-serving",
|
|
105
101
|
description: "Why a keyword is limited \u2014 Google Ads' 'Eligible (Limited) / Below first page bid' column, with the first-page bid estimate, the current max CPC and quality score",
|
|
106
|
-
gaqlTemplate: `SELECT campaign.id, campaign.name, ad_group.id, ad_group.name, ad_group_criterion.criterion_id, ad_group_criterion.keyword.text, ad_group_criterion.keyword.match_type, ad_group_criterion.status, ad_group_criterion.primary_status, ad_group_criterion.primary_status_reasons, ad_group_criterion.system_serving_status, ad_group_criterion.approval_status, ad_group_criterion.effective_cpc_bid_micros, ad_group_criterion.effective_cpc_bid_source, ad_group_criterion.position_estimates.first_page_cpc_micros, ad_group_criterion.position_estimates.top_of_page_cpc_micros, ad_group_criterion.quality_info.quality_score, ad_group_criterion.quality_info.creative_quality_score, ad_group_criterion.quality_info.post_click_quality_score, ad_group_criterion.quality_info.search_predicted_ctr FROM ad_group_criterion WHERE ad_group_criterion.type = 'KEYWORD' AND ad_group_criterion.negative = FALSE{statusScope} ORDER BY campaign.name
|
|
102
|
+
gaqlTemplate: `SELECT campaign.id, campaign.name, ad_group.id, ad_group.name, ad_group_criterion.criterion_id, ad_group_criterion.keyword.text, ad_group_criterion.keyword.match_type, ad_group_criterion.status, ad_group_criterion.primary_status, ad_group_criterion.primary_status_reasons, ad_group_criterion.system_serving_status, ad_group_criterion.approval_status, ad_group_criterion.effective_cpc_bid_micros, ad_group_criterion.effective_cpc_bid_source, ad_group_criterion.position_estimates.first_page_cpc_micros, ad_group_criterion.position_estimates.top_of_page_cpc_micros, ad_group_criterion.quality_info.quality_score, ad_group_criterion.quality_info.creative_quality_score, ad_group_criterion.quality_info.post_click_quality_score, ad_group_criterion.quality_info.search_predicted_ctr FROM ad_group_criterion WHERE ad_group_criterion.type = 'KEYWORD' AND ad_group_criterion.negative = FALSE{statusScope} ORDER BY campaign.name`,
|
|
107
103
|
defaultDateRange: "ALL_TIME",
|
|
108
104
|
defaultLimit: 500,
|
|
109
105
|
statusFields: ["campaign.status", "ad_group.status", "ad_group_criterion.status"]
|
|
@@ -111,7 +107,7 @@ var PRESETS = [
|
|
|
111
107
|
{
|
|
112
108
|
name: "positive-keywords",
|
|
113
109
|
description: "Positive (targeting) keywords only \u2014 excludes negatives",
|
|
114
|
-
gaqlTemplate: `SELECT campaign.id, campaign.name, campaign.status, ad_group.id, ad_group.name, ad_group.status, ad_group_criterion.criterion_id, ad_group_criterion.keyword.text, ad_group_criterion.keyword.match_type, ad_group_criterion.status, ad_group_criterion.negative FROM ad_group_criterion WHERE ad_group_criterion.type = 'KEYWORD' AND ad_group_criterion.negative = FALSE{statusScope} ORDER BY campaign.name
|
|
110
|
+
gaqlTemplate: `SELECT campaign.id, campaign.name, campaign.status, ad_group.id, ad_group.name, ad_group.status, ad_group_criterion.criterion_id, ad_group_criterion.keyword.text, ad_group_criterion.keyword.match_type, ad_group_criterion.status, ad_group_criterion.negative FROM ad_group_criterion WHERE ad_group_criterion.type = 'KEYWORD' AND ad_group_criterion.negative = FALSE{statusScope} ORDER BY campaign.name`,
|
|
115
111
|
defaultDateRange: "ALL_TIME",
|
|
116
112
|
defaultLimit: 500,
|
|
117
113
|
statusFields: ["campaign.status", "ad_group.status", "ad_group_criterion.status"]
|
|
@@ -119,28 +115,28 @@ var PRESETS = [
|
|
|
119
115
|
{
|
|
120
116
|
name: "negative-keywords",
|
|
121
117
|
description: "Negative keywords only \u2014 campaign and ad group level",
|
|
122
|
-
gaqlTemplate: `SELECT campaign.id, campaign.name, ad_group.name, ad_group_criterion.keyword.text, ad_group_criterion.keyword.match_type, ad_group_criterion.negative FROM ad_group_criterion WHERE ad_group_criterion.type = 'KEYWORD' AND ad_group_criterion.negative = TRUE AND campaign.status != 'REMOVED' ORDER BY campaign.name
|
|
118
|
+
gaqlTemplate: `SELECT campaign.id, campaign.name, ad_group.name, ad_group_criterion.keyword.text, ad_group_criterion.keyword.match_type, ad_group_criterion.negative FROM ad_group_criterion WHERE ad_group_criterion.type = 'KEYWORD' AND ad_group_criterion.negative = TRUE AND campaign.status != 'REMOVED' ORDER BY campaign.name`,
|
|
123
119
|
defaultDateRange: "ALL_TIME",
|
|
124
120
|
defaultLimit: 500
|
|
125
121
|
},
|
|
126
122
|
{
|
|
127
123
|
name: "negative-keyword-lists",
|
|
128
|
-
description: "Shared negative keyword lists and the terms inside them (SharedSet members)",
|
|
129
|
-
gaqlTemplate: `SELECT shared_set.id, shared_set.name, shared_criterion.keyword.text, shared_criterion.keyword.match_type FROM shared_criterion WHERE shared_set.type = 'NEGATIVE_KEYWORDS' AND shared_set.status = 'ENABLED' ORDER BY shared_set.name
|
|
124
|
+
description: "Shared negative keyword lists and the terms inside them (SharedSet members), with each member's resource name \u2014 what `negative-keywords remove` / a list-member removal takes",
|
|
125
|
+
gaqlTemplate: `SELECT shared_set.id, shared_set.name, shared_criterion.resource_name, shared_criterion.criterion_id, shared_criterion.keyword.text, shared_criterion.keyword.match_type FROM shared_criterion WHERE shared_set.type = 'NEGATIVE_KEYWORDS' AND shared_set.status = 'ENABLED' ORDER BY shared_set.name`,
|
|
130
126
|
defaultDateRange: "ALL_TIME",
|
|
131
127
|
defaultLimit: 500
|
|
132
128
|
},
|
|
133
129
|
{
|
|
134
130
|
name: "negative-list-attachments",
|
|
135
131
|
description: "Which campaigns each shared negative keyword list is attached to",
|
|
136
|
-
gaqlTemplate: `SELECT campaign.id, campaign.name, shared_set.id, shared_set.name FROM campaign_shared_set WHERE shared_set.type = 'NEGATIVE_KEYWORDS' AND campaign_shared_set.status = 'ENABLED' ORDER BY campaign.name
|
|
132
|
+
gaqlTemplate: `SELECT campaign.id, campaign.name, shared_set.id, shared_set.name FROM campaign_shared_set WHERE shared_set.type = 'NEGATIVE_KEYWORDS' AND campaign_shared_set.status = 'ENABLED' ORDER BY campaign.name`,
|
|
137
133
|
defaultDateRange: "ALL_TIME",
|
|
138
134
|
defaultLimit: 500
|
|
139
135
|
},
|
|
140
136
|
{
|
|
141
137
|
name: "search-terms",
|
|
142
138
|
description: "Actual user search queries triggering ads",
|
|
143
|
-
gaqlTemplate: `SELECT campaign.id, campaign.name, campaign.status, ad_group.name, ad_group.status, search_term_view.search_term, metrics.impressions, metrics.clicks, metrics.cost_micros, metrics.conversions FROM search_term_view WHERE segments.date DURING {dateRange}{statusScope} ORDER BY metrics.impressions DESC
|
|
139
|
+
gaqlTemplate: `SELECT campaign.id, campaign.name, campaign.status, ad_group.name, ad_group.status, search_term_view.search_term, metrics.impressions, metrics.clicks, metrics.cost_micros, metrics.conversions FROM search_term_view WHERE segments.date DURING {dateRange}{statusScope} ORDER BY metrics.impressions DESC`,
|
|
144
140
|
defaultDateRange: "LAST_7_DAYS",
|
|
145
141
|
defaultLimit: 200,
|
|
146
142
|
statusFields: ["campaign.status", "ad_group.status"]
|
|
@@ -148,15 +144,17 @@ var PRESETS = [
|
|
|
148
144
|
{
|
|
149
145
|
name: "ad-copy-performance",
|
|
150
146
|
description: "Ad headline and description effectiveness",
|
|
151
|
-
gaqlTemplate: `SELECT campaign.id, campaign.name, campaign.status, ad_group.status, ad_group_ad.status, ad_group_ad.ad.responsive_search_ad.headlines, ad_group_ad.ad.responsive_search_ad.descriptions, ad_group_ad.ad.final_urls, metrics.impressions, metrics.clicks, metrics.conversions, metrics.ctr FROM ad_group_ad WHERE segments.date DURING {dateRange}{statusScope} ORDER BY metrics.impressions DESC
|
|
147
|
+
gaqlTemplate: `SELECT campaign.id, campaign.name, campaign.status, ad_group.status, ad_group_ad.status, ad_group_ad.ad.responsive_search_ad.headlines, ad_group_ad.ad.responsive_search_ad.descriptions, ad_group_ad.ad.final_urls, metrics.impressions, metrics.clicks, metrics.conversions, metrics.ctr FROM ad_group_ad WHERE segments.date DURING {dateRange}{statusScope} ORDER BY metrics.impressions DESC`,
|
|
152
148
|
defaultDateRange: "LAST_30_DAYS",
|
|
153
149
|
defaultLimit: 200,
|
|
154
150
|
statusFields: ["campaign.status", "ad_group.status", "ad_group_ad.status"]
|
|
155
151
|
},
|
|
156
152
|
{
|
|
157
153
|
name: "asset-performance",
|
|
158
|
-
|
|
159
|
-
|
|
154
|
+
// `asset_group_asset.performance_label` is gone (v25 answers UNRECOGNIZED_FIELD): Google retired
|
|
155
|
+
// the BEST/GOOD/LOW label, so the read is each asset's serving status and its own metrics.
|
|
156
|
+
description: "Performance Max assets: serving status and metrics per asset",
|
|
157
|
+
gaqlTemplate: `SELECT campaign.id, campaign.name, campaign.status, asset_group.name, asset_group.status, asset_group_asset.status, asset_group_asset.field_type, asset_group_asset.primary_status, asset_group_asset.primary_status_reasons, asset.type, asset.text_asset.text, asset.image_asset.full_size.url, metrics.impressions, metrics.clicks, metrics.conversions, metrics.cost_micros FROM asset_group_asset WHERE campaign.advertising_channel_type = 'PERFORMANCE_MAX' AND segments.date DURING {dateRange}{statusScope}`,
|
|
160
158
|
defaultDateRange: "LAST_30_DAYS",
|
|
161
159
|
defaultLimit: 200,
|
|
162
160
|
statusFields: ["campaign.status", "asset_group.status", "asset_group_asset.status"]
|
|
@@ -164,7 +162,7 @@ var PRESETS = [
|
|
|
164
162
|
{
|
|
165
163
|
name: "shopping-products",
|
|
166
164
|
description: "Product-level shopping performance metrics",
|
|
167
|
-
gaqlTemplate: `SELECT campaign.id, campaign.name, campaign.status, segments.product_title, segments.product_item_id, segments.product_brand, segments.product_type_l1, metrics.clicks, metrics.impressions, metrics.cost_micros, metrics.conversions FROM shopping_performance_view WHERE segments.date DURING {dateRange}{statusScope} ORDER BY metrics.cost_micros DESC
|
|
165
|
+
gaqlTemplate: `SELECT campaign.id, campaign.name, campaign.status, segments.product_title, segments.product_item_id, segments.product_brand, segments.product_type_l1, metrics.clicks, metrics.impressions, metrics.cost_micros, metrics.conversions FROM shopping_performance_view WHERE segments.date DURING {dateRange}{statusScope} ORDER BY metrics.cost_micros DESC`,
|
|
168
166
|
defaultDateRange: "LAST_30_DAYS",
|
|
169
167
|
defaultLimit: 200,
|
|
170
168
|
statusFields: ["campaign.status"]
|
|
@@ -177,6 +175,253 @@ var PRESETS = [
|
|
|
177
175
|
defaultLimit: 1
|
|
178
176
|
}
|
|
179
177
|
];
|
|
178
|
+
var REPORT_PRESETS = [
|
|
179
|
+
{
|
|
180
|
+
name: "pmax-channels",
|
|
181
|
+
description: "Performance Max spend and results split by channel (Search, YouTube, Display, Discover, Gmail, Maps\u2026) \u2014 segments.ad_network_type per campaign",
|
|
182
|
+
gaqlTemplate: `SELECT campaign.id, campaign.name, campaign.status, segments.ad_network_type, metrics.impressions, metrics.clicks, metrics.cost_micros, metrics.conversions, metrics.conversions_value FROM campaign WHERE campaign.advertising_channel_type = 'PERFORMANCE_MAX' AND segments.date DURING {dateRange}{statusScope} ORDER BY metrics.cost_micros DESC`,
|
|
183
|
+
defaultDateRange: "LAST_30_DAYS",
|
|
184
|
+
defaultLimit: 200,
|
|
185
|
+
statusFields: ["campaign.status"]
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
name: "pmax-placements",
|
|
189
|
+
description: "Where Performance Max ads showed on Display / YouTube / apps (Google reports impressions only for these)",
|
|
190
|
+
gaqlTemplate: `SELECT campaign.id, campaign.name, campaign.status, performance_max_placement_view.display_name, performance_max_placement_view.placement, performance_max_placement_view.placement_type, performance_max_placement_view.target_url, metrics.impressions FROM performance_max_placement_view WHERE segments.date DURING {dateRange}{statusScope} ORDER BY metrics.impressions DESC`,
|
|
191
|
+
defaultDateRange: "LAST_30_DAYS",
|
|
192
|
+
defaultLimit: 200,
|
|
193
|
+
statusFields: ["campaign.status"]
|
|
194
|
+
},
|
|
195
|
+
{
|
|
196
|
+
name: "placements",
|
|
197
|
+
description: "Where Display, Video and Demand Gen ads showed \u2014 each website, app or YouTube video, with cost and conversions (exclusion candidates)",
|
|
198
|
+
gaqlTemplate: `SELECT campaign.id, campaign.name, campaign.status, ad_group.id, ad_group.name, ad_group.status, detail_placement_view.display_name, detail_placement_view.placement, detail_placement_view.placement_type, detail_placement_view.target_url, metrics.impressions, metrics.clicks, metrics.cost_micros, metrics.conversions FROM detail_placement_view WHERE segments.date DURING {dateRange}{statusScope} ORDER BY metrics.cost_micros DESC`,
|
|
199
|
+
defaultDateRange: "LAST_30_DAYS",
|
|
200
|
+
defaultLimit: 200,
|
|
201
|
+
statusFields: ["campaign.status", "ad_group.status"]
|
|
202
|
+
},
|
|
203
|
+
{
|
|
204
|
+
name: "rsa-assets",
|
|
205
|
+
description: "Each responsive search ad headline and description: its text, pin, whether it is enabled, its approval and its own impressions/clicks/conversions",
|
|
206
|
+
gaqlTemplate: `SELECT campaign.id, campaign.name, campaign.status, ad_group.id, ad_group.name, ad_group.status, ad_group_ad.ad.id, ad_group_ad.status, ad_group_ad_asset_view.field_type, ad_group_ad_asset_view.pinned_field, ad_group_ad_asset_view.enabled, ad_group_ad_asset_view.policy_summary, asset.id, asset.text_asset.text, metrics.impressions, metrics.clicks, metrics.conversions FROM ad_group_ad_asset_view WHERE ad_group_ad.ad.type = 'RESPONSIVE_SEARCH_AD' AND segments.date DURING {dateRange}{statusScope} ORDER BY metrics.impressions DESC`,
|
|
207
|
+
defaultDateRange: "LAST_30_DAYS",
|
|
208
|
+
defaultLimit: 500,
|
|
209
|
+
statusFields: ["campaign.status", "ad_group.status", "ad_group_ad.status"]
|
|
210
|
+
},
|
|
211
|
+
{
|
|
212
|
+
name: "landing-pages",
|
|
213
|
+
description: "Final URLs as written on the ads, with clicks, cost, conversions, mobile-friendly click share and speed score",
|
|
214
|
+
gaqlTemplate: `SELECT campaign.id, campaign.name, campaign.status, landing_page_view.unexpanded_final_url, metrics.impressions, metrics.clicks, metrics.cost_micros, metrics.conversions, metrics.mobile_friendly_clicks_percentage, metrics.speed_score FROM landing_page_view WHERE segments.date DURING {dateRange}{statusScope} ORDER BY metrics.clicks DESC`,
|
|
215
|
+
defaultDateRange: "LAST_30_DAYS",
|
|
216
|
+
defaultLimit: 200,
|
|
217
|
+
statusFields: ["campaign.status"]
|
|
218
|
+
},
|
|
219
|
+
{
|
|
220
|
+
name: "geo-performance",
|
|
221
|
+
description: "Results by country and location type (people IN vs INTERESTED IN the place) per campaign \u2014 the read behind a Presence vs Presence-or-interest decision",
|
|
222
|
+
gaqlTemplate: `SELECT campaign.id, campaign.name, campaign.status, geographic_view.country_criterion_id, geographic_view.location_type, metrics.impressions, metrics.clicks, metrics.cost_micros, metrics.conversions FROM geographic_view WHERE segments.date DURING {dateRange}{statusScope} ORDER BY metrics.cost_micros DESC`,
|
|
223
|
+
defaultDateRange: "LAST_30_DAYS",
|
|
224
|
+
defaultLimit: 200,
|
|
225
|
+
statusFields: ["campaign.status"]
|
|
226
|
+
},
|
|
227
|
+
{
|
|
228
|
+
name: "age-performance",
|
|
229
|
+
description: "Results by age range per ad group",
|
|
230
|
+
gaqlTemplate: `SELECT campaign.id, campaign.name, campaign.status, ad_group.id, ad_group.name, ad_group.status, ad_group_criterion.age_range.type, metrics.impressions, metrics.clicks, metrics.cost_micros, metrics.conversions FROM age_range_view WHERE segments.date DURING {dateRange}{statusScope} ORDER BY metrics.cost_micros DESC`,
|
|
231
|
+
defaultDateRange: "LAST_30_DAYS",
|
|
232
|
+
defaultLimit: 200,
|
|
233
|
+
statusFields: ["campaign.status", "ad_group.status"]
|
|
234
|
+
},
|
|
235
|
+
{
|
|
236
|
+
name: "gender-performance",
|
|
237
|
+
description: "Results by gender per ad group",
|
|
238
|
+
gaqlTemplate: `SELECT campaign.id, campaign.name, campaign.status, ad_group.id, ad_group.name, ad_group.status, ad_group_criterion.gender.type, metrics.impressions, metrics.clicks, metrics.cost_micros, metrics.conversions FROM gender_view WHERE segments.date DURING {dateRange}{statusScope} ORDER BY metrics.cost_micros DESC`,
|
|
239
|
+
defaultDateRange: "LAST_30_DAYS",
|
|
240
|
+
defaultLimit: 200,
|
|
241
|
+
statusFields: ["campaign.status", "ad_group.status"]
|
|
242
|
+
},
|
|
243
|
+
{
|
|
244
|
+
name: "ai-max-search-terms",
|
|
245
|
+
description: "AI Max for Search: each search term with the headline and landing page Google generated or chose for it, with results",
|
|
246
|
+
gaqlTemplate: `SELECT campaign.id, campaign.name, campaign.status, ad_group.id, ad_group.name, ad_group.status, ai_max_search_term_ad_combination_view.search_term, ai_max_search_term_ad_combination_view.headline, ai_max_search_term_ad_combination_view.landing_page, metrics.impressions, metrics.clicks, metrics.cost_micros, metrics.conversions FROM ai_max_search_term_ad_combination_view WHERE segments.date DURING {dateRange}{statusScope} ORDER BY metrics.impressions DESC`,
|
|
247
|
+
defaultDateRange: "LAST_30_DAYS",
|
|
248
|
+
defaultLimit: 200,
|
|
249
|
+
statusFields: ["campaign.status", "ad_group.status"]
|
|
250
|
+
},
|
|
251
|
+
{
|
|
252
|
+
name: "account-budget",
|
|
253
|
+
description: "The account budget (invoiced billing): approved spending limit, served amount, dates and any pending change \u2014 read-only",
|
|
254
|
+
gaqlTemplate: `SELECT account_budget.id, account_budget.name, account_budget.status, account_budget.billing_setup, account_budget.approved_spending_limit_micros, account_budget.approved_spending_limit_type, account_budget.amount_served_micros, account_budget.total_adjustments_micros, account_budget.approved_start_date_time, account_budget.approved_end_date_time, account_budget.pending_proposal.proposal_type, account_budget.pending_proposal.spending_limit_micros FROM account_budget ORDER BY account_budget.approved_start_date_time DESC`,
|
|
255
|
+
defaultDateRange: "ALL_TIME",
|
|
256
|
+
defaultLimit: 50
|
|
257
|
+
},
|
|
258
|
+
{
|
|
259
|
+
name: "recommendations",
|
|
260
|
+
description: "Google's open recommendations (not dismissed): type, the campaign/ad group it targets, and its estimated impact",
|
|
261
|
+
gaqlTemplate: `SELECT recommendation.resource_name, recommendation.type, recommendation.campaign, recommendation.ad_group, recommendation.impact FROM recommendation WHERE recommendation.dismissed = FALSE`,
|
|
262
|
+
defaultDateRange: "ALL_TIME",
|
|
263
|
+
defaultLimit: 200
|
|
264
|
+
},
|
|
265
|
+
{
|
|
266
|
+
name: "campaign-simulations",
|
|
267
|
+
description: "Google's what-if curves per campaign \u2014 budget, target CPA / ROAS, CPC bid or target impression share against the clicks, cost and conversions Google predicts",
|
|
268
|
+
gaqlTemplate: `SELECT campaign_simulation.campaign_id, campaign_simulation.type, campaign_simulation.modification_method, campaign_simulation.start_date, campaign_simulation.end_date, campaign_simulation.budget_point_list.points, campaign_simulation.target_cpa_point_list.points, campaign_simulation.target_roas_point_list.points, campaign_simulation.cpc_bid_point_list.points, campaign_simulation.target_impression_share_point_list.points FROM campaign_simulation`,
|
|
269
|
+
defaultDateRange: "ALL_TIME",
|
|
270
|
+
defaultLimit: 200
|
|
271
|
+
},
|
|
272
|
+
{
|
|
273
|
+
name: "keyword-bid-simulations",
|
|
274
|
+
description: "Google's what-if curve per keyword: CPC bid against predicted clicks, cost and impressions",
|
|
275
|
+
gaqlTemplate: `SELECT ad_group_criterion_simulation.ad_group_id, ad_group_criterion_simulation.criterion_id, ad_group_criterion_simulation.type, ad_group_criterion_simulation.start_date, ad_group_criterion_simulation.end_date, ad_group_criterion_simulation.cpc_bid_point_list.points FROM ad_group_criterion_simulation`,
|
|
276
|
+
defaultDateRange: "ALL_TIME",
|
|
277
|
+
defaultLimit: 200
|
|
278
|
+
}
|
|
279
|
+
];
|
|
280
|
+
var INVENTORY_PRESETS = [
|
|
281
|
+
{
|
|
282
|
+
name: "campaigns",
|
|
283
|
+
description: "Every campaign: id, name, status, channel, bidding, budget and dates",
|
|
284
|
+
gaqlTemplate: `SELECT campaign.id, campaign.name, campaign.status, campaign.primary_status, campaign.advertising_channel_type, campaign.advertising_channel_sub_type, campaign.bidding_strategy_type, campaign.bidding_strategy, campaign.campaign_budget, campaign_budget.amount_micros, campaign.start_date_time, campaign.end_date_time FROM campaign{statusWhere} ORDER BY campaign.name`,
|
|
285
|
+
defaultDateRange: "ALL_TIME",
|
|
286
|
+
defaultLimit: 200,
|
|
287
|
+
statusFields: ["campaign.status"]
|
|
288
|
+
},
|
|
289
|
+
{
|
|
290
|
+
name: "budgets",
|
|
291
|
+
description: "Every campaign budget: id, name, daily amount, delivery, whether it is shared and how many campaigns use it",
|
|
292
|
+
gaqlTemplate: `SELECT campaign_budget.id, campaign_budget.name, campaign_budget.status, campaign_budget.amount_micros, campaign_budget.delivery_method, campaign_budget.explicitly_shared, campaign_budget.reference_count FROM campaign_budget WHERE campaign_budget.status != 'REMOVED' ORDER BY campaign_budget.name`,
|
|
293
|
+
defaultDateRange: "ALL_TIME",
|
|
294
|
+
defaultLimit: 200
|
|
295
|
+
},
|
|
296
|
+
{
|
|
297
|
+
name: "ad-groups",
|
|
298
|
+
description: "Every ad group: id, name, status, type and default CPC bid, under its campaign",
|
|
299
|
+
gaqlTemplate: `SELECT campaign.id, campaign.name, campaign.status, ad_group.id, ad_group.name, ad_group.status, ad_group.type, ad_group.cpc_bid_micros FROM ad_group{statusWhere} ORDER BY campaign.name`,
|
|
300
|
+
defaultDateRange: "ALL_TIME",
|
|
301
|
+
defaultLimit: 500,
|
|
302
|
+
statusFields: ["campaign.status", "ad_group.status"]
|
|
303
|
+
},
|
|
304
|
+
{
|
|
305
|
+
name: "keywords",
|
|
306
|
+
description: "Every positive keyword: resource name, text, match type, status, bid and final URL \u2014 `keywords update|remove` take the resource name",
|
|
307
|
+
gaqlTemplate: `SELECT campaign.id, campaign.name, campaign.status, ad_group.id, ad_group.name, ad_group.status, ad_group_criterion.resource_name, ad_group_criterion.criterion_id, ad_group_criterion.keyword.text, ad_group_criterion.keyword.match_type, ad_group_criterion.status, ad_group_criterion.negative, ad_group_criterion.cpc_bid_micros, ad_group_criterion.final_urls FROM ad_group_criterion WHERE ad_group_criterion.type = 'KEYWORD' AND ad_group_criterion.negative = FALSE{statusScope} ORDER BY campaign.name`,
|
|
308
|
+
defaultDateRange: "ALL_TIME",
|
|
309
|
+
defaultLimit: 500,
|
|
310
|
+
statusFields: ["campaign.status", "ad_group.status", "ad_group_criterion.status"]
|
|
311
|
+
},
|
|
312
|
+
{
|
|
313
|
+
name: "campaign-negative-keywords",
|
|
314
|
+
description: "Campaign-level negative keywords with the resource name `negative-keywords remove` takes",
|
|
315
|
+
gaqlTemplate: `SELECT campaign.id, campaign.name, campaign.status, campaign_criterion.resource_name, campaign_criterion.keyword.text, campaign_criterion.keyword.match_type FROM campaign_criterion WHERE campaign_criterion.type = 'KEYWORD' AND campaign_criterion.negative = TRUE AND campaign_criterion.status != 'REMOVED' AND campaign.status != 'REMOVED' ORDER BY campaign.name`,
|
|
316
|
+
defaultDateRange: "ALL_TIME",
|
|
317
|
+
defaultLimit: 500
|
|
318
|
+
},
|
|
319
|
+
{
|
|
320
|
+
name: "ad-group-negative-keywords",
|
|
321
|
+
description: "Ad-group-level negative keywords with the resource name `negative-keywords remove` takes",
|
|
322
|
+
gaqlTemplate: `SELECT campaign.id, campaign.name, ad_group.id, ad_group.name, ad_group_criterion.resource_name, ad_group_criterion.keyword.text, ad_group_criterion.keyword.match_type, ad_group_criterion.negative FROM ad_group_criterion WHERE ad_group_criterion.type = 'KEYWORD' AND ad_group_criterion.negative = TRUE AND ad_group_criterion.status != 'REMOVED' AND ad_group.status != 'REMOVED' AND campaign.status != 'REMOVED' ORDER BY campaign.name`,
|
|
323
|
+
defaultDateRange: "ALL_TIME",
|
|
324
|
+
defaultLimit: 500
|
|
325
|
+
},
|
|
326
|
+
{
|
|
327
|
+
name: "shared-sets",
|
|
328
|
+
description: "Every shared list (negative keyword / placement lists): id, name, type, member count and how many campaigns use it",
|
|
329
|
+
gaqlTemplate: `SELECT shared_set.id, shared_set.name, shared_set.type, shared_set.status, shared_set.member_count, shared_set.reference_count FROM shared_set WHERE shared_set.status != 'REMOVED' ORDER BY shared_set.name`,
|
|
330
|
+
defaultDateRange: "ALL_TIME",
|
|
331
|
+
defaultLimit: 200
|
|
332
|
+
},
|
|
333
|
+
{
|
|
334
|
+
name: "ads",
|
|
335
|
+
description: "Every ad: id, type, name, status, approval and final URLs, under its ad group",
|
|
336
|
+
gaqlTemplate: `SELECT campaign.id, campaign.name, campaign.status, ad_group.id, ad_group.name, ad_group.status, ad_group_ad.resource_name, ad_group_ad.ad.id, ad_group_ad.ad.type, ad_group_ad.ad.name, ad_group_ad.status, ad_group_ad.policy_summary.approval_status, ad_group_ad.ad.final_urls FROM ad_group_ad{statusWhere} ORDER BY campaign.name`,
|
|
337
|
+
defaultDateRange: "ALL_TIME",
|
|
338
|
+
defaultLimit: 500,
|
|
339
|
+
statusFields: ["campaign.status", "ad_group.status", "ad_group_ad.status"]
|
|
340
|
+
},
|
|
341
|
+
{
|
|
342
|
+
name: "assets",
|
|
343
|
+
description: "Every asset in the account library: id, name, type, text and final URLs",
|
|
344
|
+
gaqlTemplate: `SELECT asset.id, asset.name, asset.type, asset.text_asset.text, asset.sitelink_asset.link_text, asset.callout_asset.callout_text, asset.image_asset.full_size.url, asset.youtube_video_asset.youtube_video_id, asset.final_urls FROM asset ORDER BY asset.type`,
|
|
345
|
+
defaultDateRange: "ALL_TIME",
|
|
346
|
+
defaultLimit: 500
|
|
347
|
+
},
|
|
348
|
+
{
|
|
349
|
+
name: "asset-groups",
|
|
350
|
+
description: "Every Performance Max asset group: id, name, status, final URLs and strength, under its campaign",
|
|
351
|
+
gaqlTemplate: `SELECT campaign.id, campaign.name, campaign.status, asset_group.resource_name, asset_group.id, asset_group.name, asset_group.status, asset_group.final_urls, asset_group.ad_strength FROM asset_group{statusWhere} ORDER BY campaign.name`,
|
|
352
|
+
defaultDateRange: "ALL_TIME",
|
|
353
|
+
defaultLimit: 200,
|
|
354
|
+
statusFields: ["campaign.status", "asset_group.status"]
|
|
355
|
+
},
|
|
356
|
+
{
|
|
357
|
+
name: "audiences",
|
|
358
|
+
description: "Every audience (user list): id, name, type, membership status, size on search and display, membership duration",
|
|
359
|
+
gaqlTemplate: `SELECT user_list.id, user_list.name, user_list.type, user_list.membership_status, user_list.size_for_search, user_list.size_for_display, user_list.membership_life_span, user_list.eligible_for_search, user_list.eligible_for_display FROM user_list ORDER BY user_list.name`,
|
|
360
|
+
defaultDateRange: "ALL_TIME",
|
|
361
|
+
defaultLimit: 200
|
|
362
|
+
},
|
|
363
|
+
{
|
|
364
|
+
name: "conversion-actions",
|
|
365
|
+
description: "Every conversion action: id, name, type, category, origin, status, primary or secondary, counting",
|
|
366
|
+
gaqlTemplate: `SELECT conversion_action.id, conversion_action.name, conversion_action.type, conversion_action.category, conversion_action.origin, conversion_action.status, conversion_action.primary_for_goal, conversion_action.counting_type FROM conversion_action WHERE conversion_action.status != 'REMOVED' ORDER BY conversion_action.name`,
|
|
367
|
+
defaultDateRange: "ALL_TIME",
|
|
368
|
+
defaultLimit: 200
|
|
369
|
+
},
|
|
370
|
+
{
|
|
371
|
+
name: "bidding-strategies",
|
|
372
|
+
description: "Every portfolio bidding strategy: id, name, type, status and how many campaigns use it",
|
|
373
|
+
gaqlTemplate: `SELECT bidding_strategy.id, bidding_strategy.name, bidding_strategy.type, bidding_strategy.status, bidding_strategy.campaign_count FROM bidding_strategy WHERE bidding_strategy.status != 'REMOVED' ORDER BY bidding_strategy.name`,
|
|
374
|
+
defaultDateRange: "ALL_TIME",
|
|
375
|
+
defaultLimit: 200
|
|
376
|
+
},
|
|
377
|
+
{
|
|
378
|
+
name: "labels",
|
|
379
|
+
description: "Every label: id, name, colour and description",
|
|
380
|
+
gaqlTemplate: `SELECT label.id, label.name, label.status, label.text_label.background_color, label.text_label.description FROM label WHERE label.status != 'REMOVED' ORDER BY label.name`,
|
|
381
|
+
defaultDateRange: "ALL_TIME",
|
|
382
|
+
defaultLimit: 200
|
|
383
|
+
},
|
|
384
|
+
{
|
|
385
|
+
name: "merchant-center",
|
|
386
|
+
description: "Merchant Center accounts linked to this Google Ads account \u2014 the merchantId a Shopping or retail Performance Max campaign names",
|
|
387
|
+
gaqlTemplate: `SELECT product_link.resource_name, product_link.product_link_id, product_link.type, product_link.merchant_center.merchant_center_id FROM product_link WHERE product_link.type = 'MERCHANT_CENTER'`,
|
|
388
|
+
defaultDateRange: "ALL_TIME",
|
|
389
|
+
defaultLimit: 200
|
|
390
|
+
},
|
|
391
|
+
{
|
|
392
|
+
name: "campaign-criteria",
|
|
393
|
+
description: "Every campaign targeting criterion and exclusion \u2014 locations, languages, devices, ad schedules, radius, carriers, operating systems, placements, topics, demographics, content types, IP addresses, web pages, brand lists, audiences \u2014 with the resource name `campaign-criteria update|remove` takes",
|
|
394
|
+
gaqlTemplate: `SELECT campaign.id, campaign.name, campaign.status, campaign.advertising_channel_type, campaign_criterion.resource_name, campaign_criterion.type, campaign_criterion.negative, campaign_criterion.bid_modifier, campaign_criterion.location.geo_target_constant, campaign_criterion.language.language_constant, campaign_criterion.device.type, campaign_criterion.ad_schedule.day_of_week, campaign_criterion.ad_schedule.start_hour, campaign_criterion.ad_schedule.end_hour, campaign_criterion.proximity.radius, campaign_criterion.placement.url, campaign_criterion.mobile_application.app_id, campaign_criterion.youtube_channel.channel_id, campaign_criterion.youtube_video.video_id, campaign_criterion.topic.topic_constant, campaign_criterion.age_range.type, campaign_criterion.gender.type, campaign_criterion.income_range.type, campaign_criterion.parental_status.type, campaign_criterion.content_label.type, campaign_criterion.ip_block.ip_address, campaign_criterion.webpage.criterion_name, campaign_criterion.brand_list.shared_set, campaign_criterion.carrier.carrier_constant, campaign_criterion.operating_system_version.operating_system_version_constant, campaign_criterion.user_list.user_list, campaign_criterion.user_interest.user_interest_category FROM campaign_criterion WHERE campaign_criterion.type != 'KEYWORD' AND campaign_criterion.status != 'REMOVED' AND campaign.status != 'REMOVED' ORDER BY campaign.name`,
|
|
395
|
+
defaultDateRange: "ALL_TIME",
|
|
396
|
+
defaultLimit: 500
|
|
397
|
+
},
|
|
398
|
+
{
|
|
399
|
+
name: "ad-group-criteria",
|
|
400
|
+
description: "Every ad group targeting criterion and exclusion other than keywords \u2014 placements, apps, YouTube, topics, demographics, web pages, Demand Gen locations, languages and audience, audiences \u2014 with its bid adjustment, max CPC, status and the resource name `ad-group-criteria update|remove` takes",
|
|
401
|
+
gaqlTemplate: `SELECT campaign.id, campaign.name, campaign.status, campaign.advertising_channel_type, ad_group.id, ad_group.name, ad_group.status, ad_group_criterion.resource_name, ad_group_criterion.type, ad_group_criterion.negative, ad_group_criterion.status, ad_group_criterion.bid_modifier, ad_group_criterion.cpc_bid_micros, ad_group_criterion.placement.url, ad_group_criterion.mobile_application.app_id, ad_group_criterion.youtube_channel.channel_id, ad_group_criterion.youtube_video.video_id, ad_group_criterion.topic.topic_constant, ad_group_criterion.age_range.type, ad_group_criterion.gender.type, ad_group_criterion.parental_status.type, ad_group_criterion.income_range.type, ad_group_criterion.webpage.criterion_name, ad_group_criterion.location.geo_target_constant, ad_group_criterion.language.language_constant, ad_group_criterion.audience.audience, ad_group_criterion.brand_list.shared_set, ad_group_criterion.user_list.user_list, ad_group_criterion.user_interest.user_interest_category FROM ad_group_criterion WHERE ad_group_criterion.type NOT IN ('KEYWORD', 'LISTING_GROUP'){statusScope} ORDER BY campaign.name`,
|
|
402
|
+
defaultDateRange: "ALL_TIME",
|
|
403
|
+
defaultLimit: 500,
|
|
404
|
+
statusFields: ["campaign.status", "ad_group.status", "ad_group_criterion.status"]
|
|
405
|
+
},
|
|
406
|
+
{
|
|
407
|
+
name: "account-exclusions",
|
|
408
|
+
description: "Every account-wide exclusion \u2014 sites, apps, app categories, YouTube, content types, IP addresses, account negative keyword lists \u2014 with the resource name `account-exclusions remove` takes",
|
|
409
|
+
gaqlTemplate: `SELECT customer_negative_criterion.resource_name, customer_negative_criterion.type, customer_negative_criterion.placement.url, customer_negative_criterion.mobile_application.app_id, customer_negative_criterion.mobile_app_category.mobile_app_category_constant, customer_negative_criterion.youtube_channel.channel_id, customer_negative_criterion.youtube_video.video_id, customer_negative_criterion.content_label.type, customer_negative_criterion.ip_block.ip_address, customer_negative_criterion.negative_keyword_list.shared_set FROM customer_negative_criterion`,
|
|
410
|
+
defaultDateRange: "ALL_TIME",
|
|
411
|
+
defaultLimit: 500
|
|
412
|
+
},
|
|
413
|
+
{
|
|
414
|
+
name: "ad-group-bid-modifiers",
|
|
415
|
+
description: "Every ad group's own device bid adjustment, with the resource name `ad-group-bid-modifiers update|remove` takes",
|
|
416
|
+
gaqlTemplate: `SELECT campaign.id, campaign.name, ad_group.id, ad_group.name, ad_group_bid_modifier.resource_name, ad_group_bid_modifier.device.type, ad_group_bid_modifier.bid_modifier FROM ad_group_bid_modifier WHERE campaign.status != 'REMOVED' AND ad_group.status != 'REMOVED' ORDER BY campaign.name`,
|
|
417
|
+
defaultDateRange: "ALL_TIME",
|
|
418
|
+
defaultLimit: 500
|
|
419
|
+
}
|
|
420
|
+
];
|
|
421
|
+
var PRESETS = [...CORE_PRESETS, ...REPORT_PRESETS, ...INVENTORY_PRESETS];
|
|
422
|
+
function isInventoryPreset(name) {
|
|
423
|
+
return INVENTORY_PRESETS.some((preset) => preset.name === name);
|
|
424
|
+
}
|
|
180
425
|
function getPreset(name) {
|
|
181
426
|
return PRESETS.find((p) => p.name === name);
|
|
182
427
|
}
|
|
@@ -187,13 +432,12 @@ function buildStatusScope(statusFields, includePaused) {
|
|
|
187
432
|
}
|
|
188
433
|
function expandPreset(preset, params, now = /* @__PURE__ */ new Date()) {
|
|
189
434
|
const dateRange = params.dateRange ?? preset.defaultDateRange;
|
|
190
|
-
const limit = params.limit ?? preset.defaultLimit;
|
|
191
435
|
if (preset.gaqlTemplate.includes("{dateRange}") && !isValidDateRange(dateRange)) {
|
|
192
436
|
return { query: "", dateRangeError: dateRangeError(dateRange, now) };
|
|
193
437
|
}
|
|
194
438
|
const statusScope = buildStatusScope(preset.statusFields, params.includePaused ?? false);
|
|
195
439
|
const range = dateRange.trim();
|
|
196
|
-
const query = preset.gaqlTemplate.replace(/DURING\s+\{dateRange\}/g, BETWEEN_RE.test(range) ? range : `DURING ${range}`).replace(/\{dateRange\}/g, range).replace(/\{
|
|
440
|
+
const query = preset.gaqlTemplate.replace(/DURING\s+\{dateRange\}/g, BETWEEN_RE.test(range) ? range : `DURING ${range}`).replace(/\{dateRange\}/g, range).replace(/\{statusScope\}/g, statusScope).replace(/\{statusWhere\}/g, statusScope ? ` WHERE${statusScope.replace(/^ AND/, "")}` : "");
|
|
197
441
|
return { query };
|
|
198
442
|
}
|
|
199
443
|
|
|
@@ -313,7 +557,7 @@ function addRequiredAncestorFields(query) {
|
|
|
313
557
|
]
|
|
314
558
|
};
|
|
315
559
|
}
|
|
316
|
-
function applyAutoFixes(query
|
|
560
|
+
function applyAutoFixes(query) {
|
|
317
561
|
let corrected = query;
|
|
318
562
|
const warnings = [];
|
|
319
563
|
if (/(?<![\w.])keyword\.text\b/.test(corrected)) {
|
|
@@ -343,13 +587,6 @@ function applyAutoFixes(query, limit) {
|
|
|
343
587
|
corrected = corrected.replace(/ad_group\.status\s*=\s*'ACTIVE'/gi, "ad_group.status = 'ENABLED'");
|
|
344
588
|
warnings.push({ code: "ENUM_CORRECTED", message: "ad_group.status ACTIVE \u2192 ENABLED" });
|
|
345
589
|
}
|
|
346
|
-
if (!/\bLIMIT\b/i.test(corrected)) {
|
|
347
|
-
const effectiveLimit = limit ?? 200;
|
|
348
|
-
corrected = `${corrected.trimEnd()} LIMIT ${effectiveLimit}`;
|
|
349
|
-
if (!isSingleRowRead(corrected)) {
|
|
350
|
-
warnings.push({ code: "AUTO_LIMIT", message: `Added LIMIT ${effectiveLimit}. Use --limit to override.` });
|
|
351
|
-
}
|
|
352
|
-
}
|
|
353
590
|
return { query: corrected, warnings };
|
|
354
591
|
}
|
|
355
592
|
var DURING_CLAUSE = /(?<=[a-z_]\.[a-z_.]+\s+)DURING\s+([A-Za-z0-9_]+)/gi;
|
|
@@ -377,24 +614,6 @@ function rejectUnsupportedDuring(query, customerId) {
|
|
|
377
614
|
}
|
|
378
615
|
};
|
|
379
616
|
}
|
|
380
|
-
function rejectOversizedLimit(query, customerId) {
|
|
381
|
-
const match = query.match(/\bLIMIT\s+(\d+)\s*$/i);
|
|
382
|
-
if (!match || Number(match[1]) <= GOOGLE_ADS_QUERY_MAX_PAGE_SIZE) return null;
|
|
383
|
-
const fixed = query.replace(/\bLIMIT\s+\d+\s*$/i, `LIMIT ${GOOGLE_ADS_QUERY_MAX_PAGE_SIZE}`);
|
|
384
|
-
return {
|
|
385
|
-
ok: false,
|
|
386
|
-
error: {
|
|
387
|
-
code: "VALIDATION_ERROR",
|
|
388
|
-
message: `LIMIT ${match[1]} is more rows than one read can return (${GOOGLE_ADS_QUERY_MAX_PAGE_SIZE}).`,
|
|
389
|
-
fix: {
|
|
390
|
-
action: "retry_with_flag",
|
|
391
|
-
correctedCommand: buildCommand(fixed, customerId),
|
|
392
|
-
explanation: `One query returns at most ${GOOGLE_ADS_QUERY_MAX_PAGE_SIZE} rows. For more, split the read into narrower queries \u2014 a shorter BETWEEN range each, or one campaign each \u2014 write each with --out, and combine the files.`
|
|
393
|
-
},
|
|
394
|
-
retryable: false
|
|
395
|
-
}
|
|
396
|
-
};
|
|
397
|
-
}
|
|
398
617
|
var WHERE_OPERATOR = /(?<![\w.])([a-z_]+(?:\.[a-z_]+)+)\s*(CONTAINS\s+(?:ALL|ANY|NONE)|IS\s+NOT\s+NULL|IS\s+NULL|NOT\s+LIKE|NOT\s+IN|NOT\s+REGEXP_MATCH|REGEXP_MATCH|LIKE|IN|BETWEEN|DURING|!=|<=|>=|=|<|>)/gi;
|
|
399
618
|
function escapeRegExp(text) {
|
|
400
619
|
return text.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
@@ -462,7 +681,7 @@ function rejectContainsCall(query, customerId) {
|
|
|
462
681
|
}
|
|
463
682
|
};
|
|
464
683
|
}
|
|
465
|
-
function validatePreflight(query, customerId
|
|
684
|
+
function validatePreflight(query, customerId) {
|
|
466
685
|
const warnings = [];
|
|
467
686
|
const corrected = query;
|
|
468
687
|
const firstWord = corrected.trim().split(/\s+/)[0]?.toUpperCase();
|
|
@@ -510,7 +729,7 @@ function validatePreflight(query, customerId, limit) {
|
|
|
510
729
|
}
|
|
511
730
|
};
|
|
512
731
|
}
|
|
513
|
-
for (const reject of [rejectContainsCall, rejectListFieldOperator, rejectUnsupportedDuring
|
|
732
|
+
for (const reject of [rejectContainsCall, rejectListFieldOperator, rejectUnsupportedDuring]) {
|
|
514
733
|
const rejection2 = reject(corrected, customerId);
|
|
515
734
|
if (rejection2) return { valid: false, warnings: [], error: rejection2 };
|
|
516
735
|
}
|
|
@@ -538,7 +757,7 @@ function validatePreflight(query, customerId, limit) {
|
|
|
538
757
|
message: "ad_group_criterion returns BOTH positive and negative keywords. Add ad_group_criterion.negative to SELECT or filter with WHERE ad_group_criterion.negative = FALSE (positives) / TRUE (negatives). Use --preset positive-keywords or negative-keywords instead."
|
|
539
758
|
});
|
|
540
759
|
}
|
|
541
|
-
const { query: autoFixed, warnings: autoFixWarnings } = applyAutoFixes(corrected
|
|
760
|
+
const { query: autoFixed, warnings: autoFixWarnings } = applyAutoFixes(corrected);
|
|
542
761
|
warnings.push(...autoFixWarnings);
|
|
543
762
|
const analysis = analyzeServingChain(autoFixed);
|
|
544
763
|
if (!analysis) return { valid: true, correctedQuery: autoFixed, warnings };
|
|
@@ -707,9 +926,14 @@ function keywordServingWarnings(rows, options) {
|
|
|
707
926
|
// src/commands/ads/google/query.ts
|
|
708
927
|
registerSchema({
|
|
709
928
|
command: "ads.google.query",
|
|
710
|
-
description: "Run a GAQL (Google Ads Query Language) query.
|
|
929
|
+
description: "Run a GAQL (Google Ads Query Language) query, one page at a time. Start here: `baker ads google query --preset campaign-performance` (--list-presets for all). Each read returns one page of --limit rows and, when the account holds more, `pagination.cursor` \u2014 pass it back with --cursor for the next page, or use --all --out <file> to read every page. A LIMIT in your own GAQL caps the whole read.",
|
|
711
930
|
args: {
|
|
712
|
-
query: { type: "
|
|
931
|
+
query: { type: "positional", description: "GAQL SELECT statement (or pass it with --gaql)", required: false },
|
|
932
|
+
gaql: {
|
|
933
|
+
type: "string",
|
|
934
|
+
description: 'GAQL SELECT statement as a flag \u2014 same as the positional, for when quoting a positional is awkward: --gaql "SELECT campaign.name FROM campaign"',
|
|
935
|
+
required: false
|
|
936
|
+
},
|
|
713
937
|
"customer-id": {
|
|
714
938
|
type: "string",
|
|
715
939
|
description: "Google Ads customer ID (10 digits, no dashes). Falls back to BAKER_GOOGLE_ADS_CUSTOMER_ID env var.",
|
|
@@ -717,7 +941,7 @@ registerSchema({
|
|
|
717
941
|
},
|
|
718
942
|
preset: {
|
|
719
943
|
type: "string",
|
|
720
|
-
description:
|
|
944
|
+
description: `Named query preset (--list-presets shows each one's GAQL and page size): ${PRESETS.map((p) => p.name).join(", ")}. Presets return only actually-serving entities (enabled campaign AND ad group AND ad) by default \u2014 pass --include-paused to include paused ones.`,
|
|
721
945
|
required: false
|
|
722
946
|
},
|
|
723
947
|
"date-range": {
|
|
@@ -732,15 +956,18 @@ registerSchema({
|
|
|
732
956
|
},
|
|
733
957
|
limit: {
|
|
734
958
|
type: "number",
|
|
735
|
-
description:
|
|
736
|
-
required: false
|
|
737
|
-
default: 200
|
|
959
|
+
description: `Rows per page (default: the preset's page size, else 200; at most ${GOOGLE_ADS_QUERY_MAX_PAGE_SIZE}). A page size, not a cap: when more rows exist the read returns a cursor, and --all keeps paging.`,
|
|
960
|
+
required: false
|
|
738
961
|
},
|
|
739
962
|
"list-presets": { type: "boolean", description: "List all available query presets", required: false },
|
|
740
|
-
cursor: {
|
|
963
|
+
cursor: {
|
|
964
|
+
type: "string",
|
|
965
|
+
description: "Resume after a previous page: pass its pagination.cursor with the same query and --limit",
|
|
966
|
+
required: false
|
|
967
|
+
},
|
|
741
968
|
all: {
|
|
742
969
|
type: "boolean",
|
|
743
|
-
description: "Follow every page until the
|
|
970
|
+
description: "Follow every page until the account has no more rows (use with --out for large reads). Needed for any read you will count or total. Only a LIMIT written in the GAQL itself can stop it early.",
|
|
744
971
|
required: false
|
|
745
972
|
},
|
|
746
973
|
out: {
|
|
@@ -807,12 +1034,10 @@ function writeRowsToFile(filePath, rows, fields, append) {
|
|
|
807
1034
|
writeFileSync(filePath, JSON.stringify(rows, null, 2), "utf-8");
|
|
808
1035
|
}
|
|
809
1036
|
}
|
|
810
|
-
function effectiveRowLimit(finalQuery
|
|
1037
|
+
function effectiveRowLimit(finalQuery) {
|
|
811
1038
|
if (isSingleRowRead(finalQuery)) return void 0;
|
|
812
1039
|
const match = finalQuery.match(/\bLIMIT\s+(\d+)/i);
|
|
813
|
-
|
|
814
|
-
if (all) return statementLimit;
|
|
815
|
-
return statementLimit === void 0 ? limit : Math.min(limit, statementLimit);
|
|
1040
|
+
return match?.[1] ? Number(match[1]) : void 0;
|
|
816
1041
|
}
|
|
817
1042
|
function warningLines(warnings, format) {
|
|
818
1043
|
return warnings.map((w) => {
|
|
@@ -826,9 +1051,13 @@ function completenessWarnings(read) {
|
|
|
826
1051
|
const cap = read.effectiveLimit;
|
|
827
1052
|
const filledTheCap = cap !== void 0 && cap > 0 && read.rowCount >= cap;
|
|
828
1053
|
if (!read.hasMore && !filledTheCap) return [];
|
|
829
|
-
const cause = read.hasMore ?
|
|
830
|
-
|
|
831
|
-
|
|
1054
|
+
const [cause, fix] = read.hasMore ? [
|
|
1055
|
+
"More rows are waiting: the account returned a next-page cursor this run did not follow.",
|
|
1056
|
+
"Re-run with --all --out <file> to read every page, or pass --cursor <pagination.cursor> (same query, same --limit) for the next page."
|
|
1057
|
+
] : [
|
|
1058
|
+
`The ${read.rowCount} rows returned exactly fill the LIMIT in the statement (${cap}).`,
|
|
1059
|
+
`Raise the LIMIT in the statement above ${cap}, or drop it \u2014 without a LIMIT, --all pages through every row.`
|
|
1060
|
+
];
|
|
832
1061
|
return [
|
|
833
1062
|
{
|
|
834
1063
|
code: "TRUNCATED_RESULTS",
|
|
@@ -913,7 +1142,6 @@ function outputResults(rows, fieldDescs, warnings, args, cached, read) {
|
|
|
913
1142
|
...completenessWarnings({
|
|
914
1143
|
rowCount: rows.length,
|
|
915
1144
|
effectiveLimit: read.effectiveLimit,
|
|
916
|
-
all: read.all,
|
|
917
1145
|
hasMore: Boolean(read.nextCursor)
|
|
918
1146
|
})
|
|
919
1147
|
];
|
|
@@ -930,7 +1158,15 @@ function outputResults(rows, fieldDescs, warnings, args, cached, read) {
|
|
|
930
1158
|
}
|
|
931
1159
|
writeRows(format, rows, resultColumns(read.gaql, rows), warningLines(allWarnings, format));
|
|
932
1160
|
}
|
|
933
|
-
function
|
|
1161
|
+
function resolveGaqlInput(args) {
|
|
1162
|
+
const positional = typeof args.query === "string" ? args.query.trim() : "";
|
|
1163
|
+
const flag = typeof args.gaql === "string" ? args.gaql.trim() : "";
|
|
1164
|
+
if (positional && flag && positional !== flag) {
|
|
1165
|
+
return { ok: false, message: "Pass the GAQL statement once \u2014 as the positional or as --gaql, not both." };
|
|
1166
|
+
}
|
|
1167
|
+
return { ok: true, gaql: positional || flag };
|
|
1168
|
+
}
|
|
1169
|
+
function resolveGaql(args) {
|
|
934
1170
|
if (args.preset) {
|
|
935
1171
|
const preset = getPreset(args.preset);
|
|
936
1172
|
if (!preset) {
|
|
@@ -943,7 +1179,6 @@ function resolveGaql(args, limit) {
|
|
|
943
1179
|
}
|
|
944
1180
|
const expanded = expandPreset(preset, {
|
|
945
1181
|
dateRange: args["date-range"],
|
|
946
|
-
limit,
|
|
947
1182
|
includePaused: Boolean(args["include-paused"])
|
|
948
1183
|
});
|
|
949
1184
|
if (expanded.dateRangeError) {
|
|
@@ -955,18 +1190,18 @@ function resolveGaql(args, limit) {
|
|
|
955
1190
|
}
|
|
956
1191
|
return expanded.query;
|
|
957
1192
|
}
|
|
958
|
-
const
|
|
959
|
-
if (!gaql) {
|
|
1193
|
+
const input = resolveGaqlInput(args);
|
|
1194
|
+
if (!input.ok || !input.gaql) {
|
|
960
1195
|
writeAdsJson({
|
|
961
1196
|
ok: false,
|
|
962
1197
|
error: {
|
|
963
1198
|
code: "VALIDATION_ERROR",
|
|
964
|
-
message: "Provide a GAQL query or use --preset. Run --list-presets to see options."
|
|
1199
|
+
message: input.ok ? "Provide a GAQL query (positional or --gaql) or use --preset. Run --list-presets to see options." : input.message
|
|
965
1200
|
}
|
|
966
1201
|
});
|
|
967
1202
|
return null;
|
|
968
1203
|
}
|
|
969
|
-
return gaql;
|
|
1204
|
+
return input.gaql;
|
|
970
1205
|
}
|
|
971
1206
|
var SERVING_HIERARCHY_RESOURCES = [
|
|
972
1207
|
"campaign",
|
|
@@ -990,7 +1225,8 @@ function whereClause3(upperQuery) {
|
|
|
990
1225
|
}
|
|
991
1226
|
function servingScopeWarnings(args, finalQuery) {
|
|
992
1227
|
if (args.preset) {
|
|
993
|
-
|
|
1228
|
+
const name = String(args.preset);
|
|
1229
|
+
if (!args["include-paused"] || isInventoryPreset(name) || !getPreset(name)?.statusFields?.length) return [];
|
|
994
1230
|
return [
|
|
995
1231
|
{
|
|
996
1232
|
code: "SERVING_SCOPE",
|
|
@@ -1100,11 +1336,13 @@ async function fetchAllPages(gaql, body, args, servingOptions) {
|
|
|
1100
1336
|
fileColumns: fileColumns ?? []
|
|
1101
1337
|
};
|
|
1102
1338
|
}
|
|
1339
|
+
function pageCacheKey(customerId, query, pageSize, cursor) {
|
|
1340
|
+
return buildQueryCacheKey(customerId, `${query}\0page=${pageSize}\0cursor=${cursor ?? ""}`);
|
|
1341
|
+
}
|
|
1103
1342
|
async function executeQuery(finalQuery, args, customerId, limit, warnings, useCache, cacheKey) {
|
|
1104
1343
|
const body = { customerId, query: finalQuery, pageSize: limit };
|
|
1105
1344
|
const managerId = getManagerIdForCustomer(customerId);
|
|
1106
1345
|
if (managerId) body.managerId = managerId;
|
|
1107
|
-
if (args.cursor) body.pageToken = args.cursor;
|
|
1108
1346
|
if (!useCache) body.skipCache = true;
|
|
1109
1347
|
const servingOptions = keywordServingOptions(finalQuery);
|
|
1110
1348
|
const { allRows, lastPageToken, totalRowsWritten, keywordLimits, observedFields, fileColumns } = await fetchAllPages(
|
|
@@ -1116,8 +1354,7 @@ async function executeQuery(finalQuery, args, customerId, limit, warnings, useCa
|
|
|
1116
1354
|
if (args.out) {
|
|
1117
1355
|
const truncation = completenessWarnings({
|
|
1118
1356
|
rowCount: totalRowsWritten,
|
|
1119
|
-
effectiveLimit: effectiveRowLimit(finalQuery
|
|
1120
|
-
all: Boolean(args.all),
|
|
1357
|
+
effectiveLimit: effectiveRowLimit(finalQuery),
|
|
1121
1358
|
hasMore: Boolean(lastPageToken)
|
|
1122
1359
|
});
|
|
1123
1360
|
const fileWarnings = [
|
|
@@ -1140,9 +1377,9 @@ async function executeQuery(finalQuery, args, customerId, limit, warnings, useCa
|
|
|
1140
1377
|
);
|
|
1141
1378
|
return;
|
|
1142
1379
|
}
|
|
1143
|
-
if (useCache && allRows.length > 0) {
|
|
1144
|
-
const
|
|
1145
|
-
cacheSet("queries", cacheKey,
|
|
1380
|
+
if (useCache && !args.all && allRows.length > 0) {
|
|
1381
|
+
const page = { rows: allRows, ...lastPageToken ? { cursor: lastPageToken } : {} };
|
|
1382
|
+
cacheSet("queries", cacheKey, page, getQueryTtl(finalQuery), getFieldDescriptions(extractFields(allRows)));
|
|
1146
1383
|
}
|
|
1147
1384
|
const fields = extractFields(allRows);
|
|
1148
1385
|
outputResults(
|
|
@@ -1158,18 +1395,17 @@ async function executeQuery(finalQuery, args, customerId, limit, warnings, useCa
|
|
|
1158
1395
|
false,
|
|
1159
1396
|
{
|
|
1160
1397
|
gaql: finalQuery,
|
|
1161
|
-
effectiveLimit: effectiveRowLimit(finalQuery
|
|
1162
|
-
all: Boolean(args.all),
|
|
1398
|
+
effectiveLimit: effectiveRowLimit(finalQuery),
|
|
1163
1399
|
nextCursor: lastPageToken
|
|
1164
1400
|
}
|
|
1165
1401
|
);
|
|
1166
1402
|
}
|
|
1167
1403
|
function shouldReadCache(args) {
|
|
1168
|
-
return !args["no-cache"] && !args.out;
|
|
1404
|
+
return !args["no-cache"] && !args.out && !args.all;
|
|
1169
1405
|
}
|
|
1170
1406
|
var DEFAULT_QUERY_LIMIT = 200;
|
|
1171
|
-
function parseQueryLimit(raw) {
|
|
1172
|
-
if (raw === void 0 || raw === null || raw === "") return { ok: true, limit:
|
|
1407
|
+
function parseQueryLimit(raw, fallback = DEFAULT_QUERY_LIMIT) {
|
|
1408
|
+
if (raw === void 0 || raw === null || raw === "") return { ok: true, limit: fallback };
|
|
1173
1409
|
const limit = Number(raw);
|
|
1174
1410
|
if (Number.isInteger(limit) && limit >= 1 && limit <= GOOGLE_ADS_QUERY_MAX_PAGE_SIZE) return { ok: true, limit };
|
|
1175
1411
|
return {
|
|
@@ -1181,26 +1417,30 @@ function parseQueryLimit(raw) {
|
|
|
1181
1417
|
message: `--limit must be a whole number from 1 to ${GOOGLE_ADS_QUERY_MAX_PAGE_SIZE}, got '${String(raw)}'.`,
|
|
1182
1418
|
fix: {
|
|
1183
1419
|
action: "retry_with_flag",
|
|
1184
|
-
explanation:
|
|
1420
|
+
explanation: `--limit is the size of one page, at most ${GOOGLE_ADS_QUERY_MAX_PAGE_SIZE} rows. For more rows, keep the page size and add --all --out <file>: it reads every page.`
|
|
1185
1421
|
},
|
|
1186
1422
|
retryable: false
|
|
1187
1423
|
}
|
|
1188
1424
|
}
|
|
1189
1425
|
};
|
|
1190
1426
|
}
|
|
1427
|
+
function queryPageSize(args) {
|
|
1428
|
+
const preset = typeof args.preset === "string" ? getPreset(args.preset) : void 0;
|
|
1429
|
+
return parseQueryLimit(args.limit, preset?.defaultLimit ?? DEFAULT_QUERY_LIMIT);
|
|
1430
|
+
}
|
|
1191
1431
|
async function validateArgs(args) {
|
|
1192
|
-
const parsedLimit =
|
|
1432
|
+
const parsedLimit = queryPageSize(args);
|
|
1193
1433
|
if (!parsedLimit.ok) {
|
|
1194
1434
|
writeAdsJson(parsedLimit.error);
|
|
1195
1435
|
process.exit(1);
|
|
1196
1436
|
}
|
|
1197
1437
|
const { limit } = parsedLimit;
|
|
1198
1438
|
const customerId = await resolveCustomerId(args);
|
|
1199
|
-
const gaql = resolveGaql(args
|
|
1439
|
+
const gaql = resolveGaql(args);
|
|
1200
1440
|
if (!gaql) {
|
|
1201
1441
|
process.exit(1);
|
|
1202
1442
|
}
|
|
1203
|
-
const preflight = validatePreflight(gaql, customerId
|
|
1443
|
+
const preflight = validatePreflight(gaql, customerId);
|
|
1204
1444
|
if (!preflight.valid && preflight.error) {
|
|
1205
1445
|
writeAdsJson(preflight.error);
|
|
1206
1446
|
process.exit(1);
|
|
@@ -1212,7 +1452,7 @@ async function validateArgs(args) {
|
|
|
1212
1452
|
finalQuery,
|
|
1213
1453
|
warnings: [...preflight.warnings, ...servingScopeWarnings(args, finalQuery)],
|
|
1214
1454
|
useCache: !args["no-cache"],
|
|
1215
|
-
cacheKey:
|
|
1455
|
+
cacheKey: pageCacheKey(customerId, finalQuery, limit, args.cursor)
|
|
1216
1456
|
};
|
|
1217
1457
|
}
|
|
1218
1458
|
function handleQueryError(err, finalQuery, customerId) {
|
|
@@ -1234,19 +1474,62 @@ function handleQueryError(err, finalQuery, customerId) {
|
|
|
1234
1474
|
});
|
|
1235
1475
|
process.exit(1);
|
|
1236
1476
|
}
|
|
1477
|
+
async function runQuery(args) {
|
|
1478
|
+
const validated = await validateArgs(args);
|
|
1479
|
+
if (!validated) return;
|
|
1480
|
+
const { customerId, limit, finalQuery, warnings, useCache, cacheKey } = validated;
|
|
1481
|
+
if (shouldReadCache(args)) {
|
|
1482
|
+
const cached = cacheGet("queries", cacheKey);
|
|
1483
|
+
if (cached && Array.isArray(cached.data.rows)) {
|
|
1484
|
+
const rows = cached.data.rows;
|
|
1485
|
+
outputResults(
|
|
1486
|
+
rows,
|
|
1487
|
+
cached.fields ?? getFieldDescriptions(extractFields(rows)),
|
|
1488
|
+
[
|
|
1489
|
+
...warnings,
|
|
1490
|
+
...missingFieldWarnings(finalQuery, rows),
|
|
1491
|
+
...keywordServingWarnings(rows, keywordServingOptions(finalQuery)),
|
|
1492
|
+
...conversionMixWarnings(finalQuery)
|
|
1493
|
+
],
|
|
1494
|
+
args,
|
|
1495
|
+
true,
|
|
1496
|
+
{ gaql: finalQuery, effectiveLimit: effectiveRowLimit(finalQuery), nextCursor: cached.data.cursor }
|
|
1497
|
+
);
|
|
1498
|
+
return;
|
|
1499
|
+
}
|
|
1500
|
+
}
|
|
1501
|
+
try {
|
|
1502
|
+
await executeQuery(finalQuery, args, customerId, limit, warnings, useCache, cacheKey);
|
|
1503
|
+
} catch (err) {
|
|
1504
|
+
handleQueryError(err, finalQuery, customerId);
|
|
1505
|
+
}
|
|
1506
|
+
}
|
|
1237
1507
|
var queryCommand = defineCommand({
|
|
1238
1508
|
meta: {
|
|
1239
1509
|
name: "query",
|
|
1240
|
-
description: `Run GAQL
|
|
1510
|
+
description: `Run GAQL against Google Ads, one page at a time. Supports raw GAQL, presets, paging, file export, and caching.
|
|
1511
|
+
|
|
1512
|
+
Start here:
|
|
1513
|
+
baker ads google query --list-presets
|
|
1514
|
+
baker ads google query --preset campaign-performance --customer-id 1234567890
|
|
1515
|
+
|
|
1516
|
+
Each read returns one page (--limit rows; the preset's page size by default, else 200). When the
|
|
1517
|
+
account holds more, the envelope carries pagination.cursor: pass it with --cursor for the next page,
|
|
1518
|
+
or read everything with --all --out <file>. A LIMIT written in the GAQL caps the whole read.
|
|
1241
1519
|
|
|
1242
1520
|
Examples:
|
|
1243
1521
|
baker ads google query "SELECT campaign.name, metrics.clicks FROM campaign WHERE segments.date DURING LAST_7_DAYS" --customer-id 1234567890
|
|
1244
|
-
baker ads google query --
|
|
1245
|
-
baker ads google query --preset search-terms --customer-id 1234567890 --date-range LAST_7_DAYS --out
|
|
1246
|
-
baker ads google query --
|
|
1522
|
+
baker ads google query --gaql "SELECT ad_group.name FROM ad_group WHERE ad_group.status = 'ENABLED'" --customer-id 1234567890
|
|
1523
|
+
baker ads google query --preset search-terms --customer-id 1234567890 --date-range LAST_7_DAYS --all --out terms.csv
|
|
1524
|
+
baker ads google query --preset keyword-serving --customer-id 1234567890 --cursor <pagination.cursor>`
|
|
1247
1525
|
},
|
|
1248
1526
|
args: {
|
|
1249
|
-
query: { type: "positional", description: "GAQL
|
|
1527
|
+
query: { type: "positional", description: "GAQL SELECT statement", required: false },
|
|
1528
|
+
gaql: {
|
|
1529
|
+
type: "string",
|
|
1530
|
+
description: "GAQL SELECT statement as a flag (instead of the positional)",
|
|
1531
|
+
required: false
|
|
1532
|
+
},
|
|
1250
1533
|
"customer-id": { type: "string", description: "Google Ads customer ID (10 digits, no dashes)", required: false },
|
|
1251
1534
|
preset: { type: "string", description: "Named query preset", required: false },
|
|
1252
1535
|
"date-range": { type: "string", description: "Date range override for presets", required: false },
|
|
@@ -1257,12 +1540,12 @@ Examples:
|
|
|
1257
1540
|
},
|
|
1258
1541
|
limit: {
|
|
1259
1542
|
type: "string",
|
|
1260
|
-
description: "
|
|
1543
|
+
description: "Rows per page (default: the preset's page size, else 200)",
|
|
1261
1544
|
required: false
|
|
1262
1545
|
},
|
|
1263
1546
|
"list-presets": { type: "boolean", description: "List available presets", required: false },
|
|
1264
|
-
cursor: { type: "string", description: "
|
|
1265
|
-
all: { type: "boolean", description: "Follow every page (use with --out for large
|
|
1547
|
+
cursor: { type: "string", description: "pagination.cursor from the previous page", required: false },
|
|
1548
|
+
all: { type: "boolean", description: "Follow every page (use with --out for large reads)", required: false },
|
|
1266
1549
|
out: { type: "string", description: "File path for output", required: false },
|
|
1267
1550
|
append: { type: "boolean", description: "Append to file", required: false },
|
|
1268
1551
|
output: { type: "string", description: "Format: json|csv|jsonl|md", required: false, default: "json" },
|
|
@@ -1277,65 +1560,40 @@ Examples:
|
|
|
1277
1560
|
name: p.name,
|
|
1278
1561
|
description: p.description,
|
|
1279
1562
|
defaultDateRange: p.defaultDateRange,
|
|
1563
|
+
pageSize: p.defaultLimit,
|
|
1280
1564
|
servingOnly: (p.statusFields?.length ?? 0) > 0,
|
|
1281
1565
|
gaql: expandPreset(p, {}).query
|
|
1282
1566
|
}))
|
|
1283
1567
|
});
|
|
1284
1568
|
return;
|
|
1285
1569
|
}
|
|
1286
|
-
|
|
1287
|
-
if (!validated) return;
|
|
1288
|
-
const { customerId, limit, finalQuery, warnings, useCache, cacheKey } = validated;
|
|
1289
|
-
if (shouldReadCache(args)) {
|
|
1290
|
-
const cached = cacheGet("queries", cacheKey);
|
|
1291
|
-
if (cached) {
|
|
1292
|
-
const fields = extractFields(cached.data);
|
|
1293
|
-
outputResults(
|
|
1294
|
-
cached.data,
|
|
1295
|
-
cached.fields ?? getFieldDescriptions(fields),
|
|
1296
|
-
[
|
|
1297
|
-
...warnings,
|
|
1298
|
-
...missingFieldWarnings(finalQuery, cached.data),
|
|
1299
|
-
...keywordServingWarnings(cached.data, keywordServingOptions(finalQuery)),
|
|
1300
|
-
...conversionMixWarnings(finalQuery)
|
|
1301
|
-
],
|
|
1302
|
-
args,
|
|
1303
|
-
true,
|
|
1304
|
-
{
|
|
1305
|
-
gaql: finalQuery,
|
|
1306
|
-
effectiveLimit: effectiveRowLimit(finalQuery, limit, Boolean(args.all)),
|
|
1307
|
-
all: Boolean(args.all)
|
|
1308
|
-
}
|
|
1309
|
-
);
|
|
1310
|
-
return;
|
|
1311
|
-
}
|
|
1312
|
-
}
|
|
1313
|
-
try {
|
|
1314
|
-
await executeQuery(finalQuery, args, customerId, limit, warnings, useCache, cacheKey);
|
|
1315
|
-
} catch (err) {
|
|
1316
|
-
handleQueryError(err, finalQuery, customerId);
|
|
1317
|
-
}
|
|
1570
|
+
await runQuery(args);
|
|
1318
1571
|
}
|
|
1319
1572
|
});
|
|
1573
|
+
|
|
1320
1574
|
export {
|
|
1321
|
-
|
|
1322
|
-
buildQueryEnvelope,
|
|
1323
|
-
completenessWarnings,
|
|
1575
|
+
resultColumns,
|
|
1324
1576
|
effectiveRowLimit,
|
|
1325
|
-
|
|
1326
|
-
|
|
1327
|
-
|
|
1577
|
+
warningLines,
|
|
1578
|
+
completenessWarnings,
|
|
1579
|
+
buildQueryEnvelope,
|
|
1580
|
+
summariseWarnings,
|
|
1581
|
+
buildFileSummary,
|
|
1328
1582
|
outputResults,
|
|
1329
|
-
|
|
1330
|
-
parseSelectedFields,
|
|
1331
|
-
queryCommand,
|
|
1332
|
-
resultColumns,
|
|
1583
|
+
resolveGaqlInput,
|
|
1333
1584
|
servingScopeWarnings,
|
|
1334
|
-
|
|
1335
|
-
summariseWarnings,
|
|
1336
|
-
unobservedFields,
|
|
1585
|
+
parseSelectedFields,
|
|
1337
1586
|
unobservedSelectedFields,
|
|
1587
|
+
unobservedFields,
|
|
1588
|
+
missingFieldWarnings,
|
|
1589
|
+
missingFieldWarningsFor,
|
|
1338
1590
|
unwrittenColumnWarnings,
|
|
1339
|
-
|
|
1591
|
+
keywordServingOptions,
|
|
1592
|
+
pageCacheKey,
|
|
1593
|
+
shouldReadCache,
|
|
1594
|
+
parseQueryLimit,
|
|
1595
|
+
queryPageSize,
|
|
1596
|
+
runQuery,
|
|
1597
|
+
queryCommand
|
|
1340
1598
|
};
|
|
1341
|
-
//# sourceMappingURL=
|
|
1599
|
+
//# sourceMappingURL=chunk-XPOIIQCI.js.map
|