@vercel/cli-support 65.3.1 → 65.4.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 +1 -1
- package/dist/chunks/add-7NS6HIWC.js +8 -0
- package/dist/chunks/add-NMYFDVXW.js +8 -0
- package/dist/chunks/add-PMJ5BECU.js +8 -0
- package/dist/chunks/build-BCY6HQJG.js +7 -0
- package/dist/chunks/{chunk-SKYDLHEZ.js → chunk-2K3ISCQ6.js} +1 -1
- package/dist/chunks/{chunk-BL3HBRF6.js → chunk-2TUVL6WE.js} +1 -1
- package/dist/chunks/{chunk-22FDWPWY.js → chunk-363SJ4TN.js} +1 -1
- package/dist/chunks/chunk-462YCCJZ.js +7 -0
- package/dist/chunks/{chunk-KNLGWGUE.js → chunk-4N6LMERQ.js} +6 -6
- package/dist/chunks/chunk-527GBU3K.js +7 -0
- package/dist/chunks/chunk-5IWFRZQT.js +10 -0
- package/dist/chunks/chunk-5KUUMQ3M.js +7 -0
- package/dist/chunks/{chunk-IVSC7ZFJ.js → chunk-5V53NA6C.js} +1 -1
- package/dist/chunks/chunk-6I6QJHCY.js +7 -0
- package/dist/chunks/chunk-6TXEVQA4.js +7 -0
- package/dist/chunks/{chunk-2PKEEQ5W.js → chunk-6YXIWZ3X.js} +1 -1
- package/dist/chunks/{chunk-7HV7O6DM.js → chunk-7E3WREH5.js} +1 -1
- package/dist/chunks/{chunk-Y6AGOERS.js → chunk-7L5QUDUR.js} +1 -1
- package/dist/chunks/{chunk-X4762EE4.js → chunk-7QAGSRCU.js} +1 -1
- package/dist/chunks/{chunk-NTZ5WWYV.js → chunk-7R6TRRG5.js} +1 -1
- package/dist/chunks/{chunk-WCWP4GBR.js → chunk-AYUUSAB7.js} +1 -1
- package/dist/chunks/chunk-BVGGTBYE.js +7 -0
- package/dist/chunks/{chunk-YN3C5BL5.js → chunk-C7FQMC6D.js} +1 -1
- package/dist/chunks/{chunk-2U7DJZSQ.js → chunk-CBVKB3DT.js} +1 -1
- package/dist/chunks/{chunk-FDNYYENK.js → chunk-CC6FLKIP.js} +1 -1
- package/dist/chunks/chunk-CR3NBTHV.js +7 -0
- package/dist/chunks/{chunk-BBKEP7RO.js → chunk-CWM2F235.js} +1 -1
- package/dist/chunks/{chunk-IUXSJWL3.js → chunk-DKJL2KV7.js} +1 -1
- package/dist/chunks/{chunk-2ACMWVTB.js → chunk-DQ2SVW4R.js} +1 -1
- package/dist/chunks/{chunk-SLI2O5X7.js → chunk-EAXMWCOL.js} +2 -2
- package/dist/chunks/{chunk-LRYGNQ6C.js → chunk-ECEDD646.js} +1 -1
- package/dist/chunks/{chunk-IGDG5CWT.js → chunk-EEUJLJEJ.js} +1 -1
- package/dist/chunks/{chunk-VQSLPYAF.js → chunk-EGNR2DEI.js} +1 -1
- package/dist/chunks/chunk-EISD3RG7.js +11 -0
- package/dist/chunks/{chunk-GVTXA6HG.js → chunk-EKZTFGDX.js} +1 -1
- package/dist/chunks/{chunk-CEMPU323.js → chunk-EU2GBIPC.js} +1 -1
- package/dist/chunks/{chunk-3ADDGPEN.js → chunk-F6EBOT64.js} +1 -1
- package/dist/chunks/chunk-FHU2O7ZJ.js +8 -0
- package/dist/chunks/{chunk-KH6565YH.js → chunk-FLHO75XC.js} +1 -1
- package/dist/chunks/chunk-FSPPKNKN.js +7 -0
- package/dist/chunks/{chunk-43GBAKL2.js → chunk-GCZVIDNG.js} +1 -1
- package/dist/chunks/{chunk-G4T7VBGN.js → chunk-HSFKISDH.js} +1 -1
- package/dist/chunks/{chunk-OQCMRU3J.js → chunk-HTXDC7E2.js} +2 -2
- package/dist/chunks/{chunk-76SVVWPH.js → chunk-IOZ3I765.js} +1 -1
- package/dist/chunks/{chunk-UKQMYTWW.js → chunk-JLE7K4SY.js} +1 -1
- package/dist/chunks/{chunk-3JGBBS6V.js → chunk-JP33AIDQ.js} +1 -1
- package/dist/chunks/{chunk-ULHNMQ7C.js → chunk-JRPNHWA3.js} +1 -1
- package/dist/chunks/{chunk-D2BZMGHP.js → chunk-JUSR7V2L.js} +1 -1
- package/dist/chunks/{chunk-XB4SKARZ.js → chunk-JWCEHQQF.js} +1 -1
- package/dist/chunks/chunk-K5U47EVH.js +7 -0
- package/dist/chunks/{chunk-VOCZ34ON.js → chunk-KCKYPLIH.js} +1 -1
- package/dist/chunks/{chunk-2WYYGGEO.js → chunk-KGBIRIFF.js} +1 -1
- package/dist/chunks/{chunk-RRREFECI.js → chunk-KJA2GKPT.js} +1 -1
- package/dist/chunks/{chunk-S5IWVPYT.js → chunk-KPQLUGFI.js} +1 -1
- package/dist/chunks/{chunk-S4SJ7GIZ.js → chunk-KQCFC2JL.js} +1 -1
- package/dist/chunks/{chunk-XXXRTHTP.js → chunk-KQCROPL3.js} +1 -1
- package/dist/chunks/{chunk-3KKFLKQG.js → chunk-KY335KWI.js} +1 -1
- package/dist/chunks/{chunk-OWOWPOIE.js → chunk-L3JYCXVB.js} +1 -1
- package/dist/chunks/chunk-LFOWP74R.js +7 -0
- package/dist/chunks/{chunk-PFNYWWLI.js → chunk-LOBA3E72.js} +1 -1
- package/dist/chunks/{chunk-XZV4BFM5.js → chunk-LQVSU5HR.js} +1 -1
- package/dist/chunks/{chunk-2H3SB5RP.js → chunk-LW4N3CW6.js} +1 -1
- package/dist/chunks/{chunk-6ISAISGD.js → chunk-M2NXKZKX.js} +1 -1
- package/dist/chunks/{chunk-F2SWJEYV.js → chunk-MBEKRUTQ.js} +1 -1
- package/dist/chunks/{chunk-UJSW56GS.js → chunk-N2FLYCCO.js} +1 -1
- package/dist/chunks/{chunk-ZH6KHD55.js → chunk-N6JBQMOF.js} +2 -2
- package/dist/chunks/{chunk-OCQPXOTX.js → chunk-NAX6IARA.js} +1 -1
- package/dist/chunks/{chunk-4UGHFESV.js → chunk-NGKO2OOU.js} +1 -1
- package/dist/chunks/chunk-NW7WWUCQ.js +9 -0
- package/dist/chunks/chunk-O4WNSKQR.js +15 -0
- package/dist/chunks/{chunk-7Z3WUAO5.js → chunk-O72YDZKD.js} +1 -1
- package/dist/chunks/{chunk-LKLH6DZP.js → chunk-OHEOYFBU.js} +1 -1
- package/dist/chunks/{chunk-LJBUJ23M.js → chunk-OZCQTXI4.js} +1 -1
- package/dist/chunks/{chunk-LCHECISY.js → chunk-Q4KTAQB3.js} +1 -1
- package/dist/chunks/{chunk-TZFDVQ72.js → chunk-QIVX6SCR.js} +1 -1
- package/dist/chunks/{chunk-7Y46LB43.js → chunk-QVHXFHBV.js} +1 -1
- package/dist/chunks/chunk-QVXS234E.js +7 -0
- package/dist/chunks/{chunk-SXOSF4O6.js → chunk-QVZAAMGQ.js} +1 -1
- package/dist/chunks/chunk-R2BUF6Z7.js +7 -0
- package/dist/chunks/{chunk-OGPENBY2.js → chunk-R2XHJDAP.js} +1 -1
- package/dist/chunks/{chunk-E6CO6TUM.js → chunk-RMZTB2IU.js} +1 -1
- package/dist/chunks/{chunk-LT3UK4K6.js → chunk-SLGUYM42.js} +1 -1
- package/dist/chunks/{chunk-7BGKE3JW.js → chunk-SYFG2RM6.js} +1 -1
- package/dist/chunks/chunk-T6243EDS.js +7 -0
- package/dist/chunks/chunk-TAISZMA2.js +7 -0
- package/dist/chunks/{chunk-TO5PJDEN.js → chunk-TEYREL44.js} +1 -1
- package/dist/chunks/{chunk-6KVHNQW4.js → chunk-TIPQQ4TG.js} +1 -1
- package/dist/chunks/{chunk-DUT4U5YY.js → chunk-U2OBPULW.js} +1 -1
- package/dist/chunks/{chunk-OQPXJCMK.js → chunk-UGNIIDHR.js} +1 -1
- package/dist/chunks/{chunk-NQWGRKF4.js → chunk-UHBMX3OK.js} +1 -1
- package/dist/chunks/{chunk-QMCHGGDX.js → chunk-VNIKIQVE.js} +1 -1
- package/dist/chunks/{chunk-DGYHWXD2.js → chunk-WDXW6A4H.js} +2 -2
- package/dist/chunks/{chunk-L4NSF346.js → chunk-WEH6XC4Y.js} +1 -1
- package/dist/chunks/{chunk-TKBORMUF.js → chunk-WKZ6JSGZ.js} +1 -1
- package/dist/chunks/{chunk-WGXKX24Q.js → chunk-WVHCBDTB.js} +1 -1
- package/dist/chunks/{chunk-COM5YCHF.js → chunk-XC46OAAT.js} +1 -1
- package/dist/chunks/{chunk-WBF36MYT.js → chunk-XVDRGWXM.js} +1 -1
- package/dist/chunks/{chunk-IKQTP764.js → chunk-Y5ZMKL7E.js} +1 -1
- package/dist/chunks/{chunk-NEFDNROD.js → chunk-YEZJNXQX.js} +1 -1
- package/dist/chunks/{chunk-VMMMBWD3.js → chunk-YHULP2KK.js} +1 -1
- package/dist/chunks/{chunk-OMCGXRSA.js → chunk-YMZ6WBKB.js} +2 -2
- package/dist/chunks/{chunk-URPEIX6M.js → chunk-ZN6CQWVP.js} +1 -1
- package/dist/chunks/{chunk-YK7XLFU2.js → chunk-ZQBSAMFL.js} +1 -1
- package/dist/chunks/clear-FKVWDCVA.js +8 -0
- package/dist/chunks/{compile-vercel-config-3IYM2CHC.js → compile-vercel-config-GWAJE44R.js} +1 -1
- package/dist/chunks/config-5WVLG5SE.js +8 -0
- package/dist/chunks/{config-ZFIC7N4D.js → config-RMOHN5YT.js} +1 -1
- package/dist/chunks/config-validator.mjs +1 -1
- package/dist/chunks/{constants-ICJL2EO5.js → constants-JAB7MRSK.js} +1 -1
- package/dist/chunks/delete-5WMB4WFR.js +9 -0
- package/dist/chunks/delete-EM4JZPFA.js +10 -0
- package/dist/chunks/{detect-services-MOXTX5XG.js → detect-services-BSJGB4RM.js} +1 -1
- package/dist/chunks/disable-QOM7UHQC.js +7 -0
- package/dist/chunks/discard-L5ZH7P5B.js +14 -0
- package/dist/chunks/edit-F3VJGCG2.js +9 -0
- package/dist/chunks/edit-TM7YCWBU.js +8 -0
- package/dist/chunks/enable-72C3QX34.js +7 -0
- package/dist/chunks/{export-MHSH7QCX.js → export-EPLYZF2Q.js} +1 -1
- package/dist/chunks/{future-FFOGTKMF.js → future-V77DRMQG.js} +1 -1
- package/dist/chunks/generate-cert-for-deploy-Y3YHBMPU.js +7 -0
- package/dist/chunks/{image-7METSS6F.js → image-CVXEXU5R.js} +1 -1
- package/dist/chunks/{import-builders-GM2SERWV.js → import-builders-PGRKJOOE.js} +1 -1
- package/dist/chunks/inspect-BTRNXRJT.js +9 -0
- package/dist/chunks/{inspect-IAWVHJXQ.js → inspect-CZ7WXYE5.js} +1 -1
- package/dist/chunks/inspect-FGDVWAQP.js +13 -0
- package/dist/chunks/{inspect-A7WJQQZO.js → inspect-HFDGZNWC.js} +1 -1
- package/dist/chunks/{inspect-DI434TAM.js → inspect-T2AIREYK.js} +1 -1
- package/dist/chunks/list-CKRRHAOE.js +12 -0
- package/dist/chunks/{list-WWU734RK.js → list-FLREMGJR.js} +1 -1
- package/dist/chunks/{list-INRPH25K.js → list-ON4YTQRN.js} +1 -1
- package/dist/chunks/login-55LJ5ZA6.js +9 -0
- package/dist/chunks/{login-R5NQRPQC.js → login-DQRZSD4Z.js} +1 -1
- package/dist/chunks/logs-2HQXWOHM.js +7 -0
- package/dist/chunks/{ls-S5E2NQMI.js → ls-2HUJHVLA.js} +1 -1
- package/dist/chunks/{ls-V2ZSIVO3.js → ls-3DVM5HLK.js} +1 -1
- package/dist/chunks/ls-4B3QYHCI.js +8 -0
- package/dist/chunks/{ls-MCQ2NS65.js → ls-A7K4XDQB.js} +1 -1
- package/dist/chunks/{ls-LIGIBVAT.js → ls-FK5XEJEU.js} +1 -1
- package/dist/chunks/{ls-VXH4QYF5.js → ls-QGUKJJY5.js} +1 -1
- package/dist/chunks/ls-VTKHPDWS.js +11 -0
- package/dist/chunks/mutate-7ADZBCZM.js +9 -0
- package/dist/chunks/{notifications-KFZ333V5.js → notifications-XZJXE2K4.js} +1 -1
- package/dist/chunks/open-EE5IZQD7.js +7 -0
- package/dist/chunks/{openapi-JGYEFJJV.js → openapi-QBX62ZXC.js} +1 -1
- package/dist/chunks/{permissions-ZSHKMXBZ.js → permissions-VYJ4LL5R.js} +1 -1
- package/dist/chunks/{plugin-offer-Z6FCPQFD.js → plugin-offer-TEGYA3TA.js} +1 -1
- package/dist/chunks/{prompt-missing-credentials-KOA7C4QC.js → prompt-missing-credentials-VP6OVCFM.js} +1 -1
- package/dist/chunks/publish-2HEK5UMJ.js +15 -0
- package/dist/chunks/pull-WRTTSY7J.js +7 -0
- package/dist/chunks/purchase-domain-if-available-6S3NLTUI.js +7 -0
- package/dist/chunks/push-L3QRGGLC.js +7 -0
- package/dist/chunks/{query-JGPO7TNY.js → query-FXXLX6UB.js} +3 -3
- package/dist/chunks/{reauthenticate-OZRQFR66.js → reauthenticate-IXQDC4UZ.js} +1 -1
- package/dist/chunks/reorder-B4OXSYCI.js +10 -0
- package/dist/chunks/reply-F637K6XH.js +9 -0
- package/dist/chunks/resolve-E3F6NYQZ.js +12 -0
- package/dist/chunks/{resolve-agent-team-KX77HEAF.js → resolve-agent-team-EIPCH766.js} +1 -1
- package/dist/chunks/restore-Q25KRZPH.js +16 -0
- package/dist/chunks/rm-FWD2NUGX.js +8 -0
- package/dist/chunks/rm-JMQ4QKCC.js +8 -0
- package/dist/chunks/rm-PPG7P3GN.js +8 -0
- package/dist/chunks/rm-SH3DYKNS.js +8 -0
- package/dist/chunks/rm-UEBLKFVC.js +8 -0
- package/dist/chunks/{routes-P6LKQCWH.js → routes-PKTWMDWQ.js} +1 -1
- package/dist/chunks/rule-inspect-LKQA5I4V.js +8 -0
- package/dist/chunks/{schema-YOEAK4VX.js → schema-FBV42W7N.js} +1 -1
- package/dist/chunks/{schema-BEUO7G52.js → schema-ZWE5MNMG.js} +1 -1
- package/dist/chunks/{select-org-OMLGQEKK.js → select-org-WMB752Z6.js} +1 -1
- package/dist/chunks/set-UTYIPOLC.js +7 -0
- package/dist/chunks/setup-and-link-ZLY5XQW5.js +7 -0
- package/dist/chunks/{skills-4J2NC2QI.js → skills-RKIGVVNM.js} +2 -2
- package/dist/chunks/{tags-ZXZQEXOV.js → tags-UCLZ5UMX.js} +1 -1
- package/dist/chunks/{types-SK6J2HFE.js → types-YM7TMHXW.js} +1 -1
- package/dist/chunks/{update-25CKNOY5.js → update-BGDQ5TXO.js} +1 -1
- package/dist/commands/build/index.js +1 -1
- package/dist/commands/deploy/index.js +4 -4
- package/dist/commands/dev/index.js +4 -4
- package/dist/commands/env/index.js +1 -1
- package/dist/commands/link/index.js +1 -1
- package/dist/commands/list/index.js +1 -1
- package/dist/commands/project/index.js +8 -8
- package/dist/commands-account.js +8 -8
- package/dist/commands-ai.js +12 -12
- package/dist/commands-blob.js +8 -8
- package/dist/commands-core.js +11 -11
- package/dist/commands-deployments.js +1 -1
- package/dist/commands-flags.js +6 -6
- package/dist/commands-integrations.js +16 -16
- package/dist/commands-observability.js +5 -5
- package/dist/commands-routing.js +18 -18
- package/dist/help.js +1 -1
- package/dist/index.js +5 -3
- package/dist/internal-build.js +1 -1
- package/dist/package.json +60 -61
- package/dist/root-help-commands.mjs +1 -1
- package/dist/vc.js +148 -137
- package/dist/version.mjs +1 -1
- package/package.json +54 -54
- package/dist/chunks/add-5YZQTIQM.js +0 -8
- package/dist/chunks/add-A524QQ2H.js +0 -8
- package/dist/chunks/add-V4JMUHKO.js +0 -8
- package/dist/chunks/build-K2PVDJZ4.js +0 -7
- package/dist/chunks/chunk-3AYYFYZG.js +0 -7
- package/dist/chunks/chunk-5IASAERQ.js +0 -7
- package/dist/chunks/chunk-76KGQU2G.js +0 -7
- package/dist/chunks/chunk-ABZEMNDR.js +0 -7
- package/dist/chunks/chunk-APZULWJC.js +0 -8
- package/dist/chunks/chunk-AWMQGOS2.js +0 -7
- package/dist/chunks/chunk-B4UE4LVE.js +0 -7
- package/dist/chunks/chunk-B4YYOSPY.js +0 -7
- package/dist/chunks/chunk-E2SADN6I.js +0 -7
- package/dist/chunks/chunk-IA3MXJRC.js +0 -8
- package/dist/chunks/chunk-IEPW2YRH.js +0 -7
- package/dist/chunks/chunk-LUBUI5GF.js +0 -7
- package/dist/chunks/chunk-OKEBIUKZ.js +0 -7
- package/dist/chunks/chunk-QZX7VG2V.js +0 -9
- package/dist/chunks/chunk-RUXO73ON.js +0 -7
- package/dist/chunks/chunk-TPNOSQZ3.js +0 -15
- package/dist/chunks/chunk-UNEGQPD3.js +0 -7
- package/dist/chunks/chunk-V7BEC3E4.js +0 -10
- package/dist/chunks/chunk-YHQ7PPXP.js +0 -7
- package/dist/chunks/clear-ZS4KQ7OT.js +0 -8
- package/dist/chunks/config-N2SBVW4T.js +0 -8
- package/dist/chunks/delete-2ZE2NVHI.js +0 -10
- package/dist/chunks/delete-AL57HZDQ.js +0 -9
- package/dist/chunks/disable-MKI3BKNH.js +0 -7
- package/dist/chunks/discard-SI4H7ST3.js +0 -14
- package/dist/chunks/edit-DNWH6SPE.js +0 -8
- package/dist/chunks/edit-WYNWDFUJ.js +0 -9
- package/dist/chunks/enable-J6MMYPYF.js +0 -7
- package/dist/chunks/generate-cert-for-deploy-YZKNGAEQ.js +0 -7
- package/dist/chunks/inspect-H2Q7XOWN.js +0 -13
- package/dist/chunks/inspect-H5JC2XKI.js +0 -9
- package/dist/chunks/list-ELEUTZWJ.js +0 -12
- package/dist/chunks/login-ZF2TLCQB.js +0 -9
- package/dist/chunks/logs-UD7FEXZ7.js +0 -7
- package/dist/chunks/ls-5ZEAKKPQ.js +0 -8
- package/dist/chunks/ls-IXRLAJ4L.js +0 -11
- package/dist/chunks/mutate-OQWOKLIW.js +0 -9
- package/dist/chunks/open-HH6K7ZRC.js +0 -7
- package/dist/chunks/publish-FPNQ2US4.js +0 -15
- package/dist/chunks/pull-7OGOIKB3.js +0 -7
- package/dist/chunks/purchase-domain-if-available-F4LKHVBD.js +0 -7
- package/dist/chunks/push-NY3SIK2C.js +0 -7
- package/dist/chunks/reorder-4J2STFUS.js +0 -10
- package/dist/chunks/reply-EO4NTTPW.js +0 -9
- package/dist/chunks/resolve-RPHHRPNM.js +0 -12
- package/dist/chunks/restore-TEA6TSVK.js +0 -16
- package/dist/chunks/rm-BPILSPUI.js +0 -8
- package/dist/chunks/rm-F6XVUDBM.js +0 -8
- package/dist/chunks/rm-JCPXV2FN.js +0 -8
- package/dist/chunks/rm-LPQRGX7N.js +0 -8
- package/dist/chunks/rm-WHUGT6TE.js +0 -8
- package/dist/chunks/rule-inspect-BOETGPFO.js +0 -8
- package/dist/chunks/set-5XY27S7R.js +0 -7
- package/dist/chunks/setup-and-link-A7M3QT52.js +0 -7
package/dist/commands-flags.js
CHANGED
|
@@ -4,7 +4,7 @@ import { dirname as __dirname_ } from 'node:path';
|
|
|
4
4
|
const require = __createRequire(import.meta.url);
|
|
5
5
|
const __filename = __fileURLToPath(import.meta.url);
|
|
6
6
|
const __dirname = __dirname_(__filename);
|
|
7
|
-
import{FILTER_DEPRECATION_WARNING,alignTimeRangeToGranularity,canonicalResponseToMetricsResponse,createCanonicalMetricsRequest,usesODataSyntax}from"./chunks/chunk-LCHECISY.js";import{init_dist,prepareFlagsDefinitions}from"./chunks/chunk-OAM5NJCU.js";import{EncryptJWT,base64url_exports,jwtDecrypt}from"./chunks/chunk-S3L2OHPO.js";import{require_fast_deep_equal}from"./chunks/chunk-MCRKBVZA.js";import{sanitizeForTerminal}from"./chunks/chunk-5RMIM4S2.js";import{getLinkedFlagsProject,getProjectNameFromFlags}from"./chunks/chunk-ULHNMQ7C.js";import{parseSubcommandArguments,requireProjectContext}from"./chunks/chunk-NEFDNROD.js";import{computeGranularity,formatText,generateSparkline}from"./chunks/chunk-WBF36MYT.js";import{OBSERVABILITY_METRICS_PATH,getRollupColumnName,handleApiError}from"./chunks/chunk-FDNYYENK.js";import"./chunks/chunk-IVSSTHB6.js";import{require_dist}from"./chunks/chunk-JELLVPCM.js";import{readStdinText}from"./chunks/chunk-PSOVLGHP.js";import{require_raw_body}from"./chunks/chunk-XOETL6DB.js";import{normalizeRepeatableStringFilters,outputError,resolveTimeRange,validateIntegerRangeWithDefault,validateTimeBound,validateTimeOrder}from"./chunks/chunk-RW3X523R.js";import{ellipsizeMiddle,truncateEnd}from"./chunks/chunk-ID663OJ7.js";import{formatDate}from"./chunks/chunk-HRR57QNP.js";import{formatTable}from"./chunks/chunk-LSQREJXO.js";import{stamp_default}from"./chunks/chunk-A2RZZQEP.js";import"./chunks/chunk-Q7D7RGXM.js";import"./chunks/chunk-GZNDA6SV.js";import{resolveProjectContext}from"./chunks/chunk-3JGBBS6V.js";import{STANDARD_ENVIRONMENTS}from"./chunks/chunk-7YKFF6CE.js";import{formatProject}from"./chunks/chunk-6OVX3PWM.js";import{require_open}from"./chunks/chunk-PVASGBEF.js";import"./chunks/chunk-BL3HBRF6.js";import"./chunks/chunk-7EJQLVWX.js";import{readOnOffOption}from"./chunks/chunk-IKQTP764.js";import{canPrompt}from"./chunks/chunk-IQ7FPAI4.js";import{getCommandFlags}from"./chunks/chunk-XGTKHQTT.js";import{printNextPageCommand}from"./chunks/chunk-QMCHGGDX.js";import"./chunks/chunk-PFD7LETF.js";import{getInvalidSubcommand}from"./chunks/chunk-TG2RCYTH.js";import{getSubcommand}from"./chunks/chunk-ETV3C2CV.js";import{FLAG_ATTRIBUTE_TYPES,FLAG_CONDITION_LIST_COMPARATORS,FLAG_CONDITION_RHS_OPTIONAL_COMPARATORS,FLAG_EVALUATIONS_DIMENSIONS,FLAG_EVALUATIONS_DIMENSION_NAMES,FLAG_EVALUATIONS_GRANULARITIES,alertsInspectSubcommand,alertsListSubcommand,alertsSubcommand,archiveSubcommand,attackModeDisableSubcommand,attackModeEnableSubcommand,attackModeSubcommand,botManagementSubcommand,connectionsAddSubcommand,connectionsListSubcommand,connectionsRemoveSubcommand,connectionsSubcommand,createSubcommand6 as createSubcommand,datafileSubcommand,diffSubcommand,disableSubcommand,discardSubcommand,enableSubcommand2 as enableSubcommand,entitiesCreateSubcommand,entitiesListSubcommand,entitiesRemoveSubcommand,entitiesSubcommand,entitiesUpdateSubcommand,evaluationsSubcommand,feedbackCommand,firewallCommand,flagsCommand,formatFlagAttributeTypeList,formatFlagConditionComparator,formatFlagConditionComparatorList,getCommandAliases,getFlagAttributeType,inspectSubcommand9 as inspectSubcommand,ipBlocksBlockSubcommand,ipBlocksListSubcommand,ipBlocksSubcommand,ipBlocksUnblockSubcommand,isBucketingAttribute,isFlagAttributeType,isFlagEvaluationsDimension,isFlagEvaluationsGranularity,isTimestampAttributeType,labelsListSubcommand,labelsSubcommand,listSubcommand14 as listSubcommand,openSubcommand3 as openSubcommand,overrideSubcommand,overviewSubcommand,persistentActionsInspectSubcommand,persistentActionsListSubcommand,persistentActionsSubcommand,prepareSubcommand,publishSubcommand,removeSubcommand8 as removeSubcommand,rolloutSubcommand,rulesAddSubcommand2 as rulesAddSubcommand,rulesAddSubcommand3 as rulesAddSubcommand2,rulesDisableSubcommand,rulesEditSubcommand2 as rulesEditSubcommand,rulesEnableSubcommand,rulesInspectSubcommand,rulesListSubcommand2 as rulesListSubcommand,rulesListSubcommand3 as rulesListSubcommand2,rulesMoveSubcommand,rulesRemoveSubcommand2 as rulesRemoveSubcommand,rulesRemoveSubcommand3 as rulesRemoveSubcommand2,rulesReorderSubcommand,rulesSubcommand2 as rulesSubcommand,rulesSubcommand3 as rulesSubcommand2,rulesUpdateSubcommand,sdkKeysAddSubcommand,sdkKeysListSubcommand,sdkKeysRemoveSubcommand,sdkKeysSubcommand,segmentsCreateSubcommand,segmentsInspectSubcommand,segmentsListSubcommand,segmentsRemoveSubcommand,segmentsSubcommand,segmentsUpdateSubcommand,setSubcommand2 as setSubcommand,splitSubcommand,staleSubcommand,statusSubcommand,systemBypassAddSubcommand,systemBypassListSubcommand,systemBypassRemoveSubcommand,systemBypassSubcommand,systemMitigationsPauseSubcommand,systemMitigationsResumeSubcommand,systemMitigationsSubcommand,targetingEnableSubcommand,targetingSubcommand,targetsAddSubcommand,targetsListSubcommand,targetsRemoveSubcommand,targetsSubcommand,trafficInspectSubcommand,trafficListSubcommand,trafficSubcommand,unarchiveSubcommand,updateSubcommand5 as updateSubcommand,useTargetingSubcommand,versionsDiffSubcommand,versionsListSubcommand,versionsSubcommand}from"./chunks/chunk-TPNOSQZ3.js";import"./chunks/chunk-LUBUI5GF.js";import"./chunks/chunk-GVTXA6HG.js";import"./chunks/chunk-5IASAERQ.js";import"./chunks/chunk-WGXKX24Q.js";import"./chunks/chunk-E2SADN6I.js";import"./chunks/chunk-ABZEMNDR.js";import"./chunks/chunk-3AYYFYZG.js";import"./chunks/chunk-76KGQU2G.js";import"./chunks/chunk-UNEGQPD3.js";import"./chunks/chunk-YHQ7PPXP.js";import"./chunks/chunk-NQWGRKF4.js";import"./chunks/chunk-IGDG5CWT.js";import"./chunks/chunk-QZX7VG2V.js";import"./chunks/chunk-3ADDGPEN.js";import"./chunks/chunk-B4YYOSPY.js";import"./chunks/chunk-PFNYWWLI.js";import"./chunks/chunk-NTZ5WWYV.js";import"./chunks/chunk-JALVF3C2.js";import"./chunks/chunk-LJBUJ23M.js";import"./chunks/chunk-OKEBIUKZ.js";import{help}from"./chunks/chunk-KH6565YH.js";import{table}from"./chunks/chunk-773GOZIR.js";import{printError}from"./chunks/chunk-G4T7VBGN.js";import"./chunks/chunk-67GZ5REA.js";import"./chunks/chunk-BS32OUOC.js";import{TelemetryClient}from"./chunks/chunk-2PKEEQ5W.js";import"./chunks/chunk-PUKYAALC.js";import{getScope}from"./chunks/chunk-B4UE4LVE.js";import{require_ms}from"./chunks/chunk-MXTC4ZAQ.js";import"./chunks/chunk-NWGBDBZI.js";import"./chunks/chunk-FGFLTLEA.js";import{AGENT_REASON,AGENT_STATUS,buildCommandWithGlobalFlags,buildCommandWithYes,clientObservabilityPlanRecovery,getExitCodeForReason,outputAgentError,shouldEmitNonInteractiveCommandError,writeActionRequired,writeAgentError}from"./chunks/chunk-DGYHWXD2.js";import"./chunks/chunk-IUXSJWL3.js";import{getProjectByNameOrId,require_pluralize,ua_default}from"./chunks/chunk-KNLGWGUE.js";import{formatAlignedLabel,printAlignedLabel}from"./chunks/chunk-ADLBLGT3.js";import"./chunks/chunk-BBKEP7RO.js";import"./chunks/chunk-4NTBYNFR.js";import{parseArguments}from"./chunks/chunk-VOCZ34ON.js";import{quoteArg,teamCache}from"./chunks/chunk-F53OKXYI.js";import{SDK_KEY_PATTERN,getFlagsSpecification,getGlobalFlagsFromArgs,getProjectOptionFromArgs,warnDeprecatedInput,warnDeprecatedOption,warnDeprecatedSubcommand}from"./chunks/chunk-AWMQGOS2.js";import{fetch,toNodeReadable}from"./chunks/chunk-FUX6LKNP.js";import"./chunks/chunk-OPORM35X.js";import"./chunks/chunk-4SAVH3H7.js";import{ProjectNotFound,isAPIError}from"./chunks/chunk-6VH56CX2.js";import{cmd,getCommandName,getCommandNamePlain,packageName}from"./chunks/chunk-JESNVRVR.js";import{output_manager_default,recordCliError}from"./chunks/chunk-XP3FT56R.js";import"./chunks/chunk-BLUPZPAS.js";import"./chunks/chunk-RM3ZDRYE.js";import{pkg_default}from"./chunks/chunk-OO572JUC.js";import"./chunks/chunk-D3AHZ5LI.js";import"./chunks/chunk-2GHZGOWT.js";import"./chunks/chunk-YHPPP3SF.js";import{require_source}from"./chunks/chunk-NB2WLB3J.js";import"./chunks/chunk-ISWW3DKF.js";import"./chunks/chunk-BRQUZ5NC.js";import{__toESM}from"./chunks/chunk-BZENIQ7N.js";var import_raw_body=__toESM(require_raw_body(),1);var FeedbackTelemetryClient=class extends TelemetryClient{trackCliArgumentNote(note){note!==void 0&&this.trackCliArgument({arg:"note",value:this.redactedValue})}trackCliOptionField(fields){fields?.length&&this.trackCliOption({option:"field",value:this.redactedValue})}};var FEEDBACK_URL="https://vercel.com/api/feedback/cli",MAX_FEEDBACK_BYTES=1024*1024,FETCH_TIMEOUT_MS=1e4;async function feedback(client){let fail=(reason,message,code)=>(recordCliError({code:reason}),output_manager_default.error(message),code),parsed;try{parsed=parseArguments(client.argv.slice(2),getFlagsSpecification(feedbackCommand.options))}catch{return fail(AGENT_REASON.INVALID_ARGUMENTS,"Invalid feedback arguments. Run vercel feedback --help for usage.",2)}let notes=parsed.args.slice(1),fields=parsed.flags["--field"]??[];if(notes.length===0&&fields.length===0)return client.stdout.write(help(feedbackCommand,{columns:client.stderr.columns})),0;if(notes.length>1)return fail(AGENT_REASON.INVALID_ARGUMENTS,"Pass one note. Quote notes containing spaces, or use vercel feedback - to read stdin.",2);let telemetry=new FeedbackTelemetryClient({opts:{store:client.telemetryEventStore}});telemetry.trackCliArgumentNote(notes[0]),telemetry.trackCliOptionField(fields);let data=Object.create(null);for(let field of fields){let separator=field.indexOf("="),key=field.slice(0,separator).trim();if(separator<1||key==="")return fail(AGENT_REASON.INVALID_ARGUMENTS,"Each --field needs a non-empty key followed by =value. Example: vercel feedback --field topic=deploy.",2);data[key]=field.slice(separator+1)}if(notes.length&&Object.hasOwn(data,"note"))return fail(AGENT_REASON.INVALID_ARGUMENTS,"Provide the note once: use a positional note or --field note=..., rather than both.",2);if(notes[0]==="-"){if(client.stdin.isTTY)return fail(AGENT_REASON.INVALID_ARGUMENTS,"No input was piped to stdin. Pipe a note with: cat notes.md | vercel feedback -",2);try{data.note=await readStdinText(client.stdin,MAX_FEEDBACK_BYTES)}catch(error){return error.type==="entity.too.large"?fail(AGENT_REASON.INVALID_ARGUMENTS,"Feedback is too large. Keep the complete submission below 1 MiB.",2):fail(AGENT_REASON.STDIN_ERROR,"Could not read the feedback note from stdin. Check the input pipe and try again.",1)}}else notes[0]!==void 0&&(data.note=notes[0]);for(let key of Object.keys(data))data[key].trim()||delete data[key];if(!Object.keys(data).length)return fail(AGENT_REASON.INVALID_ARGUMENTS,"Provide a note or at least one named field. Run vercel feedback --help for examples.",2);let canSendTelemetry=client.telemetryEventStore?.enabled??!1,body=JSON.stringify({metadata:canSendTelemetry?{agent:client.isAgent,agent_name:client.isAgent?client.agentName:void 0,cli_version:pkg_default.version,operating_system:process.platform,team_id:client.config.currentTeam??null,user_id:client.authConfig.userId??null,invocation_id:client.telemetryEventStore?.currentInvocationId??null,session_id:client.telemetryEventStore?.currentSessionId??null}:null,data});if(Buffer.byteLength(body)>MAX_FEEDBACK_BYTES)return fail(AGENT_REASON.INVALID_ARGUMENTS,"Feedback is too large. Keep the complete submission below 1 MiB.",2);let controller=new AbortController,timeout=setTimeout(()=>controller.abort(),FETCH_TIMEOUT_MS);timeout.unref?.();try{let response=await fetch(FEEDBACK_URL,{method:"POST",headers:{"content-type":"application/json","user-agent":ua_default},body,redirect:"manual",signal:controller.signal});if(!response.ok)return await response.body?.cancel(),fail(response.status===429?AGENT_REASON.RATE_LIMITED:AGENT_REASON.API_ERROR,`Feedback could not be submitted (HTTP ${response.status}). Try again later.`,1);let responseBody=toNodeReadable(response.body);return JSON.parse(await(0,import_raw_body.default)(responseBody,{limit:64*1024,encoding:"utf8"}).finally(()=>responseBody.destroy()))?.success!==!0?fail(AGENT_REASON.UNKNOWN_OUTCOME,"Could not confirm that Vercel accepted the feedback. It may have been submitted; no automatic retry was made.",1):(client.stdout.write(`Feedback sent
|
|
7
|
+
import{FILTER_DEPRECATION_WARNING,alignTimeRangeToGranularity,canonicalResponseToMetricsResponse,createCanonicalMetricsRequest,usesODataSyntax}from"./chunks/chunk-Q4KTAQB3.js";import{init_dist,prepareFlagsDefinitions}from"./chunks/chunk-OAM5NJCU.js";import{EncryptJWT,base64url_exports,jwtDecrypt}from"./chunks/chunk-S3L2OHPO.js";import{require_fast_deep_equal}from"./chunks/chunk-MCRKBVZA.js";import{sanitizeForTerminal}from"./chunks/chunk-5RMIM4S2.js";import{getLinkedFlagsProject,getProjectNameFromFlags}from"./chunks/chunk-JRPNHWA3.js";import{parseSubcommandArguments,requireProjectContext}from"./chunks/chunk-YEZJNXQX.js";import{computeGranularity,formatText,generateSparkline}from"./chunks/chunk-XVDRGWXM.js";import{OBSERVABILITY_METRICS_PATH,getRollupColumnName,handleApiError}from"./chunks/chunk-CC6FLKIP.js";import"./chunks/chunk-IVSSTHB6.js";import{require_dist}from"./chunks/chunk-JELLVPCM.js";import{readStdinText}from"./chunks/chunk-PSOVLGHP.js";import{require_raw_body}from"./chunks/chunk-XOETL6DB.js";import{normalizeRepeatableStringFilters,outputError,resolveTimeRange,validateIntegerRangeWithDefault,validateTimeBound,validateTimeOrder}from"./chunks/chunk-RW3X523R.js";import{ellipsizeMiddle,truncateEnd}from"./chunks/chunk-ID663OJ7.js";import{formatDate}from"./chunks/chunk-HRR57QNP.js";import{formatTable}from"./chunks/chunk-LSQREJXO.js";import{stamp_default}from"./chunks/chunk-A2RZZQEP.js";import"./chunks/chunk-Q7D7RGXM.js";import"./chunks/chunk-GZNDA6SV.js";import{resolveProjectContext}from"./chunks/chunk-JP33AIDQ.js";import{STANDARD_ENVIRONMENTS}from"./chunks/chunk-7YKFF6CE.js";import{formatProject}from"./chunks/chunk-6OVX3PWM.js";import{require_open}from"./chunks/chunk-PVASGBEF.js";import"./chunks/chunk-2TUVL6WE.js";import"./chunks/chunk-7EJQLVWX.js";import{readOnOffOption}from"./chunks/chunk-Y5ZMKL7E.js";import{canPrompt}from"./chunks/chunk-IQ7FPAI4.js";import{getCommandFlags}from"./chunks/chunk-XGTKHQTT.js";import{printNextPageCommand}from"./chunks/chunk-VNIKIQVE.js";import"./chunks/chunk-PFD7LETF.js";import{getInvalidSubcommand}from"./chunks/chunk-TG2RCYTH.js";import{getRenamedOption,reportRenamedOptionError,withWarnings}from"./chunks/chunk-T6243EDS.js";import{getSubcommand}from"./chunks/chunk-ETV3C2CV.js";import{FLAG_ATTRIBUTE_TYPES,FLAG_CONDITION_LIST_COMPARATORS,FLAG_CONDITION_RHS_OPTIONAL_COMPARATORS,FLAG_EVALUATIONS_DIMENSIONS,FLAG_EVALUATIONS_DIMENSION_NAMES,FLAG_EVALUATIONS_GRANULARITIES,alertsInspectSubcommand,alertsListSubcommand,alertsSubcommand,archiveSubcommand,attackModeDisableSubcommand,attackModeEnableSubcommand,attackModeSubcommand,botManagementSubcommand,connectionsAddSubcommand,connectionsListSubcommand,connectionsRemoveSubcommand,connectionsSubcommand,createSubcommand6 as createSubcommand,datafileSubcommand,diffSubcommand,disableSubcommand,discardSubcommand,enableSubcommand2 as enableSubcommand,entitiesCreateSubcommand,entitiesListSubcommand,entitiesRemoveSubcommand,entitiesSubcommand,entitiesUpdateSubcommand,evaluationsSubcommand,feedbackCommand,firewallCommand,flagsCommand,formatFlagAttributeTypeList,formatFlagConditionComparator,formatFlagConditionComparatorList,getCommandAliases,getFlagAttributeType,inspectSubcommand9 as inspectSubcommand,ipBlocksBlockSubcommand,ipBlocksListSubcommand,ipBlocksSubcommand,ipBlocksUnblockSubcommand,isBucketingAttribute,isFlagAttributeType,isFlagEvaluationsDimension,isFlagEvaluationsGranularity,isTimestampAttributeType,labelsListSubcommand,labelsSubcommand,listSubcommand14 as listSubcommand,openSubcommand3 as openSubcommand,overrideSubcommand,overviewSubcommand,persistentActionsInspectSubcommand,persistentActionsListSubcommand,persistentActionsSubcommand,prepareSubcommand,publishSubcommand,removeSubcommand8 as removeSubcommand,rolloutSubcommand,rulesAddSubcommand2 as rulesAddSubcommand,rulesAddSubcommand3 as rulesAddSubcommand2,rulesDisableSubcommand,rulesEditSubcommand2 as rulesEditSubcommand,rulesEnableSubcommand,rulesInspectSubcommand,rulesListSubcommand2 as rulesListSubcommand,rulesListSubcommand3 as rulesListSubcommand2,rulesMoveSubcommand,rulesRemoveSubcommand2 as rulesRemoveSubcommand,rulesRemoveSubcommand3 as rulesRemoveSubcommand2,rulesReorderSubcommand,rulesSubcommand2 as rulesSubcommand,rulesSubcommand3 as rulesSubcommand2,rulesUpdateSubcommand,sdkKeysAddSubcommand,sdkKeysListSubcommand,sdkKeysRemoveSubcommand,sdkKeysSubcommand,segmentsCreateSubcommand,segmentsInspectSubcommand,segmentsListSubcommand,segmentsRemoveSubcommand,segmentsSubcommand,segmentsUpdateSubcommand,setSubcommand2 as setSubcommand,splitSubcommand,staleSubcommand,statusSubcommand,systemBypassAddSubcommand,systemBypassListSubcommand,systemBypassRemoveSubcommand,systemBypassSubcommand,systemMitigationsPauseSubcommand,systemMitigationsResumeSubcommand,systemMitigationsSubcommand,targetingEnableSubcommand,targetingSubcommand,targetsAddSubcommand,targetsListSubcommand,targetsRemoveSubcommand,targetsSubcommand,trafficInspectSubcommand,trafficListSubcommand,trafficSubcommand,unarchiveSubcommand,updateSubcommand5 as updateSubcommand,useTargetingSubcommand,versionsDiffSubcommand,versionsListSubcommand,versionsSubcommand}from"./chunks/chunk-O4WNSKQR.js";import"./chunks/chunk-6I6QJHCY.js";import"./chunks/chunk-EKZTFGDX.js";import"./chunks/chunk-462YCCJZ.js";import"./chunks/chunk-WVHCBDTB.js";import"./chunks/chunk-TAISZMA2.js";import"./chunks/chunk-527GBU3K.js";import"./chunks/chunk-CR3NBTHV.js";import"./chunks/chunk-BVGGTBYE.js";import"./chunks/chunk-6TXEVQA4.js";import"./chunks/chunk-5KUUMQ3M.js";import"./chunks/chunk-UHBMX3OK.js";import"./chunks/chunk-EEUJLJEJ.js";import"./chunks/chunk-NW7WWUCQ.js";import"./chunks/chunk-F6EBOT64.js";import"./chunks/chunk-LFOWP74R.js";import"./chunks/chunk-LOBA3E72.js";import"./chunks/chunk-7R6TRRG5.js";import"./chunks/chunk-JALVF3C2.js";import"./chunks/chunk-OZCQTXI4.js";import"./chunks/chunk-FSPPKNKN.js";import{help}from"./chunks/chunk-FLHO75XC.js";import{table}from"./chunks/chunk-773GOZIR.js";import{printError}from"./chunks/chunk-HSFKISDH.js";import"./chunks/chunk-67GZ5REA.js";import"./chunks/chunk-BS32OUOC.js";import{TelemetryClient}from"./chunks/chunk-6YXIWZ3X.js";import"./chunks/chunk-PUKYAALC.js";import{getScope}from"./chunks/chunk-K5U47EVH.js";import{require_ms}from"./chunks/chunk-MXTC4ZAQ.js";import"./chunks/chunk-NWGBDBZI.js";import{AGENT_REASON,AGENT_STATUS,buildCommandWithGlobalFlags,buildCommandWithYes,clientObservabilityPlanRecovery,getExitCodeForReason,outputAgentError,shouldEmitNonInteractiveCommandError,writeActionRequired,writeAgentError}from"./chunks/chunk-WDXW6A4H.js";import"./chunks/chunk-DKJL2KV7.js";import{getProjectByNameOrId,require_pluralize,ua_default}from"./chunks/chunk-4N6LMERQ.js";import{formatAlignedLabel,printAlignedLabel}from"./chunks/chunk-ADLBLGT3.js";import"./chunks/chunk-CWM2F235.js";import"./chunks/chunk-4NTBYNFR.js";import{parseArguments}from"./chunks/chunk-KCKYPLIH.js";import{quoteArg,teamCache}from"./chunks/chunk-F53OKXYI.js";import{SDK_KEY_PATTERN,getFlagsSpecification,getGlobalFlagsFromArgs,getProjectOptionFromArgs,warnDeprecatedInput,warnDeprecatedOption,warnDeprecatedSubcommand}from"./chunks/chunk-QVXS234E.js";import{fetch,toNodeReadable}from"./chunks/chunk-FUX6LKNP.js";import"./chunks/chunk-OPORM35X.js";import"./chunks/chunk-4SAVH3H7.js";import{ProjectNotFound,isAPIError}from"./chunks/chunk-6VH56CX2.js";import{cmd,getCommandName,getCommandNamePlain,packageName}from"./chunks/chunk-JESNVRVR.js";import{output_manager_default,recordCliError}from"./chunks/chunk-XP3FT56R.js";import"./chunks/chunk-BLUPZPAS.js";import"./chunks/chunk-RM3ZDRYE.js";import{pkg_default}from"./chunks/chunk-OO572JUC.js";import"./chunks/chunk-D3AHZ5LI.js";import"./chunks/chunk-2GHZGOWT.js";import"./chunks/chunk-YHPPP3SF.js";import{require_source}from"./chunks/chunk-NB2WLB3J.js";import"./chunks/chunk-ISWW3DKF.js";import"./chunks/chunk-BRQUZ5NC.js";import{__toESM}from"./chunks/chunk-BZENIQ7N.js";var import_raw_body=__toESM(require_raw_body(),1);var FeedbackTelemetryClient=class extends TelemetryClient{trackCliArgumentNote(note){note!==void 0&&this.trackCliArgument({arg:"note",value:this.redactedValue})}trackCliOptionField(fields){fields?.length&&this.trackCliOption({option:"field",value:this.redactedValue})}};var FEEDBACK_URL="https://vercel.com/api/feedback/cli",MAX_FEEDBACK_BYTES=1024*1024,FETCH_TIMEOUT_MS=1e4;async function feedback(client){let fail=(reason,message,code)=>(recordCliError({code:reason}),output_manager_default.error(message),code),parsed;try{parsed=parseArguments(client.argv.slice(2),getFlagsSpecification(feedbackCommand.options))}catch{return fail(AGENT_REASON.INVALID_ARGUMENTS,"Invalid feedback arguments. Run vercel feedback --help for usage.",2)}let notes=parsed.args.slice(1),fields=parsed.flags["--field"]??[];if(notes.length===0&&fields.length===0)return client.stdout.write(help(feedbackCommand,{columns:client.stderr.columns})),0;if(notes.length>1)return fail(AGENT_REASON.INVALID_ARGUMENTS,"Pass one note. Quote notes containing spaces, or use vercel feedback - to read stdin.",2);let telemetry=new FeedbackTelemetryClient({opts:{store:client.telemetryEventStore}});telemetry.trackCliArgumentNote(notes[0]),telemetry.trackCliOptionField(fields);let data=Object.create(null);for(let field of fields){let separator=field.indexOf("="),key=field.slice(0,separator).trim();if(separator<1||key==="")return fail(AGENT_REASON.INVALID_ARGUMENTS,"Each --field needs a non-empty key followed by =value. Example: vercel feedback --field topic=deploy.",2);data[key]=field.slice(separator+1)}if(notes.length&&Object.hasOwn(data,"note"))return fail(AGENT_REASON.INVALID_ARGUMENTS,"Provide the note once: use a positional note or --field note=..., rather than both.",2);if(notes[0]==="-"){if(client.stdin.isTTY)return fail(AGENT_REASON.INVALID_ARGUMENTS,"No input was piped to stdin. Pipe a note with: cat notes.md | vercel feedback -",2);try{data.note=await readStdinText(client.stdin,MAX_FEEDBACK_BYTES)}catch(error){return error.type==="entity.too.large"?fail(AGENT_REASON.INVALID_ARGUMENTS,"Feedback is too large. Keep the complete submission below 1 MiB.",2):fail(AGENT_REASON.STDIN_ERROR,"Could not read the feedback note from stdin. Check the input pipe and try again.",1)}}else notes[0]!==void 0&&(data.note=notes[0]);for(let key of Object.keys(data))data[key].trim()||delete data[key];if(!Object.keys(data).length)return fail(AGENT_REASON.INVALID_ARGUMENTS,"Provide a note or at least one named field. Run vercel feedback --help for examples.",2);let canSendTelemetry=client.telemetryEventStore?.enabled??!1,body=JSON.stringify({metadata:canSendTelemetry?{agent:client.isAgent,agent_name:client.isAgent?client.agentName:void 0,cli_version:pkg_default.version,operating_system:process.platform,team_id:client.config.currentTeam??null,user_id:client.authConfig.userId??null,invocation_id:client.telemetryEventStore?.currentInvocationId??null,session_id:client.telemetryEventStore?.currentSessionId??null}:null,data});if(Buffer.byteLength(body)>MAX_FEEDBACK_BYTES)return fail(AGENT_REASON.INVALID_ARGUMENTS,"Feedback is too large. Keep the complete submission below 1 MiB.",2);let controller=new AbortController,timeout=setTimeout(()=>controller.abort(),FETCH_TIMEOUT_MS);timeout.unref?.();try{let response=await fetch(FEEDBACK_URL,{method:"POST",headers:{"content-type":"application/json","user-agent":ua_default},body,redirect:"manual",signal:controller.signal});if(!response.ok)return await response.body?.cancel(),fail(response.status===429?AGENT_REASON.RATE_LIMITED:AGENT_REASON.API_ERROR,`Feedback could not be submitted (HTTP ${response.status}). Try again later.`,1);let responseBody=toNodeReadable(response.body);return JSON.parse(await(0,import_raw_body.default)(responseBody,{limit:64*1024,encoding:"utf8"}).finally(()=>responseBody.destroy()))?.success!==!0?fail(AGENT_REASON.UNKNOWN_OUTCOME,"Could not confirm that Vercel accepted the feedback. It may have been submitted; no automatic retry was made.",1):(client.stdout.write(`Feedback sent
|
|
8
8
|
`),0)}catch{return fail(AGENT_REASON.UNKNOWN_OUTCOME,"Could not confirm that Vercel accepted the feedback. Check your connection. It may have been submitted; no automatic retry was made.",1)}finally{clearTimeout(timeout)}}var import_chalk6=__toESM(require_source(),1);var import_chalk2=__toESM(require_source(),1);var import_chalk=__toESM(require_source(),1);var ACTION_COLORS={allow:import_chalk.default.blue,deny:import_chalk.default.red,challenge:import_chalk.default.yellow,log:import_chalk.default.magenta,rate_limit:import_chalk.default.cyan,"rate-limit":import_chalk.default.cyan,bypass:import_chalk.default.green};function labelForAction(action){return action==="rate_limit"||action==="rate-limit"?"Rate Limited":action.split(/[-_]/).filter(Boolean).map(word=>word.charAt(0).toUpperCase()+word.slice(1)).join(" ")}var MONTHS=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];function formatCount(n){return n>=1e6?`${(n/1e6).toFixed(1)}M`:n>=1e3?`${(n/1e3).toFixed(1)}k`:String(Math.round(n))}function pad2(n){return String(n).padStart(2,"0")}function formatUtcTime(ms8,withDate){let d=new Date(ms8),hm=`${pad2(d.getUTCHours())}:${pad2(d.getUTCMinutes())}`;return withDate?`${MONTHS[d.getUTCMonth()]} ${d.getUTCDate()} ${hm}`:hm}function relativeTime(ts){let diff2=Date.now()-ts;return diff2<6e4?"just now":diff2<36e5?`${Math.floor(diff2/6e4)}m ago`:diff2<864e5?`${Math.floor(diff2/36e5)}h ago`:`${Math.floor(diff2/864e5)}d ago`}function formatUtcDateTime(ms8){return`${formatUtcTime(ms8,!0)} UTC (${relativeTime(ms8)})`}function colorizeDetail(detail){return detail.split(" \xB7 ").map(part=>{let color=ACTION_COLORS[part.toLowerCase().replace(/ /g,"_")];return color?color(part):part}).join(" \xB7 ")}function windowNeedsDate(startMs,endMs){return endMs-startMs>25*36e5}function granularityLabel(granularity){return"minutes"in granularity?`${granularity.minutes}m`:"hours"in granularity?`${granularity.hours}h`:`${granularity.days}d`}function formatActionTrendTable(series){let allTs=new Set;for(let s of series)for(let p of s.timeseries)allTs.add(p.timestamp);let axis=[...allTs].sort(),hasAnyTraffic=series.some(s=>s.total>0||s.timeseries.some(p=>p.value>0));if(series.length===0||axis.length===0||!hasAnyTraffic)return import_chalk.default.dim(" No request data for this period.");let startMs=new Date(axis[0]).getTime(),endMs=new Date(axis[axis.length-1]).getTime(),needsDate=windowNeedsDate(startMs,endMs),rows=[["Action","Trend","Total","Peak","Peak at"].map(h=>import_chalk.default.bold(import_chalk.default.cyan(h)))];for(let s of series){let byTs=new Map(s.timeseries.map(p=>[p.timestamp,p.value])),values=axis.map(t=>byTs.get(t)??0),peak=0,peakTs="";for(let i=0;i<axis.length;i++)values[i]>peak&&(peak=values[i],peakTs=axis[i]);let plain=x=>x,color=s.total>0?ACTION_COLORS[s.action]??plain:import_chalk.default.dim,trend=s.total>0?plain:import_chalk.default.dim;rows.push([color(labelForAction(s.action)),trend(generateSparkline(values)),formatCount(s.total),peak>0?formatCount(peak):"--",peak>0?formatUtcTime(new Date(peakTs).getTime(),needsDate):"--"])}return table(rows,{align:["l","l","r","r","r"],hsep:3}).split(`
|
|
9
9
|
`).map(line2=>` ${line2}`.trimEnd()).join(`
|
|
10
10
|
`)}var NO_SERVER_MESSAGE="Response Error";function apiServerMessage(error){let message=isAPIError(error)?error.serverMessage:void 0;return message&&message!==NO_SERVER_MESSAGE?message:void 0}var FIREWALL_O11Y_ALERT_TYPES=["botId_anomaly","firewallSystemRule_anomaly","firewallCustomRule_anomaly"],FIREWALL_ANOMALY_TYPE="firewall_anomaly",SYS_DOS_MITIGATION_RULE_ID="sys_dos_mitigation",SYSTEM_RULE_ANOMALY_TYPE="firewallSystemRule_anomaly",FIREWALL_ACTIVITY_PLAN_MESSAGE="Traffic and alerts need Observability Plus.",FIREWALL_ALERTS_PARTIAL_ERROR_MESSAGE="Couldn't load every alert source.";function reduceAttackAnomaly(anomaly){return Object.keys(anomaly.affectedHostMap).reduce((acc,host)=>{acc.hosts.push(host);let challenged=anomaly.affectedHostMap[host].ddosAlerts?.["sys_dos_mitigation:challenge"]?.totalReqs||0,denied=anomaly.affectedHostMap[host].ddosAlerts?.["sys_dos_mitigation:deny"]?.totalReqs||0;return acc.challenged+=challenged,acc.denied+=denied,acc.count+=challenged+denied,acc},{hosts:[],challenged:0,denied:0,count:0})}function hostsFromAnomaly(anomaly){return Object.entries(anomaly.affectedHostMap).map(([host,data])=>{let challenged=data.ddosAlerts?.["sys_dos_mitigation:challenge"]?.totalReqs||0,denied=data.ddosAlerts?.["sys_dos_mitigation:deny"]?.totalReqs||0;return{name:host,count:challenged+denied}}).filter(row=>row.count>0).sort((a,b)=>b.count-a.count)}function mapAttackAnomaly(anomaly){let reduced=reduceAttackAnomaly(anomaly),parts=["System rule"];return reduced.denied>0&&parts.push(labelForAction("deny")),reduced.challenged>0&&parts.push(labelForAction("challenge")),{id:`${anomaly.ownerId}-${anomaly.projectId}-${anomaly.startTime}`,title:"DDoS Mitigation",type:FIREWALL_ANOMALY_TYPE,startedAt:anomaly.startTime,resolvedAt:anomaly.endTime||void 0,count:reduced.count,detail:parts.join(" \xB7 "),action:reduced.denied>=reduced.challenged?"deny":"challenge",ruleId:SYS_DOS_MITIGATION_RULE_ID,host:reduced.hosts[0]}}function mapO11yAlert(alert){if(!alert.startedAt)return null;let action=alert.data?.action,ruleId=alert.data?.ruleId,detailParts=[alert.type,action?labelForAction(action):void 0,ruleId].filter(Boolean);return{id:alert.id||`${alert.type}-${alert.startedAt}`,title:alert.title||alert.type||"Firewall alert",type:alert.type||"unknown",startedAt:alert.startedAt,resolvedAt:alert.resolvedAt,count:alert.data?.count,detail:detailParts.filter(p=>p!==alert.title).join(" \xB7 ")||void 0,action,ruleId,path:alert.data?.path}}var ATTACK_STATUS_MAX_DAYS=7;async function getAttackStatus(client,opts){let query=new URLSearchParams;if(query.set("projectId",opts.projectId),query.set("teamId",opts.teamId),opts.sinceDays!==void 0){let sinceDays=Math.min(ATTACK_STATUS_MAX_DAYS,Math.max(1,Math.ceil(opts.sinceDays)));query.set("since",String(sinceDays))}return client.fetch(`/v1/security/firewall/attack-status?${query.toString()}`,{accountId:opts.teamId,signal:opts.signal})}var O11Y_ALERTS_LIMIT=200;async function getFirewallO11yAlerts(client,opts){let query=new URLSearchParams;query.set("teamId",opts.teamId),query.set("projectId",opts.projectId),query.set("from",opts.from.toISOString()),query.set("to",opts.to.toISOString()),query.set("limit",String(O11Y_ALERTS_LIMIT));for(let type of FIREWALL_O11Y_ALERT_TYPES)query.append("types",type);return(await client.fetch(`/alerts/v3/groups?${query.toString()}`,{accountId:opts.teamId,signal:opts.signal})).flatMap(g=>g.alerts??[]).map(mapO11yAlert).filter(a=>a!==null)}var ALERTS_TIMEOUT_MS=2e4;function sourceFailureReason(err){return isAPIError(err)&&err.status===408||err instanceof Error&&(err.name==="TimeoutError"||err.name==="AbortError")?"timed out":isAPIError(err)&&err.status===402?"needs Observability Plus":isAPIError(err)&&typeof err.status=="number"?`HTTP ${err.status}`:err instanceof Error&&err.message?err.message:"unknown error"}function resolveAlertsWindow(opts){let now=Date.now(),to=opts.to??new Date(now),from=opts.from??new Date(to.getTime()-864e5*(opts.sinceDays??1)),sinceDays=opts.sinceDays??Math.max(1,Math.ceil((now-from.getTime())/864e5));return{from,to,sinceDays}}function classifyAlertSourceError(err){if(isAPIError(err)&&(err.status===401||err.status===403))throw err;return isAPIError(err)&&err.status===402?{reason:"plan",message:FIREWALL_ACTIVITY_PLAN_MESSAGE}:{reason:"error",message:apiServerMessage(err)||!isAPIError(err)&&err instanceof Error&&err.message||FIREWALL_ALERTS_PARTIAL_ERROR_MESSAGE}}async function getFirewallAlertsDetailed(client,opts){let{from,to,sinceDays}=resolveAlertsWindow(opts),timeoutMs=opts.timeoutMs??ALERTS_TIMEOUT_MS,signal=AbortSignal.timeout(timeoutMs),[o11yResult,attackResult]=await Promise.allSettled([getFirewallO11yAlerts(client,{...opts,from,to,signal}),getAttackStatus(client,{...opts,sinceDays,signal})]),errors=[],o11yAlerts=[],o11y;o11yResult.status==="fulfilled"?o11yAlerts=o11yResult.value:(o11y=classifyAlertSourceError(o11yResult.reason),errors.push({source:"alerts",message:sourceFailureReason(o11yResult.reason)}));let mappedAttacks=[],attackStatus;attackResult.status==="fulfilled"?mappedAttacks=(attackResult.value.anomalies||[]).map(mapAttackAnomaly):(attackStatus=classifyAlertSourceError(attackResult.reason),errors.push({source:"attackStatus",message:sourceFailureReason(attackResult.reason)}));let resolvedCutoff=from.getTime();return{alerts:mappedAttacks.concat(o11yAlerts.filter(a=>!a.resolvedAt||a.resolvedAt>resolvedCutoff)).sort((a,b)=>!a.resolvedAt&&b.resolvedAt?-1:a.resolvedAt&&!b.resolvedAt?1:b.startedAt-a.startedAt),o11y,attackStatus,errors}}function alertsIncompleteMessage(errors){return`Attack count and alerts may be incomplete: ${errors.map(e=>`${e.source==="alerts"?"alerts":"attack history"} ${e.message}`).join("; ")}.`}function countAttacksMitigated(alerts,windowStartMs,windowEndMs){return alerts.filter(alert=>isAttackAlert(alert)&&alertOverlapsWindow(alert,windowStartMs,windowEndMs)).length}function alertOverlapsWindow(alert,windowStartMs,windowEndMs){return alert.startedAt<=windowEndMs&&(alert.resolvedAt??Number.POSITIVE_INFINITY)>=windowStartMs}function isAttackAlert(alert){return alert.type===FIREWALL_ANOMALY_TYPE?!0:alert.type===SYSTEM_RULE_ANOMALY_TYPE&&alert.ruleId===SYS_DOS_MITIGATION_RULE_ID}var O11Y_ALERT_ID_PREFIX="al_",INSPECT_FALLBACK_DAYS=7;function isO11yAlertId(id){return id.startsWith(O11Y_ALERT_ID_PREFIX)}function parseLegacyAlertStartTime(id){let match=id.match(/-(\d{13})$/);return match?Number(match[1]):void 0}function daysCovering(startMs,endMs){return Math.max(1,Math.ceil((endMs-startMs)/864e5))}function mapGroupAsAlert(group,alertId){let nested=(group.alerts??[]).map(mapO11yAlert).filter(a=>a!==null),hit=nested.find(a=>a.id===alertId)??nested[0];if(hit)return hit;let startedAt=group.recordedStartedAt;return startedAt?mapO11yAlert({id:alertId,title:group.title,type:group.type,startedAt,resolvedAt:group.recordedResolvedAt,data:group.alerts?.[0]?.data}):null}async function getO11yAlertById(client,opts){let query=new URLSearchParams;query.set("teamId",opts.teamId),query.set("projectId",opts.projectId);try{let group=await client.fetch(`/alerts/v3/groups/${encodeURIComponent(opts.alertId)}?${query.toString()}`,{accountId:opts.teamId,signal:opts.signal});return mapGroupAsAlert(group,opts.alertId)}catch(err){if(isAPIError(err)&&err.status===404)return null;throw err}}async function findFirewallAlert(client,opts){let timeoutMs=opts.timeoutMs??ALERTS_TIMEOUT_MS,budget=()=>AbortSignal.timeout(timeoutMs),now=Date.now();if(isO11yAlertId(opts.alertId)){let fromGroup2=await getO11yAlertById(client,{...opts,signal:budget()});if(fromGroup2)return{alert:fromGroup2};let from=new Date(now-864e5*INSPECT_FALLBACK_DAYS),hit=(await getFirewallO11yAlerts(client,{projectId:opts.projectId,teamId:opts.teamId,from,to:new Date(now),signal:budget()})).find(a=>a.id===opts.alertId);return hit?{alert:hit}:null}let startTime=parseLegacyAlertStartTime(opts.alertId),sinceDays=startTime?daysCovering(startTime,now)+1:INSPECT_FALLBACK_DAYS,anomaly=((await getAttackStatus(client,{projectId:opts.projectId,teamId:opts.teamId,sinceDays,signal:budget()}).catch(err=>{if(isAPIError(err)&&(err.status===401||err.status===403))throw err;return{anomalies:[]}})).anomalies||[]).find(a=>`${a.ownerId}-${a.projectId}-${a.startTime}`===opts.alertId);if(anomaly)return{alert:mapAttackAnomaly(anomaly),hosts:hostsFromAnomaly(anomaly)};let fromGroup=await getO11yAlertById(client,{...opts,signal:budget()}).catch(err=>{if(isAPIError(err)&&(err.status===401||err.status===403))throw err;return null});return fromGroup?{alert:fromGroup}:null}var MANAGED_BOT_RULE_IDS=["bot-protection","ai-bots","bot-id"],ALIASES={"bot-protection":"bot-protection","bot protection":"bot-protection",bot_protection:"bot-protection",bot_filter:"bot-protection",managed_bot_protection:"bot-protection",managed_bot_filter:"bot-protection","ai-bots":"ai-bots","ai bots":"ai-bots",ai_bots:"ai-bots",managed_ai_bots:"ai-bots","bot-id":"bot-id",botid:"bot-id",bot_id:"bot-id"},ACTIONS={"bot-protection":["off","log","challenge"],"ai-bots":["allow","log","challenge","deny"],"bot-id":["basic","deep-analysis"]},NAMES={"bot-protection":"Bot Protection","ai-bots":"AI Bots","bot-id":"BotID"},WAF_RULE_IDS={"bot-protection":"managed_bot_protection","ai-bots":"managed_ai_bots"};function resolveManagedBotRuleId(identifier){if(identifier)return ALIASES[identifier.trim().toLowerCase()]}function managedBotActions(id){return ACTIONS[id]}function formatManagedBotAction(action){return action==="deep-analysis"?"Deep Analysis":action.charAt(0).toUpperCase()+action.slice(1)}function botProtectionConfig(managedRules){return managedRules?.bot_filter??managedRules?.bot_protection}function currentBotProtectionAction(config){let ruleset=botProtectionConfig(config?.managedRules);return ruleset?.active?ruleset.action==="log"?"log":"challenge":"off"}function currentAiBotsAction(config){let ruleset=config?.managedRules?.ai_bots;return ruleset?.active?ruleset.action==="challenge"?"challenge":ruleset.action==="deny"?"deny":"log":"allow"}function currentBotIdAction(config){return config?.botIdEnabled?"deep-analysis":"basic"}function getManagedBotRule(config,id){let action=id==="bot-protection"?currentBotProtectionAction(config):id==="ai-bots"?currentAiBotsAction(config):currentBotIdAction(config);return{id,name:NAMES[id],action,wafRuleId:WAF_RULE_IDS[id]}}function getManagedBotRules(config){return MANAGED_BOT_RULE_IDS.map(id=>getManagedBotRule(config,id))}function parseManagedBotAction(id,raw){let action=raw.trim().toLowerCase().replace(/\s+/g,"-"),valid=ACTIONS[id];return valid.includes(action)?{action}:{error:`Invalid action "${raw}" for ${NAMES[id]}. Use ${valid.join(", ")}.`}}function buildManagedBotPatch(id,action){if(id==="bot-id")return{action:"botId.toggle",value:action==="deep-analysis"};let patchId=id==="bot-protection"?"bot_protection":"ai_bots";return action==="off"||action==="allow"?{action:"managedRules.update",id:patchId,value:{active:!1}}:{action:"managedRules.update",id:patchId,value:{active:!0,action}}}function suggestedManagedBotAction(rule){return rule.id==="bot-protection"?rule.action==="challenge"?"log":"challenge":rule.id==="ai-bots"?rule.action==="deny"?"allow":"deny":rule.action==="deep-analysis"?"basic":"deep-analysis"}function managedBotTrafficWarning(id,from,to){if(id==="ai-bots"&&to==="deny")return"AI Bots deny blocks known AI crawlers from this project.";if(id==="bot-protection"&&from==="off"&&to==="challenge")return"Bot Protection challenge will present a verification page to non-browser traffic."}function managedBotJson(rule){return{id:rule.id,name:rule.name,action:rule.action,wafRuleId:rule.wafRuleId??null}}function projectScope(project,teamId,teamSlug){return{type:"project",projectId:project.id,teamId,...teamSlug?{teamSlug}:{},displayName:project.name}}function firewallConfigUrl(scope,path=""){let query=new URLSearchParams;return scope.type==="project"?(query.set("projectId",scope.projectId),scope.teamId&&query.set("teamId",scope.teamId),`/v1/security/firewall/config${path}?${query.toString()}`):(query.set("teamId",scope.teamId),`/v1/security/firewall/team-config${path}?${query.toString()}`)}async function listFirewallConfigs(client,scope){return client.fetch(firewallConfigUrl(scope))}async function activateFirewallConfig(client,scope,configVersion){return client.fetch(firewallConfigUrl(scope,`/${configVersion}/activate`),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({})})}var PRIORITY_PROJECT_ENABLE_COMMAND="project priority enable",BUY_PRO_COMMAND="buy pro";function withGlobalFlags(client,commandTemplate,scope,options={}){let template=scope?.type==="team"?`${commandTemplate} --team-level`:commandTemplate;return buildCommandWithGlobalFlags(client.argv,template,void 0,{globalFlags:"all",preserveProject:options.preserveProject??!0,excludeFlags:options.excludeFlags})}async function resolveFirewallScope(client,flags){if(flags["--team-level"]&&flags["--project"]){let message="Cannot specify both --team-level and --project. Use one or the other.";return client.nonInteractive?(outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message},2),2):(output_manager_default.error(message),2)}if(flags["--team-level"]){let{team}=await getScope(client);if(!team){let message="Team-level firewall requires a team scope. Personal accounts are not supported. Run `vercel switch` to select a team or pass --scope <team>.";return client.nonInteractive?(outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.MISSING_SCOPE,message},1),1):(output_manager_default.error(message),1)}return{type:"team",teamId:team.id,displayName:team.slug}}let link=await requireProjectContext(client,"firewall",flags["--project"]);if(typeof link=="number")return link;let{project,org}=link;return{type:"project",projectId:project.id,teamId:org.type==="team"?org.id:void 0,teamSlug:org.type==="team"?org.slug:void 0,displayName:project.name}}function mentionsPriorityProject(message){return/priority\s+project/i.test(message)||/priority\s+tier/i.test(message)}function teamPlan(scope){return scope.teamId?teamCache.get(scope.teamId)?.billing?.plan:void 0}function priorityTeam(scope){let cached=scope.teamId?teamCache.get(scope.teamId):void 0;if(scope.type==="team")return{id:scope.teamId,slug:scope.displayName,name:cached?.name??null,scopeArg:scope.displayName};if(!scope.teamId)return null;let slug=scope.teamSlug??cached?.slug??null;return{id:scope.teamId,slug,name:cached?.name??null,scopeArg:slug??scope.teamId}}function teamLabel(team){return team.name&&team.name!==team.slug?`${team.slug} (${team.name})`:team.slug}function styledCommand(command,plain){return plain?getCommandNamePlain(command):getCommandName(command)}function priorityProjectFix(scope){let excludeFlags=["--non-interactive","--project","--yes","--scope","--team"],project=scope.type==="project"?{id:scope.projectId,name:scope.displayName}:null,team=priorityTeam(scope),plan=teamPlan(scope)??null,data={project,team:team&&{id:team.id,slug:team.slug,name:team.name},plan},projectToken=project?quoteArg(project.name):"<project>",scopeFlag=team?` --scope ${quoteArg(team.scopeArg)}`:"",enable4=`${PRIORITY_PROJECT_ENABLE_COMMAND} ${projectToken}${scopeFlag}`;if(!team){let hint="Priority projects are only available on team accounts. Use --scope to specify one.";return{command:"",hint,plainHint:hint,when:hint,excludeFlags,preserveProject:!1,reason:AGENT_REASON.MISSING_SCOPE,data}}if(plan==="hobby"||plan==="oss"){let upgrade=`${BUY_PRO_COMMAND}${scopeFlag}`,hint=plain2=>`Priority Projects are only available on Pro or Enterprise team plans. Upgrade with ${styledCommand(upgrade,plain2)}, then run ${styledCommand(enable4,plain2)}.`;return{command:upgrade,hint:hint(!1),plainHint:hint(!0),when:"a person has approved upgrading the plan",excludeFlags,preserveProject:!1,reason:AGENT_REASON.PLAN_UPGRADE_REQUIRED,scope:team.scopeArg,data}}let shown=styledCommand(enable4,!1),plain=styledCommand(enable4,!0),placeholder="Replace <project> with a project on this team.";return{command:enable4,hint:project?shown:`${shown} ${placeholder}`,plainHint:project?plain:`${plain} ${placeholder}`,when:project?"user runs this command in an interactive terminal":"Replace <project> with a project on this team.",excludeFlags,preserveProject:!1,reason:AGENT_REASON.PLAN_UPGRADE_REQUIRED,scope:team.scopeArg,data}}function mapFirewallApiError(e,scope,fallback){let err=e;return scope.type==="team"&&err.status===403?err.code==="plan_not_supported"?`Team-level firewall requires an Enterprise plan (current team: "${scope.displayName}"). Pass --scope <team> or run \`vercel switch\` to target a different team.`:`You need to be a team owner to manage the team-level firewall for "${scope.displayName}".${err.message?` (${err.message})`:""}`:err.message||fallback}function priorityProjectMessage(scope,fix){let team=fix.data.team,label=team?.slug!=null?teamLabel({slug:team.slug,name:team.name}):void 0;return scope.type==="project"?label?`This rule requires a Priority project for ${scope.displayName} on team ${label}.`:`This rule requires a Priority project. ${fix.hint}`:label?`This rule requires a Priority project on team ${label}.`:"This rule requires a Priority project."}function failPriorityProjectGate(client,error,scope,opts){let serverMessage=apiServerMessage(error);if(!serverMessage||!mentionsPriorityProject(serverMessage))return null;let fix=priorityProjectFix(scope),message=priorityProjectMessage(scope,fix),payload={status:AGENT_STATUS.ERROR,reason:fix.reason,message,userActionRequired:!0,hint:fix.plainHint,retryable:!1,...fix.scope?{scope:fix.scope}:{},data:fix.data,...fix.command?{next:[{command:buildCommandWithGlobalFlags(client.argv,fix.command,packageName,{globalFlags:"all",preserveProject:!1,excludeFlags:fix.excludeFlags}),when:fix.when}]}:{}};return shouldEmitNonInteractiveCommandError(client)&&outputAgentError(client,payload,1),opts?.json?(output_manager_default.stopSpinner(),writeAgentError(client,payload),1):(output_manager_default.error(message),fix.command&&output_manager_default.log(fix.hint),1)}function getRulePayload(flags){let legacy=flags["--json"];return legacy!==void 0&&flags["--data"]!==void 0?(output_manager_default.error("Can't use --data with --json."),2):(legacy!==void 0&&output_manager_default.warning("--json is deprecated for rule payloads. Use --data."),flags["--data"]??legacy)}async function parseSubcommandArgs(argv,command,client,commandPath){let parsedArgs,fullPath=commandPath||command.name;try{parsedArgs=parseSubcommandArguments(argv,command)}catch(err){if(client?.nonInteractive){let rawMessage=err instanceof Error?err.message:String(err),flags=getGlobalFlagsFromArgs(client.argv.slice(2),{preserveProject:!0});return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message:rawMessage,next:[{command:getCommandNamePlain(`firewall ${fullPath} ${flags.join(" ")}`.trim()),when:"fix flags and retry"}]},2),2}return printError(err),2}return parsedArgs}async function confirmAction(client,skipConfirmation,message,details){return skipConfirmation?!0:client.nonInteractive||!client.stdin.isTTY?(outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.CONFIRMATION_REQUIRED,message:`${message} Re-run with --yes to confirm.`,next:[{command:buildCommandWithYes(client.argv),when:"re-run with --yes to confirm"}]}),process.exit(1),!1):(details&&output_manager_default.print(` ${details}
|
|
@@ -181,12 +181,12 @@ ${formatPersistentActionsList({actions:shown,total:actions.length,summary,from,t
|
|
|
181
181
|
`),0)}catch(e){return isAPIError(e)&&e.status===402?failFirewallObservabilityPlan(client,e,project.name):failFirewallApi(client,e,{fallback:"Failed to fetch persistent firewall actions",nextCommand:suggestedCommand,permissionAction:"read firewall persistent actions",projectName:project.name,timeoutJob:"firewall persistent actions"})}}var import_chalk38=__toESM(require_source(),1);import{isIP as isIP3}from"node:net";var TOP_PATHS=8,MIN_TRAFFIC_WINDOW_MS=6e4;function isActivityUnavailable3(error){return isAPIError(error)&&error.status===402}function inspectGranularity(from,to){let hours=(to.getTime()-from.getTime())/36e5;return hours<=3?{minutes:1}:hours<=24?{minutes:5}:{hours:1}}function matchesInspectFilters(action,opts){return!(action.public_ip!==opts.ip||opts.host&&action.host!==opts.host||opts.action&&action.action!==opts.action)}async function inspect3(client,argv){let startedAt=Date.now(),parsed=await parseSubcommandArgs(argv,persistentActionsInspectSubcommand,client,"persistent-actions inspect");if(typeof parsed=="number")return parsed;let ip=parsed.args[0];if(!ip)return failFirewall(client,{message:`IP is required. Usage: ${withGlobalFlags(client,"firewall persistent-actions inspect <ip>")}`,nextCommand:"firewall persistent-actions inspect <ip>",reason:AGENT_REASON.MISSING_ARGUMENTS});if(!isIP3(ip))return failFirewall(client,{message:"Please enter a valid IP address.",reason:AGENT_REASON.INVALID_ARGUMENTS});let sinceResult=validateTimeBound(parsed.flags["--since"]);if(!sinceResult.valid)return failFirewall(client,{message:sinceResult.message,reason:AGENT_REASON.INVALID_ARGUMENTS});let untilResult=validateTimeBound(parsed.flags["--until"]);if(!untilResult.valid)return failFirewall(client,{message:untilResult.message,reason:AGENT_REASON.INVALID_ARGUMENTS});let order=validateTimeOrder(sinceResult.value,untilResult.value);if(!order.valid)return failFirewall(client,{message:order.message,reason:AGENT_REASON.INVALID_ARGUMENTS});let requested=persistentActionWindow(sinceResult.value,untilResult.value),host=parsed.flags["--host"],actionFilter=parsed.flags["--action"],link=await requireProjectContext(client,"firewall",parsed.flags["--project"]);if(typeof link=="number")return link;let{project,org}=link,teamId=org.type==="team"?org.id:void 0;if(!teamId)return failFirewall(client,{message:"Firewall persistent actions need a team. Run `vercel switch` to select a team or pass --scope <team>.",reason:AGENT_REASON.MISSING_SCOPE});let asJson=!!parsed.flags["--json"],suggestedCommand=`firewall persistent-actions inspect ${ip}${asJson?" --json":""}`,{isEnterprise,known}=await fetchPlanInfo(client),window=clampPersistentActionWindow({...requested,isEnterprise,planKnown:known,now:startedAt}),{from,to}=window;if(window.empty)return failFirewall(client,{message:`This plan keeps ${retentionLabel(isEnterprise)} of persistent-action history, and the requested window is entirely older than that. Narrow it with --since and --until.`,reason:AGENT_REASON.INVALID_ARGUMENTS});output_manager_default.spinner(`Fetching persistent action ${import_chalk38.default.bold(ip)}`);try{let matches=(await fetchFirewallPersistentActions(client,{projectId:project.id,teamId,startTime:from,endTime:to,host})).filter(action=>matchesInspectFilters(action,{ip,host,action:actionFilter})),selected=matches[0];if(!selected)return failFirewall(client,{message:`No persistent action found for "${ip}". Run ${withGlobalFlags(client,"firewall persistent-actions list")} to view recent actions.`,nextCommand:"firewall persistent-actions list",reason:AGENT_REASON.NOT_FOUND});output_manager_default.spinner(`Fetching traffic for ${import_chalk38.default.bold(ip)}`);let requestedStart=new Date(apiTimestampMs(selected.startTime)),requestedEnd=new Date(Math.max(Math.min(apiTimestampMs(selected.endTime),Date.now()),requestedStart.getTime()+MIN_TRAFFIC_WINDOW_MS)),wantPaths=!!parsed.flags["--paths"],filter=persistentActionFilter({ip:selected.public_ip,host:selected.host}),pathsFilter=persistentActionFilter({ip:selected.public_ip,host:selected.host,withPath:!0}),scopable=!isRedacted(selected.public_ip),granularity=inspectGranularity(requestedStart,requestedEnd),{startTime:actionStart,endTime:actionEnd}=alignQueryWindow(requestedStart,requestedEnd,granularity),[metrics,paths]=await Promise.all([scopable?getFirewallMetrics(client,{projectId:project.id,ownerId:teamId,startTime:actionStart,endTime:actionEnd,granularity,filter}).catch(err=>{if(isActivityUnavailable3(err))return null;throw err}):Promise.resolve(null),wantPaths&&scopable?getTopList(client,{projectId:project.id,ownerId:teamId,startTime:actionStart,endTime:actionEnd,groupBy:[PATH_DIMENSION],filter:pathsFilter,top:TOP_PATHS}).catch(err=>{if(isActivityUnavailable3(err))return null;throw err}):Promise.resolve(null)]),pathRows=paths?.map(row=>({name:row.values[PATH_DIMENSION]||"/",count:row.total}));return asJson?(outputJson(client,{action:toPersistentAction(selected),matchCount:matches.length,series:metrics?.series??null,...wantPaths?{paths:pathRows??null}:{},...metrics?{}:{activityUnavailable:{reason:"plan",message:FIREWALL_ACTIVITY_PLAN_MESSAGE}}}),0):(output_manager_default.print(`
|
|
182
182
|
${formatPersistentActionInspect({action:selected,matchCount:matches.length,series:metrics?.series,paths:pathRows,pathsAvailable:!wantPaths})}`),metrics||output_manager_default.print(` ${FIREWALL_ACTIVITY_PLAN_MESSAGE}
|
|
183
183
|
`),output_manager_default.print(`
|
|
184
|
-
`),0)}catch(e){return isActivityUnavailable3(e)?failFirewallObservabilityPlan(client,e,project.name):failFirewallApi(client,e,{fallback:"Failed to fetch persistent firewall action",nextCommand:suggestedCommand,permissionAction:"read firewall persistent actions",projectName:project.name,timeoutJob:"firewall persistent action"})}}var COMMAND_CONFIG7={list:getCommandAliases(persistentActionsListSubcommand),inspect:getCommandAliases(persistentActionsInspectSubcommand)};async function main7(client,args,telemetry){let flagsSpecification=getFlagsSpecification(persistentActionsSubcommand.options),parsedArgs;try{parsedArgs=parseArguments(args,flagsSpecification,{permissive:!0})}catch(err){return printError(err),2}let{subcommand,args:subArgs,subcommandOriginal}=getSubcommand(parsedArgs.args,COMMAND_CONFIG7),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry.trackCliFlagHelp("firewall","persistent-actions"),output_manager_default.print(help(persistentActionsSubcommand,{parent:firewallCommand,columns:client.stderr.columns})),0;function printHelp(command){output_manager_default.print(help(command,{parent:firewallCommand,columns:client.stderr.columns}))}switch(subcommand){case"list":return needHelp?(telemetry.trackCliFlagHelp("firewall",`persistent-actions:${subcommandOriginal}`),printHelp(persistentActionsListSubcommand),0):(telemetry.trackCliSubcommandPersistentActionsList(subcommandOriginal),list5(client,subArgs));case"inspect":return needHelp?(telemetry.trackCliFlagHelp("firewall",`persistent-actions:${subcommandOriginal}`),printHelp(persistentActionsInspectSubcommand),0):(telemetry.trackCliSubcommandPersistentActionsInspect(subcommandOriginal),inspect3(client,subArgs));default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG7)),output_manager_default.print(help(persistentActionsSubcommand,{parent:firewallCommand,columns:client.stderr.columns})),2}}var import_chalk39=__toESM(require_source(),1);var DEFAULT_TRAFFIC_WINDOW_MS=24*60*60*1e3;function requireTrafficTeam(client,org,what){return org.type==="team"?org.id:failFirewall(client,{message:`${what} needs a team. Run \`vercel switch\` to select a team or pass --scope <team>.`,reason:AGENT_REASON.MISSING_SCOPE})}function resolveTrafficWindow(since,until,scope){let sinceResult=validateTimeBound(since);if(!sinceResult.valid)return{valid:!1,message:sinceResult.message};let untilResult=validateTimeBound(until);if(!untilResult.valid)return{valid:!1,message:untilResult.message};let order=validateTimeOrder(sinceResult.value,untilResult.value);if(!order.valid)return{valid:!1,message:order.message};if(!sinceResult.value&&!untilResult.value&&scope)return{valid:!0,startTime:scope.startTime,endTime:scope.endTime};let endTime=untilResult.value??new Date,startTime=sinceResult.value??scope?.startTime??new Date(endTime.getTime()-DEFAULT_TRAFFIC_WINDOW_MS);return startTime.getTime()>endTime.getTime()?{valid:!1,message:sinceResult.value?"`--since` is in the future. Pass a past time, such as `24h` or an earlier date.":"The alert began after `--until`. Widen the window with `--since`, or drop `--until`."}:{valid:!0,startTime,endTime}}function buildTrafficFilter(flags){let parts=[];for(let dimension of TRAFFIC_DIMENSIONS){let value=flags[`--${dimension.alias}`];typeof value=="string"&&value.length>0&&parts.push(eqFilter(dimension.field,value))}let raw=flags["--filter"],rawExpressions=[];if(Array.isArray(raw))for(let expression of raw)typeof expression=="string"&&expression.length>0&&(rawExpressions.push(expression),parts.push(expression));return usesODataSyntax(rawExpressions)&&output_manager_default.warn(FILTER_DEPRECATION_WARNING),andFilters(...parts)}function unknownDimensionMessage(flag,value){return`Unknown ${flag} "${value}". Dimensions: ${dimensionAliases().join(", ")}.`}var WAF_ONLY_ALIASES=new Set(["action","rule"]);function hasStringFlag(flags,flag){let value=flags[flag];return typeof value=="string"&&value.length>0}function requestCountFilterFlags(flags){return TRAFFIC_DIMENSIONS.filter(d=>d.metric&&hasStringFlag(flags,`--${d.alias}`)).map(d=>`--${d.alias}`)}function mixedTrafficMetricError(opts){let requestFilters=requestCountFilterFlags(opts.flags),queryingRequestCount=!!opts.dimension?.metric;if(!queryingRequestCount&&requestFilters.length>0)return`Can't combine ${requestFilters.join(", ")} with firewall-action data. Inspect unknown-bot <category> instead.`;if(!queryingRequestCount||!opts.dimension)return;let unsupported=[];if(hasStringFlag(opts.flags,"--action")&&unsupported.push("--action"),hasStringFlag(opts.flags,"--rule")&&unsupported.push("--rule"),opts.groupBy&&WAF_ONLY_ALIASES.has(opts.groupBy.alias)&&unsupported.push(`--group-by ${opts.groupBy.alias}`),unsupported.length!==0)return`${opts.dimension.label} uses request-count data and cannot be combined with ${unsupported.join(", ")}. Use a request dimension such as path, ip, host, country, asn, ja4, or user-agent instead.`}var TOP_LIMITS={min:1,max:100};function trendBuckets(client){let columns=client.stderr.columns||80;return Math.max(12,Math.min(96,columns-56))}async function runWithConcurrency(tasks,limit){let results=new Array(tasks.length),next=0,workers=Array.from({length:Math.min(limit,tasks.length)},async()=>{for(;next<tasks.length;){let index=next++;results[index]=await tasks[index]()}});return await Promise.all(workers),results}var AlertNotFoundError=class extends Error{constructor(alertId){super(`No firewall alert found for "${alertId}". Run \`vercel firewall alerts list\` to view recent alerts.`),this.name="AlertNotFoundError"}};async function resolveAlertScope(client,opts){let resolved=await findFirewallAlert(client,opts);if(!resolved)throw new AlertNotFoundError(opts.alertId);let{alert}=resolved;return{alert,startTime:new Date(alert.startedAt),endTime:new Date(alert.resolvedAt??Date.now()),filter:alert.ruleId?eqFilter(RULE_ID_DIMENSION,alert.ruleId):void 0}}var DEFAULT_TOP=5,DEFAULT_DIMENSIONS=["ip","ja4","asn","user-agent","path","rule","host","bot"],LIST_CONCURRENCY=8;function isActivityUnavailable4(error){return isAPIError(error)&&error.status===402}async function list6(client,argv){let parsed=await parseSubcommandArgs(argv,trafficListSubcommand,client,"traffic list");if(typeof parsed=="number")return parsed;let topResult=validateIntegerRangeWithDefault(parsed.flags["--top"],{flag:"--top",...TOP_LIMITS,defaultValue:DEFAULT_TOP});if(!topResult.valid)return failFirewall(client,{message:topResult.message,reason:AGENT_REASON.INVALID_ARGUMENTS});let top=topResult.value,requested=normalizeRepeatableStringFilters(parsed.flags["--dimension"]),dimensions=[];for(let alias of requested.length>0?requested:DEFAULT_DIMENSIONS){let dimension=getDimension(alias);if(!dimension)return failFirewall(client,{message:unknownDimensionMessage("--dimension",alias),reason:AGENT_REASON.INVALID_ARGUMENTS});dimensions.includes(dimension)||dimensions.push(dimension)}let mixedMetricError=mixedTrafficMetricError({flags:parsed.flags});if(mixedMetricError)return failFirewall(client,{message:mixedMetricError,nextCommand:"firewall traffic inspect unknown-bot <category>",reason:AGENT_REASON.INVALID_ARGUMENTS});let link=await requireProjectContext(client,"firewall",parsed.flags["--project"]);if(typeof link=="number")return link;let{project,org}=link,teamId=requireTrafficTeam(client,org,"Firewall traffic");if(typeof teamId=="number")return teamId;let asJson=!!parsed.flags["--json"],suggestedCommand=`firewall traffic list${asJson?" --json":""}`,alertScope,alertId=parsed.flags["--alert"];if(alertId){output_manager_default.spinner(`Fetching alert ${import_chalk39.default.bold(alertId)}`);try{alertScope=await resolveAlertScope(client,{alertId,projectId:project.id,teamId})}catch(e){return e instanceof AlertNotFoundError?failFirewall(client,{message:e.message,nextCommand:"firewall alerts list",reason:AGENT_REASON.NOT_FOUND}):failFirewallApi(client,e,{fallback:"Failed to fetch firewall alert",nextCommand:suggestedCommand,permissionAction:"read firewall alerts",projectName:project.name,timeoutJob:"firewall alert"})}}let window=resolveTrafficWindow(parsed.flags["--since"],parsed.flags["--until"],alertScope);if(!window.valid)return failFirewall(client,{message:window.message,reason:AGENT_REASON.INVALID_ARGUMENTS});let filter=andFilters(alertScope?.filter,buildTrafficFilter(parsed.flags)),filtered=!!filter;output_manager_default.spinner(`Fetching firewall traffic for ${import_chalk39.default.bold(project.name)}`);let granularity=pickGranularity(window.endTime.getTime()-window.startTime.getTime(),asJson?DEFAULT_MAX_BUCKETS:trendBuckets(client)),{startTime,endTime}=alignQueryWindow(window.startTime,window.endTime,granularity),activeConfig=dimensions.some(d=>d.alias==="rule")?listFirewallConfigs(client,projectScope(project,teamId)).then(configs=>configs.active).catch(()=>null):Promise.resolve(null);try{let[metrics,topLists,config]=await Promise.all([getFirewallMetrics(client,{projectId:project.id,ownerId:teamId,startTime,endTime,granularity,filter}),runWithConcurrency(dimensions.map(dimension=>async()=>{let title=dimension.widgetTitle;try{let groupBy=dimension.groupBy??[dimension.field],rows=await getTopList(client,{projectId:project.id,ownerId:teamId,startTime,endTime,metric:dimension.metric,groupBy,filter:andFilters(filter,dimension.excludeFilter,dimension.extraFilter),top:topListFetchCount(top,groupBy)});return{dimension:dimension.alias,title,rows:toTopListRows(rows,dimension.field,dimension.labelFields).slice(0,top)}}catch(e){return{dimension:dimension.alias,title,rows:[],unavailable:isActivityUnavailable4(e)?"plan":isUnsupportedDimension(e)?"filter":isRateLimited(e)?"rate-limit":isActivityTimeout(e)?"timeout":"error",retrySeconds:rateLimitRetrySeconds(e),message:isRateLimited(e)?apiServerMessage(e):void 0}}}),LIST_CONCURRENCY),activeConfig]);for(let list7 of topLists)list7.dimension==="rule"&&(list7.rows=list7.rows.map(row=>({...row,label:resolveRuleDisplayName(row.value,config)})));let allFailed=allTopListsUnavailable(topLists);return asJson?(outputJson(client,{period:{start:metrics.startTime,end:metrics.endTime,granularity:metrics.granularity},filter:filter??null,...alertScope?{alert:{id:alertScope.alert.id,title:alertScope.alert.title,startedAt:alertScope.alert.startedAt,resolvedAt:alertScope.alert.resolvedAt??null}}:{},stats:metrics.totals,series:metrics.series.map(({action,timeseries})=>({action,timeseries})),topLists:topLists.map(list7=>({dimension:list7.dimension,rows:list7.rows,...list7.unavailable?{unavailable:list7.unavailable}:{},...list7.retrySeconds?{retrySeconds:list7.retrySeconds}:{}}))}),allFailed?1:0):(output_manager_default.print(`
|
|
184
|
+
`),0)}catch(e){return isActivityUnavailable3(e)?failFirewallObservabilityPlan(client,e,project.name):failFirewallApi(client,e,{fallback:"Failed to fetch persistent firewall action",nextCommand:suggestedCommand,permissionAction:"read firewall persistent actions",projectName:project.name,timeoutJob:"firewall persistent action"})}}var COMMAND_CONFIG7={list:getCommandAliases(persistentActionsListSubcommand),inspect:getCommandAliases(persistentActionsInspectSubcommand)};async function main7(client,args,telemetry){let flagsSpecification=getFlagsSpecification(persistentActionsSubcommand.options),parsedArgs;try{parsedArgs=parseArguments(args,flagsSpecification,{permissive:!0})}catch(err){return printError(err),2}let{subcommand,args:subArgs,subcommandOriginal}=getSubcommand(parsedArgs.args,COMMAND_CONFIG7),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry.trackCliFlagHelp("firewall","persistent-actions"),output_manager_default.print(help(persistentActionsSubcommand,{parent:firewallCommand,columns:client.stderr.columns})),0;function printHelp(command){output_manager_default.print(help(command,{parent:firewallCommand,columns:client.stderr.columns}))}switch(subcommand){case"list":return needHelp?(telemetry.trackCliFlagHelp("firewall",`persistent-actions:${subcommandOriginal}`),printHelp(persistentActionsListSubcommand),0):(telemetry.trackCliSubcommandPersistentActionsList(subcommandOriginal),list5(client,subArgs));case"inspect":return needHelp?(telemetry.trackCliFlagHelp("firewall",`persistent-actions:${subcommandOriginal}`),printHelp(persistentActionsInspectSubcommand),0):(telemetry.trackCliSubcommandPersistentActionsInspect(subcommandOriginal),inspect3(client,subArgs));default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG7)),output_manager_default.print(help(persistentActionsSubcommand,{parent:firewallCommand,columns:client.stderr.columns})),2}}var import_chalk39=__toESM(require_source(),1);var DEFAULT_TRAFFIC_WINDOW_MS=24*60*60*1e3;function requireTrafficTeam(client,org,what){return org.type==="team"?org.id:failFirewall(client,{message:`${what} needs a team. Run \`vercel switch\` to select a team or pass --scope <team>.`,reason:AGENT_REASON.MISSING_SCOPE})}function resolveTrafficWindow(since,until,scope){let sinceResult=validateTimeBound(since);if(!sinceResult.valid)return{valid:!1,message:sinceResult.message};let untilResult=validateTimeBound(until);if(!untilResult.valid)return{valid:!1,message:untilResult.message};let order=validateTimeOrder(sinceResult.value,untilResult.value);if(!order.valid)return{valid:!1,message:order.message};if(!sinceResult.value&&!untilResult.value&&scope)return{valid:!0,startTime:scope.startTime,endTime:scope.endTime};let endTime=untilResult.value??new Date,startTime=sinceResult.value??scope?.startTime??new Date(endTime.getTime()-DEFAULT_TRAFFIC_WINDOW_MS);return startTime.getTime()>endTime.getTime()?{valid:!1,message:sinceResult.value?"`--since` is in the future. Pass a past time, such as `24h` or an earlier date.":"The alert began after `--until`. Widen the window with `--since`, or drop `--until`."}:{valid:!0,startTime,endTime}}function buildTrafficFilter(flags){let parts=[];for(let dimension of TRAFFIC_DIMENSIONS){let value=flags[`--${dimension.alias}`];typeof value=="string"&&value.length>0&&parts.push(eqFilter(dimension.field,value))}let raw=flags["--query"],rawExpressions=[];if(Array.isArray(raw))for(let expression of raw)typeof expression=="string"&&expression.length>0&&(rawExpressions.push(expression),parts.push(expression));return usesODataSyntax(rawExpressions)&&output_manager_default.warn(FILTER_DEPRECATION_WARNING),andFilters(...parts)}function unknownDimensionMessage(flag,value){return`Unknown ${flag} "${value}". Dimensions: ${dimensionAliases().join(", ")}.`}var WAF_ONLY_ALIASES=new Set(["action","rule"]);function hasStringFlag(flags,flag){let value=flags[flag];return typeof value=="string"&&value.length>0}function requestCountFilterFlags(flags){return TRAFFIC_DIMENSIONS.filter(d=>d.metric&&hasStringFlag(flags,`--${d.alias}`)).map(d=>`--${d.alias}`)}function mixedTrafficMetricError(opts){let requestFilters=requestCountFilterFlags(opts.flags),queryingRequestCount=!!opts.dimension?.metric;if(!queryingRequestCount&&requestFilters.length>0)return`Can't combine ${requestFilters.join(", ")} with firewall-action data. Inspect unknown-bot <category> instead.`;if(!queryingRequestCount||!opts.dimension)return;let unsupported=[];if(hasStringFlag(opts.flags,"--action")&&unsupported.push("--action"),hasStringFlag(opts.flags,"--rule")&&unsupported.push("--rule"),opts.groupBy&&WAF_ONLY_ALIASES.has(opts.groupBy.alias)&&unsupported.push(`--group-by ${opts.groupBy.alias}`),unsupported.length!==0)return`${opts.dimension.label} uses request-count data and cannot be combined with ${unsupported.join(", ")}. Use a request dimension such as path, ip, host, country, asn, ja4, or user-agent instead.`}var TOP_LIMITS={min:1,max:100};function trendBuckets(client){let columns=client.stderr.columns||80;return Math.max(12,Math.min(96,columns-56))}async function runWithConcurrency(tasks,limit){let results=new Array(tasks.length),next=0,workers=Array.from({length:Math.min(limit,tasks.length)},async()=>{for(;next<tasks.length;){let index=next++;results[index]=await tasks[index]()}});return await Promise.all(workers),results}var AlertNotFoundError=class extends Error{constructor(alertId){super(`No firewall alert found for "${alertId}". Run \`vercel firewall alerts list\` to view recent alerts.`),this.name="AlertNotFoundError"}};async function resolveAlertScope(client,opts){let resolved=await findFirewallAlert(client,opts);if(!resolved)throw new AlertNotFoundError(opts.alertId);let{alert}=resolved;return{alert,startTime:new Date(alert.startedAt),endTime:new Date(alert.resolvedAt??Date.now()),filter:alert.ruleId?eqFilter(RULE_ID_DIMENSION,alert.ruleId):void 0}}var DEFAULT_TOP=5,DEFAULT_DIMENSIONS=["ip","ja4","asn","user-agent","path","rule","host","bot"],LIST_CONCURRENCY=8;function isActivityUnavailable4(error){return isAPIError(error)&&error.status===402}async function list6(client,argv){let parsed=await parseSubcommandArgs(argv,trafficListSubcommand,client,"traffic list");if(typeof parsed=="number")return parsed;let json=!!parsed.flags["--json"],query=getRenamedOption(parsed.flags,"--query","--filter",{json});if("error"in query)return failFirewall(client,{message:query.error,reason:AGENT_REASON.INVALID_ARGUMENTS});parsed.flags["--query"]=query.value;let limit=getRenamedOption(parsed.flags,"--limit","--top",{json});if("error"in limit)return failFirewall(client,{message:limit.error,reason:AGENT_REASON.INVALID_ARGUMENTS});let topResult=validateIntegerRangeWithDefault(limit.value,{flag:"--limit",...TOP_LIMITS,defaultValue:DEFAULT_TOP});if(!topResult.valid)return failFirewall(client,{message:topResult.message,reason:AGENT_REASON.INVALID_ARGUMENTS});let top=topResult.value,requested=normalizeRepeatableStringFilters(parsed.flags["--dimension"]),dimensions=[];for(let alias of requested.length>0?requested:DEFAULT_DIMENSIONS){let dimension=getDimension(alias);if(!dimension)return failFirewall(client,{message:unknownDimensionMessage("--dimension",alias),reason:AGENT_REASON.INVALID_ARGUMENTS});dimensions.includes(dimension)||dimensions.push(dimension)}let mixedMetricError=mixedTrafficMetricError({flags:parsed.flags});if(mixedMetricError)return failFirewall(client,{message:mixedMetricError,nextCommand:"firewall traffic inspect unknown-bot <category>",reason:AGENT_REASON.INVALID_ARGUMENTS});let link=await requireProjectContext(client,"firewall",parsed.flags["--project"]);if(typeof link=="number")return link;let{project,org}=link,teamId=requireTrafficTeam(client,org,"Firewall traffic");if(typeof teamId=="number")return teamId;let asJson=!!parsed.flags["--json"],suggestedCommand=`firewall traffic list${asJson?" --json":""}`,alertScope,alertId=parsed.flags["--alert"];if(alertId){output_manager_default.spinner(`Fetching alert ${import_chalk39.default.bold(alertId)}`);try{alertScope=await resolveAlertScope(client,{alertId,projectId:project.id,teamId})}catch(e){return e instanceof AlertNotFoundError?failFirewall(client,{message:e.message,nextCommand:"firewall alerts list",reason:AGENT_REASON.NOT_FOUND}):failFirewallApi(client,e,{fallback:"Failed to fetch firewall alert",nextCommand:suggestedCommand,permissionAction:"read firewall alerts",projectName:project.name,timeoutJob:"firewall alert"})}}let window=resolveTrafficWindow(parsed.flags["--since"],parsed.flags["--until"],alertScope);if(!window.valid)return failFirewall(client,{message:window.message,reason:AGENT_REASON.INVALID_ARGUMENTS});let filter=andFilters(alertScope?.filter,buildTrafficFilter(parsed.flags)),filtered=!!filter;output_manager_default.spinner(`Fetching firewall traffic for ${import_chalk39.default.bold(project.name)}`);let granularity=pickGranularity(window.endTime.getTime()-window.startTime.getTime(),asJson?DEFAULT_MAX_BUCKETS:trendBuckets(client)),{startTime,endTime}=alignQueryWindow(window.startTime,window.endTime,granularity),activeConfig=dimensions.some(d=>d.alias==="rule")?listFirewallConfigs(client,projectScope(project,teamId)).then(configs=>configs.active).catch(()=>null):Promise.resolve(null);try{let[metrics,topLists,config]=await Promise.all([getFirewallMetrics(client,{projectId:project.id,ownerId:teamId,startTime,endTime,granularity,filter}),runWithConcurrency(dimensions.map(dimension=>async()=>{let title=dimension.widgetTitle;try{let groupBy=dimension.groupBy??[dimension.field],rows=await getTopList(client,{projectId:project.id,ownerId:teamId,startTime,endTime,metric:dimension.metric,groupBy,filter:andFilters(filter,dimension.excludeFilter,dimension.extraFilter),top:topListFetchCount(top,groupBy)});return{dimension:dimension.alias,title,rows:toTopListRows(rows,dimension.field,dimension.labelFields).slice(0,top)}}catch(e){return{dimension:dimension.alias,title,rows:[],unavailable:isActivityUnavailable4(e)?"plan":isUnsupportedDimension(e)?"filter":isRateLimited(e)?"rate-limit":isActivityTimeout(e)?"timeout":"error",retrySeconds:rateLimitRetrySeconds(e),message:isRateLimited(e)?apiServerMessage(e):void 0}}}),LIST_CONCURRENCY),activeConfig]);for(let list7 of topLists)list7.dimension==="rule"&&(list7.rows=list7.rows.map(row=>({...row,label:resolveRuleDisplayName(row.value,config)})));let allFailed=allTopListsUnavailable(topLists);return asJson?(outputJson(client,withWarnings({period:{start:metrics.startTime,end:metrics.endTime,granularity:metrics.granularity},filter:filter??null,...alertScope?{alert:{id:alertScope.alert.id,title:alertScope.alert.title,startedAt:alertScope.alert.startedAt,resolvedAt:alertScope.alert.resolvedAt??null}}:{},stats:metrics.totals,series:metrics.series.map(({action,timeseries})=>({action,timeseries})),topLists:topLists.map(list7=>({dimension:list7.dimension,rows:list7.rows,...list7.unavailable?{unavailable:list7.unavailable}:{},...list7.retrySeconds?{retrySeconds:list7.retrySeconds}:{}}))},[query.warning,limit.warning])),allFailed?1:0):(output_manager_default.print(`
|
|
185
185
|
`),output_manager_default.print(formatTrafficList({series:metrics.series,topLists,startTime:metrics.startTime,endTime:metrics.endTime,granularity:metrics.granularity,filtered})),allFailed||output_manager_default.print(`
|
|
186
186
|
${import_chalk39.default.dim(" Break any of these values down further:")}
|
|
187
187
|
${withGlobalFlags(client,"firewall traffic inspect <dimension> <value>")}
|
|
188
188
|
|
|
189
|
-
`),allFailed?1:0)}catch(e){return isActivityUnavailable4(e)?failFirewallObservabilityPlan(client,e,project.name):failFirewallApi(client,e,{fallback:"Failed to fetch firewall traffic",nextCommand:suggestedCommand,permissionAction:"query firewall traffic",projectName:project.name,timeoutJob:"firewall traffic"})}}var import_chalk40=__toESM(require_source(),1);var DEFAULT_TOP2=10;function isActivityUnavailable5(error){return isAPIError(error)&&error.status===402}async function inspect4(client,argv){let parsed=await parseSubcommandArgs(argv,trafficInspectSubcommand,client,"traffic inspect");if(typeof parsed=="number")return parsed;let usage="firewall traffic inspect <dimension> <value>",[dimensionArg,value]=parsed.args;if(!dimensionArg||!value)return failFirewall(client,{message:`Dimension and value are required. Usage: ${withGlobalFlags(client,usage)}. Dimensions: ${dimensionAliases().join(", ")}.`,nextCommand:usage,reason:AGENT_REASON.MISSING_ARGUMENTS});let dimension=getDimension(dimensionArg);if(!dimension)return failFirewall(client,{message:unknownDimensionMessage("dimension",dimensionArg),reason:AGENT_REASON.INVALID_ARGUMENTS});let groupByArg=parsed.flags["--group-by"]??dimension.defaultGroupBy,groupBy=getDimension(groupByArg);if(!groupBy)return failFirewall(client,{message:unknownDimensionMessage("--group-by",groupByArg),reason:AGENT_REASON.INVALID_ARGUMENTS});if(groupBy.alias===dimension.alias)return failFirewall(client,{message:`\`--group-by\` must name a different dimension from "${dimension.alias}".`,reason:AGENT_REASON.INVALID_ARGUMENTS});let requestMetricError=mixedTrafficMetricError({dimension,groupBy,flags:parsed.flags});if(requestMetricError)return failFirewall(client,{message:requestMetricError,reason:AGENT_REASON.INVALID_ARGUMENTS});let topResult=validateIntegerRangeWithDefault(
|
|
189
|
+
`),allFailed?1:0)}catch(e){return isActivityUnavailable4(e)?failFirewallObservabilityPlan(client,e,project.name):failFirewallApi(client,e,{fallback:"Failed to fetch firewall traffic",nextCommand:suggestedCommand,permissionAction:"query firewall traffic",projectName:project.name,timeoutJob:"firewall traffic"})}}var import_chalk40=__toESM(require_source(),1);var DEFAULT_TOP2=10;function isActivityUnavailable5(error){return isAPIError(error)&&error.status===402}async function inspect4(client,argv){let parsed=await parseSubcommandArgs(argv,trafficInspectSubcommand,client,"traffic inspect");if(typeof parsed=="number")return parsed;let json=!!parsed.flags["--json"],query=getRenamedOption(parsed.flags,"--query","--filter",{json});if("error"in query)return failFirewall(client,{message:query.error,reason:AGENT_REASON.INVALID_ARGUMENTS});parsed.flags["--query"]=query.value;let limit=getRenamedOption(parsed.flags,"--limit","--top",{json});if("error"in limit)return failFirewall(client,{message:limit.error,reason:AGENT_REASON.INVALID_ARGUMENTS});let usage="firewall traffic inspect <dimension> <value>",[dimensionArg,value]=parsed.args;if(!dimensionArg||!value)return failFirewall(client,{message:`Dimension and value are required. Usage: ${withGlobalFlags(client,usage)}. Dimensions: ${dimensionAliases().join(", ")}.`,nextCommand:usage,reason:AGENT_REASON.MISSING_ARGUMENTS});let dimension=getDimension(dimensionArg);if(!dimension)return failFirewall(client,{message:unknownDimensionMessage("dimension",dimensionArg),reason:AGENT_REASON.INVALID_ARGUMENTS});let groupByArg=parsed.flags["--group-by"]??dimension.defaultGroupBy,groupBy=getDimension(groupByArg);if(!groupBy)return failFirewall(client,{message:unknownDimensionMessage("--group-by",groupByArg),reason:AGENT_REASON.INVALID_ARGUMENTS});if(groupBy.alias===dimension.alias)return failFirewall(client,{message:`\`--group-by\` must name a different dimension from "${dimension.alias}".`,reason:AGENT_REASON.INVALID_ARGUMENTS});let requestMetricError=mixedTrafficMetricError({dimension,groupBy,flags:parsed.flags});if(requestMetricError)return failFirewall(client,{message:requestMetricError,reason:AGENT_REASON.INVALID_ARGUMENTS});let topResult=validateIntegerRangeWithDefault(limit.value,{flag:"--limit",...TOP_LIMITS,defaultValue:DEFAULT_TOP2});if(!topResult.valid)return failFirewall(client,{message:topResult.message,reason:AGENT_REASON.INVALID_ARGUMENTS});let top=topResult.value,link=await requireProjectContext(client,"firewall",parsed.flags["--project"]);if(typeof link=="number")return link;let{project,org}=link,teamId=requireTrafficTeam(client,org,"Firewall traffic");if(typeof teamId=="number")return teamId;let asJson=!!parsed.flags["--json"],suggestedCommand=`firewall traffic inspect ${dimension.alias} ${value}${asJson?" --json":""}`,alertScope,alertId=parsed.flags["--alert"];if(alertId){output_manager_default.spinner(`Fetching alert ${import_chalk40.default.bold(alertId)}`);try{alertScope=await resolveAlertScope(client,{alertId,projectId:project.id,teamId})}catch(e){return e instanceof AlertNotFoundError?failFirewall(client,{message:e.message,nextCommand:"firewall alerts list",reason:AGENT_REASON.NOT_FOUND}):failFirewallApi(client,e,{fallback:"Failed to fetch firewall alert",nextCommand:suggestedCommand,permissionAction:"read firewall alerts",projectName:project.name,timeoutJob:"firewall alert"})}if(dimension.metric&&alertScope.filter)return failFirewall(client,{message:`${dimension.label} uses request-count data and cannot be scoped to a firewall alert with an attributed rule. Drop --alert, or inspect a firewall-action dimension instead.`,reason:AGENT_REASON.INVALID_ARGUMENTS})}let window=resolveTrafficWindow(parsed.flags["--since"],parsed.flags["--until"],alertScope);if(!window.valid)return failFirewall(client,{message:window.message,reason:AGENT_REASON.INVALID_ARGUMENTS});let filter=andFilters(alertScope?.filter,eqFilter(dimension.field,value),buildTrafficFilter(parsed.flags),dimension.extraFilter),granularity=pickGranularity(window.endTime.getTime()-window.startTime.getTime(),asJson?DEFAULT_MAX_BUCKETS:trendBuckets(client)),{startTime,endTime}=alignQueryWindow(window.startTime,window.endTime,granularity);output_manager_default.spinner(`Fetching traffic for ${import_chalk40.default.bold(value)}`);try{let[detailRows,metrics,breakdown]=await Promise.all([dimension.headerDetailFields?.length?getTopList(client,{projectId:project.id,ownerId:teamId,startTime,endTime,metric:dimension.metric,groupBy:dimension.headerDetailFields,filter,top:1}).catch(()=>[]):Promise.resolve([]),dimension.metric?requestCountMetrics(client,{projectId:project.id,ownerId:teamId,startTime,endTime,granularity,filter,metric:dimension.metric}):getFirewallMetrics(client,{projectId:project.id,ownerId:teamId,startTime,endTime,granularity,filter}),getGroupedTimeseries(client,{projectId:project.id,ownerId:teamId,startTime,endTime,granularity,metric:dimension.metric,groupBy:[groupBy.field],filter,limit:top,approximateSelection:!0})]),detail=(dimension.headerDetailFields??[]).map(field=>({field,value:detailRows[0]?.values[field]??""})),total=Object.values(metrics.totals).reduce((sum,count)=>sum+count,0);return total===0?failFirewall(client,{message:`No firewall traffic for ${dimension.label} "${value}" in this window. Run ${withGlobalFlags(client,"firewall traffic list")} to see which values have traffic, or widen the window with \`--since\`.`,nextCommand:"firewall traffic list",reason:AGENT_REASON.NOT_FOUND}):asJson?(outputJson(client,withWarnings({dimension:dimension.alias,value,period:{start:metrics.startTime,end:metrics.endTime,granularity:metrics.granularity},filter:filter??null,...alertScope?{alert:{id:alertScope.alert.id,title:alertScope.alert.title,startedAt:alertScope.alert.startedAt,resolvedAt:alertScope.alert.resolvedAt??null}}:{},detail:Object.fromEntries(detail.map(row=>[row.field,row.value])),total,stats:metrics.totals,series:metrics.series.map(({action,timeseries})=>({action,timeseries})),breakdown:{groupBy:groupBy.alias,axis:breakdown.axis,groups:breakdown.groups.map(group=>({value:group.values[groupBy.field],total:group.total,series:group.series}))}},[query.warning,limit.warning])),0):(output_manager_default.print(`
|
|
190
190
|
`),output_manager_default.print(formatTrafficInspect({value,dimensionLabel:dimension.label,detail,total,series:metrics.series,startTime:metrics.startTime,endTime:metrics.endTime,granularity:metrics.granularity,breakdown,breakdownField:groupBy.field,breakdownLabel:groupBy.label,top,filtered:!0})),output_manager_default.print(`
|
|
191
191
|
${nextSteps(client,dimension.alias)}
|
|
192
192
|
`),0)}catch(e){return isActivityUnavailable5(e)?failFirewallObservabilityPlan(client,e,project.name):failFirewallApi(client,e,{fallback:"Failed to fetch firewall traffic",nextCommand:suggestedCommand,permissionAction:"query firewall traffic",projectName:project.name,timeoutJob:"firewall traffic"})}}async function requestCountMetrics(client,opts){let result=await getGroupedTimeseries(client,opts),group=result.groups[0],total=group?.total??0,timeseries=result.axis.map((timestamp,i)=>({timestamp,value:group?.series[i]??0}));return{startTime:result.startTime,endTime:result.endTime,granularity:result.granularity,series:total>0?[{action:"requests",total,timeseries}]:[],totals:total>0?{requests:total}:{}}}function nextSteps(client,alias){let steps=[];if(alias==="ip"?steps.push(["Block this client on every host","firewall ip-blocks block <ip>"]):alias==="rule"&&steps.push(["Change what this rule does","firewall rules update <rule>"]),steps.push(["Break the same traffic down another way",`firewall traffic inspect ${alias} <value> --group-by <dimension>`]),steps.length===1){let[why,command]=steps[0];return`${import_chalk40.default.dim(` ${why}:`)}
|
|
@@ -201,8 +201,8 @@ ${formatTrafficTopList(unknownBotTraffic)}
|
|
|
201
201
|
${steps.flatMap(([why,command])=>[import_chalk41.default.dim(` ${why}`),` ${withGlobalFlags(client,command)}`]).join(`
|
|
202
202
|
`)}
|
|
203
203
|
|
|
204
|
-
`),0}catch(e){return failFirewallApi(client,e,{fallback:"Failed to fetch bot management",nextCommand:"firewall bot-management",permissionAction:"read firewall config",projectName:project.name,timeoutJob:"bot management"})}finally{output_manager_default.stopSpinner()}}async function loadUnknownBotTraffic(client,projectId,teamId){let dimension=getDimension("unknown-bot"),title=dimension?.widgetTitle??"Unknown Bot Traffic",unavailable=error=>({dimension:"unknown-bot",title,rows:[],unavailable:isActivityUnavailable6(error)?"plan":isUnsupportedDimension(error)?"filter":isRateLimited(error)?"rate-limit":isActivityTimeout(error)?"timeout":"error",retrySeconds:rateLimitRetrySeconds(error),message:isRateLimited(error)?apiServerMessage(error):void 0});if(!dimension)return unavailable(new Error("unknown-bot dimension missing"));let endTime=new Date,startTime=new Date(endTime.getTime()-DEFAULT_TRAFFIC_WINDOW_MS);try{let rows=await getTopList(client,{projectId,ownerId:teamId,startTime,endTime,metric:dimension.metric,groupBy:[dimension.field],filter:andFilters(dimension.excludeFilter,dimension.extraFilter),top:topListFetchCount(UNKNOWN_BOT_TOP)});return{dimension:dimension.alias,title,rows:toTopListRows(rows,dimension.field).slice(0,UNKNOWN_BOT_TOP)}}catch(e){return output_manager_default.debug(isAPIError(e)?`Unknown bot traffic query failed: status=${e.status} code=${e.code??"(none)"} message=${e.serverMessage}`:`Unknown bot traffic query failed: ${e instanceof Error?e.message:String(e)}`),unavailable(e)}}var FirewallTelemetryClient=class extends TelemetryClient{trackCliFlagTeamLevel(value){value&&this.trackCliFlag("team-level")}trackCliSubcommandStatus(actual){this.trackCliSubcommand({subcommand:"status",value:actual})}trackCliSubcommandOverview(actual){this.trackCliSubcommand({subcommand:"overview",value:actual})}trackCliSubcommandDiff(actual){this.trackCliSubcommand({subcommand:"diff",value:actual})}trackCliSubcommandPublish(actual){this.trackCliSubcommand({subcommand:"publish",value:actual})}trackCliSubcommandDiscard(actual){this.trackCliSubcommand({subcommand:"discard",value:actual})}trackCliSubcommandRules(actual){this.trackCliSubcommand({subcommand:"rules",value:actual})}trackCliSubcommandRulesList(actual){this.trackCliSubcommand({subcommand:"rules:list",value:actual})}trackCliSubcommandRulesInspect(actual){this.trackCliSubcommand({subcommand:"rules:inspect",value:actual})}trackCliSubcommandRulesAdd(actual){this.trackCliSubcommand({subcommand:"rules:add",value:actual})}trackCliSubcommandRulesUpdate(actual){this.trackCliSubcommand({subcommand:"rules:update",value:actual})}trackCliSubcommandRulesEnable(actual){this.trackCliSubcommand({subcommand:"rules:enable",value:actual})}trackCliSubcommandRulesDisable(actual){this.trackCliSubcommand({subcommand:"rules:disable",value:actual})}trackCliSubcommandRulesRemove(actual){this.trackCliSubcommand({subcommand:"rules:remove",value:actual})}trackCliSubcommandRulesReorder(actual){this.trackCliSubcommand({subcommand:"rules:reorder",value:actual})}trackCliSubcommandRulesMove(actual){this.trackCliSubcommand({subcommand:"rules:move",value:actual})}trackCliSubcommandIpBlocks(actual){this.trackCliSubcommand({subcommand:"ip-blocks",value:actual})}trackCliSubcommandIpBlocksList(actual){this.trackCliSubcommand({subcommand:"ip-blocks:list",value:actual})}trackCliSubcommandIpBlocksBlock(actual){this.trackCliSubcommand({subcommand:"ip-blocks:block",value:actual})}trackCliSubcommandIpBlocksUnblock(actual){this.trackCliSubcommand({subcommand:"ip-blocks:unblock",value:actual})}trackCliSubcommandSystemBypass(actual){this.trackCliSubcommand({subcommand:"system-bypass",value:actual})}trackCliSubcommandSystemBypassList(actual){this.trackCliSubcommand({subcommand:"system-bypass:list",value:actual})}trackCliSubcommandSystemBypassAdd(actual){this.trackCliSubcommand({subcommand:"system-bypass:add",value:actual})}trackCliSubcommandSystemBypassRemove(actual){this.trackCliSubcommand({subcommand:"system-bypass:remove",value:actual})}trackCliSubcommandAttackMode(actual){this.trackCliSubcommand({subcommand:"attack-mode",value:actual})}trackCliSubcommandAttackModeEnable(actual){this.trackCliSubcommand({subcommand:"attack-mode:enable",value:actual})}trackCliSubcommandAttackModeDisable(actual){this.trackCliSubcommand({subcommand:"attack-mode:disable",value:actual})}trackCliSubcommandSystemMitigations(actual){this.trackCliSubcommand({subcommand:"system-mitigations",value:actual})}trackCliSubcommandSystemMitigationsPause(actual){this.trackCliSubcommand({subcommand:"system-mitigations:pause",value:actual})}trackCliSubcommandSystemMitigationsResume(actual){this.trackCliSubcommand({subcommand:"system-mitigations:resume",value:actual})}trackCliSubcommandAlerts(actual){this.trackCliSubcommand({subcommand:"alerts",value:actual})}trackCliSubcommandAlertsList(actual){this.trackCliSubcommand({subcommand:"alerts:list",value:actual})}trackCliSubcommandAlertsInspect(actual){this.trackCliSubcommand({subcommand:"alerts:inspect",value:actual})}trackCliSubcommandPersistentActions(actual){this.trackCliSubcommand({subcommand:"persistent-actions",value:actual})}trackCliSubcommandPersistentActionsList(actual){this.trackCliSubcommand({subcommand:"persistent-actions:list",value:actual})}trackCliSubcommandPersistentActionsInspect(actual){this.trackCliSubcommand({subcommand:"persistent-actions:inspect",value:actual})}trackCliSubcommandTraffic(actual){this.trackCliSubcommand({subcommand:"traffic",value:actual})}trackCliSubcommandTrafficList(actual){this.trackCliSubcommand({subcommand:"traffic:list",value:actual})}trackCliSubcommandTrafficInspect(actual){this.trackCliSubcommand({subcommand:"traffic:inspect",value:actual})}trackCliSubcommandBotManagement(actual){this.trackCliSubcommand({subcommand:"bot-management",value:actual})}};var COMMAND_CONFIG9={overview:getCommandAliases(overviewSubcommand),status:getCommandAliases(statusSubcommand),rules:getCommandAliases(rulesSubcommand),diff:getCommandAliases(diffSubcommand),publish:getCommandAliases(publishSubcommand),discard:getCommandAliases(discardSubcommand),"ip-blocks":getCommandAliases(ipBlocksSubcommand),"system-bypass":getCommandAliases(systemBypassSubcommand),"attack-mode":getCommandAliases(attackModeSubcommand),"system-mitigations":getCommandAliases(systemMitigationsSubcommand),alerts:getCommandAliases(alertsSubcommand),"persistent-actions":getCommandAliases(persistentActionsSubcommand),traffic:getCommandAliases(trafficSubcommand),"bot-management":getCommandAliases(botManagementSubcommand)};async function main9(client){let telemetry=new FirewallTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(firewallCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),2}let subArgs=parsedArgs.args.slice(1),{subcommand,args,subcommandOriginal}=getSubcommand(subArgs,COMMAND_CONFIG9),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry.trackCliFlagHelp("firewall"),output_manager_default.print(help(firewallCommand,{columns:client.stderr.columns})),0;function printHelp(command){output_manager_default.print(help(command,{parent:firewallCommand,columns:client.stderr.columns}))}switch(subcommand&&!needHelp&&(telemetry.trackCliOptionProject(getProjectOptionFromArgs(args)),telemetry.trackCliFlagTeamLevel(args.includes("--team-level"))),subcommand){case"status":return needHelp?(telemetry.trackCliFlagHelp("firewall",subcommandOriginal),printHelp(statusSubcommand),0):(telemetry.trackCliSubcommandStatus(subcommandOriginal),status(client,args));case"overview":return needHelp?(telemetry.trackCliFlagHelp("firewall",subcommandOriginal),printHelp(overviewSubcommand),0):(telemetry.trackCliSubcommandOverview(subcommandOriginal),overview(client,args));case"diff":return needHelp?(telemetry.trackCliFlagHelp("firewall",subcommandOriginal),printHelp(diffSubcommand),0):(telemetry.trackCliSubcommandDiff(subcommandOriginal),diff(client,args));case"publish":return needHelp?(telemetry.trackCliFlagHelp("firewall",subcommandOriginal),printHelp(publishSubcommand),0):(telemetry.trackCliSubcommandPublish(subcommandOriginal),publish(client,args));case"discard":return needHelp?(telemetry.trackCliFlagHelp("firewall",subcommandOriginal),printHelp(discardSubcommand),0):(telemetry.trackCliSubcommandDiscard(subcommandOriginal),discard(client,args));case"rules":{telemetry.trackCliSubcommandRules(subcommandOriginal);let nestedArgs=needHelp?[...args,"--help"]:args;return main5(client,nestedArgs,telemetry)}case"ip-blocks":{telemetry.trackCliSubcommandIpBlocks(subcommandOriginal);let nestedArgs=needHelp?[...args,"--help"]:args;return main4(client,nestedArgs,telemetry)}case"system-bypass":{telemetry.trackCliSubcommandSystemBypass(subcommandOriginal);let nestedArgs=needHelp?[...args,"--help"]:args;return main(client,nestedArgs,telemetry)}case"attack-mode":{telemetry.trackCliSubcommandAttackMode(subcommandOriginal);let nestedArgs=needHelp?[...args,"--help"]:args;return main2(client,nestedArgs,telemetry)}case"system-mitigations":{telemetry.trackCliSubcommandSystemMitigations(subcommandOriginal);let nestedArgs=needHelp?[...args,"--help"]:args;return main3(client,nestedArgs,telemetry)}case"alerts":{telemetry.trackCliSubcommandAlerts(subcommandOriginal);let nestedArgs=needHelp?[...args,"--help"]:args;return main6(client,nestedArgs,telemetry)}case"persistent-actions":{telemetry.trackCliSubcommandPersistentActions(subcommandOriginal);let nestedArgs=needHelp?[...args,"--help"]:args;return main7(client,nestedArgs,telemetry)}case"traffic":{telemetry.trackCliSubcommandTraffic(subcommandOriginal);let nestedArgs=needHelp?[...args,"--help"]:args;return main8(client,nestedArgs,telemetry)}case"bot-management":return needHelp?(telemetry.trackCliFlagHelp("firewall",subcommandOriginal),printHelp(botManagementSubcommand),0):(telemetry.trackCliSubcommandBotManagement(subcommandOriginal),botManagement(client,args));default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG9)),output_manager_default.print(help(firewallCommand,{columns:client.stderr.columns})),2}}var FlagsTelemetryClient=class extends TelemetryClient{trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"ls",value:actual})}trackCliSubcommandInspect(actual){this.trackCliSubcommand({subcommand:"inspect",value:actual})}trackCliSubcommandVersions(actual){this.trackCliSubcommand({subcommand:"versions",value:actual})}trackCliSubcommandEvaluations(actual){this.trackCliSubcommand({subcommand:"evaluations",value:actual})}trackCliSubcommandStale(actual){this.trackCliSubcommand({subcommand:"stale",value:actual})}trackCliSubcommandOpen(actual){this.trackCliSubcommand({subcommand:"open",value:actual})}trackCliSubcommandCreate(actual){this.trackCliSubcommand({subcommand:"create",value:actual})}trackCliSubcommandUpdate(actual){this.trackCliSubcommand({subcommand:"update",value:actual})}trackCliSubcommandSet(actual){this.trackCliSubcommand({subcommand:"set",value:actual})}trackCliSubcommandTargeting(actual){this.trackCliSubcommand({subcommand:"targeting",value:actual})}trackCliSubcommandUseTargeting(actual){this.trackCliSubcommand({subcommand:"use-targeting",value:actual})}trackCliSubcommandSplit(actual){this.trackCliSubcommand({subcommand:"split",value:actual})}trackCliSubcommandRollout(actual){this.trackCliSubcommand({subcommand:"rollout",value:actual})}trackCliSubcommandDelete(actual){this.trackCliSubcommand({subcommand:"delete",value:actual})}trackCliSubcommandArchive(actual){this.trackCliSubcommand({subcommand:"archive",value:actual})}trackCliSubcommandUnarchive(actual){this.trackCliSubcommand({subcommand:"unarchive",value:actual})}trackCliSubcommandDisable(actual){this.trackCliSubcommand({subcommand:"disable",value:actual})}trackCliSubcommandEnable(actual){this.trackCliSubcommand({subcommand:"enable",value:actual})}trackCliSubcommandSdkKeys(actual){this.trackCliSubcommand({subcommand:"sdk-keys",value:actual})}trackCliSubcommandConnections(actual){this.trackCliSubcommand({subcommand:"connections",value:actual})}trackCliSubcommandSegments(actual){this.trackCliSubcommand({subcommand:"segments",value:actual})}trackCliSubcommandEntities(actual){this.trackCliSubcommand({subcommand:"entities",value:actual})}trackCliSubcommandLabels(actual){this.trackCliSubcommand({subcommand:"labels",value:actual})}trackCliSubcommandRules(actual){this.trackCliSubcommand({subcommand:"rules",value:actual})}trackCliSubcommandTargets(actual){this.trackCliSubcommand({subcommand:"targets",value:actual})}trackCliSubcommandPrepare(actual){this.trackCliSubcommand({subcommand:"prepare",value:actual})}trackCliSubcommandDatafile(actual){this.trackCliSubcommand({subcommand:"datafile",value:actual})}trackCliSubcommandOverride(actual){this.trackCliSubcommand({subcommand:"override",value:actual})}};var import_chalk42=__toESM(require_source(),1),import_ms=__toESM(require_ms(),1),import_pluralize=__toESM(require_pluralize(),1);function flagUrl(projectId,flagIdOrSlug){return`/v1/projects/${encodeURIComponent(projectId)}/feature-flags/flags/${encodeURIComponent(flagIdOrSlug)}`}async function fetchFlagForUpdate(client,projectId,flagIdOrSlug){output_manager_default.debug(`Fetching feature flag ${flagIdOrSlug} for project ${projectId} with ETag`);let response=await client.fetch(flagUrl(projectId,flagIdOrSlug),{json:!1}),etag=response.headers.get("etag");if(!etag)throw new Error("Unable to update flag safely because the flag ETag is missing.");return{flag:await response.json(),etag}}async function updateFlag(client,projectId,flagIdOrSlug,request,options){output_manager_default.debug(`Updating feature flag ${flagIdOrSlug} for project ${projectId}`);let url=flagUrl(projectId,flagIdOrSlug);return await client.fetch(url,{method:"PATCH",headers:options?.ifMatch?{"If-Match":options.ifMatch}:void 0,body:request})}var MAX_FLAGS_PAGE_LIMIT=100,MAX_FLAG_VERSIONS_PAGE_LIMIT=100;async function getFlags(client,projectId,options={}){let{state="active",tags,createdBy,maintainerIds,limit,cursor}=options;output_manager_default.debug(`Fetching feature flags for project ${projectId}`);let basePath=`/v2/projects/${encodeURIComponent(projectId)}/feature-flags/flags`,buildQuery=(pageLimit,pageCursor2)=>{let query=new URLSearchParams;query.set("state",state),query.set("limit",String(pageLimit)),pageCursor2&&query.set("cursor",pageCursor2),createdBy&&query.set("createdBy",createdBy);for(let tag of tags??[])query.append("tags",tag);for(let maintainerId of maintainerIds??[])query.append("maintainerIds",maintainerId);return query.toString()};if(limit!==void 0||cursor!==void 0){let pageLimit=Math.min(limit??MAX_FLAGS_PAGE_LIMIT,MAX_FLAGS_PAGE_LIMIT),response=await client.fetch(`${basePath}?${buildQuery(pageLimit,cursor)}`);return{flags:response.data,next:response.pagination?.next??null}}let flags=[],pageCursor;do{let response=await client.fetch(`${basePath}?${buildQuery(MAX_FLAGS_PAGE_LIMIT,pageCursor)}`);flags.push(...response.data),pageCursor=response.pagination?.next??void 0}while(pageCursor);return{flags,next:null}}async function getFlag(client,projectId,flagIdOrSlug){output_manager_default.debug(`Fetching feature flag ${flagIdOrSlug} for project ${projectId}`);let url=flagUrl(projectId,flagIdOrSlug);return await client.fetch(url)}async function getFlagSettings(client,projectId){return output_manager_default.debug(`Fetching feature flag settings for project ${projectId}`),await client.fetch(flagSettingsUrl(projectId))}async function updateFlagSettings(client,projectId,request){return output_manager_default.debug(`Updating feature flag settings for project ${projectId}`),client.fetch(flagSettingsUrl(projectId),{method:"PATCH",body:request})}function flagSettingsUrl(projectId){return`/v1/projects/${encodeURIComponent(projectId)}/feature-flags/settings`}async function getFlagVersions(client,projectId,flagIdOrSlug,options={}){output_manager_default.debug(`Fetching feature flag versions for ${flagIdOrSlug} in project ${projectId}`);let query=new URLSearchParams;query.set("withMetadata","true"),options.environment&&query.set("environment",options.environment),options.limit!==void 0&&query.set("limit",String(options.limit)),options.cursor&&query.set("cursor",options.cursor);let url=`/v1/projects/${encodeURIComponent(projectId)}/feature-flags/flags/${encodeURIComponent(flagIdOrSlug)}/versions?${query.toString()}`,response=await client.fetch(url),next=response.pagination?.next??(response.pagination?.hasNext?response.pagination.cursor:null)??null;return{versions:response.versions,next}}var FlagsLsTelemetryClient=class extends TelemetryClient{trackCliOptionState(state){state&&this.trackCliOption({option:"state",value:state})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}trackCliOptionTag(tags){tags&&tags.length>0&&this.trackCliOption({option:"tag",value:this.redactedValue})}trackCliOptionCreatedBy(createdBy){createdBy&&this.trackCliOption({option:"created-by",value:this.redactedValue})}trackCliOptionMaintainerId(maintainerIds){maintainerIds&&maintainerIds.length>0&&this.trackCliOption({option:"maintainer-id",value:this.redactedValue})}trackCliOptionLimit(limit){limit!==void 0&&this.trackCliOption({option:"limit",value:String(limit)})}trackCliOptionNext(next){next&&this.trackCliOption({option:"next",value:this.redactedValue})}};async function ls(client,argv){let telemetryClient=new FlagsLsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(listSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(err){return printError(err),2}let{flags}=parsedArgs,state=flags["--state"]||"active",tags=flags["--tag"],createdBy=flags["--created-by"],maintainerIds=flags["--maintainer-id"],limit=flags["--limit"],next=flags["--next"],json=flags["--json"],projectName=getProjectNameFromFlags(flags);if(telemetryClient.trackCliOptionProject(projectName),telemetryClient.trackCliOptionState(state),telemetryClient.trackCliOptionTag(tags),telemetryClient.trackCliOptionCreatedBy(createdBy),telemetryClient.trackCliOptionMaintainerId(maintainerIds),telemetryClient.trackCliOptionLimit(limit),telemetryClient.trackCliOptionNext(next),telemetryClient.trackCliFlagJson(json),limit!==void 0&&(!Number.isInteger(limit)||limit<1||limit>MAX_FLAGS_PAGE_LIMIT))return output_manager_default.error(`The --limit option must be an integer between 1 and ${MAX_FLAGS_PAGE_LIMIT}.`),2;let link=await getLinkedFlagsProject(client,projectName);if(link.status==="error")return link.exitCode;if(link.status==="not_linked")return output_manager_default.error(`Your codebase isn't linked to a project on Vercel. Pass --project <name>, or run ${getCommandName("link")} to link it.`),1;client.config.currentTeam=link.org.type==="team"?link.org.id:void 0;let{project,org}=link,projectSlugLink=formatProject(org.slug,project.name),lsStamp=stamp_default();output_manager_default.spinner(`Fetching ${state} feature flags for ${projectSlugLink}`);try{let{flags:flagsList,next:nextCursor}=await getFlags(client,project.id,{state,tags,createdBy,maintainerIds,limit,cursor:next});if(output_manager_default.stopSpinner(),json)outputJson2(client,flagsList,nextCursor);else if(flagsList.length===0)output_manager_default.log(`No ${state} feature flags found for ${projectSlugLink} ${import_chalk42.default.gray(lsStamp())}`);else if(output_manager_default.log(`${(0,import_pluralize.default)("feature flag",flagsList.length,!0)} found for ${projectSlugLink} ${import_chalk42.default.gray(lsStamp())}`),printFlagsTable(flagsList),nextCursor){let nextCmd=buildNextPageCommand(flags,tags,maintainerIds,nextCursor);output_manager_default.print(`
|
|
205
|
-
`),printNextPageCommand(getCommandNamePlain(nextCmd))}}catch(err){return output_manager_default.stopSpinner(),printError(err),1}return 0}function buildNextPageCommand(flags,tags,maintainerIds,nextCursor){let baseFlags=getCommandFlags(flags,["_","--tag","--maintainer-id","--next","--json"]),repeatable=[...(tags??[]).map(tag=>`--tag ${quoteArg(tag)}`),...(maintainerIds??[]).map(id=>`--maintainer
|
|
204
|
+
`),0}catch(e){return failFirewallApi(client,e,{fallback:"Failed to fetch bot management",nextCommand:"firewall bot-management",permissionAction:"read firewall config",projectName:project.name,timeoutJob:"bot management"})}finally{output_manager_default.stopSpinner()}}async function loadUnknownBotTraffic(client,projectId,teamId){let dimension=getDimension("unknown-bot"),title=dimension?.widgetTitle??"Unknown Bot Traffic",unavailable=error=>({dimension:"unknown-bot",title,rows:[],unavailable:isActivityUnavailable6(error)?"plan":isUnsupportedDimension(error)?"filter":isRateLimited(error)?"rate-limit":isActivityTimeout(error)?"timeout":"error",retrySeconds:rateLimitRetrySeconds(error),message:isRateLimited(error)?apiServerMessage(error):void 0});if(!dimension)return unavailable(new Error("unknown-bot dimension missing"));let endTime=new Date,startTime=new Date(endTime.getTime()-DEFAULT_TRAFFIC_WINDOW_MS);try{let rows=await getTopList(client,{projectId,ownerId:teamId,startTime,endTime,metric:dimension.metric,groupBy:[dimension.field],filter:andFilters(dimension.excludeFilter,dimension.extraFilter),top:topListFetchCount(UNKNOWN_BOT_TOP)});return{dimension:dimension.alias,title,rows:toTopListRows(rows,dimension.field).slice(0,UNKNOWN_BOT_TOP)}}catch(e){return output_manager_default.debug(isAPIError(e)?`Unknown bot traffic query failed: status=${e.status} code=${e.code??"(none)"} message=${e.serverMessage}`:`Unknown bot traffic query failed: ${e instanceof Error?e.message:String(e)}`),unavailable(e)}}var FirewallTelemetryClient=class extends TelemetryClient{trackCliFlagTeamLevel(value){value&&this.trackCliFlag("team-level")}trackCliSubcommandStatus(actual){this.trackCliSubcommand({subcommand:"status",value:actual})}trackCliSubcommandOverview(actual){this.trackCliSubcommand({subcommand:"overview",value:actual})}trackCliSubcommandDiff(actual){this.trackCliSubcommand({subcommand:"diff",value:actual})}trackCliSubcommandPublish(actual){this.trackCliSubcommand({subcommand:"publish",value:actual})}trackCliSubcommandDiscard(actual){this.trackCliSubcommand({subcommand:"discard",value:actual})}trackCliSubcommandRules(actual){this.trackCliSubcommand({subcommand:"rules",value:actual})}trackCliSubcommandRulesList(actual){this.trackCliSubcommand({subcommand:"rules:list",value:actual})}trackCliSubcommandRulesInspect(actual){this.trackCliSubcommand({subcommand:"rules:inspect",value:actual})}trackCliSubcommandRulesAdd(actual){this.trackCliSubcommand({subcommand:"rules:add",value:actual})}trackCliSubcommandRulesUpdate(actual){this.trackCliSubcommand({subcommand:"rules:update",value:actual})}trackCliSubcommandRulesEnable(actual){this.trackCliSubcommand({subcommand:"rules:enable",value:actual})}trackCliSubcommandRulesDisable(actual){this.trackCliSubcommand({subcommand:"rules:disable",value:actual})}trackCliSubcommandRulesRemove(actual){this.trackCliSubcommand({subcommand:"rules:remove",value:actual})}trackCliSubcommandRulesReorder(actual){this.trackCliSubcommand({subcommand:"rules:reorder",value:actual})}trackCliSubcommandRulesMove(actual){this.trackCliSubcommand({subcommand:"rules:move",value:actual})}trackCliSubcommandIpBlocks(actual){this.trackCliSubcommand({subcommand:"ip-blocks",value:actual})}trackCliSubcommandIpBlocksList(actual){this.trackCliSubcommand({subcommand:"ip-blocks:list",value:actual})}trackCliSubcommandIpBlocksBlock(actual){this.trackCliSubcommand({subcommand:"ip-blocks:block",value:actual})}trackCliSubcommandIpBlocksUnblock(actual){this.trackCliSubcommand({subcommand:"ip-blocks:unblock",value:actual})}trackCliSubcommandSystemBypass(actual){this.trackCliSubcommand({subcommand:"system-bypass",value:actual})}trackCliSubcommandSystemBypassList(actual){this.trackCliSubcommand({subcommand:"system-bypass:list",value:actual})}trackCliSubcommandSystemBypassAdd(actual){this.trackCliSubcommand({subcommand:"system-bypass:add",value:actual})}trackCliSubcommandSystemBypassRemove(actual){this.trackCliSubcommand({subcommand:"system-bypass:remove",value:actual})}trackCliSubcommandAttackMode(actual){this.trackCliSubcommand({subcommand:"attack-mode",value:actual})}trackCliSubcommandAttackModeEnable(actual){this.trackCliSubcommand({subcommand:"attack-mode:enable",value:actual})}trackCliSubcommandAttackModeDisable(actual){this.trackCliSubcommand({subcommand:"attack-mode:disable",value:actual})}trackCliSubcommandSystemMitigations(actual){this.trackCliSubcommand({subcommand:"system-mitigations",value:actual})}trackCliSubcommandSystemMitigationsPause(actual){this.trackCliSubcommand({subcommand:"system-mitigations:pause",value:actual})}trackCliSubcommandSystemMitigationsResume(actual){this.trackCliSubcommand({subcommand:"system-mitigations:resume",value:actual})}trackCliSubcommandAlerts(actual){this.trackCliSubcommand({subcommand:"alerts",value:actual})}trackCliSubcommandAlertsList(actual){this.trackCliSubcommand({subcommand:"alerts:list",value:actual})}trackCliSubcommandAlertsInspect(actual){this.trackCliSubcommand({subcommand:"alerts:inspect",value:actual})}trackCliSubcommandPersistentActions(actual){this.trackCliSubcommand({subcommand:"persistent-actions",value:actual})}trackCliSubcommandPersistentActionsList(actual){this.trackCliSubcommand({subcommand:"persistent-actions:list",value:actual})}trackCliSubcommandPersistentActionsInspect(actual){this.trackCliSubcommand({subcommand:"persistent-actions:inspect",value:actual})}trackCliSubcommandTraffic(actual){this.trackCliSubcommand({subcommand:"traffic",value:actual})}trackCliSubcommandTrafficList(actual){this.trackCliSubcommand({subcommand:"traffic:list",value:actual})}trackCliSubcommandTrafficInspect(actual){this.trackCliSubcommand({subcommand:"traffic:inspect",value:actual})}trackCliSubcommandBotManagement(actual){this.trackCliSubcommand({subcommand:"bot-management",value:actual})}};var COMMAND_CONFIG9={overview:getCommandAliases(overviewSubcommand),status:getCommandAliases(statusSubcommand),rules:getCommandAliases(rulesSubcommand),diff:getCommandAliases(diffSubcommand),publish:getCommandAliases(publishSubcommand),discard:getCommandAliases(discardSubcommand),"ip-blocks":getCommandAliases(ipBlocksSubcommand),"system-bypass":getCommandAliases(systemBypassSubcommand),"attack-mode":getCommandAliases(attackModeSubcommand),"system-mitigations":getCommandAliases(systemMitigationsSubcommand),alerts:getCommandAliases(alertsSubcommand),"persistent-actions":getCommandAliases(persistentActionsSubcommand),traffic:getCommandAliases(trafficSubcommand),"bot-management":getCommandAliases(botManagementSubcommand)};async function main9(client){let telemetry=new FirewallTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(firewallCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),2}let subArgs=parsedArgs.args.slice(1),{subcommand,args,subcommandOriginal}=getSubcommand(subArgs,COMMAND_CONFIG9),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry.trackCliFlagHelp("firewall"),output_manager_default.print(help(firewallCommand,{columns:client.stderr.columns})),0;function printHelp(command){output_manager_default.print(help(command,{parent:firewallCommand,columns:client.stderr.columns}))}switch(subcommand&&!needHelp&&(telemetry.trackCliOptionProject(getProjectOptionFromArgs(args)),telemetry.trackCliFlagTeamLevel(args.includes("--team-level"))),subcommand){case"status":return needHelp?(telemetry.trackCliFlagHelp("firewall",subcommandOriginal),printHelp(statusSubcommand),0):(telemetry.trackCliSubcommandStatus(subcommandOriginal),status(client,args));case"overview":return needHelp?(telemetry.trackCliFlagHelp("firewall",subcommandOriginal),printHelp(overviewSubcommand),0):(telemetry.trackCliSubcommandOverview(subcommandOriginal),overview(client,args));case"diff":return needHelp?(telemetry.trackCliFlagHelp("firewall",subcommandOriginal),printHelp(diffSubcommand),0):(telemetry.trackCliSubcommandDiff(subcommandOriginal),diff(client,args));case"publish":return needHelp?(telemetry.trackCliFlagHelp("firewall",subcommandOriginal),printHelp(publishSubcommand),0):(telemetry.trackCliSubcommandPublish(subcommandOriginal),publish(client,args));case"discard":return needHelp?(telemetry.trackCliFlagHelp("firewall",subcommandOriginal),printHelp(discardSubcommand),0):(telemetry.trackCliSubcommandDiscard(subcommandOriginal),discard(client,args));case"rules":{telemetry.trackCliSubcommandRules(subcommandOriginal);let nestedArgs=needHelp?[...args,"--help"]:args;return main5(client,nestedArgs,telemetry)}case"ip-blocks":{telemetry.trackCliSubcommandIpBlocks(subcommandOriginal);let nestedArgs=needHelp?[...args,"--help"]:args;return main4(client,nestedArgs,telemetry)}case"system-bypass":{telemetry.trackCliSubcommandSystemBypass(subcommandOriginal);let nestedArgs=needHelp?[...args,"--help"]:args;return main(client,nestedArgs,telemetry)}case"attack-mode":{telemetry.trackCliSubcommandAttackMode(subcommandOriginal);let nestedArgs=needHelp?[...args,"--help"]:args;return main2(client,nestedArgs,telemetry)}case"system-mitigations":{telemetry.trackCliSubcommandSystemMitigations(subcommandOriginal);let nestedArgs=needHelp?[...args,"--help"]:args;return main3(client,nestedArgs,telemetry)}case"alerts":{telemetry.trackCliSubcommandAlerts(subcommandOriginal);let nestedArgs=needHelp?[...args,"--help"]:args;return main6(client,nestedArgs,telemetry)}case"persistent-actions":{telemetry.trackCliSubcommandPersistentActions(subcommandOriginal);let nestedArgs=needHelp?[...args,"--help"]:args;return main7(client,nestedArgs,telemetry)}case"traffic":{telemetry.trackCliSubcommandTraffic(subcommandOriginal);let nestedArgs=needHelp?[...args,"--help"]:args;return main8(client,nestedArgs,telemetry)}case"bot-management":return needHelp?(telemetry.trackCliFlagHelp("firewall",subcommandOriginal),printHelp(botManagementSubcommand),0):(telemetry.trackCliSubcommandBotManagement(subcommandOriginal),botManagement(client,args));default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG9)),output_manager_default.print(help(firewallCommand,{columns:client.stderr.columns})),2}}var FlagsTelemetryClient=class extends TelemetryClient{trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"ls",value:actual})}trackCliSubcommandInspect(actual){this.trackCliSubcommand({subcommand:"inspect",value:actual})}trackCliSubcommandVersions(actual){this.trackCliSubcommand({subcommand:"versions",value:actual})}trackCliSubcommandEvaluations(actual){this.trackCliSubcommand({subcommand:"evaluations",value:actual})}trackCliSubcommandStale(actual){this.trackCliSubcommand({subcommand:"stale",value:actual})}trackCliSubcommandOpen(actual){this.trackCliSubcommand({subcommand:"open",value:actual})}trackCliSubcommandCreate(actual){this.trackCliSubcommand({subcommand:"create",value:actual})}trackCliSubcommandUpdate(actual){this.trackCliSubcommand({subcommand:"update",value:actual})}trackCliSubcommandSet(actual){this.trackCliSubcommand({subcommand:"set",value:actual})}trackCliSubcommandTargeting(actual){this.trackCliSubcommand({subcommand:"targeting",value:actual})}trackCliSubcommandUseTargeting(actual){this.trackCliSubcommand({subcommand:"use-targeting",value:actual})}trackCliSubcommandSplit(actual){this.trackCliSubcommand({subcommand:"split",value:actual})}trackCliSubcommandRollout(actual){this.trackCliSubcommand({subcommand:"rollout",value:actual})}trackCliSubcommandDelete(actual){this.trackCliSubcommand({subcommand:"delete",value:actual})}trackCliSubcommandArchive(actual){this.trackCliSubcommand({subcommand:"archive",value:actual})}trackCliSubcommandUnarchive(actual){this.trackCliSubcommand({subcommand:"unarchive",value:actual})}trackCliSubcommandDisable(actual){this.trackCliSubcommand({subcommand:"disable",value:actual})}trackCliSubcommandEnable(actual){this.trackCliSubcommand({subcommand:"enable",value:actual})}trackCliSubcommandSdkKeys(actual){this.trackCliSubcommand({subcommand:"sdk-keys",value:actual})}trackCliSubcommandConnections(actual){this.trackCliSubcommand({subcommand:"connections",value:actual})}trackCliSubcommandSegments(actual){this.trackCliSubcommand({subcommand:"segments",value:actual})}trackCliSubcommandEntities(actual){this.trackCliSubcommand({subcommand:"entities",value:actual})}trackCliSubcommandLabels(actual){this.trackCliSubcommand({subcommand:"labels",value:actual})}trackCliSubcommandRules(actual){this.trackCliSubcommand({subcommand:"rules",value:actual})}trackCliSubcommandTargets(actual){this.trackCliSubcommand({subcommand:"targets",value:actual})}trackCliSubcommandPrepare(actual){this.trackCliSubcommand({subcommand:"prepare",value:actual})}trackCliSubcommandDatafile(actual){this.trackCliSubcommand({subcommand:"datafile",value:actual})}trackCliSubcommandOverride(actual){this.trackCliSubcommand({subcommand:"override",value:actual})}};var import_chalk42=__toESM(require_source(),1),import_ms=__toESM(require_ms(),1),import_pluralize=__toESM(require_pluralize(),1);function flagUrl(projectId,flagIdOrSlug){return`/v1/projects/${encodeURIComponent(projectId)}/feature-flags/flags/${encodeURIComponent(flagIdOrSlug)}`}async function fetchFlagForUpdate(client,projectId,flagIdOrSlug){output_manager_default.debug(`Fetching feature flag ${flagIdOrSlug} for project ${projectId} with ETag`);let response=await client.fetch(flagUrl(projectId,flagIdOrSlug),{json:!1}),etag=response.headers.get("etag");if(!etag)throw new Error("Unable to update flag safely because the flag ETag is missing.");return{flag:await response.json(),etag}}async function updateFlag(client,projectId,flagIdOrSlug,request,options){output_manager_default.debug(`Updating feature flag ${flagIdOrSlug} for project ${projectId}`);let url=flagUrl(projectId,flagIdOrSlug);return await client.fetch(url,{method:"PATCH",headers:options?.ifMatch?{"If-Match":options.ifMatch}:void 0,body:request})}var MAX_FLAGS_PAGE_LIMIT=100,MAX_FLAG_VERSIONS_PAGE_LIMIT=100;async function getFlags(client,projectId,options={}){let{state="active",tags,createdBy,maintainerIds,limit,cursor}=options;output_manager_default.debug(`Fetching feature flags for project ${projectId}`);let basePath=`/v2/projects/${encodeURIComponent(projectId)}/feature-flags/flags`,buildQuery=(pageLimit,pageCursor2)=>{let query=new URLSearchParams;query.set("state",state),query.set("limit",String(pageLimit)),pageCursor2&&query.set("cursor",pageCursor2),createdBy&&query.set("createdBy",createdBy);for(let tag of tags??[])query.append("tags",tag);for(let maintainerId of maintainerIds??[])query.append("maintainerIds",maintainerId);return query.toString()};if(limit!==void 0||cursor!==void 0){let pageLimit=Math.min(limit??MAX_FLAGS_PAGE_LIMIT,MAX_FLAGS_PAGE_LIMIT),response=await client.fetch(`${basePath}?${buildQuery(pageLimit,cursor)}`);return{flags:response.data,next:response.pagination?.next??null}}let flags=[],pageCursor;do{let response=await client.fetch(`${basePath}?${buildQuery(MAX_FLAGS_PAGE_LIMIT,pageCursor)}`);flags.push(...response.data),pageCursor=response.pagination?.next??void 0}while(pageCursor);return{flags,next:null}}async function getFlag(client,projectId,flagIdOrSlug){output_manager_default.debug(`Fetching feature flag ${flagIdOrSlug} for project ${projectId}`);let url=flagUrl(projectId,flagIdOrSlug);return await client.fetch(url)}async function getFlagSettings(client,projectId){return output_manager_default.debug(`Fetching feature flag settings for project ${projectId}`),await client.fetch(flagSettingsUrl(projectId))}async function updateFlagSettings(client,projectId,request){return output_manager_default.debug(`Updating feature flag settings for project ${projectId}`),client.fetch(flagSettingsUrl(projectId),{method:"PATCH",body:request})}function flagSettingsUrl(projectId){return`/v1/projects/${encodeURIComponent(projectId)}/feature-flags/settings`}async function getFlagVersions(client,projectId,flagIdOrSlug,options={}){output_manager_default.debug(`Fetching feature flag versions for ${flagIdOrSlug} in project ${projectId}`);let query=new URLSearchParams;query.set("withMetadata","true"),options.environment&&query.set("environment",options.environment),options.limit!==void 0&&query.set("limit",String(options.limit)),options.cursor&&query.set("cursor",options.cursor);let url=`/v1/projects/${encodeURIComponent(projectId)}/feature-flags/flags/${encodeURIComponent(flagIdOrSlug)}/versions?${query.toString()}`,response=await client.fetch(url),next=response.pagination?.next??(response.pagination?.hasNext?response.pagination.cursor:null)??null;return{versions:response.versions,next}}var FlagsLsTelemetryClient=class extends TelemetryClient{trackCliOptionState(state){state&&this.trackCliOption({option:"state",value:state})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}trackCliOptionTag(tags){tags&&tags.length>0&&this.trackCliOption({option:"tag",value:this.redactedValue})}trackCliOptionCreatedBy(createdBy){createdBy&&this.trackCliOption({option:"created-by",value:this.redactedValue})}trackCliOptionMaintainer(maintainerIds){maintainerIds&&maintainerIds.length>0&&this.trackCliOption({option:"maintainer",value:this.redactedValue})}trackCliOptionMaintainerId(maintainerIds){maintainerIds&&maintainerIds.length>0&&this.trackCliOption({option:"maintainer-id",value:this.redactedValue})}trackCliOptionLimit(limit){limit!==void 0&&this.trackCliOption({option:"limit",value:String(limit)})}trackCliOptionNext(next){next&&this.trackCliOption({option:"next",value:this.redactedValue})}};async function ls(client,argv){let telemetryClient=new FlagsLsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(listSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(err){return printError(err),2}let{flags}=parsedArgs,state=flags["--state"]||"active",tags=flags["--tag"],createdBy=flags["--created-by"],limit=flags["--limit"],next=flags["--next"],json=flags["--json"],projectName=getProjectNameFromFlags(flags),maintainer=getRenamedOption(flags,"--maintainer","--maintainer-id",{json});if(telemetryClient.trackCliOptionProject(projectName),telemetryClient.trackCliOptionState(state),telemetryClient.trackCliOptionTag(tags),telemetryClient.trackCliOptionCreatedBy(createdBy),telemetryClient.trackCliOptionMaintainer(flags["--maintainer"]),telemetryClient.trackCliOptionMaintainerId(flags["--maintainer-id"]),telemetryClient.trackCliOptionLimit(limit),telemetryClient.trackCliOptionNext(next),telemetryClient.trackCliFlagJson(json),"error"in maintainer)return reportRenamedOptionError(client,maintainer.error,{json});let maintainerIds=maintainer.value;if(limit!==void 0&&(!Number.isInteger(limit)||limit<1||limit>MAX_FLAGS_PAGE_LIMIT))return output_manager_default.error(`The --limit option must be an integer between 1 and ${MAX_FLAGS_PAGE_LIMIT}.`),2;let link=await getLinkedFlagsProject(client,projectName);if(link.status==="error")return link.exitCode;if(link.status==="not_linked")return output_manager_default.error(`Your codebase isn't linked to a project on Vercel. Pass --project <name>, or run ${getCommandName("link")} to link it.`),1;client.config.currentTeam=link.org.type==="team"?link.org.id:void 0;let{project,org}=link,projectSlugLink=formatProject(org.slug,project.name),lsStamp=stamp_default();output_manager_default.spinner(`Fetching ${state} feature flags for ${projectSlugLink}`);try{let{flags:flagsList,next:nextCursor}=await getFlags(client,project.id,{state,tags,createdBy,maintainerIds,limit,cursor:next});if(output_manager_default.stopSpinner(),json)outputJson2(client,flagsList,nextCursor,[maintainer.warning]);else if(flagsList.length===0)output_manager_default.log(`No ${state} feature flags found for ${projectSlugLink} ${import_chalk42.default.gray(lsStamp())}`);else if(output_manager_default.log(`${(0,import_pluralize.default)("feature flag",flagsList.length,!0)} found for ${projectSlugLink} ${import_chalk42.default.gray(lsStamp())}`),printFlagsTable(flagsList),nextCursor){let nextCmd=buildNextPageCommand(flags,tags,maintainerIds,nextCursor);output_manager_default.print(`
|
|
205
|
+
`),printNextPageCommand(getCommandNamePlain(nextCmd))}}catch(err){return output_manager_default.stopSpinner(),printError(err),1}return 0}function buildNextPageCommand(flags,tags,maintainerIds,nextCursor){let baseFlags=getCommandFlags(flags,["_","--tag","--maintainer","--maintainer-id","--next","--json"]),repeatable=[...(tags??[]).map(tag=>`--tag ${quoteArg(tag)}`),...(maintainerIds??[]).map(id=>`--maintainer ${quoteArg(id)}`)],suffix=repeatable.length>0?` ${repeatable.join(" ")}`:"";return`flags ls${baseFlags}${suffix} --next ${nextCursor}`}function outputJson2(client,flags,next,warnings){let jsonOutput={flags:flags.map(flag=>({id:flag.id,slug:flag.slug,description:flag.description??null,kind:flag.kind,state:flag.state,variants:flag.variants,createdAt:flag.createdAt,updatedAt:flag.updatedAt})),pagination:{next}};client.stdout.write(`${JSON.stringify(withWarnings(jsonOutput,warnings),null,2)}
|
|
206
206
|
`)}function printFlagsTable(flags){let headers=["Name","Kind","State","Variants","Updated"],now=Date.now(),rows=flags.map(flag=>[import_chalk42.default.bold(flag.slug),flag.kind,flag.state==="active"?import_chalk42.default.green(flag.state):import_chalk42.default.gray(flag.state),String(flag.variants.length),(0,import_ms.default)(now-flag.updatedAt)+" ago"]),table2=formatTable(headers,["l","l","l","r","l"],[{name:"",rows}]);output_manager_default.print(`
|
|
207
207
|
${table2}
|
|
208
208
|
`)}var import_chalk43=__toESM(require_source(),1),import_pluralize2=__toESM(require_pluralize(),1);var DEFAULT_STALE_FLAGS_LIMIT=50,MAX_STALE_FLAGS_LIMIT=100,DEFAULT_STALE_AFTER="30d",MAX_STALE_AFTER_DAYS=90;async function getStaleFlags(client,projectId,options={}){let{staleAfter=DEFAULT_STALE_AFTER,limit=DEFAULT_STALE_FLAGS_LIMIT,cursor}=options;output_manager_default.debug(`Fetching stale feature flags for project ${projectId}`);let query=new URLSearchParams;query.set("staleAfter",staleAfter),query.set("limit",String(limit)),cursor&&query.set("cursor",cursor);let response=await client.fetch(`/v1/projects/${encodeURIComponent(projectId)}/feature-flags/stale-flags?${query}`);return{flags:response.data,next:response.pagination.next}}var FlagsStaleTelemetryClient=class extends TelemetryClient{trackCliOptionStaleAfter(staleAfter){staleAfter&&this.trackCliOption({option:"stale-after",value:staleAfter})}trackCliOptionLimit(limit){limit!==void 0&&this.trackCliOption({option:"limit",value:String(limit)})}trackCliOptionNext(next){next&&this.trackCliOption({option:"next",value:this.redactedValue})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function stale(client,argv){let telemetryClient=new FlagsStaleTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(staleSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(err){return printError(err),2}let{flags}=parsedArgs,staleAfter=flags["--stale-after"]??DEFAULT_STALE_AFTER,limit=flags["--limit"]??DEFAULT_STALE_FLAGS_LIMIT,next=flags["--next"],json=flags["--json"],projectName=getProjectNameFromFlags(flags);if(telemetryClient.trackCliOptionProject(projectName),telemetryClient.trackCliOptionStaleAfter(staleAfter),telemetryClient.trackCliOptionLimit(limit),telemetryClient.trackCliOptionNext(next),telemetryClient.trackCliFlagJson(json),!Number.isInteger(limit)||limit<1||limit>MAX_STALE_FLAGS_LIMIT)return output_manager_default.error(`The --limit option must be an integer between 1 and ${MAX_STALE_FLAGS_LIMIT}.`),2;let staleAfterValidationError=getStaleAfterValidationError(staleAfter);if(staleAfterValidationError)return output_manager_default.error(staleAfterValidationError),1;let link=await getLinkedFlagsProject(client,projectName);if(link.status==="error")return link.exitCode;if(link.status==="not_linked")return output_manager_default.error(`Your codebase isn't linked to a project on Vercel. Pass --project <name>, or run ${getCommandName("link")} to link it.`),1;client.config.currentTeam=link.org.type==="team"?link.org.id:void 0;let{project,org}=link,projectSlugLink=formatProject(org.slug,project.name),staleStamp=stamp_default();output_manager_default.spinner(`Fetching stale feature flags for ${projectSlugLink}`);try{let{flags:staleFlags,next:nextCursor}=await getStaleFlags(client,project.id,{staleAfter,limit,cursor:next});output_manager_default.stopSpinner();let stalePeriod=`(past ${formatStaleAfter(staleAfter)})`;if(json)outputJson3(client,staleFlags,nextCursor,staleAfter);else if(staleFlags.length===0)output_manager_default.log(`No stale feature flags found for ${projectSlugLink} ${stalePeriod} ${import_chalk43.default.gray(staleStamp())}`);else if(output_manager_default.log(`${(0,import_pluralize2.default)("stale feature flag",staleFlags.length,!0)} found for ${projectSlugLink} ${stalePeriod} ${import_chalk43.default.gray(staleStamp())}`),printStaleFlagsTable(staleFlags),nextCursor){let nextCmd=buildNextPageCommand2(flags,nextCursor);output_manager_default.print(`
|
|
@@ -265,7 +265,7 @@ ${table2}
|
|
|
265
265
|
`);return}output_manager_default.print(`
|
|
266
266
|
${formattedDiff}
|
|
267
267
|
|
|
268
|
-
`)}function formatChangedEnvironments(environments){return environments.length===0?import_chalk49.default.gray("-"):environments.join(", ")}function getVersionAuthor(version){return version.metadata?.creator?.name??version.createdBy??null}function getVersionMessage(version){return version.message?version.message:version.revision===0?"Flag created":null}function getVersionsHelpParent(){return{...versionsSubcommand,name:"flags versions"}}function buildNextPageCommand3(flagArg,flags,nextCursor){let environment=flags["--environment"],baseFlags=getCommandFlags(flags,["_","--next","--cursor","--environment","--json"]),environmentFlag=environment?` --environment ${quoteArg(environment)}`:"";return`flags versions ${quoteArg(flagArg)}${baseFlags}${environmentFlag} --next ${quoteArg(nextCursor)}`}async function getSdkKeys(client,projectId){output_manager_default.debug(`Fetching SDK keys for project ${projectId}`);let url=`/v1/projects/${encodeURIComponent(projectId)}/feature-flags/sdk-keys`;return(await client.fetch(url)).data}async function createSdkKey(client,projectId,request){output_manager_default.debug(`Creating SDK key for project ${projectId}`);let url=`/v1/projects/${encodeURIComponent(projectId)}/feature-flags/sdk-keys`;return await client.fetch(url,{method:"PUT",body:request})}async function deleteSdkKey(client,projectId,hashKey){output_manager_default.debug(`Deleting SDK key ${hashKey} for project ${projectId}`);let url=`/v1/projects/${encodeURIComponent(projectId)}/feature-flags/sdk-keys/${encodeURIComponent(hashKey)}`;await client.fetch(url,{method:"DELETE",json:!1})}var FLAG_EVALUATIONS_METRIC="vercel.flags.evaluation",FLAG_EVALUATIONS_AGGREGATION="sum",EVALUATIONS_TIMEOUT_MS=5e3;async function countFlagEvaluations(client,options){let{ownerId,projectId,flagSlug,startTime,endTime}=options;try{let body={scope:{ownerId,projectIds:[projectId]},timeRange:{start:startTime.toISOString(),end:endTime.toISOString()},metrics:{value:{metric:FLAG_EVALUATIONS_METRIC,aggregation:FLAG_EVALUATIONS_AGGREGATION}},outputs:["value"],filter:`flagKey:${JSON.stringify(flagSlug)}`},response=await client.fetch(OBSERVABILITY_METRICS_PATH,{method:"POST",body:JSON.stringify(body),headers:{"Content-Type":"application/json"},accountId:ownerId,signal:AbortSignal.timeout(EVALUATIONS_TIMEOUT_MS),retry:{retries:0},bailOn429:!0}),total=0;for(let row of response.summary??[]){let value=Number(row.values.value);Number.isFinite(value)&&(total+=value)}return total}catch(err){return output_manager_default.debug(`Could not count evaluations for flag ${flagSlug}: ${err instanceof Error?err.message:String(err)}`),null}}var FlagsEvaluationsTelemetryClient=class extends TelemetryClient{trackCliArgumentFlag(flag){flag&&this.trackCliArgument({arg:"flag",value:this.redactedValue})}trackCliOptionSince(since){since&&this.trackCliOption({option:"since",value:this.redactedValue})}trackCliOptionUntil(until){until&&this.trackCliOption({option:"until",value:this.redactedValue})}trackCliOptionGranularity(granularity){granularity&&this.trackCliOption({option:"granularity",value:isFlagEvaluationsGranularity(granularity)?granularity:this.redactedValue})}trackCliOptionGroupBy(groupBy){groupBy&&groupBy.length>0&&this.trackCliOption({option:"group-by",value:groupBy.map(dimension=>isFlagEvaluationsDimension(dimension)?dimension:this.redactedValue).join(",")})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var FLAG_EVALUATIONS_ROLLUP=getRollupColumnName(FLAG_EVALUATIONS_METRIC,FLAG_EVALUATIONS_AGGREGATION),MAX_GROUPS=100,DEFAULT_IN_CODE_VARIANT="Default in Code",PERSONAL_ACCOUNT_MESSAGE="Flag evaluations are available for team-owned projects only. Select a team with --scope <team>.",FORBIDDEN_MESSAGE="You do not have permission to read feature flags for this project, which flag evaluations require.";function getCellValue(cell){return cell==null?"":String(cell)}function sanitizeGroupValue(value){return sanitizeForTerminal(value).replace(/\p{Cc}/gu,"")}function getEvaluationVariantValue(flag,variantId){return variantId?flag.variants.find(variant=>variant.id===variantId)?.value??null:DEFAULT_IN_CODE_VARIANT}function getVariantDisplayName(flag,variantId){if(!variantId||variantId==="(not set)"||variantId===DEFAULT_IN_CODE_VARIANT)return DEFAULT_IN_CODE_VARIANT;let variant=flag.variants.find(item=>item.id===variantId);return variant?formatVariantListSummary(variant):variantId}function getSdkKeyLabel(sdkKey){return sdkKey.label?`${sdkKey.label} (${sdkKey.environment})`:`${sdkKey.environment} ${sdkKey.type} key`}function getSdkKeyDisplayName(sdkKeys2,hashKey){if(!hashKey)return"(not set)";let sdkKey=sdkKeys2.get(hashKey);return sdkKey?getSdkKeyLabel(sdkKey):`${hashKey} (unknown or deleted key)`}function handleCommandError(client,error,jsonOutput){if(!jsonOutput)return printError(error),1;if(isAPIError(error))return outputError(client,!0,error.code||"API_ERROR",error.serverMessage||`API error (${error.status}).`);let message=error instanceof Error?error.message:String(error);return outputError(client,!0,"UNEXPECTED_ERROR",message)}function handleMetricsQueryError(client,error,jsonOutput){if(!isAPIError(error))return handleCommandError(client,error,jsonOutput);let genericForbidden=error.status===403&&(!error.serverMessage||error.serverMessage==="Forbidden"||error.serverMessage==="Response Error");return handleApiError(error,jsonOutput,client,genericForbidden?{403:{code:"FORBIDDEN",message:FORBIDDEN_MESSAGE}}:{})}function getGroupKey(row,fields){return JSON.stringify(fields.map(field=>getCellValue(row[field])))}function limitEvaluationGroups(response,fields){if(response.summary.length<=MAX_GROUPS)return{response,truncated:!1};let summary=response.summary.slice(0,MAX_GROUPS),visibleGroups=new Set(summary.map(row=>getGroupKey(row,fields)));return{response:{...response,summary,data:response.data?.filter(row=>visibleGroups.has(getGroupKey(row,fields)))},truncated:!0}}function formatEvaluationsJson(flag,dimensions,sdkKeys2,response,startTime,endTime,granularity,truncated){return`${JSON.stringify({flag:flag?.slug??null,...flag?{variants:Object.fromEntries(flag.variants.map(({id,value})=>[id,value]))}:{},groupBy:dimensions,startTime:startTime.toISOString(),endTime:endTime.toISOString(),granularity,truncated,buckets:(response.data??[]).map(row=>{let bucket={timestamp:row.timestamp};for(let dimension of dimensions){let value=getCellValue(row[FLAG_EVALUATIONS_DIMENSIONS[dimension].field]);switch(dimension){case"variant":bucket.variantId=value,bucket.variantValue=flag?getEvaluationVariantValue(flag,value):null;break;case"flag":bucket.flagKey=value;break;case"sdk-key":{let sdkKey=sdkKeys2.get(value);bucket.sdkKeyId=value,bucket.sdkKeyLabel=sdkKey?.label??null,bucket.sdkKeyEnvironment=sdkKey?.environment??null;break}case"client":bucket.clientName=value;break;case"environment":bucket.environment=value;break;case"reason":bucket.reason=value;break}}return bucket.evaluations=row[FLAG_EVALUATIONS_ROLLUP]??null,bucket})},null,2)}
|
|
268
|
+
`)}function formatChangedEnvironments(environments){return environments.length===0?import_chalk49.default.gray("-"):environments.join(", ")}function getVersionAuthor(version){return version.metadata?.creator?.name??version.createdBy??null}function getVersionMessage(version){return version.message?version.message:version.revision===0?"Flag created":null}function getVersionsHelpParent(){return{...versionsSubcommand,name:"flags versions"}}function buildNextPageCommand3(flagArg,flags,nextCursor){let environment=flags["--environment"],baseFlags=getCommandFlags(flags,["_","--next","--cursor","--environment","--json"]),environmentFlag=environment?` --environment ${quoteArg(environment)}`:"";return`flags versions ${quoteArg(flagArg)}${baseFlags}${environmentFlag} --next ${quoteArg(nextCursor)}`}async function getSdkKeys(client,projectId){output_manager_default.debug(`Fetching SDK keys for project ${projectId}`);let url=`/v1/projects/${encodeURIComponent(projectId)}/feature-flags/sdk-keys`;return(await client.fetch(url)).data}async function createSdkKey(client,projectId,request){output_manager_default.debug(`Creating SDK key for project ${projectId}`);let url=`/v1/projects/${encodeURIComponent(projectId)}/feature-flags/sdk-keys`;return await client.fetch(url,{method:"PUT",body:request})}async function deleteSdkKey(client,projectId,hashKey){output_manager_default.debug(`Deleting SDK key ${hashKey} for project ${projectId}`);let url=`/v1/projects/${encodeURIComponent(projectId)}/feature-flags/sdk-keys/${encodeURIComponent(hashKey)}`;await client.fetch(url,{method:"DELETE",json:!1})}var FLAG_EVALUATIONS_METRIC="vercel.flags.evaluation",FLAG_EVALUATIONS_AGGREGATION="sum",EVALUATIONS_TIMEOUT_MS=5e3;async function countFlagEvaluations(client,options){let{ownerId,projectId,flagSlug,startTime,endTime}=options;try{let body={scope:{ownerId,projectIds:[projectId]},timeRange:{start:startTime.toISOString(),end:endTime.toISOString()},metrics:{value:{metric:FLAG_EVALUATIONS_METRIC,aggregation:FLAG_EVALUATIONS_AGGREGATION}},outputs:["value"],filter:`flagKey:${JSON.stringify(flagSlug)}`},response=await client.fetch(OBSERVABILITY_METRICS_PATH,{method:"POST",body:JSON.stringify(body),headers:{"Content-Type":"application/json"},accountId:ownerId,signal:AbortSignal.timeout(EVALUATIONS_TIMEOUT_MS),retry:{retries:0},bailOn429:!0}),total=0;for(let row of response.summary??[]){let value=Number(row.values.value);Number.isFinite(value)&&(total+=value)}return total}catch(err){return output_manager_default.debug(`Could not count evaluations for flag ${flagSlug}: ${err instanceof Error?err.message:String(err)}`),null}}var FlagsEvaluationsTelemetryClient=class extends TelemetryClient{trackCliArgumentFlag(flag){flag&&this.trackCliArgument({arg:"flag",value:this.redactedValue})}trackCliOptionSince(since){since&&this.trackCliOption({option:"since",value:this.redactedValue})}trackCliOptionUntil(until){until&&this.trackCliOption({option:"until",value:this.redactedValue})}trackCliOptionGranularity(granularity){granularity&&this.trackCliOption({option:"granularity",value:isFlagEvaluationsGranularity(granularity)?granularity:this.redactedValue})}trackCliOptionGroupBy(groupBy){groupBy&&groupBy.length>0&&this.trackCliOption({option:"group-by",value:groupBy.map(dimension=>isFlagEvaluationsDimension(dimension)?dimension:this.redactedValue).join(",")})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var FLAG_EVALUATIONS_ROLLUP=getRollupColumnName(FLAG_EVALUATIONS_METRIC,FLAG_EVALUATIONS_AGGREGATION),MAX_GROUPS=100,DEFAULT_IN_CODE_VARIANT="Default in Code",PERSONAL_ACCOUNT_MESSAGE="Flag evaluations are available for team-owned projects only. Select a team with --scope <team>.",FORBIDDEN_MESSAGE="You do not have permission to read feature flags for this project, which flag evaluations require.";function getCellValue(cell){return cell==null?"":String(cell)}function sanitizeGroupValue(value){return sanitizeForTerminal(value).replace(/\p{Cc}/gu,"")}function getEvaluationVariantValue(flag,variantId){return variantId?flag.variants.find(variant=>variant.id===variantId)?.value??null:DEFAULT_IN_CODE_VARIANT}function getVariantDisplayName(flag,variantId){if(!variantId||variantId==="(not set)"||variantId===DEFAULT_IN_CODE_VARIANT)return DEFAULT_IN_CODE_VARIANT;let variant=flag.variants.find(item=>item.id===variantId);return variant?formatVariantListSummary(variant):variantId}function getSdkKeyLabel(sdkKey){return sdkKey.label?`${sdkKey.label} (${sdkKey.environment})`:`${sdkKey.environment} ${sdkKey.type} key`}function getSdkKeyDisplayName(sdkKeys2,hashKey){if(!hashKey)return"(not set)";let sdkKey=sdkKeys2.get(hashKey);return sdkKey?getSdkKeyLabel(sdkKey):`${hashKey} (unknown or deleted key)`}function handleCommandError(client,error,jsonOutput){if(!jsonOutput)return printError(error),1;if(isAPIError(error))return outputError(client,!0,error.code||"API_ERROR",error.serverMessage||`API error (${error.status}).`);let message=error instanceof Error?error.message:String(error);return outputError(client,!0,"UNEXPECTED_ERROR",message)}function handleMetricsQueryError(client,error,jsonOutput){if(!isAPIError(error))return handleCommandError(client,error,jsonOutput);let genericForbidden=error.status===403&&(!error.serverMessage||error.serverMessage==="Forbidden"||error.serverMessage==="Response Error");return handleApiError(error,jsonOutput,client,genericForbidden?{403:{code:"FORBIDDEN",message:FORBIDDEN_MESSAGE}}:{})}function getGroupKey(row,fields){return JSON.stringify(fields.map(field=>getCellValue(row[field])))}function limitEvaluationGroups(response,fields){if(response.summary.length<=MAX_GROUPS)return{response,truncated:!1};let summary=response.summary.slice(0,MAX_GROUPS),visibleGroups=new Set(summary.map(row=>getGroupKey(row,fields)));return{response:{...response,summary,data:response.data?.filter(row=>visibleGroups.has(getGroupKey(row,fields)))},truncated:!0}}function formatEvaluationsJson(flag,dimensions,sdkKeys2,response,startTime,endTime,granularity,truncated){return`${JSON.stringify({flag:flag?.slug??null,...flag?{variants:Object.fromEntries(flag.variants.map(({id,value})=>[id,value]))}:{},groupBy:dimensions,startTime:startTime.toISOString(),endTime:endTime.toISOString(),granularity,truncated,buckets:(response.data??[]).map(row=>{let bucket={timestamp:row.timestamp};for(let dimension of dimensions){let value=getCellValue(row[FLAG_EVALUATIONS_DIMENSIONS[dimension].field]);switch(dimension){case"variant":bucket.variantId=value,bucket.variantValue=flag?getEvaluationVariantValue(flag,value):null;break;case"flag":bucket.flagKey=value;break;case"sdk-key":{let sdkKey=sdkKeys2.get(value);bucket.sdkKeyId=value,bucket.sdkKeyLabel=sdkKey?.label??null,bucket.sdkKeyEnvironment=sdkKey?.environment??null;break}case"client":bucket.clientName=value;break;case"environment":bucket.environment=value;break;case"reason":bucket.reason=value;break;case"datafile-revision":bucket.datafileRevision=value;break}}return bucket.evaluations=row[FLAG_EVALUATIONS_ROLLUP]??null,bucket})},null,2)}
|
|
269
269
|
`}async function evaluations(client,argv){let telemetry=new FlagsEvaluationsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(evaluationsSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags}=parsedArgs,[flagArgument]=args,projectName=getProjectNameFromFlags(flags),since=flags["--since"],until=flags["--until"],granularity=flags["--granularity"],groupByArguments=flags["--group-by"]??[];telemetry.trackCliArgumentFlag(flagArgument),telemetry.trackCliOptionProject(projectName),telemetry.trackCliOptionSince(since),telemetry.trackCliOptionUntil(until),telemetry.trackCliOptionGranularity(granularity),telemetry.trackCliOptionGroupBy(groupByArguments.length>0?groupByArguments:void 0),telemetry.trackCliFlagJson(flags["--json"]);let jsonOutput=flags["--json"]??!1;if(granularity&&!isFlagEvaluationsGranularity(granularity))return outputError(client,jsonOutput,"INVALID_GRANULARITY",`Invalid granularity "${granularity}". Use one of: ${FLAG_EVALUATIONS_GRANULARITIES.join(", ")}.`);let invalidDimension=groupByArguments.find(dimension=>!isFlagEvaluationsDimension(dimension));if(invalidDimension!==void 0)return outputError(client,jsonOutput,"INVALID_GROUP_BY",`Invalid group-by dimension "${invalidDimension}". Use one of: ${FLAG_EVALUATIONS_DIMENSION_NAMES.join(", ")}.`);let dimensions=Array.from(new Set(groupByArguments.filter(isFlagEvaluationsDimension)));if(dimensions.length===0&&dimensions.push(flagArgument?"variant":"flag"),!flagArgument&&dimensions.includes("variant"))return outputError(client,jsonOutput,"MISSING_FLAG",`Grouping by variant needs a flag, because variants belong to one flag. Pass a flag: ${getCommandName("flags evaluations <flag> --group-by variant")}, or group the whole project by another dimension.`);let startTime,endTime,resolvedGranularity;try{if({startTime,endTime}=resolveTimeRange(since,until),startTime.getTime()>=endTime.getTime())throw new Error("The start time must be before the end time.");resolvedGranularity=computeGranularity(endTime.getTime()-startTime.getTime(),granularity),{startTime,endTime}=alignTimeRangeToGranularity(startTime,endTime,resolvedGranularity.duration)}catch(error){let message=error instanceof Error?error.message:String(error);return outputError(client,jsonOutput,"INVALID_TIME",message)}!jsonOutput&&resolvedGranularity.adjusted&&resolvedGranularity.notice&&output_manager_default.log(`Notice: ${resolvedGranularity.notice}`);let link;try{link=await getLinkedFlagsProject(client,projectName,{projectNotFoundHandling:jsonOutput?"return":"report"})}catch(error){return handleCommandError(client,error,jsonOutput)}if(link.status==="error")return jsonOutput?outputError(client,!0,"PROJECT_RESOLUTION_FAILED","Unable to resolve the requested Vercel project."):link.exitCode;if(link.status==="not_linked"){let code=projectName?"PROJECT_NOT_FOUND":"NOT_LINKED",message=projectName?`Project "${projectName}" was not found in the current scope.`:`Your codebase isn't linked to a project on Vercel. Pass --project <name>, or run ${getCommandName("link")} to link it.`;return outputError(client,jsonOutput,code,message)}if(link.org.type!=="team")return outputError(client,jsonOutput,"MISSING_SCOPE",PERSONAL_ACCOUNT_MESSAGE);client.config.currentTeam=link.org.id;let{project,org}=link,flag,sdkKeys2=new Map;try{let[resolvedFlag,resolvedSdkKeys]=await Promise.all([flagArgument?getFlag(client,project.id,flagArgument):void 0,dimensions.includes("sdk-key")?getSdkKeys(client,project.id).catch(error=>(output_manager_default.debug(`Could not load SDK keys: ${String(error)}`),jsonOutput||output_manager_default.warn("Could not load SDK key labels; SDK keys are shown as hashes."),[])):[]]);flag=resolvedFlag;for(let sdkKey of resolvedSdkKeys)sdkKeys2.set(sdkKey.hashKey,sdkKey)}catch(error){return handleCommandError(client,error,jsonOutput)}jsonOutput||output_manager_default.spinner("Querying flag evaluations...");let scope={type:"project",ownerId:org.id,projectIds:[project.id]},groupByFields=dimensions.map(dimension=>FLAG_EVALUATIONS_DIMENSIONS[dimension].field),response;try{let body=createCanonicalMetricsRequest({scope,metric:FLAG_EVALUATIONS_METRIC,selection:{metric:FLAG_EVALUATIONS_METRIC,aggregation:FLAG_EVALUATIONS_AGGREGATION},startTime,endTime,granularity:resolvedGranularity.duration,groupBy:groupByFields,filter:flag?`flagKey:${JSON.stringify(flag.slug)}`:void 0,limit:MAX_GROUPS+1,orderBy:"value",orderDirection:"desc"}),canonicalResponse=await client.fetch(OBSERVABILITY_METRICS_PATH,{method:"POST",body:JSON.stringify(body),headers:{"Content-Type":"application/json"},accountId:org.id,bailOn429:!0});response=canonicalResponseToMetricsResponse(canonicalResponse,FLAG_EVALUATIONS_ROLLUP,"value","desc")}catch(error){return handleMetricsQueryError(client,error,jsonOutput)}finally{jsonOutput||output_manager_default.stopSpinner()}let limited=limitEvaluationGroups(response,groupByFields);if(jsonOutput)return client.stdout.write(formatEvaluationsJson(flag,dimensions,sdkKeys2,limited.response,startTime,endTime,resolvedGranularity.duration,limited.truncated)),0;let headings=dimensions.map(dimension=>FLAG_EVALUATIONS_DIMENSIONS[dimension].heading);if(limited.truncated){let subject=headings.length===1?headings[0].toLowerCase():"groups";output_manager_default.warn(`Results are limited to the ${MAX_GROUPS} most evaluated ${subject}.`)}let headingToDimension=new Map(dimensions.map((dimension,index)=>[headings[index],dimension]));return client.stdout.write(formatText({...limited.response,data:limited.response.data?.map(row=>({...row,...Object.fromEntries(dimensions.map((dimension,index)=>[headings[index],getCellValue(row[FLAG_EVALUATIONS_DIMENSIONS[dimension].field])]))}))},{metric:FLAG_EVALUATIONS_METRIC,metricUnit:"count",aggregation:FLAG_EVALUATIONS_AGGREGATION,groupBy:headings,scope,projectName:project.name,teamName:org.slug,periodStart:startTime.toISOString(),periodEnd:endTime.toISOString(),granularity:resolvedGranularity.duration,presentation:{compact:!0,formatGroupValue:(field,value)=>{switch(headingToDimension.get(field)){case"variant":return sanitizeGroupValue(flag?getVariantDisplayName(flag,value):value);case"sdk-key":return sanitizeGroupValue(getSdkKeyDisplayName(sdkKeys2,value));default:return sanitizeGroupValue(value)||"(not set)"}}}})),0}var import_chalk50=__toESM(require_source(),1);async function createFlag(client,projectId,request){let url=`/v1/projects/${encodeURIComponent(projectId)}/feature-flags/flags`;output_manager_default.debug(`Creating feature flag ${request.slug} for project ${projectId}`),output_manager_default.debug(`API endpoint: PUT ${url}`),output_manager_default.debug(`Request body: ${JSON.stringify(request,null,2)}`);try{let response=await client.fetch(url,{method:"PUT",body:request});return output_manager_default.debug(`Response: ${JSON.stringify(response,null,2)}`),response}catch(err){if(output_manager_default.debug("API error occurred"),err instanceof Error){output_manager_default.debug(`Error message: ${err.message}`),output_manager_default.debug(`Error name: ${err.name}`),output_manager_default.debug(`Error stack: ${err.stack}`);let errWithBody=err;errWithBody.status&&output_manager_default.debug(`Error status: ${errWithBody.status}`),errWithBody.body&&output_manager_default.debug(`Error body: ${JSON.stringify(errWithBody.body,null,2)}`)}throw err}}var FlagsCreateTelemetryClient=class extends TelemetryClient{trackCliArgumentSlug(slug){slug&&this.trackCliArgument({arg:"slug",value:this.redactedValue})}trackCliOptionKind(kind){kind&&this.trackCliOption({option:"kind",value:kind})}trackCliOptionDescription(description){description&&this.trackCliOption({option:"description",value:this.redactedValue})}trackCliOptionVariant(variants){variants?.length&&this.trackCliOption({option:"variant",value:this.redactedValue})}trackCliOptionDefaultVariant(defaultVariant){defaultVariant&&this.trackCliOption({option:"default-variant",value:this.redactedValue})}trackCliOptionEnvironmentVariant(environmentVariants){if(environmentVariants?.length){let environments=environmentVariants.map(input=>input.split("=")[0].trim()),allStandard=environments.every(environment=>STANDARD_ENVIRONMENTS.includes(environment));this.trackCliOption({option:"environment-variant",value:allStandard?STANDARD_ENVIRONMENTS.filter(environment=>environments.includes(environment)).join(","):this.redactedValue})}}};import{randomBytes}from"node:crypto";var VARIANT_ID_ALPHABET="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";function generateVariantId(size=21){let bytes=randomBytes(size),id="";for(let index=0;index<size;index++)id+=VARIANT_ID_ALPHABET[bytes[index]%VARIANT_ID_ALPHABET.length];return id}function parseVariantInput(input,kind,index){let{rawValue,rawLabel}=splitVariantInput(input,kind),validationError=validateVariantValue(rawValue,kind);if(validationError)throw new Error(`Invalid variant "${input}": ${validationError}`);return{id:generateVariantId(),value:parseVariantValue2(rawValue,kind),label:getVariantLabel(rawLabel,kind,index),description:""}}function validateVariantValue(value,kind){if(!value.trim())return"Variant value cannot be empty";if(kind==="boolean"){let loweredValue=value.toLowerCase();if(loweredValue!=="true"&&loweredValue!=="false")return"Boolean variant values must be true or false"}if(kind==="number"){let parsed=Number(value);if(!Number.isFinite(parsed))return"Number variants must be valid numeric values"}return kind==="json"&&!isValidJsonVariantValue(value)?"JSON variant values must be valid JSON":null}function splitVariantInput(input,kind){if(kind!=="json"){let separatorIndex=input.indexOf("=");return{rawValue:separatorIndex===-1?input.trim():input.slice(0,separatorIndex).trim(),rawLabel:separatorIndex===-1?void 0:input.slice(separatorIndex+1).trim()||void 0}}let trimmed=input.trim();if(isValidJsonVariantValue(trimmed))return{rawValue:trimmed};for(let index=trimmed.length-1;index>=0;index--){if(trimmed[index]!=="=")continue;let rawValue=trimmed.slice(0,index).trim(),rawLabel=trimmed.slice(index+1).trim();if(!(!rawValue||!isValidJsonVariantValue(rawValue)))return{rawValue,rawLabel:rawLabel||void 0}}return{rawValue:trimmed}}function getVariantLabel(rawLabel,kind,index){if(rawLabel)return rawLabel;if(kind==="json")return`Variant ${index+1}`}function parseVariantValue2(value,kind){return kind==="number"?Number(value):kind==="json"?JSON.parse(value):value}function isValidJsonVariantValue(value){try{return JSON.parse(value),!0}catch{return!1}}function normalizeOptionalInput(input){let value=input?.trim();return value||void 0}async function resolveOptionalInput(client,input,defaultValue,promptMessage){let value=normalizeOptionalInput(input);if(value!==void 0)return value;if(!client.stdin.isTTY)return defaultValue;let response=await client.input.text({message:promptMessage,default:defaultValue});return normalizeOptionalInput(response)||defaultValue}async function create(client,argv){let telemetryClient=new FlagsCreateTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(createSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(err){return printError(err),2}let{args,flags}=parsedArgs,[slug]=args;if(!slug)return output_manager_default.error("Please provide a slug for the feature flag"),output_manager_default.log(`Example: ${getCommandName("flags create my-feature")}`),2;let kind=flags["--kind"]||"boolean",description=flags["--description"],variantInputs=flags["--variant"]||[],defaultVariantSelector=normalizeOptionalInput(flags["--default-variant"]),environmentVariantInputs=flags["--environment-variant"]||[],projectName=getProjectNameFromFlags(flags);if(telemetryClient.trackCliArgumentSlug(slug),telemetryClient.trackCliOptionProject(projectName),telemetryClient.trackCliOptionKind(kind),telemetryClient.trackCliOptionDescription(description),telemetryClient.trackCliOptionVariant(variantInputs),telemetryClient.trackCliOptionDefaultVariant(defaultVariantSelector),telemetryClient.trackCliOptionEnvironmentVariant(environmentVariantInputs),kind!=="boolean"&&kind!=="string"&&kind!=="number"&&kind!=="json")return output_manager_default.error(`Invalid kind: ${kind}. Must be one of: boolean, string, number, json`),2;let environmentVariantSelectors;try{environmentVariantSelectors=parseEnvironmentVariantInputs(environmentVariantInputs)}catch(err){return output_manager_default.error(err.message),2}let link=await getLinkedFlagsProject(client,projectName);if(link.status==="error")return link.exitCode;if(link.status==="not_linked")return output_manager_default.error(`Your codebase isn't linked to a project on Vercel. Pass --project <name>, or run ${getCommandName("link")} to link it.`),1;client.config.currentTeam=link.org.type==="team"?link.org.id:void 0;let{project}=link,projectSlugLink=formatProject(link.org.slug,project.name),variants;try{variants=await getVariants(client,kind,variantInputs)}catch(err){return output_manager_default.error(err.message),1}let environments;try{environments=resolveEnvironments(kind,variants,defaultVariantSelector,environmentVariantSelectors)}catch(err){return output_manager_default.error(err.message),2}let request={slug,kind,description:description||"",variants,environments};try{output_manager_default.spinner("Creating feature flag...");let flag=await createFlag(client,project.id,request);output_manager_default.stopSpinner(),output_manager_default.success(`Feature flag ${import_chalk50.default.bold(flag.slug)} created successfully`),printFlagDetails({flag,projectSlugLink,orgSlug:link.org.slug,projectName:project.name,showTimestamps:!1})}catch(err){return output_manager_default.stopSpinner(),printError(err),1}return 0}async function getVariants(client,kind,variantInputs){if(kind==="boolean"){if(variantInputs.length>0)throw new Error("Boolean flags always use true/false variants. Omit --variant when creating a boolean flag.");return getDefaultVariants(kind)}if(variantInputs.length>0)return variantInputs.map((input,index)=>parseVariantInput(input,kind,index));if(!client.stdin.isTTY)throw new Error("Missing required flag --variant. Use --variant <value>[=label] (repeat as needed), or run interactively in a terminal.");return collectVariantsInteractively(client,kind)}async function collectVariantsInteractively(client,kind){let variants=[],addAnother=!0;for(;addAnother||variants.length===0;){let variantNumber=variants.length+1,valueInput=await client.input.text({message:kind==="json"?`Enter JSON value for variant ${variantNumber}:`:`Enter value for variant ${variantNumber}:`,validate:value=>{let result=validateVariantValue(value,kind);return result===null?!0:result}}),label=await client.input.text({message:`Enter an optional label for variant ${variantNumber}:`});variants.push(parseVariantInput(formatVariantInput(valueInput,label),kind,variants.length)),addAnother=await client.input.confirm("Add another variant?",!1)}return variants}function parseEnvironmentVariantInputs(inputs){let selectors={};for(let input of inputs){let separatorIndex=input.indexOf("="),environment=separatorIndex===-1?input.trim():input.slice(0,separatorIndex).trim(),variant=separatorIndex===-1?"":input.slice(separatorIndex+1).trim();if(!environment||!variant)throw new Error(`Invalid --environment-variant ${import_chalk50.default.bold(input)}. Use ENVIRONMENT=VARIANT, for example development=true.`);if(!STANDARD_ENVIRONMENTS.includes(environment))throw new Error(`Invalid environment in --environment-variant ${import_chalk50.default.bold(input)}. Must be one of: ${STANDARD_ENVIRONMENTS.join(", ")}`);let standardEnvironment=environment;if(selectors[standardEnvironment]!==void 0)throw new Error(`--environment-variant was passed more than once for ${import_chalk50.default.bold(environment)}. Pass each environment once.`);selectors[standardEnvironment]=variant}return selectors}function resolveEnvironments(kind,variants,defaultVariantSelector,environmentVariantSelectors){let defaultVariant=defaultVariantSelector?resolveVariantOrThrow(defaultVariantSelector,variants,"--default-variant"):void 0,environments={};for(let environment of STANDARD_ENVIRONMENTS){let selector=environmentVariantSelectors[environment],variant=selector?resolveVariantOrThrow(selector,variants,"--environment-variant",`${environment}=${selector}`):defaultVariant??getDefaultEnvironmentVariant(kind,variants,environment);environments[environment]=createEnvironmentConfig(variant.id,variant.id,!1)}return environments}function getDefaultEnvironmentVariant(kind,variants,environment){return kind==="boolean"&&environment==="development"?variants[1]:variants[0]}function createEnvironmentConfig(pausedVariantId,fallthroughVariantId,active){return{revision:0,active,pausedOutcome:{type:"variant",variantId:pausedVariantId},fallthrough:{type:"variant",variantId:fallthroughVariantId},rules:[],reuse:{active:!1,environment:""}}}function formatVariantInput(valueInput,label){let trimmedLabel=label.trim();return trimmedLabel?`${valueInput}=${trimmedLabel}`:valueInput}function getDefaultVariants(kind){switch(kind){case"boolean":return[{id:generateVariantId(),value:!1,label:"Off",description:"not enabled"},{id:generateVariantId(),value:!0,label:"On",description:"enabled"}];case"string":case"number":case"json":throw new Error(`Default variants are not supported for kind: ${kind}`)}}var import_open=__toESM(require_open(),1);var FlagsOpenTelemetryClient=class extends TelemetryClient{trackCliArgumentFlag(flag){flag&&this.trackCliArgument({arg:"flag",value:this.redactedValue})}};async function openFlag(client,argv){let telemetryClient=new FlagsOpenTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(openSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(err){return printError(err),2}let{args,flags}=parsedArgs,[flagArg,extraArg]=args,projectName=getProjectNameFromFlags(flags);if(extraArg)return output_manager_default.error(`Too many arguments. Usage: ${getCommandName("flags open [flag]")}`),2;telemetryClient.trackCliArgumentFlag(flagArg),telemetryClient.trackCliOptionProject(projectName);let link=await getLinkedFlagsProject(client,projectName);if(link.status==="error")return link.exitCode;if(link.status==="not_linked")return output_manager_default.error(`Your codebase isn't linked to a project on Vercel. Pass --project <name>, or run ${getCommandName("link")} to link it.`),1;client.config.currentTeam=link.org.type==="team"?link.org.id:void 0;let{project,org}=link;try{let url=getFlagsDashboardUrl(org.slug,project.name),label="feature flags dashboard";if(flagArg){output_manager_default.spinner("Fetching flag...");let flag=await getFlag(client,project.id,flagArg);output_manager_default.stopSpinner(),url=getFlagDashboardUrl(org.slug,project.name,flag.slug),label=`feature flag ${flag.slug}`}client.stdout.isTTY?(output_manager_default.log(`Opening ${label} in your browser...`),output_manager_default.log(`Visit this URL if the browser does not open: ${url}`),(0,import_open.default)(url).catch(()=>{})):client.stdout.write(`${url}
|
|
270
270
|
`)}catch(err){return output_manager_default.stopSpinner(),printError(err),1}return 0}function logArchivedFlagNotice(flag){flag.state==="archived"&&output_manager_default.log("This flag remains archived. Changes will not affect flag evaluation until it is unarchived.")}var import_chalk51=__toESM(require_source(),1),import_fast_deep_equal3=__toESM(require_fast_deep_equal(),1);function findVariantReferencePaths(flag,variantIds){let trackedVariantIds=new Set(variantIds),references=new Map;for(let[environmentName,environmentConfig]of Object.entries(flag.environments))collectEnvironmentReferencePaths(environmentName,environmentConfig,trackedVariantIds,references);return new Map(Array.from(references.entries(),([variantId,paths])=>[variantId,Array.from(paths).sort()]))}function collectEnvironmentReferencePaths(environmentName,environmentConfig,trackedVariantIds,references){collectOutcomeReferencePaths(environmentConfig.pausedOutcome,`${environmentName}.pausedOutcome`,trackedVariantIds,references),collectOutcomeReferencePaths(environmentConfig.fallthrough,`${environmentName}.fallthrough`,trackedVariantIds,references);for(let[ruleIndex,rule]of environmentConfig.rules.entries())collectOutcomeReferencePaths(rule.outcome,`${environmentName}.rules[${ruleIndex}].outcome`,trackedVariantIds,references);if(environmentConfig.targets){for(let[variantId,entityKinds]of Object.entries(environmentConfig.targets))if(trackedVariantIds.has(variantId))for(let[entityKind,attributes]of Object.entries(entityKinds))for(let[attribute,values]of Object.entries(attributes))values.length!==0&&addReferencePath(references,variantId,`${environmentName}.targets.${entityKind}.${attribute}`)}}function collectOutcomeReferencePaths(outcome,basePath,trackedVariantIds,references){if(outcome)switch(outcome.type){case"variant":trackedVariantIds.has(outcome.variantId)&&addReferencePath(references,outcome.variantId,basePath);return;case"split":collectSplitOutcomeReferencePaths(outcome,basePath,trackedVariantIds,references);return;case"rollout":collectRolloutOutcomeReferencePaths(outcome,basePath,trackedVariantIds,references);return;default:return}}function collectSplitOutcomeReferencePaths(outcome,basePath,trackedVariantIds,references){trackedVariantIds.has(outcome.defaultVariantId)&&addReferencePath(references,outcome.defaultVariantId,`${basePath}.default`);for(let variantId of Object.keys(outcome.weights))trackedVariantIds.has(variantId)&&addReferencePath(references,variantId,`${basePath}.weights.${variantId}`)}function collectRolloutOutcomeReferencePaths(outcome,basePath,trackedVariantIds,references){trackedVariantIds.has(outcome.rollFromVariantId)&&addReferencePath(references,outcome.rollFromVariantId,`${basePath}.from`),trackedVariantIds.has(outcome.rollToVariantId)&&addReferencePath(references,outcome.rollToVariantId,`${basePath}.to`),trackedVariantIds.has(outcome.defaultVariantId)&&addReferencePath(references,outcome.defaultVariantId,`${basePath}.default`)}function addReferencePath(references,variantId,path){let paths=references.get(variantId);paths||(paths=new Set,references.set(variantId,paths)),paths.add(path)}var FlagsUpdateTelemetryClient=class extends TelemetryClient{trackCliArgumentFlag(flag){flag&&this.trackCliArgument({arg:"flag",value:this.redactedValue})}trackCliOptionVariant(variant){variant&&this.trackCliOption({option:"variant",value:this.redactedValue})}trackCliOptionValue(value){value&&this.trackCliOption({option:"value",value:this.redactedValue})}trackCliOptionLabel(label){label&&this.trackCliOption({option:"label",value:this.redactedValue})}trackCliOptionAddVariant(addVariant){addVariant?.length&&this.trackCliOption({option:"add-variant",value:this.redactedValue})}trackCliOptionRemoveVariant(removeVariant){removeVariant?.length&&this.trackCliOption({option:"remove-variant",value:this.redactedValue})}trackCliOptionMessage(message){message&&this.trackCliOption({option:"message",value:this.redactedValue})}trackCliFlagYes(yes){yes&&this.trackCliFlag("yes")}};var DEFAULT_UPDATE_MESSAGE="Updated via CLI";async function update(client,argv){let telemetryClient=new FlagsUpdateTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(updateSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(err){return printError(err),2}let{args,flags}=parsedArgs,[flagArg]=args,variantSelector=normalizeOptionalInput(flags["--variant"]),valueInput=normalizeOptionalInput(flags["--value"]),label=normalizeOptionalInput(flags["--label"]),addVariantInputs=flags["--add-variant"]||[],removeVariantSelectors=flags["--remove-variant"]||[],skipConfirmation=flags["--yes"],message=normalizeOptionalInput(flags["--message"]),projectName=getProjectNameFromFlags(flags);if(!flagArg)return output_manager_default.error("Please provide a flag slug or ID to update"),output_manager_default.log(`Example: ${getCommandName('flags update my-feature --variant control --value welcome-back --label "Welcome back"')}`),2;telemetryClient.trackCliArgumentFlag(flagArg),telemetryClient.trackCliOptionProject(projectName),telemetryClient.trackCliOptionVariant(variantSelector),telemetryClient.trackCliOptionValue(valueInput),telemetryClient.trackCliOptionLabel(label),telemetryClient.trackCliOptionAddVariant(addVariantInputs),telemetryClient.trackCliOptionRemoveVariant(removeVariantSelectors),telemetryClient.trackCliOptionMessage(message),telemetryClient.trackCliFlagYes(skipConfirmation);let hasVariantMutations=addVariantInputs.length>0||removeVariantSelectors.length>0;if(hasVariantMutations&&hasLegacyVariantEditOptions(variantSelector,valueInput,label))return output_manager_default.error("Cannot mix --variant, --value, or --label with --add-variant or --remove-variant."),1;let link=await getLinkedFlagsProject(client,projectName);if(link.status==="error")return link.exitCode;if(link.status==="not_linked")return output_manager_default.error(`Your codebase isn't linked to a project on Vercel. Pass --project <name>, or run ${getCommandName("link")} to link it.`),1;client.config.currentTeam=link.org.type==="team"?link.org.id:void 0;let{project}=link;try{return hasVariantMutations?await updateFlagVariants(client,project.id,flagArg,{addVariantInputs,removeVariantSelectors,skipConfirmation:skipConfirmation||!1,message}):await updateExistingVariant(client,project.id,flagArg,{selector:variantSelector,valueInput,label,message})}catch(err){return output_manager_default.stopSpinner(),isAPIError(err)&&err.status===412?(output_manager_default.error("Flag changed while updating; re-run the command."),1):(printError(err),1)}}async function updateExistingVariant(client,projectId,flagArg,input){output_manager_default.spinner("Fetching flag...");let{flag,etag}=await fetchFlagForUpdate(client,projectId,flagArg);if(output_manager_default.stopSpinner(),logArchivedFlagNotice(flag),rejectExperimentOwnedVariantUpdate(flag))return 1;let variantUpdate=await collectVariantUpdate(client,flag,input),{variants,changedVariants}=applyVariantUpdates(flag,[variantUpdate]);if(changedVariants.length===0)return output_manager_default.warn(`Flag ${import_chalk51.default.bold(flag.slug)} is already up to date`),0;let updateMessage=await resolveOptionalInput(client,input.message,DEFAULT_UPDATE_MESSAGE,"Enter a message for this update:");output_manager_default.spinner("Updating flag..."),await updateFlag(client,projectId,flagArg,{variants,message:updateMessage},{ifMatch:etag}),output_manager_default.stopSpinner(),output_manager_default.success(`Feature flag ${import_chalk51.default.bold(flag.slug)} has been updated`);for(let variant of changedVariants)output_manager_default.log(` ${import_chalk51.default.dim("Variant:")} ${formatVariantForDisplay(variant)}`);return 0}async function updateFlagVariants(client,projectId,flagArg,input){output_manager_default.spinner("Fetching flag...");let{flag,etag}=await fetchFlagForUpdate(client,projectId,flagArg);if(output_manager_default.stopSpinner(),logArchivedFlagNotice(flag),rejectExperimentOwnedVariantUpdate(flag))return 1;if(flag.kind==="boolean")return output_manager_default.error("Boolean flags do not support --add-variant or --remove-variant."),1;let plan=buildVariantMutationPlan(flag,input.addVariantInputs,input.removeVariantSelectors);if(plan.removedVariants.length>0&&!await confirmVariantRemoval(client,flag,plan.removedVariants,input.skipConfirmation))return output_manager_default.log("Aborted"),0;let updateMessage=await resolveOptionalInput(client,input.message,DEFAULT_UPDATE_MESSAGE,"Enter a message for this update:");output_manager_default.spinner("Updating flag..."),await updateFlag(client,projectId,flagArg,{variants:plan.variants,message:updateMessage},{ifMatch:etag}),output_manager_default.stopSpinner(),output_manager_default.success(`Feature flag ${import_chalk51.default.bold(flag.slug)} has been updated`);for(let variant of plan.addedVariants)output_manager_default.log(` ${import_chalk51.default.dim("Added:")} ${formatVariantForLog(variant)}`);for(let variant of plan.removedVariants)output_manager_default.log(` ${import_chalk51.default.dim("Removed:")} ${formatVariantForLog(variant)}`);return 0}function rejectExperimentOwnedVariantUpdate(flag){if(!flag.experiment)return!1;let experiment=flag.experiment.id?`experiment ${import_chalk51.default.bold(flag.experiment.id)}`:"an experiment";return output_manager_default.error(`Flag ${import_chalk51.default.bold(flag.slug)} is managed by ${experiment}. Update its variants with ${getCommandName("experiments update <experiment> --file <file>")}.`),!0}function hasLegacyVariantEditOptions(variantSelector,valueInput,label){return variantSelector!==void 0||valueInput!==void 0||label!==void 0}function buildVariantMutationPlan(flag,addVariantInputs,removeVariantSelectors){let removedVariants=resolveRemovedVariants(flag.variants,removeVariantSelectors);assertVariantRemovalsAreAllowed(flag,removedVariants);let baseIndex=flag.variants.length-removedVariants.length,addedVariants=parseAddedVariants(flag,addVariantInputs,baseIndex),removedVariantIds=new Set(removedVariants.map(variant=>variant.id)),variants=flag.variants.filter(variant=>!removedVariantIds.has(variant.id)).map(variant=>({...variant}));return variants.push(...addedVariants),assertUniqueVariantValues(variants),{variants,addedVariants,removedVariants}}function parseAddedVariants(flag,addVariantInputs,baseIndex){let kind=flag.kind;if(kind==="boolean")throw new Error("Boolean flags do not support adding variants.");return addVariantInputs.map((input,index)=>parseVariantInput(input,kind,baseIndex+index))}function resolveRemovedVariants(variants,removeVariantSelectors){let removedVariantIds=new Set;return removeVariantSelectors.map(selector=>{let result=resolveVariant(selector,variants);if(result.error||!result.variant)throw new Error(result.error||`Variant "${selector}" not found`);if(removedVariantIds.has(result.variant.id))throw new Error(`Duplicate --remove-variant selector ${import_chalk51.default.bold(selector)} resolves to ${formatVariantForLog(result.variant)}.`);return removedVariantIds.add(result.variant.id),result.variant})}function assertVariantRemovalsAreAllowed(flag,removedVariants){let referencePaths=findVariantReferencePaths(flag,removedVariants.map(variant=>variant.id));if(referencePaths.size===0)return;let referencedVariants=removedVariants.filter(variant=>referencePaths.has(variant.id)),detailLines=referencedVariants.map(variant=>{let paths=referencePaths.get(variant.id)??[];return` - ${formatVariantForLog(variant)} referenced by ${paths.join(", ")}`});throw new Error(`Cannot remove variant${referencedVariants.length===1?"":"s"} because ${referencedVariants.length===1?"it is":"they are"} still referenced:
|
|
271
271
|
${detailLines.join(`
|