@vercel/cli-support 65.10.0 → 65.11.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/dist/chunks/add-4R6FUHQT.js +8 -0
- package/dist/chunks/add-F3H4BFJZ.js +8 -0
- package/dist/chunks/add-TCOJ4SIQ.js +8 -0
- package/dist/chunks/alerts-JGRRCQA4.js +8 -0
- package/dist/chunks/build-GOLTZF6S.js +7 -0
- package/dist/chunks/{chunk-6NUH6ZPE.js → chunk-2J35YKA2.js} +9 -9
- package/dist/chunks/{chunk-GQ4CQDIL.js → chunk-3KJ6HWSX.js} +1 -1
- package/dist/chunks/{chunk-STKZTUGE.js → chunk-3TDFSO4X.js} +1 -1
- package/dist/chunks/chunk-42FOKWGX.js +8 -0
- package/dist/chunks/{chunk-T2FCF46I.js → chunk-4DMKP6AO.js} +2 -2
- package/dist/chunks/chunk-4HR3I3ML.js +7 -0
- package/dist/chunks/{chunk-5MPZSRYG.js → chunk-4T57TXQ3.js} +1 -1
- package/dist/chunks/{chunk-SBEWZ65N.js → chunk-4VP57TOJ.js} +1 -1
- package/dist/chunks/{chunk-ZEUREQ4E.js → chunk-5B5CLOKM.js} +1 -1
- package/dist/chunks/chunk-5FIY443M.js +7 -0
- package/dist/chunks/{chunk-AUIV7YJO.js → chunk-5X635INY.js} +2 -2
- package/dist/chunks/{chunk-P6J22UJQ.js → chunk-6ORJPXDQ.js} +1 -1
- package/dist/chunks/chunk-74VQ7PQV.js +7 -0
- package/dist/chunks/{chunk-VU3RBRDH.js → chunk-7JMN657A.js} +1 -1
- package/dist/chunks/{chunk-Q46Q4Y4R.js → chunk-7LPNDK2O.js} +1 -1
- package/dist/chunks/{chunk-LIEWXPUC.js → chunk-7MZLV3KK.js} +1 -1
- package/dist/chunks/{chunk-YGYUPPAL.js → chunk-7NMC4E66.js} +1 -1
- package/dist/chunks/chunk-7ZJ7VUIR.js +7 -0
- package/dist/chunks/chunk-A3M2BHWR.js +13 -0
- package/dist/chunks/{chunk-US7YJ2RQ.js → chunk-AYZ52QDF.js} +1 -1
- package/dist/chunks/{chunk-5IZ33FNL.js → chunk-B56SRT5W.js} +1 -1
- package/dist/chunks/{chunk-3PKL2PTF.js → chunk-B6QVH6IG.js} +1 -1
- package/dist/chunks/{chunk-3QYXC4PH.js → chunk-BUFEV3T4.js} +1 -1
- package/dist/chunks/{chunk-ER7L7HYA.js → chunk-BVR6OIU5.js} +1 -1
- package/dist/chunks/{chunk-B4XGTAFO.js → chunk-BW25OFQG.js} +1 -1
- package/dist/chunks/{chunk-7LSH3MEB.js → chunk-C5QEQSEX.js} +1 -1
- package/dist/chunks/{chunk-VQSSVB6V.js → chunk-CD6ZWCKT.js} +1 -1
- package/dist/chunks/chunk-CFYLTZSV.js +7 -0
- package/dist/chunks/chunk-D3M2JG5C.js +7 -0
- package/dist/chunks/chunk-D7BB5BPA.js +10 -0
- package/dist/chunks/{chunk-RUBMVRT6.js → chunk-DR6OJB6P.js} +1 -1
- package/dist/chunks/chunk-DRZVM7CB.js +12 -0
- package/dist/chunks/{chunk-UQNBUXQA.js → chunk-EBIJ26IV.js} +1 -1
- package/dist/chunks/chunk-EGTJTCCW.js +7 -0
- package/dist/chunks/{chunk-OJWI6QJ3.js → chunk-EICEQXVS.js} +1 -1
- package/dist/chunks/{chunk-NAN5IE3B.js → chunk-EIMHC5UY.js} +1 -1
- package/dist/chunks/{chunk-CBMWPDOL.js → chunk-EVBGFSK5.js} +1 -1
- package/dist/chunks/{chunk-N5AN4JZL.js → chunk-EZLPMOHM.js} +1 -1
- package/dist/chunks/{chunk-JLNF2QTR.js → chunk-F2R7L3ZB.js} +1 -1
- package/dist/chunks/chunk-FHMCTV5E.js +7 -0
- package/dist/chunks/{chunk-DUCCC22H.js → chunk-FNH3T3CF.js} +1 -1
- package/dist/chunks/{chunk-RBIHS5QI.js → chunk-FOE3MWES.js} +1 -1
- package/dist/chunks/{chunk-KZLRIAAT.js → chunk-FVTRIRML.js} +1 -1
- package/dist/chunks/{chunk-PL6IOUKW.js → chunk-GL66K54F.js} +1 -1
- package/dist/chunks/{chunk-SXYA7JSX.js → chunk-HDISAMDF.js} +1 -1
- package/dist/chunks/chunk-HKU6D7DU.js +8 -0
- package/dist/chunks/{chunk-4WXVKR43.js → chunk-HNH3DPIZ.js} +1 -1
- package/dist/chunks/{chunk-U2TQFAO3.js → chunk-HYOWFNOP.js} +1 -1
- package/dist/chunks/{chunk-OYIDWI5Y.js → chunk-HZEKH3RO.js} +3 -3
- package/dist/chunks/{chunk-6RMW63GB.js → chunk-IHCYNUI2.js} +1 -1
- package/dist/chunks/chunk-IOTKHTZH.js +7 -0
- package/dist/chunks/{chunk-4VF5BZJP.js → chunk-JTAUWH5V.js} +1 -1
- package/dist/chunks/{chunk-S535FZTA.js → chunk-JUSNW3IF.js} +1 -1
- package/dist/chunks/{chunk-MKTZDEOJ.js → chunk-K4JTCVNW.js} +1 -1
- package/dist/chunks/{chunk-FPREO4VS.js → chunk-LALPOYIA.js} +1 -1
- package/dist/chunks/{chunk-YKLTNKQJ.js → chunk-MIIHBRKV.js} +1 -1
- package/dist/chunks/{chunk-BK3TNLWO.js → chunk-MO2G2ND2.js} +1 -1
- package/dist/chunks/{chunk-NLTZGQB2.js → chunk-MUKXOI2K.js} +1 -1
- package/dist/chunks/{chunk-PKZK23PR.js → chunk-NDMQVBTV.js} +1 -1
- package/dist/chunks/{chunk-DNLE3KPC.js → chunk-NSPW47RU.js} +1 -1
- package/dist/chunks/{chunk-K5KVSA2A.js → chunk-NT2N5UR4.js} +1 -1
- package/dist/chunks/{chunk-WYGOYE6C.js → chunk-NTDP6RTQ.js} +1 -1
- package/dist/chunks/chunk-NUSKXXZZ.js +20 -0
- package/dist/chunks/{chunk-Q2JNATRP.js → chunk-NZW3RIQM.js} +1 -1
- package/dist/chunks/chunk-Q2QVK3TH.js +7 -0
- package/dist/chunks/{chunk-HTPNGLPH.js → chunk-QDHTI5WK.js} +1 -1
- package/dist/chunks/chunk-QROI2U32.js +14 -0
- package/dist/chunks/chunk-RAQ6EUNL.js +7 -0
- package/dist/chunks/chunk-RDWLLSPU.js +7 -0
- package/dist/chunks/chunk-RR5SDYNN.js +8 -0
- package/dist/chunks/{chunk-BPRGAX62.js → chunk-SLCPSRDR.js} +1 -1
- package/dist/chunks/{chunk-5RYQH3XW.js → chunk-TPJV5UNE.js} +1 -1
- package/dist/chunks/{chunk-QXL353OB.js → chunk-TUAS3L5I.js} +1 -1
- package/dist/chunks/{chunk-7TR6H6NE.js → chunk-UBJVL3NJ.js} +2 -2
- package/dist/chunks/{chunk-6YAYCEDT.js → chunk-UCRMJMH6.js} +2 -2
- package/dist/chunks/{chunk-XS3MNHFR.js → chunk-UF2E5BDE.js} +1 -1
- package/dist/chunks/{chunk-E7WULWMX.js → chunk-UFXIPUNI.js} +1 -1
- package/dist/chunks/{chunk-SR7BZA6N.js → chunk-UNPK7LVC.js} +1 -1
- package/dist/chunks/{chunk-FXHB7TTL.js → chunk-VAZ7JG2Z.js} +1 -1
- package/dist/chunks/{chunk-52X4YVSG.js → chunk-VKCBEW6R.js} +1 -1
- package/dist/chunks/{chunk-FSJFWVUY.js → chunk-VWJXV5ZM.js} +1 -1
- package/dist/chunks/{chunk-VTITZEPW.js → chunk-W24TLPO5.js} +1 -1
- package/dist/chunks/chunk-WBSFE6IE.js +10 -0
- package/dist/chunks/{chunk-LE72YLCC.js → chunk-WMWB7QKG.js} +1 -1
- package/dist/chunks/{chunk-XFUUALZS.js → chunk-WNDR5HCU.js} +1 -1
- package/dist/chunks/{chunk-DQNP7OQ5.js → chunk-XH2R2EIK.js} +1 -1
- package/dist/chunks/{chunk-ZPJHONCZ.js → chunk-XQDHMFQY.js} +1 -1
- package/dist/chunks/{chunk-JA6IGJ67.js → chunk-YODQLETL.js} +1 -1
- package/dist/chunks/{chunk-36XHIIUT.js → chunk-Z64MQIOE.js} +1 -1
- package/dist/chunks/chunk-ZPBGAZC2.js +11 -0
- package/dist/chunks/{chunk-75DUL7VI.js → chunk-ZTHW5VNH.js} +1 -1
- package/dist/chunks/clear-PECHXMV5.js +8 -0
- package/dist/chunks/compile-vercel-config-EM3HYOQC.js +7 -0
- package/dist/chunks/config-DA2NZUDH.js +8 -0
- package/dist/chunks/config-X6O3DT7V.js +7 -0
- package/dist/chunks/config-validator.mjs +1 -1
- package/dist/chunks/{connect-git-provider-YIX5ZOU6.js → connect-git-provider-GFAJLQLU.js} +1 -1
- package/dist/chunks/contract-RHMWRX4W.js +10 -0
- package/dist/chunks/delete-5RN5VW5L.js +9 -0
- package/dist/chunks/delete-MT6I7R7K.js +10 -0
- package/dist/chunks/detect-services-HSA4JHJX.js +7 -0
- package/dist/chunks/disable-LXPZDQMC.js +7 -0
- package/dist/chunks/discard-PW65T65S.js +14 -0
- package/dist/chunks/edit-WFSONASO.js +8 -0
- package/dist/chunks/edit-YID3FOJ3.js +9 -0
- package/dist/chunks/enable-X2EKQCIY.js +7 -0
- package/dist/chunks/{export-YYQ2J5AT.js → export-25TQ3YBT.js} +1 -1
- package/dist/chunks/future-DQBK457G.js +7 -0
- package/dist/chunks/generate-cert-for-deploy-OMEACY5G.js +7 -0
- package/dist/chunks/image-AO2OZG4W.js +7 -0
- package/dist/chunks/import-builders-GSDV4K4A.js +7 -0
- package/dist/chunks/{inspect-AHHXHIIP.js → inspect-3W3TUJ6P.js} +1 -1
- package/dist/chunks/inspect-4244CRHI.js +13 -0
- package/dist/chunks/{inspect-SFM3NWDF.js → inspect-BRYVSQBD.js} +1 -1
- package/dist/chunks/inspect-C43IV7X4.js +9 -0
- package/dist/chunks/inspect-RP5KXOYQ.js +8 -0
- package/dist/chunks/{inspect-RPCDGIP3.js → inspect-TN2QY3BP.js} +1 -1
- package/dist/chunks/list-2SY6PZLC.js +12 -0
- package/dist/chunks/{list-7WWUYCE6.js → list-6W4UQBY4.js} +1 -1
- package/dist/chunks/{list-NXZXKKAR.js → list-WA6Q7DUN.js} +1 -1
- package/dist/chunks/list-WBKZGIMQ.js +8 -0
- package/dist/chunks/login-K6XBWOFD.js +9 -0
- package/dist/chunks/login-OGMXEW5N.js +7 -0
- package/dist/chunks/logs-R3ZERQ7M.js +7 -0
- package/dist/chunks/{ls-LCUOBWY2.js → ls-4WP6LHLL.js} +1 -1
- package/dist/chunks/{ls-ITWXAWSZ.js → ls-EVAQD3LI.js} +1 -1
- package/dist/chunks/{ls-5SKRXNSI.js → ls-L5LLKZBV.js} +1 -1
- package/dist/chunks/{ls-FOFJU2JJ.js → ls-MAJ4QZTY.js} +1 -1
- package/dist/chunks/ls-O5DKK3TY.js +8 -0
- package/dist/chunks/ls-PTHGXQLK.js +11 -0
- package/dist/chunks/{ls-OY5YTZGN.js → ls-UXE5RSZN.js} +1 -1
- package/dist/chunks/mutate-EKZWPQQJ.js +9 -0
- package/dist/chunks/{notifications-XAPB2F2T.js → notifications-F5S3RKZF.js} +1 -1
- package/dist/chunks/open-KGVG54NN.js +7 -0
- package/dist/chunks/{openapi-UUFKDKGC.js → openapi-7TPDTMCU.js} +1 -1
- package/dist/chunks/{permissions-FU5OET67.js → permissions-5K7JZOMB.js} +1 -1
- package/dist/chunks/{plugin-offer-E5JOW442.js → plugin-offer-JUYWL4I7.js} +1 -1
- package/dist/chunks/prompt-missing-credentials-DX2KJB5X.js +7 -0
- package/dist/chunks/publish-KIRTO2ZO.js +15 -0
- package/dist/chunks/pull-3CRJK7BX.js +7 -0
- package/dist/chunks/purchase-domain-if-available-55IXEF43.js +7 -0
- package/dist/chunks/push-4YG5HKSD.js +7 -0
- package/dist/chunks/{query-VMKIOI3W.js → query-67KQVLTR.js} +1 -1
- package/dist/chunks/reauthenticate-SWSBFGDU.js +7 -0
- package/dist/chunks/remove-SYTIFVWW.js +9 -0
- package/dist/chunks/reorder-TX5MXJEB.js +10 -0
- package/dist/chunks/reply-XVK33N5T.js +9 -0
- package/dist/chunks/resolve-JZ262ZF4.js +12 -0
- package/dist/chunks/resolve-agent-team-BG5YW55B.js +7 -0
- package/dist/chunks/restore-IPFL7TKT.js +16 -0
- package/dist/chunks/rm-2BCAZGQU.js +8 -0
- package/dist/chunks/rm-3CCU3CE6.js +8 -0
- package/dist/chunks/rm-5CQV5LYG.js +8 -0
- package/dist/chunks/rm-OV4OU6H2.js +8 -0
- package/dist/chunks/rm-WFGMOZ3G.js +8 -0
- package/dist/chunks/rule-inspect-RFJIIXZH.js +8 -0
- package/dist/chunks/{schema-AKVIKCFT.js → schema-753JMRZA.js} +1 -1
- package/dist/chunks/schema-SUNFQGUL.js +14 -0
- package/dist/chunks/select-org-MPHPWWPU.js +7 -0
- package/dist/chunks/set-BR6EEOPB.js +7 -0
- package/dist/chunks/set-I3NWZRSI.js +9 -0
- package/dist/chunks/setup-and-link-MRTKVOWD.js +7 -0
- package/dist/chunks/{skills-JG4MGVKX.js → skills-QZ4AMS2K.js} +28 -16
- package/dist/chunks/{tags-4Y4UBA5S.js → tags-7DIZEAVE.js} +1 -1
- package/dist/chunks/{types-DSN6Q6HW.js → types-NPUAHKSK.js} +1 -1
- package/dist/chunks/{update-R42CXSVE.js → update-7XH7HM5F.js} +1 -1
- package/dist/chunks/usage-3BS7JCCU.js +13 -0
- package/dist/chunks/{validate-config-XWZ7ZZ3G.js → validate-config-LAD7BU3B.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 +2 -2
- 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 +1 -1
- package/dist/commands-account.js +82 -93
- package/dist/commands-ai.js +13 -12
- package/dist/commands-blob.js +1 -1
- package/dist/commands-core.js +56 -59
- package/dist/commands-deployments.js +1 -1
- package/dist/commands-flags.js +6 -6
- package/dist/commands-integrations.js +12 -18
- package/dist/commands-observability.js +7 -7
- package/dist/commands-routing.js +2 -2
- package/dist/help.js +1 -1
- package/dist/index.js +7 -7
- package/dist/internal-build.js +1 -1
- package/dist/launcher-errors.js +1 -1
- package/dist/package.json +22 -22
- package/dist/root-help-commands.mjs +1 -1
- package/dist/version.mjs +1 -1
- package/package.json +13 -13
- package/dist/chunks/add-4MTUAI2X.js +0 -8
- package/dist/chunks/add-JYLWBVVQ.js +0 -8
- package/dist/chunks/add-T5ERJ62Z.js +0 -8
- package/dist/chunks/build-OGWTTFLG.js +0 -7
- package/dist/chunks/chunk-3QFBVAHL.js +0 -8
- package/dist/chunks/chunk-5RSSGN2Q.js +0 -8
- package/dist/chunks/chunk-BIRSJSAO.js +0 -7
- package/dist/chunks/chunk-FOWAVQOH.js +0 -8
- package/dist/chunks/chunk-JBU72NEQ.js +0 -7
- package/dist/chunks/chunk-NZRBJB6T.js +0 -7
- package/dist/chunks/chunk-OII46FDN.js +0 -12
- package/dist/chunks/chunk-SNNJRKD6.js +0 -10
- package/dist/chunks/chunk-TILI4QBL.js +0 -11
- package/dist/chunks/chunk-WKIDCYKL.js +0 -10
- package/dist/chunks/chunk-ZCUUCYID.js +0 -13
- package/dist/chunks/chunk-ZIC7VWFC.js +0 -14
- package/dist/chunks/clear-Z5OO6URI.js +0 -8
- package/dist/chunks/compile-vercel-config-ZKUTSDWV.js +0 -7
- package/dist/chunks/config-AUTTHXQO.js +0 -8
- package/dist/chunks/config-RJ7PLFQD.js +0 -7
- package/dist/chunks/delete-QQOC63HV.js +0 -9
- package/dist/chunks/delete-WIGSOZR3.js +0 -10
- package/dist/chunks/detect-services-J4LGLAHC.js +0 -7
- package/dist/chunks/disable-L54VGY5A.js +0 -7
- package/dist/chunks/discard-Q5UPTZR2.js +0 -14
- package/dist/chunks/edit-FRGMYBW3.js +0 -9
- package/dist/chunks/edit-QEDNQ33T.js +0 -8
- package/dist/chunks/enable-TGQZWSBG.js +0 -7
- package/dist/chunks/future-RYEYLPCG.js +0 -7
- package/dist/chunks/generate-cert-for-deploy-Y4KDIFF2.js +0 -7
- package/dist/chunks/image-PDPRURMH.js +0 -7
- package/dist/chunks/import-builders-H54QCMQ4.js +0 -7
- package/dist/chunks/inspect-6IBPIBIJ.js +0 -9
- package/dist/chunks/inspect-Q7FYDFL7.js +0 -13
- package/dist/chunks/list-GSVERG4S.js +0 -12
- package/dist/chunks/login-HEHHQO3F.js +0 -9
- package/dist/chunks/login-XKLPSZNN.js +0 -7
- package/dist/chunks/logs-NJ46ZSNZ.js +0 -7
- package/dist/chunks/ls-MWGIT2YH.js +0 -8
- package/dist/chunks/ls-TZN53EJL.js +0 -11
- package/dist/chunks/mutate-ZYXVL22A.js +0 -9
- package/dist/chunks/open-WPRHI6ND.js +0 -7
- package/dist/chunks/prompt-missing-credentials-ZZVTEQQB.js +0 -7
- package/dist/chunks/publish-R5IV2BH2.js +0 -15
- package/dist/chunks/pull-CQVHIIAN.js +0 -7
- package/dist/chunks/purchase-domain-if-available-VMWCMYC2.js +0 -7
- package/dist/chunks/push-Y5CUOISM.js +0 -7
- package/dist/chunks/reauthenticate-5K7LBTOW.js +0 -7
- package/dist/chunks/reorder-W3MXHSGZ.js +0 -10
- package/dist/chunks/reply-YH7HRIWQ.js +0 -9
- package/dist/chunks/resolve-FWVMWJTG.js +0 -12
- package/dist/chunks/resolve-agent-team-6L7AQUA2.js +0 -7
- package/dist/chunks/restore-I7L3EOS4.js +0 -16
- package/dist/chunks/rm-AWUMNWQU.js +0 -8
- package/dist/chunks/rm-HVGUK55W.js +0 -8
- package/dist/chunks/rm-M3EMCKSN.js +0 -8
- package/dist/chunks/rm-RFCTWU5R.js +0 -8
- package/dist/chunks/rm-VREBRM5D.js +0 -8
- package/dist/chunks/rule-inspect-SQUCRRGA.js +0 -8
- package/dist/chunks/schema-S36QQNJP.js +0 -14
- package/dist/chunks/select-org-PRWYXAWW.js +0 -7
- package/dist/chunks/set-ZJAC44LV.js +0 -7
- package/dist/chunks/setup-and-link-VD53JFQI.js +0 -7
package/dist/commands-core.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{monitorsRoutingFlags,runMonitors}from"./chunks/chunk-ER7L7HYA.js";import{ALERT_RULES_API,MONITORS_API}from"./chunks/chunk-SXYA7JSX.js";import{login}from"./chunks/chunk-NAN5IE3B.js";import{formatEnvironment}from"./chunks/chunk-RI6DJAFI.js";import{getProjectByCwdOrLink}from"./chunks/chunk-5IZ33FNL.js";import{extractDatePortion,formatCurrency,formatQuantity}from"./chunks/chunk-ECQIO5K3.js";import{curl,getDeploymentUrlAndToken,redactSecretHeader,requoteArgs,setupCurlLikeCommand}from"./chunks/chunk-MKTZDEOJ.js";import{applyDeprecatedGitBranchFlag}from"./chunks/chunk-KBVYN635.js";import"./chunks/chunk-7YKFF6CE.js";import{deploymentJson}from"./chunks/chunk-KKE55LTK.js";import{jsonNextStep,runWithJsonOutput,writeJsonFailure,writeJsonResult,writeJsonUsageError}from"./chunks/chunk-CBMWPDOL.js";import{resolveProjectContext}from"./chunks/chunk-SR7BZA6N.js";import{formatProject}from"./chunks/chunk-NE6PKR2J.js";import{isGuidanceEnabled}from"./chunks/chunk-TAAWMNNL.js";import"./chunks/chunk-SBEWZ65N.js";import{performDeviceCodeFlow,saveDeviceCodeTokens}from"./chunks/chunk-5MPZSRYG.js";import"./chunks/chunk-FPREO4VS.js";import{NATIVE_UPDATE_SELECT_PRODUCTION_ENV,NATIVE_UPDATE_VERSION_ENV,cacheNativeUpdateDiscoveryAttempt,cacheNativeUpdateVersion,executeHomebrewUpgrade,executeUpgrade,getWhoamiCachedAnswer,isAutoUpdateEnabled,isNativeAutoUpdateEnabled,isNativeUpdateChild,markNativeUpdateStaged,pinPackageVersion,require_fetch_dist_tags,restoreNativeUpdateAfterDiscoveryFailure,setAutoUpdate,setMinReleaseAgeBypass,spawnNativeUpdateChild}from"./chunks/chunk-YGYUPPAL.js";import{CURL_INSTALL_COMMAND,installAndActivatePrBinary,installAndActivateProductionVersion,isCurlInstall,listAvailableVersions,listNativeTrackSlots,parsePrTarget,readActivePointer,readNativeInstallState,resolveLatestNativeVersion,stageProductionUpdate,withDirectoryLock}from"./chunks/chunk-DQASZDQT.js";import{HOMEBREW_UPGRADE_COMMAND,getUpdateCommand,getUpdateCommandInfo,isGlobal,isHomebrewInstall}from"./chunks/chunk-HTPNGLPH.js";import{readOnOffOption}from"./chunks/chunk-PFZCGMJ7.js";import{require_semver}from"./chunks/chunk-BPUANOGW.js";import"./chunks/chunk-U56NHYAH.js";import{readJSONFile}from"./chunks/chunk-UQNBUXQA.js";import"./chunks/chunk-25565AGS.js";import{email}from"./chunks/chunk-6IDNVZZR.js";import{isValidName}from"./chunks/chunk-PADL3C6Z.js";import{validateLsArgs}from"./chunks/chunk-42J2KCDF.js";import{formatDate}from"./chunks/chunk-HRR57QNP.js";import{getInvalidSubcommand}from"./chunks/chunk-TG2RCYTH.js";import"./chunks/chunk-PFD7LETF.js";import{writeJsonError}from"./chunks/chunk-E7WULWMX.js";import{truncateEnd}from"./chunks/chunk-TOTTVS5P.js";import{formatTable}from"./chunks/chunk-2RXUQ72I.js";import"./chunks/chunk-5RSSGN2Q.js";import{parseListLimit,printNextPageCommand,printNextPageHint,quoteShellArg}from"./chunks/chunk-TZE4CS4K.js";import"./chunks/chunk-UIMJNASP.js";import{canPromptOnTerminal}from"./chunks/chunk-IQ7FPAI4.js";import"./chunks/chunk-VT6RIZJH.js";import{stamp_default}from"./chunks/chunk-A2RZZQEP.js";import{ensureLink}from"./chunks/chunk-6YAYCEDT.js";import{getDeployment}from"./chunks/chunk-VU3RBRDH.js";import"./chunks/chunk-4VF5BZJP.js";import{require_open}from"./chunks/chunk-PVASGBEF.js";import"./chunks/chunk-S535FZTA.js";import{table}from"./chunks/chunk-375JVQYK.js";import{getRenamedOption,renameOptionInArgs,reportRenamedOptionError}from"./chunks/chunk-GQ4CQDIL.js";import{elapsed}from"./chunks/chunk-Q7D7RGXM.js";import{getSubcommand}from"./chunks/chunk-ETV3C2CV.js";import{tokensAfterCommand}from"./chunks/chunk-SNNJRKD6.js";import{getTeams}from"./chunks/chunk-BPRGAX62.js";import{abortSubcommand,addSubcommand3 as addSubcommand,agentCommand,approveSubcommand,autoupdateSubcommand,buildersCommand,cacheCommand,changelogCommand,checkSubcommand2 as checkSubcommand,checkSubcommand3 as checkSubcommand2,completeSubcommand,configureSubcommand,connectionsCommand,contractCommand,createSubcommand3 as createSubcommand,cronsCommand,dangerouslyDeleteSubcommand,deployHooksCommand,disableSubcommand2 as disableSubcommand,disableSubcommand4 as disableSubcommand2,doctorCommand,enableSubcommand3 as enableSubcommand,enableSubcommand5 as enableSubcommand2,fetchSubcommand,flushSubcommand,getCommandAliases,guidanceCommand,headersCommand,httpstatCommand,installedSubcommand,invalidateSubcommand,listSubcommand10 as listSubcommand4,listSubcommand23 as listSubcommand5,listSubcommand26 as listSubcommand7,listSubcommand8 as listSubcommand3,logoutCommand,mcpCommand,openCommand,preinstallSubcommand,pricingCommand,promoteCommand,purgeSubcommand,removeSubcommand6 as removeSubcommand,rollbackCommand,rollingReleaseCommand,runSubcommand,scriptsCommand,searchSubcommand2 as searchSubcommand,securityCommand,signupCommand,startSubcommand2 as startSubcommand,statusSubcommand2 as statusSubcommand,statusSubcommand3 as statusSubcommand2,statusSubcommand4 as statusSubcommand3,statusSubcommand6 as statusSubcommand4,targetCommand,telemetryCommand,updateSubcommand13 as updateSubcommand,upgradeCommand,useSubcommand,versionCommand,vulnerabilitiesDismissSubcommand,vulnerabilitiesInspectSubcommand,vulnerabilitiesListSubcommand,vulnerabilitiesReopenSubcommand,vulnerabilitiesSubcommand,whoamiCommand}from"./chunks/chunk-ZIC7VWFC.js";import"./chunks/chunk-M3Z6NSC2.js";import"./chunks/chunk-IHTWZEQW.js";import"./chunks/chunk-ECFLIVEE.js";import"./chunks/chunk-WTFD4MDT.js";import"./chunks/chunk-SNGM6NSO.js";import{addSubcommand as addSubcommand2,buildSubcommand,configSubcommand,inspectSubcommand as inspectSubcommand3,listSubcommand as listSubcommand6,loginSubcommand,pushSubcommand,removeSubcommand as removeSubcommand2,vcrCommand}from"./chunks/chunk-P24YBQ6H.js";import{PERMISSIONS_ACTIONS,permissionsAddSubcommand,permissionsAggregateCommand,permissionsClearSubcommand,permissionsLsSubcommand,permissionsRmSubcommand}from"./chunks/chunk-NMIZSQDN.js";import{tagsAggregateCommand,tagsInspectSubcommand,tagsLsSubcommand}from"./chunks/chunk-K7ARJYAG.js";import{imageAggregateCommand,imageInspectSubcommand,imageLsSubcommand,imageRmSubcommand}from"./chunks/chunk-V5TOMLK4.js";import{metricsCommand,schemaSubcommand}from"./chunks/chunk-M3R7F2N4.js";import{alertsCommand,inspectSubcommand,listSubcommand}from"./chunks/chunk-4E6BGQWR.js";import{commentsCommand,deleteSubcommand,editSubcommand,inspectSubcommand as inspectSubcommand2,listSubcommand as listSubcommand2,openSubcommand,reopenSubcommand,replySubcommand,resolveSubcommand}from"./chunks/chunk-6UMVJ7RL.js";import{activityCommand,typesSubcommand}from"./chunks/chunk-IIGNDMLO.js";import"./chunks/chunk-N65H4JMJ.js";import"./chunks/chunk-EJN55YDV.js";import"./chunks/chunk-5DXC4TE2.js";import"./chunks/chunk-4U6ACPA4.js";import"./chunks/chunk-7VGBGUX7.js";import"./chunks/chunk-CU3LNJZV.js";import"./chunks/chunk-JALVF3C2.js";import"./chunks/chunk-BZIC36KP.js";import{printError}from"./chunks/chunk-PKZK23PR.js";import{createHelpTheme,help,helpCommand,remoteText}from"./chunks/chunk-OYIDWI5Y.js";import{param}from"./chunks/chunk-3G3FQYMW.js";import{detectExplicitScope,getContextName,getScope,introspectToken,isAppPrincipalEnabled,resolveAppFromToken}from"./chunks/chunk-DNLE3KPC.js";import{TelemetryClient,decodeHandoff}from"./chunks/chunk-MBXLL2HF.js";import"./chunks/chunk-2EYYB6YN.js";import{getInstallRoot,isManagedBuildersInstall,isNativeBinaryInstall}from"./chunks/chunk-NWGBDBZI.js";import{buildCommandWithGlobalFlags,buildCommandWithYes,exitWithNonInteractiveError,getErrorRecovery,outputAgentError,shouldEmitNonInteractiveCommandError,withGlobalFlags,writeActionRequired,writeAgentError}from"./chunks/chunk-AUIV7YJO.js";import"./chunks/chunk-FYE7ILRR.js";import{VERCEL_CONFIG_EXTENSIONS,findProjectsFromPath,getLinkFromDir,getLinkedProject,getProjectByNameOrId,getRepoLink,getUser,getVercelDirectory,persistAuthConfig,processRevocationResponse,readLocalConfig,require_lib,require_pluralize,revocationRequest,sleep,writeToConfigFile}from"./chunks/chunk-6NUH6ZPE.js";import{formatAlignedLabel,printAlignedLabel}from"./chunks/chunk-PKNEWN4W.js";import{ua_default}from"./chunks/chunk-ITQPDXXA.js";import{getGlobalPathConfig}from"./chunks/chunk-PL6IOUKW.js";import"./chunks/chunk-4NTBYNFR.js";import{getTypedOptionName,isArgumentError,parseArguments,takeCommand}from"./chunks/chunk-US7YJ2RQ.js";import{getTeamByIdOrSlug}from"./chunks/chunk-2VBFQZ72.js";import{validateJsonOutput,wantsMachineReadableOutput,warnDeprecatedInput,warnDeprecatedSubcommand}from"./chunks/chunk-SDYCW5JM.js";import"./chunks/chunk-LUX4PBJL.js";import"./chunks/chunk-OPORM35X.js";import{require_ms}from"./chunks/chunk-MXTC4ZAQ.js";import{require_types}from"./chunks/chunk-ZS2WS4AM.js";import"./chunks/chunk-4SAVH3H7.js";import{CantParseJSONFile,InvalidToken,ProjectNotFound,TeamDeleted,isAPIError}from"./chunks/chunk-T2FCF46I.js";import{cmd,getCommandName,getCommandNamePlain,packageName}from"./chunks/chunk-VRH7LWOC.js";import{pkg_default}from"./chunks/chunk-DBT6PGEH.js";import{emoji,output_manager_default,prependEmoji,recordCliError}from"./chunks/chunk-GZLYNPNU.js";import"./chunks/chunk-BLUPZPAS.js";import{require_build_utils}from"./chunks/chunk-5MDNVAE6.js";import"./chunks/chunk-OCR5CRTH.js";import{require_dist}from"./chunks/chunk-RM3ZDRYE.js";import"./chunks/chunk-YHPPP3SF.js";import"./chunks/chunk-PUKYAALC.js";import{GLOBAL_CLI_FLAG_NAMES,arg_common_default,getFlagsSpecification,getGlobalFlagsFromArgs,getShortFlagLongName,globalCliFlagTakesValue,jsonOption}from"./chunks/chunk-AMPJ6RWT.js";import"./chunks/chunk-2BKALEOP.js";import{require_source}from"./chunks/chunk-NB2WLB3J.js";import"./chunks/chunk-ISWW3DKF.js";import{require_strip_ansi}from"./chunks/chunk-BULSRTQE.js";import"./chunks/chunk-BRQUZ5NC.js";import"./chunks/chunk-KRPY5FHJ.js";import"./chunks/chunk-D6REP5QQ.js";import"./chunks/chunk-FBYA6LLM.js";import{fetch}from"./chunks/chunk-MY4MONOH.js";import"./chunks/chunk-7EJQLVWX.js";import"./chunks/chunk-SCV7XEEO.js";import{AGENT_REASON,AGENT_STATUS,getExitCodeForReason}from"./chunks/chunk-JBU72NEQ.js";import{__require,__toESM}from"./chunks/chunk-BZENIQ7N.js";var ActivityTelemetryClient=class extends TelemetryClient{trackCliSubcommandLs(v){v&&this.trackCliSubcommand({subcommand:"ls",value:v})}trackCliSubcommandTypes(v){v&&this.trackCliSubcommand({subcommand:"types",value:v})}trackCliOptionType(v){v&&v.length>0&&this.trackCliOption({option:"type",value:v.join(",")})}trackCliOptionSince(v){v&&this.trackCliOption({option:"since",value:this.redactedValue})}trackCliOptionUntil(v){v&&this.trackCliOption({option:"until",value:this.redactedValue})}trackCliFlagAll(v){v&&this.trackCliFlag("all")}trackCliOptionLimit(v){typeof v=="number"&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliOptionNext(v){v!==void 0&&this.trackCliOption({option:"next",value:this.redactedValue})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var COMMAND_CONFIG={types:getCommandAliases(typesSubcommand)};async function activity(client){let telemetry2=new ActivityTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(activityCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),2}let{subcommand,subcommandOriginal}=getSubcommand(parsedArgs.args.slice(1),COMMAND_CONFIG),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("activity",subcommand),output_manager_default.print(help(activityCommand,{stream:client.stderr,columns:client.stderr.columns})),0;function printSubcommandHelp(command){output_manager_default.print(help(command,{stream:client.stderr,parent:activityCommand,columns:client.stderr.columns}))}switch(subcommand){case"types":{if(needHelp)return telemetry2.trackCliFlagHelp("activity",subcommandOriginal),printSubcommandHelp(typesSubcommand),0;telemetry2.trackCliSubcommandTypes(subcommandOriginal);let typesFn=(await import("./chunks/types-DSN6Q6HW.js")).default;return typesFn(client,telemetry2)}default:{if(needHelp)return telemetry2.trackCliFlagHelp("activity",subcommandOriginal),output_manager_default.print(help(activityCommand,{stream:client.stderr,columns:client.stderr.columns})),0;telemetry2.trackCliSubcommandLs(subcommandOriginal);let listFn=(await import("./chunks/list-NXZXKKAR.js")).default;return listFn(client,telemetry2)}}}var AgentTelemetryClient=class extends TelemetryClient{trackCliArgumentInit(value){value&&this.trackCliArgument({arg:"init",value})}trackCliFlagYes(value){value&&this.trackCliFlag("yes")}};var import_chalk=__toESM(require_source(),1);import{readFile,writeFile}from"node:fs/promises";import{join}from"node:path";import{KNOWN_AGENTS}from"@vercel/detect-agent";var BEST_PRACTICES_START="<!-- VERCEL BEST PRACTICES START -->",BEST_PRACTICES_END="<!-- VERCEL BEST PRACTICES END -->",BEST_PRACTICES_BODY=`## Best practices for developing on Vercel
|
|
7
|
+
import{monitorsRoutingFlags,runMonitors}from"./chunks/chunk-BVR6OIU5.js";import{ALERT_RULES_API,MONITORS_API}from"./chunks/chunk-HDISAMDF.js";import{login}from"./chunks/chunk-EIMHC5UY.js";import{formatEnvironment}from"./chunks/chunk-RI6DJAFI.js";import{getProjectByCwdOrLink}from"./chunks/chunk-B56SRT5W.js";import{curl,getDeploymentUrlAndToken,redactSecretHeader,requoteArgs,setupCurlLikeCommand}from"./chunks/chunk-K4JTCVNW.js";import{applyDeprecatedGitBranchFlag}from"./chunks/chunk-KBVYN635.js";import"./chunks/chunk-7YKFF6CE.js";import{deploymentJson}from"./chunks/chunk-KKE55LTK.js";import{jsonNextStep,runWithJsonOutput,writeJsonFailure,writeJsonResult,writeJsonUsageError}from"./chunks/chunk-EVBGFSK5.js";import{resolveProjectContext}from"./chunks/chunk-UNPK7LVC.js";import{formatProject}from"./chunks/chunk-NE6PKR2J.js";import"./chunks/chunk-42FOKWGX.js";import{isGuidanceEnabled}from"./chunks/chunk-TAAWMNNL.js";import"./chunks/chunk-4VP57TOJ.js";import{performDeviceCodeFlow,saveDeviceCodeTokens}from"./chunks/chunk-4T57TXQ3.js";import"./chunks/chunk-LALPOYIA.js";import{NATIVE_UPDATE_SELECT_PRODUCTION_ENV,NATIVE_UPDATE_VERSION_ENV,cacheNativeUpdateDiscoveryAttempt,cacheNativeUpdateVersion,executeHomebrewUpgrade,executeUpgrade,getWhoamiCachedAnswer,isAutoUpdateEnabled,isNativeAutoUpdateEnabled,isNativeUpdateChild,markNativeUpdateStaged,pinPackageVersion,require_fetch_dist_tags,restoreNativeUpdateAfterDiscoveryFailure,setAutoUpdate,setMinReleaseAgeBypass,spawnNativeUpdateChild}from"./chunks/chunk-7NMC4E66.js";import{CURL_INSTALL_COMMAND,installAndActivatePrBinary,installAndActivateProductionVersion,isCurlInstall,listAvailableVersions,listNativeTrackSlots,parsePrTarget,readActivePointer,readNativeInstallState,resolveLatestNativeVersion,stageProductionUpdate,withDirectoryLock}from"./chunks/chunk-DQASZDQT.js";import{HOMEBREW_UPGRADE_COMMAND,getUpdateCommand,getUpdateCommandInfo,isGlobal,isHomebrewInstall}from"./chunks/chunk-QDHTI5WK.js";import{readOnOffOption}from"./chunks/chunk-PFZCGMJ7.js";import{require_semver}from"./chunks/chunk-BPUANOGW.js";import"./chunks/chunk-U56NHYAH.js";import{readJSONFile}from"./chunks/chunk-EBIJ26IV.js";import"./chunks/chunk-25565AGS.js";import{email}from"./chunks/chunk-6IDNVZZR.js";import{isValidName}from"./chunks/chunk-PADL3C6Z.js";import{validateLsArgs}from"./chunks/chunk-42J2KCDF.js";import{formatDate}from"./chunks/chunk-HRR57QNP.js";import{getInvalidSubcommand}from"./chunks/chunk-TG2RCYTH.js";import"./chunks/chunk-PFD7LETF.js";import{writeJsonError}from"./chunks/chunk-UFXIPUNI.js";import{truncateEnd}from"./chunks/chunk-TOTTVS5P.js";import{formatTable}from"./chunks/chunk-2RXUQ72I.js";import"./chunks/chunk-D3M2JG5C.js";import{parseListLimit,printNextPageCommand,printNextPageHint,quoteShellArg}from"./chunks/chunk-TZE4CS4K.js";import"./chunks/chunk-UIMJNASP.js";import{canPromptOnTerminal}from"./chunks/chunk-IQ7FPAI4.js";import"./chunks/chunk-VT6RIZJH.js";import{stamp_default}from"./chunks/chunk-A2RZZQEP.js";import{elapsed}from"./chunks/chunk-Q7D7RGXM.js";import{ensureLink}from"./chunks/chunk-UCRMJMH6.js";import{getDeployment}from"./chunks/chunk-7JMN657A.js";import"./chunks/chunk-JTAUWH5V.js";import{require_open}from"./chunks/chunk-PVASGBEF.js";import"./chunks/chunk-JUSNW3IF.js";import{table}from"./chunks/chunk-375JVQYK.js";import{getRenamedOption,renameOptionInArgs,reportRenamedOptionError}from"./chunks/chunk-3KJ6HWSX.js";import{getSubcommand}from"./chunks/chunk-ETV3C2CV.js";import{tokensAfterCommand}from"./chunks/chunk-D7BB5BPA.js";import{getTeams}from"./chunks/chunk-SLCPSRDR.js";import{abortSubcommand,addSubcommand3 as addSubcommand,agentCommand,approveSubcommand,autoupdateSubcommand,buildersCommand,cacheCommand,changelogCommand,checkSubcommand2 as checkSubcommand,checkSubcommand3 as checkSubcommand2,completeSubcommand,configureSubcommand,connectionsCommand,createSubcommand3 as createSubcommand,cronsCommand,dangerouslyDeleteSubcommand,deployHooksCommand,disableSubcommand3 as disableSubcommand,disableSubcommand5 as disableSubcommand2,doctorCommand,enableSubcommand3 as enableSubcommand,enableSubcommand5 as enableSubcommand2,fetchSubcommand,flushSubcommand,getCommandAliases,guidanceCommand,headersCommand,httpstatCommand,installedSubcommand,invalidateSubcommand,listSubcommand10 as listSubcommand4,listSubcommand23 as listSubcommand5,listSubcommand26 as listSubcommand7,listSubcommand8 as listSubcommand3,logoutCommand,mcpCommand,openCommand,preinstallSubcommand,pricingCommand,promoteCommand,purgeSubcommand,removeSubcommand6 as removeSubcommand,rollbackCommand,rollingReleaseCommand,runSubcommand,scriptsCommand,searchSubcommand2 as searchSubcommand,securityCommand,signupCommand,startSubcommand2 as startSubcommand,statusSubcommand2 as statusSubcommand,statusSubcommand3 as statusSubcommand2,statusSubcommand4 as statusSubcommand3,statusSubcommand6 as statusSubcommand4,targetCommand,telemetryCommand,updateSubcommand13 as updateSubcommand,upgradeCommand,useSubcommand,versionCommand,vulnerabilitiesDismissSubcommand,vulnerabilitiesInspectSubcommand,vulnerabilitiesListSubcommand,vulnerabilitiesReopenSubcommand,vulnerabilitiesSubcommand,whoamiCommand}from"./chunks/chunk-QROI2U32.js";import"./chunks/chunk-M3Z6NSC2.js";import"./chunks/chunk-ECFLIVEE.js";import"./chunks/chunk-RDWLLSPU.js";import"./chunks/chunk-7ZJ7VUIR.js";import"./chunks/chunk-WTFD4MDT.js";import"./chunks/chunk-IHTWZEQW.js";import"./chunks/chunk-74VQ7PQV.js";import"./chunks/chunk-SNGM6NSO.js";import{addSubcommand as addSubcommand2,buildSubcommand,configSubcommand,inspectSubcommand as inspectSubcommand3,listSubcommand as listSubcommand6,loginSubcommand,pushSubcommand,removeSubcommand as removeSubcommand2,vcrCommand}from"./chunks/chunk-P24YBQ6H.js";import{PERMISSIONS_ACTIONS,permissionsAddSubcommand,permissionsAggregateCommand,permissionsClearSubcommand,permissionsLsSubcommand,permissionsRmSubcommand}from"./chunks/chunk-NMIZSQDN.js";import{tagsAggregateCommand,tagsInspectSubcommand,tagsLsSubcommand}from"./chunks/chunk-K7ARJYAG.js";import{imageAggregateCommand,imageInspectSubcommand,imageLsSubcommand,imageRmSubcommand}from"./chunks/chunk-V5TOMLK4.js";import{metricsCommand,schemaSubcommand}from"./chunks/chunk-M3R7F2N4.js";import{alertsCommand,inspectSubcommand,listSubcommand}from"./chunks/chunk-4E6BGQWR.js";import{commentsCommand,deleteSubcommand,editSubcommand,inspectSubcommand as inspectSubcommand2,listSubcommand as listSubcommand2,openSubcommand,reopenSubcommand,replySubcommand,resolveSubcommand}from"./chunks/chunk-6UMVJ7RL.js";import{activityCommand,typesSubcommand}from"./chunks/chunk-IIGNDMLO.js";import"./chunks/chunk-N65H4JMJ.js";import"./chunks/chunk-EJN55YDV.js";import"./chunks/chunk-5DXC4TE2.js";import"./chunks/chunk-4U6ACPA4.js";import"./chunks/chunk-7VGBGUX7.js";import"./chunks/chunk-CU3LNJZV.js";import"./chunks/chunk-JALVF3C2.js";import"./chunks/chunk-BZIC36KP.js";import{printError}from"./chunks/chunk-NDMQVBTV.js";import{createHelpTheme,help,helpCommand,remoteText}from"./chunks/chunk-HZEKH3RO.js";import{param}from"./chunks/chunk-3G3FQYMW.js";import{detectExplicitScope,getContextName,getScope,introspectToken,isAppPrincipalEnabled,resolveAppFromToken}from"./chunks/chunk-NSPW47RU.js";import{TelemetryClient,decodeHandoff}from"./chunks/chunk-MBXLL2HF.js";import"./chunks/chunk-2EYYB6YN.js";import{getInstallRoot,isManagedBuildersInstall,isNativeBinaryInstall}from"./chunks/chunk-NWGBDBZI.js";import{buildCommandWithGlobalFlags,buildCommandWithYes,exitWithNonInteractiveError,getErrorRecovery,outputAgentError,shouldEmitNonInteractiveCommandError,withGlobalFlags,writeActionRequired,writeAgentError}from"./chunks/chunk-5X635INY.js";import"./chunks/chunk-FYE7ILRR.js";import{VERCEL_CONFIG_EXTENSIONS,findProjectsFromPath,getLinkFromDir,getLinkedProject,getProjectByNameOrId,getRepoLink,getUser,getVercelDirectory,persistAuthConfig,processRevocationResponse,readLocalConfig,require_lib,revocationRequest,sleep,writeToConfigFile}from"./chunks/chunk-2J35YKA2.js";import{require_pluralize}from"./chunks/chunk-4HR3I3ML.js";import{formatAlignedLabel,printAlignedLabel}from"./chunks/chunk-PKNEWN4W.js";import{ua_default}from"./chunks/chunk-ITQPDXXA.js";import{getGlobalPathConfig}from"./chunks/chunk-GL66K54F.js";import"./chunks/chunk-4NTBYNFR.js";import{getTypedOptionName,isArgumentError,parseArguments,takeCommand}from"./chunks/chunk-AYZ52QDF.js";import{getTeamByIdOrSlug}from"./chunks/chunk-2VBFQZ72.js";import{validateJsonOutput,wantsMachineReadableOutput,warnDeprecatedInput,warnDeprecatedSubcommand}from"./chunks/chunk-SDYCW5JM.js";import"./chunks/chunk-LUX4PBJL.js";import"./chunks/chunk-OPORM35X.js";import{require_ms}from"./chunks/chunk-MXTC4ZAQ.js";import{require_types}from"./chunks/chunk-ZS2WS4AM.js";import"./chunks/chunk-4SAVH3H7.js";import{CantParseJSONFile,InvalidToken,ProjectNotFound,TeamDeleted,isAPIError}from"./chunks/chunk-4DMKP6AO.js";import{cmd,getCommandName,getCommandNamePlain,packageName}from"./chunks/chunk-VRH7LWOC.js";import{pkg_default}from"./chunks/chunk-DBT6PGEH.js";import{emoji,output_manager_default,prependEmoji,recordCliError}from"./chunks/chunk-GZLYNPNU.js";import"./chunks/chunk-BLUPZPAS.js";import{require_build_utils}from"./chunks/chunk-5MDNVAE6.js";import"./chunks/chunk-OCR5CRTH.js";import{require_dist}from"./chunks/chunk-RM3ZDRYE.js";import"./chunks/chunk-YHPPP3SF.js";import"./chunks/chunk-PUKYAALC.js";import{GLOBAL_CLI_FLAG_NAMES,arg_common_default,getFlagsSpecification,getGlobalFlagsFromArgs,getShortFlagLongName,globalCliFlagTakesValue,jsonOption}from"./chunks/chunk-AMPJ6RWT.js";import"./chunks/chunk-2BKALEOP.js";import{require_source}from"./chunks/chunk-NB2WLB3J.js";import"./chunks/chunk-ISWW3DKF.js";import{require_strip_ansi}from"./chunks/chunk-BULSRTQE.js";import"./chunks/chunk-BRQUZ5NC.js";import"./chunks/chunk-KRPY5FHJ.js";import"./chunks/chunk-D6REP5QQ.js";import"./chunks/chunk-FBYA6LLM.js";import{fetch}from"./chunks/chunk-MY4MONOH.js";import"./chunks/chunk-7EJQLVWX.js";import"./chunks/chunk-SCV7XEEO.js";import{AGENT_REASON,AGENT_STATUS,getExitCodeForReason}from"./chunks/chunk-Q2QVK3TH.js";import{__require,__toESM}from"./chunks/chunk-BZENIQ7N.js";var ActivityTelemetryClient=class extends TelemetryClient{trackCliSubcommandLs(v){v&&this.trackCliSubcommand({subcommand:"ls",value:v})}trackCliSubcommandTypes(v){v&&this.trackCliSubcommand({subcommand:"types",value:v})}trackCliOptionType(v){v&&v.length>0&&this.trackCliOption({option:"type",value:v.join(",")})}trackCliOptionSince(v){v&&this.trackCliOption({option:"since",value:this.redactedValue})}trackCliOptionUntil(v){v&&this.trackCliOption({option:"until",value:this.redactedValue})}trackCliFlagAll(v){v&&this.trackCliFlag("all")}trackCliOptionLimit(v){typeof v=="number"&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliOptionNext(v){v!==void 0&&this.trackCliOption({option:"next",value:this.redactedValue})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var COMMAND_CONFIG={types:getCommandAliases(typesSubcommand)};async function activity(client){let telemetry2=new ActivityTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(activityCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),2}let{subcommand,subcommandOriginal}=getSubcommand(parsedArgs.args.slice(1),COMMAND_CONFIG),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("activity",subcommand),output_manager_default.print(help(activityCommand,{stream:client.stderr,columns:client.stderr.columns})),0;function printSubcommandHelp(command){output_manager_default.print(help(command,{stream:client.stderr,parent:activityCommand,columns:client.stderr.columns}))}switch(subcommand){case"types":{if(needHelp)return telemetry2.trackCliFlagHelp("activity",subcommandOriginal),printSubcommandHelp(typesSubcommand),0;telemetry2.trackCliSubcommandTypes(subcommandOriginal);let typesFn=(await import("./chunks/types-NPUAHKSK.js")).default;return typesFn(client,telemetry2)}default:{if(needHelp)return telemetry2.trackCliFlagHelp("activity",subcommandOriginal),output_manager_default.print(help(activityCommand,{stream:client.stderr,columns:client.stderr.columns})),0;telemetry2.trackCliSubcommandLs(subcommandOriginal);let listFn=(await import("./chunks/list-WA6Q7DUN.js")).default;return listFn(client,telemetry2)}}}var AgentTelemetryClient=class extends TelemetryClient{trackCliArgumentInit(value){value&&this.trackCliArgument({arg:"init",value})}trackCliFlagYes(value){value&&this.trackCliFlag("yes")}};var import_chalk=__toESM(require_source(),1);import{readFile,writeFile}from"node:fs/promises";import{join}from"node:path";import{KNOWN_AGENTS}from"@vercel/detect-agent";var BEST_PRACTICES_START="<!-- VERCEL BEST PRACTICES START -->",BEST_PRACTICES_END="<!-- VERCEL BEST PRACTICES END -->",BEST_PRACTICES_BODY=`## Best practices for developing on Vercel
|
|
8
8
|
|
|
9
9
|
These defaults are optimized for AI coding agents (and humans) working on apps that deploy to Vercel.
|
|
10
10
|
|
|
@@ -33,7 +33,7 @@ ${BEST_PRACTICES_END}
|
|
|
33
33
|
`)?`
|
|
34
34
|
`:`
|
|
35
35
|
|
|
36
|
-
`;await writeFile(filePath,existing+separator+BEST_PRACTICES_CONTENT,"utf-8"),output_manager_default.stopSpinner(),output_manager_default.success(`Appended Vercel best practices to ${import_chalk.default.bold(targetFile)}`)}else await writeFile(filePath,BEST_PRACTICES_CONTENT,"utf-8"),output_manager_default.stopSpinner(),output_manager_default.success(`Created ${import_chalk.default.bold(targetFile)} with Vercel best practices`)}catch(error){return output_manager_default.stopSpinner(),printError(error),1}return output_manager_default.log(import_chalk.default.dim("Run vercel deploy to ship your project")),0}async function agent(client){let parsedArgs,flagsSpecification=getFlagsSpecification(agentCommand.options),telemetry2=new AgentTelemetryClient({opts:{store:client.telemetryEventStore}});try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return printError(error),2}if(parsedArgs.flags["--help"])return telemetry2.trackCliFlagHelp("agent"),output_manager_default.print(help(agentCommand,{stream:client.stderr,columns:client.stderr.columns})),0;let subcommand=parsedArgs.args[1];if(telemetry2.trackCliArgumentInit(subcommand),!subcommand||subcommand==="init"){let yes=parsedArgs.flags["--yes"]??!1;telemetry2.trackCliFlagYes(yes);try{return await agentInit(client,yes)}catch(error){return printError(error),1}}return output_manager_default.error(`Unknown subcommand: ${subcommand}`),output_manager_default.print(help(agentCommand,{stream:client.stderr,columns:client.stderr.columns})),2}var AlertsTelemetryClient=class extends TelemetryClient{trackCliSubcommandLs(v){v&&this.trackCliSubcommand({subcommand:"ls",value:v})}trackCliSubcommandInspect(actual){this.trackCliSubcommand({subcommand:"inspect",value:actual})}trackCliOptionType(v){v&&v.length>0&&this.trackCliOption({option:"type",value:v.join(",")})}trackCliOptionSince(v){v&&this.trackCliOption({option:"since",value:this.redactedValue})}trackCliOptionUntil(v){v&&this.trackCliOption({option:"until",value:this.redactedValue})}trackCliFlagAll(v){v&&this.trackCliFlag("all")}trackCliFlagAi(v){v&&this.trackCliFlag("ai")}trackCliOptionLimit(v){typeof v=="number"&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};function getFlagSpecValue(flagsSpecification,flag){let value=flagsSpecification[flag];return typeof value=="string"?flagsSpecification[value]:value}function flagConsumesValue(rawArg,flagsSpecification){if(!rawArg.startsWith("-")||rawArg==="-"||rawArg.includes("="))return!1;let value=getFlagSpecValue(flagsSpecification,rawArg);return value===String||value===Number||Array.isArray(value)}function findCommandIndex(rawArgs,commandName,flagsSpecification){if(!commandName)return-1;for(let index=0;index<rawArgs.length;index++){let rawArg=rawArgs[index];if(rawArg==="--")return rawArgs.indexOf(commandName,index+1);if(rawArg.startsWith("-")){flagConsumesValue(rawArg,flagsSpecification)&&index++;continue}if(rawArg===commandName)return index}return-1}function normalizeHelpAlias(rawArgs){return rawArgs.map(arg=>arg==="-help"?"--help":arg)}var COMMAND_CONFIG2={inspect:getCommandAliases(inspectSubcommand),ls:getCommandAliases(listSubcommand),rules:["rules"]};function getAlertsSubcommand(rawArgs,parsedArgs,flagsSpecification){let commandIndex=findCommandIndex(rawArgs,parsedArgs[0],flagsSpecification),rawArgsAfterCommand=commandIndex===-1?[]:rawArgs.slice(commandIndex+1),rawSubcommand=rawArgsAfterCommand[0];return!rawSubcommand||rawSubcommand.startsWith("-")?{...getSubcommand([],COMMAND_CONFIG2),rawSubcommandArgs:rawArgsAfterCommand}:{...getSubcommand(parsedArgs.slice(1),COMMAND_CONFIG2),rawSubcommandArgs:rawArgsAfterCommand.slice(1)}}async function alerts(client){let telemetry2=new AlertsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(alertsCommand.options),rawArgs=normalizeHelpAlias(client.argv.slice(2));try{parsedArgs=parseArguments(rawArgs,flagsSpecification,{permissive:!0})}catch(err){let msg=err instanceof Error?err.message:String(err),projectFlagMissingArg=msg.includes("--project")&&msg.includes("requires argument");return shouldEmitNonInteractiveCommandError(client)&&outputAgentError(client,{status:"error",reason:AGENT_REASON.INVALID_ARGUMENTS,message:projectFlagMissingArg?"`--project` requires a project name or id (for example `--project my-app`).":msg,next:projectFlagMissingArg?[{command:buildCommandWithGlobalFlags(client.argv,"alerts --project <name-or-id>"),when:"Re-run with a project name or id (replace placeholder)"},{command:buildCommandWithGlobalFlags(client.argv,"alerts --help"),when:"See all `alerts` options and examples"}]:[{command:buildCommandWithGlobalFlags(client.argv,"alerts --help"),when:"See valid options and examples"}]},2),printError(err),2}let{subcommand,subcommandOriginal,rawSubcommandArgs}=getAlertsSubcommand(rawArgs,parsedArgs.args,{...arg_common_default(),...flagsSpecification});switch(subcommand){case"inspect":{telemetry2.trackCliSubcommandInspect(subcommandOriginal);let inspectFn=(await import("./chunks/inspect-
|
|
36
|
+
`;await writeFile(filePath,existing+separator+BEST_PRACTICES_CONTENT,"utf-8"),output_manager_default.stopSpinner(),output_manager_default.success(`Appended Vercel best practices to ${import_chalk.default.bold(targetFile)}`)}else await writeFile(filePath,BEST_PRACTICES_CONTENT,"utf-8"),output_manager_default.stopSpinner(),output_manager_default.success(`Created ${import_chalk.default.bold(targetFile)} with Vercel best practices`)}catch(error){return output_manager_default.stopSpinner(),printError(error),1}return output_manager_default.log(import_chalk.default.dim("Run vercel deploy to ship your project")),0}async function agent(client){let parsedArgs,flagsSpecification=getFlagsSpecification(agentCommand.options),telemetry2=new AgentTelemetryClient({opts:{store:client.telemetryEventStore}});try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return printError(error),2}if(parsedArgs.flags["--help"])return telemetry2.trackCliFlagHelp("agent"),output_manager_default.print(help(agentCommand,{stream:client.stderr,columns:client.stderr.columns})),0;let subcommand=parsedArgs.args[1];if(telemetry2.trackCliArgumentInit(subcommand),!subcommand||subcommand==="init"){let yes=parsedArgs.flags["--yes"]??!1;telemetry2.trackCliFlagYes(yes);try{return await agentInit(client,yes)}catch(error){return printError(error),1}}return output_manager_default.error(`Unknown subcommand: ${subcommand}`),output_manager_default.print(help(agentCommand,{stream:client.stderr,columns:client.stderr.columns})),2}var AlertsTelemetryClient=class extends TelemetryClient{trackCliSubcommandLs(v){v&&this.trackCliSubcommand({subcommand:"ls",value:v})}trackCliSubcommandInspect(actual){this.trackCliSubcommand({subcommand:"inspect",value:actual})}trackCliOptionType(v){v&&v.length>0&&this.trackCliOption({option:"type",value:v.join(",")})}trackCliOptionSince(v){v&&this.trackCliOption({option:"since",value:this.redactedValue})}trackCliOptionUntil(v){v&&this.trackCliOption({option:"until",value:this.redactedValue})}trackCliFlagAll(v){v&&this.trackCliFlag("all")}trackCliFlagAi(v){v&&this.trackCliFlag("ai")}trackCliOptionLimit(v){typeof v=="number"&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};function getFlagSpecValue(flagsSpecification,flag){let value=flagsSpecification[flag];return typeof value=="string"?flagsSpecification[value]:value}function flagConsumesValue(rawArg,flagsSpecification){if(!rawArg.startsWith("-")||rawArg==="-"||rawArg.includes("="))return!1;let value=getFlagSpecValue(flagsSpecification,rawArg);return value===String||value===Number||Array.isArray(value)}function findCommandIndex(rawArgs,commandName,flagsSpecification){if(!commandName)return-1;for(let index=0;index<rawArgs.length;index++){let rawArg=rawArgs[index];if(rawArg==="--")return rawArgs.indexOf(commandName,index+1);if(rawArg.startsWith("-")){flagConsumesValue(rawArg,flagsSpecification)&&index++;continue}if(rawArg===commandName)return index}return-1}function normalizeHelpAlias(rawArgs){return rawArgs.map(arg=>arg==="-help"?"--help":arg)}var COMMAND_CONFIG2={inspect:getCommandAliases(inspectSubcommand),ls:getCommandAliases(listSubcommand),rules:["rules"]};function getAlertsSubcommand(rawArgs,parsedArgs,flagsSpecification){let commandIndex=findCommandIndex(rawArgs,parsedArgs[0],flagsSpecification),rawArgsAfterCommand=commandIndex===-1?[]:rawArgs.slice(commandIndex+1),rawSubcommand=rawArgsAfterCommand[0];return!rawSubcommand||rawSubcommand.startsWith("-")?{...getSubcommand([],COMMAND_CONFIG2),rawSubcommandArgs:rawArgsAfterCommand}:{...getSubcommand(parsedArgs.slice(1),COMMAND_CONFIG2),rawSubcommandArgs:rawArgsAfterCommand.slice(1)}}async function alerts(client){let telemetry2=new AlertsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(alertsCommand.options),rawArgs=normalizeHelpAlias(client.argv.slice(2));try{parsedArgs=parseArguments(rawArgs,flagsSpecification,{permissive:!0})}catch(err){let msg=err instanceof Error?err.message:String(err),projectFlagMissingArg=msg.includes("--project")&&msg.includes("requires argument");return shouldEmitNonInteractiveCommandError(client)&&outputAgentError(client,{status:"error",reason:AGENT_REASON.INVALID_ARGUMENTS,message:projectFlagMissingArg?"`--project` requires a project name or id (for example `--project my-app`).":msg,next:projectFlagMissingArg?[{command:buildCommandWithGlobalFlags(client.argv,"alerts --project <name-or-id>"),when:"Re-run with a project name or id (replace placeholder)"},{command:buildCommandWithGlobalFlags(client.argv,"alerts --help"),when:"See all `alerts` options and examples"}]:[{command:buildCommandWithGlobalFlags(client.argv,"alerts --help"),when:"See valid options and examples"}]},2),printError(err),2}let{subcommand,subcommandOriginal,rawSubcommandArgs}=getAlertsSubcommand(rawArgs,parsedArgs.args,{...arg_common_default(),...flagsSpecification});switch(subcommand){case"inspect":{telemetry2.trackCliSubcommandInspect(subcommandOriginal);let inspectFn=(await import("./chunks/inspect-4244CRHI.js")).default;return inspectFn(client,rawSubcommandArgs)}case"rules":return warnDeprecatedSubcommand(client,"alerts rules","monitors"),runMonitors(client,rawSubcommandArgs,ALERT_RULES_API);default:{telemetry2.trackCliSubcommandLs(subcommandOriginal);let listFn=(await import("./chunks/list-6W4UQBY4.js")).default;return listFn(client,telemetry2)}}}import{createRequire}from"node:module";import{isAbsolute}from"node:path";var require_=createRequire(__filename),COMMAND_CONFIG3={preinstall:getCommandAliases(preinstallSubcommand)};async function builders(client){let parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(2),getFlagsSpecification(buildersCommand.options),{permissive:!0})}catch(error){return printError(error),2}let{subcommand,args}=getSubcommand(parsedArgs.args.slice(1),COMMAND_CONFIG3);if(subcommand!=="preinstall"||args.length>0)return output_manager_default.error("Only `vercel builders preinstall` is supported."),2;if(!isManagedBuildersInstall())return output_manager_default.error("Builder preinstallation requires the native Vercel CLI or VERCEL_CLI_MANAGED_BUILDERS=1."),1;let configuredCacheRoot=process.env.VERCEL_BUILDERS_DIR;if(!configuredCacheRoot)return output_manager_default.error("Set VERCEL_BUILDERS_DIR to preinstall Builders."),1;if(!isAbsolute(configuredCacheRoot))return output_manager_default.error("VERCEL_BUILDERS_DIR must be an absolute path."),1;let cacheRoot=configuredCacheRoot;try{let[{loadEmbeddedBuilderGraphs},{createVltBuilderImporter}]=await Promise.all([import("./chunks/vlt-builder-graph-XL2XRO4V.js"),import("./chunks/vlt-builder-importer-RBUPAB6J.js")]),graphs=await loadEmbeddedBuilderGraphs(),specs=new Map(Object.keys(graphs.builders).map(name=>[name,name])),loadedBuilders=await createVltBuilderImporter({graphs,require:require_,cacheRoot,debug:message=>output_manager_default.debug(message)})(specs),missingBuilders=[...specs.keys()].filter(spec=>!loadedBuilders.has(spec));if(missingBuilders.length>0)throw new Error(`Failed to load preinstalled Builders: ${missingBuilders.join(", ")}`);return output_manager_default.log(`Preinstalled ${loadedBuilders.size} Builders in ${cacheRoot}`),0}catch(error){return printError(error),1}}var CachePurgeTelemetryClient=class extends TelemetryClient{trackCliFlagYes(yes){yes&&this.trackCliFlag("yes")}trackCliOptionType(type){type&&this.trackCliOption({option:"type",value:type})}};async function purge(client,argv){let telemetry2=new CachePurgeTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(purgeSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(err){return printError(err),2}let projectName=parsedArgs.flags["--project"];telemetry2.trackCliOptionProject(projectName);let link=await resolveProjectContext({client,projectNameOrId:projectName});if(link.status==="not_linked")return output_manager_default.error("No project linked. Run `vercel link` to link a project to this directory."),1;if(link.status==="error")return link.exitCode;let{project,org}=link;client.config.currentTeam=org.type==="team"?org.id:void 0;let yes=!!parsedArgs.flags["--yes"];telemetry2.trackCliFlagYes(yes);let type=parsedArgs.flags["--type"]||"all";telemetry2.trackCliOptionType(parsedArgs.flags["--type"]);let cacheTypeMap={cdn:"the CDN cache",data:"the Data cache",all:"the CDN cache and Data cache"},validTypes=Object.keys(cacheTypeMap);if(!validTypes.includes(type))return output_manager_default.error(`Invalid cache type "${type}". Valid types are: ${validTypes.join(", ")}`),1;let typeDesciption=cacheTypeMap[type],msg=`You are about to purge ${typeDesciption} for project ${project.name}`,query=new URLSearchParams({projectIdOrName:project.id}).toString();if(!yes){if(!process.stdin.isTTY){let projectFlag=projectName?` --project ${projectName}`:"";return output_manager_default.print(`${msg}. To continue, run ${getCommandName(`cache purge${projectFlag} --yes`)}.`),1}if(!await client.input.confirm(`${msg}. Continue?`,!0))return output_manager_default.print(`Canceled.
|
|
37
37
|
`),0}let requests=[];return(type==="cdn"||type==="all")&&requests.push(client.fetch(`/v1/edge-cache/purge-all?${query}`,{method:"POST",headers:{"Content-Type":"application/json"}})),(type==="data"||type==="all")&&requests.push(client.fetch(`/v1/data-cache/purge-all?${query}`,{method:"DELETE",headers:{"Content-Type":"application/json"}})),await Promise.all(requests),output_manager_default.print(prependEmoji(`Successfully purged ${typeDesciption}`,emoji("success"))+`
|
|
38
38
|
`),0}var CacheInvalidateTelemetryClient=class extends TelemetryClient{trackCliFlagYes(yes){yes&&this.trackCliFlag("yes")}trackCliOptionTag(tag){tag&&this.trackCliOption({option:"tag",value:tag})}trackCliOptionSrcimg(srcimg){srcimg&&this.trackCliOption({option:"srcimg",value:srcimg})}};var import_pluralize=__toESM(require_pluralize(),1);async function invalidate(client,argv){let telemetry2=new CacheInvalidateTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(invalidateSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(err){return printError(err),2}let projectName=parsedArgs.flags["--project"];telemetry2.trackCliOptionProject(projectName);let link=await resolveProjectContext({client,projectNameOrId:projectName});if(link.status==="not_linked")return output_manager_default.error("No project linked. Run `vercel link` to link a project to this directory."),1;if(link.status==="error")return link.exitCode;let{project,org}=link;client.config.currentTeam=org.type==="team"?org.id:void 0;let yes=!!parsedArgs.flags["--yes"],tag=parsedArgs.flags["--tag"],srcimg=parsedArgs.flags["--srcimg"];if(telemetry2.trackCliFlagYes(yes),telemetry2.trackCliOptionTag(tag),telemetry2.trackCliOptionSrcimg(srcimg),tag&&srcimg)return output_manager_default.error("Cannot use both --tag and --srcimg options"),2;let itemName="",itemValue="",flag="",postUrl="",postBody={};if(tag)itemName=(0,import_pluralize.default)("tag",tag.split(",").length,!1),itemValue=tag,flag="--tag",postUrl="/v1/edge-cache/invalidate-by-tags",postBody={tags:tag};else if(srcimg)itemName="source image",itemValue=srcimg,flag="--srcimg",postUrl="/v1/edge-cache/invalidate-by-src-images",postBody={srcImages:[srcimg]};else return output_manager_default.error("The --tag or --srcimg option is required"),2;let msg=`You are about to invalidate all cached content associated with ${itemName} ${itemValue} for project ${project.name}`;if(!yes){if(!process.stdin.isTTY){let projectFlag=projectName?` --project ${projectName}`:"";return output_manager_default.print(`${msg}. To continue, run ${getCommandName(`cache invalidate ${flag} ${itemValue}${projectFlag} --yes`)}.`),1}if(!await client.input.confirm(`${msg}. Continue?`,!0))return output_manager_default.print(`Canceled.
|
|
39
39
|
`),0}return await client.fetch(`${postUrl}?projectIdOrName=${project.id}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(postBody)}),output_manager_default.print(prependEmoji(`Successfully invalidated all cached content associated with ${itemName} ${itemValue}`,emoji("success"))+`
|
|
@@ -44,31 +44,28 @@ ${BEST_PRACTICES_END}
|
|
|
44
44
|
|
|
45
45
|
`)}
|
|
46
46
|
`)}async function fetchEntries(query,limit){let url=new URL(query?`${CHANGELOG_API_URL}/search`:CHANGELOG_API_URL);url.searchParams.set("limit",String(limit)),query?url.searchParams.set("q",query):url.searchParams.set("include","content");try{let response=await fetch(url,{headers:{accept:"application/json","user-agent":ua_default}});if(!response.ok){response.status===429?output_manager_default.error("Too many changelog requests. Try again shortly."):output_manager_default.error("Failed to fetch changelog entries.");return}let data=await response.json();if(!data||typeof data!="object")throw new Error("Invalid changelog response");let items=data.items;if(!Array.isArray(items)||!items.every(isChangelogItem))throw new Error("Invalid changelog response");return items}catch{output_manager_default.error("Failed to fetch changelog entries. Check your connection and try again.");return}}function printCommandHelp(client,command){output_manager_default.print(help(command,{stream:client.stderr,columns:client.stderr.columns,parent:command===changelogCommand?void 0:changelogCommand}))}async function changelog(client){let telemetry2=new ChangelogTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(changelogCommand.options),rawArgs=client.argv.slice(2).filter(arg=>arg!=="--changelog"),parsedArgs;try{parsedArgs=parseArguments(rawArgs,flagsSpecification)}catch(err){return printError(err),2}let commandOffset=parsedArgs.args[0]===changelogCommand.name?1:0,{subcommand,args,subcommandOriginal}=getSubcommand(parsedArgs.args.slice(commandOffset),COMMAND_CONFIG5);if(parsedArgs.flags["--help"])return telemetry2.trackCliFlagHelp(changelogCommand.name,subcommand==="search"?subcommandOriginal:void 0),printCommandHelp(client,subcommand==="search"?searchSubcommand:changelogCommand),0;if(!subcommand&&args.length>0)return output_manager_default.error(`Unknown changelog command: ${args[0]}`),printCommandHelp(client,changelogCommand),1;let limit=parsedArgs.flags["--limit"]??DEFAULT_LIMIT;if(!Number.isInteger(limit)||limit<1||limit>MAX_LIMIT)return output_manager_default.error(`--limit must be between 1 and ${MAX_LIMIT}.`),2;telemetry2.trackCliOptionLimit(parsedArgs.flags["--limit"]),telemetry2.trackCliOptionFormat(parsedArgs.flags["--format"]),telemetry2.trackCliFlagJson(parsedArgs.flags["--json"]);let formatResult=validateJsonOutput(parsedArgs.flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let jsonOutput=formatResult.jsonOutput,query;if(subcommand==="search"&&(telemetry2.trackCliSubcommandSearch(subcommandOriginal),query=args.join(" ").trim(),!query))return output_manager_default.error("Search query is required."),printCommandHelp(client,searchSubcommand),2;jsonOutput||output_manager_default.spinner(query?"Searching the changelog\u2026":"Fetching the changelog\u2026");let items=await fetchEntries(query,limit);return jsonOutput||output_manager_default.stopSpinner(),items?jsonOutput?(client.stdout.write(`${JSON.stringify({items},null,2)}
|
|
47
|
-
`),0):items.length===0?(output_manager_default.log(query?"No changelog entries match the query.":"No changelog entries found."),0):(printEntries(items),0):1}var CommentsTelemetryClient=class extends TelemetryClient{trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandInspect(actual){this.trackCliSubcommand({subcommand:"inspect",value:actual})}trackCliSubcommandOpen(actual){this.trackCliSubcommand({subcommand:"open",value:actual})}trackCliSubcommandReply(actual){this.trackCliSubcommand({subcommand:"reply",value:actual})}trackCliSubcommandResolve(actual){this.trackCliSubcommand({subcommand:"resolve",value:actual})}trackCliSubcommandReopen(actual){this.trackCliSubcommand({subcommand:"reopen",value:actual})}trackCliSubcommandUpdate(actual){this.trackCliSubcommand({subcommand:"update",value:actual})}trackCliSubcommandDelete(actual){this.trackCliSubcommand({subcommand:"delete",value:actual})}trackCliOptionFormat(v){v&&this.trackCliOption({option:"format",value:v})}trackCliOptionStatus(v){v&&this.trackCliOption({option:"status",value:v})}trackCliFlagAllBranches(v){v&&this.trackCliFlag("all-branches")}trackCliFlagYes(v){v&&this.trackCliFlag("yes")}trackCliFlagContext(v){v&&this.trackCliFlag("context")}trackCliOptionProject(v){v&&this.trackCliOption({option:"project",value:this.redactedValue})}trackCliOptionGitBranch(v){v&&v.length>0&&this.trackCliOption({option:"git-branch",value:this.redactedValue})}trackCliOptionBranch(v){v&&v.length>0&&this.trackCliOption({option:"branch",value:this.redactedValue})}trackCliOptionPage(v){v&&v.length>0&&this.trackCliOption({option:"page",value:this.redactedValue})}trackCliOptionPagePath(v){v&&v.length>0&&this.trackCliOption({option:"page-path",value:this.redactedValue})}trackCliOptionAuthor(v){v&&v.length>0&&this.trackCliOption({option:"author",value:this.redactedValue})}trackCliOptionContent(v){v&&v.length>0&&this.trackCliOption({option:"content",value:this.redactedValue})}trackCliOptionContentId(v){v&&v.length>0&&this.trackCliOption({option:"content-id",value:this.redactedValue})}trackCliOptionQuery(v){v&&this.trackCliOption({option:"query",value:this.redactedValue})}trackCliOptionSearch(v){v&&this.trackCliOption({option:"search",value:this.redactedValue})}trackCliOptionLimit(v){typeof v=="number"&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliOptionNext(v){v&&this.trackCliOption({option:"next",value:this.redactedValue})}trackCliOptionMessage(v){v&&this.trackCliOption({option:"message",value:this.redactedValue})}trackCliOptionFile(v){v&&this.trackCliOption({option:"file",value:this.redactedValue})}trackCliOptionAttach(v){v&&v.length>0&&this.trackCliOption({option:"attach",value:this.redactedValue})}trackCliArgumentThread(v){v&&this.trackCliArgument({arg:"thread",value:this.redactedValue})}trackCliArgumentMessageId(v){v&&this.trackCliArgument({arg:"message-id",value:this.redactedValue})}trackCliArgumentSearch(v){v&&this.trackCliArgument({arg:"search",value:this.redactedValue})}};var COMMAND_CONFIG6={list:getCommandAliases(listSubcommand2),inspect:getCommandAliases(inspectSubcommand2),open:getCommandAliases(openSubcommand),reply:getCommandAliases(replySubcommand),resolve:getCommandAliases(resolveSubcommand),reopen:getCommandAliases(reopenSubcommand),update:getCommandAliases(editSubcommand),delete:getCommandAliases(deleteSubcommand)};async function comments(client){let telemetry2=new CommentsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(commentsCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),2}let{subcommand,subcommandOriginal}=getSubcommand(parsedArgs.args.slice(1),COMMAND_CONFIG6),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("comments",subcommand),output_manager_default.print(help(commentsCommand,{stream:client.stderr,columns:client.stderr.columns})),0;function printSubcommandHelp(command){output_manager_default.print(help(command,{stream:client.stderr,parent:commentsCommand,columns:client.stderr.columns}))}function handleHelp(command){return needHelp?(telemetry2.trackCliFlagHelp("comments",subcommandOriginal),printSubcommandHelp(command),!0):!1}switch(subcommand){case"inspect":return handleHelp(inspectSubcommand2)?0:(telemetry2.trackCliSubcommandInspect(subcommandOriginal),subcommandOriginal==="get"&&warnDeprecatedSubcommand(client,"comments get","comments inspect"),(await import("./chunks/inspect-6IBPIBIJ.js")).default(client,telemetry2));case"open":return handleHelp(openSubcommand)?0:(telemetry2.trackCliSubcommandOpen(subcommandOriginal),(await import("./chunks/open-WPRHI6ND.js")).default(client,telemetry2));case"reply":return handleHelp(replySubcommand)?0:(telemetry2.trackCliSubcommandReply(subcommandOriginal),(await import("./chunks/reply-YH7HRIWQ.js")).default(client,telemetry2));case"resolve":return handleHelp(resolveSubcommand)?0:(telemetry2.trackCliSubcommandResolve(subcommandOriginal),(await import("./chunks/resolve-FWVMWJTG.js")).default(client,telemetry2,!0));case"reopen":return handleHelp(reopenSubcommand)?0:(telemetry2.trackCliSubcommandReopen(subcommandOriginal),(await import("./chunks/resolve-FWVMWJTG.js")).default(client,telemetry2,!1));case"update":return handleHelp(editSubcommand)?0:(telemetry2.trackCliSubcommandUpdate(subcommandOriginal),subcommandOriginal==="edit"&&warnDeprecatedSubcommand(client,"comments edit","comments update"),(await import("./chunks/edit-FRGMYBW3.js")).default(client,telemetry2));case"delete":return handleHelp(deleteSubcommand)?0:(telemetry2.trackCliSubcommandDelete(subcommandOriginal),(await import("./chunks/delete-QQOC63HV.js")).default(client,telemetry2));default:{if(needHelp)return telemetry2.trackCliFlagHelp("comments",subcommandOriginal),subcommandOriginal!=="default"?printSubcommandHelp(listSubcommand2):output_manager_default.print(help(commentsCommand,{stream:client.stderr,columns:client.stderr.columns})),0;telemetry2.trackCliSubcommandList(subcommandOriginal);let defaultInvocation=subcommandOriginal==="default";return(await import("./chunks/list-GSVERG4S.js")).default(client,telemetry2,defaultInvocation)}}}var import_chalk3=__toESM(require_source(),1);var ContractTelemetryClient=class extends TelemetryClient{trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var import_error_utils=__toESM(require_dist(),1);async function contract(client){let{print,log,error,spinner}=output_manager_default,flagsSpecification=getFlagsSpecification(contractCommand.options),parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(err){return printError(err),2}let telemetry2=new ContractTelemetryClient({opts:{store:client.telemetryEventStore}});if(parsedArgs.flags["--help"])return telemetry2.trackCliFlagHelp("contract"),print(help(contractCommand,{stream:client.stderr,columns:client.stderr.columns})),0;let formatResult=validateJsonOutput(parsedArgs.flags);if(!formatResult.valid)return error(formatResult.error),2;let asJson=formatResult.jsonOutput;telemetry2.trackCliOptionFormat(parsedArgs.flags["--format"]),telemetry2.trackCliFlagJson(parsedArgs.flags["--json"]);let contextName,teamId;try{let scope=await getScope(client);contextName=scope.contextName,teamId=scope.team?.id}catch(err){if((0,import_error_utils.isErrnoException)(err)&&(err.code==="NOT_AUTHORIZED"||err.code==="TEAM_DELETED"))return error(err.message),1;throw err}let start=Date.now();asJson||spinner(`Fetching contract commitments for ${import_chalk3.default.bold(contextName)}`);let query=new URLSearchParams;teamId&&query.set("teamId",teamId);try{let response=await client.fetch(`/v1/billing/contract-commitments?${query}`,{json:!1,useCurrentTeam:!1});if(!response.ok){let errorText=await response.text();return error(`Failed to fetch contract commitments: ${response.status} ${errorText}`),1}let text=await response.text(),data=text?JSON.parse(text):null,commitments=Array.isArray(data)?data:[];if(asJson){let jsonOutput={context:contextName,commitments:commitments.map(c=>({contractId:c.ContractId,contractPeriodStart:c.ContractPeriodStart,contractPeriodEnd:c.ContractPeriodEnd,commitmentId:c.ContractCommitmentId,commitmentType:c.ContractCommitmentType,commitmentCategory:c.ContractCommitmentCategory,commitmentPeriodStart:c.ContractCommitmentPeriodStart,commitmentPeriodEnd:c.ContractCommitmentPeriodEnd,commitmentCost:c.ContractCommitmentCost,commitmentQuantity:c.ContractCommitmentQuantity,commitmentUnit:c.ContractCommitmentUnit,billingCurrency:c.BillingCurrency,description:c.ContractCommitmentDescription})),totalCommitments:commitments.length};return client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
`)}return log(`${import_chalk3.default.gray("Total commitments:")} ${commitments.length}`),0}catch(err){return output_manager_default.prettyError(err),1}}var import_chalk4=__toESM(require_source(),1);import{resolve}from"path";import{access,readFile as readFile2,writeFile as writeFile2}from"fs/promises";var CronsAddTelemetryClient=class extends TelemetryClient{trackCliOptionPath(path){path&&this.trackCliOption({option:"path",value:this.redactedValue})}trackCliOptionSchedule(schedule){schedule&&this.trackCliOption({option:"schedule",value:this.redactedValue})}};var CRON_FIELD_RANGES=[["minute",0,59],["hour",0,23],["day of month",1,31],["month",1,12],["day of week",0,7]];function validateCronSchedule(expression){if(expression.length>256)return"Schedule expression must be 256 characters or less";let fields=expression.trim().split(/\s+/);if(fields.length!==5)return`Schedule must have exactly 5 fields (minute hour day-of-month month day-of-week), got ${fields.length}`;for(let i=0;i<fields.length;i++){let[name,min,max]=CRON_FIELD_RANGES[i],error=validateCronField(fields[i],name,min,max);if(error)return error}return!0}function validateCronField(field,name,min,max){let parts=field.split(",");for(let part of parts){let[range,stepStr]=part.split("/");if(stepStr!==void 0){let step=Number(stepStr);if(!Number.isInteger(step)||step<1)return`Invalid step value "${stepStr}" in ${name} field`}if(range==="*")continue;if(range.includes("-")){let rangeParts=range.split("-");if(rangeParts.length!==2||rangeParts[0]===""||rangeParts[1]==="")return`Invalid range "${range}" in ${name} field`;let[startStr,endStr]=rangeParts,start=Number(startStr),end=Number(endStr);if(!Number.isInteger(start)||!Number.isInteger(end))return`Invalid range "${range}" in ${name} field`;if(start<min||start>max||end<min||end>max)return`Value out of range in ${name} field (${min}-${max})`;if(start>end)return`Invalid range "${range}" in ${name} field: start is greater than end`;continue}let value=Number(range);if(!Number.isInteger(value))return`Invalid value "${range}" in ${name} field`;if(value<min||value>max)return`Value ${value} out of range in ${name} field (${min}-${max})`}return null}async function add(client,argv){let telemetry2=new CronsAddTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(addSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{flags}=parsedArgs,cronPath=flags["--path"],schedule=flags["--schedule"];if(telemetry2.trackCliOptionPath(cronPath),telemetry2.trackCliOptionSchedule(schedule),!cronPath||!schedule){if(!client.stdin.isTTY)return output_manager_default.error(`Missing required options. Use ${getCommandName('crons add --path /api/cron --schedule "0 10 * * *"')} in non-interactive mode.`),2;cronPath||(cronPath=await client.input.text({message:"What is the API route path for the cron job?",validate:value=>value.startsWith("/")?value.length>512?"Path must be 512 characters or less":!0:"Path must start with /"})),schedule||(schedule=await client.input.text({message:"What is the cron schedule expression?",validate:validateCronSchedule}))}if(!cronPath.startsWith("/"))return output_manager_default.error("Path must start with /"),1;if(cronPath.length>512)return output_manager_default.error("Path must be 512 characters or less"),1;let scheduleValidation=validateCronSchedule(schedule);if(scheduleValidation!==!0)return output_manager_default.error(scheduleValidation),1;let nonJsonConfigs=[...VERCEL_CONFIG_EXTENSIONS.map(ext=>`vercel.${ext}`),"vercel.toml"];for(let configName of nonJsonConfigs){let altPath=resolve(client.cwd,configName);try{return await access(altPath),output_manager_default.error(`Found ${import_chalk4.default.cyan(configName)} \u2014 ${getCommandName("crons add")} only supports ${import_chalk4.default.cyan("vercel.json")}. Add cron jobs directly to your ${import_chalk4.default.cyan(configName)} file instead.`),1}catch{}}let configPath=resolve(client.cwd,"vercel.json"),config;try{let content=await readFile2(configPath,"utf-8");config=JSON.parse(content)}catch(err){if(err instanceof SyntaxError)return output_manager_default.error(`Failed to parse ${import_chalk4.default.cyan("vercel.json")}: ${err.message}`),1;if(err instanceof Error&&"code"in err&&err.code==="ENOENT")config={};else return output_manager_default.error(`Failed to read ${import_chalk4.default.cyan("vercel.json")}: ${err instanceof Error?err.message:String(err)}`),1}let existingCrons=Array.isArray(config.crons)?config.crons:[];if(existingCrons.some(c=>c.path===cronPath))return output_manager_default.error(`A cron job with path ${import_chalk4.default.bold(cronPath)} already exists in vercel.json`),1;existingCrons.push({path:cronPath,schedule}),config.crons=existingCrons;try{await writeFile2(configPath,JSON.stringify(config,null,2)+`
|
|
51
|
-
`,"utf-8")}catch(err){return output_manager_default.error(`Failed to write ${import_chalk4.default.cyan("vercel.json")}: ${err instanceof Error?err.message:String(err)}`),1}return output_manager_default.log(`Added cron job ${import_chalk4.default.bold(cronPath)} with schedule ${import_chalk4.default.bold(schedule)} to ${import_chalk4.default.cyan("vercel.json")}`),output_manager_default.warn(`This cron job won't be active until the project is deployed to production. Run ${getCommandName("deploy --prod")} to deploy.`),0}var import_chalk5=__toESM(require_source(),1);var CronsLsTelemetryClient=class extends TelemetryClient{trackCliOptionFormat(format){format&&this.trackCliOption({option:"format",value:format})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function ls(client,argv){let telemetry2=new CronsLsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(listSubcommand3.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs,validationResult=validateLsArgs({commandName:"crons ls",args,maxArgs:0,exitCode:2});if(validationResult!==0)return validationResult;telemetry2.trackCliOptionFormat(opts["--format"]);let projectName=opts["--project"];telemetry2.trackCliOptionProject(projectName);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput,link=await resolveProjectContext({client,projectNameOrId: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 ${client.nonInteractive?`run ${getCommandName("link --yes --team <team-id> --project <project-id>")} to link non-interactively.`:`run ${getCommandName("link")} to begin.`}`),1;client.config.currentTeam=link.org.type==="team"?link.org.id:void 0;let{project,org}=link,lsStamp=stamp_default();output_manager_default.spinner(`Fetching cron jobs for ${import_chalk5.default.bold(`${org.slug}/${project.name}`)}`);let projectData=await client.fetch(`/v9/projects/${encodeURIComponent(project.id)}`),definitions=projectData.crons?.definitions??[],isDisabled=projectData.crons?.disabledAt!=null,localConfig=readLocalConfig(client.cwd),localCrons=Array.isArray(localConfig?.crons)?localConfig.crons:[],deployedByPath=new Map(definitions.map(d=>[d.path,d])),undeployedCrons=[],modifiedCrons=[];for(let local of localCrons){let deployed=deployedByPath.get(local.path);deployed?deployed.schedule!==local.schedule&&modifiedCrons.push({local,deployed}):undeployedCrons.push(local)}if(asJson){output_manager_default.stopSpinner();let jsonOutput={crons:definitions.map(cron=>({path:cron.path,schedule:cron.schedule,host:cron.host})),undeployed:undeployedCrons.map(cron=>({path:cron.path,schedule:cron.schedule})),modified:modifiedCrons.map(({local,deployed})=>({path:local.path,localSchedule:local.schedule,deployedSchedule:deployed.schedule})),enabled:!isDisabled};client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
|
|
52
|
-
`)}else if(definitions.length===0&&undeployedCrons.length===0&&modifiedCrons.length===0)output_manager_default.log(`No cron jobs found for ${import_chalk5.default.bold(`${org.slug}/${project.name}`)} ${import_chalk5.default.gray(lsStamp())}`);else{let totalDeployed=definitions.length;if(totalDeployed>0&&(output_manager_default.log(`${totalDeployed} cron ${totalDeployed===1?"job":"jobs"} found for ${import_chalk5.default.bold(`${org.slug}/${project.name}`)}${isDisabled?import_chalk5.default.yellow(" (disabled)"):""} ${import_chalk5.default.gray(lsStamp())}`),output_manager_default.print(formatCronsTable(definitions).replace(/^(.*)/gm,`${" ".repeat(1)}$1`)),output_manager_default.print(`
|
|
47
|
+
`),0):items.length===0?(output_manager_default.log(query?"No changelog entries match the query.":"No changelog entries found."),0):(printEntries(items),0):1}var CommentsTelemetryClient=class extends TelemetryClient{trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandInspect(actual){this.trackCliSubcommand({subcommand:"inspect",value:actual})}trackCliSubcommandOpen(actual){this.trackCliSubcommand({subcommand:"open",value:actual})}trackCliSubcommandReply(actual){this.trackCliSubcommand({subcommand:"reply",value:actual})}trackCliSubcommandResolve(actual){this.trackCliSubcommand({subcommand:"resolve",value:actual})}trackCliSubcommandReopen(actual){this.trackCliSubcommand({subcommand:"reopen",value:actual})}trackCliSubcommandUpdate(actual){this.trackCliSubcommand({subcommand:"update",value:actual})}trackCliSubcommandDelete(actual){this.trackCliSubcommand({subcommand:"delete",value:actual})}trackCliOptionFormat(v){v&&this.trackCliOption({option:"format",value:v})}trackCliOptionStatus(v){v&&this.trackCliOption({option:"status",value:v})}trackCliFlagAllBranches(v){v&&this.trackCliFlag("all-branches")}trackCliFlagYes(v){v&&this.trackCliFlag("yes")}trackCliFlagContext(v){v&&this.trackCliFlag("context")}trackCliOptionProject(v){v&&this.trackCliOption({option:"project",value:this.redactedValue})}trackCliOptionGitBranch(v){v&&v.length>0&&this.trackCliOption({option:"git-branch",value:this.redactedValue})}trackCliOptionBranch(v){v&&v.length>0&&this.trackCliOption({option:"branch",value:this.redactedValue})}trackCliOptionPage(v){v&&v.length>0&&this.trackCliOption({option:"page",value:this.redactedValue})}trackCliOptionPagePath(v){v&&v.length>0&&this.trackCliOption({option:"page-path",value:this.redactedValue})}trackCliOptionAuthor(v){v&&v.length>0&&this.trackCliOption({option:"author",value:this.redactedValue})}trackCliOptionContent(v){v&&v.length>0&&this.trackCliOption({option:"content",value:this.redactedValue})}trackCliOptionContentId(v){v&&v.length>0&&this.trackCliOption({option:"content-id",value:this.redactedValue})}trackCliOptionQuery(v){v&&this.trackCliOption({option:"query",value:this.redactedValue})}trackCliOptionSearch(v){v&&this.trackCliOption({option:"search",value:this.redactedValue})}trackCliOptionLimit(v){typeof v=="number"&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliOptionNext(v){v&&this.trackCliOption({option:"next",value:this.redactedValue})}trackCliOptionMessage(v){v&&this.trackCliOption({option:"message",value:this.redactedValue})}trackCliOptionFile(v){v&&this.trackCliOption({option:"file",value:this.redactedValue})}trackCliOptionAttach(v){v&&v.length>0&&this.trackCliOption({option:"attach",value:this.redactedValue})}trackCliArgumentThread(v){v&&this.trackCliArgument({arg:"thread",value:this.redactedValue})}trackCliArgumentMessageId(v){v&&this.trackCliArgument({arg:"message-id",value:this.redactedValue})}trackCliArgumentSearch(v){v&&this.trackCliArgument({arg:"search",value:this.redactedValue})}};var COMMAND_CONFIG6={list:getCommandAliases(listSubcommand2),inspect:getCommandAliases(inspectSubcommand2),open:getCommandAliases(openSubcommand),reply:getCommandAliases(replySubcommand),resolve:getCommandAliases(resolveSubcommand),reopen:getCommandAliases(reopenSubcommand),update:getCommandAliases(editSubcommand),delete:getCommandAliases(deleteSubcommand)};async function comments(client){let telemetry2=new CommentsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(commentsCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),2}let{subcommand,subcommandOriginal}=getSubcommand(parsedArgs.args.slice(1),COMMAND_CONFIG6),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("comments",subcommand),output_manager_default.print(help(commentsCommand,{stream:client.stderr,columns:client.stderr.columns})),0;function printSubcommandHelp(command){output_manager_default.print(help(command,{stream:client.stderr,parent:commentsCommand,columns:client.stderr.columns}))}function handleHelp(command){return needHelp?(telemetry2.trackCliFlagHelp("comments",subcommandOriginal),printSubcommandHelp(command),!0):!1}switch(subcommand){case"inspect":return handleHelp(inspectSubcommand2)?0:(telemetry2.trackCliSubcommandInspect(subcommandOriginal),subcommandOriginal==="get"&&warnDeprecatedSubcommand(client,"comments get","comments inspect"),(await import("./chunks/inspect-C43IV7X4.js")).default(client,telemetry2));case"open":return handleHelp(openSubcommand)?0:(telemetry2.trackCliSubcommandOpen(subcommandOriginal),(await import("./chunks/open-KGVG54NN.js")).default(client,telemetry2));case"reply":return handleHelp(replySubcommand)?0:(telemetry2.trackCliSubcommandReply(subcommandOriginal),(await import("./chunks/reply-XVK33N5T.js")).default(client,telemetry2));case"resolve":return handleHelp(resolveSubcommand)?0:(telemetry2.trackCliSubcommandResolve(subcommandOriginal),(await import("./chunks/resolve-JZ262ZF4.js")).default(client,telemetry2,!0));case"reopen":return handleHelp(reopenSubcommand)?0:(telemetry2.trackCliSubcommandReopen(subcommandOriginal),(await import("./chunks/resolve-JZ262ZF4.js")).default(client,telemetry2,!1));case"update":return handleHelp(editSubcommand)?0:(telemetry2.trackCliSubcommandUpdate(subcommandOriginal),subcommandOriginal==="edit"&&warnDeprecatedSubcommand(client,"comments edit","comments update"),(await import("./chunks/edit-YID3FOJ3.js")).default(client,telemetry2));case"delete":return handleHelp(deleteSubcommand)?0:(telemetry2.trackCliSubcommandDelete(subcommandOriginal),(await import("./chunks/delete-5RN5VW5L.js")).default(client,telemetry2));default:{if(needHelp)return telemetry2.trackCliFlagHelp("comments",subcommandOriginal),subcommandOriginal!=="default"?printSubcommandHelp(listSubcommand2):output_manager_default.print(help(commentsCommand,{stream:client.stderr,columns:client.stderr.columns})),0;telemetry2.trackCliSubcommandList(subcommandOriginal);let defaultInvocation=subcommandOriginal==="default";return(await import("./chunks/list-2SY6PZLC.js")).default(client,telemetry2,defaultInvocation)}}}var import_chalk3=__toESM(require_source(),1);import{resolve}from"path";import{access,readFile as readFile2,writeFile as writeFile2}from"fs/promises";var CronsAddTelemetryClient=class extends TelemetryClient{trackCliOptionPath(path){path&&this.trackCliOption({option:"path",value:this.redactedValue})}trackCliOptionSchedule(schedule){schedule&&this.trackCliOption({option:"schedule",value:this.redactedValue})}};var CRON_FIELD_RANGES=[["minute",0,59],["hour",0,23],["day of month",1,31],["month",1,12],["day of week",0,7]];function validateCronSchedule(expression){if(expression.length>256)return"Schedule expression must be 256 characters or less";let fields=expression.trim().split(/\s+/);if(fields.length!==5)return`Schedule must have exactly 5 fields (minute hour day-of-month month day-of-week), got ${fields.length}`;for(let i=0;i<fields.length;i++){let[name,min,max]=CRON_FIELD_RANGES[i],error=validateCronField(fields[i],name,min,max);if(error)return error}return!0}function validateCronField(field,name,min,max){let parts=field.split(",");for(let part of parts){let[range,stepStr]=part.split("/");if(stepStr!==void 0){let step=Number(stepStr);if(!Number.isInteger(step)||step<1)return`Invalid step value "${stepStr}" in ${name} field`}if(range==="*")continue;if(range.includes("-")){let rangeParts=range.split("-");if(rangeParts.length!==2||rangeParts[0]===""||rangeParts[1]==="")return`Invalid range "${range}" in ${name} field`;let[startStr,endStr]=rangeParts,start=Number(startStr),end=Number(endStr);if(!Number.isInteger(start)||!Number.isInteger(end))return`Invalid range "${range}" in ${name} field`;if(start<min||start>max||end<min||end>max)return`Value out of range in ${name} field (${min}-${max})`;if(start>end)return`Invalid range "${range}" in ${name} field: start is greater than end`;continue}let value=Number(range);if(!Number.isInteger(value))return`Invalid value "${range}" in ${name} field`;if(value<min||value>max)return`Value ${value} out of range in ${name} field (${min}-${max})`}return null}async function add(client,argv){let telemetry2=new CronsAddTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(addSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{flags}=parsedArgs,cronPath=flags["--path"],schedule=flags["--schedule"];if(telemetry2.trackCliOptionPath(cronPath),telemetry2.trackCliOptionSchedule(schedule),!cronPath||!schedule){if(!client.stdin.isTTY)return output_manager_default.error(`Missing required options. Use ${getCommandName('crons add --path /api/cron --schedule "0 10 * * *"')} in non-interactive mode.`),2;cronPath||(cronPath=await client.input.text({message:"What is the API route path for the cron job?",validate:value=>value.startsWith("/")?value.length>512?"Path must be 512 characters or less":!0:"Path must start with /"})),schedule||(schedule=await client.input.text({message:"What is the cron schedule expression?",validate:validateCronSchedule}))}if(!cronPath.startsWith("/"))return output_manager_default.error("Path must start with /"),1;if(cronPath.length>512)return output_manager_default.error("Path must be 512 characters or less"),1;let scheduleValidation=validateCronSchedule(schedule);if(scheduleValidation!==!0)return output_manager_default.error(scheduleValidation),1;let nonJsonConfigs=[...VERCEL_CONFIG_EXTENSIONS.map(ext=>`vercel.${ext}`),"vercel.toml"];for(let configName of nonJsonConfigs){let altPath=resolve(client.cwd,configName);try{return await access(altPath),output_manager_default.error(`Found ${import_chalk3.default.cyan(configName)} \u2014 ${getCommandName("crons add")} only supports ${import_chalk3.default.cyan("vercel.json")}. Add cron jobs directly to your ${import_chalk3.default.cyan(configName)} file instead.`),1}catch{}}let configPath=resolve(client.cwd,"vercel.json"),config;try{let content=await readFile2(configPath,"utf-8");config=JSON.parse(content)}catch(err){if(err instanceof SyntaxError)return output_manager_default.error(`Failed to parse ${import_chalk3.default.cyan("vercel.json")}: ${err.message}`),1;if(err instanceof Error&&"code"in err&&err.code==="ENOENT")config={};else return output_manager_default.error(`Failed to read ${import_chalk3.default.cyan("vercel.json")}: ${err instanceof Error?err.message:String(err)}`),1}let existingCrons=Array.isArray(config.crons)?config.crons:[];if(existingCrons.some(c=>c.path===cronPath))return output_manager_default.error(`A cron job with path ${import_chalk3.default.bold(cronPath)} already exists in vercel.json`),1;existingCrons.push({path:cronPath,schedule}),config.crons=existingCrons;try{await writeFile2(configPath,JSON.stringify(config,null,2)+`
|
|
48
|
+
`,"utf-8")}catch(err){return output_manager_default.error(`Failed to write ${import_chalk3.default.cyan("vercel.json")}: ${err instanceof Error?err.message:String(err)}`),1}return output_manager_default.log(`Added cron job ${import_chalk3.default.bold(cronPath)} with schedule ${import_chalk3.default.bold(schedule)} to ${import_chalk3.default.cyan("vercel.json")}`),output_manager_default.warn(`This cron job won't be active until the project is deployed to production. Run ${getCommandName("deploy --prod")} to deploy.`),0}var import_chalk4=__toESM(require_source(),1);var CronsLsTelemetryClient=class extends TelemetryClient{trackCliOptionFormat(format){format&&this.trackCliOption({option:"format",value:format})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function ls(client,argv){let telemetry2=new CronsLsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(listSubcommand3.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs,validationResult=validateLsArgs({commandName:"crons ls",args,maxArgs:0,exitCode:2});if(validationResult!==0)return validationResult;telemetry2.trackCliOptionFormat(opts["--format"]);let projectName=opts["--project"];telemetry2.trackCliOptionProject(projectName);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput,link=await resolveProjectContext({client,projectNameOrId: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 ${client.nonInteractive?`run ${getCommandName("link --yes --team <team-id> --project <project-id>")} to link non-interactively.`:`run ${getCommandName("link")} to begin.`}`),1;client.config.currentTeam=link.org.type==="team"?link.org.id:void 0;let{project,org}=link,lsStamp=stamp_default();output_manager_default.spinner(`Fetching cron jobs for ${import_chalk4.default.bold(`${org.slug}/${project.name}`)}`);let projectData=await client.fetch(`/v9/projects/${encodeURIComponent(project.id)}`),definitions=projectData.crons?.definitions??[],isDisabled=projectData.crons?.disabledAt!=null,localConfig=readLocalConfig(client.cwd),localCrons=Array.isArray(localConfig?.crons)?localConfig.crons:[],deployedByPath=new Map(definitions.map(d=>[d.path,d])),undeployedCrons=[],modifiedCrons=[];for(let local of localCrons){let deployed=deployedByPath.get(local.path);deployed?deployed.schedule!==local.schedule&&modifiedCrons.push({local,deployed}):undeployedCrons.push(local)}if(asJson){output_manager_default.stopSpinner();let jsonOutput={crons:definitions.map(cron=>({path:cron.path,schedule:cron.schedule,host:cron.host})),undeployed:undeployedCrons.map(cron=>({path:cron.path,schedule:cron.schedule})),modified:modifiedCrons.map(({local,deployed})=>({path:local.path,localSchedule:local.schedule,deployedSchedule:deployed.schedule})),enabled:!isDisabled};client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
|
|
49
|
+
`)}else if(definitions.length===0&&undeployedCrons.length===0&&modifiedCrons.length===0)output_manager_default.log(`No cron jobs found for ${import_chalk4.default.bold(`${org.slug}/${project.name}`)} ${import_chalk4.default.gray(lsStamp())}`);else{let totalDeployed=definitions.length;if(totalDeployed>0&&(output_manager_default.log(`${totalDeployed} cron ${totalDeployed===1?"job":"jobs"} found for ${import_chalk4.default.bold(`${org.slug}/${project.name}`)}${isDisabled?import_chalk4.default.yellow(" (disabled)"):""} ${import_chalk4.default.gray(lsStamp())}`),output_manager_default.print(formatCronsTable(definitions).replace(/^(.*)/gm,`${" ".repeat(1)}$1`)),output_manager_default.print(`
|
|
53
50
|
|
|
54
51
|
`)),undeployedCrons.length>0||modifiedCrons.length>0){let pendingCount=undeployedCrons.length+modifiedCrons.length;output_manager_default.log(`${pendingCount} local ${pendingCount===1?"change":"changes"} pending deploy`),output_manager_default.print(formatPendingCronsTable(undeployedCrons,modifiedCrons).replace(/^(.*)/gm,`${" ".repeat(1)}$1`)),output_manager_default.print(`
|
|
55
52
|
|
|
56
|
-
`),output_manager_default.warn(`Run ${getCommandName("deploy --prod")} to apply local changes.`)}}return 0}function formatCronsTable(definitions){let rows=definitions.map(cron=>[
|
|
53
|
+
`),output_manager_default.warn(`Run ${getCommandName("deploy --prod")} to apply local changes.`)}}return 0}function formatCronsTable(definitions){let rows=definitions.map(cron=>[import_chalk4.default.bold(cron.path),cron.schedule]);return formatTable(["Path","Schedule"],["l","l"],[{rows}])}function formatPendingCronsTable(undeployed,modified){let rows=[...modified.map(({local,deployed})=>[import_chalk4.default.bold(local.path),`${import_chalk4.default.dim(deployed.schedule)} \u2192 ${local.schedule}`,import_chalk4.default.yellow("modified")]),...undeployed.map(cron=>[import_chalk4.default.dim(cron.path),import_chalk4.default.dim(cron.schedule),import_chalk4.default.yellow("not deployed")])];return formatTable(["Path","Schedule","Status"],["l","l","l"],[{rows}])}var import_chalk5=__toESM(require_source(),1);var CronsRunTelemetryClient=class extends TelemetryClient{trackCliArgumentPath(path){path&&this.trackCliArgument({arg:"path",value:this.redactedValue})}};async function run(client,argv){let telemetry2=new CronsRunTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(runSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs,[cronPath]=args,projectName=opts["--project"];telemetry2.trackCliOptionProject(projectName),telemetry2.trackCliArgumentPath(cronPath);let link=await resolveProjectContext({client,projectNameOrId: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 ${client.nonInteractive?`run ${getCommandName("link --yes --team <team-id> --project <project-id>")} to link non-interactively.`:`run ${getCommandName("link")} to begin.`}`),1;client.config.currentTeam=link.org.type==="team"?link.org.id:void 0;let{project,org}=link,runStamp=stamp_default();output_manager_default.spinner(`Fetching cron jobs for ${import_chalk5.default.bold(`${org.slug}/${project.name}`)}`);let projectData=await client.fetch(`/v9/projects/${encodeURIComponent(project.id)}`),definitions=projectData.crons?.definitions??[];if(definitions.length===0)return output_manager_default.error(`No cron jobs found for ${import_chalk5.default.bold(`${org.slug}/${project.name}`)}. Define cron jobs in your vercel.json file.`),1;if(projectData.crons?.disabledAt!=null)return output_manager_default.error(`Cron jobs are disabled for ${import_chalk5.default.bold(`${org.slug}/${project.name}`)}. Enable them in the project settings.`),1;if(!cronPath){if(client.nonInteractive)return output_manager_default.error(`A cron path argument is required in non-interactive mode. Usage: ${getCommandName("crons run <path>")}`),2;output_manager_default.stopSpinner(),definitions.length===1?(cronPath=definitions[0].path,output_manager_default.log(`Auto-selected ${import_chalk5.default.bold(cronPath)} (only cron job)`)):cronPath=await client.input.select({message:"Which cron job would you like to run?",choices:definitions.map(cron=>({name:`${cron.path} (${cron.schedule})`,value:cron.path}))})}let cronDef=definitions.find(d=>d.path===cronPath);if(!cronDef)return output_manager_default.error(`Cron job with path ${import_chalk5.default.bold(cronPath)} not found. Run ${getCommandName("crons ls")} to see available cron jobs.`),1;output_manager_default.spinner(`Triggering cron job ${import_chalk5.default.bold(cronPath)}`);let teamId=link.org.type==="team"?link.org.id:void 0,qs=teamId?`?teamId=${encodeURIComponent(teamId)}`:"",result;try{result=await client.fetch(`/v1/projects/${encodeURIComponent(project.id)}/crons/run${qs}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:cronDef.path,schedule:cronDef.schedule})})}catch(err){if(isAPIError(err))return output_manager_default.error(`Failed to trigger cron job ${import_chalk5.default.bold(cronPath)}: ${err.message}`),1;throw err}return output_manager_default.log(`Cron job ${import_chalk5.default.bold(cronPath)} triggered ${import_chalk5.default.gray(runStamp())}`),output_manager_default.log(` Invocation time: ${import_chalk5.default.cyan(new Date(result.invocationAt).toISOString())}`),0}var CronsTelemetryClient=class extends TelemetryClient{trackCliSubcommandAdd(actual){this.trackCliSubcommand({subcommand:"add",value:actual})}trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandRun(actual){this.trackCliSubcommand({subcommand:"run",value:actual})}};var COMMAND_CONFIG7={add:["add"],ls:["ls","list"],run:["run"]};async function main2(client){let parsedArgs,flagsSpecification=getFlagsSpecification(cronsCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(error){return printError(error),2}let telemetry2=new CronsTelemetryClient({opts:{store:client.telemetryEventStore}}),{subcommand,args,subcommandOriginal}=getSubcommand(parsedArgs.args.slice(1),COMMAND_CONFIG7),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("crons"),output_manager_default.print(help(cronsCommand,{stream:client.stderr,columns:client.stderr.columns})),0;function printHelp(command){return output_manager_default.print(help(command,{stream:client.stderr,parent:cronsCommand,columns:client.stderr.columns})),0}switch(subcommand){case"add":return needHelp?(telemetry2.trackCliFlagHelp("crons",subcommandOriginal),printHelp(addSubcommand)):(telemetry2.trackCliSubcommandAdd(subcommandOriginal),add(client,args));case"run":return needHelp?(telemetry2.trackCliFlagHelp("crons",subcommandOriginal),printHelp(runSubcommand)):(telemetry2.trackCliSubcommandRun(subcommandOriginal),run(client,args));default:return needHelp?(telemetry2.trackCliFlagHelp("crons",subcommandOriginal),printHelp(listSubcommand3)):(telemetry2.trackCliSubcommandList(subcommandOriginal),ls(client,args))}}var import_chalk6=__toESM(require_source(),1);var DeployHooksLsTelemetryClient=class extends TelemetryClient{trackCliOptionFormat(format){format&&this.trackCliOption({option:"format",value:format})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function ls2(client,argv){let telemetry2=new DeployHooksLsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(listSubcommand4.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs,validationResult=validateLsArgs({commandName:"deploy-hooks ls",args,maxArgs:0,exitCode:2});if(validationResult!==0)return validationResult;telemetry2.trackCliOptionFormat(opts["--format"]),telemetry2.trackCliOptionProject(opts["--project"]);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput||client.nonInteractive,contextName=await getContextName(client),lsStamp=stamp_default();client.nonInteractive||output_manager_default.spinner(`Fetching deploy hooks under ${import_chalk6.default.bold(contextName)}`);try{let project=await getProjectByCwdOrLink({client,commandName:"deploy-hooks ls",projectNameOrId:opts["--project"],forReadOnlyCommand:!0}),hooks=project.link?.deployHooks??[];if(asJson){output_manager_default.stopSpinner();let rows2=hooks.map(h=>({id:h.id,name:h.name,ref:h.ref,url:h.url,createdAt:h.createdAt}));return client.nonInteractive?client.stdout.write(`${JSON.stringify({status:AGENT_STATUS.OK,projectId:project.id,projectName:project.name,hooks:rows2,message:hooks.length===0?"No deploy hooks for this project.":`Listed ${hooks.length} deploy hook${hooks.length===1?"":"s"}.`,next:[{command:getCommandNamePlain("deploy-hooks create <name> --git-branch <BRANCH>"),when:"Create a deploy hook"}]},null,2)}
|
|
57
54
|
`):client.stdout.write(`${JSON.stringify(rows2,null,2)}
|
|
58
|
-
`),0}if(output_manager_default.stopSpinner(),hooks.length===0)return output_manager_default.log(`No deploy hooks configured for ${
|
|
55
|
+
`),0}if(output_manager_default.stopSpinner(),hooks.length===0)return output_manager_default.log(`No deploy hooks configured for ${import_chalk6.default.bold(project.name)} ${lsStamp()}`),0;output_manager_default.log(`Deploy hooks for ${import_chalk6.default.bold(project.name)} ${import_chalk6.default.gray(lsStamp())}
|
|
59
56
|
`);let rows=hooks.map(h=>[h.name,h.id,h.ref,h.url]);return output_manager_default.print(`${formatTable(["name","id","ref","url"],["l","l","l","l"],[{rows}])}
|
|
60
|
-
`),0}catch(err){return output_manager_default.stopSpinner(),printError(err),1}}var
|
|
61
|
-
`),0):(output_manager_default.success(`Deploy hook created on ${
|
|
62
|
-
`),output_manager_default.print(` ${
|
|
63
|
-
`),output_manager_default.print(` ${
|
|
64
|
-
`),output_manager_default.print(` ${
|
|
65
|
-
`),output_manager_default.print(` ${
|
|
57
|
+
`),0}catch(err){return output_manager_default.stopSpinner(),printError(err),1}}var import_chalk7=__toESM(require_source(),1);var DeployHooksCreateTelemetryClient=class extends TelemetryClient{trackCliArgumentName(name){name&&this.trackCliArgument({arg:"name",value:this.redactedValue})}trackCliOptionGitBranch(gitBranch){gitBranch&&this.trackCliOption({option:"git-branch",value:this.redactedValue})}trackCliOptionRef(ref){ref&&this.trackCliOption({option:"ref",value:this.redactedValue})}};async function create(client,argv){let telemetry2=new DeployHooksCreateTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(createSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return client.nonInteractive&&outputAgentError(client,{status:"error",reason:AGENT_REASON.INVALID_ARGUMENTS,message:error instanceof Error?error.message:String(error)},2),printError(error),2}let{args,flags:opts}=parsedArgs,[nameArg]=args;telemetry2.trackCliArgumentName(nameArg),telemetry2.trackCliOptionGitBranch(opts["--git-branch"]),telemetry2.trackCliOptionRef(opts["--ref"]),telemetry2.trackCliOptionProject(opts["--project"]);let branchError=applyDeprecatedGitBranchFlag(client,opts,"--ref",getTypedOptionName(argv,flagsSpecification,"--ref"));if(branchError)return client.nonInteractive&&outputAgentError(client,{status:"error",reason:AGENT_REASON.INVALID_ARGUMENTS,message:branchError},2),output_manager_default.error(branchError),2;let ref=opts["--git-branch"],contextName=await getContextName(client);client.nonInteractive||output_manager_default.spinner(`Loading project under ${import_chalk7.default.bold(contextName)}`);let project;try{project=await getProjectByCwdOrLink({client,commandName:"deploy-hooks create",projectNameOrId:opts["--project"]})}catch(err){return output_manager_default.stopSpinner(),exitWithNonInteractiveError(client,err,1,{variant:"checks"}),printError(err),1}if(output_manager_default.stopSpinner(),!project.link){let message="This project is not connected to a Git repository, so it cannot have deploy hooks. Connect a repo under Project Settings \u2192 Git.";return client.nonInteractive&&outputAgentError(client,{status:"error",reason:AGENT_REASON.INVALID_ARGUMENTS,message},2),output_manager_default.error(message),2}nameArg||(client.nonInteractive&&outputAgentError(client,{status:"error",reason:AGENT_REASON.INVALID_ARGUMENTS,message:"Deploy hook name is required. Pass it as the first argument after `create`.",next:[{command:getCommandNamePlain("deploy-hooks create <name> --git-branch <BRANCH>")}]},2),nameArg=await client.input.text({message:"Deploy hook name:",validate:val=>val?.trim()?val.trim().length>180?"Name must be at most 180 characters":!0:"Name is required"}));let name=nameArg.trim();if(!name)return output_manager_default.error("Deploy hook name cannot be empty."),1;if(!ref){let defaultRef=project.link.productionBranch&&project.link.productionBranch.trim()?project.link.productionBranch.trim():"main";client.nonInteractive&&outputAgentError(client,{status:"error",reason:AGENT_REASON.INVALID_ARGUMENTS,message:"Git branch is required in non-interactive mode. Pass `--git-branch <BRANCH>`.",next:[{command:getCommandNamePlain(`deploy-hooks create ${name} --git-branch <BRANCH>`)}]},2),ref=await client.input.text({message:"Git branch ref to deploy:",default:defaultRef,validate:val=>val?.trim()?!0:"Branch ref is required"})}let refTrimmed=ref.trim();if(!refTrimmed)return output_manager_default.error("Branch ref cannot be empty."),1;let previousIds=new Set((project.link.deployHooks??[]).map(h=>h.id));client.nonInteractive||output_manager_default.spinner(`Creating deploy hook on ${import_chalk7.default.bold(project.name)}`);let createStamp=stamp_default();try{let created=((await client.fetch(`/v2/projects/${encodeURIComponent(project.id)}/deploy-hooks`,{method:"POST",body:{name,ref:refTrimmed}})).link?.deployHooks??[]).find(h=>!previousIds.has(h.id));return output_manager_default.stopSpinner(),client.nonInteractive?(client.stdout.write(`${JSON.stringify({status:AGENT_STATUS.OK,hook:created??{name,ref:refTrimmed},projectId:project.id,projectName:project.name,message:created?`Created deploy hook ${created.id} on ${project.name}.`:`Created deploy hook on ${project.name}.`,next:[{command:buildCommandWithGlobalFlags(client.argv,"deploy-hooks ls"),when:"List deploy hooks for this project"}]},null,2)}
|
|
58
|
+
`),0):(output_manager_default.success(`Deploy hook created on ${import_chalk7.default.bold(project.name)} ${createStamp()}`),created&&(output_manager_default.print(`
|
|
59
|
+
`),output_manager_default.print(` ${import_chalk7.default.cyan("Name".padEnd(12))}${created.name}
|
|
60
|
+
`),output_manager_default.print(` ${import_chalk7.default.cyan("Branch".padEnd(12))}${created.ref}
|
|
61
|
+
`),output_manager_default.print(` ${import_chalk7.default.cyan("ID".padEnd(12))}${created.id}
|
|
62
|
+
`),output_manager_default.print(` ${import_chalk7.default.cyan("URL".padEnd(12))}${created.url}
|
|
66
63
|
`),output_manager_default.print(`
|
|
67
|
-
${
|
|
68
|
-
`)),0)}catch(err){return output_manager_default.stopSpinner(),isAPIError(err)?client.nonInteractive?(outputAgentError(client,{status:"error",reason:AGENT_REASON.API_ERROR,message:err.message},1),1):(output_manager_default.error(err.message),1):(exitWithNonInteractiveError(client,err,1,{variant:"checks"}),printError(err),1)}}var import_chalk9=__toESM(require_source(),1);var DeployHooksRmTelemetryClient=class extends TelemetryClient{trackCliArgumentId(id){id&&this.trackCliArgument({arg:"id",value:this.redactedValue})}trackCliFlagYes(yes){yes&&this.trackCliFlag("yes")}};function deployHooksCommandWithGlobalFlags(baseSubcommand,argv){let globalFlags=getGlobalFlagsFromArgs(argv.slice(2)),full=globalFlags.length?`${baseSubcommand} ${globalFlags.join(" ")}`:baseSubcommand;return getCommandNamePlain(full)}async function rm(client,argv){let telemetry2=new DeployHooksRmTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(removeSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs,[hookId]=args;if(telemetry2.trackCliArgumentId(hookId),telemetry2.trackCliOptionProject(opts["--project"]),telemetry2.trackCliFlagYes(opts["--yes"]),!hookId)return client.nonInteractive&&outputAgentError(client,{status:"error",reason:"missing_id",message:"Deploy hook id is required. Pass it as the first argument.",next:[{command:deployHooksCommandWithGlobalFlags("deploy-hooks ls",client.argv)},{command:deployHooksCommandWithGlobalFlags("deploy-hooks delete <id> --yes",client.argv)}]},2),output_manager_default.error(`${getCommandName("deploy-hooks delete <id>")} expects one argument`),2;let skipConfirmation=opts["--yes"]||!1;if(client.nonInteractive&&!skipConfirmation&&outputAgentError(client,{status:"error",reason:"confirmation_required",message:"Deleting a deploy hook requires confirmation. Re-run with --yes.",next:[{command:buildCommandWithYes(client.argv)}]},1),args.length!==1)return output_manager_default.error(`Invalid number of arguments. Usage: ${import_chalk9.default.cyan(getCommandName("deploy-hooks delete <id>"))}`),2;let contextName=await getContextName(client),project;try{project=await getProjectByCwdOrLink({client,commandName:"deploy-hooks delete",projectNameOrId:opts["--project"],forReadOnlyCommand:!0})}catch(err){return printError(err),1}let existing=project.link?.deployHooks?.find(h=>h.id===hookId);if(!existing)return client.nonInteractive&&outputAgentError(client,{status:"error",reason:"not_found",message:`No deploy hook ${param(hookId)} on project ${project.name}.`,next:[{command:deployHooksCommandWithGlobalFlags("deploy-hooks ls",client.argv)}]},1),output_manager_default.error(`No deploy hook ${param(hookId)} on project ${param(project.name)}`),1;if(!client.nonInteractive&&!await client.input.confirm(`Delete deploy hook ${import_chalk9.default.bold(existing.name)} (${hookId}) from ${import_chalk9.default.bold(project.name)}?`,!1))return output_manager_default.log("Canceled."),0;let rmStamp=stamp_default();client.nonInteractive||output_manager_default.spinner(`Deleting deploy hook under ${import_chalk9.default.bold(contextName)} ${import_chalk9.default.gray(rmStamp)}`);try{return await client.fetch(`/v2/projects/${encodeURIComponent(project.id)}/deploy-hooks/${encodeURIComponent(hookId)}`,{method:"DELETE"}),output_manager_default.stopSpinner(),output_manager_default.success(`Deleted deploy hook ${import_chalk9.default.bold(hookId)} from ${import_chalk9.default.bold(project.name)} ${rmStamp()}`),0}catch(err){return output_manager_default.stopSpinner(),isAPIError(err)&&err.status===404?(output_manager_default.error(`No deploy hook ${param(hookId)} on project ${param(project.name)}`),1):isAPIError(err)?(output_manager_default.error(err.message),1):(printError(err),1)}}var DeployHooksTelemetryClient=class extends TelemetryClient{trackCliSubcommandCreate(actual){this.trackCliSubcommand({subcommand:"create",value:actual})}trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandDelete(actual){this.trackCliSubcommand({subcommand:"delete",value:actual})}};var COMMAND_CONFIG8={create:["create","add"],ls:["ls","list"],delete:["delete","rm","del","remove"]};async function main3(client){let parsedArgs,flagsSpecification=getFlagsSpecification(deployHooksCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(error){return printError(error),2}let telemetry2=new DeployHooksTelemetryClient({opts:{store:client.telemetryEventStore}}),{subcommand,args,subcommandOriginal}=getSubcommand(parsedArgs.args.slice(1),COMMAND_CONFIG8),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("deploy-hooks"),output_manager_default.print(help(deployHooksCommand,{stream:client.stderr,columns:client.stderr.columns})),0;function printHelp(command){return output_manager_default.print(help(command,{stream:client.stderr,parent:deployHooksCommand,columns:client.stderr.columns})),0}switch(subcommand){case"create":return needHelp?(telemetry2.trackCliFlagHelp("deploy-hooks",subcommandOriginal),printHelp(createSubcommand)):(telemetry2.trackCliSubcommandCreate(subcommandOriginal),subcommandOriginal==="add"&&warnDeprecatedSubcommand(client,"deploy-hooks add","deploy-hooks create"),create(client,args));case"delete":return needHelp?(telemetry2.trackCliFlagHelp("deploy-hooks",subcommandOriginal),printHelp(removeSubcommand)):(telemetry2.trackCliSubcommandDelete(subcommandOriginal),subcommandOriginal==="remove"&&warnDeprecatedSubcommand(client,"deploy-hooks remove","deploy-hooks delete"),rm(client,args));default:return needHelp?(telemetry2.trackCliFlagHelp("deploy-hooks",subcommandOriginal),printHelp(listSubcommand4)):(telemetry2.trackCliSubcommandList(subcommandOriginal),ls2(client,args))}}var import_chalk10=__toESM(require_source(),1);var DoctorTelemetryClient=class extends TelemetryClient{trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var import_fs_extra=__toESM(require_lib(),1),import_semver=__toESM(require_semver(),1),import_build_utils=__toESM(require_build_utils(),1),import_types=__toESM(require_types(),1);import{join as join2,relative,resolve as resolve2}from"path";var import_fetch_dist_tags=__toESM(require_fetch_dist_tags(),1);function getPackageManagerInstallCommand(context,version2="latest"){if(context.upgradeCommand===void 0)throw context.upgradeError;return context.upgradeCommand.includes("@latest")?context.upgradeCommand.replace("@latest",`@${version2}`):context.upgradeCommand}async function resolvePackageManagerContext(version2,runtime,options){if(await isHomebrewInstall())return{version:version2,runtime,manager:"package-manager",canSwitchVersions:!1,packageManager:"homebrew",packageManagerAssumed:!1,global:!0,upgradeCommand:HOMEBREW_UPGRADE_COMMAND};try{let info=await getUpdateCommandInfo(void 0,options.signal);return{version:version2,runtime,manager:"package-manager",canSwitchVersions:!1,packageManager:info.packageManager,packageManagerAssumed:info.assumed,global:info.global,upgradeCommand:info.command}}catch(error){if(options.signal?.aborted)throw error;let upgradeError=error instanceof Error?error:new Error("Could not detect a supported global npm, pnpm, Yarn, or Bun installation of Vercel CLI. Update it with the package manager that installed it.");return{version:version2,runtime,manager:"package-manager",canSwitchVersions:!1,packageManager:void 0,packageManagerAssumed:!1,global:void 0,upgradeCommand:void 0,upgradeError}}}async function getVersionContext(options={}){let version2=pkg_default.version,runtime=isNativeBinaryInstall()?"native":"node";if(await isCurlInstall()){let installRoot=getInstallRoot(),state=await readNativeInstallState(installRoot);return{version:version2,runtime:"native",manager:"installer",canSwitchVersions:!0,installRoot,track:state?.track,slot:state?.slot,activeVersion:state?.version,pendingProduction:state?.pendingProduction,prBuild:state?.track==="pr"&&state.pr?{number:state.pr,sha:state.buildSha}:void 0}}return resolvePackageManagerContext(version2,runtime,options)}function describeRuntime(context){return context.runtime==="native"?"native binary":"Node.js"}function describeManager(context){if(context.manager==="installer")return`Vercel installer (${context.installRoot})`;if(context.global===void 0)return"package manager (unsupported installation)";if(context.packageManager==="homebrew")return"Homebrew";let scope=context.global?"global":"local";return context.packageManagerAssumed?`package manager (assumed ${context.packageManager}, ${scope})`:`package manager (${context.packageManager}, ${scope})`}var LATEST_VERSION_TIMEOUT_MS=5e3,INSTALL_DETECTION_TIMEOUT_MS=2e4,PACKAGE_MANAGER_NAMES={npm:"npm",pnpm:"pnpm",yarn:"Yarn",bun:"Bun"};function check(id,status4,message,options={}){return{id,status:status4,message,detail:options.detail,next:options.next??[],data:options.data??{}}}var CONTEXT_OPTIONS={"--cwd":"--cwd","--scope":"--scope","-S":"--scope","--team":"--scope","-T":"--scope","--global-config":"--global-config","-Q":"--global-config","--local-config":"--local-config","-A":"--local-config"};function getContextArgs(client,omit){let args=getGlobalFlagsFromArgs(client.argv.slice(2)),context=[];for(let i=0;i<args.length;i++){let[name,inlineValue]=args[i].split(/=(.*)/s),value=inlineValue??(globalCliFlagTakesValue(name)&&!args[i+1]?.startsWith("-")?args[++i]:void 0),canonical=CONTEXT_OPTIONS[name];canonical&&!omit.includes(canonical)&&value!==void 0&&context.push(canonical,value)}return context}function vercelStep(client,label,command,{omit=[]}={}){let argv=[packageName,...command.split(" "),...getContextArgs(client,omit)];return{label,command:argv.map(quoteShellArg).join(" "),argv}}function errorMessage(err){return remoteText(err instanceof Error?err.message:String(err))}async function checkCli(client){let[context,npmLatest]=await Promise.all([getVersionContext({signal:AbortSignal.timeout(INSTALL_DETECTION_TIMEOUT_MS)}).catch(()=>null),(0,import_fetch_dist_tags.fetchDistTags)(pkg_default.name,{timeout:LATEST_VERSION_TIMEOUT_MS}).then(tags=>tags?.latest)]),latest=npmLatest;if(context?.manager==="installer"){let{resolveLatestNativeVersion:resolveLatestNativeVersion2}=await import("./chunks/native-self-update-DEVBYOH2.js");latest=await resolveLatestNativeVersion2({signal:AbortSignal.timeout(LATEST_VERSION_TIMEOUT_MS)}).catch(()=>{})}return[versionCheck(client,context,latest),await installCheck(context)]}function canUpgrade(context){return context!==null&&(context.manager==="installer"||context.upgradeCommand!==void 0)}function versionCheck(client,context,latest){let{version:version2}=pkg_default,data={version:version2,latest:latest??null};return latest?import_semver.default.valid(version2)&&import_semver.default.valid(latest)&&import_semver.default.lt(version2,latest)?check("cli_version","warning",`${latest} is available`,{detail:`You have ${version2}`,next:canUpgrade(context)?[vercelStep(client,`Upgrade to ${latest}`,"upgrade")]:[],data}):check("cli_version","ok",`${version2} (latest)`,{data}):check("cli_version","skipped",`${version2} (couldn't check for a newer version)`,{data})}async function getRunningPath(){let path=isNativeBinaryInstall()?process.execPath:process.argv[1];return(0,import_fs_extra.realpath)(path).catch(()=>path)}async function installCheck(context){if(!context)return check("cli_install","skipped","Couldn't tell how this CLI was installed",{data:{method:null}});if(context.manager==="installer")return check("cli_install","ok","Vercel installer",{data:{method:"installer",path:context.installRoot}});if(context.packageManager==="homebrew")return check("cli_install","ok","Homebrew",{data:{method:"homebrew"}});if(context.packageManager)return check("cli_install","ok",`Global ${PACKAGE_MANAGER_NAMES[context.packageManager]} install`,{data:{method:context.packageManager}});let path=await getRunningPath();return check("cli_install","warning","`vercel upgrade` can't update this install",{detail:`Runs from ${path}`,next:[{label:"Install the CLI with the Vercel installer, which `vercel upgrade` can update",command:CURL_INSTALL_COMMAND,argv:["sh","-c",CURL_INSTALL_COMMAND]}],data:{method:null,path}})}async function readLocalLink(client){let orgId=(0,import_build_utils.getPlatformEnv)("ORG_ID"),projectId=(0,import_build_utils.getPlatformEnv)("PROJECT_ID");if(orgId&&projectId)return{status:"linked",orgId,projectId,projectName:null,source:"env"};if(orgId||projectId){let[set,missing]=orgId?["VERCEL_ORG_ID","VERCEL_PROJECT_ID"]:["VERCEL_PROJECT_ID","VERCEL_ORG_ID"];return{status:"invalid",message:`${set} is set without ${missing}. Set both or neither`}}try{let link=await getLinkFromDir(getVercelDirectory(client.cwd));if(link)return{status:"linked",orgId:link.orgId,projectId:link.projectId,projectName:link.projectName??null,source:"project"};let repoLink=await getRepoLink(client,client.cwd);if(repoLink?.repoConfig){let projects=findProjectsFromPath(repoLink.repoConfig.projects,relative(repoLink.rootPath,client.cwd));if(projects.length>1)return{status:"ambiguous",projects:projects.map(p=>p.name)};let[project]=projects,projectOrgId=project?.orgId??repoLink.repoConfig.orgId;if(project&&projectOrgId)return{status:"linked",orgId:projectOrgId,projectId:project.id,projectName:project.name,source:"repo"}}}catch(err){return{status:"invalid",message:errorMessage(err)}}return{status:"none"}}function tokenSourceLabel(client){switch(client.authConfig.tokenSource){case"flag":return"--token";case"env":return"VERCEL_TOKEN";default:return"saved login"}}function isSAMLError(err){return isAPIError(err)&&!!err.saml}var RequestedScopeError=class extends Error{constructor(scope,kind,principal){super(`Can't use scope ${scope}`);this.scope=scope;this.kind=kind;this.principal=principal}};async function applyRequestedScope(client,scope){let user;try{user=await getUser(client)}catch(err){if(!(err instanceof InvalidToken)||!isAppPrincipalEnabled())throw err;let token=await introspectToken(client).catch(()=>null),app=token?resolveAppFromToken(token):null;if(!token||!app)throw err;if(token.team&&(token.team.id===scope||token.team.slug===scope)){client.config.currentTeam=token.team.id;return}throw new RequestedScopeError(scope,"app_token",app.name??app.id)}let team;try{team=await getTeamByIdOrSlug(client,scope,{useCurrentTeam:!1})}catch(err){if(isSAMLError(err))throw err;team=(await getTeams(client)).find(t=>t.id===scope||t.slug===scope)}if(team){client.config.currentTeam=team.id;return}let isUser=scope===user.id||scope===user.username||scope===user.email;if(isUser&&user.version!=="northstar"){delete client.config.currentTeam;return}throw new RequestedScopeError(scope,isUser?"personal_account":"not_found",user.username)}async function checkAccount(client,requestedScope){let localLink=await readLocalLink(client);if(!client.authConfig.token)return[check("login","failed","Not logged in",{next:[vercelStep(client,"Log in to Vercel","login")],data:{loggedIn:!1}}),check("team","skipped","Needs a login",{data:{team:null}}),localProjectCheck(client,localLink)];let source=tokenSourceLabel(client),login2,team;try{requestedScope&&await applyRequestedScope(client,requestedScope);let scope=await getScope(client,{chooseTeam:!1}),name=scope.user?.username??scope.app?.name??scope.app?.id;login2=check("login","ok",`${name} (${source})`,{data:{loggedIn:!0,username:scope.user?.username??null,app:scope.app??null,source}}),team=teamCheck(client,scope)}catch(err){let principal=client.user?.username??(err instanceof RequestedScopeError?err.principal:void 0);login2=principal?check("login","ok",`${principal} (${source})`,{data:{loggedIn:!0,username:client.user?.username??null,source}}):loginFailure(client,err,source),team=principal?teamFailure(client,err):check("team","skipped","Needs a login",{data:{team:null}})}return login2.status!=="ok"?[login2,team,localProjectCheck(client,localLink)]:[login2,team,await projectCheck(client,localLink)]}function loginFailure(client,err,source){if(err instanceof InvalidToken){let message=source==="saved login"?"Your saved login expired or was revoked":`The token from ${source} isn't valid`;return check("login","failed",message,{next:source==="saved login"?[vercelStep(client,"Log in again","login")]:[],data:{loggedIn:!1,source}})}return check("login","failed","Couldn't check your login",{detail:errorMessage(err),data:{loggedIn:null,source,error:errorMessage(err)}})}function teamCheck(client,scope){return scope.team?check("team","ok",remoteText(scope.team.slug),{data:{team:{id:scope.team.id,slug:scope.team.slug}}}):client.isTeamUnchosen()?check("team","warning","No team chosen for this agent run",{detail:"Pass --scope <TEAM> with each command",next:[vercelStep(client,"See the teams you can pass to --scope","teams list")],data:{team:null}}):check("team","ok","Personal account",{data:{team:null}})}function teamFailure(client,err){if(err instanceof RequestedScopeError){let scope=remoteText(err.scope),data={team:null,scope:err.scope};return err.kind==="app_token"?check("team","failed",`This app token only works in its own team, not ${scope}`,{data}):check("team","failed",err.kind==="personal_account"?`--scope ${scope} names your personal account, which can't be a scope`:`Can't find team ${scope}`,{next:[vercelStep(client,"See the teams you can use","teams list",{omit:["--scope"]})],data})}let next=[vercelStep(client,"Choose another team","teams switch")];return err instanceof TeamDeleted?check("team","failed","Your current team doesn't exist anymore",{detail:"It was deleted, or you were removed from it",next,data:{team:{id:client.config.currentTeam??null}}}):isSAMLError(err)?check("team","failed","Your team needs you to log in again",{detail:err.scope?`${remoteText(err.scope)} requires SAML`:void 0,next:[vercelStep(client,"Log in again","login")],data:{team:{id:client.config.currentTeam??null}}}):isAPIError(err)&&err.status===403?check("team","failed","You can't access your current team",{next,data:{team:{id:client.config.currentTeam??null}}}):check("team","failed","Couldn't check your team",{detail:errorMessage(err),data:{team:null,error:errorMessage(err)}})}function localProjectCheck(client,link){switch(link.status){case"none":return check("project","warning","This folder isn't linked",{next:[vercelStep(client,"Link it to a project","link")],data:{project:null}});case"ambiguous":return check("project","warning",`${link.projects.length} linked projects match this folder`,{detail:"Run commands from a project's folder, or pass --project",data:{project:null,projects:link.projects.map(name=>remoteText(name))}});case"invalid":return check("project","failed","Can't read the project link",{detail:link.message,data:{project:null,error:link.message}});case"linked":return check("project","skipped","Needs a login",{detail:`Linked to ${projectLabel(link)}`,data:{project:linkData(link)}})}}function projectLabel(link){let name=remoteText(link.projectName??link.projectId);return link.source==="env"?`${name} (VERCEL_PROJECT_ID)`:name}function linkData(link){return{id:link.projectId,name:link.projectName,orgId:link.orgId,source:link.source}}async function projectCheck(client,link){if(link.status!=="linked")return localProjectCheck(client,link);let relink=[vercelStep(client,"Link this folder again","link")];try{let project=await getProjectByNameOrId(client,link.projectId,link.orgId);if(project instanceof ProjectNotFound)return check("project","failed",`Can't find ${projectLabel(link)}`,{detail:"It was deleted or moved to another team, or you lost access to it",next:link.source==="env"?[]:relink,data:{project:linkData(link)}});let name=remoteText(project.name);return check("project","ok",link.source==="env"?`${name} (VERCEL_PROJECT_ID)`:name,{data:{project:{...linkData(link),name:project.name}}})}catch(err){return isSAMLError(err)?check("project","failed","Can't check the project",{detail:"Its team needs you to log in again",next:[vercelStep(client,"Log in again","login")],data:{project:linkData(link)}}):isAPIError(err)&&err.status===403?check("project","failed",`You can't access ${projectLabel(link)}`,{next:link.source==="env"?[]:relink,data:{project:linkData(link)}}):check("project","failed","Couldn't check the project",{detail:errorMessage(err),data:{project:linkData(link),error:errorMessage(err)}})}}async function checkVercelJson(client){let name=client.localConfigPath??"vercel.json",file=client.localConfigPath?resolve2(client.cwd,client.localConfigPath):join2(client.cwd,"vercel.json"),config=await readJSONFile(file);if(config===null)return check("vercel_json","ok",`No ${name} in this folder`,{data:{file:null}});if(config instanceof CantParseJSONFile)return check("vercel_json","failed",`${name} isn't valid JSON`,{detail:config.meta.parseErrorLocation,data:{file:name,error:config.meta.parseErrorLocation}});let{validateConfig}=await import("./chunks/validate-config-XWZ7ZZ3G.js");config[import_types.fileNameSymbol]=name;let error=validateConfig(config);if(error){let detail=error.message.replace(/^Invalid .+? - /,"");return check("vercel_json","failed",`${name} has an error`,{detail,data:{file:name,error:detail}})}return check("vercel_json","ok",`${name} is valid`,{data:{file:name}})}async function checkVercelStatus(client){let{getStatusReport,STATUS_PAGE_HOST}=await import("./chunks/statuspage-KHTMA4WL.js"),report;try{report=await getStatusReport()}catch{return check("vercel_status","skipped",`Couldn't reach ${STATUS_PAGE_HOST}`,{data:{incidents:null}})}let active=report.incidents.filter(incident=>!incident.resolvedAt),data={incidents:active.map(({id,name,url})=>({id,name,url}))},next=[vercelStep(client,"See the details","health")];if(active.length>0){let count=active.length===1?"1 active incident":`${active.length} active incidents`;return check("vercel_status","warning",count,{detail:active.map(incident=>remoteText(incident.name)).join("; "),next,data})}return report.status.indicator!=="none"?check("vercel_status","warning",remoteText(report.status.description),{next,data}):check("vercel_status","ok","No active incidents",{data})}var LABELS={cli_version:"CLI version",cli_install:"CLI install",login:"Login",team:"Team",project:"Project",vercel_json:"vercel.json",vercel_status:"Vercel status"},STATUSES={ok:{label:"OK",tone:"success"},warning:{label:"Warning",tone:"pending"},failed:{label:"Failed",tone:"error"},skipped:{label:"Skipped",tone:"muted"}};async function runGroup(ids,run2){try{let result=await run2();return Array.isArray(result)?result:[result]}catch(err){let error=remoteText(err instanceof Error?err.message:String(err));return ids.map(id=>({id,status:"skipped",message:"Couldn't run this check",detail:error,next:[],data:{error}}))}}async function runChecks(client,{scope}={}){return(await Promise.all([runGroup(["cli_version","cli_install"],()=>checkCli(client)),runGroup(["login","team","project"],()=>checkAccount(client,scope)),runGroup(["vercel_json"],()=>checkVercelJson(client)),runGroup(["vercel_status"],()=>checkVercelStatus(client))])).flat()}function formatTable2(client,checks){let headers=["Check","Status","Details"],lines=c=>[c.message,c.detail].filter(Boolean).map(line=>remoteText(line));if(!client.stdout.isTTY)return`${[headers,...checks.map(c=>[LABELS[c.id],STATUSES[c.status].label,lines(c).join("; ")])].map(row=>row.join(" ")).join(`
|
|
64
|
+
${import_chalk7.default.dim("Anyone with the URL can trigger a deployment. Store it securely.")}
|
|
65
|
+
`)),0)}catch(err){return output_manager_default.stopSpinner(),isAPIError(err)?client.nonInteractive?(outputAgentError(client,{status:"error",reason:AGENT_REASON.API_ERROR,message:err.message},1),1):(output_manager_default.error(err.message),1):(exitWithNonInteractiveError(client,err,1,{variant:"checks"}),printError(err),1)}}var import_chalk8=__toESM(require_source(),1);var DeployHooksRmTelemetryClient=class extends TelemetryClient{trackCliArgumentId(id){id&&this.trackCliArgument({arg:"id",value:this.redactedValue})}trackCliFlagYes(yes){yes&&this.trackCliFlag("yes")}};function deployHooksCommandWithGlobalFlags(baseSubcommand,argv){let globalFlags=getGlobalFlagsFromArgs(argv.slice(2)),full=globalFlags.length?`${baseSubcommand} ${globalFlags.join(" ")}`:baseSubcommand;return getCommandNamePlain(full)}async function rm(client,argv){let telemetry2=new DeployHooksRmTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(removeSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs,[hookId]=args;if(telemetry2.trackCliArgumentId(hookId),telemetry2.trackCliOptionProject(opts["--project"]),telemetry2.trackCliFlagYes(opts["--yes"]),!hookId)return client.nonInteractive&&outputAgentError(client,{status:"error",reason:"missing_id",message:"Deploy hook id is required. Pass it as the first argument.",next:[{command:deployHooksCommandWithGlobalFlags("deploy-hooks ls",client.argv)},{command:deployHooksCommandWithGlobalFlags("deploy-hooks delete <id> --yes",client.argv)}]},2),output_manager_default.error(`${getCommandName("deploy-hooks delete <id>")} expects one argument`),2;let skipConfirmation=opts["--yes"]||!1;if(client.nonInteractive&&!skipConfirmation&&outputAgentError(client,{status:"error",reason:"confirmation_required",message:"Deleting a deploy hook requires confirmation. Re-run with --yes.",next:[{command:buildCommandWithYes(client.argv)}]},1),args.length!==1)return output_manager_default.error(`Invalid number of arguments. Usage: ${import_chalk8.default.cyan(getCommandName("deploy-hooks delete <id>"))}`),2;let contextName=await getContextName(client),project;try{project=await getProjectByCwdOrLink({client,commandName:"deploy-hooks delete",projectNameOrId:opts["--project"],forReadOnlyCommand:!0})}catch(err){return printError(err),1}let existing=project.link?.deployHooks?.find(h=>h.id===hookId);if(!existing)return client.nonInteractive&&outputAgentError(client,{status:"error",reason:"not_found",message:`No deploy hook ${param(hookId)} on project ${project.name}.`,next:[{command:deployHooksCommandWithGlobalFlags("deploy-hooks ls",client.argv)}]},1),output_manager_default.error(`No deploy hook ${param(hookId)} on project ${param(project.name)}`),1;if(!client.nonInteractive&&!await client.input.confirm(`Delete deploy hook ${import_chalk8.default.bold(existing.name)} (${hookId}) from ${import_chalk8.default.bold(project.name)}?`,!1))return output_manager_default.log("Canceled."),0;let rmStamp=stamp_default();client.nonInteractive||output_manager_default.spinner(`Deleting deploy hook under ${import_chalk8.default.bold(contextName)} ${import_chalk8.default.gray(rmStamp)}`);try{return await client.fetch(`/v2/projects/${encodeURIComponent(project.id)}/deploy-hooks/${encodeURIComponent(hookId)}`,{method:"DELETE"}),output_manager_default.stopSpinner(),output_manager_default.success(`Deleted deploy hook ${import_chalk8.default.bold(hookId)} from ${import_chalk8.default.bold(project.name)} ${rmStamp()}`),0}catch(err){return output_manager_default.stopSpinner(),isAPIError(err)&&err.status===404?(output_manager_default.error(`No deploy hook ${param(hookId)} on project ${param(project.name)}`),1):isAPIError(err)?(output_manager_default.error(err.message),1):(printError(err),1)}}var DeployHooksTelemetryClient=class extends TelemetryClient{trackCliSubcommandCreate(actual){this.trackCliSubcommand({subcommand:"create",value:actual})}trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandDelete(actual){this.trackCliSubcommand({subcommand:"delete",value:actual})}};var COMMAND_CONFIG8={create:["create","add"],ls:["ls","list"],delete:["delete","rm","del","remove"]};async function main3(client){let parsedArgs,flagsSpecification=getFlagsSpecification(deployHooksCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(error){return printError(error),2}let telemetry2=new DeployHooksTelemetryClient({opts:{store:client.telemetryEventStore}}),{subcommand,args,subcommandOriginal}=getSubcommand(parsedArgs.args.slice(1),COMMAND_CONFIG8),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("deploy-hooks"),output_manager_default.print(help(deployHooksCommand,{stream:client.stderr,columns:client.stderr.columns})),0;function printHelp(command){return output_manager_default.print(help(command,{stream:client.stderr,parent:deployHooksCommand,columns:client.stderr.columns})),0}switch(subcommand){case"create":return needHelp?(telemetry2.trackCliFlagHelp("deploy-hooks",subcommandOriginal),printHelp(createSubcommand)):(telemetry2.trackCliSubcommandCreate(subcommandOriginal),subcommandOriginal==="add"&&warnDeprecatedSubcommand(client,"deploy-hooks add","deploy-hooks create"),create(client,args));case"delete":return needHelp?(telemetry2.trackCliFlagHelp("deploy-hooks",subcommandOriginal),printHelp(removeSubcommand)):(telemetry2.trackCliSubcommandDelete(subcommandOriginal),subcommandOriginal==="remove"&&warnDeprecatedSubcommand(client,"deploy-hooks remove","deploy-hooks delete"),rm(client,args));default:return needHelp?(telemetry2.trackCliFlagHelp("deploy-hooks",subcommandOriginal),printHelp(listSubcommand4)):(telemetry2.trackCliSubcommandList(subcommandOriginal),ls2(client,args))}}var import_chalk9=__toESM(require_source(),1);var DoctorTelemetryClient=class extends TelemetryClient{trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var import_fs_extra=__toESM(require_lib(),1),import_semver=__toESM(require_semver(),1),import_build_utils=__toESM(require_build_utils(),1),import_types=__toESM(require_types(),1);import{join as join2,relative,resolve as resolve2}from"path";var import_fetch_dist_tags=__toESM(require_fetch_dist_tags(),1);function getPackageManagerInstallCommand(context,version2="latest"){if(context.upgradeCommand===void 0)throw context.upgradeError;return context.upgradeCommand.includes("@latest")?context.upgradeCommand.replace("@latest",`@${version2}`):context.upgradeCommand}async function resolvePackageManagerContext(version2,runtime,options){if(await isHomebrewInstall())return{version:version2,runtime,manager:"package-manager",canSwitchVersions:!1,packageManager:"homebrew",packageManagerAssumed:!1,global:!0,upgradeCommand:HOMEBREW_UPGRADE_COMMAND};try{let info=await getUpdateCommandInfo(void 0,options.signal);return{version:version2,runtime,manager:"package-manager",canSwitchVersions:!1,packageManager:info.packageManager,packageManagerAssumed:info.assumed,global:info.global,upgradeCommand:info.command}}catch(error){if(options.signal?.aborted)throw error;let upgradeError=error instanceof Error?error:new Error("Could not detect a supported global npm, pnpm, Yarn, or Bun installation of Vercel CLI. Update it with the package manager that installed it.");return{version:version2,runtime,manager:"package-manager",canSwitchVersions:!1,packageManager:void 0,packageManagerAssumed:!1,global:void 0,upgradeCommand:void 0,upgradeError}}}async function getVersionContext(options={}){let version2=pkg_default.version,runtime=isNativeBinaryInstall()?"native":"node";if(await isCurlInstall()){let installRoot=getInstallRoot(),state=await readNativeInstallState(installRoot);return{version:version2,runtime:"native",manager:"installer",canSwitchVersions:!0,installRoot,track:state?.track,slot:state?.slot,activeVersion:state?.version,pendingProduction:state?.pendingProduction,prBuild:state?.track==="pr"&&state.pr?{number:state.pr,sha:state.buildSha}:void 0}}return resolvePackageManagerContext(version2,runtime,options)}function describeRuntime(context){return context.runtime==="native"?"native binary":"Node.js"}function describeManager(context){if(context.manager==="installer")return`Vercel installer (${context.installRoot})`;if(context.global===void 0)return"package manager (unsupported installation)";if(context.packageManager==="homebrew")return"Homebrew";let scope=context.global?"global":"local";return context.packageManagerAssumed?`package manager (assumed ${context.packageManager}, ${scope})`:`package manager (${context.packageManager}, ${scope})`}var LATEST_VERSION_TIMEOUT_MS=5e3,INSTALL_DETECTION_TIMEOUT_MS=2e4,PACKAGE_MANAGER_NAMES={npm:"npm",pnpm:"pnpm",yarn:"Yarn",bun:"Bun"};function check(id,status4,message,options={}){return{id,status:status4,message,detail:options.detail,next:options.next??[],data:options.data??{}}}var CONTEXT_OPTIONS={"--cwd":"--cwd","--scope":"--scope","-S":"--scope","--team":"--scope","-T":"--scope","--global-config":"--global-config","-Q":"--global-config","--local-config":"--local-config","-A":"--local-config"};function getContextArgs(client,omit){let args=getGlobalFlagsFromArgs(client.argv.slice(2)),context=[];for(let i=0;i<args.length;i++){let[name,inlineValue]=args[i].split(/=(.*)/s),value=inlineValue??(globalCliFlagTakesValue(name)&&!args[i+1]?.startsWith("-")?args[++i]:void 0),canonical=CONTEXT_OPTIONS[name];canonical&&!omit.includes(canonical)&&value!==void 0&&context.push(canonical,value)}return context}function vercelStep(client,label,command,{omit=[]}={}){let argv=[packageName,...command.split(" "),...getContextArgs(client,omit)];return{label,command:argv.map(quoteShellArg).join(" "),argv}}function errorMessage(err){return remoteText(err instanceof Error?err.message:String(err))}async function checkCli(client){let[context,npmLatest]=await Promise.all([getVersionContext({signal:AbortSignal.timeout(INSTALL_DETECTION_TIMEOUT_MS)}).catch(()=>null),(0,import_fetch_dist_tags.fetchDistTags)(pkg_default.name,{timeout:LATEST_VERSION_TIMEOUT_MS}).then(tags=>tags?.latest)]),latest=npmLatest;if(context?.manager==="installer"){let{resolveLatestNativeVersion:resolveLatestNativeVersion2}=await import("./chunks/native-self-update-DEVBYOH2.js");latest=await resolveLatestNativeVersion2({signal:AbortSignal.timeout(LATEST_VERSION_TIMEOUT_MS)}).catch(()=>{})}return[versionCheck(client,context,latest),await installCheck(context)]}function canUpgrade(context){return context!==null&&(context.manager==="installer"||context.upgradeCommand!==void 0)}function versionCheck(client,context,latest){let{version:version2}=pkg_default,data={version:version2,latest:latest??null};return latest?import_semver.default.valid(version2)&&import_semver.default.valid(latest)&&import_semver.default.lt(version2,latest)?check("cli_version","warning",`${latest} is available`,{detail:`You have ${version2}`,next:canUpgrade(context)?[vercelStep(client,`Upgrade to ${latest}`,"upgrade")]:[],data}):check("cli_version","ok",`${version2} (latest)`,{data}):check("cli_version","skipped",`${version2} (couldn't check for a newer version)`,{data})}async function getRunningPath(){let path=isNativeBinaryInstall()?process.execPath:process.argv[1];return(0,import_fs_extra.realpath)(path).catch(()=>path)}async function installCheck(context){if(!context)return check("cli_install","skipped","Couldn't tell how this CLI was installed",{data:{method:null}});if(context.manager==="installer")return check("cli_install","ok","Vercel installer",{data:{method:"installer",path:context.installRoot}});if(context.packageManager==="homebrew")return check("cli_install","ok","Homebrew",{data:{method:"homebrew"}});if(context.packageManager)return check("cli_install","ok",`Global ${PACKAGE_MANAGER_NAMES[context.packageManager]} install`,{data:{method:context.packageManager}});let path=await getRunningPath();return check("cli_install","warning","`vercel upgrade` can't update this install",{detail:`Runs from ${path}`,next:[{label:"Install the CLI with the Vercel installer, which `vercel upgrade` can update",command:CURL_INSTALL_COMMAND,argv:["sh","-c",CURL_INSTALL_COMMAND]}],data:{method:null,path}})}async function readLocalLink(client){let orgId=(0,import_build_utils.getPlatformEnv)("ORG_ID"),projectId=(0,import_build_utils.getPlatformEnv)("PROJECT_ID");if(orgId&&projectId)return{status:"linked",orgId,projectId,projectName:null,source:"env"};if(orgId||projectId){let[set,missing]=orgId?["VERCEL_ORG_ID","VERCEL_PROJECT_ID"]:["VERCEL_PROJECT_ID","VERCEL_ORG_ID"];return{status:"invalid",message:`${set} is set without ${missing}. Set both or neither`}}try{let link=await getLinkFromDir(getVercelDirectory(client.cwd));if(link)return{status:"linked",orgId:link.orgId,projectId:link.projectId,projectName:link.projectName??null,source:"project"};let repoLink=await getRepoLink(client,client.cwd);if(repoLink?.repoConfig){let projects=findProjectsFromPath(repoLink.repoConfig.projects,relative(repoLink.rootPath,client.cwd));if(projects.length>1)return{status:"ambiguous",projects:projects.map(p=>p.name)};let[project]=projects,projectOrgId=project?.orgId??repoLink.repoConfig.orgId;if(project&&projectOrgId)return{status:"linked",orgId:projectOrgId,projectId:project.id,projectName:project.name,source:"repo"}}}catch(err){return{status:"invalid",message:errorMessage(err)}}return{status:"none"}}function tokenSourceLabel(client){switch(client.authConfig.tokenSource){case"flag":return"--token";case"env":return"VERCEL_TOKEN";default:return"saved login"}}function isSAMLError(err){return isAPIError(err)&&!!err.saml}var RequestedScopeError=class extends Error{constructor(scope,kind,principal){super(`Can't use scope ${scope}`);this.scope=scope;this.kind=kind;this.principal=principal}};async function applyRequestedScope(client,scope){let user;try{user=await getUser(client)}catch(err){if(!(err instanceof InvalidToken)||!isAppPrincipalEnabled())throw err;let token=await introspectToken(client).catch(()=>null),app=token?resolveAppFromToken(token):null;if(!token||!app)throw err;if(token.team&&(token.team.id===scope||token.team.slug===scope)){client.config.currentTeam=token.team.id;return}throw new RequestedScopeError(scope,"app_token",app.name??app.id)}let team;try{team=await getTeamByIdOrSlug(client,scope,{useCurrentTeam:!1})}catch(err){if(isSAMLError(err))throw err;team=(await getTeams(client)).find(t=>t.id===scope||t.slug===scope)}if(team){client.config.currentTeam=team.id;return}let isUser=scope===user.id||scope===user.username||scope===user.email;if(isUser&&user.version!=="northstar"){delete client.config.currentTeam;return}throw new RequestedScopeError(scope,isUser?"personal_account":"not_found",user.username)}async function checkAccount(client,requestedScope){let localLink=await readLocalLink(client);if(!client.authConfig.token)return[check("login","failed","Not logged in",{next:[vercelStep(client,"Log in to Vercel","login")],data:{loggedIn:!1}}),check("team","skipped","Needs a login",{data:{team:null}}),localProjectCheck(client,localLink)];let source=tokenSourceLabel(client),login2,team;try{requestedScope&&await applyRequestedScope(client,requestedScope);let scope=await getScope(client,{chooseTeam:!1}),name=scope.user?.username??scope.app?.name??scope.app?.id;login2=check("login","ok",`${name} (${source})`,{data:{loggedIn:!0,username:scope.user?.username??null,app:scope.app??null,source}}),team=teamCheck(client,scope)}catch(err){let principal=client.user?.username??(err instanceof RequestedScopeError?err.principal:void 0);login2=principal?check("login","ok",`${principal} (${source})`,{data:{loggedIn:!0,username:client.user?.username??null,source}}):loginFailure(client,err,source),team=principal?teamFailure(client,err):check("team","skipped","Needs a login",{data:{team:null}})}return login2.status!=="ok"?[login2,team,localProjectCheck(client,localLink)]:[login2,team,await projectCheck(client,localLink)]}function loginFailure(client,err,source){if(err instanceof InvalidToken){let message=source==="saved login"?"Your saved login expired or was revoked":`The token from ${source} isn't valid`;return check("login","failed",message,{next:source==="saved login"?[vercelStep(client,"Log in again","login")]:[],data:{loggedIn:!1,source}})}return check("login","failed","Couldn't check your login",{detail:errorMessage(err),data:{loggedIn:null,source,error:errorMessage(err)}})}function teamCheck(client,scope){return scope.team?check("team","ok",remoteText(scope.team.slug),{data:{team:{id:scope.team.id,slug:scope.team.slug}}}):client.isTeamUnchosen()?check("team","warning","No team chosen for this agent run",{detail:"Pass --scope <TEAM> with each command",next:[vercelStep(client,"See the teams you can pass to --scope","teams list")],data:{team:null}}):check("team","ok","Personal account",{data:{team:null}})}function teamFailure(client,err){if(err instanceof RequestedScopeError){let scope=remoteText(err.scope),data={team:null,scope:err.scope};return err.kind==="app_token"?check("team","failed",`This app token only works in its own team, not ${scope}`,{data}):check("team","failed",err.kind==="personal_account"?`--scope ${scope} names your personal account, which can't be a scope`:`Can't find team ${scope}`,{next:[vercelStep(client,"See the teams you can use","teams list",{omit:["--scope"]})],data})}let next=[vercelStep(client,"Choose another team","teams switch")];return err instanceof TeamDeleted?check("team","failed","Your current team doesn't exist anymore",{detail:"It was deleted, or you were removed from it",next,data:{team:{id:client.config.currentTeam??null}}}):isSAMLError(err)?check("team","failed","Your team needs you to log in again",{detail:err.scope?`${remoteText(err.scope)} requires SAML`:void 0,next:[vercelStep(client,"Log in again","login")],data:{team:{id:client.config.currentTeam??null}}}):isAPIError(err)&&err.status===403?check("team","failed","You can't access your current team",{next,data:{team:{id:client.config.currentTeam??null}}}):check("team","failed","Couldn't check your team",{detail:errorMessage(err),data:{team:null,error:errorMessage(err)}})}function localProjectCheck(client,link){switch(link.status){case"none":return check("project","warning","This folder isn't linked",{next:[vercelStep(client,"Link it to a project","link")],data:{project:null}});case"ambiguous":return check("project","warning",`${link.projects.length} linked projects match this folder`,{detail:"Run commands from a project's folder, or pass --project",data:{project:null,projects:link.projects.map(name=>remoteText(name))}});case"invalid":return check("project","failed","Can't read the project link",{detail:link.message,data:{project:null,error:link.message}});case"linked":return check("project","skipped","Needs a login",{detail:`Linked to ${projectLabel(link)}`,data:{project:linkData(link)}})}}function projectLabel(link){let name=remoteText(link.projectName??link.projectId);return link.source==="env"?`${name} (VERCEL_PROJECT_ID)`:name}function linkData(link){return{id:link.projectId,name:link.projectName,orgId:link.orgId,source:link.source}}async function projectCheck(client,link){if(link.status!=="linked")return localProjectCheck(client,link);let relink=[vercelStep(client,"Link this folder again","link")];try{let project=await getProjectByNameOrId(client,link.projectId,link.orgId);if(project instanceof ProjectNotFound)return check("project","failed",`Can't find ${projectLabel(link)}`,{detail:"It was deleted or moved to another team, or you lost access to it",next:link.source==="env"?[]:relink,data:{project:linkData(link)}});let name=remoteText(project.name);return check("project","ok",link.source==="env"?`${name} (VERCEL_PROJECT_ID)`:name,{data:{project:{...linkData(link),name:project.name}}})}catch(err){return isSAMLError(err)?check("project","failed","Can't check the project",{detail:"Its team needs you to log in again",next:[vercelStep(client,"Log in again","login")],data:{project:linkData(link)}}):isAPIError(err)&&err.status===403?check("project","failed",`You can't access ${projectLabel(link)}`,{next:link.source==="env"?[]:relink,data:{project:linkData(link)}}):check("project","failed","Couldn't check the project",{detail:errorMessage(err),data:{project:linkData(link),error:errorMessage(err)}})}}async function checkVercelJson(client){let name=client.localConfigPath??"vercel.json",file=client.localConfigPath?resolve2(client.cwd,client.localConfigPath):join2(client.cwd,"vercel.json"),config=await readJSONFile(file);if(config===null)return check("vercel_json","ok",`No ${name} in this folder`,{data:{file:null}});if(config instanceof CantParseJSONFile)return check("vercel_json","failed",`${name} isn't valid JSON`,{detail:config.meta.parseErrorLocation,data:{file:name,error:config.meta.parseErrorLocation}});let{validateConfig}=await import("./chunks/validate-config-LAD7BU3B.js");config[import_types.fileNameSymbol]=name;let error=validateConfig(config);if(error){let detail=error.message.replace(/^Invalid .+? - /,"");return check("vercel_json","failed",`${name} has an error`,{detail,data:{file:name,error:detail}})}return check("vercel_json","ok",`${name} is valid`,{data:{file:name}})}async function checkVercelStatus(client){let{getStatusReport,STATUS_PAGE_HOST}=await import("./chunks/statuspage-KHTMA4WL.js"),report;try{report=await getStatusReport()}catch{return check("vercel_status","skipped",`Couldn't reach ${STATUS_PAGE_HOST}`,{data:{incidents:null}})}let active=report.incidents.filter(incident=>!incident.resolvedAt),data={incidents:active.map(({id,name,url})=>({id,name,url}))},next=[vercelStep(client,"See the details","health")];if(active.length>0){let count=active.length===1?"1 active incident":`${active.length} active incidents`;return check("vercel_status","warning",count,{detail:active.map(incident=>remoteText(incident.name)).join("; "),next,data})}return report.status.indicator!=="none"?check("vercel_status","warning",remoteText(report.status.description),{next,data}):check("vercel_status","ok","No active incidents",{data})}var LABELS={cli_version:"CLI version",cli_install:"CLI install",login:"Login",team:"Team",project:"Project",vercel_json:"vercel.json",vercel_status:"Vercel status"},STATUSES={ok:{label:"OK",tone:"success"},warning:{label:"Warning",tone:"pending"},failed:{label:"Failed",tone:"error"},skipped:{label:"Skipped",tone:"muted"}};async function runGroup(ids,run2){try{let result=await run2();return Array.isArray(result)?result:[result]}catch(err){let error=remoteText(err instanceof Error?err.message:String(err));return ids.map(id=>({id,status:"skipped",message:"Couldn't run this check",detail:error,next:[],data:{error}}))}}async function runChecks(client,{scope}={}){return(await Promise.all([runGroup(["cli_version","cli_install"],()=>checkCli(client)),runGroup(["login","team","project"],()=>checkAccount(client,scope)),runGroup(["vercel_json"],()=>checkVercelJson(client)),runGroup(["vercel_status"],()=>checkVercelStatus(client))])).flat()}function formatTable2(client,checks){let headers=["Check","Status","Details"],lines=c=>[c.message,c.detail].filter(Boolean).map(line=>remoteText(line));if(!client.stdout.isTTY)return`${[headers,...checks.map(c=>[LABELS[c.id],STATUSES[c.status].label,lines(c).join("; ")])].map(row=>row.join(" ")).join(`
|
|
69
66
|
`)}
|
|
70
67
|
`;let rows=checks.map(c=>{let{label,tone}=STATUSES[c.status];return[LABELS[c.id],output_manager_default.formatStatus(label,tone),lines(c).join(`
|
|
71
|
-
`)]});return`${table([headers.map(header=>
|
|
68
|
+
`)]});return`${table([headers.map(header=>import_chalk9.default.bold(header)),...rows],{hsep:3}).split(`
|
|
72
69
|
`).map(line=>` ${line}`.trimEnd()).join(`
|
|
73
70
|
`)}
|
|
74
71
|
`}function formatSummary(checks){let count=status4=>checks.filter(c=>c.status===status4).length,failed=count("failed"),warnings=count("warning"),skipped=count("skipped"),skippedText=skipped>0?`${skipped} skipped`:"";return failed===0&&warnings===0?skippedText?`No problems found. ${skippedText}.`:"No problems found.":`${[failed>0&&`${failed} failed`,warnings>0&&`${warnings} ${warnings===1?"warning":"warnings"}`,skippedText].filter(Boolean).join(", ")}.`}function getNextSteps(checks){let steps=new Map;for(let status4 of["failed","warning"])for(let c of checks)if(c.status===status4)for(let step of c.next)steps.has(step.command)||steps.set(step.command,step);return[...steps.values()]}function toJson(checks){let count=status4=>checks.filter(c=>c.status===status4).length;return{checks:checks.map(({id,status:status4,message,next,data})=>({id,status:status4,message,next:next.map(({command,argv})=>({command,argv})),data})),summary:{ok:count("ok"),warning:count("warning"),failed:count("failed"),skipped:count("skipped")}}}async function doctor(client){let telemetry2=new DoctorTelemetryClient({opts:{store:client.telemetryEventStore}}),argv=client.argv.slice(2),jsonOutput=argv.includes("--json"),usageError2=message=>{let help2=getCommandNamePlain("doctor --help");return jsonOutput?writeJsonError(client,{status:"error",reason:AGENT_REASON.INVALID_ARGUMENTS,message,next:[{command:help2}]}):(recordCliError({code:AGENT_REASON.INVALID_ARGUMENTS}),output_manager_default.fatal(message),output_manager_default.print(`
|
|
@@ -81,11 +78,11 @@ ${formatTable2(client,checks)}`),output_manager_default.print(`
|
|
|
81
78
|
`);let steps=getNextSteps(checks);return steps.length>0&&output_manager_default.print(`
|
|
82
79
|
Next steps:
|
|
83
80
|
${steps.map(step=>` ${step.label}:
|
|
84
|
-
${
|
|
81
|
+
${import_chalk9.default.cyan(step.command)}
|
|
85
82
|
`).join(`
|
|
86
|
-
`)}`),0}var
|
|
87
|
-
`),output_manager_default.log(`${
|
|
88
|
-
`),0}async function enable(client){return client.config={...client.config,guidance:{...client.config.guidance,enabled:!0}},client.writeToConfigFile(),await status(client),0}async function disable(client){return client.config={...client.config,guidance:{...client.config.guidance,enabled:!1}},client.writeToConfigFile(),await status(client),0}var GuidanceTelemetryClient=class extends TelemetryClient{trackCliSubcommandStatus(actual){this.trackCliSubcommand({subcommand:"status",value:actual})}trackCliSubcommandEnable(actual){this.trackCliSubcommand({subcommand:"enable",value:actual})}trackCliSubcommandDisable(actual){this.trackCliSubcommand({subcommand:"disable",value:actual})}};var COMMAND_CONFIG9={status:getCommandAliases(statusSubcommand),enable:getCommandAliases(enableSubcommand),disable:getCommandAliases(disableSubcommand)};async function guidance(client){if(!process.env.FF_GUIDANCE_MODE)return output_manager_default.error("The guidance subcommand does not exist"),1;let telemetryClient=new GuidanceTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArguments,flagsSpecification=getFlagsSpecification(guidanceCommand.options);try{parsedArguments=parseArguments(client.argv.slice(2),flagsSpecification)}catch(err){return printError(err),2}let{subcommand,subcommandOriginal}=getSubcommand(parsedArguments.args.slice(1),COMMAND_CONFIG9),needHelp=parsedArguments.flags["--help"];function printHelp(command){output_manager_default.print(help(command,{stream:client.stderr,columns:client.stderr.columns,parent:guidanceCommand}))}if(!subcommand&&needHelp)return telemetryClient.trackCliFlagHelp("guidance",subcommand),output_manager_default.print(help(guidanceCommand,{stream:client.stderr,columns:client.stderr.columns})),0;switch(subcommand){case"status":return needHelp?(telemetryClient.trackCliFlagHelp("guidance",subcommandOriginal),printHelp(statusSubcommand),0):(telemetryClient.trackCliSubcommandStatus(subcommandOriginal),status(client));case"enable":return needHelp?(telemetryClient.trackCliFlagHelp("guidance",subcommandOriginal),printHelp(enableSubcommand),0):(telemetryClient.trackCliSubcommandEnable(subcommandOriginal),enable(client));case"disable":return needHelp?(telemetryClient.trackCliFlagHelp("guidance",subcommandOriginal),printHelp(disableSubcommand),0):disable(client);default:return output_manager_default.print(help(guidanceCommand,{stream:client.stderr,columns:client.stderr.columns})),2}}import{spawn}from"child_process";var HttpstatTelemetryClient=class extends TelemetryClient{trackCliArgumentPath(path){if(path){let value=path.startsWith("/")?"slash":"no-slash";this.trackCliArgument({arg:"path",value})}}trackCliOptionDeployment(deploymentId){if(deploymentId){let value=deploymentId.startsWith("http://")||deploymentId.startsWith("https://")?"url":deploymentId.startsWith("dpl_")?"dpl_":"no-prefix";this.trackCliOption({option:"deployment",value})}}trackCliOptionProtectionBypass(secret){secret&&this.trackCliOption({option:"protection-bypass",value:this.redactedValue})}trackCliFlagYes(yes){yes&&this.trackCliFlag("yes")}};async function httpstat(client){let telemetryClient=new HttpstatTelemetryClient({opts:{store:client.telemetryEventStore}}),setup=setupCurlLikeCommand(client,httpstatCommand,telemetryClient);if(typeof setup=="number")return setup;let{path,deploymentFlag,protectionBypassFlag,toolFlags}=setup,result=await getDeploymentUrlAndToken(client,"httpstat",path,{deploymentFlag,protectionBypassFlag,autoConfirm:setup.yes});if(typeof result=="number")return result;let{fullUrl,deploymentProtectionToken}=result,httpstatFlags=[...toolFlags];return deploymentProtectionToken&&httpstatFlags.unshift("-H",`x-vercel-protection-bypass: ${deploymentProtectionToken}`),httpstatFlags.unshift(fullUrl),output_manager_default.debug(`Executing: httpstat ${httpstatFlags.map(redactSecretHeader).map(requoteArgs).join(" ")}`),new Promise(resolve4=>{let httpstatProcess=spawn("httpstat",httpstatFlags,{stdio:"inherit",shell:!1});httpstatProcess.on("error",err=>{"code"in err&&err.code==="ENOENT"?(output_manager_default.error("httpstat command not found. Please install httpstat."),output_manager_default.log(""),output_manager_default.log("Installation instructions:"),output_manager_default.log(" macOS: brew install httpstat"),output_manager_default.log(" pip: pip install httpstat"),output_manager_default.log(" npm: npm install -g httpstat"),output_manager_default.log(""),output_manager_default.log("Or visit: https://github.com/reorx/httpstat for more details"),resolve4(1)):(output_manager_default.error(`Failed to execute httpstat: ${err.message}`),resolve4(1))}),httpstatProcess.on("close",code=>{resolve4(code??1)})})}var
|
|
83
|
+
`)}`),0}var import_chalk10=__toESM(require_source(),1);async function status(client){let status4=isGuidanceEnabled(client,void 0,!0)?import_chalk10.default.green("Enabled"):import_chalk10.default.red("Disabled");return output_manager_default.print(`
|
|
84
|
+
`),output_manager_default.log(`${import_chalk10.default.bold("Guidance status")}: ${status4}`),output_manager_default.print(`
|
|
85
|
+
`),0}async function enable(client){return client.config={...client.config,guidance:{...client.config.guidance,enabled:!0}},client.writeToConfigFile(),await status(client),0}async function disable(client){return client.config={...client.config,guidance:{...client.config.guidance,enabled:!1}},client.writeToConfigFile(),await status(client),0}var GuidanceTelemetryClient=class extends TelemetryClient{trackCliSubcommandStatus(actual){this.trackCliSubcommand({subcommand:"status",value:actual})}trackCliSubcommandEnable(actual){this.trackCliSubcommand({subcommand:"enable",value:actual})}trackCliSubcommandDisable(actual){this.trackCliSubcommand({subcommand:"disable",value:actual})}};var COMMAND_CONFIG9={status:getCommandAliases(statusSubcommand),enable:getCommandAliases(enableSubcommand),disable:getCommandAliases(disableSubcommand)};async function guidance(client){if(!process.env.FF_GUIDANCE_MODE)return output_manager_default.error("The guidance subcommand does not exist"),1;let telemetryClient=new GuidanceTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArguments,flagsSpecification=getFlagsSpecification(guidanceCommand.options);try{parsedArguments=parseArguments(client.argv.slice(2),flagsSpecification)}catch(err){return printError(err),2}let{subcommand,subcommandOriginal}=getSubcommand(parsedArguments.args.slice(1),COMMAND_CONFIG9),needHelp=parsedArguments.flags["--help"];function printHelp(command){output_manager_default.print(help(command,{stream:client.stderr,columns:client.stderr.columns,parent:guidanceCommand}))}if(!subcommand&&needHelp)return telemetryClient.trackCliFlagHelp("guidance",subcommand),output_manager_default.print(help(guidanceCommand,{stream:client.stderr,columns:client.stderr.columns})),0;switch(subcommand){case"status":return needHelp?(telemetryClient.trackCliFlagHelp("guidance",subcommandOriginal),printHelp(statusSubcommand),0):(telemetryClient.trackCliSubcommandStatus(subcommandOriginal),status(client));case"enable":return needHelp?(telemetryClient.trackCliFlagHelp("guidance",subcommandOriginal),printHelp(enableSubcommand),0):(telemetryClient.trackCliSubcommandEnable(subcommandOriginal),enable(client));case"disable":return needHelp?(telemetryClient.trackCliFlagHelp("guidance",subcommandOriginal),printHelp(disableSubcommand),0):disable(client);default:return output_manager_default.print(help(guidanceCommand,{stream:client.stderr,columns:client.stderr.columns})),2}}import{spawn}from"child_process";var HttpstatTelemetryClient=class extends TelemetryClient{trackCliArgumentPath(path){if(path){let value=path.startsWith("/")?"slash":"no-slash";this.trackCliArgument({arg:"path",value})}}trackCliOptionDeployment(deploymentId){if(deploymentId){let value=deploymentId.startsWith("http://")||deploymentId.startsWith("https://")?"url":deploymentId.startsWith("dpl_")?"dpl_":"no-prefix";this.trackCliOption({option:"deployment",value})}}trackCliOptionProtectionBypass(secret){secret&&this.trackCliOption({option:"protection-bypass",value:this.redactedValue})}trackCliFlagYes(yes){yes&&this.trackCliFlag("yes")}};async function httpstat(client){let telemetryClient=new HttpstatTelemetryClient({opts:{store:client.telemetryEventStore}}),setup=setupCurlLikeCommand(client,httpstatCommand,telemetryClient);if(typeof setup=="number")return setup;let{path,deploymentFlag,protectionBypassFlag,toolFlags}=setup,result=await getDeploymentUrlAndToken(client,"httpstat",path,{deploymentFlag,protectionBypassFlag,autoConfirm:setup.yes});if(typeof result=="number")return result;let{fullUrl,deploymentProtectionToken}=result,httpstatFlags=[...toolFlags];return deploymentProtectionToken&&httpstatFlags.unshift("-H",`x-vercel-protection-bypass: ${deploymentProtectionToken}`),httpstatFlags.unshift(fullUrl),output_manager_default.debug(`Executing: httpstat ${httpstatFlags.map(redactSecretHeader).map(requoteArgs).join(" ")}`),new Promise(resolve4=>{let httpstatProcess=spawn("httpstat",httpstatFlags,{stdio:"inherit",shell:!1});httpstatProcess.on("error",err=>{"code"in err&&err.code==="ENOENT"?(output_manager_default.error("httpstat command not found. Please install httpstat."),output_manager_default.log(""),output_manager_default.log("Installation instructions:"),output_manager_default.log(" macOS: brew install httpstat"),output_manager_default.log(" pip: pip install httpstat"),output_manager_default.log(" npm: npm install -g httpstat"),output_manager_default.log(""),output_manager_default.log("Or visit: https://github.com/reorx/httpstat for more details"),resolve4(1)):(output_manager_default.error(`Failed to execute httpstat: ${err.message}`),resolve4(1))}),httpstatProcess.on("close",code=>{resolve4(code??1)})})}var import_error_utils2=__toESM(require_dist(),1);var LogoutTelemetryClient=class extends TelemetryClient{};var import_error_utils=__toESM(require_dist(),1);async function logout(client){let{authConfig}=client;if(!authConfig.token)return output_manager_default.note(`Not currently logged in, so ${getCommandName("logout")} did nothing`),0;output_manager_default.spinner("Logging out\u2026",200);let revocationResponse=await revocationRequest({token:authConfig.token});output_manager_default.debug(`'Revocation response:', ${await revocationResponse.clone().text()}`);let[revocationError]=await processRevocationResponse(revocationResponse),logoutError=!1;revocationError&&(output_manager_default.error(revocationError.message),output_manager_default.debug(revocationError.cause),output_manager_default.error("Failed during logout"),logoutError=!0);try{if(client.updateConfig({currentTeam:void 0}),client.writeToConfigFile(),client.emptyAuthConfig(),client.persistAuthConfig(),output_manager_default.debug("Configuration has been deleted"),!logoutError)return output_manager_default.success("Logged out!"),0}catch(err){output_manager_default.debug((0,import_error_utils.errorToString)(err)),output_manager_default.error("Failed during logout")}return 1}async function logout2(client){let{authConfig,config}=client,parsedArgs=null,flagsSpecification=getFlagsSpecification(logoutCommand.options),telemetry2=new LogoutTelemetryClient({opts:{store:client.telemetryEventStore}});try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return printError(error),2}if(parsedArgs.flags["--help"])return telemetry2.trackCliFlagHelp("logout"),output_manager_default.print(help(logoutCommand,{stream:client.stderr,columns:client.stderr.columns})),0;if("refreshToken"in authConfig)return await logout(client);if(output_manager_default.debug("Falling back to legacy logout"),!authConfig.token)return output_manager_default.note(`Not currently logged in, so ${getCommandName("logout")} did nothing`),0;output_manager_default.spinner("Logging out\u2026",200);let exitCode=0;try{await client.fetch("/v3/user/tokens/current",{method:"DELETE",useCurrentTeam:!1})}catch(err){isAPIError(err)&&(err.status===403?output_manager_default.debug("Token is invalid so it cannot be revoked"):err.status!==200&&(output_manager_default.debug(err?.message??""),exitCode=1))}delete config.currentTeam,client.savedTeam=void 0,delete authConfig.token,delete authConfig.userId,delete authConfig.cachedUser;try{authConfig.skipWrite||(writeToConfigFile(config),persistAuthConfig(authConfig,config)),output_manager_default.debug("Configuration has been deleted")}catch(err){output_manager_default.debug((0,import_error_utils2.errorToString)(err)),exitCode=1}return exitCode===0?output_manager_default.log("Logged out!"):output_manager_default.error("Failed during logout"),exitCode}import{execSync}from"child_process";var MCP_ENDPOINT="https://mcp.vercel.com";function getAvailableClients(){return["Claude Code","Claude.ai and Claude for desktop","Cursor","VS Code with Copilot"]}function safeExecSync(command,options={}){try{return execSync(command,{stdio:"pipe",encoding:"utf8",...options})}catch(error){return{error:error.message,stderr:error.stderr?.toString()||""}}}async function getProjectSpecificUrl(client){try{let linkedProject=await getLinkedProject(client);if(linkedProject.status!=="linked"||!linkedProject.org||!linkedProject.project)return null;let{org,project}=linkedProject;return{url:`${MCP_ENDPOINT}/${org.slug}/${project.name}`,projectName:project.name}}catch{return null}}async function mcp(client,opts={}){let isProjectSpecific=opts.project??client.argv.includes("--project");if(client.nonInteractive||output_manager_default.print(`\u{1F680} Vercel MCP Setup \u2014 Automated
|
|
89
86
|
`),isProjectSpecific){client.nonInteractive||output_manager_default.print(`\u{1F517} Setting up project-specific MCP access...
|
|
90
87
|
`);let projectInfo=await getProjectSpecificUrl(client);if(!projectInfo)return client.nonInteractive&&outputAgentError(client,{status:"error",reason:"not_linked",message:"No linked project found. Link your project first for project-specific MCP.",next:[{command:`${packageName} link`}]},1),output_manager_default.print(`\u274C No linked project found. Please link your project first:
|
|
91
88
|
`),output_manager_default.print(` vercel link
|
|
@@ -164,7 +161,7 @@ Starting setup...
|
|
|
164
161
|
`),output_manager_default.print("\u2500".repeat(50)+`
|
|
165
162
|
`),summary.forEach(line=>output_manager_default.print(`${line}
|
|
166
163
|
`)),output_manager_default.print(`Complete any required setup and authentication in the selected MCP clients. Restart configured clients if needed.
|
|
167
|
-
`),0}var MCP_CLIENTS=[{slug:"claude-code",display:"Claude Code"},{slug:"claude-desktop",display:"Claude.ai and Claude for desktop"},{slug:"cursor",display:"Cursor"},{slug:"vscode-copilot",display:"VS Code with Copilot"}],MCP_CLIENT_DISPLAY_NAMES=MCP_CLIENTS.map(c=>c.display);function buildSuggestedMcpCommand(client,clientsValue){let args=client.argv.slice(2),preserved=[],hasNonInteractive=!1;for(let i=1;i<args.length;i++){let arg=args[i];if(arg==="--non-interactive"){hasNonInteractive=!0;continue}if(arg==="--clients"){for(i++;i<args.length&&!args[i].startsWith("-");)i++;i--;continue}arg.startsWith("--clients=")||preserved.push(arg)}let singleQuotedClients=`'${clientsValue}'`;preserved.push("--clients",singleQuotedClients),hasNonInteractive&&preserved.push("--non-interactive");let suffix=preserved.join(" ");return suffix?`${packageName} mcp ${suffix}`:`${packageName} mcp`}function parseAndValidateClients(clientsFlag){if(!clientsFlag||!clientsFlag.trim())return[];let normalized=clientsFlag.split(",").map(s=>s.trim()).filter(Boolean).map(name=>{let lower=name.toLowerCase();return MCP_CLIENT_DISPLAY_NAMES.find(c=>c.toLowerCase()===lower)??name});return[...new Set(normalized)]}async function main4(client){let parsedArgs,flagsSpecification=getFlagsSpecification(mcpCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return printError(error),2}if(parsedArgs.flags["--help"])return output_manager_default.print(help(mcpCommand,{stream:client.stderr,columns:client.stderr.columns})),0;let project=!!parsedArgs.flags["--project"],clientsFlag=parsedArgs.flags["--clients"],clients=parseAndValidateClients(clientsFlag);if(client.nonInteractive){if(clients.length===0)return outputAgentError(client,{status:"error",reason:"missing_clients",message:"In non-interactive mode --clients is required. Specify a comma-separated list of MCP clients to set up.",next:[{command:buildSuggestedMcpCommand(client,"Cursor,VS Code with Copilot")}]},2),2;let invalid=clients.filter(c=>!MCP_CLIENT_DISPLAY_NAMES.some(v=>v===c));if(invalid.length>0)return outputAgentError(client,{status:"error",reason:"invalid_clients",message:`Invalid client(s): ${invalid.join(", ")}. Valid options: ${MCP_CLIENT_DISPLAY_NAMES.join(", ")}.`,next:[{command:buildSuggestedMcpCommand(client,"Cursor,VS Code with Copilot")}]},2),2}project&&client.argv.push("--project");try{return await mcp(client,{project,clients})}catch(err){return output_manager_default.prettyError(err),1}}var MetricsTelemetryClient=class extends TelemetryClient{trackCliSubcommandQuery(v){v&&this.trackCliSubcommand({subcommand:"query",value:v})}trackCliSubcommandSchema(v){v&&this.trackCliSubcommand({subcommand:"schema",value:v})}trackCliArgumentMetricId(v){v&&this.trackCliArgument({arg:"metric-id",value:v})}trackCliOptionAggregation(v){v&&this.trackCliOption({option:"aggregation",value:v})}trackCliOptionGroupBy(v){v&&v.length>0&&this.trackCliOption({option:"group-by",value:v.join(",")})}trackCliOptionLimit(v){typeof v=="number"&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliOptionOrderBy(v){v&&this.trackCliOption({option:"order-by",value:v})}trackCliOptionOrder(v){v&&this.trackCliOption({option:"order",value:v})}trackCliOptionQuery(v){v&&v.length>0&&this.trackCliOption({option:"query",value:this.redactedValue})}trackCliOptionFilter(v){v&&v.length>0&&this.trackCliOption({option:"filter",value:this.redactedValue})}trackCliFlagProd(v){v&&this.trackCliFlag("prod")}trackCliOptionEnvironment(v){v&&this.trackCliOption({option:"environment",value:this.redactedTargetName(v)})}trackCliOptionSince(v){v&&this.trackCliOption({option:"since",value:this.redactedValue})}trackCliOptionUntil(v){v&&this.trackCliOption({option:"until",value:this.redactedValue})}trackCliOptionGranularity(v){v&&this.trackCliOption({option:"granularity",value:v})}trackCliOptionBucketTimezone(v){v&&this.trackCliOption({option:"bucket-timezone",value:v})}trackCliOptionProject(v){v&&this.trackCliOption({option:"project",value:this.redactedValue})}trackCliFlagAll(v){v&&this.trackCliFlag("all")}trackCliFlagJson(json){json&&this.trackCliFlag("json")}trackCliError(code,status4){this.trackErrorCode(code),this.trackErrorStatus(status4)}};var COMMAND_CONFIG10={schema:getCommandAliases(schemaSubcommand)};async function metrics(client){let telemetry2=new MetricsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(metricsCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err,client),2}let subArgs=parsedArgs.args.slice(1),{subcommand,subcommandOriginal}=getSubcommand(subArgs,COMMAND_CONFIG10),positionalMetric=subArgs[0]==="query"?subArgs[1]:subArgs[0],needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("metrics",subcommand),output_manager_default.print(help(metricsCommand,{stream:client.stderr,columns:client.stderr.columns})),0;function printSubHelp(command){output_manager_default.print(help(command,{stream:client.stderr,parent:metricsCommand,columns:client.stderr.columns}))}switch(subcommand){case"schema":{if(needHelp)return telemetry2.trackCliFlagHelp("metrics",subcommandOriginal),printSubHelp(schemaSubcommand),0;telemetry2.trackCliSubcommandSchema(subcommandOriginal);let schemaFn=(await import("./chunks/schema-
|
|
164
|
+
`),0}var MCP_CLIENTS=[{slug:"claude-code",display:"Claude Code"},{slug:"claude-desktop",display:"Claude.ai and Claude for desktop"},{slug:"cursor",display:"Cursor"},{slug:"vscode-copilot",display:"VS Code with Copilot"}],MCP_CLIENT_DISPLAY_NAMES=MCP_CLIENTS.map(c=>c.display);function buildSuggestedMcpCommand(client,clientsValue){let args=client.argv.slice(2),preserved=[],hasNonInteractive=!1;for(let i=1;i<args.length;i++){let arg=args[i];if(arg==="--non-interactive"){hasNonInteractive=!0;continue}if(arg==="--clients"){for(i++;i<args.length&&!args[i].startsWith("-");)i++;i--;continue}arg.startsWith("--clients=")||preserved.push(arg)}let singleQuotedClients=`'${clientsValue}'`;preserved.push("--clients",singleQuotedClients),hasNonInteractive&&preserved.push("--non-interactive");let suffix=preserved.join(" ");return suffix?`${packageName} mcp ${suffix}`:`${packageName} mcp`}function parseAndValidateClients(clientsFlag){if(!clientsFlag||!clientsFlag.trim())return[];let normalized=clientsFlag.split(",").map(s=>s.trim()).filter(Boolean).map(name=>{let lower=name.toLowerCase();return MCP_CLIENT_DISPLAY_NAMES.find(c=>c.toLowerCase()===lower)??name});return[...new Set(normalized)]}async function main4(client){let parsedArgs,flagsSpecification=getFlagsSpecification(mcpCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return printError(error),2}if(parsedArgs.flags["--help"])return output_manager_default.print(help(mcpCommand,{stream:client.stderr,columns:client.stderr.columns})),0;let project=!!parsedArgs.flags["--project"],clientsFlag=parsedArgs.flags["--clients"],clients=parseAndValidateClients(clientsFlag);if(client.nonInteractive){if(clients.length===0)return outputAgentError(client,{status:"error",reason:"missing_clients",message:"In non-interactive mode --clients is required. Specify a comma-separated list of MCP clients to set up.",next:[{command:buildSuggestedMcpCommand(client,"Cursor,VS Code with Copilot")}]},2),2;let invalid=clients.filter(c=>!MCP_CLIENT_DISPLAY_NAMES.some(v=>v===c));if(invalid.length>0)return outputAgentError(client,{status:"error",reason:"invalid_clients",message:`Invalid client(s): ${invalid.join(", ")}. Valid options: ${MCP_CLIENT_DISPLAY_NAMES.join(", ")}.`,next:[{command:buildSuggestedMcpCommand(client,"Cursor,VS Code with Copilot")}]},2),2}project&&client.argv.push("--project");try{return await mcp(client,{project,clients})}catch(err){return output_manager_default.prettyError(err),1}}var MetricsTelemetryClient=class extends TelemetryClient{trackCliSubcommandQuery(v){v&&this.trackCliSubcommand({subcommand:"query",value:v})}trackCliSubcommandSchema(v){v&&this.trackCliSubcommand({subcommand:"schema",value:v})}trackCliArgumentMetricId(v){v&&this.trackCliArgument({arg:"metric-id",value:v})}trackCliOptionAggregation(v){v&&this.trackCliOption({option:"aggregation",value:v})}trackCliOptionGroupBy(v){v&&v.length>0&&this.trackCliOption({option:"group-by",value:v.join(",")})}trackCliOptionLimit(v){typeof v=="number"&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliOptionOrderBy(v){v&&this.trackCliOption({option:"order-by",value:v})}trackCliOptionOrder(v){v&&this.trackCliOption({option:"order",value:v})}trackCliOptionQuery(v){v&&v.length>0&&this.trackCliOption({option:"query",value:this.redactedValue})}trackCliOptionFilter(v){v&&v.length>0&&this.trackCliOption({option:"filter",value:this.redactedValue})}trackCliFlagProd(v){v&&this.trackCliFlag("prod")}trackCliOptionEnvironment(v){v&&this.trackCliOption({option:"environment",value:this.redactedTargetName(v)})}trackCliOptionSince(v){v&&this.trackCliOption({option:"since",value:this.redactedValue})}trackCliOptionUntil(v){v&&this.trackCliOption({option:"until",value:this.redactedValue})}trackCliOptionGranularity(v){v&&this.trackCliOption({option:"granularity",value:v})}trackCliOptionBucketTimezone(v){v&&this.trackCliOption({option:"bucket-timezone",value:v})}trackCliOptionProject(v){v&&this.trackCliOption({option:"project",value:this.redactedValue})}trackCliFlagAll(v){v&&this.trackCliFlag("all")}trackCliFlagJson(json){json&&this.trackCliFlag("json")}trackCliError(code,status4){this.trackErrorCode(code),this.trackErrorStatus(status4)}};var COMMAND_CONFIG10={schema:getCommandAliases(schemaSubcommand)};async function metrics(client){let telemetry2=new MetricsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(metricsCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err,client),2}let subArgs=parsedArgs.args.slice(1),{subcommand,subcommandOriginal}=getSubcommand(subArgs,COMMAND_CONFIG10),positionalMetric=subArgs[0]==="query"?subArgs[1]:subArgs[0],needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("metrics",subcommand),output_manager_default.print(help(metricsCommand,{stream:client.stderr,columns:client.stderr.columns})),0;function printSubHelp(command){output_manager_default.print(help(command,{stream:client.stderr,parent:metricsCommand,columns:client.stderr.columns}))}switch(subcommand){case"schema":{if(needHelp)return telemetry2.trackCliFlagHelp("metrics",subcommandOriginal),printSubHelp(schemaSubcommand),0;telemetry2.trackCliSubcommandSchema(subcommandOriginal);let schemaFn=(await import("./chunks/schema-SUNFQGUL.js")).default;return schemaFn(client,telemetry2)}default:{if(needHelp)return telemetry2.trackCliFlagHelp("metrics",subcommandOriginal),output_manager_default.print(help(metricsCommand,{stream:client.stderr,columns:client.stderr.columns})),0;if(!positionalMetric)return output_manager_default.print(help(metricsCommand,{stream:client.stderr,columns:client.stderr.columns})),2;let queryFn=(await import("./chunks/query-67KQVLTR.js")).default;return queryFn(client,telemetry2)}}}async function monitors(client){try{let group=takeCommand(client.argv.slice(2),monitorsRoutingFlags);return await runMonitors(client,group.args,MONITORS_API)}catch(err){return printError(err),isArgumentError(err)?2:1}}var import_build_utils2=__toESM(require_build_utils(),1),import_error_utils3=__toESM(require_dist(),1);function getFlagValue(args,names){let value;for(let i=0;i<args.length;i++){let arg=args[i],[option,inlineValue]=arg.split("=",2);if(names.includes(option)){if(inlineValue!==void 0){value=inlineValue;continue}i+1<args.length&&(value=args[i+1],i++)}}return value}var BOARD_GLOBALS=new Set(["--help","-h","--version","-v"]);function splitGlobalOptions(args){let globals=[],rest=[];for(let i=0;i<args.length;i++){let arg=args[i];if(arg==="--"){rest.push(...args.slice(i));break}let name=arg.split("=",1)[0];if(!GLOBAL_CLI_FLAG_NAMES.has(name)||BOARD_GLOBALS.has(name)){rest.push(arg);continue}globals.push(arg),!arg.includes("=")&&globalCliFlagTakesValue(name)&&i+1<args.length&&globals.push(args[++i])}return{globals,rest}}function restoreEnv(name,value){typeof value=="string"?process.env[name]=value:delete process.env[name]}function showFailure(client,failure,json,commandLine){let ways=failure.next??[],next=ways.flatMap(({instruction,argv})=>argv?[{command:commandLine(argv),when:instruction}]:[]),hint=ways.flatMap(({instruction,argv})=>argv?[]:[instruction]).join(" ");if(json||shouldEmitNonInteractiveCommandError(client)){let payload={reason:failure.reason,message:failure.message,...next.length?{next}:{},...hint?{hint}:{},...failure.data?{data:failure.data}:{}};failure.actionRequired?writeActionRequired(client,{status:AGENT_STATUS.ACTION_REQUIRED,...payload}):writeAgentError(client,{status:AGENT_STATUS.ERROR,...payload});return}if(recordCliError({code:failure.reason}),output_manager_default.fatal([failure.message,...failure.details??[],...(failure.context??[]).map(([label,value])=>`${label.padEnd(14)} ${value}`)].map(remoteText).join(`
|
|
168
165
|
`)),!ways.length)return;let theme=createHelpTheme(client.stderr),lines=ways.map(({instruction,argv})=>argv?` ${instruction}:
|
|
169
166
|
${helpCommand(commandLine(argv),argv.filter(arg=>/^<[A-Z_]+>$/.test(arg)),theme)}`:` ${remoteText(instruction)}`);output_manager_default.print(`
|
|
170
167
|
${lines.join(`
|
|
@@ -173,7 +170,7 @@ ${lines.join(`
|
|
|
173
170
|
${hint}
|
|
174
171
|
`)),2}function asThisLogin(client){return async(input,init={})=>{let url=input instanceof Request?input.url:String(input);return await client.fetchWithAuthHeaders(init.method??"GET",url,init.body,authHeaders=>fetch(url,{...init,headers:{...Object.fromEntries(new Headers(init.headers)),...authHeaders}}))}}async function board(client){let argv=client.argv.slice(2),commandIndex=argv.indexOf("board"),rootArgs=commandIndex===-1?argv:argv.slice(0,commandIndex),{globals,rest}=splitGlobalOptions(commandIndex===-1?[]:argv.slice(commandIndex+1)),given=[...rootArgs,...globals],explicit=getFlagValue(given,["--scope","-S","--team","-T"])!==void 0,token=getFlagValue(given,["--token","-t"]),orgId=(0,import_build_utils2.getPlatformEnv)("ORG_ID");if(explicit&&orgId&&client.config.currentTeam&&client.config.currentTeam!==orgId)return scopeConflict(client);if(asksForVersion(rest))return client.stdout.write(wantsMachineReadableOutput(void 0,client.argv)?`${JSON.stringify({version:pkg_default.version})}
|
|
175
172
|
`:`${pkg_default.version}
|
|
176
|
-
`),0;let originalCwd=process.cwd(),originalAuthToken=process.env.VERCEL_AUTH_TOKEN,originalToken=process.env.VERCEL_TOKEN;try{token&&(process.env.VERCEL_AUTH_TOKEN=token,process.env.VERCEL_TOKEN=token);let login2=token||process.env.VERCEL_AUTH_TOKEN?void 0:async()=>{try{await client.ensureAuthorized()}catch(error){throw output_manager_default.debug(`Couldn't refresh the login for board: ${(0,
|
|
173
|
+
`),0;let originalCwd=process.cwd(),originalAuthToken=process.env.VERCEL_AUTH_TOKEN,originalToken=process.env.VERCEL_TOKEN;try{token&&(process.env.VERCEL_AUTH_TOKEN=token,process.env.VERCEL_TOKEN=token);let login2=token||process.env.VERCEL_AUTH_TOKEN?void 0:async()=>{try{await client.ensureAuthorized()}catch(error){throw output_manager_default.debug(`Couldn't refresh the login for board: ${(0,import_error_utils3.errorToString)(error)}`),error}if(!client.authConfig.token)throw new Error("Not logged in.");return client.authConfig.token};process.chdir(client.cwd);let{createApp,commandLine}=await import("./chunks/cli-embedded-Y74S252S.js");return await createApp({appName:"vercel board",onError:(failure,{json})=>showFailure(client,failure,json,commandLine),onWarning:warning=>output_manager_default.warning(remoteText(warning.message)),...login2?{login:login2}:{},team:()=>resolveTeam(client,explicit),fetch:asThisLogin(client)}).run(rest)}catch(error){return printError(error),1}finally{process.chdir(originalCwd),restoreEnv("VERCEL_AUTH_TOKEN",originalAuthToken),restoreEnv("VERCEL_TOKEN",originalToken)}}var import_open=__toESM(require_open(),1);var OpenTelemetryClient=class extends TelemetryClient{trackCliFlagYes(yes){yes&&this.trackCliFlag("yes")}trackCliCommandOpen(value){this.trackCliCommand({command:"open",value})}};async function openCommandHandler(client){let parsedArgs=null,flagsSpecification=getFlagsSpecification(openCommand.options),telemetry2=new OpenTelemetryClient({opts:{store:client.telemetryEventStore}});try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return printError(error),2}if(parsedArgs.flags["--help"])return telemetry2.trackCliFlagHelp("open"),output_manager_default.print(help(openCommand,{stream:client.stderr,columns:client.stderr.columns})),0;let autoConfirm=!!parsedArgs.flags["--yes"],link=await ensureLink("open",client,client.cwd,{autoConfirm});if(typeof link=="number")return link;if(link.status!=="linked"||!link.org||!link.project)return client.nonInteractive||(output_manager_default.error("This command requires a linked project. Please run:"),output_manager_default.print(` vercel link
|
|
177
174
|
`)),1;let{org,project}=link,projectUrl=`https://vercel.com/${org.slug}/${project.name}`;return output_manager_default.log(`Opening ${projectUrl} in your browser...`),await(0,import_open.default)(projectUrl),0}var singular={scripts:"script",headers:"header",connections:"connection"},PageIntegrityTelemetryClient=class extends TelemetryClient{trackCliSubcommandResource(resource,actual=resource){this.trackCliSubcommand({subcommand:resource,value:actual===resource||actual===singular[resource]?actual:this.redactedValue})}trackCliSubcommandScripts(actual){this.trackCliSubcommandResource("scripts",actual)}trackCliSubcommandHeaders(actual){this.trackCliSubcommandResource("headers",actual)}trackCliSubcommandConnections(actual){this.trackCliSubcommandResource("connections",actual)}trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual==="list"||actual==="ls"?actual:this.redactedValue})}trackCliFlagAll(value){value&&this.trackCliFlag("all")}trackCliOptionProject(value){this.trackRedactedCliOption("project",value)}trackCliFlagJson(value){value&&this.trackCliFlag("json")}trackCliOptionLimit(value){typeof value=="number"&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliOptionNext(value){this.trackRedactedCliOption("next",value)}};var BASE="/v1/security/page-integrity";async function getPageIntegrityConfig(client,{teamId,projectId}){let query=new URLSearchParams({teamId,projectId});try{return{available:!0,config:await client.fetch(`${BASE}/config?${query}`)}}catch(error){if(isAPIError(error)&&error.status===404)return{available:!1,config:null,apiMessage:error.serverMessage||void 0};throw error}}async function listPageIntegrityResources(client,{teamId,projectId,kind,limit,next,includeAutoApproved}){let query=new URLSearchParams({teamId,projectId,kind,limit:String(limit)});next&&query.set("cursor",next),kind!=="header"&&!includeAutoApproved&&query.set("status","pending,approved,rejected");let response=await client.fetch(`${BASE}/resources?${query}`);return{items:response.items,next:response.pagination.next}}var import_ms=__toESM(require_ms(),1);function getPageIntegrityEnabledState(config){let paths=config.enabled?config.enabledForPaths:[];return{monitoring:{enabled:paths.length>0,paths},blocking:{enabled:config.enabled&&config.mode==="enforce"&&config.enforcePercentage>0,percentage:config.enforcePercentage,scope:config.enforcementScope}}}function formatMonitoring({monitoring}){let count=monitoring.paths.length;return monitoring.enabled?`${count} ${count===1?"path":"paths"}`:"Disabled"}function formatBlocking({blocking}){if(!blocking.enabled)return"Disabled";let previewOnly=blocking.scope==="preview";return blocking.percentage<100?`${blocking.percentage}%${previewOnly?" non-production":""}`:previewOnly?"Non-production":"Enabled"}function formatStatus(status4,modifiedBy){return status4==="approved"?modifiedBy==="system:first-party-auto-approve"?"Auto-approved":"Approved":status4==="pending"?"Needs review":status4==="rejected"?"Rejected":status4}function formatLastSeen(client,timestamp){if(timestamp===void 0)return"\u2014";if(!client.stdout.isTTY)return new Date(timestamp).toISOString();let age=Date.now()-timestamp;return age<7*24*60*60*1e3?(0,import_ms.default)(Math.max(0,age)):new Date(timestamp).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"})}function formatObservedIn(production,preview){return production&&preview?"Both":production?"Production":preview?"Preview":"\u2014"}function formatPageIntegrityTable(client,collection,resources){let rows=[collection==="headers"?["Header","Value","Hash","Status","Last Seen"]:[collection==="scripts"?"URL":"Connection","Status","Observed In","Last Seen"]];for(let resource of resources)if(resource.kind==="header")for(let status4 of["approved","rejected","pending"])for(let hash of resource[status4])rows.push([resource.headerName,hash.value??"(absent)",truncateEnd(hash.hash,20,{omission:"\u2026"}),formatStatus(status4,"modifiedBy"in hash?hash.modifiedBy:null),formatLastSeen(client,"lastSeen"in hash?hash.lastSeen:void 0)]);else rows.push([resource.id,formatStatus(resource.status,resource.modifiedBy),formatObservedIn(resource.seenInProduction,resource.seenInPreview),formatLastSeen(client,resource.lastSeen)]);let empty=rows.length===1,sanitizedRows=rows.map(row=>row.map(remoteText));return client.stdout.isTTY?{rendered:empty?"":table(sanitizedRows),empty}:{rendered:sanitizedRows.map(row=>row.join(" ")).join(`
|
|
178
175
|
`),empty}}function pageIntegrityError(client,json,error,exitCode){if(json)writeAgentError(client,{status:"error",...error});else{output_manager_default.fatal(error.message);let apiMessage=error.data?.apiMessage;typeof apiMessage=="string"&&output_manager_default.print(` ${apiMessage}
|
|
179
176
|
`),error.hint&&output_manager_default.print(` ${error.hint}
|
|
@@ -186,26 +183,26 @@ ${lines.join(`
|
|
|
186
183
|
No ${collection} in ${displayName}.`),collection==="headers"||flags["--all"]?(output_manager_default.print(`
|
|
187
184
|
`),0):(output_manager_default.print(` Auto-approved ${collection} are hidden.
|
|
188
185
|
|
|
189
|
-
`),printNextPageCommand(buildCommandWithGlobalFlags(client.argv,`page-integrity ${collection} list --all`,void 0,{preserveProject:!0}),"Include them"),0)):(printNextPageHint(client,page.next),0)}function apiError(client,json,collection,error){if(!isAPIError(error))throw error;let reason=error.status===401?AGENT_REASON.LOGIN_REQUIRED:error.status===403?AGENT_REASON.PERMISSION_DENIED:error.status===429?AGENT_REASON.RATE_LIMITED:AGENT_REASON.API_ERROR,apiMessage=error.serverMessage||error.message;return pageIntegrityError(client,json,{...getErrorRecovery(error,client),reason,message:`Couldn't list Page Integrity ${collection}.`,...apiMessage&&{data:{apiMessage:remoteText(apiMessage)}}},1)}var collections={scripts:getCommandAliases(scriptsCommand),headers:getCommandAliases(headersCommand),connections:getCommandAliases(connectionsCommand)},commands={scripts:scriptsCommand,headers:headersCommand,connections:connectionsCommand};async function pageIntegrity(client){let argv=client.argv.slice(2),json=!!parseArguments(argv,getFlagsSpecification([jsonOption]),{permissive:!0}).flags["--json"];try{let routing=parseArguments(argv,getFlagsSpecification(scriptsCommand.subcommands[0].options),{permissive:!0}),resource=getSubcommand(routing.args.slice(1),collections);if(typeof resource.subcommand!="string"||!(resource.subcommand in commands))return pageIntegrityError(client,json,{reason:"invalid_arguments",message:"Unknown Page Integrity command. Use scripts, headers, or connections."},2);let collection=resource.subcommand,command=commands[collection].subcommands[0],action=getSubcommand(resource.args,{list:getCommandAliases(command)});if(action.subcommand!=="list")return pageIntegrityError(client,json,{reason:"invalid_arguments",message:"Unknown Page Integrity action. Use list to read the inventory."},2);let parsed=parseArguments(argv,getFlagsSpecification(command.options));if(parsed.args.length!==3)return pageIntegrityError(client,json,{reason:"invalid_arguments",message:"Page Integrity list does not accept positional arguments."},2);let telemetry2=new PageIntegrityTelemetryClient({opts:{store:client.telemetryEventStore}});telemetry2.trackCliSubcommandResource(collection,resource.subcommandOriginal),telemetry2.trackCliSubcommandList(action.subcommandOriginal),telemetry2.trackCliFlagJson(parsed.flags["--json"]),telemetry2.trackCliFlagAll(parsed.flags["--all"]),telemetry2.trackCliOptionProject(parsed.flags["--project"]),telemetry2.trackCliOptionLimit(parsed.flags["--limit"]),telemetry2.trackCliOptionNext(parsed.flags["--next"]);let nonInteractive=client.nonInteractive;json&&(client.nonInteractive=!0);try{return await list(client,collection,parsed.flags)}finally{client.nonInteractive=nonInteractive}}catch(error){if(!isArgumentError(error))throw error;return pageIntegrityError(client,json,{reason:"invalid_arguments",message:error.message,next:[{command:"vercel page-integrity --help"}]},2)}}var
|
|
186
|
+
`),printNextPageCommand(buildCommandWithGlobalFlags(client.argv,`page-integrity ${collection} list --all`,void 0,{preserveProject:!0}),"Include them"),0)):(printNextPageHint(client,page.next),0)}function apiError(client,json,collection,error){if(!isAPIError(error))throw error;let reason=error.status===401?AGENT_REASON.LOGIN_REQUIRED:error.status===403?AGENT_REASON.PERMISSION_DENIED:error.status===429?AGENT_REASON.RATE_LIMITED:AGENT_REASON.API_ERROR,apiMessage=error.serverMessage||error.message;return pageIntegrityError(client,json,{...getErrorRecovery(error,client),reason,message:`Couldn't list Page Integrity ${collection}.`,...apiMessage&&{data:{apiMessage:remoteText(apiMessage)}}},1)}var collections={scripts:getCommandAliases(scriptsCommand),headers:getCommandAliases(headersCommand),connections:getCommandAliases(connectionsCommand)},commands={scripts:scriptsCommand,headers:headersCommand,connections:connectionsCommand};async function pageIntegrity(client){let argv=client.argv.slice(2),json=!!parseArguments(argv,getFlagsSpecification([jsonOption]),{permissive:!0}).flags["--json"];try{let routing=parseArguments(argv,getFlagsSpecification(scriptsCommand.subcommands[0].options),{permissive:!0}),resource=getSubcommand(routing.args.slice(1),collections);if(typeof resource.subcommand!="string"||!(resource.subcommand in commands))return pageIntegrityError(client,json,{reason:"invalid_arguments",message:"Unknown Page Integrity command. Use scripts, headers, or connections."},2);let collection=resource.subcommand,command=commands[collection].subcommands[0],action=getSubcommand(resource.args,{list:getCommandAliases(command)});if(action.subcommand!=="list")return pageIntegrityError(client,json,{reason:"invalid_arguments",message:"Unknown Page Integrity action. Use list to read the inventory."},2);let parsed=parseArguments(argv,getFlagsSpecification(command.options));if(parsed.args.length!==3)return pageIntegrityError(client,json,{reason:"invalid_arguments",message:"Page Integrity list does not accept positional arguments."},2);let telemetry2=new PageIntegrityTelemetryClient({opts:{store:client.telemetryEventStore}});telemetry2.trackCliSubcommandResource(collection,resource.subcommandOriginal),telemetry2.trackCliSubcommandList(action.subcommandOriginal),telemetry2.trackCliFlagJson(parsed.flags["--json"]),telemetry2.trackCliFlagAll(parsed.flags["--all"]),telemetry2.trackCliOptionProject(parsed.flags["--project"]),telemetry2.trackCliOptionLimit(parsed.flags["--limit"]),telemetry2.trackCliOptionNext(parsed.flags["--next"]);let nonInteractive=client.nonInteractive;json&&(client.nonInteractive=!0);try{return await list(client,collection,parsed.flags)}finally{client.nonInteractive=nonInteractive}}catch(error){if(!isArgumentError(error))throw error;return pageIntegrityError(client,json,{reason:"invalid_arguments",message:error.message,next:[{command:"vercel page-integrity --help"}]},2)}}var import_error_utils4=__toESM(require_dist(),1);var PricingTelemetryClient=class extends TelemetryClient{trackCliOptionFormat(format){format&&this.trackCliOption({option:"format",value:format})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}trackCliArgumentQuery(query){query&&query.length>0&&this.trackCliArgument({arg:"query",value:this.redactedValue})}};var import_strip_ansi2=__toESM(require_strip_ansi(),1);var PLANS=["hobby","pro","enterprise"];var MIN_PRICING_FEATURES=8,PLAN_HEADER=new Set(PLANS),UNAVAILABLE_VALUES=new Set(["","-","\u2014","\u2013","n/a","na","not available"]);function slugify(value){return value.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")}function isFeatureAvailable(value){let normalized=value.trim().toLowerCase().replace(/[—–]/g,"-");return!UNAVAILABLE_VALUES.has(normalized)}function normalizePlan(plan){if(!plan)return null;let normalized=plan.trim().toLowerCase();return normalized==="plus"?"pro":PLANS.find(item=>item===normalized)??null}function minPlanForFeature(available){for(let plan of PLANS)if(available[plan])return plan;return"enterprise"}function splitFeaturesByMinPlan(features){let grouped={hobby:[],pro:[],enterprise:[]};for(let feature of features)grouped[feature.minPlan].push(feature);return grouped}function withCurrentPlanAvailability(features,currentPlan){return features.map(feature=>({...feature,availableOnCurrentPlan:currentPlan?feature.available[currentPlan]:null}))}function featureMatchesQuery(feature,query){let needle=query.trim().toLowerCase();return needle?[feature.name,feature.slug,feature.section,feature.category,feature.description??"",...PLANS.map(plan=>feature.values[plan])].join(" ").toLowerCase().includes(needle):!0}function sanitizeRemoteText(value){let withoutHyperlinks=value.replace(/\u001b\]8;;.*?(?:\u0007|\u001b\\)/gs,"");return(0,import_strip_ansi2.default)(withoutHyperlinks).replace(/\[([^\]]*)\]\([^)]*\)/g,"$1").replace(/\*\*/g,"").replace(/[\u0000-\u0008\u000B\u000C\u000E-\u001F\u007F]/g,"").replace(/\s+/g," ").trim()}function isValidPricingTable(features){if(features.length<MIN_PRICING_FEATURES)return!1;let minPlans=new Set(features.map(feature=>feature.minPlan));return minPlans.has("hobby")&&minPlans.has("pro")&&minPlans.has("enterprise")}function parsePricingMarkdown(markdown){let lines=markdown.split(/\r?\n/),features=[],descriptions=new Map,section="",category="",pendingDescription=[];for(let i=0;i<lines.length;i++){let line=lines[i],heading=parseHeading(line);if(heading){heading.level===2?(section=heading.text,category=""):category=heading.text,pendingDescription=[];continue}if(isTableStart(line,lines[i+1])){let parsed=parseTable(lines,i);if(parsed){let contextName=category||section,contextDescription=sanitizeRemoteText(pendingDescription.join(" "))||null;for(let row of parsed.rows){let name=sanitizeRemoteText(row.feature??contextName);if(!name)continue;let hobby=sanitizeRemoteText(row.hobby),pro=sanitizeRemoteText(row.pro),enterprise=sanitizeRemoteText(row.enterprise),available={hobby:isFeatureAvailable(hobby),pro:isFeatureAvailable(pro),enterprise:isFeatureAvailable(enterprise)};features.push({name,slug:slugify(name),section,category:category||section,standalone:row.feature===void 0,description:row.feature?null:contextDescription,values:{hobby,pro,enterprise},available,minPlan:minPlanForFeature(available)})}i=parsed.endIndex,pendingDescription=[];continue}}let description=parseDescriptionLine(line);if(description){descriptions.set(description.name,description.text);continue}let trimmed=sanitizeRemoteText(line);trimmed&&!trimmed.startsWith("<")&&!trimmed.startsWith("[")&&pendingDescription.push(trimmed)}for(let feature of features){let description=descriptions.get(feature.name);description&&!feature.description&&(feature.description=description)}return features}function parseHeading(line){let match=/^(#{2,3})\s+(.+)$/.exec(line.trim());if(!match)return;let level=match[1].length===2?2:3,text=sanitizeRemoteText(match[2]);if(text)return{level,text}}function isTableStart(line,nextLine){return!!(line.trim().startsWith("|")&&nextLine&&isSeparatorRow(nextLine))}function isSeparatorRow(line){return/^\|[\s:|-]+\|$/.test(line.trim())}function parseTable(lines,startIndex){let headerCells=splitRow(lines[startIndex]);if(!headerCells)return;let headerMap=mapHeaders(headerCells);if(headerMap.hobby===void 0||headerMap.pro===void 0||headerMap.enterprise===void 0)return;let rows=[],index=startIndex+2;for(;index<lines.length&&lines[index].trim().startsWith("|");){if(isSeparatorRow(lines[index])){index+=1;continue}let cells=splitRow(lines[index]);if(index+=1,!cells)continue;let hobby=cells[headerMap.hobby]??"",pro=cells[headerMap.pro]??"",enterprise=cells[headerMap.enterprise]??"",feature=headerMap.feature===void 0?void 0:cells[headerMap.feature];!hobby&&!pro&&!enterprise&&!feature||rows.push({feature:feature?.trim()||void 0,hobby,pro,enterprise})}return{rows,endIndex:index-1}}function mapHeaders(cells){let mapped={};return cells.forEach((cell,index)=>{let header=sanitizeRemoteText(cell).toLowerCase();if(PLAN_HEADER.has(header)){mapped[header]=index;return}(header==="feature"||mapped.feature===void 0)&&(mapped.feature=index)}),mapped}function splitRow(line){let trimmed=line.trim();return trimmed.startsWith("|")?trimmed.split("|").slice(1,-1).map(cell=>cell.trim()):void 0}function parseDescriptionLine(line){let match=/^- (?:\*\*)?(.+?):(?:\*\*)?\s+(.+)$/.exec(line.trim());if(!match)return;let name=sanitizeRemoteText(match[1]),text=sanitizeRemoteText(match[2]);if(!(!name||!text))return{name,text}}var import_chalk11=__toESM(require_source(),1);var PLAN_LABEL={hobby:"Hobby",pro:"Pro",enterprise:"Enterprise"},PLAN_COLOR=import_chalk11.default.magenta,PLAN_SCOPE={hobby:"available on Hobby, Pro, and Enterprise",pro:"available on Pro and Enterprise",enterprise:"available on Enterprise"};function formatPlanLabel(plan){return plan?plan.charAt(0).toUpperCase()+plan.slice(1):"Unknown"}function formatPricing(result){let lines=[];if(result.team?(lines.push(`Current team: ${import_chalk11.default.bold(result.team.slug)}${result.team.name&&result.team.name!==result.team.slug?` (${result.team.name})`:""}`),lines.push(`Current plan: ${formatCurrentPlan(result.team.plan)}`)):lines.push("Current team: not logged in"),lines.push(`Source: ${result.source}`),result.query&&lines.push(`Query: ${result.query}`),lines.push(""),result.summary.matched===0)return lines.push(result.query?`No features matching "${result.query}". Try a broader query, or run without a query to list all features.`:"No features found in the pricing table."),`${lines.join(`
|
|
190
187
|
`)}
|
|
191
188
|
`;if(result.query)return lines.push(...formatQueryMatches(result)),`${lines.join(`
|
|
192
189
|
`)}
|
|
193
|
-
`;lines.push("Features are grouped by the lowest plan that includes them. Values are from the latest public pricing table."),lines.push("");for(let plan of PLANS){let features=result.features[plan];if(lines.push(formatPlanHeader(plan)),features.length===0){lines.push(""),lines.push(" None"),lines.push("");continue}let currentCategory="",headerShown=!1;for(let feature of features){let{standalone}=feature;feature.category!==currentCategory&&(currentCategory=feature.category,headerShown=!1,lines.push("")),!standalone&&!headerShown&&(lines.push(` ${
|
|
190
|
+
`;lines.push("Features are grouped by the lowest plan that includes them. Values are from the latest public pricing table."),lines.push("");for(let plan of PLANS){let features=result.features[plan];if(lines.push(formatPlanHeader(plan)),features.length===0){lines.push(""),lines.push(" None"),lines.push("");continue}let currentCategory="",headerShown=!1;for(let feature of features){let{standalone}=feature;feature.category!==currentCategory&&(currentCategory=feature.category,headerShown=!1,lines.push("")),!standalone&&!headerShown&&(lines.push(` ${import_chalk11.default.bold(currentCategory)}`),headerShown=!0);let marker=feature.availableOnCurrentPlan===!1?import_chalk11.default.dim(" [not on current plan]"):"",indent=standalone?" ":" ";lines.push(`${indent}${padName(feature.name)}${feature.values[plan]}${marker}`)}lines.push("")}return`${lines.join(`
|
|
194
191
|
`)}
|
|
195
|
-
`}function formatQueryMatches(result){let lines=[`Matching features (${result.summary.matched}):`,""],currentPlan=result.team?.normalizedPlan??null;for(let plan of PLANS)for(let feature of result.features[plan]){lines.push(
|
|
196
|
-
`)}function planSwatch(){return PLAN_COLOR.bold("\u2588 ")}function padName(name){return name.length>=42?`${name} `:name.padEnd(42)}var ALLOWED_PRICING_HOSTS=new Set(["vercel.com","www.vercel.com"]);function isAllowedPricingUrl(url){try{let parsed=new URL(url);return parsed.protocol==="https:"&&ALLOWED_PRICING_HOSTS.has(parsed.hostname)&&parsed.pathname==="/pricing.md"&&parsed.username===""&&parsed.password===""}catch{return!1}}var PricingResponseTooLargeError=class extends Error{constructor(){super("Pricing response exceeded the size limit"),this.name="PricingResponseTooLargeError"}};async function readBoundedText(response,maxBytes=524288){let contentLength=response.headers.get("content-length");if(contentLength){let bytes=Number(contentLength);if(Number.isFinite(bytes)&&bytes>maxBytes)throw new PricingResponseTooLargeError}if(!response.body)throw new Error("Pricing response returned an empty body.");let reader=response.body.getReader(),chunks=[],totalBytes=0;for(;;){let{done,value}=await reader.read();if(done)break;if(value){if(totalBytes+=value.byteLength,totalBytes>maxBytes)throw await reader.cancel(),new PricingResponseTooLargeError;chunks.push(value)}}let buffer=new Uint8Array(totalBytes),offset=0;for(let chunk of chunks)buffer.set(chunk,offset),offset+=chunk.byteLength;return new TextDecoder().decode(buffer)}var PRICING_URL="https://vercel.com/pricing.md",FETCH_TIMEOUT_MS=1e4,MAX_REDIRECTS=3,UNEXPECTED_PRICING_RESPONSE="Failed to parse Vercel pricing. Unexpected response.";async function pricing(client){let telemetry2=new PricingTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(pricingCommand.options),jsonFromArgv=wantsMachineReadableOutput(pricingCommand.name,client.argv),parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return jsonFromArgv||shouldEmitNonInteractiveCommandError(client)?fail(client,!0,{reason:AGENT_REASON.INVALID_ARGUMENTS,message:(0,
|
|
197
|
-
`),0):(output_manager_default.print(formatPricing(result)),0)}function resolveTeamPlan(team,user){let plan=team?.billing?.plan||user?.billing?.plan||"hobby";return team?{id:team.id,slug:team.slug,name:team.name,plan,normalizedPlan:normalizePlan(plan)}:{id:user?.id??null,slug:"Personal Account",name:user?.username||user?.email||"Personal Account",plan,normalizedPlan:normalizePlan(plan)}}async function maybeResolveTeamPlan(client){if(!client.authConfig.token)return null;try{let scope=await getScope(client,{resolveLocalScope:!0});return resolveTeamPlan(scope.team,scope.user)}catch(error){return output_manager_default.debug(`Unable to resolve current team plan: ${(0,import_error_utils5.errorToString)(error)}`),null}}async function fetchPricingMarkdown(client,asJson){let controller=new AbortController,timeout=setTimeout(()=>controller.abort(),FETCH_TIMEOUT_MS);timeout.unref?.();try{let url=PRICING_URL;for(let i=0;i<=MAX_REDIRECTS;i++){if(!isAllowedPricingUrl(url)){fail(client,asJson,{reason:AGENT_REASON.API_ERROR,message:UNEXPECTED_PRICING_RESPONSE});return}let response=await fetch(url,{redirect:"manual",headers:{accept:"text/markdown, text/plain;q=0.9, */*;q=0.8","user-agent":ua_default},signal:controller.signal});if(response.status>=300&&response.status<400){await response.body?.cancel().catch(()=>{});let location=response.headers.get("location");if(!location){fail(client,asJson,{reason:AGENT_REASON.API_ERROR,message:`Failed to fetch Vercel pricing (${response.status}). Try again shortly.`});return}try{url=new URL(location,url).href}catch{fail(client,asJson,{reason:AGENT_REASON.API_ERROR,message:UNEXPECTED_PRICING_RESPONSE});return}continue}if(!response.ok){await response.body?.cancel().catch(()=>{}),fail(client,asJson,{reason:AGENT_REASON.API_ERROR,message:`Failed to fetch Vercel pricing (${response.status}). Try again shortly.`});return}let markdown=await readBoundedText(response);if(!markdown.includes("| Hobby |")||!markdown.includes("| Pro |")){fail(client,asJson,{reason:AGENT_REASON.API_ERROR,message:UNEXPECTED_PRICING_RESPONSE});return}return{markdown,source:url}}fail(client,asJson,{reason:AGENT_REASON.API_ERROR,message:UNEXPECTED_PRICING_RESPONSE});return}catch(error){fail(client,asJson,{reason:AGENT_REASON.API_ERROR,message:error instanceof PricingResponseTooLargeError?UNEXPECTED_PRICING_RESPONSE:"Failed to fetch Vercel pricing. Check your connection and try again."});return}finally{clearTimeout(timeout)}}function fail(client,asJson,payload){return asJson||shouldEmitNonInteractiveCommandError(client)?writeAgentError(client,{status:AGENT_STATUS.ERROR,reason:payload.reason,message:payload.message}):output_manager_default.error(payload.message),1}var import_ms4=__toESM(require_ms(),1);var import_error_utils6=__toESM(require_dist(),1);var import_chalk16=__toESM(require_source(),1);var import_chalk13=__toESM(require_source(),1);async function getProjectByDeployment({client,deployId}){let{config}=client,contextName=await getContextName(client);if(!isValidName(deployId))throw new Error(`The provided argument "${deployId}" is not a valid deployment ID or URL`);let deployment,team;try{output_manager_default?.spinner(`Fetching deployment "${deployId}" in ${import_chalk13.default.bold(contextName)}\u2026`);let[teamResult,deploymentResult]=await Promise.allSettled([config.currentTeam?getTeamByIdOrSlug(client,config.currentTeam):void 0,getDeployment(client,contextName,deployId)]);if(teamResult.status==="rejected")throw new Error(`Failed to retrieve team information: ${teamResult.reason}`);if(deploymentResult.status==="rejected")throw new Error(deploymentResult.reason);if(team=teamResult.value,deployment=deploymentResult.value,output_manager_default?.log(`Fetching deployment "${deployId}" in ${import_chalk13.default.bold(contextName)}\u2026`),deployment.team?.id){if(!team||deployment.team.id!==team.id){let err=new Error(team?`Deployment doesn't belong to current team ${import_chalk13.default.bold(contextName)}`:"Deployment belongs to a different team");throw err.code="ERR_INVALID_TEAM",err}}else if(team){let err=new Error(`Deployment doesn't belong to current team ${import_chalk13.default.bold(contextName)}`);throw err.code="ERR_INVALID_TEAM",err}if(!deployment.projectId)throw new Error("Deployment is not associated to a project");let project=await getProjectByNameOrId(client,deployment.projectId);if(project instanceof ProjectNotFound)throw project;return{contextName,deployment,project}}finally{output_manager_default?.stopSpinner()}}var import_ms3=__toESM(require_ms(),1);var import_chalk15=__toESM(require_source(),1);var import_ms2=__toESM(require_ms(),1);var import_chalk14=__toESM(require_source(),1);function renderAliasStatus(status4){return status4==="completed"?import_chalk14.default.green(status4):status4==="failed"?import_chalk14.default.red(status4):status4==="skipped"?import_chalk14.default.gray(status4):import_chalk14.default.yellow(status4)}async function requestRollingRelease({client,projectId,teamId}){let{rollingRelease:rollingRelease2}=await client.fetch(`/v1/projects/${projectId}/rolling-release?teamId=${teamId}`);return rollingRelease2}async function promoteStatus({client,contextName,deployment,project,timeout="3m",json=!1}){let recentThreshold=Date.now()-(0,import_ms2.default)("3m"),promoteTimeout=Date.now()+(0,import_ms2.default)(timeout),counter=0,spinnerMessage=deployment?"Promote in progress":`Checking promotion status of ${project.name}`;contextName||(contextName=await getContextName(client));try{for(output_manager_default.spinner(`${spinnerMessage}\u2026`);;){let projectCheck2=await getProjectByNameOrId(client,project.id,project.accountId,!0);if(projectCheck2 instanceof ProjectNotFound)throw projectCheck2;if(projectCheck2.rollingRelease){output_manager_default.log("Rolling Releases enabled \u2026");let rr=await requestRollingRelease({client,projectId:project.id,teamId:project.accountId});if(rr.activeStage){if(output_manager_default.stopSpinner(),output_manager_default.log(`Rolling Release serving traffic at initial percentage ${rr.activeStage.targetPercentage}`),json){let rollingRelease2={targetPercentage:rr.activeStage.targetPercentage};return writeJsonResult(client,deployment?{deployment:deploymentJson(deployment),outcome:"started",rollingRelease:rollingRelease2,next:[jsonNextStep(client,["rolling-release","inspect"],"Follow the Rolling Release")]}:{promotion:projectCheck2.lastAliasRequest??null,rollingRelease:rollingRelease2})}return 0}if(Date.now()>=promoteTimeout)return reportTimeout({client,json,project,toDeploymentId:deployment?.id??projectCheck2.lastAliasRequest?.toDeploymentId??"<DEPLOYMENT>",promotion:projectCheck2.lastAliasRequest??null});await sleep(250);continue}let{jobStatus,requestedAt,toDeploymentId,type}=projectCheck2.lastAliasRequest??{};if((!jobStatus||jobStatus!=="in-progress"&&jobStatus!=="pending")&&(output_manager_default.stopSpinner(),output_manager_default.log(`${spinnerMessage}\u2026`)),!jobStatus||!requestedAt||!toDeploymentId||requestedAt<recentThreshold)return output_manager_default.log("No deployment promotion in progress"),json?deployment?writePromoteAccepted(client,deployment,project):writeJsonResult(client,{promotion:null}):0;if(json&&deployment&&toDeploymentId!==deployment.id){if(Date.now()>=promoteTimeout)return reportTimeout({client,json,project,toDeploymentId:deployment.id,promotion:projectCheck2.lastAliasRequest??null});await sleep(250);continue}if(jobStatus==="skipped"&&type==="promote")return output_manager_default.log("Promote deployment was skipped"),json?writeJsonResult(client,deployment?{deployment:deploymentJson(deployment),outcome:"unchanged"}:{promotion:projectCheck2.lastAliasRequest}):0;if(jobStatus==="succeeded")return json?writeJsonResult(client,deployment?{deployment:deploymentJson(deployment),outcome:"promoted",next:[jsonNextStep(client,["inspect",deployment.id],"Inspect the deployment")]}:{promotion:projectCheck2.lastAliasRequest}):await renderJobSucceeded({client,contextName,performingPromote:!!deployment,requestedAt,project,toDeploymentId});if(jobStatus==="failed")return await renderJobFailed({client,contextName,deployment,project,toDeploymentId,json});if(jobStatus!=="pending"&&jobStatus!=="in-progress")return output_manager_default.log(`Unknown promote deployment status "${jobStatus}"`),json?writeJsonFailure(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.API_ERROR,message:`Unknown promote deployment status "${jobStatus}".`,data:{promotion:projectCheck2.lastAliasRequest}}):1;if(requestedAt<recentThreshold||Date.now()>=promoteTimeout)return reportTimeout({client,json,project,toDeploymentId,promotion:projectCheck2.lastAliasRequest??null});counter++===0&&!deployment&&(spinnerMessage+=` requested at ${formatDate(requestedAt)}`),output_manager_default.spinner(`${spinnerMessage}\u2026`),await sleep(250)}}finally{output_manager_default.stopSpinner()}}function reportTimeout({client,json,project,toDeploymentId,promotion}){return output_manager_default.log(`The promotion exceeded its deadline - rerun ${import_chalk15.default.bold(`${packageName} promote ${toDeploymentId}`)} to try again`),json?writeJsonFailure(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.TIMEOUT,message:`Can't confirm whether the promotion to ${toDeploymentId} finished. It didn't finish within --timeout.`,next:[jsonNextStep(client,["promote","status",project.name],"Check whether it finished")],data:{promotion}}):1}function writePromoteAccepted(client,deployment,project){return writeJsonResult(client,{deployment:deploymentJson(deployment),outcome:"accepted",next:[jsonNextStep(client,["promote","status",project.name],"Check whether the promotion finished")]})}async function renderJobFailed({client,contextName,deployment,project,toDeploymentId,json}){let failedAliases=[];try{let name=(deployment||await getDeployment(client,contextName,toDeploymentId))?.url;output_manager_default.error(`Failed to remap all aliases to the requested deployment ${name} (${toDeploymentId})`)}catch{output_manager_default.error(`Failed to remap all aliases to the requested deployment ${toDeploymentId}`)}let nextTimestamp;for(;;){let url=`/v9/projects/${project.id}/promote/aliases?failedOnly=true&limit=20`;nextTimestamp&&(url+=`&until=${nextTimestamp}`);let{aliases,pagination}=await client.fetch(url);failedAliases.push(...aliases);for(let{alias,status:status4}of aliases)output_manager_default.log(` ${renderAliasStatus(status4).padEnd(11)} ${alias.alias} (${alias.deploymentId})`);if(pagination?.next)nextTimestamp=pagination.next;else break}return json?writeJsonFailure(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.API_ERROR,message:`Failed to remap all aliases to the requested deployment ${toDeploymentId}.`,data:{deployment:deployment?deploymentJson(deployment):null,aliases:failedAliases}}):1}async function renderJobSucceeded({client,contextName,performingPromote,project,requestedAt,toDeploymentId}){let deploymentInfo="";try{let deployment=await getDeployment(client,contextName,toDeploymentId);deploymentInfo=`${import_chalk15.default.bold(deployment.url)} (${toDeploymentId})`}catch(err){output_manager_default.debug(`Failed to get deployment url for ${toDeploymentId}: ${err?.toString()||err}`),deploymentInfo=import_chalk15.default.bold(toDeploymentId)}let duration=performingPromote?elapsed(Date.now()-requestedAt):"";return output_manager_default.log(`Success! ${import_chalk15.default.bold(project.name)} was promoted to ${deploymentInfo} ${duration}`),0}async function requestPromote({client,deployId,timeout,yes,json=!1}){let{contextName,deployment,project}=await getProjectByDeployment({client,deployId}),promoteByCreation=!1;if(deployment.target!=="production")if(yes)promoteByCreation=!0;else{if(json)return writeActionRequired(client,{status:AGENT_STATUS.ACTION_REQUIRED,reason:AGENT_REASON.CONFIRMATION_REQUIRED,message:`Can't promote ${deployment.id} without --yes in non-interactive mode. It's not a Production deployment, so promoting it builds a new deployment with your Production Environment Variables.`,next:[{command:buildCommandWithYes(client.argv)}]}),getExitCodeForReason(AGENT_REASON.CONFIRMATION_REQUIRED);{let question="This deployment is not a production deployment and cannot be directly promoted. A new deployment will be built using your production environment. Are you sure you want to continue?";if(promoteByCreation=await client.input.confirm(question,!1),!promoteByCreation)return output_manager_default.error("Canceled"),0}}if(promoteByCreation){let newDeployment=await client.fetch(`/v13/deployments?teamId=${deployment.ownerId}`,{body:{deploymentId:deployment.id,name:project.name,target:"production",meta:{action:"promote"}},accountId:deployment.ownerId,method:"POST"});return output_manager_default.log(`Successfully created new deployment of ${import_chalk16.default.bold(project.name)} at ${newDeployment.inspectorUrl}`),json?writeJsonResult(client,{deployment:deploymentJson(newDeployment),outcome:"accepted",next:[jsonNextStep(client,["inspect",newDeployment.id,"--wait"],"Wait for the new Production deployment")]}):0}return(await client.fetch(`/v10/projects/${project.id}/promote/${deployment.id}`,{body:{},json:!1,method:"POST"})).status===202?(output_manager_default.log("Promotion has been queued and will begin when the active rolling release completes successfully."),json?writePromoteAccepted(client,deployment,project):0):timeout!==void 0&&(0,import_ms3.default)(timeout)===0?(output_manager_default.log(`Successfully requested promote of ${import_chalk16.default.bold(project.name)} to ${deployment.url} (${deployment.id})`),output_manager_default.log(`To check promote status, run ${getCommandName("promote")}.`),json?writePromoteAccepted(client,deployment,project):0):await promoteStatus({client,contextName,deployment,project,timeout,json})}var PromoteTelemetryClient=class extends TelemetryClient{trackCliArgumentDeployment(value){value&&this.trackCliArgument({arg:"urlOrDeploymentId",value:this.redactedValue})}trackCliSubcommandStatus(){this.trackCliSubcommand({subcommand:"status",value:"status"})}trackCliOptionTimeout(time){time&&this.trackCliOption({option:"timeout",value:"[TIME]"})}trackCliFlagYes(yes){yes&&this.trackCliFlag("yes")}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var promote_default=async client=>client.argv.includes("--json")?runWithJsonOutput(client,()=>promoteDeployment(client,!0)):promoteDeployment(client,!1);async function promoteDeployment(client,json){let parsedArgs,flagsSpecification=getFlagsSpecification(promoteCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(err){return json?writeJsonUsageError(client,err):(printError(err),2)}let telemetry2=new PromoteTelemetryClient({opts:{store:client.telemetryEventStore}}),needHelp=parsedArgs.flags["--help"];if(!parsedArgs.args[1]&&needHelp)return telemetry2.trackCliFlagHelp("promote"),output_manager_default.print(help(promoteCommand,{stream:client.stderr,columns:client.stderr.columns})),0;let yes=parsedArgs.flags["--yes"]??!1;telemetry2.trackCliFlagYes(parsedArgs.flags["--yes"]),telemetry2.trackCliFlagJson(parsedArgs.flags["--json"]);let timeout=parsedArgs.flags["--timeout"];if(timeout&&(0,import_ms4.default)(timeout)===void 0)return output_manager_default.error(`Invalid timeout "${timeout}"`),1;telemetry2.trackCliOptionTimeout(parsedArgs.flags["--timeout"]);let actionOrDeployId=parsedArgs.args[1]||"status";try{if(actionOrDeployId==="status"){if(needHelp)return telemetry2.trackCliFlagHelp("promote","status"),output_manager_default.print(help(statusSubcommand2,{stream:client.stderr,columns:client.stderr.columns,parent:promoteCommand})),0;telemetry2.trackCliSubcommandStatus();let project=await getProjectByCwdOrLink({autoConfirm:parsedArgs.flags["--yes"],client,commandName:"promote",projectNameOrId:parsedArgs.args[2]});return await promoteStatus({client,project,timeout,json})}return telemetry2.trackCliArgumentDeployment(actionOrDeployId),await requestPromote({client,deployId:actionOrDeployId,timeout,yes,json})}catch(err){if(json)throw err;if((0,import_error_utils6.isErrnoException)(err)){if(err.code==="ERR_CANCELED")return 0;if(err.code==="ERR_INVALID_CWD"||err.code==="ERR_LINK_PROJECT")return 1}return output_manager_default.prettyError(err),1}}var import_error_utils7=__toESM(require_dist(),1),import_ms7=__toESM(require_ms(),1);var import_chalk18=__toESM(require_source(),1);var import_ms6=__toESM(require_ms(),1);var import_chalk17=__toESM(require_source(),1);var import_ms5=__toESM(require_ms(),1);async function rollbackStatus({client,contextName,deployment,project,timeout="3m",json=!1}){let recentThreshold=Date.now()-(0,import_ms5.default)("3m"),rollbackTimeout=Date.now()+(0,import_ms5.default)(timeout),counter=0,spinnerMessage=deployment?"Rollback in progress":`Checking rollback status of ${project.name}`;contextName||(contextName=await getContextName(client));try{for(output_manager_default.spinner(`${spinnerMessage}\u2026`);;){let projectCheck2=await getProjectByNameOrId(client,project.id,project.accountId,!0);if(projectCheck2 instanceof ProjectNotFound)throw projectCheck2;let{jobStatus,requestedAt,toDeploymentId,type}=projectCheck2.lastAliasRequest??{};if((!jobStatus||jobStatus!=="in-progress"&&jobStatus!=="pending")&&(output_manager_default.stopSpinner(),output_manager_default.log(`${spinnerMessage}\u2026`)),!jobStatus||!requestedAt||!toDeploymentId||requestedAt<recentThreshold)return output_manager_default.log("No deployment rollback in progress"),json?deployment?writeRollbackAccepted(client,deployment,project):writeJsonResult(client,{rollback:null}):0;if(json&&deployment&&toDeploymentId!==deployment.id){if(Date.now()>=rollbackTimeout)return writeRollbackTimeout(client,project,deployment.id,projectCheck2.lastAliasRequest??null);await sleep(250);continue}if(jobStatus==="skipped"&&type==="rollback")return output_manager_default.log("Rollback was skipped"),json?writeJsonResult(client,deployment?{deployment:deploymentJson(deployment),outcome:"unchanged"}:{rollback:projectCheck2.lastAliasRequest}):0;if(jobStatus==="succeeded")return json?writeJsonResult(client,deployment?{deployment:deploymentJson(deployment),outcome:"rolled_back",next:[jsonNextStep(client,["inspect",deployment.id],"Inspect the deployment")]}:{rollback:projectCheck2.lastAliasRequest}):await renderJobSucceeded2({client,contextName,performingRollback:!!deployment,requestedAt,project,toDeploymentId});if(jobStatus==="failed")return await renderJobFailed2({client,contextName,deployment,project,toDeploymentId,json});if(jobStatus!=="pending"&&jobStatus!=="in-progress")return output_manager_default.log(`Unknown rollback status "${jobStatus}"`),json?writeJsonFailure(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.API_ERROR,message:`Unknown rollback status "${jobStatus}".`,data:{rollback:projectCheck2.lastAliasRequest}}):1;if(requestedAt<recentThreshold||Date.now()>=rollbackTimeout)return output_manager_default.log(`The rollback exceeded its deadline - rerun ${import_chalk17.default.bold(`${packageName} rollback ${toDeploymentId}`)} to try again`),json?writeRollbackTimeout(client,project,toDeploymentId,projectCheck2.lastAliasRequest??null):1;counter++===0&&!deployment&&(spinnerMessage+=` requested at ${formatDate(requestedAt)}`),output_manager_default.spinner(`${spinnerMessage}\u2026`),await sleep(250)}}finally{output_manager_default.stopSpinner()}}function writeRollbackTimeout(client,project,toDeploymentId,rollback){return writeJsonFailure(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.TIMEOUT,message:`Can't confirm whether the rollback to ${toDeploymentId} finished. It didn't finish within --timeout.`,next:[jsonNextStep(client,["rollback","status",project.name],"Check whether it finished")],data:{rollback}})}function writeRollbackAccepted(client,deployment,project){return writeJsonResult(client,{deployment:deploymentJson(deployment),outcome:"accepted",next:[jsonNextStep(client,["rollback","status",project.name],"Check whether the rollback finished")]})}async function renderJobFailed2({client,contextName,deployment,project,toDeploymentId,json}){let failedAliases=[];try{let name=(deployment||await getDeployment(client,contextName,toDeploymentId))?.url;output_manager_default.error(`Failed to remap all aliases to the requested deployment ${name} (${toDeploymentId})`)}catch{output_manager_default.error(`Failed to remap all aliases to the requested deployment ${toDeploymentId}`)}let nextTimestamp;for(;;){let url=`/v9/projects/${project.id}/rollback/aliases?failedOnly=true&limit=20`;nextTimestamp&&(url+=`&until=${nextTimestamp}`);let{aliases,pagination}=await client.fetch(url);failedAliases.push(...aliases);for(let{alias,status:status4}of aliases)output_manager_default.log(` ${renderAliasStatus(status4).padEnd(11)} ${alias.alias} (${alias.deploymentId})`);if(pagination?.next)nextTimestamp=pagination.next;else break}return json?writeJsonFailure(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.API_ERROR,message:`Failed to remap all aliases to the requested deployment ${toDeploymentId}.`,data:{deployment:deployment?deploymentJson(deployment):null,aliases:failedAliases}}):1}async function renderJobSucceeded2({client,contextName,performingRollback,project,requestedAt,toDeploymentId}){let deploymentInfo="";try{let deployment=await getDeployment(client,contextName,toDeploymentId);deploymentInfo=`${import_chalk17.default.bold(deployment.url)} (${toDeploymentId})`}catch(err){output_manager_default.debug(`Failed to get deployment url for ${toDeploymentId}: ${err?.toString()||err}`),deploymentInfo=import_chalk17.default.bold(toDeploymentId)}let duration=performingRollback?elapsed(Date.now()-requestedAt):"";return output_manager_default.log(`Success! ${import_chalk17.default.bold(project.name)} was rolled back to ${deploymentInfo} ${duration}`),0}async function requestRollback({client,deployId,timeout,json=!1}){let{contextName,deployment,project}=await getProjectByDeployment({client,deployId});return await client.fetch(`/v9/projects/${project.id}/rollback/${deployment.id}`,{body:{},method:"POST"}),timeout!==void 0&&(0,import_ms6.default)(timeout)===0?(output_manager_default.log(`Successfully requested rollback of ${import_chalk18.default.bold(project.name)} to ${deployment.url} (${deployment.id})`),output_manager_default.log(`To check rollback status, run ${getCommandName("rollback")}.`),json?writeRollbackAccepted(client,deployment,project):0):await rollbackStatus({client,contextName,deployment,project,timeout,json})}var RollbackTelemetryClient=class extends TelemetryClient{trackCliArgumentDeployment(value){value&&this.trackCliArgument({arg:"urlOrDeploymentId",value:this.redactedValue})}trackCliSubcommandStatus(){this.trackCliSubcommand({subcommand:"status",value:"status"})}trackCliOptionTimeout(time){time&&this.trackCliOption({option:"timeout",value:"[TIME]"})}trackCliFlagYes(yes){yes&&this.trackCliFlag("yes")}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var rollback_default=async client=>client.argv.includes("--json")?runWithJsonOutput(client,()=>rollbackDeployment(client,!0)):rollbackDeployment(client,!1);async function rollbackDeployment(client,json){let parsedArgs,flagsSpecification=getFlagsSpecification(rollbackCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return json?writeJsonUsageError(client,error):(printError(error),2)}let telemetry2=new RollbackTelemetryClient({opts:{store:client.telemetryEventStore}});telemetry2.trackCliOptionTimeout(parsedArgs.flags["--timeout"]),telemetry2.trackCliFlagYes(parsedArgs.flags["--yes"]),telemetry2.trackCliFlagJson(parsedArgs.flags["--json"]);let needHelp=parsedArgs.flags["--help"];if(!parsedArgs.args[1]&&needHelp)return telemetry2.trackCliFlagHelp("rollback"),output_manager_default.print(help(rollbackCommand,{stream:client.stderr,columns:client.stderr.columns})),0;let timeout=parsedArgs.flags["--timeout"];if(timeout&&(0,import_ms7.default)(timeout)===void 0)return output_manager_default.error(`Invalid timeout "${timeout}"`),1;let actionOrDeployId=parsedArgs.args[1]||"status";try{if(actionOrDeployId==="status"){if(needHelp)return telemetry2.trackCliFlagHelp("rollback","status"),output_manager_default.print(help(statusSubcommand3,{stream:client.stderr,columns:client.stderr.columns,parent:rollbackCommand})),0;telemetry2.trackCliSubcommandStatus();let project=await getProjectByCwdOrLink({autoConfirm:parsedArgs.flags["--yes"],client,commandName:"rollback",projectNameOrId:parsedArgs.args[2]});return await rollbackStatus({client,project,timeout,json})}return await requestRollback({client,deployId:actionOrDeployId,timeout,json})}catch(err){if(json)throw err;if((0,import_error_utils7.isErrnoException)(err)){if(err.code==="ERR_CANCELED")return 0;if(err.code==="ERR_INVALID_CWD"||err.code==="ERR_LINK_PROJECT")return 1}return output_manager_default.prettyError(err),1}}async function startRollingRelease({client,dpl,projectId,teamId,yes}){let{deployment}=await getProjectByDeployment({client,deployId:dpl}),promoteByCreation=!1;if(deployment.target!=="production")if(yes)promoteByCreation=!0;else{if(client.nonInteractive)return output_manager_default.error("This deployment is not a production deployment. In non-interactive mode use --yes to create a new production deployment and start the rolling release."),1;{let question="This deployment is not a production deployment and cannot be directly promoted. A new deployment will be built using your production environment. Are you sure you want to continue?";if(promoteByCreation=await client.input.confirm(question,!1),!promoteByCreation)return output_manager_default.error("Canceled"),0}}if(promoteByCreation){let newDeployment=await client.fetch(`/v13/deployments?teamId=${deployment.ownerId}`,{body:{deploymentId:deployment.id,name:projectId,target:"production",meta:{action:"promote"}},accountId:deployment.ownerId,method:"POST"});return output_manager_default.log(`Created production deployment ${newDeployment.id}: ${newDeployment.inspectorUrl}`),0}return await client.fetch(`/v1/projects/${projectId}/rolling-release/start?teamId=${teamId}`,{body:{canaryDeploymentId:deployment.id},json:!0,method:"POST"}),output_manager_default.log(`Requested rolling release start for ${deployment.id}`),0}var import_ms8=__toESM(require_ms(),1);function parseDuration(value){if(!value||/^\d+(s|ms)$/i.test(value))return;let milliseconds=(0,import_ms8.default)(/^\d+$/.test(value)?`${value}m`:value);if(milliseconds===void 0||milliseconds<=0)return;let minutes=Math.round(milliseconds/6e4);if(!(minutes<=0))return minutes}function parseStageFlags(stageFlags,advancementType){let stages=[];for(let stageValue of stageFlags){let parts=stageValue.split(","),percentage=parseInt(parts[0],10);if(isNaN(percentage)||percentage<1||percentage>99)return{stages:null,error:`Invalid stage percentage "${parts[0]}". Must be a number between 1 and 99.`};if(parts.length>1){if(advancementType==="manual-approval")return{stages:null,error:'Duration must not be provided for stages when advancement type is "manual-approval".'};let duration=parseDuration(parts[1]);if(duration===void 0)return{stages:null,error:`Invalid duration "${parts[1]}". Use minutes (e.g. "5m"), hours (e.g. "1h"), or days (e.g. "1d"). Seconds are not supported.`};stages.push({targetPercentage:percentage,duration})}else{if(advancementType==="automatic")return{stages:null,error:'Duration is required for each stage when advancement type is "automatic". Use the format "PERCENTAGE,DURATION" (e.g. "10,5m").'};stages.push({targetPercentage:percentage})}}for(let i=1;i<stages.length;i++)if(stages[i].targetPercentage<=stages[i-1].targetPercentage)return{stages:null,error:"Stage percentages must be in ascending order."};return{stages,error:null}}async function interactiveConfigure(client){if(await client.input.select({message:"Would you like to enable or disable rolling releases?",choices:[{name:"Enable",value:"enable"},{name:"Disable",value:"disable"}]})==="disable")return{config:void 0};let advancementType=await client.input.select({message:"How should stages advance?",choices:[{name:"automatic - Stages advance automatically after a set duration",value:"automatic"},{name:"manual-approval - Each stage requires manual approval to advance",value:"manual-approval"}]}),stages=[],stageNumber=1,addMore=!0;for(;addMore;){let percentageStr=await client.input.text({message:`Enter traffic percentage for stage ${stageNumber} (1-99):`,validate:val=>{let num=parseInt(val,10);return isNaN(num)||num<1||num>99?"Percentage must be a number between 1 and 99.":stages.length>0&&num<=stages[stages.length-1].targetPercentage?`Percentage must be greater than the previous stage (${stages[stages.length-1].targetPercentage}%).`:!0}}),percentage=parseInt(percentageStr,10),duration;if(advancementType==="automatic"){let durationStr=await client.input.text({message:"Enter duration for this stage (e.g. 5m, 1h):",validate:val=>parseDuration(val)===void 0?'Invalid duration. Use minutes (e.g. "5m"), hours (e.g. "1h"), or days (e.g. "1d"). Seconds are not supported.':!0});duration=parseDuration(durationStr)}stages.push({targetPercentage:percentage,duration}),stageNumber++,addMore=await client.input.confirm("Add another stage?",!1)}return output_manager_default.log(""),output_manager_default.log("Rolling release configuration:"),output_manager_default.log(` Advancement: ${advancementType}`),stages.forEach((stage,i)=>{let durationText=stage.duration!==void 0?` for ${stage.duration} minutes`:"";output_manager_default.log(` Stage ${i+1}: ${stage.targetPercentage}%${durationText}`)}),output_manager_default.log(` Stage ${stages.length+1}: 100% (final)`),output_manager_default.log(""),await client.input.confirm("Apply this configuration?",!0)?{config:{enabled:!0,advancementType,stages:[...stages,{targetPercentage:100}]}}:(output_manager_default.log("Configuration cancelled."),{exitCode:0})}function failUsage(client,jsonOutput,reason,message){return jsonOutput?writeAgentError(client,{status:AGENT_STATUS.ERROR,reason,message}):output_manager_default.error(message),{exitCode:2}}async function buildConfigurePayload({client,cfgString,enableFlag,disableFlag,disableName="--no-enable",advancementType,stageFlags,jsonOutput=!1}){if(cfgString!==void 0){if(cfgString==="disable")return{config:void 0};try{return{config:JSON.parse(cfgString)}}catch{return failUsage(client,jsonOutput,AGENT_REASON.INVALID_ARGUMENTS,"Invalid JSON provided for --cfg option.")}}if(disableFlag)return enableFlag?failUsage(client,jsonOutput,AGENT_REASON.INVALID_ARGUMENTS,`Can't use --enable with ${disableName}.`):{config:void 0};if(enableFlag){if(advancementType!=="automatic"&&advancementType!=="manual-approval")return failUsage(client,jsonOutput,"missing_flags",'--advancement-type is required when using --enable. Must be "automatic" or "manual-approval".');if(!stageFlags||stageFlags.length===0)return failUsage(client,jsonOutput,"missing_flags","At least one --stage is required when using --enable.");let parsed=parseStageFlags(stageFlags,advancementType);return parsed.error!==null?failUsage(client,jsonOutput,AGENT_REASON.INVALID_ARGUMENTS,parsed.error):{config:{enabled:!0,advancementType,stages:[...parsed.stages,{targetPercentage:100}]}}}return advancementType!==void 0||stageFlags!==void 0&&stageFlags.length>0?failUsage(client,jsonOutput,"missing_flags","--enable or --no-enable is required when using --advancement-type or --stage options."):client.nonInteractive||jsonOutput?failUsage(client,jsonOutput,"missing_flags","In non-interactive mode use --enable or --no-enable with --advancement-type and --stage as needed. Example: vercel rolling-release update --enable --advancement-type=automatic --stage=10,5m --stage=50,10m"):client.stdin.isTTY?interactiveConfigure(client):failUsage(client,jsonOutput,"missing_flags","Missing configuration options. Use --enable or --no-enable with --advancement-type and --stage, or run interactively in a terminal.")}async function configureRollingRelease({client,projectId,teamId,rollingReleaseConfig,jsonOutput=!1}){let body={...rollingReleaseConfig,enabled:!!rollingReleaseConfig};return await client.fetch(`/v1/projects/${projectId}/rolling-release/config?teamId=${teamId}`,{body,json:!0,method:"PATCH"}),jsonOutput?(client.stdout.write(`${JSON.stringify({rollingReleaseConfig:body,outcome:"updated"},null,2)}
|
|
192
|
+
`}function formatQueryMatches(result){let lines=[`Matching features (${result.summary.matched}):`,""],currentPlan=result.team?.normalizedPlan??null;for(let plan of PLANS)for(let feature of result.features[plan]){lines.push(import_chalk11.default.bold(feature.name)),lines.push(` Category: ${feature.section} / ${feature.category}`),feature.description&&lines.push(` Description: ${feature.description}`);for(let column of PLANS){let current=currentPlan===column?` ${import_chalk11.default.cyan("\u2190 current plan")}`:"",availability=feature.available[column]?feature.values[column]:"Not available";lines.push(` ${planSwatch()}${PLAN_LABEL[column]}: ${availability}${current}`)}feature.availableOnCurrentPlan===null?lines.push(" Available on current plan: unknown"):lines.push(` Available on ${formatPlanLabel(result.team?.plan??"")}: ${feature.availableOnCurrentPlan?"yes":"no"}`),lines.push("")}return lines}function formatCurrentPlan(plan){return PLAN_COLOR.bold(formatPlanLabel(plan))}function formatPlanHeader(plan){let title=` ${PLAN_LABEL[plan].toUpperCase()} `,rule="\u2501".repeat(48);return[PLAN_COLOR.bold.inverse(title),PLAN_COLOR(rule),import_chalk11.default.dim(PLAN_SCOPE[plan])].join(`
|
|
193
|
+
`)}function planSwatch(){return PLAN_COLOR.bold("\u2588 ")}function padName(name){return name.length>=42?`${name} `:name.padEnd(42)}var ALLOWED_PRICING_HOSTS=new Set(["vercel.com","www.vercel.com"]);function isAllowedPricingUrl(url){try{let parsed=new URL(url);return parsed.protocol==="https:"&&ALLOWED_PRICING_HOSTS.has(parsed.hostname)&&parsed.pathname==="/pricing.md"&&parsed.username===""&&parsed.password===""}catch{return!1}}var PricingResponseTooLargeError=class extends Error{constructor(){super("Pricing response exceeded the size limit"),this.name="PricingResponseTooLargeError"}};async function readBoundedText(response,maxBytes=524288){let contentLength=response.headers.get("content-length");if(contentLength){let bytes=Number(contentLength);if(Number.isFinite(bytes)&&bytes>maxBytes)throw new PricingResponseTooLargeError}if(!response.body)throw new Error("Pricing response returned an empty body.");let reader=response.body.getReader(),chunks=[],totalBytes=0;for(;;){let{done,value}=await reader.read();if(done)break;if(value){if(totalBytes+=value.byteLength,totalBytes>maxBytes)throw await reader.cancel(),new PricingResponseTooLargeError;chunks.push(value)}}let buffer=new Uint8Array(totalBytes),offset=0;for(let chunk of chunks)buffer.set(chunk,offset),offset+=chunk.byteLength;return new TextDecoder().decode(buffer)}var PRICING_URL="https://vercel.com/pricing.md",FETCH_TIMEOUT_MS=1e4,MAX_REDIRECTS=3,UNEXPECTED_PRICING_RESPONSE="Failed to parse Vercel pricing. Unexpected response.";async function pricing(client){let telemetry2=new PricingTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(pricingCommand.options),jsonFromArgv=wantsMachineReadableOutput(pricingCommand.name,client.argv),parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return jsonFromArgv||shouldEmitNonInteractiveCommandError(client)?fail(client,!0,{reason:AGENT_REASON.INVALID_ARGUMENTS,message:(0,import_error_utils4.errorToString)(error)}):(printError(error,client),1)}if(parsedArgs.flags["--help"])return telemetry2.trackCliFlagHelp("pricing"),output_manager_default.print(help(pricingCommand,{stream:client.stderr,columns:client.stderr.columns})),0;let formatResult=validateJsonOutput(parsedArgs.flags);if(!formatResult.valid)return fail(client,jsonFromArgv,{reason:AGENT_REASON.INVALID_ARGUMENTS,message:formatResult.error});let asJson=formatResult.jsonOutput;telemetry2.trackCliOptionFormat(parsedArgs.flags["--format"]),telemetry2.trackCliFlagJson(parsedArgs.flags["--json"]);let queryParts=parsedArgs.args.slice(1);telemetry2.trackCliArgumentQuery(queryParts.length>0?queryParts:void 0);let query=queryParts.join(" ").trim()||null,teamInfo=await maybeResolveTeamPlan(client),machineOutput=asJson||shouldEmitNonInteractiveCommandError(client);machineOutput||output_manager_default.spinner("Fetching Vercel pricing\u2026");let fetched=await fetchPricingMarkdown(client,asJson);if(machineOutput||output_manager_default.stopSpinner(),!fetched)return 1;let currentPlan=teamInfo?.normalizedPlan??null,allFeatures=parsePricingMarkdown(fetched.markdown);if(!isValidPricingTable(allFeatures))return fail(client,asJson,{reason:AGENT_REASON.API_ERROR,message:UNEXPECTED_PRICING_RESPONSE}),1;let matched=query?allFeatures.filter(feature=>featureMatchesQuery(feature,query)):allFeatures,grouped=splitFeaturesByMinPlan(withCurrentPlanAvailability(matched,currentPlan)),result={plan:teamInfo?.plan??null,team:teamInfo,source:fetched.source,query,summary:{total:allFeatures.length,matched:matched.length,availableOnCurrentPlan:currentPlan?matched.filter(feature=>feature.available[currentPlan]).length:null,unavailableOnCurrentPlan:currentPlan?matched.filter(feature=>!feature.available[currentPlan]).length:null,hobby:grouped.hobby.length,pro:grouped.pro.length,enterprise:grouped.enterprise.length},features:grouped};return asJson?(client.stdout.write(`${JSON.stringify(result,null,2)}
|
|
194
|
+
`),0):(output_manager_default.print(formatPricing(result)),0)}function resolveTeamPlan(team,user){let plan=team?.billing?.plan||user?.billing?.plan||"hobby";return team?{id:team.id,slug:team.slug,name:team.name,plan,normalizedPlan:normalizePlan(plan)}:{id:user?.id??null,slug:"Personal Account",name:user?.username||user?.email||"Personal Account",plan,normalizedPlan:normalizePlan(plan)}}async function maybeResolveTeamPlan(client){if(!client.authConfig.token)return null;try{let scope=await getScope(client,{resolveLocalScope:!0});return resolveTeamPlan(scope.team,scope.user)}catch(error){return output_manager_default.debug(`Unable to resolve current team plan: ${(0,import_error_utils4.errorToString)(error)}`),null}}async function fetchPricingMarkdown(client,asJson){let controller=new AbortController,timeout=setTimeout(()=>controller.abort(),FETCH_TIMEOUT_MS);timeout.unref?.();try{let url=PRICING_URL;for(let i=0;i<=MAX_REDIRECTS;i++){if(!isAllowedPricingUrl(url)){fail(client,asJson,{reason:AGENT_REASON.API_ERROR,message:UNEXPECTED_PRICING_RESPONSE});return}let response=await fetch(url,{redirect:"manual",headers:{accept:"text/markdown, text/plain;q=0.9, */*;q=0.8","user-agent":ua_default},signal:controller.signal});if(response.status>=300&&response.status<400){await response.body?.cancel().catch(()=>{});let location=response.headers.get("location");if(!location){fail(client,asJson,{reason:AGENT_REASON.API_ERROR,message:`Failed to fetch Vercel pricing (${response.status}). Try again shortly.`});return}try{url=new URL(location,url).href}catch{fail(client,asJson,{reason:AGENT_REASON.API_ERROR,message:UNEXPECTED_PRICING_RESPONSE});return}continue}if(!response.ok){await response.body?.cancel().catch(()=>{}),fail(client,asJson,{reason:AGENT_REASON.API_ERROR,message:`Failed to fetch Vercel pricing (${response.status}). Try again shortly.`});return}let markdown=await readBoundedText(response);if(!markdown.includes("| Hobby |")||!markdown.includes("| Pro |")){fail(client,asJson,{reason:AGENT_REASON.API_ERROR,message:UNEXPECTED_PRICING_RESPONSE});return}return{markdown,source:url}}fail(client,asJson,{reason:AGENT_REASON.API_ERROR,message:UNEXPECTED_PRICING_RESPONSE});return}catch(error){fail(client,asJson,{reason:AGENT_REASON.API_ERROR,message:error instanceof PricingResponseTooLargeError?UNEXPECTED_PRICING_RESPONSE:"Failed to fetch Vercel pricing. Check your connection and try again."});return}finally{clearTimeout(timeout)}}function fail(client,asJson,payload){return asJson||shouldEmitNonInteractiveCommandError(client)?writeAgentError(client,{status:AGENT_STATUS.ERROR,reason:payload.reason,message:payload.message}):output_manager_default.error(payload.message),1}var import_ms4=__toESM(require_ms(),1);var import_error_utils5=__toESM(require_dist(),1);var import_chalk15=__toESM(require_source(),1);var import_chalk12=__toESM(require_source(),1);async function getProjectByDeployment({client,deployId}){let{config}=client,contextName=await getContextName(client);if(!isValidName(deployId))throw new Error(`The provided argument "${deployId}" is not a valid deployment ID or URL`);let deployment,team;try{output_manager_default?.spinner(`Fetching deployment "${deployId}" in ${import_chalk12.default.bold(contextName)}\u2026`);let[teamResult,deploymentResult]=await Promise.allSettled([config.currentTeam?getTeamByIdOrSlug(client,config.currentTeam):void 0,getDeployment(client,contextName,deployId)]);if(teamResult.status==="rejected")throw new Error(`Failed to retrieve team information: ${teamResult.reason}`);if(deploymentResult.status==="rejected")throw new Error(deploymentResult.reason);if(team=teamResult.value,deployment=deploymentResult.value,output_manager_default?.log(`Fetching deployment "${deployId}" in ${import_chalk12.default.bold(contextName)}\u2026`),deployment.team?.id){if(!team||deployment.team.id!==team.id){let err=new Error(team?`Deployment doesn't belong to current team ${import_chalk12.default.bold(contextName)}`:"Deployment belongs to a different team");throw err.code="ERR_INVALID_TEAM",err}}else if(team){let err=new Error(`Deployment doesn't belong to current team ${import_chalk12.default.bold(contextName)}`);throw err.code="ERR_INVALID_TEAM",err}if(!deployment.projectId)throw new Error("Deployment is not associated to a project");let project=await getProjectByNameOrId(client,deployment.projectId);if(project instanceof ProjectNotFound)throw project;return{contextName,deployment,project}}finally{output_manager_default?.stopSpinner()}}var import_ms3=__toESM(require_ms(),1);var import_chalk14=__toESM(require_source(),1);var import_ms2=__toESM(require_ms(),1);var import_chalk13=__toESM(require_source(),1);function renderAliasStatus(status4){return status4==="completed"?import_chalk13.default.green(status4):status4==="failed"?import_chalk13.default.red(status4):status4==="skipped"?import_chalk13.default.gray(status4):import_chalk13.default.yellow(status4)}async function requestRollingRelease({client,projectId,teamId}){let{rollingRelease:rollingRelease2}=await client.fetch(`/v1/projects/${projectId}/rolling-release?teamId=${teamId}`);return rollingRelease2}async function promoteStatus({client,contextName,deployment,project,timeout="3m",json=!1}){let recentThreshold=Date.now()-(0,import_ms2.default)("3m"),promoteTimeout=Date.now()+(0,import_ms2.default)(timeout),counter=0,spinnerMessage=deployment?"Promote in progress":`Checking promotion status of ${project.name}`;contextName||(contextName=await getContextName(client));try{for(output_manager_default.spinner(`${spinnerMessage}\u2026`);;){let projectCheck2=await getProjectByNameOrId(client,project.id,project.accountId,!0);if(projectCheck2 instanceof ProjectNotFound)throw projectCheck2;if(projectCheck2.rollingRelease){output_manager_default.log("Rolling Releases enabled \u2026");let rr=await requestRollingRelease({client,projectId:project.id,teamId:project.accountId});if(rr.activeStage){if(output_manager_default.stopSpinner(),output_manager_default.log(`Rolling Release serving traffic at initial percentage ${rr.activeStage.targetPercentage}`),json){let rollingRelease2={targetPercentage:rr.activeStage.targetPercentage};return writeJsonResult(client,deployment?{deployment:deploymentJson(deployment),outcome:"started",rollingRelease:rollingRelease2,next:[jsonNextStep(client,["rolling-release","inspect"],"Follow the Rolling Release")]}:{promotion:projectCheck2.lastAliasRequest??null,rollingRelease:rollingRelease2})}return 0}if(Date.now()>=promoteTimeout)return reportTimeout({client,json,project,toDeploymentId:deployment?.id??projectCheck2.lastAliasRequest?.toDeploymentId??"<DEPLOYMENT>",promotion:projectCheck2.lastAliasRequest??null});await sleep(250);continue}let{jobStatus,requestedAt,toDeploymentId,type}=projectCheck2.lastAliasRequest??{};if((!jobStatus||jobStatus!=="in-progress"&&jobStatus!=="pending")&&(output_manager_default.stopSpinner(),output_manager_default.log(`${spinnerMessage}\u2026`)),!jobStatus||!requestedAt||!toDeploymentId||requestedAt<recentThreshold)return output_manager_default.log("No deployment promotion in progress"),json?deployment?writePromoteAccepted(client,deployment,project):writeJsonResult(client,{promotion:null}):0;if(json&&deployment&&toDeploymentId!==deployment.id){if(Date.now()>=promoteTimeout)return reportTimeout({client,json,project,toDeploymentId:deployment.id,promotion:projectCheck2.lastAliasRequest??null});await sleep(250);continue}if(jobStatus==="skipped"&&type==="promote")return output_manager_default.log("Promote deployment was skipped"),json?writeJsonResult(client,deployment?{deployment:deploymentJson(deployment),outcome:"unchanged"}:{promotion:projectCheck2.lastAliasRequest}):0;if(jobStatus==="succeeded")return json?writeJsonResult(client,deployment?{deployment:deploymentJson(deployment),outcome:"promoted",next:[jsonNextStep(client,["inspect",deployment.id],"Inspect the deployment")]}:{promotion:projectCheck2.lastAliasRequest}):await renderJobSucceeded({client,contextName,performingPromote:!!deployment,requestedAt,project,toDeploymentId});if(jobStatus==="failed")return await renderJobFailed({client,contextName,deployment,project,toDeploymentId,json});if(jobStatus!=="pending"&&jobStatus!=="in-progress")return output_manager_default.log(`Unknown promote deployment status "${jobStatus}"`),json?writeJsonFailure(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.API_ERROR,message:`Unknown promote deployment status "${jobStatus}".`,data:{promotion:projectCheck2.lastAliasRequest}}):1;if(requestedAt<recentThreshold||Date.now()>=promoteTimeout)return reportTimeout({client,json,project,toDeploymentId,promotion:projectCheck2.lastAliasRequest??null});counter++===0&&!deployment&&(spinnerMessage+=` requested at ${formatDate(requestedAt)}`),output_manager_default.spinner(`${spinnerMessage}\u2026`),await sleep(250)}}finally{output_manager_default.stopSpinner()}}function reportTimeout({client,json,project,toDeploymentId,promotion}){return output_manager_default.log(`The promotion exceeded its deadline - rerun ${import_chalk14.default.bold(`${packageName} promote ${toDeploymentId}`)} to try again`),json?writeJsonFailure(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.TIMEOUT,message:`Can't confirm whether the promotion to ${toDeploymentId} finished. It didn't finish within --timeout.`,next:[jsonNextStep(client,["promote","status",project.name],"Check whether it finished")],data:{promotion}}):1}function writePromoteAccepted(client,deployment,project){return writeJsonResult(client,{deployment:deploymentJson(deployment),outcome:"accepted",next:[jsonNextStep(client,["promote","status",project.name],"Check whether the promotion finished")]})}async function renderJobFailed({client,contextName,deployment,project,toDeploymentId,json}){let failedAliases=[];try{let name=(deployment||await getDeployment(client,contextName,toDeploymentId))?.url;output_manager_default.error(`Failed to remap all aliases to the requested deployment ${name} (${toDeploymentId})`)}catch{output_manager_default.error(`Failed to remap all aliases to the requested deployment ${toDeploymentId}`)}let nextTimestamp;for(;;){let url=`/v9/projects/${project.id}/promote/aliases?failedOnly=true&limit=20`;nextTimestamp&&(url+=`&until=${nextTimestamp}`);let{aliases,pagination}=await client.fetch(url);failedAliases.push(...aliases);for(let{alias,status:status4}of aliases)output_manager_default.log(` ${renderAliasStatus(status4).padEnd(11)} ${alias.alias} (${alias.deploymentId})`);if(pagination?.next)nextTimestamp=pagination.next;else break}return json?writeJsonFailure(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.API_ERROR,message:`Failed to remap all aliases to the requested deployment ${toDeploymentId}.`,data:{deployment:deployment?deploymentJson(deployment):null,aliases:failedAliases}}):1}async function renderJobSucceeded({client,contextName,performingPromote,project,requestedAt,toDeploymentId}){let deploymentInfo="";try{let deployment=await getDeployment(client,contextName,toDeploymentId);deploymentInfo=`${import_chalk14.default.bold(deployment.url)} (${toDeploymentId})`}catch(err){output_manager_default.debug(`Failed to get deployment url for ${toDeploymentId}: ${err?.toString()||err}`),deploymentInfo=import_chalk14.default.bold(toDeploymentId)}let duration=performingPromote?elapsed(Date.now()-requestedAt):"";return output_manager_default.log(`Success! ${import_chalk14.default.bold(project.name)} was promoted to ${deploymentInfo} ${duration}`),0}async function requestPromote({client,deployId,timeout,yes,json=!1}){let{contextName,deployment,project}=await getProjectByDeployment({client,deployId}),promoteByCreation=!1;if(deployment.target!=="production")if(yes)promoteByCreation=!0;else{if(json)return writeActionRequired(client,{status:AGENT_STATUS.ACTION_REQUIRED,reason:AGENT_REASON.CONFIRMATION_REQUIRED,message:`Can't promote ${deployment.id} without --yes in non-interactive mode. It's not a Production deployment, so promoting it builds a new deployment with your Production Environment Variables.`,next:[{command:buildCommandWithYes(client.argv)}]}),getExitCodeForReason(AGENT_REASON.CONFIRMATION_REQUIRED);{let question="This deployment is not a production deployment and cannot be directly promoted. A new deployment will be built using your production environment. Are you sure you want to continue?";if(promoteByCreation=await client.input.confirm(question,!1),!promoteByCreation)return output_manager_default.error("Canceled"),0}}if(promoteByCreation){let newDeployment=await client.fetch(`/v13/deployments?teamId=${deployment.ownerId}`,{body:{deploymentId:deployment.id,name:project.name,target:"production",meta:{action:"promote"}},accountId:deployment.ownerId,method:"POST"});return output_manager_default.log(`Successfully created new deployment of ${import_chalk15.default.bold(project.name)} at ${newDeployment.inspectorUrl}`),json?writeJsonResult(client,{deployment:deploymentJson(newDeployment),outcome:"accepted",next:[jsonNextStep(client,["inspect",newDeployment.id,"--wait"],"Wait for the new Production deployment")]}):0}return(await client.fetch(`/v10/projects/${project.id}/promote/${deployment.id}`,{body:{},json:!1,method:"POST"})).status===202?(output_manager_default.log("Promotion has been queued and will begin when the active rolling release completes successfully."),json?writePromoteAccepted(client,deployment,project):0):timeout!==void 0&&(0,import_ms3.default)(timeout)===0?(output_manager_default.log(`Successfully requested promote of ${import_chalk15.default.bold(project.name)} to ${deployment.url} (${deployment.id})`),output_manager_default.log(`To check promote status, run ${getCommandName("promote")}.`),json?writePromoteAccepted(client,deployment,project):0):await promoteStatus({client,contextName,deployment,project,timeout,json})}var PromoteTelemetryClient=class extends TelemetryClient{trackCliArgumentDeployment(value){value&&this.trackCliArgument({arg:"urlOrDeploymentId",value:this.redactedValue})}trackCliSubcommandStatus(){this.trackCliSubcommand({subcommand:"status",value:"status"})}trackCliOptionTimeout(time){time&&this.trackCliOption({option:"timeout",value:"[TIME]"})}trackCliFlagYes(yes){yes&&this.trackCliFlag("yes")}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var promote_default=async client=>client.argv.includes("--json")?runWithJsonOutput(client,()=>promoteDeployment(client,!0)):promoteDeployment(client,!1);async function promoteDeployment(client,json){let parsedArgs,flagsSpecification=getFlagsSpecification(promoteCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(err){return json?writeJsonUsageError(client,err):(printError(err),2)}let telemetry2=new PromoteTelemetryClient({opts:{store:client.telemetryEventStore}}),needHelp=parsedArgs.flags["--help"];if(!parsedArgs.args[1]&&needHelp)return telemetry2.trackCliFlagHelp("promote"),output_manager_default.print(help(promoteCommand,{stream:client.stderr,columns:client.stderr.columns})),0;let yes=parsedArgs.flags["--yes"]??!1;telemetry2.trackCliFlagYes(parsedArgs.flags["--yes"]),telemetry2.trackCliFlagJson(parsedArgs.flags["--json"]);let timeout=parsedArgs.flags["--timeout"];if(timeout&&(0,import_ms4.default)(timeout)===void 0)return output_manager_default.error(`Invalid timeout "${timeout}"`),1;telemetry2.trackCliOptionTimeout(parsedArgs.flags["--timeout"]);let actionOrDeployId=parsedArgs.args[1]||"status";try{if(actionOrDeployId==="status"){if(needHelp)return telemetry2.trackCliFlagHelp("promote","status"),output_manager_default.print(help(statusSubcommand2,{stream:client.stderr,columns:client.stderr.columns,parent:promoteCommand})),0;telemetry2.trackCliSubcommandStatus();let project=await getProjectByCwdOrLink({autoConfirm:parsedArgs.flags["--yes"],client,commandName:"promote",projectNameOrId:parsedArgs.args[2]});return await promoteStatus({client,project,timeout,json})}return telemetry2.trackCliArgumentDeployment(actionOrDeployId),await requestPromote({client,deployId:actionOrDeployId,timeout,yes,json})}catch(err){if(json)throw err;if((0,import_error_utils5.isErrnoException)(err)){if(err.code==="ERR_CANCELED")return 0;if(err.code==="ERR_INVALID_CWD"||err.code==="ERR_LINK_PROJECT")return 1}return output_manager_default.prettyError(err),1}}var import_error_utils6=__toESM(require_dist(),1),import_ms7=__toESM(require_ms(),1);var import_chalk17=__toESM(require_source(),1);var import_ms6=__toESM(require_ms(),1);var import_chalk16=__toESM(require_source(),1);var import_ms5=__toESM(require_ms(),1);async function rollbackStatus({client,contextName,deployment,project,timeout="3m",json=!1}){let recentThreshold=Date.now()-(0,import_ms5.default)("3m"),rollbackTimeout=Date.now()+(0,import_ms5.default)(timeout),counter=0,spinnerMessage=deployment?"Rollback in progress":`Checking rollback status of ${project.name}`;contextName||(contextName=await getContextName(client));try{for(output_manager_default.spinner(`${spinnerMessage}\u2026`);;){let projectCheck2=await getProjectByNameOrId(client,project.id,project.accountId,!0);if(projectCheck2 instanceof ProjectNotFound)throw projectCheck2;let{jobStatus,requestedAt,toDeploymentId,type}=projectCheck2.lastAliasRequest??{};if((!jobStatus||jobStatus!=="in-progress"&&jobStatus!=="pending")&&(output_manager_default.stopSpinner(),output_manager_default.log(`${spinnerMessage}\u2026`)),!jobStatus||!requestedAt||!toDeploymentId||requestedAt<recentThreshold)return output_manager_default.log("No deployment rollback in progress"),json?deployment?writeRollbackAccepted(client,deployment,project):writeJsonResult(client,{rollback:null}):0;if(json&&deployment&&toDeploymentId!==deployment.id){if(Date.now()>=rollbackTimeout)return writeRollbackTimeout(client,project,deployment.id,projectCheck2.lastAliasRequest??null);await sleep(250);continue}if(jobStatus==="skipped"&&type==="rollback")return output_manager_default.log("Rollback was skipped"),json?writeJsonResult(client,deployment?{deployment:deploymentJson(deployment),outcome:"unchanged"}:{rollback:projectCheck2.lastAliasRequest}):0;if(jobStatus==="succeeded")return json?writeJsonResult(client,deployment?{deployment:deploymentJson(deployment),outcome:"rolled_back",next:[jsonNextStep(client,["inspect",deployment.id],"Inspect the deployment")]}:{rollback:projectCheck2.lastAliasRequest}):await renderJobSucceeded2({client,contextName,performingRollback:!!deployment,requestedAt,project,toDeploymentId});if(jobStatus==="failed")return await renderJobFailed2({client,contextName,deployment,project,toDeploymentId,json});if(jobStatus!=="pending"&&jobStatus!=="in-progress")return output_manager_default.log(`Unknown rollback status "${jobStatus}"`),json?writeJsonFailure(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.API_ERROR,message:`Unknown rollback status "${jobStatus}".`,data:{rollback:projectCheck2.lastAliasRequest}}):1;if(requestedAt<recentThreshold||Date.now()>=rollbackTimeout)return output_manager_default.log(`The rollback exceeded its deadline - rerun ${import_chalk16.default.bold(`${packageName} rollback ${toDeploymentId}`)} to try again`),json?writeRollbackTimeout(client,project,toDeploymentId,projectCheck2.lastAliasRequest??null):1;counter++===0&&!deployment&&(spinnerMessage+=` requested at ${formatDate(requestedAt)}`),output_manager_default.spinner(`${spinnerMessage}\u2026`),await sleep(250)}}finally{output_manager_default.stopSpinner()}}function writeRollbackTimeout(client,project,toDeploymentId,rollback){return writeJsonFailure(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.TIMEOUT,message:`Can't confirm whether the rollback to ${toDeploymentId} finished. It didn't finish within --timeout.`,next:[jsonNextStep(client,["rollback","status",project.name],"Check whether it finished")],data:{rollback}})}function writeRollbackAccepted(client,deployment,project){return writeJsonResult(client,{deployment:deploymentJson(deployment),outcome:"accepted",next:[jsonNextStep(client,["rollback","status",project.name],"Check whether the rollback finished")]})}async function renderJobFailed2({client,contextName,deployment,project,toDeploymentId,json}){let failedAliases=[];try{let name=(deployment||await getDeployment(client,contextName,toDeploymentId))?.url;output_manager_default.error(`Failed to remap all aliases to the requested deployment ${name} (${toDeploymentId})`)}catch{output_manager_default.error(`Failed to remap all aliases to the requested deployment ${toDeploymentId}`)}let nextTimestamp;for(;;){let url=`/v9/projects/${project.id}/rollback/aliases?failedOnly=true&limit=20`;nextTimestamp&&(url+=`&until=${nextTimestamp}`);let{aliases,pagination}=await client.fetch(url);failedAliases.push(...aliases);for(let{alias,status:status4}of aliases)output_manager_default.log(` ${renderAliasStatus(status4).padEnd(11)} ${alias.alias} (${alias.deploymentId})`);if(pagination?.next)nextTimestamp=pagination.next;else break}return json?writeJsonFailure(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.API_ERROR,message:`Failed to remap all aliases to the requested deployment ${toDeploymentId}.`,data:{deployment:deployment?deploymentJson(deployment):null,aliases:failedAliases}}):1}async function renderJobSucceeded2({client,contextName,performingRollback,project,requestedAt,toDeploymentId}){let deploymentInfo="";try{let deployment=await getDeployment(client,contextName,toDeploymentId);deploymentInfo=`${import_chalk16.default.bold(deployment.url)} (${toDeploymentId})`}catch(err){output_manager_default.debug(`Failed to get deployment url for ${toDeploymentId}: ${err?.toString()||err}`),deploymentInfo=import_chalk16.default.bold(toDeploymentId)}let duration=performingRollback?elapsed(Date.now()-requestedAt):"";return output_manager_default.log(`Success! ${import_chalk16.default.bold(project.name)} was rolled back to ${deploymentInfo} ${duration}`),0}async function requestRollback({client,deployId,timeout,json=!1}){let{contextName,deployment,project}=await getProjectByDeployment({client,deployId});return await client.fetch(`/v9/projects/${project.id}/rollback/${deployment.id}`,{body:{},method:"POST"}),timeout!==void 0&&(0,import_ms6.default)(timeout)===0?(output_manager_default.log(`Successfully requested rollback of ${import_chalk17.default.bold(project.name)} to ${deployment.url} (${deployment.id})`),output_manager_default.log(`To check rollback status, run ${getCommandName("rollback")}.`),json?writeRollbackAccepted(client,deployment,project):0):await rollbackStatus({client,contextName,deployment,project,timeout,json})}var RollbackTelemetryClient=class extends TelemetryClient{trackCliArgumentDeployment(value){value&&this.trackCliArgument({arg:"urlOrDeploymentId",value:this.redactedValue})}trackCliSubcommandStatus(){this.trackCliSubcommand({subcommand:"status",value:"status"})}trackCliOptionTimeout(time){time&&this.trackCliOption({option:"timeout",value:"[TIME]"})}trackCliFlagYes(yes){yes&&this.trackCliFlag("yes")}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var rollback_default=async client=>client.argv.includes("--json")?runWithJsonOutput(client,()=>rollbackDeployment(client,!0)):rollbackDeployment(client,!1);async function rollbackDeployment(client,json){let parsedArgs,flagsSpecification=getFlagsSpecification(rollbackCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return json?writeJsonUsageError(client,error):(printError(error),2)}let telemetry2=new RollbackTelemetryClient({opts:{store:client.telemetryEventStore}});telemetry2.trackCliOptionTimeout(parsedArgs.flags["--timeout"]),telemetry2.trackCliFlagYes(parsedArgs.flags["--yes"]),telemetry2.trackCliFlagJson(parsedArgs.flags["--json"]);let needHelp=parsedArgs.flags["--help"];if(!parsedArgs.args[1]&&needHelp)return telemetry2.trackCliFlagHelp("rollback"),output_manager_default.print(help(rollbackCommand,{stream:client.stderr,columns:client.stderr.columns})),0;let timeout=parsedArgs.flags["--timeout"];if(timeout&&(0,import_ms7.default)(timeout)===void 0)return output_manager_default.error(`Invalid timeout "${timeout}"`),1;let actionOrDeployId=parsedArgs.args[1]||"status";try{if(actionOrDeployId==="status"){if(needHelp)return telemetry2.trackCliFlagHelp("rollback","status"),output_manager_default.print(help(statusSubcommand3,{stream:client.stderr,columns:client.stderr.columns,parent:rollbackCommand})),0;telemetry2.trackCliSubcommandStatus();let project=await getProjectByCwdOrLink({autoConfirm:parsedArgs.flags["--yes"],client,commandName:"rollback",projectNameOrId:parsedArgs.args[2]});return await rollbackStatus({client,project,timeout,json})}return await requestRollback({client,deployId:actionOrDeployId,timeout,json})}catch(err){if(json)throw err;if((0,import_error_utils6.isErrnoException)(err)){if(err.code==="ERR_CANCELED")return 0;if(err.code==="ERR_INVALID_CWD"||err.code==="ERR_LINK_PROJECT")return 1}return output_manager_default.prettyError(err),1}}async function startRollingRelease({client,dpl,projectId,teamId,yes}){let{deployment}=await getProjectByDeployment({client,deployId:dpl}),promoteByCreation=!1;if(deployment.target!=="production")if(yes)promoteByCreation=!0;else{if(client.nonInteractive)return output_manager_default.error("This deployment is not a production deployment. In non-interactive mode use --yes to create a new production deployment and start the rolling release."),1;{let question="This deployment is not a production deployment and cannot be directly promoted. A new deployment will be built using your production environment. Are you sure you want to continue?";if(promoteByCreation=await client.input.confirm(question,!1),!promoteByCreation)return output_manager_default.error("Canceled"),0}}if(promoteByCreation){let newDeployment=await client.fetch(`/v13/deployments?teamId=${deployment.ownerId}`,{body:{deploymentId:deployment.id,name:projectId,target:"production",meta:{action:"promote"}},accountId:deployment.ownerId,method:"POST"});return output_manager_default.log(`Created production deployment ${newDeployment.id}: ${newDeployment.inspectorUrl}`),0}return await client.fetch(`/v1/projects/${projectId}/rolling-release/start?teamId=${teamId}`,{body:{canaryDeploymentId:deployment.id},json:!0,method:"POST"}),output_manager_default.log(`Requested rolling release start for ${deployment.id}`),0}var import_ms8=__toESM(require_ms(),1);function parseDuration(value){if(!value||/^\d+(s|ms)$/i.test(value))return;let milliseconds=(0,import_ms8.default)(/^\d+$/.test(value)?`${value}m`:value);if(milliseconds===void 0||milliseconds<=0)return;let minutes=Math.round(milliseconds/6e4);if(!(minutes<=0))return minutes}function parseStageFlags(stageFlags,advancementType){let stages=[];for(let stageValue of stageFlags){let parts=stageValue.split(","),percentage=parseInt(parts[0],10);if(isNaN(percentage)||percentage<1||percentage>99)return{stages:null,error:`Invalid stage percentage "${parts[0]}". Must be a number between 1 and 99.`};if(parts.length>1){if(advancementType==="manual-approval")return{stages:null,error:'Duration must not be provided for stages when advancement type is "manual-approval".'};let duration=parseDuration(parts[1]);if(duration===void 0)return{stages:null,error:`Invalid duration "${parts[1]}". Use minutes (e.g. "5m"), hours (e.g. "1h"), or days (e.g. "1d"). Seconds are not supported.`};stages.push({targetPercentage:percentage,duration})}else{if(advancementType==="automatic")return{stages:null,error:'Duration is required for each stage when advancement type is "automatic". Use the format "PERCENTAGE,DURATION" (e.g. "10,5m").'};stages.push({targetPercentage:percentage})}}for(let i=1;i<stages.length;i++)if(stages[i].targetPercentage<=stages[i-1].targetPercentage)return{stages:null,error:"Stage percentages must be in ascending order."};return{stages,error:null}}async function interactiveConfigure(client){if(await client.input.select({message:"Would you like to enable or disable rolling releases?",choices:[{name:"Enable",value:"enable"},{name:"Disable",value:"disable"}]})==="disable")return{config:void 0};let advancementType=await client.input.select({message:"How should stages advance?",choices:[{name:"automatic - Stages advance automatically after a set duration",value:"automatic"},{name:"manual-approval - Each stage requires manual approval to advance",value:"manual-approval"}]}),stages=[],stageNumber=1,addMore=!0;for(;addMore;){let percentageStr=await client.input.text({message:`Enter traffic percentage for stage ${stageNumber} (1-99):`,validate:val=>{let num=parseInt(val,10);return isNaN(num)||num<1||num>99?"Percentage must be a number between 1 and 99.":stages.length>0&&num<=stages[stages.length-1].targetPercentage?`Percentage must be greater than the previous stage (${stages[stages.length-1].targetPercentage}%).`:!0}}),percentage=parseInt(percentageStr,10),duration;if(advancementType==="automatic"){let durationStr=await client.input.text({message:"Enter duration for this stage (e.g. 5m, 1h):",validate:val=>parseDuration(val)===void 0?'Invalid duration. Use minutes (e.g. "5m"), hours (e.g. "1h"), or days (e.g. "1d"). Seconds are not supported.':!0});duration=parseDuration(durationStr)}stages.push({targetPercentage:percentage,duration}),stageNumber++,addMore=await client.input.confirm("Add another stage?",!1)}return output_manager_default.log(""),output_manager_default.log("Rolling release configuration:"),output_manager_default.log(` Advancement: ${advancementType}`),stages.forEach((stage,i)=>{let durationText=stage.duration!==void 0?` for ${stage.duration} minutes`:"";output_manager_default.log(` Stage ${i+1}: ${stage.targetPercentage}%${durationText}`)}),output_manager_default.log(` Stage ${stages.length+1}: 100% (final)`),output_manager_default.log(""),await client.input.confirm("Apply this configuration?",!0)?{config:{enabled:!0,advancementType,stages:[...stages,{targetPercentage:100}]}}:(output_manager_default.log("Configuration cancelled."),{exitCode:0})}function failUsage(client,jsonOutput,reason,message){return jsonOutput?writeAgentError(client,{status:AGENT_STATUS.ERROR,reason,message}):output_manager_default.error(message),{exitCode:2}}async function buildConfigurePayload({client,cfgString,enableFlag,disableFlag,disableName="--no-enable",advancementType,stageFlags,jsonOutput=!1}){if(cfgString!==void 0){if(cfgString==="disable")return{config:void 0};try{return{config:JSON.parse(cfgString)}}catch{return failUsage(client,jsonOutput,AGENT_REASON.INVALID_ARGUMENTS,"Invalid JSON provided for --cfg option.")}}if(disableFlag)return enableFlag?failUsage(client,jsonOutput,AGENT_REASON.INVALID_ARGUMENTS,`Can't use --enable with ${disableName}.`):{config:void 0};if(enableFlag){if(advancementType!=="automatic"&&advancementType!=="manual-approval")return failUsage(client,jsonOutput,"missing_flags",'--advancement-type is required when using --enable. Must be "automatic" or "manual-approval".');if(!stageFlags||stageFlags.length===0)return failUsage(client,jsonOutput,"missing_flags","At least one --stage is required when using --enable.");let parsed=parseStageFlags(stageFlags,advancementType);return parsed.error!==null?failUsage(client,jsonOutput,AGENT_REASON.INVALID_ARGUMENTS,parsed.error):{config:{enabled:!0,advancementType,stages:[...parsed.stages,{targetPercentage:100}]}}}return advancementType!==void 0||stageFlags!==void 0&&stageFlags.length>0?failUsage(client,jsonOutput,"missing_flags","--enable or --no-enable is required when using --advancement-type or --stage options."):client.nonInteractive||jsonOutput?failUsage(client,jsonOutput,"missing_flags","In non-interactive mode use --enable or --no-enable with --advancement-type and --stage as needed. Example: vercel rolling-release update --enable --advancement-type=automatic --stage=10,5m --stage=50,10m"):client.stdin.isTTY?interactiveConfigure(client):failUsage(client,jsonOutput,"missing_flags","Missing configuration options. Use --enable or --no-enable with --advancement-type and --stage, or run interactively in a terminal.")}async function configureRollingRelease({client,projectId,teamId,rollingReleaseConfig,jsonOutput=!1}){let body={...rollingReleaseConfig,enabled:!!rollingReleaseConfig};return await client.fetch(`/v1/projects/${projectId}/rolling-release/config?teamId=${teamId}`,{body,json:!0,method:"PATCH"}),jsonOutput?(client.stdout.write(`${JSON.stringify({rollingReleaseConfig:body,outcome:"updated"},null,2)}
|
|
198
195
|
`),0):(rollingReleaseConfig?output_manager_default.log("Successfully updated rolling releases."):output_manager_default.log("Successfully disabled rolling releases."),0)}async function approveRollingRelease({client,projectId,teamId,activeStageIndex,dpl}){let{deployment}=await getProjectByDeployment({client,deployId:dpl});return await client.fetch(`/v1/projects/${projectId}/rolling-release/approve-stage?teamId=${teamId}`,{method:"POST",json:!0,body:{activeStageIndex,nextStageIndex:activeStageIndex+1,canaryDeploymentId:deployment.id}}),output_manager_default.log(`Requested rolling release approval from stage ${activeStageIndex} to ${activeStageIndex+1} for ${deployment.id}`),0}async function abortRollingRelease({client,projectId,dpl,teamId}){let{deployment}=await getProjectByDeployment({client,deployId:dpl});return await client.fetch(`/v9/projects/${projectId}/rollback/${deployment.id}?teamId=${teamId}`,{body:{},method:"POST"}),output_manager_default.log(`Requested rolling release abort and rollback to ${deployment.id}`),0}async function completeRollingRelease({client,projectId,teamId,dpl}){let{deployment}=await getProjectByDeployment({client,deployId:dpl});return await client.fetch(`/v1/projects/${projectId}/rolling-release/complete?teamId=${teamId}`,{body:{canaryDeploymentId:deployment.id},json:!0,method:"POST"}),output_manager_default.log(`Requested rolling release completion for ${deployment.id}`),0}var RollingReleaseTelemetryClient=class extends TelemetryClient{trackCliOptionAction(value){this.trackCliOption({option:"action",value:value??""})}trackCliOptionName(name){name&&this.trackCliOption({option:"name",value:this.redactedValue})}trackCliOptionCfg(value){this.trackCliOption({option:"cfg",value:value??""})}trackCliOptionDeployment(value){value&&this.trackCliOption({option:"deployment",value:this.redactedValue})}trackCliOptionDpl(value){value&&this.trackCliOption({option:"dpl",value:this.redactedValue})}trackCliOptionCurrentStageIndex(value){this.trackCliOption({option:"currentStageIndex",value:value??""})}trackCliSubcommandUpdate(actual){this.trackCliSubcommand({subcommand:"update",value:actual})}trackCliSubcommandStart(actual){this.trackCliSubcommand({subcommand:"start",value:actual})}trackCliSubcommandApprove(actual){this.trackCliSubcommand({subcommand:"approve",value:actual})}trackCliSubcommandAbort(actual){this.trackCliSubcommand({subcommand:"abort",value:actual})}trackCliSubcommandComplete(actual){this.trackCliSubcommand({subcommand:"complete",value:actual})}trackCliSubcommandInspect(actual){this.trackCliSubcommand({subcommand:"inspect",value:actual})}trackCliFlagEnable(value){value&&this.trackCliFlag("enable")}trackCliFlagJson(value){value&&this.trackCliFlag("json")}trackCliFlagNoEnable(value){value&&this.trackCliFlag("no-enable")}trackCliFlagDisable(value){value&&this.trackCliFlag("disable")}trackCliOptionAdvancementType(value){value&&this.trackCliOption({option:"advancement-type",value})}trackCliOptionStage(value){value&&this.trackCliOption({option:"stage",value:value.join(",")})}};var COMMAND_CONFIG11={update:getCommandAliases(configureSubcommand),start:getCommandAliases(startSubcommand),approve:getCommandAliases(approveSubcommand),abort:getCommandAliases(abortSubcommand),complete:getCommandAliases(completeSubcommand),inspect:getCommandAliases(fetchSubcommand)},SUBCOMMANDS={update:configureSubcommand,start:startSubcommand,approve:approveSubcommand,abort:abortSubcommand,complete:completeSubcommand,inspect:fetchSubcommand};function getRollingReleaseSubcommand(subcommand){return typeof subcommand=="string"&&subcommand in SUBCOMMANDS?subcommand:void 0}function buildDeploymentSuggestionCommands(client,subcmd){let args=renameOptionInArgs(client.argv.slice(2),"--dpl","--deployment"),preservedParts=[],listParts=[],hasNonInteractive=!1;for(let i=2;i<args.length;i++){let arg=args[i];if(arg==="--non-interactive"){hasNonInteractive=!0;continue}if(arg.startsWith("--cwd=")){let cwdPath=arg.slice(6);cwdPath&&(preservedParts.push("--cwd",cwdPath),listParts.push("--cwd",cwdPath));continue}if(arg==="--cwd"){i+1<args.length&&(preservedParts.push("--cwd",args[i+1]),listParts.push("--cwd",args[i+1]),i++);continue}if(arg.startsWith("--project=")){let projectName=arg.slice(10);projectName&&listParts.push(projectName),preservedParts.push(arg);continue}if(arg==="--project"||getShortFlagLongName(arg)==="--project"){i+1<args.length&&(listParts.push(args[i+1]),preservedParts.push(arg,args[i+1]),i++);continue}preservedParts.push(arg),listParts.push(arg)}let preservedSuffix=preservedParts.join(" "),listSuffix=listParts.join(" "),listCommand=listSuffix?`${packageName} ls ${listSuffix}`:`${packageName} ls`,base=preservedSuffix?`${packageName} rolling-release ${subcmd} ${preservedSuffix}`:`${packageName} rolling-release ${subcmd}`,defaultSuffix=subcmd==="approve"?"--deployment dpl_123 --currentStageIndex=0":"--deployment dpl_123",subcommandCommand=hasNonInteractive?`${base} ${defaultSuffix} --non-interactive`:`${base} ${defaultSuffix}`;return{listCommand,subcommandCommand}}function outputRollingReleaseErrorWithDeploymentSuggestions(client,subcmd,reason,message){let{listCommand,subcommandCommand}=buildDeploymentSuggestionCommands(client,subcmd);outputAgentError(client,{status:"error",reason,message,next:[{command:listCommand},{command:subcommandCommand}]},1)}function getDeploymentFlag(client,flags,telemetry2){telemetry2.trackCliOptionDeployment(flags["--deployment"]),telemetry2.trackCliOptionDpl(flags["--dpl"]);let deployment=getRenamedOption(flags,"--deployment","--dpl");return"error"in deployment?reportRenamedOptionError(client,deployment.error):deployment.value}async function rollingRelease(client){let telemetry2=new RollingReleaseTelemetryClient({opts:{store:client.telemetryEventStore}}),{subcommand,args:subcommandArgs,subcommandOriginal}=getSubcommand(client.argv.slice(3),COMMAND_CONFIG11),commandIndex=client.argv.length-tokensAfterCommand(client.argv).length-1;client.argv[commandIndex]==="rr"&&warnDeprecatedSubcommand(client,"rr","rolling-release");let needHelp=client.argv.includes("--help")||client.argv.includes("-h");if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("rolling-release"),output_manager_default.print(help(rollingReleaseCommand,{stream:client.stderr,columns:client.stderr.columns})),0;function printHelp(command){output_manager_default.print(help(command,{stream:client.stderr,parent:rollingReleaseCommand,columns:client.stderr.columns}))}try{let subcommandName=getRollingReleaseSubcommand(subcommand),subcommandConfig=subcommandName?SUBCOMMANDS[subcommandName]:void 0;if(subcommandConfig&&needHelp)return telemetry2.trackCliFlagHelp("rolling-release",subcommandOriginal),printHelp(subcommandConfig),0;let subcommandFlags,projectName,deployment;if(subcommandConfig){try{subcommandFlags=parseArguments(subcommandArgs,getFlagsSpecification(subcommandConfig.options))}catch(err){if(!isArgumentError(err))throw err;return wantsMachineReadableOutput(void 0,subcommandArgs)?writeAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message:err.message}):printError(err),2}if(projectName=subcommandFlags.flags["--project"],telemetry2.trackCliOptionProject(projectName),subcommandConfig.options.some(({name})=>name==="deployment")){let deploymentFlag=getDeploymentFlag(client,subcommandFlags.flags,telemetry2);if(typeof deploymentFlag=="number")return deploymentFlag;deployment=deploymentFlag}}let link=await resolveProjectContext({client,projectNameOrId:projectName});if(link.status==="error")return link.exitCode;if(link.status==="not_linked")return client.nonInteractive&&outputAgentError(client,{status:"error",reason:"not_linked",message:"No project found for rolling releases. Specify a project with --project <name-or-id>, or link your project first.",next:[{command:`${packageName} link`}]},1),output_manager_default.error(`No project found. Specify a project with \`--project <name-or-id>\`, or run \`${packageName} link\` to link your project first.`),1;let{project,org}=link;if(client.config.currentTeam=org.type==="team"?org.id:void 0,!subcommandName||!subcommandFlags)return output_manager_default.debug(`Invalid subcommand: ${subcommand}`),output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG11)),output_manager_default.print(help(rollingReleaseCommand,{stream:client.stderr,columns:client.stderr.columns})),2;switch(subcommandName){case"update":{telemetry2.trackCliSubcommandUpdate(subcommandOriginal),subcommandOriginal==="configure"&&warnDeprecatedSubcommand(client,"rolling-release configure","rolling-release update");let cfgString=subcommandFlags.flags["--cfg"],enableFlag=subcommandFlags.flags["--enable"],noEnableFlag=subcommandFlags.flags["--no-enable"],disableFlag=subcommandFlags.flags["--disable"],advancementType=subcommandFlags.flags["--advancement-type"],stageFlags=subcommandFlags.flags["--stage"],jsonOutput=subcommandFlags.flags["--json"]??!1;telemetry2.trackCliFlagEnable(enableFlag),telemetry2.trackCliFlagNoEnable(noEnableFlag),telemetry2.trackCliFlagDisable(disableFlag),disableFlag&&!enableFlag&&warnDeprecatedInput(client,"--disable","--no-enable"),telemetry2.trackCliOptionAdvancementType(advancementType),telemetry2.trackCliOptionStage(stageFlags),telemetry2.trackCliFlagJson(jsonOutput);let configResult=await buildConfigurePayload({client,cfgString,enableFlag,disableFlag:noEnableFlag||disableFlag,disableName:noEnableFlag?"--no-enable":"--disable",advancementType,stageFlags,jsonOutput});if(configResult.exitCode!==void 0)return configResult.exitCode;try{await configureRollingRelease({client,projectId:project.id,teamId:org.id,rollingReleaseConfig:configResult.config,jsonOutput})}catch(err){if(jsonOutput&&isAPIError(err))return writeAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.API_ERROR,message:err.message||"Updating rolling release settings failed."}),1;throw err}break}case"start":{if(deployment===void 0)return client.nonInteractive&&outputRollingReleaseErrorWithDeploymentSuggestions(client,"start","missing_flags","Starting a rolling release in non-interactive mode requires the --deployment option."),output_manager_default.error("starting a rolling release requires --deployment option."),2;try{await startRollingRelease({client,dpl:deployment,projectId:project.id,teamId:project.accountId,yes:subcommandFlags.flags["--yes"]??!1})}catch(err){if(client.nonInteractive&&isAPIError(err))return outputRollingReleaseErrorWithDeploymentSuggestions(client,"start","api_error",err.message||"Starting the rolling release failed for this deployment."),1;throw err}break}case"approve":{let currentStageIndex=subcommandFlags.flags["--currentStageIndex"],activeStageIndex=parseInt(currentStageIndex??"");if(!deployment)return client.nonInteractive&&outputRollingReleaseErrorWithDeploymentSuggestions(client,"approve","missing_flags","Approving a rolling release in non-interactive mode requires --deployment and --currentStageIndex."),output_manager_default.error("Missing required option --deployment"),2;if(currentStageIndex===void 0)return client.nonInteractive&&outputRollingReleaseErrorWithDeploymentSuggestions(client,"approve","missing_flags","Approving a rolling release in non-interactive mode requires --currentStageIndex."),output_manager_default.error("Missing required option --currentStageIndex"),2;if(isNaN(activeStageIndex))return client.nonInteractive&&outputRollingReleaseErrorWithDeploymentSuggestions(client,"approve","invalid_flag","--currentStageIndex must be a valid number."),output_manager_default.error("--currentStageIndex must be a valid number."),2;await approveRollingRelease({client,projectId:project.id,teamId:org.id,activeStageIndex,dpl:deployment});break}case"abort":{if(!deployment)return client.nonInteractive&&outputRollingReleaseErrorWithDeploymentSuggestions(client,"abort","missing_flags","Aborting a rolling release in non-interactive mode requires the --deployment option."),output_manager_default.error("Missing required option --deployment"),2;try{await abortRollingRelease({client,projectId:project.id,teamId:org.id,dpl:deployment})}catch(err){if(client.nonInteractive&&isAPIError(err))return outputRollingReleaseErrorWithDeploymentSuggestions(client,"abort","api_error",err.message||"Aborting the rolling release failed for this deployment."),1;throw err}break}case"complete":{if(!deployment)return client.nonInteractive&&outputRollingReleaseErrorWithDeploymentSuggestions(client,"complete","missing_flags","Completing a rolling release in non-interactive mode requires the --deployment option."),output_manager_default.error("Missing required option --deployment"),2;await completeRollingRelease({client,projectId:project.id,teamId:org.id,dpl:deployment});break}case"inspect":{telemetry2.trackCliSubcommandInspect(subcommandOriginal),subcommandOriginal==="fetch"&&warnDeprecatedSubcommand(client,"rolling-release fetch","rolling-release inspect");let result=await requestRollingRelease({client,projectId:project.id,teamId:org.id});subcommandFlags?.flags["--json"]?client.stdout.write(`${JSON.stringify({rollingRelease:result},null,2)}
|
|
199
|
-
`):output_manager_default.log(JSON.stringify(result,null,2));break}}return 0}catch(err){return client.nonInteractive&&isAPIError(err)&&outputAgentError(client,{status:"error",reason:"api_error",message:err.message||"Rolling release command failed."},1),printError(err),1}}async function sandbox(client){let argv=client.argv.slice(2),commandIndex=argv.indexOf("sandbox"),rootArgs=commandIndex===-1?argv:argv.slice(0,commandIndex),sandboxArgs=commandIndex===-1?[]:argv.slice(commandIndex+1),scope=getFlagValue(rootArgs,["--scope","-S"]),team=getFlagValue(rootArgs,["--team","-T"]),token=getFlagValue(rootArgs,["--token","-t"]),forwardedArgs=[...scope?["--scope",scope]:team?["--team",team]:[],...sandboxArgs],originalCwd=process.cwd(),originalAuthToken=process.env.VERCEL_AUTH_TOKEN;try{token?process.env.VERCEL_AUTH_TOKEN=token:!process.env.VERCEL_AUTH_TOKEN&&process.env.VERCEL_TOKEN?process.env.VERCEL_AUTH_TOKEN=process.env.VERCEL_TOKEN:!process.env.VERCEL_AUTH_TOKEN&&client.authConfig.token&&(process.env.VERCEL_AUTH_TOKEN=client.authConfig.token),process.env.VERCEL_CLI_INVOCATION_ID=client.telemetryEventStore.currentInvocationId,process.chdir(client.cwd);let{createApp}=await import("sandbox");return await createApp({appName:"vercel sandbox",withoutAuth:!1}).run(forwardedArgs),Number(process.exitCode??0)}catch(error){return printError(error),1}finally{process.chdir(originalCwd),typeof originalAuthToken=="string"?process.env.VERCEL_AUTH_TOKEN=originalAuthToken:delete process.env.VERCEL_AUTH_TOKEN}}var SecurityTelemetryClient=class extends TelemetryClient{trackCliSubcommandCheck(actual){this.trackCliSubcommand({subcommand:"check",value:actual})}trackCliSubcommandVulnerabilities(actual){this.trackCliSubcommand({subcommand:"vulnerabilities",value:actual})}};var
|
|
196
|
+
`):output_manager_default.log(JSON.stringify(result,null,2));break}}return 0}catch(err){return client.nonInteractive&&isAPIError(err)&&outputAgentError(client,{status:"error",reason:"api_error",message:err.message||"Rolling release command failed."},1),printError(err),1}}async function sandbox(client){let argv=client.argv.slice(2),commandIndex=argv.indexOf("sandbox"),rootArgs=commandIndex===-1?argv:argv.slice(0,commandIndex),sandboxArgs=commandIndex===-1?[]:argv.slice(commandIndex+1),scope=getFlagValue(rootArgs,["--scope","-S"]),team=getFlagValue(rootArgs,["--team","-T"]),token=getFlagValue(rootArgs,["--token","-t"]),forwardedArgs=[...scope?["--scope",scope]:team?["--team",team]:[],...sandboxArgs],originalCwd=process.cwd(),originalAuthToken=process.env.VERCEL_AUTH_TOKEN;try{token?process.env.VERCEL_AUTH_TOKEN=token:!process.env.VERCEL_AUTH_TOKEN&&process.env.VERCEL_TOKEN?process.env.VERCEL_AUTH_TOKEN=process.env.VERCEL_TOKEN:!process.env.VERCEL_AUTH_TOKEN&&client.authConfig.token&&(process.env.VERCEL_AUTH_TOKEN=client.authConfig.token),process.env.VERCEL_CLI_INVOCATION_ID=client.telemetryEventStore.currentInvocationId,process.chdir(client.cwd);let{createApp}=await import("sandbox");return await createApp({appName:"vercel sandbox",withoutAuth:!1}).run(forwardedArgs),Number(process.exitCode??0)}catch(error){return printError(error),1}finally{process.chdir(originalCwd),typeof originalAuthToken=="string"?process.env.VERCEL_AUTH_TOKEN=originalAuthToken:delete process.env.VERCEL_AUTH_TOKEN}}var SecurityTelemetryClient=class extends TelemetryClient{trackCliSubcommandCheck(actual){this.trackCliSubcommand({subcommand:"check",value:actual})}trackCliSubcommandVulnerabilities(actual){this.trackCliSubcommand({subcommand:"vulnerabilities",value:actual})}};var import_chalk18=__toESM(require_source(),1);var SecurityCheckTelemetryClient=class extends TelemetryClient{trackCliArgumentCheck(checks){checks.length>0&&this.trackCliArgument({arg:"check",value:checks.join(",")})}trackCliFlagFindings(findings){findings&&this.trackCliFlag("findings")}trackCliOptionLimit(limit){limit!==void 0&&this.trackCliOption({option:"limit",value:String(limit)})}trackCliOptionFormat(format){format&&this.trackCliOption({option:"format",value:format})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var SECURITY_CHECKS=[{slug:"members-no-mfa",description:"Team members without multi-factor authentication",risk:"high"},{slug:"members-too-many-owners",description:"Team owners to review",risk:"high"},{slug:"pats-no-expiration",description:"PATs that never expire",risk:"high"},{slug:"env-vars-creds-instead-of-oidc",description:"Long-lived credentials where OIDC is available",risk:"high"},{slug:"depl-no-git-fork-protection",description:"Projects without Git fork deploy prevention",risk:"high"},{slug:"proj-no-preview-depl-protection",description:"Projects without preview deployment protection",risk:"high"},{slug:"env-vars-non-sensitive",description:"Environment variables not marked Sensitive",risk:"medium"},{slug:"env-vars-non-sensitive-stale",description:"Environment variables older than 90 days",risk:"medium"},{slug:"env-vars-exposed-web-app-fwk",description:"Environment variables exposed via web application framework",risk:"medium"}];function isKnownCheck(slug){return SECURITY_CHECKS.some(check4=>check4.slug===slug)}async function check2(client,argv){let telemetry2=new SecurityCheckTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(checkSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args:checks,flags:opts}=parsedArgs,unknown=checks.filter(slug=>!isKnownCheck(slug));if(unknown.length>0){let message=`Unknown check${unknown.length===1?"":"s"}: ${unknown.join(", ")}. Valid slugs: ${SECURITY_CHECKS.map(check4=>check4.slug).join(", ")}`;return outputAgentError(client,{status:"error",reason:AGENT_REASON.INVALID_ARGUMENTS,message,next:[{command:buildCommandWithGlobalFlags(client.argv,"security check <slug>"),when:"Re-run with a valid check slug (replace placeholder)"},{command:buildCommandWithGlobalFlags(client.argv,"security check --help"),when:"See all options and examples"}]}),output_manager_default.error(`Unknown check${unknown.length===1?"":"s"}: ${unknown.join(", ")}. Valid slugs:
|
|
200
197
|
${SECURITY_CHECKS.map(check4=>check4.slug).join(`
|
|
201
198
|
`)}`),2}let limit=opts["--limit"];if(limit!==void 0&&(!Number.isInteger(limit)||limit<1))return outputAgentError(client,{status:"error",reason:AGENT_REASON.INVALID_ARGUMENTS,message:"`--limit` must be a positive integer.",next:[{command:buildCommandWithGlobalFlags(client.argv,"security check --limit <N>"),when:"Re-run with a positive integer (replace placeholder)"}]}),output_manager_default.error("`--limit` must be a positive integer."),2;let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput||client.nonInteractive;telemetry2.trackCliArgumentCheck(checks),telemetry2.trackCliOptionFormat(opts["--format"]),telemetry2.trackCliFlagFindings(opts["--findings"]),telemetry2.trackCliOptionLimit(limit),telemetry2.trackCliOptionProject(opts["--project"]),telemetry2.trackCliFlagJson(opts["--json"]);let{team,contextName}=await getScope(client);if(!team)return outputAgentError(client,{status:"error",reason:AGENT_REASON.MISSING_SCOPE,message:"Security checks require a team scope. Run `vercel switch` to select a team.",next:[{command:buildCommandWithGlobalFlags(client.argv,"whoami"),when:"See current user and team"},{command:buildCommandWithGlobalFlags(client.argv,"teams switch"),when:"Switch to a team"}]}),output_manager_default.error(`Security checks require a team scope. Run ${getCommandName("switch")} to select a team.`),1;let params=new URLSearchParams({teamId:team.id,maxSamples:String(limit??100)});for(let slug of checks)params.append("facets",slug);let project=opts["--project"];project&¶ms.set("projectIdOrName",project);let dashStamp=stamp_default();output_manager_default.spinner(checks.length>0?"Computing security checks\u2026":"Computing security report\u2026");let data;try{data=await client.fetch(`/dashboard/security-dashboard?${params}`)}catch(error){output_manager_default.stopSpinner();let status4=isAPIError(error)?error.status:void 0;return outputAgentError(client,{status:"error",reason:status4===401||status4===403?"not_authorized":status4===429?"rate_limited":AGENT_REASON.API_ERROR,message:isAPIError(error)&&error.serverMessage||"The security report request failed.",next:[{command:buildCommandWithGlobalFlags(client.argv,"whoami"),when:"Verify the authenticated user and team"}]}),printError(error),1}if(output_manager_default.stopSpinner(),asJson)return client.stdout.write(`${JSON.stringify(data,null,2)}
|
|
202
|
-
`),0;let rows=SECURITY_CHECKS.filter(check4=>checks.length===0||checks.includes(check4.slug)).map(check4=>({check:check4,posture:data.report[check4.slug]})),counts={failing:0,passing:0,muted:0,unavailable:0};for(let{posture}of rows)counts[statusOf(posture)]++;let summary=[`${rows.length} ${rows.length===1?"check":"checks"}`,counts.failing>0&&
|
|
203
|
-
`),!!opts["--findings"]||checks.length>0)for(let{check:check4,posture}of rows){let allFindings=!project&&posture?.computedAt!==void 0&&!posture.unavailable&&posture.violationsCount>0?await fetchAllFindingLabels(client,team.id,check4.slug,limit):null;printFindings(check4.slug,posture,data.mutes,allFindings??void 0)}else counts.failing>0&&output_manager_default.log("Run with --findings to list individual findings.");return 0}function statusOf(posture){return posture?posture.unavailableReason==="muted"?"muted":posture.unavailable?"unavailable":posture.violationsCount>0?"failing":"passing":"unavailable"}function statusLabel(posture){let status4=statusOf(posture);return status4==="unavailable"&&posture?.unavailableReason?posture.unavailableReason==="insufficient-permissions"?
|
|
204
|
-
${
|
|
199
|
+
`),0;let rows=SECURITY_CHECKS.filter(check4=>checks.length===0||checks.includes(check4.slug)).map(check4=>({check:check4,posture:data.report[check4.slug]})),counts={failing:0,passing:0,muted:0,unavailable:0};for(let{posture}of rows)counts[statusOf(posture)]++;let summary=[`${rows.length} ${rows.length===1?"check":"checks"}`,counts.failing>0&&import_chalk18.default.red(`${counts.failing} failing`),counts.muted>0&&import_chalk18.default.yellow(`${counts.muted} muted`),counts.unavailable>0&&import_chalk18.default.gray(`${counts.unavailable} unavailable`),counts.passing>0&&import_chalk18.default.green(`${counts.passing} passing`)].filter(Boolean).join(" \xB7 ");if(output_manager_default.log(`${summary} under ${import_chalk18.default.bold(contextName)} ${import_chalk18.default.gray(dashStamp())}`),output_manager_default.print(formatSummaryTable(rows).replace(/^(.*)/gm," $1")),output_manager_default.print(`
|
|
200
|
+
`),!!opts["--findings"]||checks.length>0)for(let{check:check4,posture}of rows){let allFindings=!project&&posture?.computedAt!==void 0&&!posture.unavailable&&posture.violationsCount>0?await fetchAllFindingLabels(client,team.id,check4.slug,limit):null;printFindings(check4.slug,posture,data.mutes,allFindings??void 0)}else counts.failing>0&&output_manager_default.log("Run with --findings to list individual findings.");return 0}function statusOf(posture){return posture?posture.unavailableReason==="muted"?"muted":posture.unavailable?"unavailable":posture.violationsCount>0?"failing":"passing":"unavailable"}function statusLabel(posture){let status4=statusOf(posture);return status4==="unavailable"&&posture?.unavailableReason?posture.unavailableReason==="insufficient-permissions"?import_chalk18.default.gray("no access"):import_chalk18.default.gray("error"):{failing:import_chalk18.default.red("failing"),passing:import_chalk18.default.green("passing"),muted:import_chalk18.default.yellow("muted"),unavailable:import_chalk18.default.gray("unavailable")}[status4]}function violationsLabel(posture){return!posture||posture.unavailable?import_chalk18.default.gray("\u2013"):posture.truncated?`${posture.violationsCount}+`:String(posture.violationsCount)}function formatSummaryTable(rows){return formatTable(["Check","Risk","Status","Violations","Muted","Description"],["l","l","l","r","r","l"],[{rows:rows.map(({check:check4,posture})=>[import_chalk18.default.bold(check4.slug),check4.risk==="high"?import_chalk18.default.red("high"):import_chalk18.default.yellow("medium"),statusLabel(posture),violationsLabel(posture),posture?.mutedCount?String(posture.mutedCount):import_chalk18.default.gray("\u2013"),import_chalk18.default.gray(truncateEnd(check4.description,60))])}])}async function fetchAllFindingLabels(client,teamId,facet,limit){let labels=[],cursor;try{do{let params=new URLSearchParams({teamId,facet,limit:"1000"});cursor&¶ms.set("cursor",cursor);let page=await client.fetch(`/dashboard/security-dashboard/findings?${params}`);for(let finding of page.findings)if(!finding.muted&&(labels.push(finding.groupLabel?`${finding.groupLabel} / ${finding.label}`:finding.label),limit!==void 0&&labels.length>=limit))return labels;cursor=page.cursor??void 0}while(cursor)}catch{return null}return labels}function flattenSamples(samples){return samples.flatMap(sample=>sample.samples?sample.samples.map(sub=>`${sample.label} / ${sub.label}`):[sample.label])}function printFindings(slug,posture,mutes,allFindings){let findings=allFindings??(posture&&!posture.unavailable?flattenSamples(posture.samples):[]),mutedFindings=(mutes??[]).filter(mute=>mute.facet===slug&&mute.entityId).map(mute=>{let label=mute.labelSnapshot?.label??mute.entityId??"",group=mute.labelSnapshot?.groupLabel;return group?`${group} / ${label}`:label});if(!(findings.length===0&&mutedFindings.length===0)){output_manager_default.print(`
|
|
201
|
+
${import_chalk18.default.bold(slug)}
|
|
205
202
|
`);for(let finding of findings)output_manager_default.print(` ${finding}
|
|
206
|
-
`);for(let finding of mutedFindings.sort())output_manager_default.print(` ${
|
|
207
|
-
`);posture&&posture.violationsCount>findings.length&&output_manager_default.print(` ${
|
|
208
|
-
`)}}var
|
|
203
|
+
`);for(let finding of mutedFindings.sort())output_manager_default.print(` ${import_chalk18.default.dim(`${finding} (muted)`)}
|
|
204
|
+
`);posture&&posture.violationsCount>findings.length&&output_manager_default.print(` ${import_chalk18.default.gray(`Showing ${findings.length} of ${posture.violationsCount}${posture.truncated?"+":""} findings (raise with --limit)`)}
|
|
205
|
+
`)}}var import_chalk19=__toESM(require_source(),1);var VulnerabilityTelemetryClient=class extends TelemetryClient{trackCliArgumentVulnerability(vulnerability){vulnerability&&this.trackCliArgument({arg:"vulnerability",value:this.redactedValue})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}},SecurityVulnerabilitiesListTelemetryClient=class extends VulnerabilityTelemetryClient{trackCliOptionProject(project){project&&this.trackCliOption({option:"project",value:this.redactedValue})}trackCliOptionEnvironment(environment){environment&&this.trackCliOption({option:"environment",value:this.redactedValue})}trackCliOptionGitBranch(gitBranch){gitBranch&&this.trackCliOption({option:"git-branch",value:this.redactedValue})}trackCliOptionStatus(status4){status4&&this.trackCliOption({option:"status",value:status4})}trackCliOptionSeverity(severity){severity&&this.trackCliOption({option:"severity",value:severity})}trackCliOptionQuery(query){query&&this.trackCliOption({option:"query",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})}},SecurityVulnerabilitiesTelemetryClient=class extends SecurityVulnerabilitiesListTelemetryClient{trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandInspect(actual){this.trackCliSubcommand({subcommand:"inspect",value:actual})}trackCliSubcommandDismiss(actual){this.trackCliSubcommand({subcommand:"dismiss",value:actual})}trackCliSubcommandReopen(actual){this.trackCliSubcommand({subcommand:"reopen",value:actual})}},SecurityVulnerabilitiesInspectTelemetryClient=class extends VulnerabilityTelemetryClient{},SecurityVulnerabilitiesDismissTelemetryClient=class extends VulnerabilityTelemetryClient{trackCliOptionReason(reason){reason&&this.trackCliOption({option:"reason",value:reason})}trackCliOptionMessage(message){message&&this.trackCliOption({option:"message",value:this.redactedValue})}},SecurityVulnerabilitiesReopenTelemetryClient=class extends VulnerabilityTelemetryClient{};var STATUSES2=["open","closed","dismissed"],SEVERITIES=["critical","high","medium","low"],DISMISSAL_REASONS=["false-positive","accepted-risk"],STATUS_CHANGE_ROLES="Changing a vulnerability's status requires the Owner, Member, Developer, or Security role.",REFERENCE_PATTERN=/^(?:([\w.-]+)\/)?([\w.-]+)\/([1-9]\d*)$/,ID_PATTERN=/^[0-9A-HJKMNP-TV-Z]{26}$/i,COMMAND_CONFIG12={list:getCommandAliases(vulnerabilitiesListSubcommand),inspect:getCommandAliases(vulnerabilitiesInspectSubcommand),dismiss:getCommandAliases(vulnerabilitiesDismissSubcommand),reopen:getCommandAliases(vulnerabilitiesReopenSubcommand)};async function vulnerabilities(client,argv){let{subcommand,args,subcommandOriginal}=getSubcommand(argv,COMMAND_CONFIG12),telemetry2=new SecurityVulnerabilitiesTelemetryClient({opts:{store:client.telemetryEventStore}});switch(subcommand){case"inspect":return telemetry2.trackCliSubcommandInspect(subcommandOriginal),inspect(client,args);case"dismiss":return telemetry2.trackCliSubcommandDismiss(subcommandOriginal),dismiss(client,args);case"reopen":return telemetry2.trackCliSubcommandReopen(subcommandOriginal),reopen(client,args);default:return telemetry2.trackCliSubcommandList(subcommandOriginal),list2(client,args)}}async function list2(client,argv){let parsedArgs=parseCommand(client,argv,()=>parseArguments(argv,getFlagsSpecification(vulnerabilitiesListSubcommand.options)));if(typeof parsedArgs=="number")return parsedArgs;let{args,flags:opts}=parsedArgs,json=!!opts["--json"],project=opts["--project"],environment=opts["--environment"],gitBranch=opts["--git-branch"],status4=opts["--status"]??"open",severity=opts["--severity"],query=opts["--query"]?.trim(),limit;try{limit=parseListLimit(opts["--limit"])}catch(error){return usageError(client,json,error.message)}let invalid=args.length>0&&`List takes no arguments. To show one vulnerability, run ${suggest(client,"security vulnerabilities inspect <vulnerability>")}.`||status4!=="all"&&!isCommaListOf(status4,STATUSES2)&&`--status must be all or a comma-separated list of: ${STATUSES2.join(", ")}.`||severity!==void 0&&!isCommaListOf(severity,SEVERITIES)&&`--severity must be a comma-separated list of: ${SEVERITIES.join(", ")}.`||query!==void 0&&(query.length===0||query.length>200)&&"--query must be 1 to 200 characters.";if(invalid)return usageError(client,json,invalid);let telemetry2=new SecurityVulnerabilitiesListTelemetryClient({opts:{store:client.telemetryEventStore}});telemetry2.trackCliOptionProject(project),telemetry2.trackCliOptionEnvironment(environment),telemetry2.trackCliOptionGitBranch(gitBranch),telemetry2.trackCliOptionStatus(opts["--status"]),telemetry2.trackCliOptionSeverity(severity),telemetry2.trackCliOptionQuery(query),telemetry2.trackCliOptionLimit(opts["--limit"]),telemetry2.trackCliOptionNext(opts["--next"]),telemetry2.trackCliFlagJson(opts["--json"]);let ctx=await getContext(client,json);if(typeof ctx=="number")return ctx;try{let found=project?await getProjectByNameOrId(client,project,ctx.team.id):void 0;if(found instanceof ProjectNotFound)return fail2(client,json,{reason:AGENT_REASON.PROJECT_NOT_FOUND,message:`Couldn't find project ${project} in ${ctx.contextName}.`});json||output_manager_default.spinner("Fetching vulnerabilities\u2026");let page=await fetchVulnerabilities(client,{teamId:ctx.team.id,projectId:found?.id,environment,branchRef:gitBranch,status:status4==="all"?void 0:status4,severity,search:query,limit:String(limit),cursor:opts["--next"]});if(output_manager_default.stopSpinner(),json)return printJson(client,{vulnerabilities:page.findings.map(({description,fix,...rest})=>rest),repositories:page.repositories,pagination:{next:page.nextCursor}});let showStatus=status4==="all"||status4.includes(","),noun=showStatus?"vulnerabilities":`${status4} vulnerabilities`;if(page.findings.length===0){let filters=[project,environment,gitBranch,severity,query];return output_manager_default.print(filters.some(Boolean)?` No ${noun} match these filters.
|
|
209
206
|
`:` No ${noun} in ${ctx.contextName}.
|
|
210
207
|
`),0}let names=await targetNames(client,ctx.team.id,page.repositories,page.findings.map(v=>v.target)),tty=!!client.stdout.isTTY,headers=["Vulnerability","Severity",...showStatus?["Status"]:[],"Title","Environment","Branch"],rows=page.findings.map(v=>[toReference(names,v),v.severity,...showStatus?[v.status]:[],tty?truncateEnd(v.title,40):v.title,v.environment??"",v.branchRef??""].map(remoteText));return client.stdout.write(tty?`${formatTable(headers,headers.map(()=>"l"),[{rows}]).replace(/^/gm," ")}
|
|
211
208
|
`:`${[headers,...rows].map(row=>row.join(" ")).join(`
|
|
@@ -219,31 +216,31 @@ ${details.join(`
|
|
|
219
216
|
${sections.join(`
|
|
220
217
|
`)}
|
|
221
218
|
`),0}catch(error){return failRequest(client,ctx,error,`inspect vulnerability ${reference}`)}}async function dismiss(client,argv){let parsedArgs=parseCommand(client,argv,()=>parseArguments(argv,getFlagsSpecification(vulnerabilitiesDismissSubcommand.options)));if(typeof parsedArgs=="number")return parsedArgs;let{args,flags:opts}=parsedArgs,json=!!opts["--json"],[reference]=args,reason=opts["--reason"],message=opts["--message"]?.trim(),invalid=referenceError(args)||reason!==void 0&&!isDismissalReason(reason)&&`--reason must be one of: ${DISMISSAL_REASONS.join(", ")}.`||message!==void 0&&(message.length===0||message.length>500)&&"--message must be 1 to 500 characters.";if(invalid)return usageError(client,json,invalid);if(reason===void 0&&(json||!canPromptOnTerminal(client)))return fail2(client,json,{reason:AGENT_REASON.MISSING_ARGUMENTS,message:"Can't dismiss without a reason in non-interactive mode.",next:{command:withGlobalFlags(client,`security vulnerabilities dismiss ${reference} --reason <false-positive|accepted-risk>`),when:"Pass the reason with --reason"},actionRequired:!0});let telemetry2=new SecurityVulnerabilitiesDismissTelemetryClient({opts:{store:client.telemetryEventStore}});telemetry2.trackCliArgumentVulnerability(reference),telemetry2.trackCliOptionReason(reason),telemetry2.trackCliOptionMessage(message),telemetry2.trackCliFlagJson(opts["--json"]);let ctx=await getContext(client,json);if(typeof ctx=="number")return ctx;try{let found=await findVulnerability(client,ctx,reference);if(typeof found=="number")return found;let{vulnerability:v,names}=found;if(v.status==="dismissed")return reason!==void 0&&reason!==v.dismissalReason||message!==void 0&&message!==v.dismissalDescription?fail2(client,json,{reason:AGENT_REASON.CONFLICT,message:`Can't dismiss vulnerability ${toReference(names,v)}. It's already dismissed as ${v.dismissalReason}.`,next:{command:withGlobalFlags(client,`security vulnerabilities reopen ${reference}`),when:"Reopen it, then dismiss it with the new reason or message"}}):setStatus(client,ctx,found,"dismissed",{status:"dismissed"});let dismissalReason=reason&&isDismissalReason(reason)?reason:await client.input.select({message:"Why is it dismissed?",choices:[{name:"False positive",value:"false-positive"},{name:"Accepted risk",value:"accepted-risk"}]}),dismissalDescription=message??null;return reason===void 0&&message===void 0&&(dismissalDescription=(await client.input.text({message:"Message? (optional, press Enter to skip)",validate:value=>value.trim().length<=500||"Use at most 500 characters."})).trim()||null),await setStatus(client,ctx,found,"dismissed",{status:"dismissed",dismissalReason,dismissalDescription})}catch(error){return failRequest(client,ctx,error,`dismiss vulnerability ${reference}`,STATUS_CHANGE_ROLES)}}async function reopen(client,argv){let parsedArgs=parseCommand(client,argv,()=>parseArguments(argv,getFlagsSpecification(vulnerabilitiesReopenSubcommand.options)));if(typeof parsedArgs=="number")return parsedArgs;let{args,flags:opts}=parsedArgs,json=!!opts["--json"],[reference]=args,invalid=referenceError(args);if(invalid)return usageError(client,json,invalid);let telemetry2=new SecurityVulnerabilitiesReopenTelemetryClient({opts:{store:client.telemetryEventStore}});telemetry2.trackCliArgumentVulnerability(reference),telemetry2.trackCliFlagJson(opts["--json"]);let ctx=await getContext(client,json);if(typeof ctx=="number")return ctx;try{let found=await findVulnerability(client,ctx,reference);return typeof found=="number"?found:await setStatus(client,ctx,found,"reopened",{status:"open"})}catch(error){return failRequest(client,ctx,error,`reopen vulnerability ${reference}`,STATUS_CHANGE_ROLES)}}async function setStatus(client,ctx,{vulnerability,names},verb,body){let outcome=vulnerability.status===body.status?"unchanged":verb,finding=outcome==="unchanged"?vulnerability:await postStatus(client,ctx,vulnerability.findingId,body),reference=toReference(names,vulnerability);return ctx.json?printJson(client,{vulnerability:finding,outcome}):(output_manager_default.print(outcome==="unchanged"?` ${reference} is already ${body.status}.
|
|
222
|
-
`:`${
|
|
219
|
+
`:`${import_chalk19.default.green("\u2713")} ${verb==="dismissed"?"Dismissed":"Reopened"} ${reference}
|
|
223
220
|
`),(!client.stdout.isTTY||client.nonInteractive)&&client.stdout.write(`${reference}
|
|
224
221
|
`),0)}async function postStatus(client,ctx,findingId,body){let url=new URL(`${getFindingsUrl()}/${encodeURIComponent(findingId)}/status`);url.searchParams.set("teamId",ctx.team.id),ctx.json||output_manager_default.spinner("Updating vulnerability\u2026");let{finding}=await client.fetch(url.href,{method:"POST",body});return output_manager_default.stopSpinner(),finding}async function findVulnerability(client,ctx,reference){let[,owner,name,number]=REFERENCE_PATTERN.exec(reference)??[],query={findingId:reference.toUpperCase()};if(number&&owner)query={number};else if(number){let project=await getProjectByNameOrId(client,name,ctx.team.id);if(project instanceof ProjectNotFound)return notFound(client,ctx,reference);query={projectId:project.id,number}}ctx.json||output_manager_default.spinner("Fetching vulnerability\u2026");let cursor;do{let page=await fetchVulnerabilities(client,{teamId:ctx.team.id,...query,limit:"100",cursor}),repositoryId=page.repositories.find(r=>r.name.toLowerCase()===`${owner}/${name}`.toLowerCase())?.id,vulnerability=owner?page.findings.find(v=>v.target.id===repositoryId):page.findings[0];if(vulnerability){output_manager_default.stopSpinner();let names=await targetNames(client,ctx.team.id,page.repositories,[vulnerability.target,...vulnerability.relatedFindings.map(r=>r.target)]);return{vulnerability,names}}cursor=owner?page.nextCursor??void 0:void 0}while(cursor);return notFound(client,ctx,reference)}async function targetNames(client,teamId,repositories,targets){let names=new Map(repositories.map(({id,name})=>[id,name])),projectIds=new Set(targets.filter(t=>t.kind==="project").map(t=>t.id));return await Promise.all([...projectIds].map(async id=>{let project=await getProjectByNameOrId(client,id,teamId).catch(()=>{});names.set(id,project&&!(project instanceof ProjectNotFound)?project.name:id)})),names}function toReference(names,{target,number}){return`${names.get(target.id)??target.id}/${number}`}function remoteLines(text){return text.split(/\r?\n/).map(remoteText).join(`
|
|
225
222
|
`)}function formatChange(change){if(!change)return null;let pr=change.pullRequestNumber?` (#${change.pullRequestNumber})`:"";return`${change.repository}@${change.commitSha.slice(0,7)}${pr}`}function referenceError(args){let[reference]=args;return(args.length!==1||!REFERENCE_PATTERN.test(reference)&&!ID_PATTERN.test(reference))&&"Pass one vulnerability: <project>/<number>, <owner>/<repo>/<number> for a repository, or its 26-character ID."}function isCommaListOf(value,allowed){return value.split(",").every(item=>allowed.includes(item))}function isDismissalReason(value){return DISMISSAL_REASONS.includes(value)}function getFindingsUrl(){return process.env.VERCEL_SECURITY_FINDINGS_API_URL||"https://vercel.com/api/omniagent/v1/security-findings"}function fetchVulnerabilities(client,query){let url=new URL(getFindingsUrl());for(let[key,value]of Object.entries(query))value&&url.searchParams.set(key,value);return client.fetch(url.href)}async function getContext(client,json){let{team,contextName}=await getScope(client);return team?{team,contextName,json}:fail2(client,json,{reason:AGENT_REASON.MISSING_SCOPE,message:"Security Review vulnerabilities belong to a team.",next:{command:withGlobalFlags(client,"teams switch"),when:"Select a team"}})}function printJson(client,document){return client.stdout.write(`${JSON.stringify(document,null,client.stdout.isTTY?2:void 0)}
|
|
226
223
|
`),0}function suggest(client,command){return cmd(withGlobalFlags(client,command))}function notFound(client,ctx,reference){return fail2(client,ctx.json,{reason:AGENT_REASON.NOT_FOUND,message:`Couldn't find vulnerability ${reference} in ${ctx.contextName}.`,next:{command:withGlobalFlags(client,"security vulnerabilities list --status all"),when:"List vulnerabilities in every status"}})}function failRequest(client,ctx,error,action,requiredRoles){output_manager_default.debug(error);let status4=isAPIError(error)?error.status:void 0;return status4===404?fail2(client,ctx.json,{reason:AGENT_REASON.NOT_FOUND,message:`Couldn't ${action}. Security Review isn't enabled for ${ctx.contextName}.`}):status4===401||status4===403?fail2(client,ctx.json,{reason:AGENT_REASON.PERMISSION_DENIED,message:[`You can't ${action} in ${ctx.contextName}.`,requiredRoles].filter(Boolean).join(" ")}):status4===409?fail2(client,ctx.json,{reason:AGENT_REASON.CONFLICT,message:`Can't ${action}. Closed vulnerabilities can't be dismissed or reopened.`}):status4===429?fail2(client,ctx.json,{reason:AGENT_REASON.RATE_LIMITED,message:"Too many requests to the Vercel API. Try again later."}):fail2(client,ctx.json,{reason:AGENT_REASON.API_ERROR,message:`Failed to ${action}.`})}function parseCommand(client,argv,parse){try{return parse()}catch(error){return usageError(client,argv.includes("--json"),error instanceof Error?error.message:String(error))}}function usageError(client,json,message){return fail2(client,json,{reason:AGENT_REASON.INVALID_ARGUMENTS,message})}function fail2(client,json,{reason,message,next,actionRequired}){output_manager_default.stopSpinner();let exitCode=getExitCodeForReason(reason);return json||client.nonInteractive?writeJsonError(client,{status:actionRequired?AGENT_STATUS.ACTION_REQUIRED:AGENT_STATUS.ERROR,reason,message,...next?{next:[next]}:{}},exitCode):(output_manager_default.fatal(message),next&&output_manager_default.print(`
|
|
227
224
|
${next.when}:
|
|
228
225
|
${cmd(next.command)}
|
|
229
|
-
`),exitCode)}var COMMAND_CONFIG13={check:["check"],vulnerabilities:getCommandAliases(vulnerabilitiesSubcommand)};async function security(client){let parsedArgs,flagsSpecification=getFlagsSpecification(securityCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(error){return printError(error),2}let telemetry2=new SecurityTelemetryClient({opts:{store:client.telemetryEventStore}}),{subcommand,args,subcommandOriginal}=getSubcommand(parsedArgs.args.slice(1),COMMAND_CONFIG13);return subcommand==="vulnerabilities"?(telemetry2.trackCliSubcommandVulnerabilities(subcommandOriginal),vulnerabilities(client,args)):parsedArgs.flags["--help"]?(telemetry2.trackCliFlagHelp("security",subcommandOriginal),output_manager_default.print(help(checkSubcommand,{stream:client.stderr,parent:securityCommand,columns:client.stderr.columns})),0):(telemetry2.trackCliSubcommandCheck(subcommandOriginal),check2(client,args))}var
|
|
230
|
-
${
|
|
226
|
+
`),exitCode)}var COMMAND_CONFIG13={check:["check"],vulnerabilities:getCommandAliases(vulnerabilitiesSubcommand)};async function security(client){let parsedArgs,flagsSpecification=getFlagsSpecification(securityCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(error){return printError(error),2}let telemetry2=new SecurityTelemetryClient({opts:{store:client.telemetryEventStore}}),{subcommand,args,subcommandOriginal}=getSubcommand(parsedArgs.args.slice(1),COMMAND_CONFIG13);return subcommand==="vulnerabilities"?(telemetry2.trackCliSubcommandVulnerabilities(subcommandOriginal),vulnerabilities(client,args)):parsedArgs.flags["--help"]?(telemetry2.trackCliFlagHelp("security",subcommandOriginal),output_manager_default.print(help(checkSubcommand,{stream:client.stderr,parent:securityCommand,columns:client.stderr.columns})),0):(telemetry2.trackCliSubcommandCheck(subcommandOriginal),check2(client,args))}var import_chalk20=__toESM(require_source(),1);var SignupTelemetryClient=class extends TelemetryClient{trackCliOptionEmail(email2){email2&&this.trackCliOption({option:"email",value:this.redactedValue})}trackState(...args){this.trackLoginState(...args)}};function isValidEmail(value){return email.test(value.trim())}async function signup(client){let telemetry2=new SignupTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(2),getFlagsSpecification(signupCommand.options))}catch(error){return printError(error,client),2}if(parsedArgs.flags["--help"])return telemetry2.trackCliFlagHelp("signup"),output_manager_default.print(help(signupCommand,{stream:client.stderr,columns:client.stderr.columns})),0;if(parsedArgs.flags["--token"])return output_manager_default.error('`--token` may not be used with the "signup" command'),2;if(parsedArgs.args.slice(1).length)return output_manager_default.error(`Too many arguments. Usage: ${getCommandName("signup --email user@example.com")}`),2;let emailOption=parsedArgs.flags["--email"];telemetry2.trackCliOptionEmail(emailOption);let email2=emailOption?.trim();if(email2&&!isValidEmail(email2))return shouldEmitNonInteractiveCommandError(client)&&writeAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message:"The value provided for --email is not a valid email address."}),output_manager_default.error(`Couldn't use ${import_chalk20.default.bold(email2)}: not a valid email address.`),2;let canPrompt=client.stdin.isTTY===!0&&!client.nonInteractive&&!client.isAgent;if(!email2){if(!canPrompt)return shouldEmitNonInteractiveCommandError(client)&&writeAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.MISSING_ARGUMENTS,message:"Provide an email address with --email."}),output_manager_default.error(`Provide an email address with ${import_chalk20.default.bold("--email")}. Example: ${getCommandName("signup --email user@example.com")}`),2;email2=await client.input.text({message:"Email?",validate:value=>isValidEmail(value)?!0:"Enter a valid email address."}),email2=email2.trim()}telemetry2.trackState("started");try{let tokens=await performDeviceCodeFlow(client,{signupEmail:email2});if(!tokens)return telemetry2.trackState("error"),1;await saveDeviceCodeTokens(client,tokens)}catch(error){return telemetry2.trackState("error"),printError(error),1}return output_manager_default.print(`
|
|
227
|
+
${import_chalk20.default.cyan("Welcome to Vercel!")} Your account is ready and you are signed in.
|
|
231
228
|
|
|
232
229
|
Run ${getCommandName("deploy")} to deploy, or ${getCommandName("setup")} to set up the Vercel plugin and connect your coding agents to AI Gateway.
|
|
233
230
|
|
|
234
231
|
${emoji("tip")} To deploy every commit automatically,
|
|
235
|
-
connect a Git Repository (${
|
|
236
|
-
`),telemetry2.trackState("success"),0}var import_ms9=__toESM(require_ms(),1),
|
|
237
|
-
`)}else{output_manager_default.log(`${result.length} Environment${result.length===1?"":"s"} found under ${projectSlugLink} ${
|
|
232
|
+
connect a Git Repository (${import_chalk20.default.bold(output_manager_default.link("vercel.link/git","https://vercel.link/git",{color:!1}))}).
|
|
233
|
+
`),telemetry2.trackState("success"),0}var import_ms9=__toESM(require_ms(),1),import_chalk21=__toESM(require_source(),1);function formatBranchMatcher(branchMatcher){return branchMatcher?.type==="equals"?branchMatcher.pattern:branchMatcher?.type==="startsWith"?`${branchMatcher.pattern}${import_chalk21.default.dim("*")}`:branchMatcher?.type==="endsWith"?`${import_chalk21.default.dim("*")}${branchMatcher.pattern}`:import_chalk21.default.dim("No branch configuration")}var TYPE_MAP={production:"Production",preview:"Preview",development:"Development"},BRANCH_TRACKING_MAP={production:project=>project.link?.productionBranch??"main",preview:(_,env)=>env.slug==="preview"?import_chalk21.default.dim("All unassigned git branches"):formatBranchMatcher(env.branchMatcher),development:()=>import_chalk21.default.dim("Accessible via CLI")};async function list3(client,argv){let{cwd}=client,telemetry2=new TelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(listSubcommand5.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let validationResult=validateLsArgs({commandName:"environments list",args:parsedArgs.args,maxArgs:0,exitCode:2});if(validationResult!==0)return validationResult;let formatResult=validateJsonOutput(parsedArgs.flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput;telemetry2.trackCliOptionFormat(parsedArgs.flags["--format"]);let projectName=parsedArgs.flags["--project"];telemetry2.trackCliOptionProject(projectName);let autoConfirm=!!parsedArgs.flags["--yes"],link=await ensureLink(targetCommand.name,client,cwd,{autoConfirm,projectName,failIfNotFound:!!projectName});if(typeof link=="number")return link;let start=Date.now(),projectSlugLink=formatProject(link.org.slug,link.project.name);output_manager_default.spinner(`Fetching custom environments for ${projectSlugLink}`);let url=`/projects/${encodeURIComponent(link.project.id)}/custom-environments`,{environments:result}=await client.fetch(url,{method:"GET",accountId:link.org.id});output_manager_default.stopSpinner();let elapsed2=(0,import_ms9.default)(Date.now()-start);if(result=withDefaultEnvironmentsIncluded(result),asJson){let jsonOutput={targets:result.map(target=>({id:target.id,slug:target.slug,type:target.type,description:target.description,branchMatcher:target.branchMatcher,createdAt:target.createdAt,updatedAt:target.updatedAt}))};client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
|
|
234
|
+
`)}else{output_manager_default.log(`${result.length} Environment${result.length===1?"":"s"} found under ${projectSlugLink} ${import_chalk21.default.gray(`[${elapsed2}]`)}`);let tablePrint=table([["Target Name","Branch Tracking","Type","Updated"].map(header=>import_chalk21.default.bold(import_chalk21.default.cyan(header))),...result.flatMap(target=>[[formatEnvironment(link.org.slug,link.project.name,target),BRANCH_TRACKING_MAP[target.type](link.project,target),TYPE_MAP[target.type],import_chalk21.default.gray(target.updatedAt>0?(0,import_ms9.default)(Date.now()-target.updatedAt):"-")]])],{hsep:3}).replace(/^/gm," ");output_manager_default.print(`
|
|
238
235
|
${tablePrint}
|
|
239
236
|
|
|
240
|
-
`)}return 0}function withDefaultEnvironmentsIncluded(environments){return[{id:"production",slug:"production",createdAt:0,updatedAt:0,type:"production",description:"",domains:[]},{id:"preview",slug:"preview",createdAt:0,updatedAt:0,type:"preview",description:"",domains:[]},{id:"development",slug:"development",createdAt:0,updatedAt:0,type:"development",description:"",domains:[]},...environments.slice().sort((a,b)=>a.slug.localeCompare(b.slug))]}var TargetTelemetryClient=class extends TelemetryClient{trackCliSubcommandList(subcommandActual){this.trackCliSubcommand({subcommand:"list",value:subcommandActual})}};var COMMAND_CONFIG14={ls:getCommandAliases(listSubcommand5)};async function main5(client){let parsedArgs,flagsSpecification=getFlagsSpecification(targetCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(error){return printError(error),2}let{telemetryEventStore}=client,telemetry2=new TargetTelemetryClient({opts:{store:telemetryEventStore}}),commandName=parsedArgs.args[0];(commandName==="target"||commandName==="targets")&&warnDeprecatedSubcommand(client,commandName,targetCommand.name),parsedArgs.args=parsedArgs.args.slice(1);let subcommand=parsedArgs.args[0],args=parsedArgs.args.slice(1),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("environments"),output_manager_default.print(help(targetCommand,{stream:client.stderr,columns:client.stderr.columns})),0;function printHelp(command){output_manager_default.print(help(command,{stream:client.stderr,parent:targetCommand,columns:client.stderr.columns}))}if(subcommand===void 0||subcommand.startsWith("-"))return needHelp?(telemetry2.trackCliFlagHelp("environments","list"),printHelp(listSubcommand5),0):(telemetry2.trackCliSubcommandList("default"),await list3(client,parsedArgs.args));switch(subcommand){case"ls":case"list":return needHelp?(telemetry2.trackCliFlagHelp("environments","list"),printHelp(listSubcommand5),0):(telemetry2.trackCliSubcommandList(subcommand),await list3(client,args));default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG14)),output_manager_default.print(help(targetCommand,{stream:client.stderr,columns:client.stderr.columns})),2}}var
|
|
241
|
-
`),0;let status4=enabled?
|
|
242
|
-
`),output_manager_default.log(`${
|
|
237
|
+
`)}return 0}function withDefaultEnvironmentsIncluded(environments){return[{id:"production",slug:"production",createdAt:0,updatedAt:0,type:"production",description:"",domains:[]},{id:"preview",slug:"preview",createdAt:0,updatedAt:0,type:"preview",description:"",domains:[]},{id:"development",slug:"development",createdAt:0,updatedAt:0,type:"development",description:"",domains:[]},...environments.slice().sort((a,b)=>a.slug.localeCompare(b.slug))]}var TargetTelemetryClient=class extends TelemetryClient{trackCliSubcommandList(subcommandActual){this.trackCliSubcommand({subcommand:"list",value:subcommandActual})}};var COMMAND_CONFIG14={ls:getCommandAliases(listSubcommand5)};async function main5(client){let parsedArgs,flagsSpecification=getFlagsSpecification(targetCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(error){return printError(error),2}let{telemetryEventStore}=client,telemetry2=new TargetTelemetryClient({opts:{store:telemetryEventStore}}),commandName=parsedArgs.args[0];(commandName==="target"||commandName==="targets")&&warnDeprecatedSubcommand(client,commandName,targetCommand.name),parsedArgs.args=parsedArgs.args.slice(1);let subcommand=parsedArgs.args[0],args=parsedArgs.args.slice(1),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("environments"),output_manager_default.print(help(targetCommand,{stream:client.stderr,columns:client.stderr.columns})),0;function printHelp(command){output_manager_default.print(help(command,{stream:client.stderr,parent:targetCommand,columns:client.stderr.columns}))}if(subcommand===void 0||subcommand.startsWith("-"))return needHelp?(telemetry2.trackCliFlagHelp("environments","list"),printHelp(listSubcommand5),0):(telemetry2.trackCliSubcommandList("default"),await list3(client,parsedArgs.args));switch(subcommand){case"ls":case"list":return needHelp?(telemetry2.trackCliFlagHelp("environments","list"),printHelp(listSubcommand5),0):(telemetry2.trackCliSubcommandList(subcommand),await list3(client,args));default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG14)),output_manager_default.print(help(targetCommand,{stream:client.stderr,columns:client.stderr.columns})),2}}var import_chalk22=__toESM(require_source(),1);async function status2(client,asJson=!1){let enabled=client.config.telemetry?.enabled!==!1;if(asJson)return client.stdout.write(`${JSON.stringify({telemetry:{enabled}},null,2)}
|
|
238
|
+
`),0;let status4=enabled?import_chalk22.default.green("Enabled"):import_chalk22.default.red("Disabled");output_manager_default.print(`
|
|
239
|
+
`),output_manager_default.log(`${import_chalk22.default.bold("Telemetry status")}: ${status4}
|
|
243
240
|
`);let learnMoreMessage=`
|
|
244
241
|
|
|
245
|
-
Learn more: ${
|
|
246
|
-
`,{flag:"wx",mode:384}),await rename(temporaryPath,filePath)}finally{await rm2(temporaryPath,{force:!0}).catch(()=>{})}}function getFreshContext(cache,installationKey,currentTime,maxAgeMs,failureMaxAgeMs){let cached=cache.installations[installationKey];if(!cached||!isVersionContext(cached.context))return;let contextMaxAgeMs=cached.context.status==="resolved"?maxAgeMs:failureMaxAgeMs;if(Number.isFinite(cached.collectedAt)&¤tTime-cached.collectedAt<=contextMaxAgeMs)return{...cached.context,source:"cache"}}function boundedInstallations(installations){return Object.fromEntries(Object.entries(installations).sort(([,left],[,right])=>right.collectedAt-left.collectedAt).slice(0,VERSION_CONTEXT_CACHE_MAX_INSTALLATIONS))}function getVersionContextCacheFilePath(globalConfigDirectory=getGlobalPathConfig()){return join3(globalConfigDirectory,"telemetry-version-context.json")}async function getVersionContextInstallationKey(){let runtime=isNativeBinaryInstall()?"native":"node",entrypoint=runtime==="native"?process.execPath:process.argv[1],canonicalEntrypoint=await realpath2(entrypoint).catch(()=>resolve3(entrypoint));return createHash("sha256").update(`${runtime}\0${canonicalEntrypoint}`).digest("hex")}async function collectCachedVersionContextForTelemetry({cacheFilePath=getVersionContextCacheFilePath(),failureMaxAgeMs=VERSION_CONTEXT_FAILURE_CACHE_MAX_AGE_MS,installationKey,maxAgeMs=VERSION_CONTEXT_CACHE_MAX_AGE_MS,now=Date.now,timeoutMs=VERSION_CONTEXT_TIMEOUT_MS}={}){let key=installationKey??await getVersionContextInstallationKey(),currentTime=now(),initialCache=await readVersionContextCache(cacheFilePath),initialContext=getFreshContext(initialCache,key,currentTime,maxAgeMs,failureMaxAgeMs);if(initialContext)return initialContext;try{return await withDirectoryLock(`${cacheFilePath}.lock`,async()=>{let cache=await readVersionContextCache(cacheFilePath),contextAfterLock=getFreshContext(cache,key,currentTime,maxAgeMs,failureMaxAgeMs);if(contextAfterLock)return contextAfterLock;let context=await collectVersionContextForTelemetry(timeoutMs);try{cache.installations[key]={collectedAt:currentTime,context:{...context,source:"detected"}},cache.installations=boundedInstallations(cache.installations),await writeVersionContextCache(cacheFilePath,cache)}catch{}return context},{waitMs:VERSION_CONTEXT_CACHE_LOCK_WAIT_MS,retryMs:25,abandonedAfterMs:3e4,busyMessage:()=>"Version context cache is busy"})}catch{let cache=await readVersionContextCache(cacheFilePath);return getFreshContext(cache,key,currentTime,maxAgeMs,failureMaxAgeMs)??{status:"cancelled",source:"detected"}}}var TELEMETRY_FLUSH_TIMEOUT_MS=1e4;function parseHandoff(serialized){try{let value=JSON.parse(typeof serialized=="string"?serialized:decodeHandoff(serialized));if(value&&typeof value=="object"&&value.headers&&typeof value.headers=="object"&&Array.isArray(value.body))return value}catch{}}async function flush(client,args,{timeoutMs=TELEMETRY_FLUSH_TIMEOUT_MS}={}){let url=process.env.VERCEL_TELEMETRY_BRIDGE_URL||"https://telemetry.vercel.com/api/vercel-cli/v1/events",serialized=args[0];if(!serialized){let chunks=[];for await(let chunk of process.stdin)chunks.push(new Uint8Array(Buffer.from(chunk)));serialized=Buffer.concat(chunks)}let handoff=parseHandoff(serialized);if(!handoff)return process.stderr.write("Failed to send telemetry events. Invalid handoff"),1;let{headers,body,invocationId,commandTrace}=handoff,versionContext=await collectCachedVersionContextForTelemetry().catch(()=>({status:"error",source:"detected"})),firstEvent=body[0],contextEvents=[...getVersionContextTelemetryEvents(versionContext),...getConfigTelemetryEvents(client.config)];for(let event of contextEvents)body.push({id:randomUUID2(),event_time:Date.now(),team_id:firstEvent?.team_id,user_id:firstEvent?.user_id,project_id:firstEvent?.project_id,...event});let events=body.map(event=>invocationId&&event.invocation_id==null?{...event,invocation_id:invocationId}:event),payload=commandTrace?{version:1,events,commandTrace}:events,controller=new AbortController,timeout=setTimeout(()=>controller.abort(),timeoutMs),response;try{response=await fetch(url,{method:"POST",headers,body:JSON.stringify(payload),signal:controller.signal});let status4=response.status,wasRecorded=(response.headers.get("x-vercel-cli-tracked")||"")==="1";return status4===204?wasRecorded?process.stderr.write("Telemetry event tracked"):process.stderr.write("Telemetry event ignored"):process.stderr.write(`Failed to send telemetry events. Unexpected response from telemetry server: ${status4}`),0}catch(error){return error instanceof Error&&process.stderr.write(`Failed to send telemetry events. ${error.message}`),1}finally{response?.body?.cancel().catch(()=>{}),clearTimeout(timeout)}}var TelemetryTelemetryClient=class extends TelemetryClient{trackCliSubcommandStatus(actual){this.trackCliSubcommand({subcommand:"status",value:actual})}trackCliSubcommandEnable(actual){this.trackCliSubcommand({subcommand:"enable",value:actual})}trackCliSubcommandDisable(_){}trackCliSubcommandFlush(_){}};var
|
|
242
|
+
Learn more: ${import_chalk22.default.cyan("https://vercel.com/docs/cli/about-telemetry")}`;return enabled?output_manager_default.log(`You have opted in to Vercel CLI telemetry${learnMoreMessage}`):(output_manager_default.log("You have opted out of Vercel CLI telemetry"),output_manager_default.log(`No data will be collected from your machine${learnMoreMessage}`)),0}async function enable2(client){return client.config={...client.config,telemetry:{...client.config.telemetry,enabled:!0}},client.writeToConfigFile(),await status2(client),0}async function disable2(client){return client.config={...client.config,telemetry:{...client.config.telemetry,enabled:!1}},client.writeToConfigFile(),await status2(client),0}import{randomUUID as randomUUID2}from"node:crypto";function configPreference(value){return value===void 0?"unset":value?"enabled":"disabled"}function getConfigTelemetryEvents(config){return[{key:"config_auto_update",value:configPreference(config.updates?.auto)},{key:"config_bypass_min_release_age",value:configPreference(config.updates?.bypassMinReleaseAge)},{key:"config_credential_storage",value:config.credStorage??"unset"}]}import{createHash,randomUUID}from"node:crypto";import{mkdir,readFile as readFile3,realpath as realpath2,rename,rm as rm2,writeFile as writeFile3}from"node:fs/promises";import{dirname,join as join3,resolve as resolve3}from"node:path";var VERSION_CONTEXT_TIMEOUT_MS=1e4;function getVersionContextTelemetryEvents(context){let events=[{key:"version_context_status",value:context.status},{key:"version_context_source",value:context.source}];return context.status!=="resolved"||(events.push({key:"version_context_runtime",value:context.runtime},{key:"version_context_manager",value:context.manager}),context.manager==="installer"?events.push({key:"version_context_track",value:context.track},{key:"version_context_slot",value:context.slot}):events.push({key:"version_context_package_manager",value:context.packageManager},{key:"version_context_package_manager_assumed",value:String(context.packageManagerAssumed)},{key:"version_context_global",value:String(context.global)})),events}async function collectVersionContextForTelemetry(timeoutMs=VERSION_CONTEXT_TIMEOUT_MS){let controller=new AbortController,timeout=setTimeout(()=>{controller.abort(new Error("Version context collection timed out"))},timeoutMs);timeout.unref();try{let context=await getVersionContext({signal:controller.signal});return context.manager==="installer"?{status:"resolved",source:"detected",runtime:context.runtime,manager:context.manager,track:context.track??"legacy",slot:context.slot??"legacy"}:{status:"resolved",source:"detected",runtime:context.runtime,manager:context.manager,packageManager:context.packageManager??"unknown",packageManagerAssumed:context.packageManagerAssumed,global:context.global??"unknown"}}catch{return{status:controller.signal.aborted?"cancelled":"error",source:"detected"}}finally{clearTimeout(timeout)}}var VERSION_CONTEXT_CACHE_MAX_AGE_MS=7*24*60*60*1e3,VERSION_CONTEXT_FAILURE_CACHE_MAX_AGE_MS=60*60*1e3,VERSION_CONTEXT_CACHE_SCHEMA_VERSION=1,VERSION_CONTEXT_CACHE_MAX_INSTALLATIONS=20,VERSION_CONTEXT_CACHE_LOCK_WAIT_MS=250;function isResolvedVersionContext(value){if(!value||typeof value!="object")return!1;let context=value;return context.status!=="resolved"||context.source!=="detected"&&context.source!=="cache"||context.runtime!=="native"&&context.runtime!=="node"?!1:context.manager==="installer"?(context.track==="production"||context.track==="pr"||context.track==="legacy")&&(context.slot==="a"||context.slot==="b"||context.slot==="legacy"):context.manager==="package-manager"&&typeof context.packageManagerAssumed=="boolean"&&typeof context.packageManager=="string"&&(typeof context.global=="boolean"||context.global==="unknown")}function isVersionContext(value){if(isResolvedVersionContext(value))return!0;if(!value||typeof value!="object")return!1;let context=value;return(context.status==="cancelled"||context.status==="error")&&(context.source==="detected"||context.source==="cache")}async function readVersionContextCache(filePath){try{let value=JSON.parse(await readFile3(filePath,"utf8"));if(value.schemaVersion===VERSION_CONTEXT_CACHE_SCHEMA_VERSION&&value.installations&&typeof value.installations=="object")return{schemaVersion:VERSION_CONTEXT_CACHE_SCHEMA_VERSION,installations:value.installations}}catch{}return{schemaVersion:VERSION_CONTEXT_CACHE_SCHEMA_VERSION,installations:{}}}async function writeVersionContextCache(filePath,cache){let temporaryPath=`${filePath}.${process.pid}.${randomUUID()}.tmp`;try{await mkdir(dirname(filePath),{recursive:!0}),await writeFile3(temporaryPath,`${JSON.stringify(cache,null,2)}
|
|
243
|
+
`,{flag:"wx",mode:384}),await rename(temporaryPath,filePath)}finally{await rm2(temporaryPath,{force:!0}).catch(()=>{})}}function getFreshContext(cache,installationKey,currentTime,maxAgeMs,failureMaxAgeMs){let cached=cache.installations[installationKey];if(!cached||!isVersionContext(cached.context))return;let contextMaxAgeMs=cached.context.status==="resolved"?maxAgeMs:failureMaxAgeMs;if(Number.isFinite(cached.collectedAt)&¤tTime-cached.collectedAt<=contextMaxAgeMs)return{...cached.context,source:"cache"}}function boundedInstallations(installations){return Object.fromEntries(Object.entries(installations).sort(([,left],[,right])=>right.collectedAt-left.collectedAt).slice(0,VERSION_CONTEXT_CACHE_MAX_INSTALLATIONS))}function getVersionContextCacheFilePath(globalConfigDirectory=getGlobalPathConfig()){return join3(globalConfigDirectory,"telemetry-version-context.json")}async function getVersionContextInstallationKey(){let runtime=isNativeBinaryInstall()?"native":"node",entrypoint=runtime==="native"?process.execPath:process.argv[1],canonicalEntrypoint=await realpath2(entrypoint).catch(()=>resolve3(entrypoint));return createHash("sha256").update(`${runtime}\0${canonicalEntrypoint}`).digest("hex")}async function collectCachedVersionContextForTelemetry({cacheFilePath=getVersionContextCacheFilePath(),failureMaxAgeMs=VERSION_CONTEXT_FAILURE_CACHE_MAX_AGE_MS,installationKey,maxAgeMs=VERSION_CONTEXT_CACHE_MAX_AGE_MS,now=Date.now,timeoutMs=VERSION_CONTEXT_TIMEOUT_MS}={}){let key=installationKey??await getVersionContextInstallationKey(),currentTime=now(),initialCache=await readVersionContextCache(cacheFilePath),initialContext=getFreshContext(initialCache,key,currentTime,maxAgeMs,failureMaxAgeMs);if(initialContext)return initialContext;try{return await withDirectoryLock(`${cacheFilePath}.lock`,async()=>{let cache=await readVersionContextCache(cacheFilePath),contextAfterLock=getFreshContext(cache,key,currentTime,maxAgeMs,failureMaxAgeMs);if(contextAfterLock)return contextAfterLock;let context=await collectVersionContextForTelemetry(timeoutMs);try{cache.installations[key]={collectedAt:currentTime,context:{...context,source:"detected"}},cache.installations=boundedInstallations(cache.installations),await writeVersionContextCache(cacheFilePath,cache)}catch{}return context},{waitMs:VERSION_CONTEXT_CACHE_LOCK_WAIT_MS,retryMs:25,abandonedAfterMs:3e4,busyMessage:()=>"Version context cache is busy"})}catch{let cache=await readVersionContextCache(cacheFilePath);return getFreshContext(cache,key,currentTime,maxAgeMs,failureMaxAgeMs)??{status:"cancelled",source:"detected"}}}var TELEMETRY_FLUSH_TIMEOUT_MS=1e4;function parseHandoff(serialized){try{let value=JSON.parse(typeof serialized=="string"?serialized:decodeHandoff(serialized));if(value&&typeof value=="object"&&value.headers&&typeof value.headers=="object"&&Array.isArray(value.body))return value}catch{}}async function flush(client,args,{timeoutMs=TELEMETRY_FLUSH_TIMEOUT_MS}={}){let url=process.env.VERCEL_TELEMETRY_BRIDGE_URL||"https://telemetry.vercel.com/api/vercel-cli/v1/events",serialized=args[0];if(!serialized){let chunks=[];for await(let chunk of process.stdin)chunks.push(new Uint8Array(Buffer.from(chunk)));serialized=Buffer.concat(chunks)}let handoff=parseHandoff(serialized);if(!handoff)return process.stderr.write("Failed to send telemetry events. Invalid handoff"),1;let{headers,body,invocationId,commandTrace}=handoff,versionContext=await collectCachedVersionContextForTelemetry().catch(()=>({status:"error",source:"detected"})),firstEvent=body[0],contextEvents=[...getVersionContextTelemetryEvents(versionContext),...getConfigTelemetryEvents(client.config)];for(let event of contextEvents)body.push({id:randomUUID2(),event_time:Date.now(),team_id:firstEvent?.team_id,user_id:firstEvent?.user_id,project_id:firstEvent?.project_id,...event});let events=body.map(event=>invocationId&&event.invocation_id==null?{...event,invocation_id:invocationId}:event),payload=commandTrace?{version:1,events,commandTrace}:events,controller=new AbortController,timeout=setTimeout(()=>controller.abort(),timeoutMs),response;try{response=await fetch(url,{method:"POST",headers,body:JSON.stringify(payload),signal:controller.signal});let status4=response.status,wasRecorded=(response.headers.get("x-vercel-cli-tracked")||"")==="1";return status4===204?wasRecorded?process.stderr.write("Telemetry event tracked"):process.stderr.write("Telemetry event ignored"):process.stderr.write(`Failed to send telemetry events. Unexpected response from telemetry server: ${status4}`),0}catch(error){return error instanceof Error&&process.stderr.write(`Failed to send telemetry events. ${error.message}`),1}finally{response?.body?.cancel().catch(()=>{}),clearTimeout(timeout)}}var TelemetryTelemetryClient=class extends TelemetryClient{trackCliSubcommandStatus(actual){this.trackCliSubcommand({subcommand:"status",value:actual})}trackCliSubcommandEnable(actual){this.trackCliSubcommand({subcommand:"enable",value:actual})}trackCliSubcommandDisable(_){}trackCliSubcommandFlush(_){}};var import_chalk23=__toESM(require_source(),1);var COMMAND_CONFIG15={status:getCommandAliases(statusSubcommand4),enable:getCommandAliases(enableSubcommand2),disable:getCommandAliases(disableSubcommand2),flush:getCommandAliases(flushSubcommand)};async function telemetry(client){let telemetryClient=new TelemetryTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArguments;try{let argv=client.argv.slice(2),{subcommand:typed}=getSubcommand(parseArguments(argv,getFlagsSpecification(telemetryCommand.options),{permissive:!0}).args.slice(1),COMMAND_CONFIG15);parsedArguments=parseArguments(argv,getFlagsSpecification([...telemetryCommand.options,...typed==="status"?statusSubcommand4.options:[]]))}catch(err){return printError(err),2}let{subcommand,args,subcommandOriginal}=getSubcommand(parsedArguments.args.slice(1),COMMAND_CONFIG15),needHelp=parsedArguments.flags["--help"];function printHelp(command){output_manager_default.print(help(command,{stream:client.stderr,columns:client.stderr.columns,parent:telemetryCommand}))}if(!subcommand&&needHelp)return telemetryClient.trackCliFlagHelp("telemetry",subcommand),output_manager_default.print(help(telemetryCommand,{stream:client.stderr,columns:client.stderr.columns})),0;switch(subcommand){case"status":return needHelp?(telemetryClient.trackCliFlagHelp("telemetry",subcommandOriginal),printHelp(statusSubcommand4),0):(telemetryClient.trackCliSubcommandStatus(subcommandOriginal),status2(client,!!parsedArguments.flags["--json"]));case"flush":{let deadline=setTimeout(()=>process.exit(1),TELEMETRY_FLUSH_TIMEOUT_MS+1e3);deadline.unref();try{return await flush(client,args)}finally{clearTimeout(deadline)}}case"enable":return needHelp?(telemetryClient.trackCliFlagHelp("telemetry",subcommandOriginal),printHelp(enableSubcommand2),0):(telemetryClient.trackCliSubcommandEnable(subcommandOriginal),enable2(client));case"disable":return needHelp?(telemetryClient.trackCliFlagHelp("telemetry",subcommandOriginal),printHelp(disableSubcommand2),0):disable2(client);default:{let errorMessage2=parsedArguments.args.length!==2?"Invalid number of arguments":"Invalid subcommand";return output_manager_default.print(`${import_chalk23.default.red("Error")}: ${errorMessage2}. See help instructions for usage:
|
|
247
244
|
`),output_manager_default.print(help(telemetryCommand,{stream:client.stderr,columns:client.stderr.columns})),2}}}var UpgradeTelemetryClient=class extends TelemetryClient{trackCliArgumentVersion(value){value&&this.trackCliArgument({arg:"version",value})}trackCliFlagDryRun(dryRun){dryRun&&this.trackCliFlag("dry-run")}trackCliFlagJson(json){json&&this.trackCliFlag("json")}trackCliFlagAutoupdate(value){value&&this.trackCliFlag("autoupdate")}trackCliFlagNoAutoupdate(value){value&&this.trackCliFlag("no-autoupdate")}trackCliFlagEnableAuto(enableAuto){enableAuto&&this.trackCliFlag("enable-auto")}trackCliFlagDisableAuto(disableAuto){disableAuto&&this.trackCliFlag("disable-auto")}trackCliFlagBypassMinReleaseAge(bypass){bypass&&this.trackCliFlag("bypass-min-release-age")}trackCliFlagNoBypassMinReleaseAge(value){value&&this.trackCliFlag("no-bypass-min-release-age")}trackCliFlagDisableMinReleaseAgeBypass(disable3){disable3&&this.trackCliFlag("disable-min-release-age-bypass")}};var import_semver2=__toESM(require_semver(),1);async function installProductionRelease({version:requested,skipIfCurrent=!1,currentVersion=pkg_default.version,track}={}){let pinned=requested&&requested!=="latest"?requested:void 0,version2=pinned;try{if(output_manager_default.spinner("Checking for updates\u2026",0),pinned){let available=await listAvailableVersions(packageName).catch(()=>{});if(available&&!available.includes(pinned))return output_manager_default.stopSpinner(),output_manager_default.error(`Version ${pinned} does not exist.`),output_manager_default.log(`Run ${getCommandName("version list")} to see available versions.`),1}else version2=await resolveLatestNativeVersion();let target=version2,current=!((track??(await readActivePointer(getInstallRoot()).catch(()=>{}))?.track)==="pr")&&import_semver2.default.valid(currentVersion)?currentVersion:void 0;return skipIfCurrent&¤t&&import_semver2.default.gte(current,target)?(output_manager_default.stopSpinner(),output_manager_default.log(`No upgrade available. Vercel CLI is already up to date (v${current}).`),0):(await installAndActivateProductionVersion(target),output_manager_default.stopSpinner(),!current||import_semver2.default.gt(target,current)?output_manager_default.success(`Upgraded Vercel CLI to v${target}.`):(output_manager_default.success(`Vercel CLI v${target} is active.`),import_semver2.default.lt(target,current)&&output_manager_default.warn(`Older CLI versions can replace the installer-managed links when running version commands. If that happens, restore the bounded slot layout with:
|
|
248
245
|
${CURL_INSTALL_COMMAND}`)),0)}catch(error){output_manager_default.stopSpinner();let reason=error instanceof Error?error.message:String(error);return output_manager_default.fatal(version2?`Failed to install Vercel CLI v${version2}: ${reason}`:`Failed to resolve the latest Vercel CLI version: ${reason}`),output_manager_default.log(`To reinstall the CLI manually, run:
|
|
249
246
|
${CURL_INSTALL_COMMAND}`),1}}var import_semver3=__toESM(require_semver(),1);async function upgrade(client){try{return await runUpgrade(client)}catch(error){return printError(error),1}}async function runUpgrade(client){let parsedArgs=null,flagsSpecification=getFlagsSpecification(upgradeCommand.options),telemetry2=new UpgradeTelemetryClient({opts:{store:client.telemetryEventStore}});try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return printError(error),2}if(parsedArgs.flags["--help"])return telemetry2.trackCliFlagHelp("upgrade"),output_manager_default.print(help(upgradeCommand,{stream:client.stderr,columns:client.stderr.columns})),0;let targetArg=parsedArgs.args[1],target=targetArg==="latest"?targetArg:targetArg?import_semver3.default.valid(targetArg)??void 0:void 0;if(telemetry2.trackCliArgumentVersion(targetArg?targetArg==="latest"?"latest":target?"version":"invalid":void 0),parsedArgs.args.length>2)return output_manager_default.error(`Unexpected argument: "${parsedArgs.args[2]}".`),1;if(targetArg&&!target)return output_manager_default.error(`Invalid version: "${targetArg}". Use a major.minor.patch version or "latest".`),1;let dryRun=parsedArgs.flags["--dry-run"],formatResult=validateJsonOutput(parsedArgs.flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput;telemetry2.trackCliFlagDryRun(dryRun),telemetry2.trackCliFlagAutoupdate(parsedArgs.flags["--autoupdate"]),telemetry2.trackCliFlagNoAutoupdate(parsedArgs.flags["--no-autoupdate"]),telemetry2.trackCliFlagEnableAuto(parsedArgs.flags["--enable-auto"]),telemetry2.trackCliFlagDisableAuto(parsedArgs.flags["--disable-auto"]),telemetry2.trackCliFlagBypassMinReleaseAge(parsedArgs.flags["--bypass-min-release-age"]),telemetry2.trackCliFlagNoBypassMinReleaseAge(parsedArgs.flags["--no-bypass-min-release-age"]),telemetry2.trackCliFlagDisableMinReleaseAgeBypass(parsedArgs.flags["--disable-min-release-age-bypass"]),telemetry2.trackCliOptionFormat(parsedArgs.flags["--format"]),telemetry2.trackCliFlagJson(parsedArgs.flags["--json"]);let autoupdate2=readOnOffOption(client,parsedArgs.flags,{on:"--autoupdate",off:"--no-autoupdate",oldOn:"--enable-auto",oldOff:"--disable-auto"});if("error"in autoupdate2)return output_manager_default.error(autoupdate2.error),2;let enableAuto=autoupdate2.value===!0,disableAuto=autoupdate2.value===!1,releaseAgeBypass=readOnOffOption(client,parsedArgs.flags,{on:"--bypass-min-release-age",off:"--no-bypass-min-release-age",oldOff:"--disable-min-release-age-bypass"});if("error"in releaseAgeBypass)return output_manager_default.error(releaseAgeBypass.error),2;let bypassMinReleaseAge=releaseAgeBypass.value===!0,disableMinReleaseAgeBypass=releaseAgeBypass.value===!1,hasSettingsOnlyFlag=!!(disableMinReleaseAgeBypass||enableAuto||disableAuto);if(target&&hasSettingsOnlyFlag)return output_manager_default.error("Can't use a version with settings-only upgrade options."),2;let installerManaged=await isCurlInstall(),homebrewManaged=!installerManaged&&await isHomebrewInstall();if(homebrewManaged&&target&&target!=="latest")return output_manager_default.error(`Can't install a specific version of a Vercel CLI installed with Homebrew. Run \`${HOMEBREW_UPGRADE_COMMAND}\` to update to the latest version, or switch versions with the installer: ${CURL_INSTALL_COMMAND}`),1;if(homebrewManaged&&bypassMinReleaseAge&&!hasSettingsOnlyFlag)return output_manager_default.error("Can't use `--bypass-min-release-age` with a CLI installed with Homebrew. Homebrew has no minimum release-age setting.\nRun `vc upgrade` without the option."),1;if(installerManaged&&bypassMinReleaseAge&&!hasSettingsOnlyFlag)return output_manager_default.fatal("Can't use `--bypass-min-release-age` with a CLI installed by the Vercel installer. The installer downloads releases directly from the registry and has no minimum release-age setting.\nRun `vc upgrade` without the option."),1;if(dryRun||asJson){let requestedPreference;disableMinReleaseAgeBypass?requestedPreference={name:"bypassMinReleaseAge",label:"minimum release-age bypass",enabled:!1}:enableAuto||disableAuto?requestedPreference={name:"autoUpdatesEnabled",label:"automatic CLI updates",enabled:!!enableAuto}:bypassMinReleaseAge&&(requestedPreference={name:"bypassMinReleaseAge",label:"minimum release-age bypass",enabled:!0});let detectedUpdateCommand=hasSettingsOnlyFlag||installerManaged?void 0:await getUpdateCommand(),updateCommand=detectedUpdateCommand&&target&&target!=="latest"?pinPackageVersion(detectedUpdateCommand.split(" "),target).join(" "):detectedUpdateCommand,installationType=installerManaged?"installer":await isGlobal()?"global":"local";if(asJson){let jsonOutput={currentVersion:pkg_default.version,installationType,...updateCommand&&{upgradeCommand:updateCommand},autoUpdatesEnabled:isAutoUpdateEnabled(client.config),...requestedPreference&&{requestedSettings:{[requestedPreference.name]:requestedPreference.enabled}}};client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
|
|
@@ -252,7 +249,7 @@ Learn more: ${import_chalk23.default.cyan("https://vercel.com/docs/cli/about-tel
|
|
|
252
249
|
`),updateCommand&&output_manager_default.print(`Upgrade command: ${updateCommand}
|
|
253
250
|
`),output_manager_default.print(`Automatic updates: ${isAutoUpdateEnabled(client.config)?"Enabled":"Disabled"}
|
|
254
251
|
`),requestedPreference&&output_manager_default.print(`Would ${requestedPreference.enabled?"enable":"disable"} ${requestedPreference.label}. No settings changed.
|
|
255
|
-
`);return 0}if(disableMinReleaseAgeBypass)return setMinReleaseAgeBypass(client,!1),output_manager_default.success("Minimum release-age bypass disabled."),0;if(enableAuto||disableAuto){let enabled=!!enableAuto;return setAutoUpdate(client,enabled),output_manager_default.success(`Automatic CLI updates ${enabled?"enabled":"disabled"}.`),0}return installerManaged?installProductionRelease({version:target,skipIfCurrent:!target}):homebrewManaged?executeHomebrewUpgrade():executeUpgrade(target,client,bypassMinReleaseAge,!!target)}var VcrTelemetryClient=class extends TelemetryClient{trackCliSubcommandLs(actual){this.trackCliSubcommand({subcommand:"ls",value:actual})}trackCliSubcommandInspect(actual){this.trackCliSubcommand({subcommand:"inspect",value:actual})}trackCliSubcommandCreate(actual){this.trackCliSubcommand({subcommand:"create",value:actual})}trackCliSubcommandUpdate(actual){this.trackCliSubcommand({subcommand:"update",value:actual})}trackCliSubcommandDelete(actual){this.trackCliSubcommand({subcommand:"delete",value:actual})}trackCliSubcommandLogin(actual){this.trackCliSubcommand({subcommand:"login",value:actual})}trackCliSubcommandBuild(actual){this.trackCliSubcommand({subcommand:"build",value:actual})}trackCliSubcommandPush(actual){this.trackCliSubcommand({subcommand:"push",value:actual})}trackCliArgumentEngine(value){value&&this.trackCliArgument({arg:"engine",value})}trackCliArgumentPath(value){value&&this.trackCliArgument({arg:"path",value:this.redactedValue})}trackCliArgumentName(value){value&&this.trackCliArgument({arg:"name",value:this.redactedValue})}trackCliOptionPlatform(value){if(value){let known=value==="linux/amd64"||value==="linux/arm64";this.trackCliOption({option:"platform",value:known?value:this.redactedValue})}}trackCliSubcommandTag(actual){this.trackCliSubcommand({subcommand:"tag",value:actual})}trackCliSubcommandImage(actual){this.trackCliSubcommand({subcommand:"image",value:actual})}trackCliSubcommandPermissions(actual){this.trackCliSubcommand({subcommand:"permissions",value:actual})}trackCliOptionLimit(value){typeof value=="number"&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliOptionNext(value){value&&this.trackCliOption({option:"next",value:this.redactedValue})}trackCliOptionCursor(value){value&&this.trackCliOption({option:"cursor",value:this.redactedValue})}trackCliOptionSortBy(value){value&&this.trackCliOption({option:"sort-by",value})}trackCliOptionSortOrder(value){value&&this.trackCliOption({option:"sort-order",value})}trackCliOptionPublic(value){(value==="true"||value==="false")&&this.trackCliOption({option:"public",value})}trackCliFlagPublic(value){value&&this.trackCliFlag("public")}trackCliFlagNoPublic(value){value&&this.trackCliFlag("no-public")}trackCliFlagUntagged(value){value&&this.trackCliFlag("untagged")}trackCliFlagYes(value){value&&this.trackCliFlag("yes")}trackCliFlagPush(value){value&&this.trackCliFlag("push")}};var COMMAND_CONFIG16={ls:getCommandAliases(listSubcommand6),inspect:getCommandAliases(inspectSubcommand3),add:getCommandAliases(addSubcommand2),update:getCommandAliases(configSubcommand),delete:getCommandAliases(removeSubcommand2),login:getCommandAliases(loginSubcommand),build:getCommandAliases(buildSubcommand),push:getCommandAliases(pushSubcommand),tag:getCommandAliases(tagsAggregateCommand),image:getCommandAliases(imageAggregateCommand),permissions:getCommandAliases(permissionsAggregateCommand)};async function vcr(client){let telemetry2=new VcrTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(vcrCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),2}let{subcommand,args,subcommandOriginal}=getSubcommand(parsedArgs.args.slice(1),COMMAND_CONFIG16),needHelp=parsedArgs.flags["--help"];function printHelp(command){output_manager_default.print(help(command,{stream:client.stderr,parent:vcrCommand,columns:client.stderr.columns}))}if(needHelp)switch(subcommand){case"ls":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(listSubcommand6),0;case"inspect":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(inspectSubcommand3),0;case"add":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(addSubcommand2),0;case"update":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(configSubcommand),0;case"delete":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(removeSubcommand2),0;case"login":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(loginSubcommand),0;case"build":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(buildSubcommand),0;case"push":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(pushSubcommand),0;case"tag":{telemetry2.trackCliFlagHelp("vcr",subcommandOriginal);let nested=args[0];return nested==="ls"||nested==="list"?(printHelp(tagsLsSubcommand),0):nested==="inspect"||nested==="get"?(printHelp(tagsInspectSubcommand),0):(printHelp(tagsAggregateCommand),0)}case"image":{telemetry2.trackCliFlagHelp("vcr",subcommandOriginal);let nested=args[0];return nested==="ls"||nested==="list"?(printHelp(imageLsSubcommand),0):nested==="inspect"||nested==="get"?(printHelp(imageInspectSubcommand),0):getCommandAliases(imageRmSubcommand).includes(nested)?(printHelp(imageRmSubcommand),0):(printHelp(imageAggregateCommand),0)}case"permissions":{let printPermissionsActionHelp2=function(command){output_manager_default.print(help(command,{stream:client.stderr,parent:{...vcrCommand,name:"vcr permissions repository"},columns:client.stderr.columns}))};var printPermissionsActionHelp=printPermissionsActionHelp2;telemetry2.trackCliFlagHelp("vcr",subcommandOriginal);let nested=args.slice(0,2),hasAction=aliases=>nested.some(arg=>arg!==void 0&&aliases.includes(arg));return hasAction(PERMISSIONS_ACTIONS.ls)?(printPermissionsActionHelp2(permissionsLsSubcommand),0):hasAction(PERMISSIONS_ACTIONS.add)?(printPermissionsActionHelp2(permissionsAddSubcommand),0):hasAction(PERMISSIONS_ACTIONS.rm)?(printPermissionsActionHelp2(permissionsRmSubcommand),0):hasAction(PERMISSIONS_ACTIONS.clear)?(printPermissionsActionHelp2(permissionsClearSubcommand),0):(printHelp(permissionsAggregateCommand),0)}default:return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),output_manager_default.print(help(vcrCommand,{stream:client.stderr,columns:client.stderr.columns})),0}switch(subcommand){case"ls":return telemetry2.trackCliSubcommandLs(subcommandOriginal),(await import("./chunks/ls-
|
|
252
|
+
`);return 0}if(disableMinReleaseAgeBypass)return setMinReleaseAgeBypass(client,!1),output_manager_default.success("Minimum release-age bypass disabled."),0;if(enableAuto||disableAuto){let enabled=!!enableAuto;return setAutoUpdate(client,enabled),output_manager_default.success(`Automatic CLI updates ${enabled?"enabled":"disabled"}.`),0}return installerManaged?installProductionRelease({version:target,skipIfCurrent:!target}):homebrewManaged?executeHomebrewUpgrade():executeUpgrade(target,client,bypassMinReleaseAge,!!target)}var VcrTelemetryClient=class extends TelemetryClient{trackCliSubcommandLs(actual){this.trackCliSubcommand({subcommand:"ls",value:actual})}trackCliSubcommandInspect(actual){this.trackCliSubcommand({subcommand:"inspect",value:actual})}trackCliSubcommandCreate(actual){this.trackCliSubcommand({subcommand:"create",value:actual})}trackCliSubcommandUpdate(actual){this.trackCliSubcommand({subcommand:"update",value:actual})}trackCliSubcommandDelete(actual){this.trackCliSubcommand({subcommand:"delete",value:actual})}trackCliSubcommandLogin(actual){this.trackCliSubcommand({subcommand:"login",value:actual})}trackCliSubcommandBuild(actual){this.trackCliSubcommand({subcommand:"build",value:actual})}trackCliSubcommandPush(actual){this.trackCliSubcommand({subcommand:"push",value:actual})}trackCliArgumentEngine(value){value&&this.trackCliArgument({arg:"engine",value})}trackCliArgumentPath(value){value&&this.trackCliArgument({arg:"path",value:this.redactedValue})}trackCliArgumentName(value){value&&this.trackCliArgument({arg:"name",value:this.redactedValue})}trackCliOptionPlatform(value){if(value){let known=value==="linux/amd64"||value==="linux/arm64";this.trackCliOption({option:"platform",value:known?value:this.redactedValue})}}trackCliSubcommandTag(actual){this.trackCliSubcommand({subcommand:"tag",value:actual})}trackCliSubcommandImage(actual){this.trackCliSubcommand({subcommand:"image",value:actual})}trackCliSubcommandPermissions(actual){this.trackCliSubcommand({subcommand:"permissions",value:actual})}trackCliOptionLimit(value){typeof value=="number"&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliOptionNext(value){value&&this.trackCliOption({option:"next",value:this.redactedValue})}trackCliOptionCursor(value){value&&this.trackCliOption({option:"cursor",value:this.redactedValue})}trackCliOptionSortBy(value){value&&this.trackCliOption({option:"sort-by",value})}trackCliOptionSortOrder(value){value&&this.trackCliOption({option:"sort-order",value})}trackCliOptionPublic(value){(value==="true"||value==="false")&&this.trackCliOption({option:"public",value})}trackCliFlagPublic(value){value&&this.trackCliFlag("public")}trackCliFlagNoPublic(value){value&&this.trackCliFlag("no-public")}trackCliFlagUntagged(value){value&&this.trackCliFlag("untagged")}trackCliFlagYes(value){value&&this.trackCliFlag("yes")}trackCliFlagPush(value){value&&this.trackCliFlag("push")}};var COMMAND_CONFIG16={ls:getCommandAliases(listSubcommand6),inspect:getCommandAliases(inspectSubcommand3),add:getCommandAliases(addSubcommand2),update:getCommandAliases(configSubcommand),delete:getCommandAliases(removeSubcommand2),login:getCommandAliases(loginSubcommand),build:getCommandAliases(buildSubcommand),push:getCommandAliases(pushSubcommand),tag:getCommandAliases(tagsAggregateCommand),image:getCommandAliases(imageAggregateCommand),permissions:getCommandAliases(permissionsAggregateCommand)};async function vcr(client){let telemetry2=new VcrTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(vcrCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),2}let{subcommand,args,subcommandOriginal}=getSubcommand(parsedArgs.args.slice(1),COMMAND_CONFIG16),needHelp=parsedArgs.flags["--help"];function printHelp(command){output_manager_default.print(help(command,{stream:client.stderr,parent:vcrCommand,columns:client.stderr.columns}))}if(needHelp)switch(subcommand){case"ls":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(listSubcommand6),0;case"inspect":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(inspectSubcommand3),0;case"add":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(addSubcommand2),0;case"update":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(configSubcommand),0;case"delete":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(removeSubcommand2),0;case"login":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(loginSubcommand),0;case"build":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(buildSubcommand),0;case"push":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(pushSubcommand),0;case"tag":{telemetry2.trackCliFlagHelp("vcr",subcommandOriginal);let nested=args[0];return nested==="ls"||nested==="list"?(printHelp(tagsLsSubcommand),0):nested==="inspect"||nested==="get"?(printHelp(tagsInspectSubcommand),0):(printHelp(tagsAggregateCommand),0)}case"image":{telemetry2.trackCliFlagHelp("vcr",subcommandOriginal);let nested=args[0];return nested==="ls"||nested==="list"?(printHelp(imageLsSubcommand),0):nested==="inspect"||nested==="get"?(printHelp(imageInspectSubcommand),0):getCommandAliases(imageRmSubcommand).includes(nested)?(printHelp(imageRmSubcommand),0):(printHelp(imageAggregateCommand),0)}case"permissions":{let printPermissionsActionHelp2=function(command){output_manager_default.print(help(command,{stream:client.stderr,parent:{...vcrCommand,name:"vcr permissions repository"},columns:client.stderr.columns}))};var printPermissionsActionHelp=printPermissionsActionHelp2;telemetry2.trackCliFlagHelp("vcr",subcommandOriginal);let nested=args.slice(0,2),hasAction=aliases=>nested.some(arg=>arg!==void 0&&aliases.includes(arg));return hasAction(PERMISSIONS_ACTIONS.ls)?(printPermissionsActionHelp2(permissionsLsSubcommand),0):hasAction(PERMISSIONS_ACTIONS.add)?(printPermissionsActionHelp2(permissionsAddSubcommand),0):hasAction(PERMISSIONS_ACTIONS.rm)?(printPermissionsActionHelp2(permissionsRmSubcommand),0):hasAction(PERMISSIONS_ACTIONS.clear)?(printPermissionsActionHelp2(permissionsClearSubcommand),0):(printHelp(permissionsAggregateCommand),0)}default:return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),output_manager_default.print(help(vcrCommand,{stream:client.stderr,columns:client.stderr.columns})),0}switch(subcommand){case"ls":return telemetry2.trackCliSubcommandLs(subcommandOriginal),(await import("./chunks/ls-MAJ4QZTY.js")).default(client,args,telemetry2);case"inspect":return telemetry2.trackCliSubcommandInspect(subcommandOriginal),subcommandOriginal==="get"&&warnDeprecatedSubcommand(client,"vcr get","vcr inspect"),(await import("./chunks/inspect-TN2QY3BP.js")).default(client,args,telemetry2);case"add":return telemetry2.trackCliSubcommandCreate(subcommandOriginal),subcommandOriginal==="add"&&warnDeprecatedSubcommand(client,"vcr add","vcr create"),(await import("./chunks/add-F3H4BFJZ.js")).default(client,args,telemetry2);case"update":return telemetry2.trackCliSubcommandUpdate(subcommandOriginal),subcommandOriginal==="config"&&warnDeprecatedSubcommand(client,"vcr config","vcr update"),(await import("./chunks/config-DA2NZUDH.js")).default(client,args,telemetry2);case"delete":return telemetry2.trackCliSubcommandDelete(subcommandOriginal),subcommandOriginal==="remove"&&warnDeprecatedSubcommand(client,"vcr remove","vcr delete"),(await import("./chunks/rm-OV4OU6H2.js")).default(client,args,telemetry2);case"login":return telemetry2.trackCliSubcommandLogin(subcommandOriginal),(await import("./chunks/login-K6XBWOFD.js")).default(client,args,telemetry2);case"build":return telemetry2.trackCliSubcommandBuild(subcommandOriginal),(await import("./chunks/build-GOLTZF6S.js")).default(client,telemetry2);case"push":return telemetry2.trackCliSubcommandPush(subcommandOriginal),(await import("./chunks/push-4YG5HKSD.js")).default(client,telemetry2);case"tag":return telemetry2.trackCliSubcommandTag(subcommandOriginal),(await import("./chunks/tags-7DIZEAVE.js")).default(client,args,telemetry2);case"image":return telemetry2.trackCliSubcommandImage(subcommandOriginal),(await import("./chunks/image-AO2OZG4W.js")).default(client,args,telemetry2);case"permissions":return telemetry2.trackCliSubcommandPermissions(subcommandOriginal),(await import("./chunks/permissions-5K7JZOMB.js")).default(client,args,telemetry2);default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG16)),output_manager_default.print(help(vcrCommand,{stream:client.stderr,columns:client.stderr.columns})),2}}var import_chalk26=__toESM(require_source(),1);async function status3(client){let context=await getVersionContext();if(output_manager_default.print(`Version: ${context.version}
|
|
256
253
|
`),output_manager_default.print(`Runtime: ${describeRuntime(context)}
|
|
257
254
|
`),output_manager_default.print(`Managed by: ${describeManager(context)}
|
|
258
255
|
`),context.manager==="installer"){if(output_manager_default.print(`Active version: ${context.activeVersion??context.version}
|
|
@@ -262,21 +259,21 @@ Learn more: ${import_chalk23.default.cyan("https://vercel.com/docs/cli/about-tel
|
|
|
262
259
|
`)}else context.upgradeCommand!==void 0?output_manager_default.print(`Upgrade command: ${context.upgradeCommand}
|
|
263
260
|
`):output_manager_default.print(`${context.upgradeError.message}
|
|
264
261
|
`),output_manager_default.print(`Automatic updates: ${isAutoUpdateEnabled(client.config)?"Enabled":"Disabled"}
|
|
265
|
-
`);return 0}var
|
|
266
|
-
`),0;if(versions.length===0)return output_manager_default.log("No versions found"),0;let shown=versions.slice(0,DEFAULT_COUNT);for(let version2 of shown){let current=version2===currentVersion;output_manager_default.print(current?`${
|
|
262
|
+
`);return 0}var import_chalk24=__toESM(require_source(),1);var DEFAULT_COUNT=20;async function list4(client,asJson=!1){asJson||output_manager_default.spinner("Fetching available versions\u2026",0);let versions,currentVersion;try{[versions,{version:currentVersion}]=await Promise.all([listAvailableVersions(packageName),getVersionContext()])}catch(error){return output_manager_default.stopSpinner(),output_manager_default.error(`Failed to list versions: ${error instanceof Error?error.message:String(error)}`),1}if(output_manager_default.stopSpinner(),asJson)return client.stdout.write(`${JSON.stringify({versions,currentVersion},null,2)}
|
|
263
|
+
`),0;if(versions.length===0)return output_manager_default.log("No versions found"),0;let shown=versions.slice(0,DEFAULT_COUNT);for(let version2 of shown){let current=version2===currentVersion;output_manager_default.print(current?`${import_chalk24.default.cyan(version2)} ${import_chalk24.default.dim("(current)")}
|
|
267
264
|
`:`${version2}
|
|
268
|
-
`)}return versions.length>shown.length&&output_manager_default.print(
|
|
269
|
-
`)),0}var
|
|
270
|
-
`),output_manager_default.log(`This CLI is managed by ${manager}, so only the current version is available. The recommended way to manage CLI versions is the installer: ${CURL_INSTALL_COMMAND}`),0}let slots=await listNativeTrackSlots(context.installRoot);if(slots.length===0)return output_manager_default.log("No slot-managed versions found"),0;for(let installed2 of slots){let active=installed2.track===context.track&&installed2.slot===context.slot,build=installed2.pr?`PR #${installed2.pr}${installed2.buildSha?` (${installed2.buildSha.slice(0,12)})`:""}`:`v${installed2.version}`;output_manager_default.print(`${installed2.track}/${installed2.slot} ${build}${active?` ${
|
|
265
|
+
`)}return versions.length>shown.length&&output_manager_default.print(import_chalk24.default.dim(`\u2026 and ${versions.length-shown.length} more
|
|
266
|
+
`)),0}var import_chalk25=__toESM(require_source(),1);async function installed(){let context=await getVersionContext();if(context.manager!=="installer"){let manager=context.packageManager===void 0?"an unsupported package-manager installation":context.packageManager==="homebrew"?"Homebrew":context.packageManagerAssumed?`${context.packageManager} (assumed)`:context.packageManager;return output_manager_default.print(`${context.version} ${import_chalk25.default.dim("(current)")}
|
|
267
|
+
`),output_manager_default.log(`This CLI is managed by ${manager}, so only the current version is available. The recommended way to manage CLI versions is the installer: ${CURL_INSTALL_COMMAND}`),0}let slots=await listNativeTrackSlots(context.installRoot);if(slots.length===0)return output_manager_default.log("No slot-managed versions found"),0;for(let installed2 of slots){let active=installed2.track===context.track&&installed2.slot===context.slot,build=installed2.pr?`PR #${installed2.pr}${installed2.buildSha?` (${installed2.buildSha.slice(0,12)})`:""}`:`v${installed2.version}`;output_manager_default.print(`${installed2.track}/${installed2.slot} ${build}${active?` ${import_chalk25.default.dim("(active)")}`:""}
|
|
271
268
|
`)}return 0}var import_semver4=__toESM(require_semver(),1);function printInstallerOnlyError(context,version2){if(output_manager_default.error("Switching versions is only supported for installer-managed CLIs."),output_manager_default.log(`Install the CLI with the installer first: ${CURL_INSTALL_COMMAND}`),version2&&context.manager==="package-manager"&&context.packageManager!=="homebrew"){let manager=context.packageManagerAssumed?`${context.packageManager} (assumed)`:context.packageManager;output_manager_default.log(`Or install this version with ${manager}: ${getPackageManagerInstallCommand(context,version2)}`)}}async function use(args){let target=args[0];if(!target)return output_manager_default.error(`Missing version. Usage: ${getCommandName("version use <version>")}`),2;let context=await getVersionContext();if(context.manager==="package-manager"&&context.upgradeCommand===void 0)return output_manager_default.fatal(context.upgradeError.message),1;if(target==="latest")return context.canSwitchVersions?installProductionRelease({currentVersion:context.version,track:context.track}):(printInstallerOnlyError(context),1);let pr=parsePrTarget(target);if(pr!==void 0){if(!context.canSwitchVersions)return printInstallerOnlyError(context),1;try{let{updated,buildSha,slot}=await installAndActivatePrBinary(pr);return output_manager_default.stopSpinner(),updated?output_manager_default.success(`Activated the Vercel CLI build for PR #${pr} (${buildSha.slice(0,12)}) on pr/${slot}.`):output_manager_default.log(`The latest build for PR #${pr} (${buildSha.slice(0,12)}) is active on pr/${slot}.`),output_manager_default.log("PR builds change on every push \u2014 re-run this command to pick up new builds."),output_manager_default.log(`Return to a release build with ${getCommandName("version use latest")}.`),0}catch(error){return output_manager_default.stopSpinner(),output_manager_default.error(error instanceof Error?error.message:String(error)),1}}let version2=import_semver4.default.valid(import_semver4.default.coerce(target)?.version??target)?import_semver4.default.coerce(target)?.version??target:void 0;return!version2||!import_semver4.default.valid(version2)?(output_manager_default.error(`Invalid version: "${target}"`),1):context.canSwitchVersions?installProductionRelease({version:version2,currentVersion:context.version,track:context.track}):(printInstallerOnlyError(context,version2),1)}async function autoupdate(client,args){let action=args[0];if(!action||action==="status"){let enabled=(await getVersionContext()).manager==="installer"?isNativeAutoUpdateEnabled(client.config):isAutoUpdateEnabled(client.config);return output_manager_default.print(`Automatic updates are ${enabled?"enabled":"disabled"}
|
|
272
269
|
`),0}if(action==="enable"||action==="disable"){let enabled=action==="enable";return setAutoUpdate(client,enabled),output_manager_default.success(`Automatic CLI updates ${enabled?"enabled":"disabled"}.`),0}return output_manager_default.error(`Invalid argument "${action}". Usage: ${getCommandName("version autoupdate enable|disable|status")}`),2}var import_semver5=__toESM(require_semver(),1);import{performance}from"node:perf_hooks";var VersionTelemetryClient=class extends TelemetryClient{trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandInstalled(actual){this.trackCliSubcommand({subcommand:"installed",value:actual})}trackCliSubcommandUse(actual){this.trackCliSubcommand({subcommand:"use",value:actual})}trackCliSubcommandUpdate(actual){this.trackCliSubcommand({subcommand:"update",value:actual})}trackCliSubcommandCheck(actual){this.trackCliSubcommand({subcommand:"check",value:actual})}trackCliSubcommandAutoupdate(actual){this.trackCliSubcommand({subcommand:"autoupdate",value:actual})}trackNativeUpdate(event){this.trackCommandOutput({key:"native-update",value:JSON.stringify(event)})}};var NATIVE_UPDATE_CHILD_TIMEOUT_MS=2*60*1e3;async function check3(client,{timeoutMs=NATIVE_UPDATE_CHILD_TIMEOUT_MS}={}){let context=await getVersionContext();if(context.manager!=="installer")return isNativeUpdateChild()?0:(output_manager_default.fatal("Native update checks require an installer-managed CLI."),1);if(isNativeUpdateChild()){let cachedVersion=process.env[NATIVE_UPDATE_VERSION_ENV],source=cachedVersion?"cached":"discovery",controller=new AbortController,timeout=setTimeout(()=>controller.abort(),timeoutMs),startedAt=performance.now(),discoveryMs,stagingMs,outcome="failure";try{let version2=cachedVersion;if(!version2){await cacheNativeUpdateDiscoveryAttempt();let discoveryStartedAt=performance.now();try{version2=await resolveLatestNativeVersion({signal:controller.signal})}finally{discoveryMs=Math.round(performance.now()-discoveryStartedAt)}await cacheNativeUpdateVersion(version2),controller.signal.throwIfAborted()}let selectProduction=process.env[NATIVE_UPDATE_SELECT_PRODUCTION_ENV]==="1";controller.signal.throwIfAborted();let stagingStartedAt=performance.now();try{await stageProductionUpdate(version2,selectProduction,{signal:controller.signal})}finally{stagingMs=Math.round(performance.now()-stagingStartedAt)}return await markNativeUpdateStaged(version2,{selectedProduction:selectProduction}),controller.signal.aborted?(outcome="timeout",1):(outcome="success",0)}catch{if(controller.signal.aborted&&(outcome="timeout"),!cachedVersion)try{await restoreNativeUpdateAfterDiscoveryFailure()}catch{}return 1}finally{clearTimeout(timeout),new VersionTelemetryClient({opts:{store:client.telemetryEventStore}}).trackNativeUpdate({outcome,source,totalMs:Math.round(performance.now()-startedAt),discoveryMs,stagingMs})}}try{output_manager_default.spinner("Resolving latest native version\u2026",0);let latest=await resolveLatestNativeVersion();return output_manager_default.stopSpinner(),output_manager_default.print(`Latest production version: ${latest}
|
|
273
270
|
`),context.track==="production"&&context.activeVersion&&import_semver5.default.valid(context.activeVersion)&&import_semver5.default.gte(context.activeVersion,latest)?(await cacheNativeUpdateVersion(latest),await markNativeUpdateStaged(latest,{selectedProduction:!0}),output_manager_default.print(`Production is already up to date.
|
|
274
271
|
`),0):(await cacheNativeUpdateVersion(latest,{selectProduction:!0}),spawnNativeUpdateChild(latest,!0),output_manager_default.print(`Production update started in the background.
|
|
275
|
-
`),0)}catch(error){return output_manager_default.stopSpinner(),output_manager_default.fatal(`Failed to check for updates: ${error instanceof Error?error.message:String(error)}`),1}}var COMMAND_CONFIG17={list:getCommandAliases(listSubcommand7),installed:getCommandAliases(installedSubcommand),use:getCommandAliases(useSubcommand),update:getCommandAliases(updateSubcommand),check:getCommandAliases(checkSubcommand2),autoupdate:getCommandAliases(autoupdateSubcommand)};async function version(client){let telemetry2=new VersionTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArguments;try{let argv=client.argv.slice(2),{subcommand:typed}=getSubcommand(parseArguments(argv,getFlagsSpecification(versionCommand.options),{permissive:!0}).args.slice(1),COMMAND_CONFIG17);parsedArguments=parseArguments(argv,getFlagsSpecification([...versionCommand.options,...typed==="list"?listSubcommand7.options:[]]))}catch(err){return printError(err),2}let{subcommand,args,subcommandOriginal}=getSubcommand(parsedArguments.args.slice(1),COMMAND_CONFIG17),needHelp=parsedArguments.flags["--help"];function printHelp(command){output_manager_default.print(help(command,{stream:client.stderr,columns:client.stderr.columns,parent:versionCommand}))}if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("version",subcommand),output_manager_default.print(help(versionCommand,{stream:client.stderr,columns:client.stderr.columns})),0;switch(subcommand){case"list":return needHelp?(telemetry2.trackCliFlagHelp("version",subcommandOriginal),printHelp(listSubcommand7),0):(telemetry2.trackCliSubcommandList(subcommandOriginal),list4(client,!!parsedArguments.flags["--json"]));case"installed":return needHelp?(telemetry2.trackCliFlagHelp("version",subcommandOriginal),printHelp(installedSubcommand),0):(telemetry2.trackCliSubcommandInstalled(subcommandOriginal),installed());case"use":return needHelp?(telemetry2.trackCliFlagHelp("version",subcommandOriginal),printHelp(useSubcommand),0):(telemetry2.trackCliSubcommandUse(subcommandOriginal),subcommandOriginal!=="use"&&warnDeprecatedSubcommand(client,`version ${subcommandOriginal}`,"version use"),use(args));case"update":return needHelp?(telemetry2.trackCliFlagHelp("version",subcommandOriginal),printHelp(updateSubcommand),0):(telemetry2.trackCliSubcommandUpdate(subcommandOriginal),subcommandOriginal==="upgrade"&&warnDeprecatedSubcommand(client,"version upgrade","version update"),use(["latest"]));case"check":return needHelp?(telemetry2.trackCliFlagHelp("version",subcommandOriginal),printHelp(checkSubcommand2),0):(isNativeUpdateChild()||telemetry2.trackCliSubcommandCheck(subcommandOriginal),check3(client));case"autoupdate":return needHelp?(telemetry2.trackCliFlagHelp("version",subcommandOriginal),printHelp(autoupdateSubcommand),0):(telemetry2.trackCliSubcommandAutoupdate(subcommandOriginal),autoupdate(client,args));default:return parsedArguments.args.length>1?(output_manager_default.print(`${
|
|
276
|
-
`),output_manager_default.print(help(versionCommand,{stream:client.stderr,columns:client.stderr.columns})),2):status3(client)}}var
|
|
272
|
+
`),0)}catch(error){return output_manager_default.stopSpinner(),output_manager_default.fatal(`Failed to check for updates: ${error instanceof Error?error.message:String(error)}`),1}}var COMMAND_CONFIG17={list:getCommandAliases(listSubcommand7),installed:getCommandAliases(installedSubcommand),use:getCommandAliases(useSubcommand),update:getCommandAliases(updateSubcommand),check:getCommandAliases(checkSubcommand2),autoupdate:getCommandAliases(autoupdateSubcommand)};async function version(client){let telemetry2=new VersionTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArguments;try{let argv=client.argv.slice(2),{subcommand:typed}=getSubcommand(parseArguments(argv,getFlagsSpecification(versionCommand.options),{permissive:!0}).args.slice(1),COMMAND_CONFIG17);parsedArguments=parseArguments(argv,getFlagsSpecification([...versionCommand.options,...typed==="list"?listSubcommand7.options:[]]))}catch(err){return printError(err),2}let{subcommand,args,subcommandOriginal}=getSubcommand(parsedArguments.args.slice(1),COMMAND_CONFIG17),needHelp=parsedArguments.flags["--help"];function printHelp(command){output_manager_default.print(help(command,{stream:client.stderr,columns:client.stderr.columns,parent:versionCommand}))}if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("version",subcommand),output_manager_default.print(help(versionCommand,{stream:client.stderr,columns:client.stderr.columns})),0;switch(subcommand){case"list":return needHelp?(telemetry2.trackCliFlagHelp("version",subcommandOriginal),printHelp(listSubcommand7),0):(telemetry2.trackCliSubcommandList(subcommandOriginal),list4(client,!!parsedArguments.flags["--json"]));case"installed":return needHelp?(telemetry2.trackCliFlagHelp("version",subcommandOriginal),printHelp(installedSubcommand),0):(telemetry2.trackCliSubcommandInstalled(subcommandOriginal),installed());case"use":return needHelp?(telemetry2.trackCliFlagHelp("version",subcommandOriginal),printHelp(useSubcommand),0):(telemetry2.trackCliSubcommandUse(subcommandOriginal),subcommandOriginal!=="use"&&warnDeprecatedSubcommand(client,`version ${subcommandOriginal}`,"version use"),use(args));case"update":return needHelp?(telemetry2.trackCliFlagHelp("version",subcommandOriginal),printHelp(updateSubcommand),0):(telemetry2.trackCliSubcommandUpdate(subcommandOriginal),subcommandOriginal==="upgrade"&&warnDeprecatedSubcommand(client,"version upgrade","version update"),use(["latest"]));case"check":return needHelp?(telemetry2.trackCliFlagHelp("version",subcommandOriginal),printHelp(checkSubcommand2),0):(isNativeUpdateChild()||telemetry2.trackCliSubcommandCheck(subcommandOriginal),check3(client));case"autoupdate":return needHelp?(telemetry2.trackCliFlagHelp("version",subcommandOriginal),printHelp(autoupdateSubcommand),0):(telemetry2.trackCliSubcommandAutoupdate(subcommandOriginal),autoupdate(client,args));default:return parsedArguments.args.length>1?(output_manager_default.print(`${import_chalk26.default.red("Error")}: Invalid subcommand. See help instructions for usage:
|
|
273
|
+
`),output_manager_default.print(help(versionCommand,{stream:client.stderr,columns:client.stderr.columns})),2):status3(client)}}var import_chalk27=__toESM(require_source(),1),import_build_utils3=__toESM(require_build_utils(),1);import{relative as relative2}from"path";var WhoamiTelemetryClient=class extends TelemetryClient{trackCliFlagCached(v){v&&this.trackCliFlag("cached")}};async function whoami(client){let parsedArgs=null,flagsSpecification=getFlagsSpecification(whoamiCommand.options),telemetry2=new WhoamiTelemetryClient({opts:{store:client.telemetryEventStore}});try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return printError(error),2}if(parsedArgs.flags["--help"])return telemetry2.trackCliFlagHelp("whoami"),output_manager_default.print(help(whoamiCommand,{stream:client.stderr,columns:client.stderr.columns})),0;let formatResult=validateJsonOutput(parsedArgs.flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput;if(telemetry2.trackCliOptionFormat(parsedArgs.flags["--format"]),telemetry2.trackCliFlagCached(parsedArgs.flags["--cached"]),!client.authConfig.token){if(asJson){let jsonOutput={loggedIn:!1,cliVersion:pkg_default.version,linkedProject:await getLinkedProjectJson(client)};client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
|
|
277
274
|
`)}else output_manager_default.log("Logged out."),output_manager_default.log(`Run ${getCommandName("deploy --temporary")} to create a temporary deployment you can claim later, or ${getCommandName("login")} to log in.`);return 1}let cachedUsername=getWhoamiCachedAnswer(client.argv.slice(2),client.authConfig);if(cachedUsername)return asJson?client.stdout.write(`${JSON.stringify({username:cachedUsername,cached:!0},null,2)}
|
|
278
|
-
`):client.stdout.isTTY?output_manager_default.log(`Logged in as ${
|
|
275
|
+
`):client.stdout.isTTY?output_manager_default.log(`Logged in as ${import_chalk27.default.bold(cachedUsername)} (cached)`):client.stdout.write(`${cachedUsername}
|
|
279
276
|
`),0;if(parsedArgs.flags["--cached"]&&output_manager_default.debug("No cached username, checking with Vercel."),!asJson&&!client.stdout.isTTY&&!isAppPrincipalEnabled()){let user2=await getUser(client);return client.stdout.write(`${user2.username}
|
|
280
277
|
`),0}let[scope,teams,linkedProject]=await Promise.all([getScope(client,{resolveLocalScope:!0,chooseTeam:!1}),asJson?getTeamsJson(client):null,asJson?getLinkedProjectJson(client):null]),{user,team,app,globalTeam}=scope,plan=(team?team.billing?.plan:user?.billing?.plan)??null,hasLocalOverride=!scope.explicitScopeProvided&&((team?.id??null)!==(globalTeam?.id??null)||scope.scopeMismatch);if(asJson){let jsonOutput={team:team?{id:team.id,slug:team.slug,name:team.name,plan}:null,plan};user&&(jsonOutput.username=user.username,jsonOutput.email=user.email,jsonOutput.name=user.name),app&&(jsonOutput.app=app),parsedArgs.flags["--cached"]&&(jsonOutput.cached=!1),hasLocalOverride&&(jsonOutput.localOverride=!0,jsonOutput.globalTeam=globalTeam?{id:globalTeam.id,slug:globalTeam.slug,name:globalTeam.name}:null),jsonOutput.teams=teams,jsonOutput.linkedProject=linkedProject,jsonOutput.cliVersion=pkg_default.version,client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
|
|
281
|
-
`)}else if(client.stdout.isTTY){if(output_manager_default.log(`Logged in as ${
|
|
282
|
-
`);return 0}async function getTeamsJson(client){try{return(await getTeams(client)).map(team=>({id:team.id,slug:team.slug,name:team.name??null}))}catch(err){return output_manager_default.debug(`Could not list teams: ${err}`),null}}async function getLinkedProjectJson(client){let envOrgId=(0,import_build_utils3.getPlatformEnv)("ORG_ID"),envProjectId=(0,import_build_utils3.getPlatformEnv)("PROJECT_ID");if(envOrgId&&envProjectId)return{id:envProjectId,name:null,orgId:envOrgId};try{let link=await getLinkFromDir(getVercelDirectory(client.cwd));if(link)return{id:link.projectId,name:link.projectName??null,orgId:link.orgId};let repoLink=await getRepoLink(client,client.cwd);if(repoLink?.repoConfig){let projects=findProjectsFromPath(repoLink.repoConfig.projects,relative2(repoLink.rootPath,client.cwd));if(projects.length===1){let[project]=projects;return{id:project.id,name:project.name,orgId:project.orgId??repoLink.repoConfig.orgId??null}}}}catch(err){output_manager_default.debug(`Could not read the project link: ${err}`)}return null}function formatUsername(scope){if(scope.user)return scope.user.username;if(scope.app)return scope.app.id;throw new Error("Could not format principal identity")}function formatBillingPlan(plan){return plan.toLowerCase()==="oss"?"OSS":plan.charAt(0).toUpperCase()+plan.slice(1)}export{activity,agent,alerts,board,builders,main as cache,changelog,comments,
|
|
278
|
+
`)}else if(client.stdout.isTTY){if(output_manager_default.log(`Logged in as ${import_chalk27.default.bold(formatUsername(scope))}`),team?output_manager_default.log(`Active team: ${import_chalk27.default.bold(team.slug)}${team.name&&team.name!==team.slug?` (${team.name})`:""}`):output_manager_default.log(`Active team: ${import_chalk27.default.bold(client.isTeamUnchosen()?"None":"Personal Account")}`),plan&&output_manager_default.log(`Active team plan: ${import_chalk27.default.bold(formatBillingPlan(plan))}`),hasLocalOverride){let globalLabel=globalTeam?globalTeam.slug:"Personal Account",localLabel=team?team.slug:"Personal Account";output_manager_default.log(`${import_chalk27.default.yellow("Local override:")} scope is set to ${import_chalk27.default.bold(localLabel)} by the linked project in this directory (globally selected: ${import_chalk27.default.bold(globalLabel)}).`)}}else client.stdout.write(`${formatUsername(scope)}
|
|
279
|
+
`);return 0}async function getTeamsJson(client){try{return(await getTeams(client)).map(team=>({id:team.id,slug:team.slug,name:team.name??null}))}catch(err){return output_manager_default.debug(`Could not list teams: ${err}`),null}}async function getLinkedProjectJson(client){let envOrgId=(0,import_build_utils3.getPlatformEnv)("ORG_ID"),envProjectId=(0,import_build_utils3.getPlatformEnv)("PROJECT_ID");if(envOrgId&&envProjectId)return{id:envProjectId,name:null,orgId:envOrgId};try{let link=await getLinkFromDir(getVercelDirectory(client.cwd));if(link)return{id:link.projectId,name:link.projectName??null,orgId:link.orgId};let repoLink=await getRepoLink(client,client.cwd);if(repoLink?.repoConfig){let projects=findProjectsFromPath(repoLink.repoConfig.projects,relative2(repoLink.rootPath,client.cwd));if(projects.length===1){let[project]=projects;return{id:project.id,name:project.name,orgId:project.orgId??repoLink.repoConfig.orgId??null}}}}catch(err){output_manager_default.debug(`Could not read the project link: ${err}`)}return null}function formatUsername(scope){if(scope.user)return scope.user.username;if(scope.app)return scope.app.id;throw new Error("Could not format principal identity")}function formatBillingPlan(plan){return plan.toLowerCase()==="oss"?"OSS":plan.charAt(0).toUpperCase()+plan.slice(1)}export{activity,agent,alerts,board,builders,main as cache,changelog,comments,main2 as crons,curl,main3 as deployHooks,doctor,guidance,httpstat,login,logout2 as logout,main4 as mcp,metrics,monitors,openCommandHandler as open,pageIntegrity,pricing,promote_default as promote,rollback_default as rollback,rollingRelease,sandbox,security,signup,main5 as target,telemetry,upgrade,vcr,version,whoami};
|