@vercel/cli-support 65.3.1 → 65.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/chunks/add-7NS6HIWC.js +8 -0
- package/dist/chunks/add-NMYFDVXW.js +8 -0
- package/dist/chunks/add-PMJ5BECU.js +8 -0
- package/dist/chunks/build-BCY6HQJG.js +7 -0
- package/dist/chunks/{chunk-SKYDLHEZ.js → chunk-2K3ISCQ6.js} +1 -1
- package/dist/chunks/{chunk-BL3HBRF6.js → chunk-2TUVL6WE.js} +1 -1
- package/dist/chunks/{chunk-22FDWPWY.js → chunk-363SJ4TN.js} +1 -1
- package/dist/chunks/chunk-462YCCJZ.js +7 -0
- package/dist/chunks/{chunk-KNLGWGUE.js → chunk-4N6LMERQ.js} +6 -6
- package/dist/chunks/chunk-527GBU3K.js +7 -0
- package/dist/chunks/chunk-5IWFRZQT.js +10 -0
- package/dist/chunks/chunk-5KUUMQ3M.js +7 -0
- package/dist/chunks/{chunk-IVSC7ZFJ.js → chunk-5V53NA6C.js} +1 -1
- package/dist/chunks/chunk-6I6QJHCY.js +7 -0
- package/dist/chunks/chunk-6TXEVQA4.js +7 -0
- package/dist/chunks/{chunk-2PKEEQ5W.js → chunk-6YXIWZ3X.js} +1 -1
- package/dist/chunks/{chunk-7HV7O6DM.js → chunk-7E3WREH5.js} +1 -1
- package/dist/chunks/{chunk-Y6AGOERS.js → chunk-7L5QUDUR.js} +1 -1
- package/dist/chunks/{chunk-X4762EE4.js → chunk-7QAGSRCU.js} +1 -1
- package/dist/chunks/{chunk-NTZ5WWYV.js → chunk-7R6TRRG5.js} +1 -1
- package/dist/chunks/{chunk-WCWP4GBR.js → chunk-AYUUSAB7.js} +1 -1
- package/dist/chunks/chunk-BVGGTBYE.js +7 -0
- package/dist/chunks/{chunk-YN3C5BL5.js → chunk-C7FQMC6D.js} +1 -1
- package/dist/chunks/{chunk-2U7DJZSQ.js → chunk-CBVKB3DT.js} +1 -1
- package/dist/chunks/{chunk-FDNYYENK.js → chunk-CC6FLKIP.js} +1 -1
- package/dist/chunks/chunk-CR3NBTHV.js +7 -0
- package/dist/chunks/{chunk-BBKEP7RO.js → chunk-CWM2F235.js} +1 -1
- package/dist/chunks/{chunk-IUXSJWL3.js → chunk-DKJL2KV7.js} +1 -1
- package/dist/chunks/{chunk-2ACMWVTB.js → chunk-DQ2SVW4R.js} +1 -1
- package/dist/chunks/{chunk-SLI2O5X7.js → chunk-EAXMWCOL.js} +2 -2
- package/dist/chunks/{chunk-LRYGNQ6C.js → chunk-ECEDD646.js} +1 -1
- package/dist/chunks/{chunk-IGDG5CWT.js → chunk-EEUJLJEJ.js} +1 -1
- package/dist/chunks/{chunk-VQSLPYAF.js → chunk-EGNR2DEI.js} +1 -1
- package/dist/chunks/chunk-EISD3RG7.js +11 -0
- package/dist/chunks/{chunk-GVTXA6HG.js → chunk-EKZTFGDX.js} +1 -1
- package/dist/chunks/{chunk-CEMPU323.js → chunk-EU2GBIPC.js} +1 -1
- package/dist/chunks/{chunk-3ADDGPEN.js → chunk-F6EBOT64.js} +1 -1
- package/dist/chunks/chunk-FHU2O7ZJ.js +8 -0
- package/dist/chunks/{chunk-KH6565YH.js → chunk-FLHO75XC.js} +1 -1
- package/dist/chunks/chunk-FSPPKNKN.js +7 -0
- package/dist/chunks/{chunk-43GBAKL2.js → chunk-GCZVIDNG.js} +1 -1
- package/dist/chunks/{chunk-G4T7VBGN.js → chunk-HSFKISDH.js} +1 -1
- package/dist/chunks/{chunk-OQCMRU3J.js → chunk-HTXDC7E2.js} +2 -2
- package/dist/chunks/{chunk-76SVVWPH.js → chunk-IOZ3I765.js} +1 -1
- package/dist/chunks/{chunk-UKQMYTWW.js → chunk-JLE7K4SY.js} +1 -1
- package/dist/chunks/{chunk-3JGBBS6V.js → chunk-JP33AIDQ.js} +1 -1
- package/dist/chunks/{chunk-ULHNMQ7C.js → chunk-JRPNHWA3.js} +1 -1
- package/dist/chunks/{chunk-D2BZMGHP.js → chunk-JUSR7V2L.js} +1 -1
- package/dist/chunks/{chunk-XB4SKARZ.js → chunk-JWCEHQQF.js} +1 -1
- package/dist/chunks/chunk-K5U47EVH.js +7 -0
- package/dist/chunks/{chunk-VOCZ34ON.js → chunk-KCKYPLIH.js} +1 -1
- package/dist/chunks/{chunk-2WYYGGEO.js → chunk-KGBIRIFF.js} +1 -1
- package/dist/chunks/{chunk-RRREFECI.js → chunk-KJA2GKPT.js} +1 -1
- package/dist/chunks/{chunk-S5IWVPYT.js → chunk-KPQLUGFI.js} +1 -1
- package/dist/chunks/{chunk-S4SJ7GIZ.js → chunk-KQCFC2JL.js} +1 -1
- package/dist/chunks/{chunk-XXXRTHTP.js → chunk-KQCROPL3.js} +1 -1
- package/dist/chunks/{chunk-3KKFLKQG.js → chunk-KY335KWI.js} +1 -1
- package/dist/chunks/{chunk-OWOWPOIE.js → chunk-L3JYCXVB.js} +1 -1
- package/dist/chunks/chunk-LFOWP74R.js +7 -0
- package/dist/chunks/{chunk-PFNYWWLI.js → chunk-LOBA3E72.js} +1 -1
- package/dist/chunks/{chunk-XZV4BFM5.js → chunk-LQVSU5HR.js} +1 -1
- package/dist/chunks/{chunk-2H3SB5RP.js → chunk-LW4N3CW6.js} +1 -1
- package/dist/chunks/{chunk-6ISAISGD.js → chunk-M2NXKZKX.js} +1 -1
- package/dist/chunks/{chunk-F2SWJEYV.js → chunk-MBEKRUTQ.js} +1 -1
- package/dist/chunks/{chunk-UJSW56GS.js → chunk-N2FLYCCO.js} +1 -1
- package/dist/chunks/{chunk-ZH6KHD55.js → chunk-N6JBQMOF.js} +2 -2
- package/dist/chunks/{chunk-OCQPXOTX.js → chunk-NAX6IARA.js} +1 -1
- package/dist/chunks/{chunk-4UGHFESV.js → chunk-NGKO2OOU.js} +1 -1
- package/dist/chunks/chunk-NW7WWUCQ.js +9 -0
- package/dist/chunks/chunk-O4WNSKQR.js +15 -0
- package/dist/chunks/{chunk-7Z3WUAO5.js → chunk-O72YDZKD.js} +1 -1
- package/dist/chunks/{chunk-LKLH6DZP.js → chunk-OHEOYFBU.js} +1 -1
- package/dist/chunks/{chunk-LJBUJ23M.js → chunk-OZCQTXI4.js} +1 -1
- package/dist/chunks/{chunk-LCHECISY.js → chunk-Q4KTAQB3.js} +1 -1
- package/dist/chunks/{chunk-TZFDVQ72.js → chunk-QIVX6SCR.js} +1 -1
- package/dist/chunks/{chunk-7Y46LB43.js → chunk-QVHXFHBV.js} +1 -1
- package/dist/chunks/chunk-QVXS234E.js +7 -0
- package/dist/chunks/{chunk-SXOSF4O6.js → chunk-QVZAAMGQ.js} +1 -1
- package/dist/chunks/chunk-R2BUF6Z7.js +7 -0
- package/dist/chunks/{chunk-OGPENBY2.js → chunk-R2XHJDAP.js} +1 -1
- package/dist/chunks/{chunk-E6CO6TUM.js → chunk-RMZTB2IU.js} +1 -1
- package/dist/chunks/{chunk-LT3UK4K6.js → chunk-SLGUYM42.js} +1 -1
- package/dist/chunks/{chunk-7BGKE3JW.js → chunk-SYFG2RM6.js} +1 -1
- package/dist/chunks/chunk-T6243EDS.js +7 -0
- package/dist/chunks/chunk-TAISZMA2.js +7 -0
- package/dist/chunks/{chunk-TO5PJDEN.js → chunk-TEYREL44.js} +1 -1
- package/dist/chunks/{chunk-6KVHNQW4.js → chunk-TIPQQ4TG.js} +1 -1
- package/dist/chunks/{chunk-DUT4U5YY.js → chunk-U2OBPULW.js} +1 -1
- package/dist/chunks/{chunk-OQPXJCMK.js → chunk-UGNIIDHR.js} +1 -1
- package/dist/chunks/{chunk-NQWGRKF4.js → chunk-UHBMX3OK.js} +1 -1
- package/dist/chunks/{chunk-QMCHGGDX.js → chunk-VNIKIQVE.js} +1 -1
- package/dist/chunks/{chunk-DGYHWXD2.js → chunk-WDXW6A4H.js} +2 -2
- package/dist/chunks/{chunk-L4NSF346.js → chunk-WEH6XC4Y.js} +1 -1
- package/dist/chunks/{chunk-TKBORMUF.js → chunk-WKZ6JSGZ.js} +1 -1
- package/dist/chunks/{chunk-WGXKX24Q.js → chunk-WVHCBDTB.js} +1 -1
- package/dist/chunks/{chunk-COM5YCHF.js → chunk-XC46OAAT.js} +1 -1
- package/dist/chunks/{chunk-WBF36MYT.js → chunk-XVDRGWXM.js} +1 -1
- package/dist/chunks/{chunk-IKQTP764.js → chunk-Y5ZMKL7E.js} +1 -1
- package/dist/chunks/{chunk-NEFDNROD.js → chunk-YEZJNXQX.js} +1 -1
- package/dist/chunks/{chunk-VMMMBWD3.js → chunk-YHULP2KK.js} +1 -1
- package/dist/chunks/{chunk-OMCGXRSA.js → chunk-YMZ6WBKB.js} +2 -2
- package/dist/chunks/{chunk-URPEIX6M.js → chunk-ZN6CQWVP.js} +1 -1
- package/dist/chunks/{chunk-YK7XLFU2.js → chunk-ZQBSAMFL.js} +1 -1
- package/dist/chunks/clear-FKVWDCVA.js +8 -0
- package/dist/chunks/{compile-vercel-config-3IYM2CHC.js → compile-vercel-config-GWAJE44R.js} +1 -1
- package/dist/chunks/config-5WVLG5SE.js +8 -0
- package/dist/chunks/{config-ZFIC7N4D.js → config-RMOHN5YT.js} +1 -1
- package/dist/chunks/config-validator.mjs +1 -1
- package/dist/chunks/{constants-ICJL2EO5.js → constants-JAB7MRSK.js} +1 -1
- package/dist/chunks/delete-5WMB4WFR.js +9 -0
- package/dist/chunks/delete-EM4JZPFA.js +10 -0
- package/dist/chunks/{detect-services-MOXTX5XG.js → detect-services-BSJGB4RM.js} +1 -1
- package/dist/chunks/disable-QOM7UHQC.js +7 -0
- package/dist/chunks/discard-L5ZH7P5B.js +14 -0
- package/dist/chunks/edit-F3VJGCG2.js +9 -0
- package/dist/chunks/edit-TM7YCWBU.js +8 -0
- package/dist/chunks/enable-72C3QX34.js +7 -0
- package/dist/chunks/{export-MHSH7QCX.js → export-EPLYZF2Q.js} +1 -1
- package/dist/chunks/{future-FFOGTKMF.js → future-V77DRMQG.js} +1 -1
- package/dist/chunks/generate-cert-for-deploy-Y3YHBMPU.js +7 -0
- package/dist/chunks/{image-7METSS6F.js → image-CVXEXU5R.js} +1 -1
- package/dist/chunks/{import-builders-GM2SERWV.js → import-builders-PGRKJOOE.js} +1 -1
- package/dist/chunks/inspect-BTRNXRJT.js +9 -0
- package/dist/chunks/{inspect-IAWVHJXQ.js → inspect-CZ7WXYE5.js} +1 -1
- package/dist/chunks/inspect-FGDVWAQP.js +13 -0
- package/dist/chunks/{inspect-A7WJQQZO.js → inspect-HFDGZNWC.js} +1 -1
- package/dist/chunks/{inspect-DI434TAM.js → inspect-T2AIREYK.js} +1 -1
- package/dist/chunks/list-CKRRHAOE.js +12 -0
- package/dist/chunks/{list-WWU734RK.js → list-FLREMGJR.js} +1 -1
- package/dist/chunks/{list-INRPH25K.js → list-ON4YTQRN.js} +1 -1
- package/dist/chunks/login-55LJ5ZA6.js +9 -0
- package/dist/chunks/{login-R5NQRPQC.js → login-DQRZSD4Z.js} +1 -1
- package/dist/chunks/logs-2HQXWOHM.js +7 -0
- package/dist/chunks/{ls-S5E2NQMI.js → ls-2HUJHVLA.js} +1 -1
- package/dist/chunks/{ls-V2ZSIVO3.js → ls-3DVM5HLK.js} +1 -1
- package/dist/chunks/ls-4B3QYHCI.js +8 -0
- package/dist/chunks/{ls-MCQ2NS65.js → ls-A7K4XDQB.js} +1 -1
- package/dist/chunks/{ls-LIGIBVAT.js → ls-FK5XEJEU.js} +1 -1
- package/dist/chunks/{ls-VXH4QYF5.js → ls-QGUKJJY5.js} +1 -1
- package/dist/chunks/ls-VTKHPDWS.js +11 -0
- package/dist/chunks/mutate-7ADZBCZM.js +9 -0
- package/dist/chunks/{notifications-KFZ333V5.js → notifications-XZJXE2K4.js} +1 -1
- package/dist/chunks/open-EE5IZQD7.js +7 -0
- package/dist/chunks/{openapi-JGYEFJJV.js → openapi-QBX62ZXC.js} +1 -1
- package/dist/chunks/{permissions-ZSHKMXBZ.js → permissions-VYJ4LL5R.js} +1 -1
- package/dist/chunks/{plugin-offer-Z6FCPQFD.js → plugin-offer-TEGYA3TA.js} +1 -1
- package/dist/chunks/{prompt-missing-credentials-KOA7C4QC.js → prompt-missing-credentials-VP6OVCFM.js} +1 -1
- package/dist/chunks/publish-2HEK5UMJ.js +15 -0
- package/dist/chunks/pull-WRTTSY7J.js +7 -0
- package/dist/chunks/purchase-domain-if-available-6S3NLTUI.js +7 -0
- package/dist/chunks/push-L3QRGGLC.js +7 -0
- package/dist/chunks/{query-JGPO7TNY.js → query-FXXLX6UB.js} +3 -3
- package/dist/chunks/{reauthenticate-OZRQFR66.js → reauthenticate-IXQDC4UZ.js} +1 -1
- package/dist/chunks/reorder-B4OXSYCI.js +10 -0
- package/dist/chunks/reply-F637K6XH.js +9 -0
- package/dist/chunks/resolve-E3F6NYQZ.js +12 -0
- package/dist/chunks/{resolve-agent-team-KX77HEAF.js → resolve-agent-team-EIPCH766.js} +1 -1
- package/dist/chunks/restore-Q25KRZPH.js +16 -0
- package/dist/chunks/rm-FWD2NUGX.js +8 -0
- package/dist/chunks/rm-JMQ4QKCC.js +8 -0
- package/dist/chunks/rm-PPG7P3GN.js +8 -0
- package/dist/chunks/rm-SH3DYKNS.js +8 -0
- package/dist/chunks/rm-UEBLKFVC.js +8 -0
- package/dist/chunks/{routes-P6LKQCWH.js → routes-PKTWMDWQ.js} +1 -1
- package/dist/chunks/rule-inspect-LKQA5I4V.js +8 -0
- package/dist/chunks/{schema-YOEAK4VX.js → schema-FBV42W7N.js} +1 -1
- package/dist/chunks/{schema-BEUO7G52.js → schema-ZWE5MNMG.js} +1 -1
- package/dist/chunks/{select-org-OMLGQEKK.js → select-org-WMB752Z6.js} +1 -1
- package/dist/chunks/set-UTYIPOLC.js +7 -0
- package/dist/chunks/setup-and-link-ZLY5XQW5.js +7 -0
- package/dist/chunks/{skills-4J2NC2QI.js → skills-RKIGVVNM.js} +2 -2
- package/dist/chunks/{tags-ZXZQEXOV.js → tags-UCLZ5UMX.js} +1 -1
- package/dist/chunks/{types-SK6J2HFE.js → types-YM7TMHXW.js} +1 -1
- package/dist/chunks/{update-25CKNOY5.js → update-BGDQ5TXO.js} +1 -1
- package/dist/commands/build/index.js +1 -1
- package/dist/commands/deploy/index.js +4 -4
- package/dist/commands/dev/index.js +4 -4
- package/dist/commands/env/index.js +1 -1
- package/dist/commands/link/index.js +1 -1
- package/dist/commands/list/index.js +1 -1
- package/dist/commands/project/index.js +8 -8
- package/dist/commands-account.js +8 -8
- package/dist/commands-ai.js +12 -12
- package/dist/commands-blob.js +8 -8
- package/dist/commands-core.js +11 -11
- package/dist/commands-deployments.js +1 -1
- package/dist/commands-flags.js +6 -6
- package/dist/commands-integrations.js +16 -16
- package/dist/commands-observability.js +5 -5
- package/dist/commands-routing.js +18 -18
- package/dist/help.js +1 -1
- package/dist/index.js +5 -3
- package/dist/internal-build.js +1 -1
- package/dist/package.json +60 -61
- package/dist/root-help-commands.mjs +1 -1
- package/dist/vc.js +148 -137
- package/dist/version.mjs +1 -1
- package/package.json +54 -54
- package/dist/chunks/add-5YZQTIQM.js +0 -8
- package/dist/chunks/add-A524QQ2H.js +0 -8
- package/dist/chunks/add-V4JMUHKO.js +0 -8
- package/dist/chunks/build-K2PVDJZ4.js +0 -7
- package/dist/chunks/chunk-3AYYFYZG.js +0 -7
- package/dist/chunks/chunk-5IASAERQ.js +0 -7
- package/dist/chunks/chunk-76KGQU2G.js +0 -7
- package/dist/chunks/chunk-ABZEMNDR.js +0 -7
- package/dist/chunks/chunk-APZULWJC.js +0 -8
- package/dist/chunks/chunk-AWMQGOS2.js +0 -7
- package/dist/chunks/chunk-B4UE4LVE.js +0 -7
- package/dist/chunks/chunk-B4YYOSPY.js +0 -7
- package/dist/chunks/chunk-E2SADN6I.js +0 -7
- package/dist/chunks/chunk-IA3MXJRC.js +0 -8
- package/dist/chunks/chunk-IEPW2YRH.js +0 -7
- package/dist/chunks/chunk-LUBUI5GF.js +0 -7
- package/dist/chunks/chunk-OKEBIUKZ.js +0 -7
- package/dist/chunks/chunk-QZX7VG2V.js +0 -9
- package/dist/chunks/chunk-RUXO73ON.js +0 -7
- package/dist/chunks/chunk-TPNOSQZ3.js +0 -15
- package/dist/chunks/chunk-UNEGQPD3.js +0 -7
- package/dist/chunks/chunk-V7BEC3E4.js +0 -10
- package/dist/chunks/chunk-YHQ7PPXP.js +0 -7
- package/dist/chunks/clear-ZS4KQ7OT.js +0 -8
- package/dist/chunks/config-N2SBVW4T.js +0 -8
- package/dist/chunks/delete-2ZE2NVHI.js +0 -10
- package/dist/chunks/delete-AL57HZDQ.js +0 -9
- package/dist/chunks/disable-MKI3BKNH.js +0 -7
- package/dist/chunks/discard-SI4H7ST3.js +0 -14
- package/dist/chunks/edit-DNWH6SPE.js +0 -8
- package/dist/chunks/edit-WYNWDFUJ.js +0 -9
- package/dist/chunks/enable-J6MMYPYF.js +0 -7
- package/dist/chunks/generate-cert-for-deploy-YZKNGAEQ.js +0 -7
- package/dist/chunks/inspect-H2Q7XOWN.js +0 -13
- package/dist/chunks/inspect-H5JC2XKI.js +0 -9
- package/dist/chunks/list-ELEUTZWJ.js +0 -12
- package/dist/chunks/login-ZF2TLCQB.js +0 -9
- package/dist/chunks/logs-UD7FEXZ7.js +0 -7
- package/dist/chunks/ls-5ZEAKKPQ.js +0 -8
- package/dist/chunks/ls-IXRLAJ4L.js +0 -11
- package/dist/chunks/mutate-OQWOKLIW.js +0 -9
- package/dist/chunks/open-HH6K7ZRC.js +0 -7
- package/dist/chunks/publish-FPNQ2US4.js +0 -15
- package/dist/chunks/pull-7OGOIKB3.js +0 -7
- package/dist/chunks/purchase-domain-if-available-F4LKHVBD.js +0 -7
- package/dist/chunks/push-NY3SIK2C.js +0 -7
- package/dist/chunks/reorder-4J2STFUS.js +0 -10
- package/dist/chunks/reply-EO4NTTPW.js +0 -9
- package/dist/chunks/resolve-RPHHRPNM.js +0 -12
- package/dist/chunks/restore-TEA6TSVK.js +0 -16
- package/dist/chunks/rm-BPILSPUI.js +0 -8
- package/dist/chunks/rm-F6XVUDBM.js +0 -8
- package/dist/chunks/rm-JCPXV2FN.js +0 -8
- package/dist/chunks/rm-LPQRGX7N.js +0 -8
- package/dist/chunks/rm-WHUGT6TE.js +0 -8
- package/dist/chunks/rule-inspect-BOETGPFO.js +0 -8
- package/dist/chunks/set-5XY27S7R.js +0 -7
- package/dist/chunks/setup-and-link-A7M3QT52.js +0 -7
|
@@ -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{sanitizeForTerminal}from"./chunks/chunk-5RMIM4S2.js";import{getCustomEnvironments,pickCustomEnvironment}from"./chunks/chunk-F7AVGV4Y.js";import{extractDatePortion}from"./chunks/chunk-ECQIO5K3.js";import{applyDeprecatedGitBranchFlag}from"./chunks/chunk-CEMPU323.js";import{normalizeRepeatableStringFilters}from"./chunks/chunk-RW3X523R.js";import{selectOrg}from"./chunks/chunk-Y6AGOERS.js";import{require_execa}from"./chunks/chunk-BUJITHGZ.js";import{formatDate}from"./chunks/chunk-HRR57QNP.js";import{elapsed}from"./chunks/chunk-Q7D7RGXM.js";import"./chunks/chunk-FBYA6LLM.js";import{ENV_PULL_FAILED_MESSAGE,VALID_ENVIRONMENTS,connectResourceToProject,getLinkedProjectField,postProvisionSetup,validateEnvironments}from"./chunks/chunk-3KKFLKQG.js";import{indent_default}from"./chunks/chunk-GZNDA6SV.js";import"./chunks/chunk-OWOWPOIE.js";import"./chunks/chunk-YN3C5BL5.js";import"./chunks/chunk-6Y2ZL5XJ.js";import"./chunks/chunk-X4762EE4.js";import"./chunks/chunk-25565AGS.js";import{resolveProjectContext}from"./chunks/chunk-3JGBBS6V.js";import"./chunks/chunk-L4NSF346.js";import{reportRenamedOptionError}from"./chunks/chunk-IEPW2YRH.js";import"./chunks/chunk-7YKFF6CE.js";import"./chunks/chunk-6OVX3PWM.js";import"./chunks/chunk-OQCMRU3J.js";import{require_open}from"./chunks/chunk-PVASGBEF.js";import"./chunks/chunk-BL3HBRF6.js";import"./chunks/chunk-R6BEOVTU.js";import"./chunks/chunk-HCRD3JFL.js";import{canPrompt}from"./chunks/chunk-IQ7FPAI4.js";import"./chunks/chunk-GD7AV7BO.js";import{printNextPageCommand}from"./chunks/chunk-QMCHGGDX.js";import"./chunks/chunk-PFD7LETF.js";import{getInvalidSubcommand}from"./chunks/chunk-TG2RCYTH.js";import{getSubcommand as getSubcommand2}from"./chunks/chunk-ETV3C2CV.js";import{validateLsArgs}from"./chunks/chunk-KW6GSQXV.js";import"./chunks/chunk-SCV7XEEO.js";import{STORAGE_PROVIDERS,acceptTermsSubcommand,addSubcommand6 as addSubcommand,attachSubcommand,balanceSubcommand,categoriesSubcommand,categoriesSubcommand2,claimSubcommand,connectSubcommand2 as connectSubcommand,connectSubcommand3 as connectSubcommand2,connexCommand,contactsAddSubcommand,contactsSubcommand,createSubcommand2 as createSubcommand,createSubcommand9 as createSubcommand2,createThresholdSubcommand,deleteSubcommand4 as deleteSubcommand,detachSubcommand,disconnectSubcommand2 as disconnectSubcommand,disconnectSubcommand3 as disconnectSubcommand2,discoverSubcommand,discoverSubcommand2,findForeignCreateFlags,findOverlappingConnections,getCommandAliases,getConnections,getStorageProvider,getStorageStore,getStorageStores,getSubcommand3 as getSubcommand,guideSubcommand,inspectSubcommand10 as inspectSubcommand,installCommand,installationsSubcommand,integrationCommand,integrationResourceCommand,listStorageProviderTypes,listSubcommand16 as listSubcommand2,listSubcommand22 as listSubcommand3,listSubcommand7 as listSubcommand,loadStoreDetails,openSubcommand,openSubcommand4 as openSubcommand2,removeSubcommand10 as removeSubcommand2,removeSubcommand11 as removeSubcommand3,removeSubcommand5 as removeSubcommand,resolveProjectConnection,resolveStore,resourceSubcommand,revokeTokensSubcommand,statusSubcommand5 as statusSubcommand,storageCommand,storeMatchesType,storeProductLabel,storeSupportsOidc,storeTypeName,tokenSubcommand,updateSubcommand,updateSubcommand12 as updateSubcommand3,updateSubcommand7 as updateSubcommand2,usageCommand}from"./chunks/chunk-TPNOSQZ3.js";import"./chunks/chunk-LUBUI5GF.js";import"./chunks/chunk-GVTXA6HG.js";import"./chunks/chunk-5IASAERQ.js";import"./chunks/chunk-WGXKX24Q.js";import"./chunks/chunk-E2SADN6I.js";import"./chunks/chunk-ABZEMNDR.js";import"./chunks/chunk-3AYYFYZG.js";import"./chunks/chunk-76KGQU2G.js";import"./chunks/chunk-UNEGQPD3.js";import"./chunks/chunk-YHQ7PPXP.js";import"./chunks/chunk-NQWGRKF4.js";import"./chunks/chunk-IGDG5CWT.js";import"./chunks/chunk-QZX7VG2V.js";import"./chunks/chunk-3ADDGPEN.js";import"./chunks/chunk-B4YYOSPY.js";import"./chunks/chunk-PFNYWWLI.js";import"./chunks/chunk-NTZ5WWYV.js";import"./chunks/chunk-JALVF3C2.js";import{envTargetChoices,isValidEnvTarget}from"./chunks/chunk-LJBUJ23M.js";import"./chunks/chunk-OKEBIUKZ.js";import{buildCommandDocumentationLines,help}from"./chunks/chunk-KH6565YH.js";import{table}from"./chunks/chunk-773GOZIR.js";import{printError}from"./chunks/chunk-G4T7VBGN.js";import"./chunks/chunk-67GZ5REA.js";import"./chunks/chunk-BS32OUOC.js";import"./chunks/chunk-3G3FQYMW.js";import{TelemetryClient}from"./chunks/chunk-2PKEEQ5W.js";import"./chunks/chunk-PUKYAALC.js";import{getScope}from"./chunks/chunk-B4UE4LVE.js";import{require_ms}from"./chunks/chunk-MXTC4ZAQ.js";import"./chunks/chunk-NWGBDBZI.js";import"./chunks/chunk-FGFLTLEA.js";import{AGENT_ACTION,AGENT_REASON,AGENT_STATUS,buildCommandWithGlobalFlags,buildCommandWithYes,buildIntegrationCommandTailFromArgv,getExitCodeForReason,outputActionRequired,outputAgentError,shouldEmitNonInteractiveCommandError}from"./chunks/chunk-DGYHWXD2.js";import"./chunks/chunk-IUXSJWL3.js";import{getLinkedProject,getProjectByNameOrId,getProjectLink,sleep}from"./chunks/chunk-KNLGWGUE.js";import{formatAlignedLabel,printAlignedLabel}from"./chunks/chunk-ADLBLGT3.js";import"./chunks/chunk-BBKEP7RO.js";import"./chunks/chunk-4NTBYNFR.js";import{isArgumentError,parseArguments}from"./chunks/chunk-VOCZ34ON.js";import{quoteArg}from"./chunks/chunk-F53OKXYI.js";import{getFlagsSpecification,globalCommandOptions,validateJsonOutput,wantsMachineReadableOutput,warnDeprecatedSubcommand}from"./chunks/chunk-AWMQGOS2.js";import"./chunks/chunk-FUX6LKNP.js";import"./chunks/chunk-OPORM35X.js";import"./chunks/chunk-4SAVH3H7.js";import{APIError,ProjectNotFound,isAPIError}from"./chunks/chunk-6VH56CX2.js";import{getCommandName,getCommandNamePlain,packageName,require_lib}from"./chunks/chunk-JESNVRVR.js";import{output_manager_default}from"./chunks/chunk-XP3FT56R.js";import"./chunks/chunk-BLUPZPAS.js";import{require_dist}from"./chunks/chunk-RM3ZDRYE.js";import"./chunks/chunk-OO572JUC.js";import"./chunks/chunk-D3AHZ5LI.js";import"./chunks/chunk-2GHZGOWT.js";import"./chunks/chunk-YHPPP3SF.js";import{require_source}from"./chunks/chunk-NB2WLB3J.js";import"./chunks/chunk-ISWW3DKF.js";import"./chunks/chunk-BRQUZ5NC.js";import{__toESM}from"./chunks/chunk-BZENIQ7N.js";function serviceTelemetryValue(value){let trimmed=value.trim();if(!trimmed)return null;let authority=trimmed.replace(/^[a-zA-Z][a-zA-Z0-9+.-]*:\/\//,"").split(/[/?#]/,1)[0],atIndex=authority.lastIndexOf("@"),hostPort=atIndex===-1?authority:authority.slice(atIndex+1),host;if(hostPort.startsWith("[")){let end=hostPort.indexOf("]");host=end===-1?hostPort:hostPort.slice(0,end+1)}else host=hostPort.split(":",1)[0];return host?host.toLowerCase():null}var HEX_COLOR_REGEX=/^#[0-9a-fA-F]{6}$/;function isValidHexColor(value){return HEX_COLOR_REGEX.test(value)}function validateHexColor(value,label){if(value!==void 0&&!isValidHexColor(value))throw new Error(`Invalid ${label} "${value}". Expected 6-digit hex like #1A2B3C.`)}var ConnexTelemetryClient=class extends TelemetryClient{trackCliSubcommandDiscover(actual){this.trackCliSubcommand({subcommand:"discover",value:actual})}trackCliSubcommandCategories(actual){this.trackCliSubcommand({subcommand:"categories",value:actual})}trackCliSubcommandCreate(actual){this.trackCliSubcommand({subcommand:"create",value:actual})}trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandToken(actual){this.trackCliSubcommand({subcommand:"token",value:actual})}trackCliSubcommandDelete(actual){this.trackCliSubcommand({subcommand:"delete",value:actual})}trackCliSubcommandOpen(actual){this.trackCliSubcommand({subcommand:"open",value:actual})}trackCliSubcommandContacts(actual){this.trackCliSubcommand({subcommand:"contacts",value:actual})}trackCliSubcommandAttach(actual){this.trackCliSubcommand({subcommand:"attach",value:actual})}trackCliSubcommandDetach(actual){this.trackCliSubcommand({subcommand:"detach",value:actual})}trackCliSubcommandUpdate(actual){this.trackCliSubcommand({subcommand:"update",value:actual})}trackCliSubcommandRevokeTokens(actual){this.trackCliSubcommand({subcommand:"revoke-tokens",value:actual})}trackCliArgumentClient(v){v&&this.trackCliArgument({arg:"client",value:this.redactedValue})}trackCliArgumentId(v){v&&this.trackCliArgument({arg:"id",value:this.redactedValue})}trackCliArgumentService(v){if(v){let value=serviceTelemetryValue(v);this.trackCliArgument({arg:"service",value:value??this.redactedValue})}}trackCliOptionName(v){v&&this.trackCliOption({option:"name",value:this.redactedValue})}trackCliOptionSubject(v){v&&this.trackCliOption({option:"subject",value:v==="user"||v==="app"?v:this.redactedValue})}trackCliOptionInstallationId(v){v&&this.trackCliOption({option:"installation-id",value:this.redactedValue})}trackCliOptionScopes(v){v&&this.trackCliOption({option:"scopes",value:this.redactedValue})}trackCliFlagNoDefaultScopes(v){v&&this.trackCliFlag("no-default-scopes")}trackCliOptionIcon(v){v&&this.trackCliOption({option:"icon",value:this.redactedValue})}trackCliOptionBackgroundColor(v){v&&this.trackCliOption({option:"background-color",value:isValidHexColor(v)?v:this.redactedValue})}trackCliOptionAccentColor(v){v&&this.trackCliOption({option:"accent-color",value:isValidHexColor(v)?v:this.redactedValue})}trackCliOptionData(v){v!==void 0&&this.trackCliOption({option:"data",value:this.redactedValue})}trackCliOptionConnectorType(v){v&&this.trackCliOption({option:"connector-type",value:v})}trackCliOptionConnectionMethod(v){for(let value of[v??[]].flat())value&&this.trackCliOption({option:"connection-method",value})}trackCliOptionTarget(v){for(let value of[v??[]].flat())value&&this.trackCliOption({option:"target",value})}trackCliArgumentQuery(v){v&&this.trackCliArgument({arg:"query",value:this.redactedValue})}trackCliOptionCategory(v){for(let raw of v??[])for(let category of raw.split(","))category.trim()&&this.trackCliOption({option:"category",value:this.redactedValue})}trackCliFlagSupportsTriggers(v){v&&this.trackCliFlag("supports-triggers")}trackCliOptionParam(v){!v||v.length===0||this.trackCliOption({option:"param",value:String(v.length)})}trackCliFlagYes(v){v&&this.trackCliFlag("yes")}trackCliFlagDisconnectAll(v){v&&this.trackCliFlag("disconnect-all")}trackCliFlagTriggers(v){v&&this.trackCliFlag("triggers")}trackCliOptionTriggerEvent(v){v&&v.length>0&&this.trackCliOption({option:"trigger-event",value:String(v.length)})}trackCliOptionGitBranch(v){v&&this.trackCliOption({option:"git-branch",value:this.redactedValue})}trackCliOptionTriggerBranch(v){v&&this.trackCliOption({option:"trigger-branch",value:this.redactedValue})}trackCliOptionTriggerEnvironment(v){v&&this.trackCliOption({option:"trigger-environment",value:this.redactedValue})}trackCliOptionTriggerPath(v){v&&this.trackCliOption({option:"trigger-path",value:this.redactedValue})}trackCliOptionTriggerProject(v){v&&this.trackCliOption({option:"trigger-project",value:this.redactedValue})}trackCliFlagMyTokens(v){v&&this.trackCliFlag("my-tokens")}trackCliFlagAllTokens(v){v&&this.trackCliFlag("all-tokens")}trackCliFlagAllProjects(v){v&&this.trackCliFlag("all-projects")}trackCliOptionLimit(v){v!==void 0&&this.trackCliOption({option:"limit",value:String(v)})}trackCliOptionNext(v){v&&this.trackCliOption({option:"next",value:this.redactedValue})}trackCliOptionSearch(v){v&&this.trackCliOption({option:"search",value:this.redactedValue})}trackCliOptionService(v){if(!(!v||v.length===0))for(let raw of v)for(let svc of raw.split(","))svc.trim()&&this.trackCliOption({option:"service",value:this.redactedValue})}trackCliOptionType(v){if(!(!v||v.length===0))for(let raw of v)for(let t of raw.split(",")){let trimmed=t.trim();trimmed&&this.trackCliOption({option:"type",value:trimmed})}}trackCliOptionFormat(v){v&&this.trackCliOption({option:"format",value:v})}trackCliOptionEnvironment(v){if(!(!v||v.length===0))for(let raw of v)for(let env of raw.split(",")){let trimmed=env.trim();trimmed&&this.trackCliOption({option:"environment",value:this.redactedTargetName(trimmed)})}}};var import_chalk=__toESM(require_source(),1);var DEFAULT_LIMIT=50,MAX_LIMIT=500;function splitValues(values){return(values??[]).flatMap(v=>v.split(",").map(s2=>s2.trim())).filter(Boolean)}async function discover(client,args,flags){let formatResult=validateJsonOutput(flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput;if(args.length>1)return output_manager_default.error(`Too many arguments. Usage: \`${packageName} connect discover [query]\``),2;let query=args[0],limit=flags["--limit"]??DEFAULT_LIMIT;if(!Number.isInteger(limit)||limit<1)return output_manager_default.error("--limit must be a whole number of 1 or more."),2;limit>MAX_LIMIT&&(output_manager_default.warning(`--limit is capped at ${MAX_LIMIT}. Showing ${MAX_LIMIT}.`),limit=MAX_LIMIT);let categories3=splitValues(flags["--category"]),connectionMethods=splitValues(flags["--connection-method"]),targets=splitValues(flags["--target"]),params=new URLSearchParams;query&¶ms.set("query",query),categories3.length&¶ms.set("category",categories3.join(",")),connectionMethods.length&¶ms.set("connectionMethod",connectionMethods.join(",")),targets.length&¶ms.set("target",targets.join(",")),flags["--supports-triggers"]&¶ms.set("supportsTriggers","true"),params.set("limit",String(limit)),flags["--next"]&¶ms.set("cursor",flags["--next"]),output_manager_default.spinner("Fetching services\u2026");let response;try{response=await client.fetch(`/v1/connect/services?${params}`,{teamOptional:!0})}catch(err){return output_manager_default.stopSpinner(),printError(err,client),1}output_manager_default.stopSpinner();let services=response.services??[],next=response.pagination?.next??null;if(services.length===0){let unknown=await unknownCategories(client,categories3);if(unknown.length>0)return output_manager_default.error(`Unknown ${unknown.length===1?"category":"categories"}: ${unknown.map(c=>`"${sanitizeForTerminal(c)}"`).join(", ")}. Run \`${packageName} connect categories\` to see the valid slugs.`),2}if(asJson){let jsonServices=services.map(s2=>({service:s2.service,name:s2.name,description:s2.description??null,categories:s2.categories,connectionMethods:(s2.connectionMethods??[]).map(m=>m.connectionMethod),targets:(s2.targets??[]).map(t=>t.target),supportsTriggers:s2.supportsTriggers,beta:s2.beta===!0,website:s2.website??null,docsite:s2.docsite??null}));return client.stdout.write(`${JSON.stringify({services:jsonServices,pagination:{next}},null,2)}
|
|
7
|
+
import{sanitizeForTerminal}from"./chunks/chunk-5RMIM4S2.js";import{getCustomEnvironments,pickCustomEnvironment}from"./chunks/chunk-F7AVGV4Y.js";import{extractDatePortion}from"./chunks/chunk-ECQIO5K3.js";import{applyDeprecatedGitBranchFlag}from"./chunks/chunk-EU2GBIPC.js";import{normalizeRepeatableStringFilters}from"./chunks/chunk-RW3X523R.js";import{selectOrg}from"./chunks/chunk-7L5QUDUR.js";import{require_execa}from"./chunks/chunk-BUJITHGZ.js";import{formatDate}from"./chunks/chunk-HRR57QNP.js";import{elapsed}from"./chunks/chunk-Q7D7RGXM.js";import"./chunks/chunk-FBYA6LLM.js";import{ENV_PULL_FAILED_MESSAGE,VALID_ENVIRONMENTS,connectResourceToProject,getLinkedProjectField,postProvisionSetup,validateEnvironments}from"./chunks/chunk-KY335KWI.js";import{indent_default}from"./chunks/chunk-GZNDA6SV.js";import"./chunks/chunk-L3JYCXVB.js";import"./chunks/chunk-C7FQMC6D.js";import"./chunks/chunk-6Y2ZL5XJ.js";import"./chunks/chunk-7QAGSRCU.js";import"./chunks/chunk-25565AGS.js";import{resolveProjectContext}from"./chunks/chunk-JP33AIDQ.js";import"./chunks/chunk-WEH6XC4Y.js";import"./chunks/chunk-7YKFF6CE.js";import"./chunks/chunk-6OVX3PWM.js";import"./chunks/chunk-HTXDC7E2.js";import{require_open}from"./chunks/chunk-PVASGBEF.js";import"./chunks/chunk-2TUVL6WE.js";import"./chunks/chunk-R6BEOVTU.js";import"./chunks/chunk-HCRD3JFL.js";import{canPrompt}from"./chunks/chunk-IQ7FPAI4.js";import"./chunks/chunk-GD7AV7BO.js";import{printNextPageCommand}from"./chunks/chunk-VNIKIQVE.js";import"./chunks/chunk-PFD7LETF.js";import{getInvalidSubcommand}from"./chunks/chunk-TG2RCYTH.js";import{getRenamedOption,reportRenamedOptionError,withWarnings}from"./chunks/chunk-T6243EDS.js";import{getSubcommand as getSubcommand2}from"./chunks/chunk-ETV3C2CV.js";import{validateLsArgs}from"./chunks/chunk-KW6GSQXV.js";import"./chunks/chunk-FGFLTLEA.js";import"./chunks/chunk-SCV7XEEO.js";import{STORAGE_PROVIDERS,acceptTermsSubcommand,addSubcommand6 as addSubcommand,attachSubcommand,balanceSubcommand,categoriesSubcommand,categoriesSubcommand2,claimSubcommand,connectSubcommand2 as connectSubcommand,connectSubcommand3 as connectSubcommand2,connexCommand,contactsAddSubcommand,contactsSubcommand,createSubcommand2 as createSubcommand,createSubcommand9 as createSubcommand2,createThresholdSubcommand,deleteSubcommand4 as deleteSubcommand,detachSubcommand,disconnectSubcommand2 as disconnectSubcommand,disconnectSubcommand3 as disconnectSubcommand2,discoverSubcommand,discoverSubcommand2,findForeignCreateFlags,findOverlappingConnections,getCommandAliases,getConnections,getStorageProvider,getStorageStore,getStorageStores,getSubcommand3 as getSubcommand,guideSubcommand,inspectSubcommand10 as inspectSubcommand,installCommand,installationsSubcommand,integrationCommand,integrationResourceCommand,listStorageProviderTypes,listSubcommand16 as listSubcommand2,listSubcommand22 as listSubcommand3,listSubcommand7 as listSubcommand,loadStoreDetails,openSubcommand,openSubcommand4 as openSubcommand2,removeSubcommand10 as removeSubcommand2,removeSubcommand11 as removeSubcommand3,removeSubcommand5 as removeSubcommand,resolveProjectConnection,resolveStore,resourceSubcommand,revokeTokensSubcommand,statusSubcommand5 as statusSubcommand,storageCommand,storeMatchesType,storeProductLabel,storeSupportsOidc,storeTypeName,tokenSubcommand,updateSubcommand,updateSubcommand12 as updateSubcommand3,updateSubcommand7 as updateSubcommand2,usageCommand}from"./chunks/chunk-O4WNSKQR.js";import"./chunks/chunk-6I6QJHCY.js";import"./chunks/chunk-EKZTFGDX.js";import"./chunks/chunk-462YCCJZ.js";import"./chunks/chunk-WVHCBDTB.js";import"./chunks/chunk-TAISZMA2.js";import"./chunks/chunk-527GBU3K.js";import"./chunks/chunk-CR3NBTHV.js";import"./chunks/chunk-BVGGTBYE.js";import"./chunks/chunk-6TXEVQA4.js";import"./chunks/chunk-5KUUMQ3M.js";import"./chunks/chunk-UHBMX3OK.js";import"./chunks/chunk-EEUJLJEJ.js";import"./chunks/chunk-NW7WWUCQ.js";import"./chunks/chunk-F6EBOT64.js";import"./chunks/chunk-LFOWP74R.js";import"./chunks/chunk-LOBA3E72.js";import"./chunks/chunk-7R6TRRG5.js";import"./chunks/chunk-JALVF3C2.js";import{envTargetChoices,isValidEnvTarget}from"./chunks/chunk-OZCQTXI4.js";import"./chunks/chunk-FSPPKNKN.js";import{buildCommandDocumentationLines,help}from"./chunks/chunk-FLHO75XC.js";import{table}from"./chunks/chunk-773GOZIR.js";import{printError}from"./chunks/chunk-HSFKISDH.js";import"./chunks/chunk-67GZ5REA.js";import"./chunks/chunk-BS32OUOC.js";import"./chunks/chunk-3G3FQYMW.js";import{TelemetryClient}from"./chunks/chunk-6YXIWZ3X.js";import"./chunks/chunk-PUKYAALC.js";import{getScope}from"./chunks/chunk-K5U47EVH.js";import{require_ms}from"./chunks/chunk-MXTC4ZAQ.js";import"./chunks/chunk-NWGBDBZI.js";import{AGENT_ACTION,AGENT_REASON,AGENT_STATUS,buildCommandWithGlobalFlags,buildCommandWithYes,buildIntegrationCommandTailFromArgv,getExitCodeForReason,outputActionRequired,outputAgentError,shouldEmitNonInteractiveCommandError}from"./chunks/chunk-WDXW6A4H.js";import"./chunks/chunk-DKJL2KV7.js";import{getLinkedProject,getProjectByNameOrId,getProjectLink,sleep}from"./chunks/chunk-4N6LMERQ.js";import{formatAlignedLabel,printAlignedLabel}from"./chunks/chunk-ADLBLGT3.js";import"./chunks/chunk-CWM2F235.js";import"./chunks/chunk-4NTBYNFR.js";import{getTypedOptionName,isArgumentError,parseArguments}from"./chunks/chunk-KCKYPLIH.js";import{quoteArg}from"./chunks/chunk-F53OKXYI.js";import{getFlagsSpecification,globalCommandOptions,validateJsonOutput,wantsMachineReadableOutput,warnDeprecatedSubcommand}from"./chunks/chunk-QVXS234E.js";import"./chunks/chunk-FUX6LKNP.js";import"./chunks/chunk-OPORM35X.js";import"./chunks/chunk-4SAVH3H7.js";import{APIError,ProjectNotFound,isAPIError}from"./chunks/chunk-6VH56CX2.js";import{getCommandName,getCommandNamePlain,packageName,require_lib}from"./chunks/chunk-JESNVRVR.js";import{output_manager_default}from"./chunks/chunk-XP3FT56R.js";import"./chunks/chunk-BLUPZPAS.js";import{require_dist}from"./chunks/chunk-RM3ZDRYE.js";import"./chunks/chunk-OO572JUC.js";import"./chunks/chunk-D3AHZ5LI.js";import"./chunks/chunk-2GHZGOWT.js";import"./chunks/chunk-YHPPP3SF.js";import{require_source}from"./chunks/chunk-NB2WLB3J.js";import"./chunks/chunk-ISWW3DKF.js";import"./chunks/chunk-BRQUZ5NC.js";import{__toESM}from"./chunks/chunk-BZENIQ7N.js";function serviceTelemetryValue(value){let trimmed=value.trim();if(!trimmed)return null;let authority=trimmed.replace(/^[a-zA-Z][a-zA-Z0-9+.-]*:\/\//,"").split(/[/?#]/,1)[0],atIndex=authority.lastIndexOf("@"),hostPort=atIndex===-1?authority:authority.slice(atIndex+1),host;if(hostPort.startsWith("[")){let end=hostPort.indexOf("]");host=end===-1?hostPort:hostPort.slice(0,end+1)}else host=hostPort.split(":",1)[0];return host?host.toLowerCase():null}var HEX_COLOR_REGEX=/^#[0-9a-fA-F]{6}$/;function isValidHexColor(value){return HEX_COLOR_REGEX.test(value)}function validateHexColor(value,label){if(value!==void 0&&!isValidHexColor(value))throw new Error(`Invalid ${label} "${value}". Expected 6-digit hex like #1A2B3C.`)}var ConnexTelemetryClient=class extends TelemetryClient{trackCliSubcommandDiscover(actual){this.trackCliSubcommand({subcommand:"discover",value:actual})}trackCliSubcommandCategories(actual){this.trackCliSubcommand({subcommand:"categories",value:actual})}trackCliSubcommandCreate(actual){this.trackCliSubcommand({subcommand:"create",value:actual})}trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandToken(actual){this.trackCliSubcommand({subcommand:"token",value:actual})}trackCliSubcommandDelete(actual){this.trackCliSubcommand({subcommand:"delete",value:actual})}trackCliSubcommandOpen(actual){this.trackCliSubcommand({subcommand:"open",value:actual})}trackCliSubcommandContacts(actual){this.trackCliSubcommand({subcommand:"contacts",value:actual})}trackCliSubcommandAttach(actual){this.trackCliSubcommand({subcommand:"attach",value:actual})}trackCliSubcommandDetach(actual){this.trackCliSubcommand({subcommand:"detach",value:actual})}trackCliSubcommandUpdate(actual){this.trackCliSubcommand({subcommand:"update",value:actual})}trackCliSubcommandRevokeTokens(actual){this.trackCliSubcommand({subcommand:"revoke-tokens",value:actual})}trackCliArgumentClient(v){v&&this.trackCliArgument({arg:"client",value:this.redactedValue})}trackCliArgumentId(v){v&&this.trackCliArgument({arg:"id",value:this.redactedValue})}trackCliArgumentService(v){if(v){let value=serviceTelemetryValue(v);this.trackCliArgument({arg:"service",value:value??this.redactedValue})}}trackCliOptionName(v){v&&this.trackCliOption({option:"name",value:this.redactedValue})}trackCliOptionSubject(v){v&&this.trackCliOption({option:"subject",value:v==="user"||v==="app"?v:this.redactedValue})}trackCliOptionInstallation(v){v&&this.trackCliOption({option:"installation",value:this.redactedValue})}trackCliOptionInstallationId(v){v&&this.trackCliOption({option:"installation-id",value:this.redactedValue})}trackCliOptionScopes(v){v&&this.trackCliOption({option:"scopes",value:this.redactedValue})}trackCliFlagNoDefaultScopes(v){v&&this.trackCliFlag("no-default-scopes")}trackCliOptionIcon(v){v&&this.trackCliOption({option:"icon",value:this.redactedValue})}trackCliOptionBackgroundColor(v){v&&this.trackCliOption({option:"background-color",value:isValidHexColor(v)?v:this.redactedValue})}trackCliOptionAccentColor(v){v&&this.trackCliOption({option:"accent-color",value:isValidHexColor(v)?v:this.redactedValue})}trackCliOptionData(v){v!==void 0&&this.trackCliOption({option:"data",value:this.redactedValue})}trackCliOptionConnectorType(v){v&&this.trackCliOption({option:"connector-type",value:v})}trackCliOptionConnectionMethod(v){for(let value of[v??[]].flat())value&&this.trackCliOption({option:"connection-method",value})}trackCliOptionTarget(v){for(let value of[v??[]].flat())value&&this.trackCliOption({option:"target",value})}trackCliArgumentQuery(v){v&&this.trackCliArgument({arg:"query",value:this.redactedValue})}trackCliOptionCategory(v){for(let raw of v??[])for(let category of raw.split(","))category.trim()&&this.trackCliOption({option:"category",value:this.redactedValue})}trackCliFlagSupportsTriggers(v){v&&this.trackCliFlag("supports-triggers")}trackCliOptionParam(v){!v||v.length===0||this.trackCliOption({option:"param",value:String(v.length)})}trackCliFlagYes(v){v&&this.trackCliFlag("yes")}trackCliFlagDisconnectAll(v){v&&this.trackCliFlag("disconnect-all")}trackCliFlagTriggers(v){v&&this.trackCliFlag("triggers")}trackCliOptionTriggerEvent(v){v&&v.length>0&&this.trackCliOption({option:"trigger-event",value:String(v.length)})}trackCliOptionGitBranch(v){v&&this.trackCliOption({option:"git-branch",value:this.redactedValue})}trackCliOptionTriggerBranch(v){v&&this.trackCliOption({option:"trigger-branch",value:this.redactedValue})}trackCliOptionTriggerEnvironment(v){v&&this.trackCliOption({option:"trigger-environment",value:this.redactedValue})}trackCliOptionTriggerPath(v){v&&this.trackCliOption({option:"trigger-path",value:this.redactedValue})}trackCliOptionTriggerProject(v){v&&this.trackCliOption({option:"trigger-project",value:this.redactedValue})}trackCliFlagMyTokens(v){v&&this.trackCliFlag("my-tokens")}trackCliFlagAllTokens(v){v&&this.trackCliFlag("all-tokens")}trackCliFlagAllProjects(v){v&&this.trackCliFlag("all-projects")}trackCliOptionLimit(v){v!==void 0&&this.trackCliOption({option:"limit",value:String(v)})}trackCliOptionNext(v){v&&this.trackCliOption({option:"next",value:this.redactedValue})}trackCliOptionQuery(v){v&&this.trackCliOption({option:"query",value:this.redactedValue})}trackCliOptionSearch(v){v&&this.trackCliOption({option:"search",value:this.redactedValue})}trackCliOptionService(v){if(!(!v||v.length===0))for(let raw of v)for(let svc of raw.split(","))svc.trim()&&this.trackCliOption({option:"service",value:this.redactedValue})}trackCliOptionType(v){if(!(!v||v.length===0))for(let raw of v)for(let t of raw.split(",")){let trimmed=t.trim();trimmed&&this.trackCliOption({option:"type",value:trimmed})}}trackCliOptionFormat(v){v&&this.trackCliOption({option:"format",value:v})}trackCliOptionEnvironment(v){if(!(!v||v.length===0))for(let raw of v)for(let env of raw.split(",")){let trimmed=env.trim();trimmed&&this.trackCliOption({option:"environment",value:this.redactedTargetName(trimmed)})}}};var import_chalk=__toESM(require_source(),1);var DEFAULT_LIMIT=50,MAX_LIMIT=500;function splitValues(values){return(values??[]).flatMap(v=>v.split(",").map(s2=>s2.trim())).filter(Boolean)}async function discover(client,args,flags){let formatResult=validateJsonOutput(flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput;if(args.length>1)return output_manager_default.error(`Too many arguments. Usage: \`${packageName} connect discover [query]\``),2;let query=args[0],limit=flags["--limit"]??DEFAULT_LIMIT;if(!Number.isInteger(limit)||limit<1)return output_manager_default.error("--limit must be a whole number of 1 or more."),2;limit>MAX_LIMIT&&(output_manager_default.warning(`--limit is capped at ${MAX_LIMIT}. Showing ${MAX_LIMIT}.`),limit=MAX_LIMIT);let categories3=splitValues(flags["--category"]),connectionMethods=splitValues(flags["--connection-method"]),targets=splitValues(flags["--target"]),params=new URLSearchParams;query&¶ms.set("query",query),categories3.length&¶ms.set("category",categories3.join(",")),connectionMethods.length&¶ms.set("connectionMethod",connectionMethods.join(",")),targets.length&¶ms.set("target",targets.join(",")),flags["--supports-triggers"]&¶ms.set("supportsTriggers","true"),params.set("limit",String(limit)),flags["--next"]&¶ms.set("cursor",flags["--next"]),output_manager_default.spinner("Fetching services\u2026");let response;try{response=await client.fetch(`/v1/connect/services?${params}`,{teamOptional:!0})}catch(err){return output_manager_default.stopSpinner(),printError(err,client),1}output_manager_default.stopSpinner();let services=response.services??[],next=response.pagination?.next??null;if(services.length===0){let unknown=await unknownCategories(client,categories3);if(unknown.length>0)return output_manager_default.error(`Unknown ${unknown.length===1?"category":"categories"}: ${unknown.map(c=>`"${sanitizeForTerminal(c)}"`).join(", ")}. Run \`${packageName} connect categories\` to see the valid slugs.`),2}if(asJson){let jsonServices=services.map(s2=>({service:s2.service,name:s2.name,description:s2.description??null,categories:s2.categories,connectionMethods:(s2.connectionMethods??[]).map(m=>m.connectionMethod),targets:(s2.targets??[]).map(t=>t.target),supportsTriggers:s2.supportsTriggers,beta:s2.beta===!0,website:s2.website??null,docsite:s2.docsite??null}));return client.stdout.write(`${JSON.stringify({services:jsonServices,pagination:{next}},null,2)}
|
|
8
8
|
`),0}if(services.length===0)return output_manager_default.log(query?`No services matching "${sanitizeForTerminal(query)}" found.`:"No services found."),0;let useCompactFormat=client.stderr.columns>0&&client.stderr.columns<120;if(output_manager_default.print(`${useCompactFormat?formatCompactList(services):formatTable(services)}
|
|
9
9
|
`),output_manager_default.log(`Run \`${packageName} connect create <service>\` to create a connector.`),next){let parts=[`${packageName} connect discover`];query&&parts.push(JSON.stringify(query));for(let c of categories3)parts.push(`--category ${c}`);for(let m of connectionMethods)parts.push(`--connection-method ${m}`);for(let t of targets)parts.push(`--target ${t}`);flags["--supports-triggers"]&&parts.push("--supports-triggers"),flags["--limit"]!==void 0&&parts.push(`--limit ${limit}`),parts.push(`--next ${next}`),output_manager_default.print(`
|
|
10
10
|
`),printNextPageCommand(parts.join(" "))}return 0}function methodsOf(s2){let methods=(s2.connectionMethods??[]).map(m=>m.connectionMethod);return methods.length?methods.join(", "):import_chalk.default.gray("\u2013")}async function unknownCategories(client,categories3){if(categories3.length===0)return[];try{let response=await client.fetch("/v1/connect/services/categories",{teamOptional:!0}),known=new Set((response.categories??[]).map(c=>c.slug));return categories3.filter(c=>!known.has(c))}catch{return[]}}function formatTable(services){return table([["Service","Name","Methods","Description"].map(h=>import_chalk.default.bold(import_chalk.default.cyan(h))),...services.map(s2=>[sanitizeForTerminal(s2.service),sanitizeForTerminal(s2.name),methodsOf(s2),s2.description?sanitizeForTerminal(s2.description):import_chalk.default.gray("\u2013")])],{hsep:4})}function formatCompactList(services){return services.map(s2=>[`${import_chalk.default.bold(sanitizeForTerminal(s2.name))} (${sanitizeForTerminal(s2.service)})`,` Methods: ${methodsOf(s2)}`,` Description: ${s2.description?sanitizeForTerminal(s2.description):"\u2013"}`].join(`
|
|
@@ -35,11 +35,11 @@ ${documentationLines}`),!0}function formatTargets(serviceName,targets,width){let
|
|
|
35
35
|
`)}function formatMethods(serviceName,methods,targets,width){let lines=["",` ${import_chalk4.default.dim(`Connection methods for ${serviceName}:`)}`,""];for(let method of methods){let badge=createPathBadge(method);lines.push(` ${import_chalk4.default.bold(method.connectionMethod)} ${method.label}${badge?import_chalk4.default.dim(` \u2014 ${badge}`):""}`);for(let line of describeLines(method.description,void 0,width))lines.push(line);let connectsTo=(method.targets??[]).map(slug=>targets.find(t=>t.target===slug)?.label??slug).join(", ");connectsTo&&targets.length>1&&lines.push(indented(`Connects to: ${connectsTo}`));let registerUrl=method.settingsUrl??method.docUrl;registerUrl&&method.create.manual&&lines.push(indented(`Get credentials at ${import_chalk4.default.cyan(registerUrl)}`));for(let field of method.templateFields??[]){let detail=field.default?`${field.label} (default: ${field.default})`:field.placeholder?`${field.label} \xB7 e.g. ${field.placeholder}`:field.label;lines.push(indented(`--param ${field.key}=<value> ${import_chalk4.default.dim(detail)}`))}if(method.instructions)for(let line of wrapPlain(connexMarkdownToPlainText(method.instructions),width-6))lines.push(indented(import_chalk4.default.dim(line)));let credentials=method.create.manual?describeCredentialFields(method):void 0;if(credentials){let prefix=method.create.managed===!0?"Or bring your own: --data":"--data";lines.push(indented(`${prefix} with ${import_chalk4.default.dim(credentials)}`))}lines.push("")}return lines.join(`
|
|
36
36
|
`)}function formatExamples(service,methods){let lines=["",` ${import_chalk4.default.dim("Examples:")}`];for(let method of methods){let parts=[packageName,COMMAND,service,"--connection-method",method.connectionMethod];for(let field of method.templateFields??[])parts.push("--param",`${field.key}=${field.placeholder??"<value>"}`);parts.push("--name",`${service}-${method.connectionMethod}`),!(method.create.managed===!0)&&method.create.manual&&parts.push("--data","@credentials.json"),lines.push(""),lines.push(` ${import_chalk4.default.dim("-")} Connect with ${method.label}`),lines.push(""),lines.push(` ${import_chalk4.default.cyan(`$ ${parts.join(" ")}`)}`)}return lines.push(""),lines.push(` ${import_chalk4.default.dim(`Run \`${packageName} ${COMMAND} --help\` for all options.`)}`),lines.push(""),lines.join(`
|
|
37
37
|
`)}function describeLines(description,docsUrl,width){let lines=[];if(description)for(let line of wrapPlain(description,width-6))lines.push(indented(import_chalk4.default.dim(line)));return docsUrl&&lines.push(indented(import_chalk4.default.dim(`Docs: ${docsUrl}`))),lines}function indented(text2){return` ${text2}`}var import_chalk5=__toESM(require_source(),1);async function update(client,args,flags){let formatResult=validateJsonOutput(flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput,clientIdOrUid=args[0];if(!clientIdOrUid)return output_manager_default.error("Missing connector ID or UID. Usage: vercel connect update <id>"),2;let iconFlag=flags["--icon"],backgroundColor=flags["--background-color"],accentColor=flags["--accent-color"];if(iconFlag!==void 0&&iconFlag.length===0)return output_manager_default.error("Icon path cannot be empty."),1;try{validateHexColor(backgroundColor,"background color"),validateHexColor(accentColor,"accent color")}catch(err){return output_manager_default.error(err.message),1}if(iconFlag===void 0&&backgroundColor===void 0&&accentColor===void 0)return output_manager_default.error("Specify at least one of: --icon, --background-color, --accent-color."),2;let preparedIcon;if(iconFlag)try{preparedIcon=await prepareConnexIcon(iconFlag,client.cwd)}catch(err){return output_manager_default.error(err.message),1}if(await selectConnexTeam(client,"Select the team for this connector"),preparedIcon){try{output_manager_default.spinner("Verifying connector..."),await client.fetch(`/v1/connect/connectors/${encodeURIComponent(clientIdOrUid)}`)}catch(err){return output_manager_default.stopSpinner(),err.status===404?output_manager_default.error(`Connector not found: ${import_chalk5.default.bold(clientIdOrUid)}`):output_manager_default.error(`Failed to verify ${import_chalk5.default.bold(clientIdOrUid)}: ${err.message}`),1}output_manager_default.stopSpinner()}let iconSha;if(preparedIcon){try{output_manager_default.spinner("Uploading icon..."),iconSha=await uploadConnexIcon(client,preparedIcon)}catch(err){return output_manager_default.stopSpinner(),output_manager_default.error(err.message),1}output_manager_default.stopSpinner()}let body={};iconSha&&(body.icon=iconSha),backgroundColor&&(body.backgroundColor=backgroundColor),accentColor&&(body.accentColor=accentColor);let updated;try{output_manager_default.spinner("Updating connector..."),updated=await client.fetch(`/v1/connect/connectors/${encodeURIComponent(clientIdOrUid)}`,{method:"PATCH",body})}catch(err){return output_manager_default.stopSpinner(),err.status===404?(output_manager_default.error(`Connector not found: ${import_chalk5.default.bold(clientIdOrUid)}`),1):(output_manager_default.error(`Failed to update ${import_chalk5.default.bold(clientIdOrUid)}: ${err.message}`),1)}if(output_manager_default.stopSpinner(),asJson)client.stdout.write(`${JSON.stringify({id:updated.id,uid:updated.uid,type:updated.type,name:updated.name,icon:updated.icon??null,backgroundColor:updated.backgroundColor??null,accentColor:updated.accentColor??null},null,2)}
|
|
38
|
-
`);else{let displayName=updated.uid||updated.id;output_manager_default.success(`Connector ${import_chalk5.default.bold(displayName)} updated.`)}return 0}var import_chalk6=__toESM(require_source(),1);async function list(client,flags){let formatResult=validateJsonOutput(flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput,allProjects=flags["--all-projects"]===!0,types=(flags["--type"]??[]).flatMap(v=>v.split(",").map(s2=>s2.trim().toLowerCase())).filter(Boolean),services=(flags["--service"]??[]).flatMap(v=>v.split(",").map(s2=>s2.trim().toLowerCase())).filter(Boolean),
|
|
38
|
+
`);else{let displayName=updated.uid||updated.id;output_manager_default.success(`Connector ${import_chalk5.default.bold(displayName)} updated.`)}return 0}var import_chalk6=__toESM(require_source(),1);async function list(client,flags){let formatResult=validateJsonOutput(flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput,allProjects=flags["--all-projects"]===!0,types=(flags["--type"]??[]).flatMap(v=>v.split(",").map(s2=>s2.trim().toLowerCase())).filter(Boolean),services=(flags["--service"]??[]).flatMap(v=>v.split(",").map(s2=>s2.trim().toLowerCase())).filter(Boolean),search=getRenamedOption(flags,"--query","--search",{json:asJson});if("error"in search)return reportRenamedOptionError(client,search.error,{json:asJson});let searchQuery=search.value,projectId,projectName;if(!allProjects){let linked=await getLinkedProject(client);if(linked.status==="error")return linked.exitCode;linked.status==="linked"&&(linked.org.type==="team"?client.config.currentTeam=linked.org.id:client.config.currentTeam=void 0,projectId=linked.project.id,projectName=linked.project.name)}let unscoped=!projectId;unscoped&&await selectConnexTeam(client,"Select the team whose connectors you want to list");let params=new URLSearchParams;flags["--limit"]!==void 0&¶ms.set("limit",String(flags["--limit"])),flags["--next"]&¶ms.set("cursor",flags["--next"]),unscoped?params.set("include","projects"):projectId&¶ms.set("projectId",projectId),types.length>0&¶ms.set("type",types.join(",")),services.length>0&¶ms.set("service",services.join(",")),searchQuery&¶ms.set("search",searchQuery);let query=params.toString(),url=`/v1/connect/connectors${query?`?${query}`:""}`;output_manager_default.spinner("Fetching connectors\u2026");let response;try{response=await client.fetch(url)}catch(err){return output_manager_default.stopSpinner(),err.status===404?(output_manager_default.error("Connect is not enabled for this team. Contact support to enable it."),1):(printError(err,client),1)}output_manager_default.stopSpinner();let clients=response.clients??[];if(asJson){let jsonClients=clients.map(c=>{let item={uid:c.uid,id:c.id,name:c.name,type:c.type,typeName:c.typeName,createdAt:c.createdAt,icon:c.icon??null,backgroundColor:c.backgroundColor??null,accentColor:c.accentColor??null};if(unscoped){let projectsInclude=c.includes?.projects;item.projects=(projectsInclude?.items??[]).map(p=>p.project).filter(p=>!!p),item.hasMoreProjects=projectsInclude?.hasMore===!0}return item});return client.stdout.write(`${JSON.stringify(withWarnings({connectors:jsonClients,cursor:response.cursor,pagination:{next:response.cursor??null}},[search.warning]),null,2)}
|
|
39
39
|
`),0}if(clients.length===0)return unscoped?output_manager_default.log(`No connectors found. Create one with \`${packageName} connect create <type>\`.`):output_manager_default.log(`No connectors linked to ${import_chalk6.default.bold(projectName??"this project")}. Run \`${packageName} connect list --all-projects\` to see every connector in the team.`),0;!unscoped&&projectName&&output_manager_default.log(`Connectors linked to ${import_chalk6.default.bold(projectName)}:`);let headers=["UID","ID","Name","Type"];unscoped&&headers.push("Projects");let rows=clients.map(c=>{let row=[sanitizeForTerminal(c.uid||"")||import_chalk6.default.gray("\u2013"),c.id,sanitizeForTerminal(c.name||"")||import_chalk6.default.gray("\u2013"),sanitizeForTerminal(c.typeName||c.type)];if(unscoped){let projectsInclude=c.includes?.projects,names=(projectsInclude?.items??[]).map(p=>p.project?.name).filter(n2=>!!n2).map(sanitizeForTerminal),more=projectsInclude?.hasMore===!0,cell;if(names.length===0&&!more)cell=import_chalk6.default.gray("\u2013");else{let parts=[];names.length&&parts.push(names.join(", ")),more&&parts.push(import_chalk6.default.gray("+ more")),cell=parts.join(" ")}row.push(cell)}return row});if(output_manager_default.print(`${table([headers.map(h=>import_chalk6.default.bold(import_chalk6.default.cyan(h))),...rows],{hsep:4})}
|
|
40
|
-
`),response.cursor){let parts=[`${packageName} connect list`];allProjects&&parts.push("--all-projects");for(let t of types)parts.push(`--type ${t}`);for(let s2 of services)parts.push(`--service ${s2}`);searchQuery&&parts.push(`--
|
|
41
|
-
`),printNextPageCommand(parts.join(" "))}return 0}var import_open2=__toESM(require_open(),1);async function token(client,args,flags){let formatResult=validateJsonOutput(flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput,clientId=args[0];if(!clientId)return output_manager_default.error("Missing connector ID or UID. Usage: vercel connect token <id>"),2;let subject=flags["--subject"];if(subject&&subject!=="app"&&subject!=="user")return output_manager_default.error('Invalid --subject value. Must be "app" or "user".'),2;await selectConnexTeam(client,"Select the team for this token request");let tokenParams={};
|
|
42
|
-
${actionUrl}`),(0,import_open2.default)(actionUrl).catch(err=>output_manager_default.debug(`Failed to open browser: ${err}`)),output_manager_default.spinner(`Waiting for ${actionLabel} to complete in the browser...`);let pollData=await awaitConnexResult(client,verifier);if(output_manager_default.stopSpinner(),!pollData)return 1;let retryBody={...body};pollData.installationId&&!retryBody.installationId&&(retryBody.installationId=pollData.installationId),output_manager_default.spinner("Fetching token...");let retryResult=await fetchToken(client,clientId,retryBody);return output_manager_default.stopSpinner(),retryResult.ok?printTokenResult(client,retryResult.data,asJson):(output_manager_default.error(retryResult.errorMessage??`Failed to get token after ${actionLabel}`),1)}function parseScopes(raw){return raw.split(/[\s,]+/).map(s2=>s2.trim()).filter(Boolean)}function isActionable(code){return code==="user_authorization_required"||code==="client_installation_required"}function buildActionUrl(code,clientId,teamId,requestCode,tokenParams){let path=code==="user_authorization_required"?"authorize":"install",params=new URLSearchParams({teamId,request_code:requestCode});for(let[key,value]of Object.entries(tokenParams))value!==void 0&¶ms.set(key,Array.isArray(value)?value.join(","):value);return`https://vercel.com/api/v1/connect/${path}/${encodeURIComponent(clientId)}?${params.toString()}`}function printTokenResult(client,data,asJson){return asJson?client.stdout.write(`${JSON.stringify(data,null,2)}
|
|
40
|
+
`),response.cursor){let parts=[`${packageName} connect list`];allProjects&&parts.push("--all-projects");for(let t of types)parts.push(`--type ${t}`);for(let s2 of services)parts.push(`--service ${s2}`);searchQuery&&parts.push(`--query "${searchQuery}"`),parts.push(`--next ${response.cursor}`),output_manager_default.print(`
|
|
41
|
+
`),printNextPageCommand(parts.join(" "))}return 0}var import_open2=__toESM(require_open(),1);async function token(client,args,flags){let formatResult=validateJsonOutput(flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput,installation=getRenamedOption(flags,"--installation","--installation-id",{json:asJson});if("error"in installation)return reportRenamedOptionError(client,installation.error,{json:asJson});let clientId=args[0];if(!clientId)return output_manager_default.error("Missing connector ID or UID. Usage: vercel connect token <id>"),2;let subject=flags["--subject"];if(subject&&subject!=="app"&&subject!=="user")return output_manager_default.error('Invalid --subject value. Must be "app" or "user".'),2;await selectConnexTeam(client,"Select the team for this token request");let tokenParams={};installation.value&&(tokenParams.installationId=installation.value),flags["--scopes"]?tokenParams.scopes=parseScopes(flags["--scopes"]):flags["--no-default-scopes"]||(tokenParams.scopes=["*"]);let body={...tokenParams};subject==="app"?body.subject={type:"app"}:subject==="user"&&(body.subject={type:"user",id:client.authConfig.userId}),output_manager_default.spinner("Fetching token...");let result=await fetchToken(client,clientId,body);if(output_manager_default.stopSpinner(),result.ok)return printTokenResult(client,result.data,asJson,[installation.warning]);let errorCode=result.errorCode,errorMessage=result.errorMessage??"Failed to get token";if(errorCode==="not_found")return output_manager_default.error("Connector not found or Connect is not enabled for this team."),1;if(errorCode==="unresolved_token")return output_manager_default.error(`${errorMessage} This connector does not support getting a token for the requested subject.`),1;if(!isActionable(errorCode))return output_manager_default.error(errorMessage),1;let teamId=client.config.currentTeam;if(!teamId)return output_manager_default.error(`${errorMessage} Unable to build recovery URL: no team resolved.`),1;let actionLabel=errorCode==="user_authorization_required"?"authorization":"installation",isInteractive=!!(client.stdin.isTTY&&client.stdout.isTTY);if(!(!!flags["--yes"]||isInteractive)){let{requestCode:requestCode2}=generateRequestCode(),actionUrl2=buildActionUrl(errorCode,clientId,teamId,requestCode2,tokenParams);return output_manager_default.error(errorMessage),output_manager_default.log(`To ${actionLabel}, open: ${actionUrl2}`),output_manager_default.log(`Or re-run with --yes to open the browser automatically: vercel connect token ${clientId} --yes`),1}if(output_manager_default.error(errorMessage),!flags["--yes"]&&isInteractive&&!await client.input.confirm(`Open browser to ${actionLabel}?`,!0))return 0;let{verifier,requestCode}=generateRequestCode(),actionUrl=buildActionUrl(errorCode,clientId,teamId,requestCode,tokenParams);output_manager_default.log(`Opening browser for ${actionLabel}...`),output_manager_default.log(`If the browser doesn't open, visit:
|
|
42
|
+
${actionUrl}`),(0,import_open2.default)(actionUrl).catch(err=>output_manager_default.debug(`Failed to open browser: ${err}`)),output_manager_default.spinner(`Waiting for ${actionLabel} to complete in the browser...`);let pollData=await awaitConnexResult(client,verifier);if(output_manager_default.stopSpinner(),!pollData)return 1;let retryBody={...body};pollData.installationId&&!retryBody.installationId&&(retryBody.installationId=pollData.installationId),output_manager_default.spinner("Fetching token...");let retryResult=await fetchToken(client,clientId,retryBody);return output_manager_default.stopSpinner(),retryResult.ok?printTokenResult(client,retryResult.data,asJson,[installation.warning]):(output_manager_default.error(retryResult.errorMessage??`Failed to get token after ${actionLabel}`),1)}function parseScopes(raw){return raw.split(/[\s,]+/).map(s2=>s2.trim()).filter(Boolean)}function isActionable(code){return code==="user_authorization_required"||code==="client_installation_required"}function buildActionUrl(code,clientId,teamId,requestCode,tokenParams){let path=code==="user_authorization_required"?"authorize":"install",params=new URLSearchParams({teamId,request_code:requestCode});for(let[key,value]of Object.entries(tokenParams))value!==void 0&¶ms.set(key,Array.isArray(value)?value.join(","):value);return`https://vercel.com/api/v1/connect/${path}/${encodeURIComponent(clientId)}?${params.toString()}`}function printTokenResult(client,data,asJson,warnings){return asJson?client.stdout.write(`${JSON.stringify(withWarnings(data,warnings),null,2)}
|
|
43
43
|
`):client.stdout.write(`${data.token}
|
|
44
44
|
`),0}async function fetchToken(client,clientId,body){try{return{ok:!0,data:await client.fetch(`/v1/connect/token/${encodeURIComponent(clientId)}`,{method:"POST",body:JSON.stringify(body),headers:{"Content-Type":"application/json"}})}}catch(err){let serverError=extractApiError(err);return{ok:!1,errorCode:serverError.code,errorMessage:serverError.message}}}function extractApiError(err){if(typeof err=="object"&&err!==null){let errObj=err,code=typeof errObj.code=="string"?errObj.code:void 0,message=typeof errObj.serverMessage=="string"?errObj.serverMessage:typeof errObj.message=="string"?errObj.message:"Unknown error";return{code,message}}return{message:"Unknown error"}}var import_chalk8=__toESM(require_source(),1);var import_chalk7=__toESM(require_source(),1),MAX_TRIGGER_DESTINATIONS=3;function destinationsMatch(a,b){return a.projectId===b.projectId&&(a.customEnvironmentId??null)===(b.customEnvironmentId??null)&&(a.branch??null)===(b.branch??null)&&(a.path??null)===(b.path??null)}function findMatchingDestination(destinations,desired){return destinations.find(d=>destinationsMatch(d,desired))}function buildTriggerDestination(input){if(input.branch!==void 0&&input.customEnvironmentId!==void 0)throw new Error("Trigger destinations cannot target both a branch and a custom environment.");let dest={projectId:input.projectId};return input.customEnvironmentId!==void 0&&(dest.customEnvironmentId=input.customEnvironmentId),input.branch!==void 0&&(dest.branch=input.branch),input.path!==void 0&&(dest.path=input.path),dest}function formatDestination(d){let target=d.customEnvironmentId?`custom environment ${import_chalk7.default.bold(d.customEnvironmentId)}`:`branch ${import_chalk7.default.bold(d.branch??"production")}`;return[`project ${import_chalk7.default.bold(d.projectId)}`,target,`path ${import_chalk7.default.bold(d.path??"<default>")}`].join(", ")}function toJsonDestination(d){let entry={projectId:d.projectId};return d.customEnvironmentId!==void 0&&(entry.customEnvironmentId=d.customEnvironmentId),d.branch!==void 0&&(entry.branch=d.branch),d.path!==void 0&&(entry.path=d.path),entry}async function patchTriggerDestinations(client,connectorId,destinations){let body=destinations.map(toJsonDestination);await client.fetch(`/v1/connect/connectors/${encodeURIComponent(connectorId)}/trigger-destinations`,{method:"PATCH",body:{destinations:body}})}var ALL_ENVS=["production","preview","development"];async function resolveRequestedEnvironments(client,projectId,projectName,requestedEnvironments){if(requestedEnvironments.length===0)return[...ALL_ENVS];let customEnvironments=requestedEnvironments.filter(environment=>!isValidEnvTarget(environment)).length>0?await getCustomEnvironments(client,projectId):[],resolvedEnvironments=new Set;for(let environment of requestedEnvironments){if(isValidEnvTarget(environment)){resolvedEnvironments.add(environment);continue}let customEnvironment=pickCustomEnvironment(customEnvironments,environment);if(!customEnvironment){output_manager_default.error(`Invalid environment ${import_chalk8.default.bold(environment)} for project ${import_chalk8.default.bold(projectName)}. Use ${envTargetChoices.map(choice=>choice.value).join(", ")}, or a custom environment slug or ID from that project.`);return}resolvedEnvironments.add(customEnvironment.id)}return[...resolvedEnvironments]}function envSetsEqual(a,b){if(a.length!==b.length)return!1;let aSet=new Set(a);return b.every(env=>aSet.has(env))}function getAttachmentEnvironments(requestedEnvironments,projectId,destinations){let environments=new Set(requestedEnvironments);for(let destination of destinations)destination.projectId===projectId&&destination.customEnvironmentId!==void 0&&environments.add(destination.customEnvironmentId);return[...environments]}async function attach(client,args,flags){let formatResult=validateJsonOutput(flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput,branchError=applyDeprecatedGitBranchFlag(client,flags,"--trigger-branch");if(branchError)return reportRenamedOptionError(client,branchError,{json:asJson});let skipConfirmation=!!flags["--yes"],withTriggers=!!flags["--triggers"],triggerBranch=flags["--git-branch"],triggerEnvironment=flags["--trigger-environment"],triggerPath=flags["--trigger-path"];if(asJson&&!skipConfirmation)return output_manager_default.error("--json requires --yes to skip confirmation prompts"),2;if(!withTriggers&&(triggerBranch!==void 0||triggerEnvironment!==void 0||triggerPath!==void 0))return output_manager_default.error("--git-branch, --trigger-environment, and --trigger-path require --triggers to also be set."),1;if(triggerBranch!==void 0&&triggerEnvironment!==void 0)return output_manager_default.error("--git-branch and --trigger-environment are mutually exclusive."),2;if(triggerEnvironment!==void 0&&triggerEnvironment.trim()==="")return output_manager_default.error("--trigger-environment must not be empty."),1;let clientIdOrUid=args[0];if(!clientIdOrUid)return output_manager_default.error("Missing connector ID or UID. Usage: vercel connect attach <connector>"),2;let requestedEnvsRaw=normalizeRepeatableStringFilters(flags["--environment"]),projectId,projectName,projectFlag=flags["--project"];if(projectFlag){await selectConnexTeam(client,"Select the team that owns this project");let team=client.config.currentTeam;output_manager_default.spinner("Looking up project\u2026");let resolvedProject;try{resolvedProject=await getProjectByNameOrId(client,projectFlag,team)}catch(err){return output_manager_default.stopSpinner(),printError(err,client),1}if(output_manager_default.stopSpinner(),resolvedProject instanceof ProjectNotFound)return output_manager_default.error(`Project ${import_chalk8.default.bold(projectFlag)} was not found. Check the name/ID and try again.`),1;projectId=resolvedProject.id,projectName=sanitizeForTerminal(resolvedProject.name)}else{let linked=await getLinkedProject(client);if(linked.status==="error")return linked.exitCode;if(linked.status==="not_linked")return output_manager_default.error(`No linked project found. Run \`${packageName} link\` first or pass --project=<name_or_id>.`),1;linked.org.type==="team"?client.config.currentTeam=linked.org.id:client.config.currentTeam=void 0,projectId=linked.project.id,projectName=sanitizeForTerminal(linked.project.name)}let environments;try{environments=await resolveRequestedEnvironments(client,projectId,projectName,requestedEnvsRaw)}catch(err){return printError(err,client),1}if(!environments)return 1;output_manager_default.spinner("Retrieving connector\u2026");let target;try{target=await client.fetch(`/v1/connect/connectors/${encodeURIComponent(clientIdOrUid)}`)}catch(err){return output_manager_default.stopSpinner(),err.status===404?(output_manager_default.error(`No connector found for ${import_chalk8.default.bold(clientIdOrUid)}.`),1):(printError(err,client),1)}output_manager_default.stopSpinner();let displayName=sanitizeForTerminal(target.uid||target.name||target.id),desiredDestination,triggerAlreadyRegistered=!1,triggersEnabledOnConnector=!0;if(withTriggers){if(target.supportsTriggers===!1)return output_manager_default.error(`Connector ${import_chalk8.default.bold(displayName)} does not support triggers (only Slack supports incoming webhooks today).`),1;triggersEnabledOnConnector=target.triggers?.enabled===!0;let customEnvironmentId;if(triggerEnvironment!==void 0){let customEnvironments;try{customEnvironments=await getCustomEnvironments(client,projectId)}catch(err){return printError(err,client),1}let customEnvironment=pickCustomEnvironment(customEnvironments,triggerEnvironment);if(!customEnvironment)return output_manager_default.error(`Unknown trigger environment ${import_chalk8.default.bold(triggerEnvironment)} for project ${import_chalk8.default.bold(projectName)}. Use a custom environment slug or stable ID from that project.`),1;customEnvironmentId=customEnvironment.id}desiredDestination=buildTriggerDestination({projectId,customEnvironmentId,branch:triggerBranch,path:triggerPath});let currentDestinations=target.triggerDestinations??[];if(triggerAlreadyRegistered=findMatchingDestination(currentDestinations,desiredDestination)!==void 0,!triggerAlreadyRegistered&¤tDestinations.length>=MAX_TRIGGER_DESTINATIONS)return output_manager_default.error(`Connector ${import_chalk8.default.bold(displayName)} already has ${MAX_TRIGGER_DESTINATIONS} trigger destinations. Remove one in the dashboard before adding a new one.`),1}let existingAttachment;try{existingAttachment=await client.fetch(`/v1/connect/connectors/${encodeURIComponent(target.id)}/projects/${encodeURIComponent(projectId)}`)}catch(err){if(err.status!==404)return printError(err,client),1}let attachmentEnvironments=getAttachmentEnvironments(environments,projectId,target.triggerDestinations??[]),shouldAttach=!(existingAttachment!==void 0&&envSetsEqual(existingAttachment.environments??[],attachmentEnvironments)),shouldRegisterTrigger=withTriggers&&!triggerAlreadyRegistered;if(!shouldAttach&&!shouldRegisterTrigger){if(asJson)return client.stdout.write(`${JSON.stringify({clientId:target.id,uid:target.uid,projectId,environments:attachmentEnvironments,triggerDestination:withTriggers?desiredDestination:void 0,unchanged:!0},null,2)}
|
|
45
45
|
`),0;let triggerPart=withTriggers?" (trigger destination already registered)":"";return output_manager_default.log(`Connector ${import_chalk8.default.bold(displayName)} is already attached to ${import_chalk8.default.bold(projectName)} for environments: ${attachmentEnvironments.join(", ")}${triggerPart}. Nothing to do.`),0}if(!skipConfirmation&&!client.stdin.isTTY)return output_manager_default.error("Confirmation required. Use `--yes` to skip the confirmation prompt."),1;if(!skipConfirmation){if(shouldAttach)if(existingAttachment){let current=(existingAttachment.environments??[]).join(", ")||"\u2014",next=attachmentEnvironments.join(", ");output_manager_default.log(`Connector ${import_chalk8.default.bold(displayName)} is already attached to ${import_chalk8.default.bold(projectName)}.`),output_manager_default.log(` Current: ${current}`),output_manager_default.log(` Will set: ${next}`)}else output_manager_default.log(`Connector ${import_chalk8.default.bold(displayName)} will be attached to ${import_chalk8.default.bold(projectName)} for environments: ${attachmentEnvironments.join(", ")}.`);if(shouldRegisterTrigger&&desiredDestination&&(output_manager_default.log(`Will register as trigger destination: ${formatDestination(desiredDestination)}.`),triggersEnabledOnConnector||output_manager_default.warn("Triggers are not enabled on this connector. The destination will be registered, but no events will flow until the connector is recreated with triggers enabled.")),!await client.input.confirm("Continue?",!1))return output_manager_default.log("Canceled"),0}if(shouldAttach){output_manager_default.spinner("Attaching project\u2026");try{await client.fetch(`/v1/connect/connectors/${encodeURIComponent(target.id)}/projects/${encodeURIComponent(projectId)}`,{method:"POST",body:{environments:attachmentEnvironments}})}catch(err){output_manager_default.stopSpinner();let status2=err.status;return status2===403?(output_manager_default.error("You don't have permission to attach projects on this team. Owner or Member role required."),1):status2===404?(output_manager_default.error(`No connector found for ${import_chalk8.default.bold(displayName)}, or project ${import_chalk8.default.bold(projectName)} is no longer accessible.`),1):(printError(err,client),1)}output_manager_default.stopSpinner()}if(shouldRegisterTrigger&&desiredDestination){let merged=[...target.triggerDestinations??[],desiredDestination];output_manager_default.spinner("Registering trigger destination\u2026");try{await patchTriggerDestinations(client,target.id,merged)}catch(err){output_manager_default.stopSpinner();let status2=err.status;return status2===403?(output_manager_default.error("You don't have permission to update trigger destinations on this team. Owner or Member role required."),1):status2===404?(output_manager_default.error("Trigger destinations are not available for this team (the connex-triggers feature is not enabled)."),1):(printError(err,client),1)}output_manager_default.stopSpinner()}return asJson?(client.stdout.write(`${JSON.stringify({clientId:target.id,uid:target.uid,projectId,environments:attachmentEnvironments,triggerDestination:withTriggers?desiredDestination:void 0},null,2)}
|
|
@@ -52,7 +52,7 @@ ${actionUrl}`),(0,import_open2.default)(actionUrl).catch(err=>output_manager_def
|
|
|
52
52
|
`),0):client.stdout.isTTY?(output_manager_default.print(`Opening connector ${import_chalk12.default.bold(clientIdOrUid)} in the dashboard\u2026
|
|
53
53
|
`),(0,import_open3.default)(url),0):(client.stdout.write(`${url}
|
|
54
54
|
`),0)}var ContactsTelemetryClient=class extends TelemetryClient{trackCliSubcommandAdd(actual){this.trackCliSubcommand({subcommand:"add",value:actual})}},ContactsAddTelemetryClient=class extends TelemetryClient{trackCliArgumentConnector(v){v&&this.trackCliArgument({arg:"connector",value:this.redactedValue})}trackCliOptionPhoneNumber(v){v&&this.trackCliOption({option:"phone-number",value:this.redactedValue})}trackCliOptionFormat(v){v&&this.trackCliOption({option:"format",value:v})}trackCliFlagJson(v){v&&this.trackCliFlag("json")}};var import_chalk13=__toESM(require_source(),1);async function add(client,argv){let telemetry=new ContactsAddTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(contactsAddSubcommand.options),parsedArgs;try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(err){return printError(err),2}let{args,flags}=parsedArgs;telemetry.trackCliArgumentConnector(args[0]),telemetry.trackCliOptionPhoneNumber(flags["--phone-number"]),telemetry.trackCliOptionFormat(flags["--format"]),telemetry.trackCliFlagJson(flags["--json"]);let formatResult=validateJsonOutput(flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let connector=args[0];if(!connector)return output_manager_default.error("Missing connector ID or UID. Usage: vercel connect contacts add <connector> --phone-number <phone-number>"),2;let phoneNumber=flags["--phone-number"];if(!phoneNumber)return output_manager_default.error("Missing phone number. Provide one with `--phone-number`."),2;if(!/^\+[1-9]\d{1,14}$/.test(phoneNumber))return output_manager_default.error("Invalid phone number. Provide an E.164 number (e.g. +12025551234)."),2;await selectConnexTeam(client,"Select the team for this connector"),output_manager_default.spinner("Adding contact\u2026");let verification;try{verification=await client.fetch(`/v1/connect/connectors/${encodeURIComponent(connector)}/contacts`,{method:"POST",body:{phoneNumber}})}catch(err){return output_manager_default.stopSpinner(),printError(err),1}if(output_manager_default.stopSpinner(),formatResult.jsonOutput)return client.stdout.write(`${JSON.stringify(verification,null,2)}
|
|
55
|
-
`),0;let safePhoneNumber=sanitizeForTerminal(phoneNumber);return output_manager_default.success(`Contact ${import_chalk13.default.bold(safePhoneNumber)} added.`),verification.instructions&&output_manager_default.log(sanitizeForTerminal(verification.instructions)),0}var COMMAND_CONFIG={add:getCommandAliases(contactsAddSubcommand)};async function contacts(client){let telemetry=new ContactsTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(contactsSubcommand.options),parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(4),flagsSpecification,{permissive:!0})}catch(err){return printError(err),2}let{subcommand,subcommandOriginal,args:subArgs}=getSubcommand2(parsedArgs.args,COMMAND_CONFIG),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry.trackCliFlagHelp("connect contacts"),output_manager_default.print(help(contactsSubcommand,{parent:connexCommand,columns:client.stderr.columns})),0;function printHelp(command){output_manager_default.print(help(command,{parent:contactsSubcommand,columns:client.stderr.columns}))}switch(subcommand){case"add":return needHelp?(telemetry.trackCliFlagHelp("connect contacts",subcommandOriginal),printHelp(contactsAddSubcommand),0):(telemetry.trackCliSubcommandAdd(subcommandOriginal),add(client,subArgs));default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG)),output_manager_default.print(help(contactsSubcommand,{parent:connexCommand,columns:client.stderr.columns})),2}}var COMMAND_CONFIG2={discover:getCommandAliases(discoverSubcommand),categories:getCommandAliases(categoriesSubcommand),create:getCommandAliases(createSubcommand),update:getCommandAliases(updateSubcommand),list:getCommandAliases(listSubcommand),token:getCommandAliases(tokenSubcommand),attach:getCommandAliases(attachSubcommand),detach:getCommandAliases(detachSubcommand),delete:getCommandAliases(removeSubcommand),"revoke-tokens":getCommandAliases(revokeTokensSubcommand),open:getCommandAliases(openSubcommand),contacts:getCommandAliases(contactsSubcommand)};async function connex(client){let telemetry=new ConnexTelemetryClient({opts:{store:client.telemetryEventStore}}),{args,flags}=parseArguments(client.argv.slice(2),getFlagsSpecification(connexCommand.options),{permissive:!0}),{subcommand,subcommandOriginal,args:subArgs}=getSubcommand2(args.slice(1),COMMAND_CONFIG2),needHelp=flags["--help"];function printHelp(command,options){output_manager_default.print(help(command,{...options,columns:client.stderr.columns,parent:connexCommand}))}function printHelpToStdout(command,options){client.stdout.write(help(command,{...options,columns:client.stderr.columns,parent:connexCommand}))}if(!subcommand&&needHelp)return telemetry.trackCliFlagHelp("connect"),output_manager_default.print(help(connexCommand,{columns:client.stderr.columns})),0;try{switch(subcommand){case"create":{if(needHelp)return telemetry.trackCliFlagHelp("connect",subcommandOriginal),await printCreateDynamicHelp(client,findHelpServiceArg(subArgs),createSubcommand,printHelpToStdout)||printHelpToStdout(createSubcommand),0;telemetry.trackCliSubcommandCreate(subcommandOriginal);let createFlagsSpec=getFlagsSpecification(createSubcommand.options),createParsedArgs=parseArguments(normalizeCreateDataArgs(subArgs),createFlagsSpec);return telemetry.trackCliArgumentService(createParsedArgs.args[0]),telemetry.trackCliOptionName(createParsedArgs.flags["--name"]),telemetry.trackCliOptionIcon(createParsedArgs.flags["--icon"]),telemetry.trackCliOptionBackgroundColor(createParsedArgs.flags["--background-color"]),telemetry.trackCliOptionAccentColor(createParsedArgs.flags["--accent-color"]),telemetry.trackCliOptionData(createParsedArgs.flags["--data"]),telemetry.trackCliOptionConnectorType(createParsedArgs.flags["--connector-type"]),telemetry.trackCliOptionTriggerEvent(createParsedArgs.flags["--trigger-event"]),telemetry.trackCliOptionConnectionMethod(createParsedArgs.flags["--connection-method"]),telemetry.trackCliOptionTarget(createParsedArgs.flags["--target"]),telemetry.trackCliOptionParam(createParsedArgs.flags["--param"]),telemetry.trackCliFlagYes(createParsedArgs.flags["--yes"]),telemetry.trackCliFlagTriggers(createParsedArgs.flags["--triggers"]),telemetry.trackCliOptionTriggerPath(createParsedArgs.flags["--trigger-path"]),telemetry.trackCliOptionTriggerProject(createParsedArgs.flags["--trigger-project"]),telemetry.trackCliOptionGitBranch(createParsedArgs.flags["--git-branch"]),telemetry.trackCliOptionTriggerBranch(createParsedArgs.flags["--trigger-branch"]),telemetry.trackCliOptionTriggerEnvironment(createParsedArgs.flags["--trigger-environment"]),telemetry.trackCliOptionFormat(createParsedArgs.flags["--format"]),await create(client,createParsedArgs.args,createParsedArgs.flags)}case"update":{if(needHelp)return telemetry.trackCliFlagHelp("connect",subcommandOriginal),printHelp(updateSubcommand),0;telemetry.trackCliSubcommandUpdate(subcommandOriginal);let updateFlagsSpec=getFlagsSpecification(updateSubcommand.options),updateParsedArgs=parseArguments(subArgs,updateFlagsSpec);return telemetry.trackCliArgumentId(updateParsedArgs.args[0]),telemetry.trackCliOptionIcon(updateParsedArgs.flags["--icon"]),telemetry.trackCliOptionBackgroundColor(updateParsedArgs.flags["--background-color"]),telemetry.trackCliOptionAccentColor(updateParsedArgs.flags["--accent-color"]),telemetry.trackCliOptionFormat(updateParsedArgs.flags["--format"]),await update(client,updateParsedArgs.args,updateParsedArgs.flags)}case"discover":{if(needHelp)return telemetry.trackCliFlagHelp("connect",subcommandOriginal),printHelp(discoverSubcommand),0;telemetry.trackCliSubcommandDiscover(subcommandOriginal);let discoverParsedArgs=parseArguments(subArgs,getFlagsSpecification(discoverSubcommand.options));return telemetry.trackCliArgumentQuery(discoverParsedArgs.args[0]),telemetry.trackCliOptionCategory(discoverParsedArgs.flags["--category"]),telemetry.trackCliOptionConnectionMethod(discoverParsedArgs.flags["--connection-method"]),telemetry.trackCliOptionTarget(discoverParsedArgs.flags["--target"]),telemetry.trackCliFlagSupportsTriggers(discoverParsedArgs.flags["--supports-triggers"]),telemetry.trackCliOptionLimit(discoverParsedArgs.flags["--limit"]),telemetry.trackCliOptionNext(discoverParsedArgs.flags["--next"]),telemetry.trackCliOptionFormat(discoverParsedArgs.flags["--format"]),await discover(client,discoverParsedArgs.args,discoverParsedArgs.flags)}case"categories":{if(needHelp)return telemetry.trackCliFlagHelp("connect",subcommandOriginal),printHelp(categoriesSubcommand),0;telemetry.trackCliSubcommandCategories(subcommandOriginal);let categoriesParsedArgs=parseArguments(subArgs,getFlagsSpecification(categoriesSubcommand.options));return telemetry.trackCliOptionFormat(categoriesParsedArgs.flags["--format"]),await categories(client,categoriesParsedArgs.args,categoriesParsedArgs.flags)}case"list":{if(needHelp)return telemetry.trackCliFlagHelp("connect",subcommandOriginal),printHelp(listSubcommand),0;telemetry.trackCliSubcommandList(subcommandOriginal);let listFlagsSpec=getFlagsSpecification(listSubcommand.options),listParsedArgs=parseArguments(subArgs,listFlagsSpec);return telemetry.trackCliFlagAllProjects(listParsedArgs.flags["--all-projects"]),telemetry.trackCliOptionLimit(listParsedArgs.flags["--limit"]),telemetry.trackCliOptionNext(listParsedArgs.flags["--next"]),telemetry.trackCliOptionSearch(listParsedArgs.flags["--search"]),telemetry.trackCliOptionService(listParsedArgs.flags["--service"]),telemetry.trackCliOptionType(listParsedArgs.flags["--type"]),telemetry.trackCliOptionFormat(listParsedArgs.flags["--format"]),await list(client,listParsedArgs.flags)}case"token":{if(needHelp)return telemetry.trackCliFlagHelp("connect",subcommandOriginal),printHelp(tokenSubcommand),0;telemetry.trackCliSubcommandToken(subcommandOriginal);let tokenFlagsSpec=getFlagsSpecification(tokenSubcommand.options),tokenParsedArgs=parseArguments(subArgs,tokenFlagsSpec);return telemetry.trackCliArgumentId(tokenParsedArgs.args[0]),telemetry.trackCliOptionSubject(tokenParsedArgs.flags["--subject"]),telemetry.trackCliOptionInstallationId(tokenParsedArgs.flags["--installation-id"]),telemetry.trackCliOptionScopes(tokenParsedArgs.flags["--scopes"]),telemetry.trackCliFlagNoDefaultScopes(tokenParsedArgs.flags["--no-default-scopes"]),telemetry.trackCliFlagYes(tokenParsedArgs.flags["--yes"]),telemetry.trackCliOptionFormat(tokenParsedArgs.flags["--format"]),await token(client,tokenParsedArgs.args,tokenParsedArgs.flags)}case"attach":{if(needHelp)return telemetry.trackCliFlagHelp("connect",subcommandOriginal),printHelp(attachSubcommand),0;telemetry.trackCliSubcommandAttach(subcommandOriginal);let attachFlagsSpec=getFlagsSpecification(attachSubcommand.options),attachParsedArgs=parseArguments(subArgs,attachFlagsSpec);return telemetry.trackCliArgumentClient(attachParsedArgs.args[0]),telemetry.trackCliOptionEnvironment(attachParsedArgs.flags["--environment"]),telemetry.trackCliOptionProject(attachParsedArgs.flags["--project"]),telemetry.trackCliFlagTriggers(attachParsedArgs.flags["--triggers"]),telemetry.trackCliOptionGitBranch(attachParsedArgs.flags["--git-branch"]),telemetry.trackCliOptionTriggerBranch(attachParsedArgs.flags["--trigger-branch"]),telemetry.trackCliOptionTriggerEnvironment(attachParsedArgs.flags["--trigger-environment"]),telemetry.trackCliOptionTriggerPath(attachParsedArgs.flags["--trigger-path"]),telemetry.trackCliFlagYes(attachParsedArgs.flags["--yes"]),telemetry.trackCliOptionFormat(attachParsedArgs.flags["--format"]),await attach(client,attachParsedArgs.args,attachParsedArgs.flags)}case"detach":{if(needHelp)return telemetry.trackCliFlagHelp("connect",subcommandOriginal),printHelp(detachSubcommand),0;telemetry.trackCliSubcommandDetach(subcommandOriginal);let detachFlagsSpec=getFlagsSpecification(detachSubcommand.options),detachParsedArgs=parseArguments(subArgs,detachFlagsSpec);return telemetry.trackCliArgumentClient(detachParsedArgs.args[0]),telemetry.trackCliOptionProject(detachParsedArgs.flags["--project"]),telemetry.trackCliFlagYes(detachParsedArgs.flags["--yes"]),telemetry.trackCliOptionFormat(detachParsedArgs.flags["--format"]),await detach(client,detachParsedArgs.args,detachParsedArgs.flags)}case"delete":{if(needHelp)return telemetry.trackCliFlagHelp("connect",subcommandOriginal),printHelp(removeSubcommand),0;telemetry.trackCliSubcommandDelete(subcommandOriginal),subcommandOriginal==="remove"&&warnDeprecatedSubcommand(client,"connect remove","connect delete");let removeFlagsSpec=getFlagsSpecification(removeSubcommand.options),removeParsedArgs=parseArguments(subArgs,removeFlagsSpec);return telemetry.trackCliArgumentClient(removeParsedArgs.args[0]),telemetry.trackCliFlagYes(removeParsedArgs.flags["--yes"]),telemetry.trackCliFlagDisconnectAll(removeParsedArgs.flags["--disconnect-all"]),telemetry.trackCliOptionFormat(removeParsedArgs.flags["--format"]),await remove(client,removeParsedArgs.args,removeParsedArgs.flags)}case"revoke-tokens":{if(needHelp)return telemetry.trackCliFlagHelp("connect",subcommandOriginal),printHelp(revokeTokensSubcommand),0;telemetry.trackCliSubcommandRevokeTokens(subcommandOriginal);let revokeTokensFlagsSpec=getFlagsSpecification(revokeTokensSubcommand.options),revokeTokensParsedArgs=parseArguments(subArgs,revokeTokensFlagsSpec);return telemetry.trackCliArgumentId(revokeTokensParsedArgs.args[0]),telemetry.trackCliFlagMyTokens(revokeTokensParsedArgs.flags["--my-tokens"]),telemetry.trackCliFlagAllTokens(revokeTokensParsedArgs.flags["--all-tokens"]),telemetry.trackCliFlagYes(revokeTokensParsedArgs.flags["--yes"]),telemetry.trackCliOptionFormat(revokeTokensParsedArgs.flags["--format"]),await revokeTokens(client,revokeTokensParsedArgs.args,revokeTokensParsedArgs.flags)}case"contacts":return telemetry.trackCliSubcommandContacts(subcommandOriginal),await contacts(client);case"open":{if(needHelp)return telemetry.trackCliFlagHelp("connect",subcommandOriginal),printHelp(openSubcommand),0;telemetry.trackCliSubcommandOpen(subcommandOriginal);let openFlagsSpec=getFlagsSpecification(openSubcommand.options),openParsedArgs=parseArguments(subArgs,openFlagsSpec);return telemetry.trackCliOptionFormat(openParsedArgs.flags["--format"]),await openClient(client,openParsedArgs.args,openParsedArgs.flags)}default:{let validSubcommands=Object.keys(COMMAND_CONFIG2).join(" | "),missingSubcommand=subArgs.length===0,message=missingSubcommand?`Please specify a valid subcommand: ${validSubcommands}`:`Unknown subcommand "${subArgs[0]}". Valid subcommands: ${validSubcommands}`;return outputAgentError(client,{status:"error",reason:missingSubcommand?AGENT_REASON.MISSING_ARGUMENTS:AGENT_REASON.INVALID_ARGUMENTS,message,next:[{command:buildCommandWithGlobalFlags(client.argv,"connect --help",packageName,{prependGlobalFlags:!0}),when:"Show all connect subcommands and options"}]},2),output_manager_default.error(message),2}}}catch(err){return printError(err,client),isArgumentError(err)?2:1}}function findHelpServiceArg(subArgs){try{let{args}=parseArguments(normalizeCreateDataArgs(subArgs),getFlagsSpecification(createSubcommand.options),{permissive:!0});return args.find(arg=>!arg.startsWith("-"))}catch{return}}function normalizeCreateDataArgs(args){let normalized=[];for(let i=0;i<args.length;i++){let arg=args[i];if(normalized.push(arg),arg==="--data"){let next=args[i+1];(next===void 0||next.startsWith("-"))&&normalized.push("")}}return normalized}var import_chalk18=__toESM(require_source(),1),import_execa=__toESM(require_execa(),1),import_error_utils=__toESM(require_dist(),1),import_open7=__toESM(require_open(),1);function isAutoProvisionFallback(error){return typeof error=="object"&&error!==null&&"kind"in error&&error.kind!=="provisioned"&&"url"in error&&"integration"in error&&"product"in error}async function autoProvisionResource(client,integrationSlug,productSlug,name,metadata,acceptedPolicies,billingPlanId,installationId,installationMetadata){let endpoint=`/v1/integrations/integration/${encodeURIComponent(integrationSlug)}/marketplace/auto-provision/${encodeURIComponent(productSlug)}`,body={name,metadata,acceptedPolicies,source:"cli",...billingPlanId?{billingPlanId}:{},...installationId?{installationId}:{},...installationMetadata&&Object.keys(installationMetadata).length>0?{installationMetadata}:{}};output_manager_default.debug(`Auto-provision request: POST ${endpoint}`),output_manager_default.debug(`Auto-provision body: ${JSON.stringify(body,null,2)}`);try{let res=await client.fetch(endpoint,{method:"POST",json:!1,body});if(res.ok)return res.json();throw new Error(`Auto-provision failed: ${res.status}`)}catch(error){if(error instanceof APIError&&error.status===422&&isAutoProvisionFallback(error))return output_manager_default.debug("Auto-provision returned 422 fallback response"),error;throw output_manager_default.debug(`Auto-provision error: ${error}`),error}}var import_chalk14=__toESM(require_source(),1);async function fetchMarketplaceIntegrationsList(client,categories3){let params=new URLSearchParams({integrationType:"marketplace"});if(categories3?.length)for(let category of categories3)params.append("category",category);return client.fetch(`/v2/integrations/integrations?${params.toString()}`,{json:!0})}async function fetchIntegration(client,slug){return client.fetch(`/v2/integrations/integration/${slug}`,{json:!0})}function toDiscoverEntries(integrations){let entries=[];for(let integration of integrations){if(!integration.isMarketplace||!integration.canInstall)continue;let integrationTags=integration.tagIds??[],products=integration.products??[];if(products.length===0){entries.push({name:integration.name,slug:integration.slug,provider:integration.name,description:integration.shortDescription??"",tags:integrationTags});continue}for(let product of products){let needsCompoundSlug=products.length>1||product.slug!==integration.slug;entries.push({name:product.name,slug:needsCompoundSlug?`${integration.slug}/${product.slug}`:integration.slug,provider:integration.name,description:product.shortDescription??integration.shortDescription??"",tags:[...integrationTags,...product.tags??[]]})}}return entries}function matchesSearchTerm(entry,term){let lower=term.toLowerCase();return entry.name.toLowerCase().includes(lower)||entry.slug.toLowerCase().includes(lower)||entry.provider.toLowerCase().includes(lower)||entry.description.toLowerCase().includes(lower)||entry.tags.some(tag=>tag.toLowerCase().includes(lower))}async function resolveAndFetchIntegration(client,slug,telemetry){let directError;try{let integration=await fetchIntegration(client,slug);return telemetry.trackCliArgumentIntegration(slug,!0),integration}catch(error){directError=error}output_manager_default.spinner("Searching marketplace integrations...",500);let entries;try{let integrations=await fetchMarketplaceIntegrationsList(client);entries=toDiscoverEntries(integrations)}catch(discoverError){return output_manager_default.stopSpinner(),output_manager_default.error(`Failed to get integration "${slug}": ${directError?.message??discoverError.message}`),telemetry.trackCliArgumentIntegration(slug,!1),null}output_manager_default.stopSpinner();let matches=entries.filter(entry=>matchesSearchTerm(entry,slug));if(!matches.length)return output_manager_default.error(`No integration found matching "${slug}". Run ${import_chalk14.default.cyan("vercel integration discover")} to browse available integrations.`),telemetry.trackCliArgumentIntegration(slug,!1),null;if(matches.length===1){let match2=matches[0];if(client.stdin.isTTY===!0&&!await client.input.confirm(`Install ${import_chalk14.default.bold(match2.name)} (${match2.slug})?`,!0))return telemetry.trackCliArgumentIntegration(slug,!1),null;slug=match2.slug}else{if(client.stdin.isTTY!==!0)return output_manager_default.error(`Found ${matches.length} integrations matching "${slug}". Available integrations:
|
|
55
|
+
`),0;let safePhoneNumber=sanitizeForTerminal(phoneNumber);return output_manager_default.success(`Contact ${import_chalk13.default.bold(safePhoneNumber)} added.`),verification.instructions&&output_manager_default.log(sanitizeForTerminal(verification.instructions)),0}var COMMAND_CONFIG={add:getCommandAliases(contactsAddSubcommand)};async function contacts(client){let telemetry=new ContactsTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(contactsSubcommand.options),parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(4),flagsSpecification,{permissive:!0})}catch(err){return printError(err),2}let{subcommand,subcommandOriginal,args:subArgs}=getSubcommand2(parsedArgs.args,COMMAND_CONFIG),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry.trackCliFlagHelp("connect contacts"),output_manager_default.print(help(contactsSubcommand,{parent:connexCommand,columns:client.stderr.columns})),0;function printHelp(command){output_manager_default.print(help(command,{parent:contactsSubcommand,columns:client.stderr.columns}))}switch(subcommand){case"add":return needHelp?(telemetry.trackCliFlagHelp("connect contacts",subcommandOriginal),printHelp(contactsAddSubcommand),0):(telemetry.trackCliSubcommandAdd(subcommandOriginal),add(client,subArgs));default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG)),output_manager_default.print(help(contactsSubcommand,{parent:connexCommand,columns:client.stderr.columns})),2}}var COMMAND_CONFIG2={discover:getCommandAliases(discoverSubcommand),categories:getCommandAliases(categoriesSubcommand),create:getCommandAliases(createSubcommand),update:getCommandAliases(updateSubcommand),list:getCommandAliases(listSubcommand),token:getCommandAliases(tokenSubcommand),attach:getCommandAliases(attachSubcommand),detach:getCommandAliases(detachSubcommand),delete:getCommandAliases(removeSubcommand),"revoke-tokens":getCommandAliases(revokeTokensSubcommand),open:getCommandAliases(openSubcommand),contacts:getCommandAliases(contactsSubcommand)};async function connex(client){let telemetry=new ConnexTelemetryClient({opts:{store:client.telemetryEventStore}}),{args,flags}=parseArguments(client.argv.slice(2),getFlagsSpecification(connexCommand.options),{permissive:!0}),{subcommand,subcommandOriginal,args:subArgs}=getSubcommand2(args.slice(1),COMMAND_CONFIG2),needHelp=flags["--help"];function printHelp(command,options){output_manager_default.print(help(command,{...options,columns:client.stderr.columns,parent:connexCommand}))}function printHelpToStdout(command,options){client.stdout.write(help(command,{...options,columns:client.stderr.columns,parent:connexCommand}))}if(!subcommand&&needHelp)return telemetry.trackCliFlagHelp("connect"),output_manager_default.print(help(connexCommand,{columns:client.stderr.columns})),0;try{switch(subcommand){case"create":{if(needHelp)return telemetry.trackCliFlagHelp("connect",subcommandOriginal),await printCreateDynamicHelp(client,findHelpServiceArg(subArgs),createSubcommand,printHelpToStdout)||printHelpToStdout(createSubcommand),0;telemetry.trackCliSubcommandCreate(subcommandOriginal);let createFlagsSpec=getFlagsSpecification(createSubcommand.options),createParsedArgs=parseArguments(normalizeCreateDataArgs(subArgs),createFlagsSpec);return telemetry.trackCliArgumentService(createParsedArgs.args[0]),telemetry.trackCliOptionName(createParsedArgs.flags["--name"]),telemetry.trackCliOptionIcon(createParsedArgs.flags["--icon"]),telemetry.trackCliOptionBackgroundColor(createParsedArgs.flags["--background-color"]),telemetry.trackCliOptionAccentColor(createParsedArgs.flags["--accent-color"]),telemetry.trackCliOptionData(createParsedArgs.flags["--data"]),telemetry.trackCliOptionConnectorType(createParsedArgs.flags["--connector-type"]),telemetry.trackCliOptionTriggerEvent(createParsedArgs.flags["--trigger-event"]),telemetry.trackCliOptionConnectionMethod(createParsedArgs.flags["--connection-method"]),telemetry.trackCliOptionTarget(createParsedArgs.flags["--target"]),telemetry.trackCliOptionParam(createParsedArgs.flags["--param"]),telemetry.trackCliFlagYes(createParsedArgs.flags["--yes"]),telemetry.trackCliFlagTriggers(createParsedArgs.flags["--triggers"]),telemetry.trackCliOptionTriggerPath(createParsedArgs.flags["--trigger-path"]),telemetry.trackCliOptionTriggerProject(createParsedArgs.flags["--trigger-project"]),telemetry.trackCliOptionGitBranch(createParsedArgs.flags["--git-branch"]),telemetry.trackCliOptionTriggerBranch(createParsedArgs.flags["--trigger-branch"]),telemetry.trackCliOptionTriggerEnvironment(createParsedArgs.flags["--trigger-environment"]),telemetry.trackCliOptionFormat(createParsedArgs.flags["--format"]),await create(client,createParsedArgs.args,createParsedArgs.flags)}case"update":{if(needHelp)return telemetry.trackCliFlagHelp("connect",subcommandOriginal),printHelp(updateSubcommand),0;telemetry.trackCliSubcommandUpdate(subcommandOriginal);let updateFlagsSpec=getFlagsSpecification(updateSubcommand.options),updateParsedArgs=parseArguments(subArgs,updateFlagsSpec);return telemetry.trackCliArgumentId(updateParsedArgs.args[0]),telemetry.trackCliOptionIcon(updateParsedArgs.flags["--icon"]),telemetry.trackCliOptionBackgroundColor(updateParsedArgs.flags["--background-color"]),telemetry.trackCliOptionAccentColor(updateParsedArgs.flags["--accent-color"]),telemetry.trackCliOptionFormat(updateParsedArgs.flags["--format"]),await update(client,updateParsedArgs.args,updateParsedArgs.flags)}case"discover":{if(needHelp)return telemetry.trackCliFlagHelp("connect",subcommandOriginal),printHelp(discoverSubcommand),0;telemetry.trackCliSubcommandDiscover(subcommandOriginal);let discoverParsedArgs=parseArguments(subArgs,getFlagsSpecification(discoverSubcommand.options));return telemetry.trackCliArgumentQuery(discoverParsedArgs.args[0]),telemetry.trackCliOptionCategory(discoverParsedArgs.flags["--category"]),telemetry.trackCliOptionConnectionMethod(discoverParsedArgs.flags["--connection-method"]),telemetry.trackCliOptionTarget(discoverParsedArgs.flags["--target"]),telemetry.trackCliFlagSupportsTriggers(discoverParsedArgs.flags["--supports-triggers"]),telemetry.trackCliOptionLimit(discoverParsedArgs.flags["--limit"]),telemetry.trackCliOptionNext(discoverParsedArgs.flags["--next"]),telemetry.trackCliOptionFormat(discoverParsedArgs.flags["--format"]),await discover(client,discoverParsedArgs.args,discoverParsedArgs.flags)}case"categories":{if(needHelp)return telemetry.trackCliFlagHelp("connect",subcommandOriginal),printHelp(categoriesSubcommand),0;telemetry.trackCliSubcommandCategories(subcommandOriginal);let categoriesParsedArgs=parseArguments(subArgs,getFlagsSpecification(categoriesSubcommand.options));return telemetry.trackCliOptionFormat(categoriesParsedArgs.flags["--format"]),await categories(client,categoriesParsedArgs.args,categoriesParsedArgs.flags)}case"list":{if(needHelp)return telemetry.trackCliFlagHelp("connect",subcommandOriginal),printHelp(listSubcommand),0;telemetry.trackCliSubcommandList(subcommandOriginal);let listFlagsSpec=getFlagsSpecification(listSubcommand.options),listParsedArgs=parseArguments(subArgs,listFlagsSpec);return telemetry.trackCliFlagAllProjects(listParsedArgs.flags["--all-projects"]),telemetry.trackCliOptionLimit(listParsedArgs.flags["--limit"]),telemetry.trackCliOptionNext(listParsedArgs.flags["--next"]),telemetry.trackCliOptionQuery(listParsedArgs.flags["--query"]),telemetry.trackCliOptionSearch(listParsedArgs.flags["--search"]),telemetry.trackCliOptionService(listParsedArgs.flags["--service"]),telemetry.trackCliOptionType(listParsedArgs.flags["--type"]),telemetry.trackCliOptionFormat(listParsedArgs.flags["--format"]),await list(client,listParsedArgs.flags)}case"token":{if(needHelp)return telemetry.trackCliFlagHelp("connect",subcommandOriginal),printHelp(tokenSubcommand),0;telemetry.trackCliSubcommandToken(subcommandOriginal);let tokenFlagsSpec=getFlagsSpecification(tokenSubcommand.options),tokenParsedArgs=parseArguments(subArgs,tokenFlagsSpec);return telemetry.trackCliArgumentId(tokenParsedArgs.args[0]),telemetry.trackCliOptionSubject(tokenParsedArgs.flags["--subject"]),telemetry.trackCliOptionInstallation(tokenParsedArgs.flags["--installation"]),telemetry.trackCliOptionInstallationId(tokenParsedArgs.flags["--installation-id"]),telemetry.trackCliOptionScopes(tokenParsedArgs.flags["--scopes"]),telemetry.trackCliFlagNoDefaultScopes(tokenParsedArgs.flags["--no-default-scopes"]),telemetry.trackCliFlagYes(tokenParsedArgs.flags["--yes"]),telemetry.trackCliOptionFormat(tokenParsedArgs.flags["--format"]),await token(client,tokenParsedArgs.args,tokenParsedArgs.flags)}case"attach":{if(needHelp)return telemetry.trackCliFlagHelp("connect",subcommandOriginal),printHelp(attachSubcommand),0;telemetry.trackCliSubcommandAttach(subcommandOriginal);let attachFlagsSpec=getFlagsSpecification(attachSubcommand.options),attachParsedArgs=parseArguments(subArgs,attachFlagsSpec);return telemetry.trackCliArgumentClient(attachParsedArgs.args[0]),telemetry.trackCliOptionEnvironment(attachParsedArgs.flags["--environment"]),telemetry.trackCliOptionProject(attachParsedArgs.flags["--project"]),telemetry.trackCliFlagTriggers(attachParsedArgs.flags["--triggers"]),telemetry.trackCliOptionGitBranch(attachParsedArgs.flags["--git-branch"]),telemetry.trackCliOptionTriggerBranch(attachParsedArgs.flags["--trigger-branch"]),telemetry.trackCliOptionTriggerEnvironment(attachParsedArgs.flags["--trigger-environment"]),telemetry.trackCliOptionTriggerPath(attachParsedArgs.flags["--trigger-path"]),telemetry.trackCliFlagYes(attachParsedArgs.flags["--yes"]),telemetry.trackCliOptionFormat(attachParsedArgs.flags["--format"]),await attach(client,attachParsedArgs.args,attachParsedArgs.flags)}case"detach":{if(needHelp)return telemetry.trackCliFlagHelp("connect",subcommandOriginal),printHelp(detachSubcommand),0;telemetry.trackCliSubcommandDetach(subcommandOriginal);let detachFlagsSpec=getFlagsSpecification(detachSubcommand.options),detachParsedArgs=parseArguments(subArgs,detachFlagsSpec);return telemetry.trackCliArgumentClient(detachParsedArgs.args[0]),telemetry.trackCliOptionProject(detachParsedArgs.flags["--project"]),telemetry.trackCliFlagYes(detachParsedArgs.flags["--yes"]),telemetry.trackCliOptionFormat(detachParsedArgs.flags["--format"]),await detach(client,detachParsedArgs.args,detachParsedArgs.flags)}case"delete":{if(needHelp)return telemetry.trackCliFlagHelp("connect",subcommandOriginal),printHelp(removeSubcommand),0;telemetry.trackCliSubcommandDelete(subcommandOriginal),subcommandOriginal==="remove"&&warnDeprecatedSubcommand(client,"connect remove","connect delete");let removeFlagsSpec=getFlagsSpecification(removeSubcommand.options),removeParsedArgs=parseArguments(subArgs,removeFlagsSpec);return telemetry.trackCliArgumentClient(removeParsedArgs.args[0]),telemetry.trackCliFlagYes(removeParsedArgs.flags["--yes"]),telemetry.trackCliFlagDisconnectAll(removeParsedArgs.flags["--disconnect-all"]),telemetry.trackCliOptionFormat(removeParsedArgs.flags["--format"]),await remove(client,removeParsedArgs.args,removeParsedArgs.flags)}case"revoke-tokens":{if(needHelp)return telemetry.trackCliFlagHelp("connect",subcommandOriginal),printHelp(revokeTokensSubcommand),0;telemetry.trackCliSubcommandRevokeTokens(subcommandOriginal);let revokeTokensFlagsSpec=getFlagsSpecification(revokeTokensSubcommand.options),revokeTokensParsedArgs=parseArguments(subArgs,revokeTokensFlagsSpec);return telemetry.trackCliArgumentId(revokeTokensParsedArgs.args[0]),telemetry.trackCliFlagMyTokens(revokeTokensParsedArgs.flags["--my-tokens"]),telemetry.trackCliFlagAllTokens(revokeTokensParsedArgs.flags["--all-tokens"]),telemetry.trackCliFlagYes(revokeTokensParsedArgs.flags["--yes"]),telemetry.trackCliOptionFormat(revokeTokensParsedArgs.flags["--format"]),await revokeTokens(client,revokeTokensParsedArgs.args,revokeTokensParsedArgs.flags)}case"contacts":return telemetry.trackCliSubcommandContacts(subcommandOriginal),await contacts(client);case"open":{if(needHelp)return telemetry.trackCliFlagHelp("connect",subcommandOriginal),printHelp(openSubcommand),0;telemetry.trackCliSubcommandOpen(subcommandOriginal);let openFlagsSpec=getFlagsSpecification(openSubcommand.options),openParsedArgs=parseArguments(subArgs,openFlagsSpec);return telemetry.trackCliOptionFormat(openParsedArgs.flags["--format"]),await openClient(client,openParsedArgs.args,openParsedArgs.flags)}default:{let validSubcommands=Object.keys(COMMAND_CONFIG2).join(" | "),missingSubcommand=subArgs.length===0,message=missingSubcommand?`Please specify a valid subcommand: ${validSubcommands}`:`Unknown subcommand "${subArgs[0]}". Valid subcommands: ${validSubcommands}`;return outputAgentError(client,{status:"error",reason:missingSubcommand?AGENT_REASON.MISSING_ARGUMENTS:AGENT_REASON.INVALID_ARGUMENTS,message,next:[{command:buildCommandWithGlobalFlags(client.argv,"connect --help",packageName,{prependGlobalFlags:!0}),when:"Show all connect subcommands and options"}]},2),output_manager_default.error(message),2}}}catch(err){return printError(err,client),isArgumentError(err)?2:1}}function findHelpServiceArg(subArgs){try{let{args}=parseArguments(normalizeCreateDataArgs(subArgs),getFlagsSpecification(createSubcommand.options),{permissive:!0});return args.find(arg=>!arg.startsWith("-"))}catch{return}}function normalizeCreateDataArgs(args){let normalized=[];for(let i=0;i<args.length;i++){let arg=args[i];if(normalized.push(arg),arg==="--data"){let next=args[i+1];(next===void 0||next.startsWith("-"))&&normalized.push("")}}return normalized}var import_chalk18=__toESM(require_source(),1),import_execa=__toESM(require_execa(),1),import_error_utils=__toESM(require_dist(),1),import_open7=__toESM(require_open(),1);function isAutoProvisionFallback(error){return typeof error=="object"&&error!==null&&"kind"in error&&error.kind!=="provisioned"&&"url"in error&&"integration"in error&&"product"in error}async function autoProvisionResource(client,integrationSlug,productSlug,name,metadata,acceptedPolicies,billingPlanId,installationId,installationMetadata){let endpoint=`/v1/integrations/integration/${encodeURIComponent(integrationSlug)}/marketplace/auto-provision/${encodeURIComponent(productSlug)}`,body={name,metadata,acceptedPolicies,source:"cli",...billingPlanId?{billingPlanId}:{},...installationId?{installationId}:{},...installationMetadata&&Object.keys(installationMetadata).length>0?{installationMetadata}:{}};output_manager_default.debug(`Auto-provision request: POST ${endpoint}`),output_manager_default.debug(`Auto-provision body: ${JSON.stringify(body,null,2)}`);try{let res=await client.fetch(endpoint,{method:"POST",json:!1,body});if(res.ok)return res.json();throw new Error(`Auto-provision failed: ${res.status}`)}catch(error){if(error instanceof APIError&&error.status===422&&isAutoProvisionFallback(error))return output_manager_default.debug("Auto-provision returned 422 fallback response"),error;throw output_manager_default.debug(`Auto-provision error: ${error}`),error}}var import_chalk14=__toESM(require_source(),1);async function fetchMarketplaceIntegrationsList(client,categories3){let params=new URLSearchParams({integrationType:"marketplace"});if(categories3?.length)for(let category of categories3)params.append("category",category);return client.fetch(`/v2/integrations/integrations?${params.toString()}`,{json:!0})}async function fetchIntegration(client,slug){return client.fetch(`/v2/integrations/integration/${slug}`,{json:!0})}function toDiscoverEntries(integrations){let entries=[];for(let integration of integrations){if(!integration.isMarketplace||!integration.canInstall)continue;let integrationTags=integration.tagIds??[],products=integration.products??[];if(products.length===0){entries.push({name:integration.name,slug:integration.slug,provider:integration.name,description:integration.shortDescription??"",tags:integrationTags});continue}for(let product of products){let needsCompoundSlug=products.length>1||product.slug!==integration.slug;entries.push({name:product.name,slug:needsCompoundSlug?`${integration.slug}/${product.slug}`:integration.slug,provider:integration.name,description:product.shortDescription??integration.shortDescription??"",tags:[...integrationTags,...product.tags??[]]})}}return entries}function matchesSearchTerm(entry,term){let lower=term.toLowerCase();return entry.name.toLowerCase().includes(lower)||entry.slug.toLowerCase().includes(lower)||entry.provider.toLowerCase().includes(lower)||entry.description.toLowerCase().includes(lower)||entry.tags.some(tag=>tag.toLowerCase().includes(lower))}async function resolveAndFetchIntegration(client,slug,telemetry){let directError;try{let integration=await fetchIntegration(client,slug);return telemetry.trackCliArgumentIntegration(slug,!0),integration}catch(error){directError=error}output_manager_default.spinner("Searching marketplace integrations...",500);let entries;try{let integrations=await fetchMarketplaceIntegrationsList(client);entries=toDiscoverEntries(integrations)}catch(discoverError){return output_manager_default.stopSpinner(),output_manager_default.error(`Failed to get integration "${slug}": ${directError?.message??discoverError.message}`),telemetry.trackCliArgumentIntegration(slug,!1),null}output_manager_default.stopSpinner();let matches=entries.filter(entry=>matchesSearchTerm(entry,slug));if(!matches.length)return output_manager_default.error(`No integration found matching "${slug}". Run ${import_chalk14.default.cyan("vercel integration discover")} to browse available integrations.`),telemetry.trackCliArgumentIntegration(slug,!1),null;if(matches.length===1){let match2=matches[0];if(client.stdin.isTTY===!0&&!await client.input.confirm(`Install ${import_chalk14.default.bold(match2.name)} (${match2.slug})?`,!0))return telemetry.trackCliArgumentIntegration(slug,!1),null;slug=match2.slug}else{if(client.stdin.isTTY!==!0)return output_manager_default.error(`Found ${matches.length} integrations matching "${slug}". Available integrations:
|
|
56
56
|
${matches.map(m=>`- ${m.slug}: ${m.description}`).join(`
|
|
57
57
|
`)}`),telemetry.trackCliArgumentIntegration(slug,!1),null;slug=await client.input.select({message:`Found ${matches.length} integrations matching "${slug}". Pick one to install:`,choices:matches.map(m=>({name:`${m.name} (${m.slug})${m.description?` - ${m.description}`:""}`,value:m.slug}))})}let integrationSlug,productSlug,slashIndex=slug.indexOf("/");slashIndex!==-1?(integrationSlug=slug.substring(0,slashIndex),productSlug=slug.substring(slashIndex+1)):integrationSlug=slug;try{let integration=await fetchIntegration(client,integrationSlug);return telemetry.trackCliArgumentIntegration(integrationSlug,!0),{...integration,productSlug}}catch(error){return output_manager_default.error(`Failed to get integration "${integrationSlug}": ${error.message}`),telemetry.trackCliArgumentIntegration(integrationSlug,!1),null}}async function fetchInstallations(client,integration){let searchParams=new URLSearchParams;return searchParams.set("view","account"),searchParams.set("installationType","marketplace"),searchParams.set("integrationIdOrSlug",integration.id),client.fetch(`/v2/integrations/configurations?${searchParams}`,{json:!0})}var import_open5=__toESM(require_open(),1);var import_chalk15=__toESM(require_source(),1);var MARKETPLACE_ADDENDUM_URL="https://vercel.com/legal/integration-marketplace-end-users-addendum";function getMarketplacePolicyLinks(integration){let links={marketplace_addendum:MARKETPLACE_ADDENDUM_URL};return integration.privacyDocUri&&(links.integration_privacy_policy=integration.privacyDocUri),integration.eulaDocUri&&(links.integration_eula=integration.eulaDocUri),links}async function promptForTermAcceptance(client,integration){if(client.isAgent)return output_manager_default.error("Term acceptance cannot be performed by an AI agent. Run this command directly in your terminal."),null;if(!client.stdin.isTTY)return output_manager_default.error("Term acceptance requires an interactive terminal. Run this command in a TTY."),null;let documents=[{label:"Vercel Marketplace End User Addendum",url:MARKETPLACE_ADDENDUM_URL}];integration.privacyDocUri&&documents.push({label:"Privacy Policy",url:integration.privacyDocUri}),integration.eulaDocUri&&documents.push({label:"Terms of Service",url:integration.eulaDocUri}),output_manager_default.print(`
|
|
58
58
|
`),output_manager_default.log(`Installing ${import_chalk15.default.bold(integration.name)} requires accepting the following:`),output_manager_default.print(`
|
|
@@ -64,9 +64,9 @@ ${matches.map(m=>`- ${m.slug}: ${m.description}`).join(`
|
|
|
64
64
|
`)}else output_manager_default.log(`Visit this URL to claim ${import_chalk16.default.bold(targetResource.name)}: ${claimUrl}`),output_manager_default.log(`Re-run \`${packageName} integration list\` after claiming to verify.`);return 0}if(!client.stdin.isTTY){if(asJson){let json={resource:{id:targetResource.id,name:targetResource.name},claimUrl,status:"url_generated"};client.stdout.write(`${JSON.stringify(json,null,2)}
|
|
65
65
|
`)}else output_manager_default.log(`Visit this URL to claim ${import_chalk16.default.bold(targetResource.name)}: ${claimUrl}`),output_manager_default.log(`Re-run \`${packageName} integration list\` after claiming to verify.`);return suppressActionRequired?0:1}output_manager_default.log(`Opening browser to claim ${import_chalk16.default.bold(targetResource.name)}\u2026`),output_manager_default.log(`Visit this URL if the browser does not open: ${claimUrl}`);try{await(0,import_open6.default)(claimUrl)}catch(err){output_manager_default.debug(`Failed to open browser: ${err}`)}let result=await pollForClaim(client,targetResource.id);if(result.status==="cancelled")return 130;if(result.status==="timeout"){if(asJson){let json={resource:{id:targetResource.id,name:targetResource.name},claimUrl,status:"timeout"};client.stdout.write(`${JSON.stringify(json,null,2)}
|
|
66
66
|
`)}return 1}let claimed=result.resource;if(asJson){let json={resource:{id:claimed.id,name:claimed.name},claimUrl,status:"claimed"};return client.stdout.write(`${JSON.stringify(json,null,2)}
|
|
67
|
-
`),0}return output_manager_default.success(`Claimed ${import_chalk16.default.bold(claimed.name)}.`),0}function buildSSOLink(team,configurationId,resourceExternalId){let url=new URL("/api/marketplace/sso","https://vercel.com");return url.searchParams.set("teamId",team.id),url.searchParams.set("integrationConfigurationId",configurationId),resourceExternalId&&url.searchParams.set("resource_id",resourceExternalId),url.href}var COLORS=["gray","red","rose","yellow","amber","green","lime","emerald","blue","cyan","purple","violet","fuchsia","orange","pink","indigo","teal","sky","aero","alizarin","almond","amethyst","apricot","aqua","aquamarine","aureolin","beige","bisque","bistre","bole","bronze","byzantine","byzantium","camel","canary","carmine","celeste","cerise","cerulean","champagne","charcoal","chestnut","cinereous","cinnabar","citrine","citron","claret","cobalt","coffee","copper","coquelicot","coral","cordovan","crimson","cyclamen","erin","fulvous"],NOUNS=["apple","ball","car","dog","elephant","flower","garden","house","island","jacket","kite","lamp","mountain","notebook","ocean","park","queen","river","school","tree","umbrella","village","window","xylophone","yacht","zebra","book","chair","door","grass","anchor","arrow","basket","battery","bell","blanket","branch","bridge","brush","bucket","button","cable","candle","canvas","castle","cave","clock","cloud","coin","compass","crystal","curtain","cushion","desert","diamond","drawer","drum","engine","envelope","feather","fence","ferry","field","flame","flask","forest","fountain","globe","harbor","helmet","horizon","kettle","ladder","lantern","leaf","lens","lever","lighthouse","magnet","marble","mirror","nest","paddle","pebble","pendant","pillar","pillow","planet","plank","pocket","prism","ribbon","ridge","saddle","sail"];function randomElement(arr){return arr[Math.floor(arr.length*Math.random())]}function generateRandomNameSuffix(){return`${randomElement(COLORS)}-${randomElement(NOUNS)}`}function generateDefaultResourceName(productSlug,maxLength=128){let suffix=generateRandomNameSuffix(),fullName=`${productSlug}-${suffix}`;return fullName.length<=maxLength?fullName:fullName.slice(0,maxLength).replace(/-+$/,"")}var DEFAULT_VALIDATION_RULE={minLength:1,maxLength:128,pattern:/^[a-zA-Z0-9_-]*$/,patternErrorMessage:"Resource name can only contain letters, numbers, underscores, and hyphens"},VALIDATION_RULES={"aws-dsql":{minLength:1,maxLength:128,pattern:/^[a-zA-Z0-9_-]*$/,patternErrorMessage:"Resource name can only contain letters, numbers, underscores, and hyphens"},"aws-apg":{minLength:1,maxLength:50,pattern:/^[a-zA-Z][a-zA-Z0-9-]*$/,patternErrorMessage:"Resource name must start with a letter and can only contain letters, numbers, and hyphens",customValidation:name=>{if(name.endsWith("-"))return"Resource name cannot end with a hyphen";if(name.includes("--"))return"Resource name cannot contain consecutive hyphens"}},"aws-dynamodb":{minLength:3,maxLength:128,pattern:/^[a-zA-Z0-9_-]*$/,patternErrorMessage:"Resource name can only contain letters, numbers, underscores, and hyphens"}};function getValidationRuleForProduct(productSlug){return productSlug?VALIDATION_RULES[productSlug.toLowerCase()]??DEFAULT_VALIDATION_RULE:DEFAULT_VALIDATION_RULE}function validateResourceName(name,productSlug){let rule=getValidationRuleForProduct(productSlug);if(!name||name.trim().length===0)return"Resource name cannot be empty";if(name.length<rule.minLength)return`Resource name must be at least ${rule.minLength} character${rule.minLength===1?"":"s"}`;if(name.length>rule.maxLength)return`Resource name cannot exceed ${rule.maxLength} characters`;if(!rule.pattern.test(name))return rule.patternErrorMessage;if(rule.customValidation){let customError=rule.customValidation(name);if(customError)return customError}}function resolveResourceName(productSlug,resourceNameArg){let rule=getValidationRuleForProduct(productSlug),isAutoGenerated=resourceNameArg===void 0,resourceName=resourceNameArg??generateDefaultResourceName(productSlug,rule.maxLength),validationError=validateResourceName(resourceName,productSlug);return validationError?{error:isAutoGenerated?`${validationError}. Use --name to provide a valid resource name.`:validationError}:{resourceName}}var IntegrationAddTelemetryClient=class extends TelemetryClient{trackCliArgumentIntegration(v,known){v&&this.trackCliArgument({arg:"integration",value:known?v:this.redactedValue})}trackCliOptionName(v){v&&this.trackCliOption({option:"name",value:this.redactedValue})}trackCliOptionMetadata(v){v?.length&&this.trackCliOption({option:"metadata",value:this.redactedValue})}trackCliOptionPlan(v){v&&this.trackCliOption({option:"plan",value:this.redactedValue})}trackCliFlagNoConnect(v){v&&this.trackCliFlag("no-connect")}trackCliFlagNoEnvPull(v){v&&this.trackCliFlag("no-env-pull")}trackCliOptionEnvironment(v){v?.length&&this.trackCliOption({option:"environment",value:this.redactedValue})}trackCliOptionInstallationId(v){v&&this.trackCliOption({option:"installation-id",value:this.redactedValue})}trackMarketplaceEvent(event,props){this.trackCommandOutput({key:event,value:JSON.stringify(props)})}trackCliOptionPrefix(v){v&&this.trackCliOption({option:"prefix",value:this.redactedValue})}trackCliFlagClaim(v){v&&this.trackCliFlag("claim")}trackCliFlagNoClaim(v){v&&this.trackCliFlag("no-claim")}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var import_chalk17=__toESM(require_source(),1);function isHiddenOnCreate(prop){return prop["ui:hidden"]===!0||prop["ui:hidden"]==="create"}function getAllOptionValues(prop){let raw=prop["ui:options"];if(!raw)return;let values=raw.map(opt=>typeof opt=="string"?opt:opt.value);return values.length>0?values:void 0}function getVisibleOptions(prop){let raw=prop["ui:options"];if(!raw)return;let options=[];for(let opt of raw)typeof opt=="string"?opt&&options.push(opt):!opt.hidden&&opt.value&&options.push(opt.value);return options.length>0?options:void 0}function generateExample(key,prop){if(prop.type==="boolean")return`--
|
|
67
|
+
`),0}return output_manager_default.success(`Claimed ${import_chalk16.default.bold(claimed.name)}.`),0}function buildSSOLink(team,configurationId,resourceExternalId){let url=new URL("/api/marketplace/sso","https://vercel.com");return url.searchParams.set("teamId",team.id),url.searchParams.set("integrationConfigurationId",configurationId),resourceExternalId&&url.searchParams.set("resource_id",resourceExternalId),url.href}var COLORS=["gray","red","rose","yellow","amber","green","lime","emerald","blue","cyan","purple","violet","fuchsia","orange","pink","indigo","teal","sky","aero","alizarin","almond","amethyst","apricot","aqua","aquamarine","aureolin","beige","bisque","bistre","bole","bronze","byzantine","byzantium","camel","canary","carmine","celeste","cerise","cerulean","champagne","charcoal","chestnut","cinereous","cinnabar","citrine","citron","claret","cobalt","coffee","copper","coquelicot","coral","cordovan","crimson","cyclamen","erin","fulvous"],NOUNS=["apple","ball","car","dog","elephant","flower","garden","house","island","jacket","kite","lamp","mountain","notebook","ocean","park","queen","river","school","tree","umbrella","village","window","xylophone","yacht","zebra","book","chair","door","grass","anchor","arrow","basket","battery","bell","blanket","branch","bridge","brush","bucket","button","cable","candle","canvas","castle","cave","clock","cloud","coin","compass","crystal","curtain","cushion","desert","diamond","drawer","drum","engine","envelope","feather","fence","ferry","field","flame","flask","forest","fountain","globe","harbor","helmet","horizon","kettle","ladder","lantern","leaf","lens","lever","lighthouse","magnet","marble","mirror","nest","paddle","pebble","pendant","pillar","pillow","planet","plank","pocket","prism","ribbon","ridge","saddle","sail"];function randomElement(arr){return arr[Math.floor(arr.length*Math.random())]}function generateRandomNameSuffix(){return`${randomElement(COLORS)}-${randomElement(NOUNS)}`}function generateDefaultResourceName(productSlug,maxLength=128){let suffix=generateRandomNameSuffix(),fullName=`${productSlug}-${suffix}`;return fullName.length<=maxLength?fullName:fullName.slice(0,maxLength).replace(/-+$/,"")}var DEFAULT_VALIDATION_RULE={minLength:1,maxLength:128,pattern:/^[a-zA-Z0-9_-]*$/,patternErrorMessage:"Resource name can only contain letters, numbers, underscores, and hyphens"},VALIDATION_RULES={"aws-dsql":{minLength:1,maxLength:128,pattern:/^[a-zA-Z0-9_-]*$/,patternErrorMessage:"Resource name can only contain letters, numbers, underscores, and hyphens"},"aws-apg":{minLength:1,maxLength:50,pattern:/^[a-zA-Z][a-zA-Z0-9-]*$/,patternErrorMessage:"Resource name must start with a letter and can only contain letters, numbers, and hyphens",customValidation:name=>{if(name.endsWith("-"))return"Resource name cannot end with a hyphen";if(name.includes("--"))return"Resource name cannot contain consecutive hyphens"}},"aws-dynamodb":{minLength:3,maxLength:128,pattern:/^[a-zA-Z0-9_-]*$/,patternErrorMessage:"Resource name can only contain letters, numbers, underscores, and hyphens"}};function getValidationRuleForProduct(productSlug){return productSlug?VALIDATION_RULES[productSlug.toLowerCase()]??DEFAULT_VALIDATION_RULE:DEFAULT_VALIDATION_RULE}function validateResourceName(name,productSlug){let rule=getValidationRuleForProduct(productSlug);if(!name||name.trim().length===0)return"Resource name cannot be empty";if(name.length<rule.minLength)return`Resource name must be at least ${rule.minLength} character${rule.minLength===1?"":"s"}`;if(name.length>rule.maxLength)return`Resource name cannot exceed ${rule.maxLength} characters`;if(!rule.pattern.test(name))return rule.patternErrorMessage;if(rule.customValidation){let customError=rule.customValidation(name);if(customError)return customError}}function resolveResourceName(productSlug,resourceNameArg){let rule=getValidationRuleForProduct(productSlug),isAutoGenerated=resourceNameArg===void 0,resourceName=resourceNameArg??generateDefaultResourceName(productSlug,rule.maxLength),validationError=validateResourceName(resourceName,productSlug);return validationError?{error:isAutoGenerated?`${validationError}. Use --name to provide a valid resource name.`:validationError}:{resourceName}}var IntegrationAddTelemetryClient=class extends TelemetryClient{trackCliArgumentIntegration(v,known){v&&this.trackCliArgument({arg:"integration",value:known?v:this.redactedValue})}trackCliOptionName(v){v&&this.trackCliOption({option:"name",value:this.redactedValue})}trackCliOptionMeta(v){v?.length&&this.trackCliOption({option:"meta",value:this.redactedValue})}trackCliOptionMetadata(v){v?.length&&this.trackCliOption({option:"metadata",value:this.redactedValue})}trackCliOptionBillingPlan(v){v&&this.trackCliOption({option:"billing-plan",value:this.redactedValue})}trackCliOptionPlan(v){v&&this.trackCliOption({option:"plan",value:this.redactedValue})}trackCliFlagNoConnect(v){v&&this.trackCliFlag("no-connect")}trackCliFlagNoEnvPull(v){v&&this.trackCliFlag("no-env-pull")}trackCliOptionEnvironment(v){v?.length&&this.trackCliOption({option:"environment",value:this.redactedValue})}trackCliOptionInstallation(v){v&&this.trackCliOption({option:"installation",value:this.redactedValue})}trackCliOptionInstallationId(v){v&&this.trackCliOption({option:"installation-id",value:this.redactedValue})}trackMarketplaceEvent(event,props){this.trackCommandOutput({key:event,value:JSON.stringify(props)})}trackCliOptionPrefix(v){v&&this.trackCliOption({option:"prefix",value:this.redactedValue})}trackCliFlagClaim(v){v&&this.trackCliFlag("claim")}trackCliFlagNoClaim(v){v&&this.trackCliFlag("no-claim")}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var import_chalk17=__toESM(require_source(),1);function isHiddenOnCreate(prop){return prop["ui:hidden"]===!0||prop["ui:hidden"]==="create"}function getAllOptionValues(prop){let raw=prop["ui:options"];if(!raw)return;let values=raw.map(opt=>typeof opt=="string"?opt:opt.value);return values.length>0?values:void 0}function getVisibleOptions(prop){let raw=prop["ui:options"];if(!raw)return;let options=[];for(let opt of raw)typeof opt=="string"?opt&&options.push(opt):!opt.hidden&&opt.value&&options.push(opt.value);return options.length>0?options:void 0}function generateExample(key,prop){if(prop.type==="boolean")return`--meta ${key}=true`;if(prop.type==="array"){let options2=getVisibleOptions(prop);return options2&&options2.length>=2?`--meta "${key}=${options2[0]},${options2[1]}"`:options2&&options2.length===1?`--meta "${key}=${options2[0]}"`:prop.items?.type==="number"?prop.default!==void 0?`--meta ${key}=${prop.default}`:`--meta ${key}=N,N`:`--meta "${key}=value1,value2"`}if(prop.type==="number")return prop.default!==void 0?`--meta ${key}=${prop.default}`:prop.minimum!==void 0?`--meta ${key}=${prop.minimum}`:`--meta ${key}=N`;let options=getVisibleOptions(prop);return options&&options.length>0?`--meta ${key}=${options[0]}`:`--meta ${key}=<value>`}function isServerHandledRegion(prop){let control=prop["ui:control"];return control==="vercel-region"||control==="multi-vercel-region"}function formatMetadataSchemaHelp(schema,integrationName,productSlug){let lines=[];lines.push("");let header=productSlug?` Metadata options for "${integrationName}/${productSlug}":`:` Metadata options for "${integrationName}":`;lines.push(import_chalk17.default.bold(header)),lines.push("");let required=new Set(schema.required??[]),entries=Object.entries(schema.properties);if(entries.length===0)return lines.push(" No metadata options available."),lines.join(`
|
|
68
68
|
`);for(let[key,prop]of entries){if(isHiddenOnCreate(prop))continue;let requiredSuffix=required.has(key)&&!isServerHandledRegion(prop)?import_chalk17.default.red(" (required)"):"",typeHint=prop.type==="boolean"?import_chalk17.default.dim(" (true/false)"):prop.type==="array"?import_chalk17.default.dim(" (comma-separated)"):"";lines.push(` ${import_chalk17.default.cyan(key)}${requiredSuffix}${typeHint}`),prop.description&&lines.push(` ${prop.description}`);let visibleOptions=getVisibleOptions(prop);if(visibleOptions&&lines.push(` Options: ${visibleOptions.join(", ")}`),prop.minimum!==void 0||prop.maximum!==void 0){let range=[];prop.minimum!==void 0&&range.push(`min: ${prop.minimum}`),prop.maximum!==void 0&&range.push(`max: ${prop.maximum}`),lines.push(` Range: ${range.join(", ")}`)}prop.default!==void 0&&lines.push(` Default: ${prop.default}`);let example=generateExample(key,prop);example&&lines.push(` Example: ${import_chalk17.default.dim(example)}`),lines.push("")}return lines.join(`
|
|
69
|
-
`)}function mergeMetadataSchemas(productSchema,integrationSchema){if(!(!productSchema&&!integrationSchema))return integrationSchema?productSchema?{type:"object",properties:{...integrationSchema.properties,...productSchema.properties},required:[...new Set([...integrationSchema.required??[],...productSchema.required??[]])]}:integrationSchema:productSchema}function parseMetadataFlags(rawMetadata,schema){let metadata={},errors=[];if(!rawMetadata?.length)return{metadata,errors};for(let item of rawMetadata){let eqIndex=item.indexOf("=");if(eqIndex===-1){errors.push(`Invalid metadata format: "${item}". Expected KEY=VALUE`);continue}let key=item.slice(0,eqIndex).trim(),value=item.slice(eqIndex+1).trim(),propSchema=schema.properties[key];if(!propSchema){errors.push(`Unknown metadata key: "${key}"`);continue}if(propSchema.type==="boolean")value==="true"?metadata[key]=!0:value==="false"?metadata[key]=!1:errors.push(`Metadata "${key}" must be "true" or "false", got: "${value}"`);else if(propSchema.type==="number"){if(value===""){errors.push(`Metadata "${key}" must be a number, got: ""`);continue}let num=Number(value);if(Number.isNaN(num)||!Number.isFinite(num)){errors.push(`Metadata "${key}" must be a number, got: "${value}"`);continue}if(propSchema.minimum!==void 0&&num<propSchema.minimum){errors.push(`Metadata "${key}" must be >= ${propSchema.minimum}`);continue}if(propSchema.maximum!==void 0&&num>propSchema.maximum){errors.push(`Metadata "${key}" must be <= ${propSchema.maximum}`);continue}metadata[key]=num}else if(propSchema.type==="array"){let items=value.split(",").map(v=>v.trim()).filter(v=>v.length>0);if(propSchema.items?.type==="number"){let nums=[],hasError=!1;for(let item2 of items){if(item2===""){errors.push(`Metadata "${key}" contains invalid number: ""`),hasError=!0;break}let num=Number(item2);if(Number.isNaN(num)||!Number.isFinite(num)){errors.push(`Metadata "${key}" contains invalid number: "${item2}"`),hasError=!0;break}if(propSchema.minimum!==void 0&&num<propSchema.minimum){errors.push(`Metadata "${key}" contains number ${num} below minimum ${propSchema.minimum}`),hasError=!0;break}if(propSchema.maximum!==void 0&&num>propSchema.maximum){errors.push(`Metadata "${key}" contains number ${num} above maximum ${propSchema.maximum}`),hasError=!0;break}nums.push(num)}hasError||(metadata[key]=nums)}else{let validValues=getAllOptionValues(propSchema);if(validValues){let prevErrorCount=errors.length;for(let item2 of items)validValues.includes(item2)||errors.push(`Metadata "${key}" contains invalid value: "${item2}". Must be one of: ${validValues.join(", ")}`);if(errors.length>prevErrorCount)continue}metadata[key]=items}}else{let validValues=getAllOptionValues(propSchema);if(validValues&&!validValues.includes(value)){errors.push(`Metadata "${key}" must be one of: ${validValues.join(", ")}`);continue}metadata[key]=value}}return{metadata,errors}}function validateRequiredMetadata(metadata,schema){let errors=[],required=schema.required??[];for(let key of required){let propSchema=schema.properties[key];propSchema&&isHiddenOnCreate(propSchema)||propSchema&&isServerHandledRegion(propSchema)||metadata[key]===void 0&&propSchema?.default===void 0&&errors.push(`Required metadata missing: "${key}"`)}return errors}function validateAndPrintRequiredMetadata(metadata,schema){let errors=validateRequiredMetadata(metadata,schema);for(let error of errors)output_manager_default.error(error);return errors.length===0}async function resolveProjectEnvironments(client,project,requestedEnvironments){let seenInputs=new Set;for(let input of requestedEnvironments){if(seenInputs.has(input))return{valid:!1,error:`Duplicate environment selection: "${input}" was specified more than once. Specify each environment only once.`};seenInputs.add(input)}let validation=validateEnvironments(requestedEnvironments),customEnvironmentInputs=validation.valid?[]:validation.invalid,customEnvironments=project&&customEnvironmentInputs.length>0?await getCustomEnvironments(client,project.id):[],customEnvironmentByInput=new Map;for(let environment of customEnvironments)customEnvironmentByInput.set(environment.slug,environment.id),customEnvironmentByInput.set(environment.id,environment.id);let invalid=[],resolved=[];for(let input of requestedEnvironments){let value=validateEnvironments([input]).valid?input:customEnvironmentByInput.get(input);value===void 0?invalid.push(input):resolved.push({input,value})}if(invalid.length>0){let projectGuidance=project?`, or a Custom Environment slug or ID from project ${project.name}`:". Custom Environment slugs and IDs require a linked project";return{valid:!1,error:`Invalid environment value: ${invalid.map(environment=>`"${environment}"`).join(", ")}. Must be one of: ${VALID_ENVIRONMENTS.join(", ")}${projectGuidance}.`}}let firstInputByEnvironment=new Map;for(let environment of resolved){let firstInput=firstInputByEnvironment.get(environment.value);if(firstInput!==void 0)return{valid:!1,error:`Duplicate environment selection: "${firstInput}" and "${environment.input}" refer to the same environment. Specify each environment only once.`};firstInputByEnvironment.set(environment.value,environment.input)}return{valid:!0,environments:resolved.map(environment=>environment.value)}}async function addAutoProvision(client,integrationSlugOrQuery,resourceNameArg,options={}){let commandName=options.commandName??"integration add",telemetry=new IntegrationAddTelemetryClient({opts:{store:client.telemetryEventStore}});telemetry.trackCliOptionName(resourceNameArg),telemetry.trackCliOptionMetadata(options.metadata),telemetry.trackCliFlagNoConnect(options.noConnect),telemetry.trackCliFlagNoEnvPull(options.noEnvPull),telemetry.trackCliOptionPlan(options.
|
|
69
|
+
`)}function mergeMetadataSchemas(productSchema,integrationSchema){if(!(!productSchema&&!integrationSchema))return integrationSchema?productSchema?{type:"object",properties:{...integrationSchema.properties,...productSchema.properties},required:[...new Set([...integrationSchema.required??[],...productSchema.required??[]])]}:integrationSchema:productSchema}function parseMetadataFlags(rawMetadata,schema){let metadata={},errors=[];if(!rawMetadata?.length)return{metadata,errors};for(let item of rawMetadata){let eqIndex=item.indexOf("=");if(eqIndex===-1){errors.push(`Invalid metadata format: "${item}". Expected KEY=VALUE`);continue}let key=item.slice(0,eqIndex).trim(),value=item.slice(eqIndex+1).trim(),propSchema=schema.properties[key];if(!propSchema){errors.push(`Unknown metadata key: "${key}"`);continue}if(propSchema.type==="boolean")value==="true"?metadata[key]=!0:value==="false"?metadata[key]=!1:errors.push(`Metadata "${key}" must be "true" or "false", got: "${value}"`);else if(propSchema.type==="number"){if(value===""){errors.push(`Metadata "${key}" must be a number, got: ""`);continue}let num=Number(value);if(Number.isNaN(num)||!Number.isFinite(num)){errors.push(`Metadata "${key}" must be a number, got: "${value}"`);continue}if(propSchema.minimum!==void 0&&num<propSchema.minimum){errors.push(`Metadata "${key}" must be >= ${propSchema.minimum}`);continue}if(propSchema.maximum!==void 0&&num>propSchema.maximum){errors.push(`Metadata "${key}" must be <= ${propSchema.maximum}`);continue}metadata[key]=num}else if(propSchema.type==="array"){let items=value.split(",").map(v=>v.trim()).filter(v=>v.length>0);if(propSchema.items?.type==="number"){let nums=[],hasError=!1;for(let item2 of items){if(item2===""){errors.push(`Metadata "${key}" contains invalid number: ""`),hasError=!0;break}let num=Number(item2);if(Number.isNaN(num)||!Number.isFinite(num)){errors.push(`Metadata "${key}" contains invalid number: "${item2}"`),hasError=!0;break}if(propSchema.minimum!==void 0&&num<propSchema.minimum){errors.push(`Metadata "${key}" contains number ${num} below minimum ${propSchema.minimum}`),hasError=!0;break}if(propSchema.maximum!==void 0&&num>propSchema.maximum){errors.push(`Metadata "${key}" contains number ${num} above maximum ${propSchema.maximum}`),hasError=!0;break}nums.push(num)}hasError||(metadata[key]=nums)}else{let validValues=getAllOptionValues(propSchema);if(validValues){let prevErrorCount=errors.length;for(let item2 of items)validValues.includes(item2)||errors.push(`Metadata "${key}" contains invalid value: "${item2}". Must be one of: ${validValues.join(", ")}`);if(errors.length>prevErrorCount)continue}metadata[key]=items}}else{let validValues=getAllOptionValues(propSchema);if(validValues&&!validValues.includes(value)){errors.push(`Metadata "${key}" must be one of: ${validValues.join(", ")}`);continue}metadata[key]=value}}return{metadata,errors}}function validateRequiredMetadata(metadata,schema){let errors=[],required=schema.required??[];for(let key of required){let propSchema=schema.properties[key];propSchema&&isHiddenOnCreate(propSchema)||propSchema&&isServerHandledRegion(propSchema)||metadata[key]===void 0&&propSchema?.default===void 0&&errors.push(`Required metadata missing: "${key}"`)}return errors}function validateAndPrintRequiredMetadata(metadata,schema){let errors=validateRequiredMetadata(metadata,schema);for(let error of errors)output_manager_default.error(error);return errors.length===0}async function resolveProjectEnvironments(client,project,requestedEnvironments){let seenInputs=new Set;for(let input of requestedEnvironments){if(seenInputs.has(input))return{valid:!1,error:`Duplicate environment selection: "${input}" was specified more than once. Specify each environment only once.`};seenInputs.add(input)}let validation=validateEnvironments(requestedEnvironments),customEnvironmentInputs=validation.valid?[]:validation.invalid,customEnvironments=project&&customEnvironmentInputs.length>0?await getCustomEnvironments(client,project.id):[],customEnvironmentByInput=new Map;for(let environment of customEnvironments)customEnvironmentByInput.set(environment.slug,environment.id),customEnvironmentByInput.set(environment.id,environment.id);let invalid=[],resolved=[];for(let input of requestedEnvironments){let value=validateEnvironments([input]).valid?input:customEnvironmentByInput.get(input);value===void 0?invalid.push(input):resolved.push({input,value})}if(invalid.length>0){let projectGuidance=project?`, or a Custom Environment slug or ID from project ${project.name}`:". Custom Environment slugs and IDs require a linked project";return{valid:!1,error:`Invalid environment value: ${invalid.map(environment=>`"${environment}"`).join(", ")}. Must be one of: ${VALID_ENVIRONMENTS.join(", ")}${projectGuidance}.`}}let firstInputByEnvironment=new Map;for(let environment of resolved){let firstInput=firstInputByEnvironment.get(environment.value);if(firstInput!==void 0)return{valid:!1,error:`Duplicate environment selection: "${firstInput}" and "${environment.input}" refer to the same environment. Specify each environment only once.`};firstInputByEnvironment.set(environment.value,environment.input)}return{valid:!0,environments:resolved.map(environment=>environment.value)}}async function addAutoProvision(client,integrationSlugOrQuery,resourceNameArg,options={}){let commandName=options.commandName??"integration add",telemetry=new IntegrationAddTelemetryClient({opts:{store:client.telemetryEventStore}});telemetry.trackCliOptionName(resourceNameArg),telemetry.trackCliOptionMeta(options.flags?.["--meta"]),telemetry.trackCliOptionMetadata(options.flags?.["--metadata"]),telemetry.trackCliFlagNoConnect(options.noConnect),telemetry.trackCliFlagNoEnvPull(options.noEnvPull),telemetry.trackCliOptionBillingPlan(options.flags?.["--billing-plan"]),telemetry.trackCliOptionPlan(options.flags?.["--plan"]),telemetry.trackCliOptionInstallation(options.flags?.["--installation"]),telemetry.trackCliOptionInstallationId(options.flags?.["--installation-id"]),telemetry.trackCliOptionEnvironment(options.environments),telemetry.trackCliOptionPrefix(options.prefix),telemetry.trackCliOptionFormat(options.asJson?"json":void 0);let{contextName,team}=await getScope(client);if(!team)return output_manager_default.error("Team not found"),1;if(client.config.currentTeam=team.id,options.environments?.length){let project;if(!validateEnvironments(options.environments).valid){let linkedProject=await getLinkedProject(client);if(linkedProject.status==="error")return linkedProject.exitCode;project=linkedProject.status==="linked"?linkedProject.project:void 0}let environmentResult=await resolveProjectEnvironments(client,project,options.environments);if(!environmentResult.valid)return output_manager_default.error(environmentResult.error),1;options.environments=environmentResult.environments}let integration=await resolveAndFetchIntegration(client,integrationSlugOrQuery,telemetry);if(!integration)return 1;if(integration.productSlug&&!options.productSlug&&(options.productSlug=integration.productSlug),!integration.products?.length)return output_manager_default.error(`Integration "${integration.slug}" is not a Marketplace integration`),1;if(!options.productSlug&&integration.products.length>1&&!client.stdin.isTTY){let choices=integration.products.map(p=>` ${integration.slug}/${p.slug}`).join(`
|
|
70
70
|
`);return output_manager_default.error(`Integration "${integration.slug}" has multiple products. Specify one with:
|
|
71
71
|
|
|
72
72
|
${choices}
|
|
@@ -75,12 +75,12 @@ Example: vercel ${commandName} ${integration.slug}/${integration.products[0].slu
|
|
|
75
75
|
`),slug=options.productSlug?`${integration.slug}/${options.productSlug}`:integration.slug;return telemetry.trackMarketplaceEvent("marketplace_install_flow_multiple_installations",{...baseProps,installation_count:result.installations.length}),output_manager_default.error(`Multiple installations found for "${integration.slug}":
|
|
76
76
|
${installationsList2}
|
|
77
77
|
|
|
78
|
-
Re-run with --installation
|
|
79
|
-
vercel ${commandName} ${slug} --installation
|
|
80
|
-
`),setupResult.connectError?0:setupResult.exitCode}return setupResult.exitCode}async function add2(client,args,flags,commandName){let resourceNameArg=flags["--name"],
|
|
81
|
-
`)}var import_chalk20=__toESM(require_source(),1);function formatBillingPlansHelp(productName,plans){let enabledPlans=plans.filter(p=>!p.disabled);if(enabledPlans.length===0)return"";let lines=[];lines.push(""),lines.push(` ${import_chalk20.default.dim("Available billing plans for")} "${import_chalk20.default.bold(productName)}"${import_chalk20.default.dim(":")}`),lines.push("");let maxIdLen=Math.max(...enabledPlans.map(p=>p.id.length));for(let plan of enabledPlans){let paddedId=plan.id.padEnd(maxIdLen),cost=plan.cost?import_chalk20.default.dim(` (${plan.cost})`):"";lines.push(` ${import_chalk20.default.cyan(paddedId)} ${plan.name}${cost}`)}return lines.push(""),lines.push(` ${import_chalk20.default.dim("Usage:")}`),lines.push(""),lines.push(` ${import_chalk20.default.cyan(`--plan ${enabledPlans[0].id}`)}`),lines.push(""),lines.join(`
|
|
82
|
-
`)}var import_chalk21=__toESM(require_source(),1);function formatDynamicExamples(integrationSlug,products,commandName="integration add"){let lines=[];if(lines.push(""),lines.push(` ${import_chalk21.default.dim("Examples:")}`),lines.push(""),lines.push(` ${import_chalk21.default.dim("-")} Install ${integrationSlug}`),lines.push(""),lines.push(` ${import_chalk21.default.cyan(`$ ${packageName} ${commandName} ${integrationSlug}`)}`),products.length>1){let firstProduct=products[0];lines.push(""),lines.push(` ${import_chalk21.default.dim("-")} Install a specific product`),lines.push(""),lines.push(` ${import_chalk21.default.cyan(`$ ${packageName} ${commandName} ${integrationSlug}/${firstProduct.slug}`)}`)}lines.push(""),lines.push(` ${import_chalk21.default.dim("-")} Install with a custom resource name`),lines.push(""),lines.push(` ${import_chalk21.default.cyan(`$ ${packageName} ${commandName} ${integrationSlug} --name my-resource`)}`);let metadataExample=buildMetadataExample(integrationSlug,products,commandName);return metadataExample&&(lines.push(""),lines.push(` ${import_chalk21.default.dim("-")} Install with metadata`),lines.push(""),lines.push(` ${import_chalk21.default.cyan(`$ ${metadataExample}`)}`)),lines.push(""),lines.push(` ${import_chalk21.default.dim("-")} Install with a specific billing plan`),lines.push(""),lines.push(` ${import_chalk21.default.cyan(`$ ${packageName} ${commandName} ${integrationSlug} --plan pro`)}`),lines.push(""),lines.push(` ${import_chalk21.default.dim("-")} Install and connect to specific environments only`),lines.push(""),lines.push(` ${import_chalk21.default.cyan(`$ ${packageName} ${commandName} ${integrationSlug} -e production -e preview`)}`),lines.push(""),lines.push(` ${import_chalk21.default.dim("-")} Install without connecting to the current project`),lines.push(""),lines.push(` ${import_chalk21.default.cyan(`$ ${packageName} ${commandName} ${integrationSlug} --no-connect`)}`),lines.push(""),lines.push(` ${import_chalk21.default.dim("-")} Install without pulling environment variables`),lines.push(""),lines.push(` ${import_chalk21.default.cyan(`$ ${packageName} ${commandName} ${integrationSlug} --no-env-pull`)}`),lines.push(""),lines.push(` ${import_chalk21.default.dim("-")} Install with a prefix for environment variable names`),lines.push(""),lines.push(` ${import_chalk21.default.cyan(`$ ${packageName} ${commandName} ${integrationSlug} --prefix NEON2_`)}`),lines.push(""),lines.push(` ${import_chalk21.default.dim("-")} Output as JSON`),lines.push(` ${import_chalk21.default.cyan(`$ ${packageName} ${commandName} ${integrationSlug} --json`)}`),lines.push(""),lines.push(` ${import_chalk21.default.dim("-")} Install using a specific installation`),lines.push(""),lines.push(` ${import_chalk21.default.cyan(`$ ${packageName} ${commandName} ${integrationSlug} --installation
|
|
83
|
-
`)}function buildMetadataExample(integrationSlug,products,commandName){for(let product of products){let schema=product.metadataSchema;if(!schema)continue;let flags=[];for(let[key,prop]of Object.entries(schema.properties))if(!isHiddenOnCreate(prop)){if(prop.type==="boolean")flags.push(`--
|
|
78
|
+
Re-run with --installation to select one, e.g.:
|
|
79
|
+
vercel ${commandName} ${slug} --installation ${result.installations[0].id}`),1}if(result.kind!=="provisioned"){let fallback=result;telemetry.trackMarketplaceEvent("marketplace_install_flow_web_fallback",{...baseProps,reason:fallback.reason??fallback.kind,auto_provision_result_kind:fallback.kind,auto_provision_result_reason:fallback.reason,auto_provision_error_message:fallback.error_message}),output_manager_default.debug(`Fallback required - kind: ${fallback.kind}`),output_manager_default.debug(`Fallback URL from API: ${fallback.url}`);let projectLink=await getLinkedProjectField(client,options.noConnect,"name");if(projectLink.exitCode!==void 0)return projectLink.exitCode;let missingRequired=(mergedParsingSchema.required??[]).filter(key=>{if(key in metadata||key in installationMetadata)return!1;let prop=mergedParsingSchema.properties[key];return prop&&!isServerHandledRegion(prop)});if(missingRequired.length>0){let examples=missingRequired.map(key=>{let prop=mergedParsingSchema.properties[key],exampleVal=(prop?getVisibleOptions(prop):void 0)?.[0]??"<value>";return`--meta ${key}=${exampleVal}`});return output_manager_default.error(`Missing required metadata: ${missingRequired.join(", ")}.`),output_manager_default.log(` Provide ${examples.join(" ")} to provision directly from the CLI.`),output_manager_default.log(` Run \`vercel ${commandName} ${integration.slug} --help\` for all metadata options.`),1}let url=new URL(fallback.url);url.searchParams.set("defaultResourceName",resourceName),url.searchParams.set("source","cli"),Object.keys(metadata).length>0&&url.searchParams.set("metadata",JSON.stringify(metadata)),Object.keys(installationMetadata).length>0&&url.searchParams.set("installationMetadata",JSON.stringify(installationMetadata)),projectLink.value&&url.searchParams.set("projectSlug",projectLink.value),options.billingPlanId&&url.searchParams.set("planId",options.billingPlanId),options.environments?.length&&url.searchParams.set("environment",options.environments.join(","));let setupMessage=fallback.error_message?`Additional setup required: ${fallback.error_message}`:"Additional setup required.";return outputActionRequired(client,{status:"action_required",reason:AGENT_REASON.INTEGRATION_SETUP_REQUIRED,message:`${setupMessage} Finish setup for "${integration.name}" in the browser at verification_uri. This command does not wait for it in non-interactive mode.`,verification_uri:url.href,userActionRequired:!0,next:[{command:buildCommandWithGlobalFlags(client.argv,"integration list",packageName,{prependGlobalFlags:!0}),when:"Confirm the resource exists after setup is finished in the browser"}]}),output_manager_default.log(setupMessage),output_manager_default.log("Opening browser to finish setup..."),output_manager_default.log(`Visit this URL if the browser does not open: ${url.href}`),(0,import_open7.default)(url.href).catch(err=>output_manager_default.debug(`Failed to open browser: ${err}`)),1}let provisioned=result;telemetry.trackMarketplaceEvent("marketplace_checkout_provisioning_completed",{...baseProps,resource_id:provisioned.resource.id}),output_manager_default.debug(`Provisioned resource: ${JSON.stringify(provisioned.resource,null,2)}`),output_manager_default.debug(`Installation: ${JSON.stringify(provisioned.installation,null,2)}`),output_manager_default.debug(`Billing plan: ${JSON.stringify(provisioned.billingPlan,null,2)}`),output_manager_default.success(`${product.name} successfully provisioned: ${import_chalk18.default.bold(resourceName)}`);let isSandbox=provisioned.resource.ownership==="sandbox";if(isSandbox&&!options.noClaim)if(telemetry.trackCliFlagClaim(options.claim),telemetry.trackCliFlagNoClaim(options.noClaim),options.claim||client.stdin.isTTY&&!options.asJson){let runClaim=!!options.claim;if(!runClaim&&client.stdin.isTTY&&(runClaim=await client.input.confirm(`${import_chalk18.default.bold(resourceName)} is a sandbox resource. Claim it now?`,!0)),runClaim)try{let targetResource=(await getResources(client)).find(r=>r.id===provisioned.resource.id);targetResource?await runClaimForResource(client,targetResource,{suppressActionRequired:!0}):output_manager_default.warn(`Could not locate the newly provisioned resource. Run \`${packageName} integration resource claim ${resourceName}\` to claim it.`)}catch(error){output_manager_default.warn(`Failed to start claim flow: ${error.message}. Run \`${packageName} integration resource claim ${resourceName}\` to retry.`)}}else output_manager_default.log(`Sandbox resource \u2014 claim it with: ${import_chalk18.default.cyan(`vercel integration resource claim ${resourceName}`)}`);else isSandbox&&options.noClaim&&(telemetry.trackCliFlagNoClaim(options.noClaim),output_manager_default.log(`Sandbox resource \u2014 claim it later with: ${import_chalk18.default.cyan(`vercel integration resource claim ${resourceName}`)}`));let guideCommand=`vercel integration guide ${integration.products.length>1?`${integration.slug}/${product.slug}`:integration.slug}`;output_manager_default.log(indent_default(`Guide: Run ${import_chalk18.default.cyan(`\`${guideCommand}\``)} for getting started guides and code snippets`,4));let setupResult=await postProvisionSetup(client,resourceName,provisioned.resource.id,contextName,{...options,integrationSlug:integration.slug,installationId:provisioned.installation.id,onProjectConnected:projectId=>{telemetry.trackMarketplaceEvent("marketplace_project_connected",{...baseProps,project_id:projectId,resource_id:provisioned.resource.id})},onProjectConnectFailed:(projectId,error)=>{telemetry.trackMarketplaceEvent("marketplace_project_connect_failed",{...baseProps,project_id:projectId,resource_id:provisioned.resource.id,error_message:error.message})}}),skills=resolveProductSkills(product),failedSkills=[];if(skills.length){options.asJson||output_manager_default.spinner(`Installing agent skills for ${product.name}...`);let skillsTelemetryMetadata=JSON.stringify({origin:"vercel-cli",flow:"integration-install",integration:integration.slug,product:product.slug});for(let skill of skills){let args=["--yes","skills","add",skill.repoUrl,...skill.skill?["--skill",skill.skill]:[],"--yes","--metadata",skillsTelemetryMetadata],result2=await(0,import_execa.default)("npx",args,{cwd:client.cwd,stdio:"pipe",reject:!1});result2.exitCode!==0&&(failedSkills.push(skill),output_manager_default.debug(`skills add failed: ${result2.stderr}`),options.asJson||output_manager_default.warn(`Failed to install ${skill.skill??skill.repoUrl}. Run it manually: ${import_chalk18.default.cyan(skill.command)}`))}let installed=skills.length-failedSkills.length;if(installed>0&&!options.asJson){let marketplaceUrl=integration.products.length>1?`https://vercel.com/marketplace/${integration.slug}/${product.slug}`:`https://vercel.com/marketplace/${integration.slug}`;output_manager_default.log(`Installed ${installed} agent skill${installed===1?"":"s"} for ${import_chalk18.default.bold(product.name)}`),output_manager_default.log(indent_default(`Learn more: ${output_manager_default.link(marketplaceUrl,marketplaceUrl,{fallback:!1})}`,2))}}if(options.asJson){let warnings=(options.deprecations??[]).flatMap(warning=>warning?[warning.message]:[]);setupResult.connectError&&warnings.push(`Failed to connect to project: ${setupResult.connectError}`),setupResult.connected&&!setupResult.envPulled&&!options.noEnvPull&&warnings.push(ENV_PULL_FAILED_MESSAGE);for(let skill of failedSkills)warnings.push(`Failed to install ${skill.skill??skill.repoUrl}. Run it manually: ${skill.command}`);let jsonOutput={resource:{id:provisioned.resource.id,name:provisioned.resource.name,status:provisioned.resource.status,externalResourceId:provisioned.resource.externalResourceId,...provisioned.resource.ownership&&{ownership:provisioned.resource.ownership}},integration:{id:provisioned.integration.id,slug:provisioned.integration.slug,name:provisioned.integration.name},product:{id:provisioned.product.id,slug:provisioned.product.slug,name:provisioned.product.name},installation:{id:provisioned.installation.id},billingPlan:provisioned.billingPlan?{id:provisioned.billingPlan.id,name:provisioned.billingPlan.name,type:provisioned.billingPlan.type}:null,dashboardUrl:setupResult.dashboardUrl,ssoUrl:{integration:buildSSOLink(team,provisioned.installation.id),resource:buildSSOLink(team,provisioned.installation.id,provisioned.resource.externalResourceId)},project:setupResult.project??null,connected:setupResult.connected,connectError:setupResult.connectError??null,environments:setupResult.environments,envPulled:setupResult.envPulled,guideCommand,skills:skills.map(skill=>({...skill,installed:!failedSkills.includes(skill)})),warnings};return client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
|
|
80
|
+
`),setupResult.connectError?0:setupResult.exitCode}return setupResult.exitCode}async function add2(client,args,flags,commandName){let resourceNameArg=flags["--name"],prefix=flags["--prefix"];if(prefix!==void 0&&!/^[a-zA-Z][a-zA-Z0-9_]*$/.test(prefix))return output_manager_default.error("Invalid --prefix value. It must start with a letter and contain only letters, digits, and underscores."),2;let formatResult=validateJsonOutput(flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput,argv=client.argv.slice(2),spec=getFlagsSpecification(addSubcommand.options),meta=getRenamedOption(flags,"--meta","--metadata",{json:asJson,typedName:getTypedOptionName(argv,spec,"--metadata")});if("error"in meta)return reportRenamedOptionError(client,meta.error,{json:asJson});let billingPlan=getRenamedOption(flags,"--billing-plan","--plan",{json:asJson,typedName:getTypedOptionName(argv,spec,"--plan")});if("error"in billingPlan)return reportRenamedOptionError(client,billingPlan.error,{json:asJson});let installation=getRenamedOption(flags,"--installation","--installation-id",{json:asJson});if("error"in installation)return reportRenamedOptionError(client,installation.error,{json:asJson});let metadataFlags=meta.value,billingPlanId=billingPlan.value,installationId=installation.value;if(args.length>1)return output_manager_default.error("Cannot install more than one integration at a time"),2;let rawArg=args[0];if(!rawArg){let message="You must pass an integration slug";return outputAgentError(client,{status:"error",reason:AGENT_REASON.MISSING_ARGUMENTS,message,hint:`Example: \`${packageName} integration add <integration-slug>\`. Run \`${packageName} integration discover\` to find slugs.`,next:[{command:buildCommandWithGlobalFlags(client.argv,"integration discover",packageName,{prependGlobalFlags:!0}),when:"List available marketplace integrations and slugs"},{command:buildCommandWithGlobalFlags(client.argv,"integration add neon",packageName,{prependGlobalFlags:!0}),when:"Install after replacing neon with a slug from discover"}]},2),output_manager_default.error(message),2}let integrationSlug,productSlug,slashIndex=rawArg.indexOf("/");if(slashIndex!==-1){if(integrationSlug=rawArg.substring(0,slashIndex),productSlug=rawArg.substring(slashIndex+1),!integrationSlug||!productSlug)return output_manager_default.error("Invalid format. Expected: <integration-name>/<product-slug>"),2}else integrationSlug=rawArg;let environments=flags["--environment"],claimFlag=flags["--claim"],noClaimFlag=flags["--no-claim"];return claimFlag&&noClaimFlag?(output_manager_default.error("Cannot use both --claim and --no-claim."),2):await addAutoProvision(client,integrationSlug,resourceNameArg,{productSlug,metadata:metadataFlags,billingPlanId,installationId,noConnect:flags["--no-connect"],noEnvPull:flags["--no-env-pull"],environments,prefix,commandName,asJson,claim:claimFlag,noClaim:noClaimFlag,flags,deprecations:[meta.warning,billingPlan.warning,installation.warning]})}var import_chalk19=__toESM(require_source(),1);function formatProductHelp(integrationSlug,products,commandName="integration add"){let lines=[];lines.push(""),lines.push(` ${import_chalk19.default.dim("Available products for")} "${import_chalk19.default.bold(integrationSlug)}"${import_chalk19.default.dim(":")}`),lines.push("");let maxSlugLen=Math.max(...products.map(p=>p.slug.length));for(let product of products){let paddedSlug=product.slug.padEnd(maxSlugLen);lines.push(` ${import_chalk19.default.cyan(paddedSlug)} ${product.name}`)}return lines.push(""),lines.push(` ${import_chalk19.default.dim("Usage:")}`),lines.push(""),lines.push(` ${import_chalk19.default.cyan(`$ ${packageName} ${commandName} ${integrationSlug}/<product-slug>`)}`),lines.push(""),lines.join(`
|
|
81
|
+
`)}var import_chalk20=__toESM(require_source(),1);function formatBillingPlansHelp(productName,plans){let enabledPlans=plans.filter(p=>!p.disabled);if(enabledPlans.length===0)return"";let lines=[];lines.push(""),lines.push(` ${import_chalk20.default.dim("Available billing plans for")} "${import_chalk20.default.bold(productName)}"${import_chalk20.default.dim(":")}`),lines.push("");let maxIdLen=Math.max(...enabledPlans.map(p=>p.id.length));for(let plan of enabledPlans){let paddedId=plan.id.padEnd(maxIdLen),cost=plan.cost?import_chalk20.default.dim(` (${plan.cost})`):"";lines.push(` ${import_chalk20.default.cyan(paddedId)} ${plan.name}${cost}`)}return lines.push(""),lines.push(` ${import_chalk20.default.dim("Usage:")}`),lines.push(""),lines.push(` ${import_chalk20.default.cyan(`--billing-plan ${enabledPlans[0].id}`)}`),lines.push(""),lines.join(`
|
|
82
|
+
`)}var import_chalk21=__toESM(require_source(),1);function formatDynamicExamples(integrationSlug,products,commandName="integration add"){let lines=[];if(lines.push(""),lines.push(` ${import_chalk21.default.dim("Examples:")}`),lines.push(""),lines.push(` ${import_chalk21.default.dim("-")} Install ${integrationSlug}`),lines.push(""),lines.push(` ${import_chalk21.default.cyan(`$ ${packageName} ${commandName} ${integrationSlug}`)}`),products.length>1){let firstProduct=products[0];lines.push(""),lines.push(` ${import_chalk21.default.dim("-")} Install a specific product`),lines.push(""),lines.push(` ${import_chalk21.default.cyan(`$ ${packageName} ${commandName} ${integrationSlug}/${firstProduct.slug}`)}`)}lines.push(""),lines.push(` ${import_chalk21.default.dim("-")} Install with a custom resource name`),lines.push(""),lines.push(` ${import_chalk21.default.cyan(`$ ${packageName} ${commandName} ${integrationSlug} --name my-resource`)}`);let metadataExample=buildMetadataExample(integrationSlug,products,commandName);return metadataExample&&(lines.push(""),lines.push(` ${import_chalk21.default.dim("-")} Install with metadata`),lines.push(""),lines.push(` ${import_chalk21.default.cyan(`$ ${metadataExample}`)}`)),lines.push(""),lines.push(` ${import_chalk21.default.dim("-")} Install with a specific billing plan`),lines.push(""),lines.push(` ${import_chalk21.default.cyan(`$ ${packageName} ${commandName} ${integrationSlug} --billing-plan pro`)}`),lines.push(""),lines.push(` ${import_chalk21.default.dim("-")} Install and connect to specific environments only`),lines.push(""),lines.push(` ${import_chalk21.default.cyan(`$ ${packageName} ${commandName} ${integrationSlug} -e production -e preview`)}`),lines.push(""),lines.push(` ${import_chalk21.default.dim("-")} Install without connecting to the current project`),lines.push(""),lines.push(` ${import_chalk21.default.cyan(`$ ${packageName} ${commandName} ${integrationSlug} --no-connect`)}`),lines.push(""),lines.push(` ${import_chalk21.default.dim("-")} Install without pulling environment variables`),lines.push(""),lines.push(` ${import_chalk21.default.cyan(`$ ${packageName} ${commandName} ${integrationSlug} --no-env-pull`)}`),lines.push(""),lines.push(` ${import_chalk21.default.dim("-")} Install with a prefix for environment variable names`),lines.push(""),lines.push(` ${import_chalk21.default.cyan(`$ ${packageName} ${commandName} ${integrationSlug} --prefix NEON2_`)}`),lines.push(""),lines.push(` ${import_chalk21.default.dim("-")} Output as JSON`),lines.push(` ${import_chalk21.default.cyan(`$ ${packageName} ${commandName} ${integrationSlug} --json`)}`),lines.push(""),lines.push(` ${import_chalk21.default.dim("-")} Install using a specific installation`),lines.push(""),lines.push(` ${import_chalk21.default.cyan(`$ ${packageName} ${commandName} ${integrationSlug} --installation <id>`)}`),lines.push(""),lines.push(` ${import_chalk21.default.dim("-")} Claim a sandbox resource immediately after provisioning`),lines.push(""),lines.push(` ${import_chalk21.default.cyan(`$ ${packageName} ${commandName} ${integrationSlug} --claim`)}`),lines.push(""),lines.push(` ${import_chalk21.default.dim("-")} Skip the offer to claim a sandbox resource`),lines.push(""),lines.push(` ${import_chalk21.default.cyan(`$ ${packageName} ${commandName} ${integrationSlug} --no-claim`)}`),lines.push(""),lines.join(`
|
|
83
|
+
`)}function buildMetadataExample(integrationSlug,products,commandName){for(let product of products){let schema=product.metadataSchema;if(!schema)continue;let flags=[];for(let[key,prop]of Object.entries(schema.properties))if(!isHiddenOnCreate(prop)){if(prop.type==="boolean")flags.push(`--meta ${key}=true`);else if(prop.type==="array"){let visible=getVisibleOptions(prop);visible&&visible.length>0&&flags.push(`--meta "${key}=${visible.slice(0,2).join(",")}"`)}else{let visible=getVisibleOptions(prop);visible&&visible.length>0&&flags.push(`--meta ${key}=${visible[0]}`)}if(flags.length>=2)break}if(flags.length>0){let slug=products.length>1?`${integrationSlug}/${product.slug}`:integrationSlug;return`${packageName} ${commandName} ${slug} ${flags.join(" ")}`}}}async function fetchBillingPlans(client,integration,product,metadata){let searchParams=new URLSearchParams;return searchParams.set("metadata",JSON.stringify(metadata)),client.fetch(`/v1/integrations/integration/${integration.id}/products/${product.id}/plans?${searchParams}`,{json:!0})}async function printAddDynamicHelp(client,rawArg,baseCommand,printHelp,commandName){if(!rawArg)return!1;let integrationSlug=rawArg.split("/")[0],productSlug=rawArg.includes("/")?rawArg.split("/")[1]:void 0;try{let integration=await fetchIntegration(client,integrationSlug),products=integration.products??[];printHelp({...baseCommand,examples:[]}),client.stdout.write(formatDynamicExamples(integrationSlug,products,commandName)),products.length>1&&client.stdout.write(formatProductHelp(integrationSlug,products,commandName));for(let product of products){let mergedSchema=mergeMetadataSchemas(product.metadataSchema,integration.metadataSchema);if(mergedSchema){let metadataProductSlug=products.length>1?product.slug:void 0;client.stdout.write(formatMetadataSchemaHelp(mergedSchema,integrationSlug,metadataProductSlug))}}let productsToShow=productSlug?products.filter(p=>p.slug===productSlug):products;for(let product of productsToShow)try{let{plans}=await fetchBillingPlans(client,integration,product,{});client.stdout.write(formatBillingPlansHelp(product.name,plans))}catch(err){output_manager_default.debug(`Failed to fetch billing plans for ${product.slug}: ${err}`)}return!0}catch(err){return output_manager_default.debug(`Failed to fetch integration for dynamic help: ${err}`),!1}}var InstallTelemetryClient=class extends TelemetryClient{};async function install(client){let flagsSpecification=getFlagsSpecification(addSubcommand.options),parsed;try{parsed=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return printError(error),2}let{args,flags}=parsed;args[0]==="i"&&warnDeprecatedSubcommand(client,"i","install");let telemetry=new InstallTelemetryClient({opts:{store:client.telemetryEventStore}});return flags["--help"]?(telemetry.trackCliFlagHelp("install"),await printAddDynamicHelp(client,args[1],installCommand,c=>client.stdout.write(help(c,{columns:client.stderr.columns})),"install")||client.stdout.write(help(installCommand,{columns:client.stderr.columns})),0):add2(client,args.slice(1),flags,"install")}var IntegrationTelemetryClient=class extends TelemetryClient{trackCliSubcommandAdd(actual){this.trackCliSubcommand({subcommand:"add",value:actual})}trackCliSubcommandAcceptTerms(actual){this.trackCliSubcommand({subcommand:"accept-terms",value:actual})}trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandInstallations(actual){this.trackCliSubcommand({subcommand:"installations",value:actual})}trackCliSubcommandDiscover(actual){this.trackCliSubcommand({subcommand:"discover",value:actual})}trackCliSubcommandOpen(actual){this.trackCliSubcommand({subcommand:"open",value:actual})}trackCliSubcommandBalance(actual){this.trackCliSubcommand({subcommand:"balance",value:actual})}trackCliSubcommandCategories(actual){this.trackCliSubcommand({subcommand:"categories",value:actual})}trackCliSubcommandRemove(actual){this.trackCliSubcommand({subcommand:"remove",value:actual})}trackCliSubcommandUpdate(actual){this.trackCliSubcommand({subcommand:"update",value:actual})}trackCliSubcommandGuide(actual){this.trackCliSubcommand({subcommand:"guide",value:actual})}trackCliSubcommandResource(actual){this.trackCliSubcommand({subcommand:"resource",value:actual})}};var import_chalk22=__toESM(require_source(),1);async function fetchInstallationPrepaymentInfo(client,installationId){return await client.fetch(`/v1/integrations/installations/${installationId}/billing/balance`,{json:!0})}async function getBalanceInformation(client,installationId){output_manager_default.spinner("Retrieving balance info\u2026",500);try{let prepaymentInfo=await fetchInstallationPrepaymentInfo(client,installationId);if(output_manager_default.stopSpinner(),!prepaymentInfo){output_manager_default.error("No balance information found for this integration");return}return prepaymentInfo}catch(error){output_manager_default.stopSpinner(),output_manager_default.error(`Failed to fetch balance info: ${error.message}`);return}}async function fetchMarketplaceIntegrations(client,slug){let searchParams=new URLSearchParams;return searchParams.set("view","account"),searchParams.set("installationType","marketplace"),searchParams.set("integrationIdOrSlug",slug),await client.fetch(`/v2/integrations/configurations?${searchParams}`,{json:!0})}async function getFirstConfiguration(client,integrationSlug){let configurations=await fetchMarketplaceIntegrations(client,integrationSlug);return configurations.length>0?configurations[0]:void 0}var IntegrationBalanceTelemetryClient=class extends TelemetryClient{trackCliArgumentIntegration(v,known){v&&this.trackCliArgument({arg:"name",value:known?v:this.redactedValue})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function balance(client){let telemetry=new IntegrationBalanceTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArguments=null,flagsSpecification=getFlagsSpecification(balanceSubcommand.options);try{parsedArguments=parseArguments(client.argv.slice(3),flagsSpecification)}catch(error){return printError(error),2}let formatResult=validateJsonOutput(parsedArguments.flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput;if(telemetry.trackCliOptionFormat(parsedArguments.flags["--format"]),parsedArguments.args.length>2)return output_manager_default.error("Cannot specify more than one integration at a time"),2;let integrationSlug=parsedArguments.args[1];if(!integrationSlug)return output_manager_default.error("You must pass an integration slug"),2;let{team}=await getScope(client);if(!team)return output_manager_default.error("Team not found."),1;client.config.currentTeam=team.id;let installation=await getBalanceInstallationId(client,integrationSlug,telemetry);if(installation===void 0)return 1;let installationId=installation.id,resources=await getResourcesForInstallation(client,installationId);if(resources===void 0)return 1;let prepaymentInfo=await getBalanceInformation(client,installationId);if(prepaymentInfo===void 0)return 1;if(asJson){output_manager_default.stopSpinner();let jsonData=buildJsonOutput(prepaymentInfo,resources,integrationSlug);return client.stdout.write(`${JSON.stringify(jsonData,null,2)}
|
|
84
84
|
`),0}return outputBalanceInformation(prepaymentInfo,resources,integrationSlug),0}async function getBalanceInstallationId(client,integrationSlug,telemetry){let knownIntegrationSlug=!1;output_manager_default.spinner("Retrieving installation\u2026",500);try{let installation=await getFirstConfiguration(client,integrationSlug);if(!installation){output_manager_default.stopSpinner(),output_manager_default.error("No installations found for this integration");return}return knownIntegrationSlug=!0,installation}catch(error){output_manager_default.stopSpinner(),output_manager_default.error(`Failed to fetch installations: ${error.message}`);return}finally{telemetry.trackCliArgumentIntegration(integrationSlug,knownIntegrationSlug)}}async function getResourcesForInstallation(client,installationId){output_manager_default.spinner("Retrieving resources\u2026",500);try{let resources=(await getResources(client)).filter(resource=>resource.product?.integrationConfigurationId===installationId);return output_manager_default.stopSpinner(),resources}catch(error){output_manager_default.stopSpinner(),output_manager_default.error(`Failed to fetch resources: ${error.message}`);return}}function buildJsonOutput(prepaymentInfo,resources,integrationSlug){let balances=prepaymentInfo.balances.map(balance2=>({resourceName:balance2.resourceId?resources.find(r=>r.externalResourceId===balance2.resourceId)?.name??balance2.resourceId:"installation",resourceId:balance2.resourceId??null,amountInCents:balance2.currencyValueInCents,amount:formattedCurrency(balance2.currencyValueInCents)})),thresholds=prepaymentInfo.thresholds.map(threshold=>({resourceName:threshold.resourceId?resources.find(r=>r.externalResourceId===threshold.resourceId)?.name??threshold.resourceId:"installation",resourceId:threshold.resourceId??null,minimumAmountInCents:threshold.minimumAmountInCents,minimumAmount:formattedCurrency(threshold.minimumAmountInCents),purchaseAmountInCents:threshold.purchaseAmountInCents,purchaseAmount:formattedCurrency(threshold.purchaseAmountInCents)}));return{integration:integrationSlug,balances,thresholds}}function outputBalanceInformation(prepaymentInfo,resources,integrationSlug){let hasBalances=prepaymentInfo.balances.length>0,hasThresholds=prepaymentInfo.thresholds.length>0;if(hasBalances||output_manager_default.log("No balances found for this integration"),hasThresholds||output_manager_default.log("No thresholds found for this integration"),!hasBalances&&!hasThresholds)return 0;let mappings={};for(let balance2 of prepaymentInfo.balances){let resourceName=balance2.resourceId?resources.find(r=>r.externalResourceId===balance2.resourceId)?.name??balance2.resourceId:"installation";mappings[balance2.resourceId??"installation"]={balance:balance2,resourceName}}for(let threshold of prepaymentInfo.thresholds){let mapping=mappings[threshold.resourceId??"installation"];if(mapping)mapping.threshold=threshold;else{let resourceName=threshold.resourceId?resources.find(r=>r.externalResourceId===threshold.resourceId)?.name??threshold.resourceId:"installation";mappings[threshold.resourceId??"installation"]={threshold,resourceName}}}output_manager_default.log(`${import_chalk22.default.bold(`Balances and thresholds for ${integrationSlug}`)}:`);for(let key in mappings){let mapping=mappings[key],name=mapping.resourceName,balance2=mapping.balance,threshold=mapping.threshold;output_manager_default.log(`\u25CF ${name}`),balance2&&output_manager_default.log(` Balance: ${formattedCurrency(balance2.currencyValueInCents)}`),threshold&&output_manager_default.log(` Threshold: Spend ${formattedCurrency(threshold.purchaseAmountInCents)} if balance goes below ${formattedCurrency(threshold.minimumAmountInCents)}`)}}function formattedCurrency(amountInCents){return Intl.NumberFormat("en-US",{style:"currency",currency:"USD"}).format(amountInCents/100)}var IntegrationResourceTelemetryClient=class extends TelemetryClient{trackCliSubcommandCreateThreshold(actual){this.trackCliSubcommand({subcommand:"create-threshold",value:actual})}trackCliSubcommandDelete(actual){this.trackCliSubcommand({subcommand:"delete",value:actual})}trackCliSubcommandDisconnect(actual){this.trackCliSubcommand({subcommand:"disconnect",value:actual})}trackCliSubcommandClaim(actual){this.trackCliSubcommand({subcommand:"claim",value:actual})}trackCliSubcommandConnect(actual){this.trackCliSubcommand({subcommand:"connect",value:actual})}trackCliSubcommandInspect(actual){this.trackCliSubcommand({subcommand:"inspect",value:actual})}};var import_chalk23=__toESM(require_source(),1);var IntegrationResourceConnectTelemetryClient=class extends TelemetryClient{trackCliArgumentResource(v){v&&this.trackCliArgument({arg:"resource",value:this.redactedValue})}trackCliArgumentProject(v){v&&this.trackCliArgument({arg:"project",value:this.redactedValue})}trackCliOptionEnvironment(v){v?.length&&this.trackCliOption({option:"environment",value:this.redactedValue})}trackCliOptionPrefix(v){v&&this.trackCliOption({option:"prefix",value:this.redactedValue})}trackCliFlagYes(v){v&&this.trackCliFlag("yes")}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function connect(client,argv){let telemetry=new IntegrationResourceConnectTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArguments=null,flagsSpecification=getFlagsSpecification(connectSubcommand.options);try{parsedArguments=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let formatResult=validateJsonOutput(parsedArguments.flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput,skipConfirmation=!!parsedArguments.flags["--yes"],prefix=parsedArguments.flags["--prefix"],environmentsFlag=parsedArguments.flags["--environment"];if(telemetry.trackCliOptionFormat(parsedArguments.flags["--format"]),telemetry.trackCliFlagYes(skipConfirmation),telemetry.trackCliOptionPrefix(prefix),telemetry.trackCliOptionEnvironment(environmentsFlag),asJson&&!skipConfirmation)return output_manager_default.error("--json requires --yes to skip confirmation prompts"),2;if(parsedArguments.args.length<1)return output_manager_default.error("You must specify a resource. See `--help` for details."),2;if(parsedArguments.args.length>2)return output_manager_default.error("Too many arguments. Usage: `vercel integration resource connect <resource> [project]`."),2;if(prefix!==void 0&&!/^[a-zA-Z][a-zA-Z0-9_]*$/.test(prefix))return output_manager_default.error("Invalid --prefix value. It must start with a letter and contain only letters, digits, and underscores."),2;if(!skipConfirmation&&(client.nonInteractive||!client.stdin.isTTY)){let retryCommand=buildCommandWithYes(client.argv);return outputAgentError(client,{status:"error",reason:"confirmation_required",message:"Connecting a resource requires confirmation. Re-run with --yes.",next:[{command:retryCommand}]},1),output_manager_default.error(`Connecting a resource without a terminal requires --yes. Re-run: ${retryCommand}`),2}let environments=environmentsFlag?.length?environmentsFlag:[...VALID_ENVIRONMENTS],resourceReference=parsedArguments.args[0],specifiedProject=parsedArguments.args[1];telemetry.trackCliArgumentResource(resourceReference),telemetry.trackCliArgumentProject(specifiedProject);let{team}=await getScope(client);if(!team)return output_manager_default.error("Team not found."),1;client.config.currentTeam=team.id,output_manager_default.spinner("Retrieving resource\u2026",500);let resources=await getResources(client),targetedResource=resources.find(resource=>resource.name===resourceReference)??resources.find(resource=>resource.id===resourceReference);if(output_manager_default.stopSpinner(),!targetedResource)return output_manager_default.error(`No resource ${import_chalk23.default.bold(resourceReference)} found.`),1;let projectName=specifiedProject;if(!projectName&&(projectName=await getLinkedProject(client).then(result=>{if(result.status==="linked")return result.project.name}),!projectName))return output_manager_default.error("No project linked. Either use `vc link` to link a project, or specify the project name."),1;if(targetedResource.projectsMetadata?.find(p=>p.name===projectName))return output_manager_default.error(`Project ${import_chalk23.default.bold(projectName)} is already connected to resource ${import_chalk23.default.bold(targetedResource.name)}.`),output_manager_default.log(`To change environments or env var prefix, disconnect first: \`vercel integration resource disconnect ${targetedResource.name} ${projectName}\``),1;output_manager_default.spinner("Resolving project\u2026",500);let project=await getProjectByNameOrId(client,projectName);if(output_manager_default.stopSpinner(),project instanceof ProjectNotFound)return output_manager_default.error(`No project ${import_chalk23.default.bold(projectName)} found.`),1;let environmentResult=await resolveProjectEnvironments(client,project,environments);if(!environmentResult.valid)return output_manager_default.fatal(environmentResult.error),1;let connectionEnvironments=environmentResult.environments;if(!skipConfirmation&&(output_manager_default.log(`The resource ${import_chalk23.default.bold(targetedResource.name)} will be connected to project ${import_chalk23.default.bold(projectName)} (environments: ${environments.join(", ")}).`),!await client.input.confirm(`${import_chalk23.default.cyan("Connect?")}`,!0)))return output_manager_default.log("Canceled"),0;try{output_manager_default.spinner("Connecting resource\u2026",500),await connectResourceToProject(client,project.id,targetedResource.id,connectionEnvironments,prefix!==void 0?{envVarPrefix:prefix}:void 0)}catch(error){if(output_manager_default.stopSpinner(),isAPIError(error)&&error.status===400){let conflict=error.serverMessage?.match(/existing environment variable with name ([A-Za-z_][A-Za-z0-9_]*)/);if(conflict){let varName=conflict[1],envRmCmd=environments.length===1?`vercel env remove ${varName} --environment ${environments[0]}`:`vercel env remove ${varName}`;return output_manager_default.error(`Cannot connect: env var ${import_chalk23.default.bold(varName)} already exists on project ${import_chalk23.default.bold(projectName)} in one of the target environments (${environments.join(", ")}).`),prefix===void 0?output_manager_default.log(`Re-run with \`--prefix <PREFIX>_\` to namespace the new variables, or remove the existing one with \`${envRmCmd}\`.`):output_manager_default.log(`Prefix \`${prefix}\` did not avoid the collision. Try a different prefix or run \`${envRmCmd}\`.`),1}}return output_manager_default.error(`A problem occurred while connecting: ${error.message}`),1}return asJson?(output_manager_default.stopSpinner(),client.stdout.write(`${JSON.stringify({resource:targetedResource.name,connected:!0,project:projectName,environments},null,2)}
|
|
85
85
|
`),0):(output_manager_default.success(`Connected ${import_chalk23.default.bold(targetedResource.name)} to ${import_chalk23.default.bold(projectName)} (${environments.join(", ")})`),0)}var import_chalk24=__toESM(require_source(),1);var IntegrationResourceCreateThresholdTelemetryClient=class extends TelemetryClient{trackCliArgumentResource(v){v&&this.trackCliArgument({arg:"resource",value:this.redactedValue})}trackCliArgumentMinimum(v){v&&this.trackCliArgument({arg:"minimum",value:this.redactedValue})}trackCliArgumentSpend(v){v&&this.trackCliArgument({arg:"spend",value:this.redactedValue})}trackCliArgumentLimit(v){v&&this.trackCliArgument({arg:"limit",value:this.redactedValue})}trackCliFlagYes(v){v&&this.trackCliFlag("yes")}};async function updateThreshold(client,installationId,resourceId,billingPlanId,minimumAmountInCents,purchaseAmountInCents,maximumAmountPerPeriodInCents,metadata){return await client.fetch(`/v1/integrations/installations/${installationId}/resources/${resourceId}/billing/threshold`,{method:"POST",json:!0,body:{billingPlanId,minimumAmountInCents,purchaseAmountInCents,maximumAmountPerPeriodInCents,metadata:JSON.stringify(metadata)}})}async function updateInstallationThreshold(client,installationId,billingPlanId,minimumAmountInCents,purchaseAmountInCents,maximumAmountPerPeriodInCents,metadata){await client.fetch(`/v1/integrations/installations/${installationId}/billing/threshold/batch`,{method:"POST",json:!1,headers:{"content-type":"application/json; charset=utf-8"},body:JSON.stringify([{billingPlanId,minimumAmountInCents,purchaseAmountInCents,maximumAmountPerPeriodInCents,metadata:JSON.stringify(metadata)}])})}async function createThreshold(client,argv){let telemetry=new IntegrationResourceCreateThresholdTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArguments=null,flagsSpecification=getFlagsSpecification(createThresholdSubcommand.options);try{parsedArguments=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let args;try{args=parseCreateThresholdArguments(parsedArguments.args,telemetry)}catch(error){return output_manager_default.error(error.message),2}let skipConfirmWithYes=parsedArguments.flags["--yes"];telemetry.trackCliFlagYes(skipConfirmWithYes);let{resourceName,minimum,spend,limit}=args,{team}=await getScope(client);if(!team)return output_manager_default.error("Team not found."),1;client.config.currentTeam=team.id,output_manager_default.spinner("Retrieving resource\u2026",500);let targetedResource=(await getResources(client)).find(resource=>resource.name===resourceName);if(output_manager_default.stopSpinner(),!targetedResource)return output_manager_default.error(`The resource ${import_chalk24.default.bold(resourceName)} was not found.`),1;if(!targetedResource.product?.integrationConfigurationId)return output_manager_default.error(`The resource ${import_chalk24.default.bold(resourceName)} does not have an integration configuration.`),1;if(targetedResource.billingPlan?.type!=="prepayment")return output_manager_default.error(`The resource ${import_chalk24.default.bold(resourceName)} is not a prepayment-based resource.`),1;let minimumSpend=parseFloat(targetedResource.billingPlan.minimumAmount??"0.50")*100;if(minimumSpend>spend)return output_manager_default.error(`The spend amount $${spend/100} is below your billing plan's minimum amount of $${minimumSpend/100}.`),1;let maximumSpend=parseFloat(targetedResource.billingPlan.maximumAmount??"1000000")*100;if(targetedResource.billingPlan.maximumAmount!==void 0&&maximumSpend<spend)return output_manager_default.error(`The spend amount $${spend/100} is above your billing plan's maximum amount of $${maximumSpend/100}.`),1;let prepaymentInfo=await getBalanceInformation(client,targetedResource.product.integrationConfigurationId);return prepaymentInfo===void 0?1:targetedResource.billingPlan.scope!=="resource"?(output_manager_default.log(`The resource ${import_chalk24.default.bold(resourceName)} uses an installation-level balance.`),await updateThresholdForInstallation({client,resource:targetedResource,prepaymentInfo,minimum,spend,limit,skipConfirmWithYes:!!skipConfirmWithYes})):await updateThresholdForResource({client,resource:targetedResource,prepaymentInfo,minimum,spend,limit,skipConfirmWithYes:!!skipConfirmWithYes})}function parseCreateThresholdArguments(passedArgs,telemetry){if(passedArgs.length<4)throw new Error("Missing arguments. See `--help` for details.");if(passedArgs.length>4)throw new Error("Too many arguments. See `--help` for details.");let args=passedArgs.slice(0,4);telemetry.trackCliArgumentResource(args[0]),telemetry.trackCliArgumentMinimum(args[1]),telemetry.trackCliArgumentSpend(args[2]),telemetry.trackCliArgumentLimit(args[3]);let resourceName=args[0],minimum=Math.round(Number.parseFloat(args[1])*100),spend=Math.round(Number.parseFloat(args[2])*100),limit=Math.round(Number.parseFloat(args[3])*100);if(isNaN(minimum))throw new Error('Minimum is an invalid number format. Minimum must be a positive number (ex. "5.75")');if(isNaN(spend))throw new Error('Spend is an invalid number format. Spend must be a positive number (ex. "10.99").');if(isNaN(limit))throw new Error('Limit is an invalid number format. Limit must be a positive number (ex. "1000").');if(minimum<0)throw new Error("Minimum cannot be negative.");if(spend<0)throw new Error("Spend cannot be negative.");if(limit<0)throw new Error("Limit cannot be negative.");if(minimum>spend)throw new Error("Minimum cannot be greater than spend.");if(minimum>limit)throw new Error("Minimum cannot be greater than limit.");if(limit<spend)throw new Error("Limit cannot be less than spend.");return{resourceName,minimum,spend,limit}}async function updateThresholdForResource(props){let existingThreshold=props.prepaymentInfo.thresholds.find(threshold=>threshold.resourceId===props.resource.externalResourceId),existingBalance=props.prepaymentInfo.balances.find(balance2=>balance2.resourceId===props.resource.externalResourceId);return handleUpdateThreshold({client:props.client,resource:props.resource,minimum:props.minimum,spend:props.spend,limit:props.limit,existingThreshold,existingBalance,skipConfirmWithYes:props.skipConfirmWithYes,isInstallationLevel:!1})}async function updateThresholdForInstallation(props){let existingThreshold=props.prepaymentInfo.thresholds.find(threshold=>threshold.resourceId===void 0),existingBalance=props.prepaymentInfo.balances.find(balance2=>balance2.resourceId===void 0);return handleUpdateThreshold({client:props.client,resource:props.resource,minimum:props.minimum,spend:props.spend,limit:props.limit,existingThreshold,existingBalance,skipConfirmWithYes:props.skipConfirmWithYes,isInstallationLevel:!0})}async function handleUpdateThreshold(props){if(props.resource.billingPlan?.type!=="prepayment")return output_manager_default.log(`The resource ${import_chalk24.default.bold(props.resource.name)} is not a prepayment-based resource.`),0;if(!props.resource.product?.integrationConfigurationId)return output_manager_default.log(`The resource ${import_chalk24.default.bold(props.resource.name)} does not have an integration configuration.`),0;if(!props.skipConfirmWithYes&&!props.client.stdin.isTTY)return output_manager_default.error("Confirmation required. Use `--yes` to skip the confirmation prompt."),1;let entityTextReference=props.isInstallationLevel?`installation ${import_chalk24.default.bold(props.resource.product?.name)}`:`resource ${import_chalk24.default.bold(props.resource.name)}`;if(props.existingThreshold&&!(props.skipConfirmWithYes||await props.client.input.confirm(`The ${entityTextReference} already has a threshold. (minimum: $${props.existingThreshold.minimumAmountInCents/100}, spend: $${props.existingThreshold.purchaseAmountInCents/100}, limit: ${props.existingThreshold.maximumAmountPerPeriodInCents?`$${props.existingThreshold.maximumAmountPerPeriodInCents/100}`:"none set"}). Do you want to overwrite it?`,!0)))return output_manager_default.log("Aborting\u2026"),0;if(props.existingBalance&&props.existingBalance.currencyValueInCents<props.minimum&&!(props.skipConfirmWithYes||await props.client.input.confirm(`The minimum threshold is higher than the current balance of $${props.existingBalance.currencyValueInCents/100}. Are you sure?`,!0)))return output_manager_default.log("Aborting\u2026"),0;if(!(props.skipConfirmWithYes||await props.client.input.confirm(`Are you sure you want to create a threshold for the ${entityTextReference} with minimum $${props.minimum/100}, spend $${props.spend/100}, and limit $${props.limit/100}?`,!0)))return output_manager_default.log("Aborting\u2026"),0;let metadata=JSON.parse(props.existingThreshold?.metadata??"{}");return output_manager_default.spinner("Creating threshold\u2026",500),props.isInstallationLevel?await updateInstallationThreshold(props.client,props.resource.product.integrationConfigurationId,props.resource.billingPlan.id,props.minimum,props.spend,props.limit,metadata):await updateThreshold(props.client,props.resource.product.integrationConfigurationId,props.resource.id,props.resource.billingPlan.id,props.minimum,props.spend,props.limit,metadata),output_manager_default.stopSpinner(),output_manager_default.success(`Threshold for ${entityTextReference} created successfully.`),0}var import_chalk25=__toESM(require_source(),1);async function disconnectResourceFromProject(client,resource,connection){return client.fetch(`/v1/storage/stores/${resource.id}/connections/${connection.id}`,{json:!0,method:"DELETE"})}async function disconnectResourceFromAllProjects(client,resource){return client.fetch(`/v1/storage/stores/${resource.id}/connections`,{json:!0,method:"DELETE"})}var IntegrationResourceDisconnectTelemetryClient=class extends TelemetryClient{trackCliArgumentResource(v){v&&this.trackCliArgument({arg:"resource",value:this.redactedValue})}trackCliArgumentProject(v){v&&this.trackCliArgument({arg:"project",value:this.redactedValue})}trackCliFlagAll(v){v&&this.trackCliFlag("all")}trackCliFlagYes(v){v&&this.trackCliFlag("yes")}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var CancelledError=class extends Error{},FailedError=class extends Error{};async function disconnect(client,argv){let telemetry=new IntegrationResourceDisconnectTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArguments=null,flagsSpecification=getFlagsSpecification(disconnectSubcommand.options);try{parsedArguments=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let formatResult=validateJsonOutput(parsedArguments.flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput,skipConfirmation=!!parsedArguments.flags["--yes"];if(telemetry.trackCliOptionFormat(parsedArguments.flags["--format"]),asJson&&!skipConfirmation)return output_manager_default.error("--json requires --yes to skip confirmation prompts"),2;let{team}=await getScope(client);if(!team)return output_manager_default.error("Team not found."),1;if(client.config.currentTeam=team.id,parsedArguments.args.length<1)return output_manager_default.error("You must specify a resource. See `--help` for details."),2;if(parsedArguments.args.length>2)return output_manager_default.error("Cannot specify more than one project at a time. Use `--all` to disconnect the specified resource from all projects."),1;let shouldDisconnectAll=parsedArguments.flags["--all"],isProjectSpecified=parsedArguments.args.length===2;if(isProjectSpecified&&shouldDisconnectAll)return output_manager_default.error("Cannot specify a project while using the `--all` flag."),2;let resourceReference=parsedArguments.args[0],specifiedProject;isProjectSpecified&&(specifiedProject=parsedArguments.args[1]),telemetry.trackCliArgumentResource(resourceReference),telemetry.trackCliArgumentProject(specifiedProject),telemetry.trackCliFlagYes(skipConfirmation),telemetry.trackCliFlagAll(shouldDisconnectAll),output_manager_default.spinner("Retrieving resource\u2026",500);let resources=await getResources(client),targetedResource=resources.find(resource=>resource.name===resourceReference)??resources.find(resource=>resource.id===resourceReference);if(output_manager_default.stopSpinner(),!targetedResource)return output_manager_default.error(`No resource ${import_chalk25.default.bold(resourceReference)} found.`),1;if(parsedArguments.flags["--all"]){try{await handleDisconnectAllProjects(client,targetedResource,!!parsedArguments.flags["--yes"],asJson)}catch(error){if(error instanceof CancelledError)return output_manager_default.log(error.message),0;if(error instanceof FailedError)return output_manager_default.error(error.message),1;throw error}if(asJson){let projects=targetedResource.projectsMetadata?.map(project=>project.name)??[];client.stdout.write(`${JSON.stringify({resource:targetedResource.name,disconnected:!0,projects},null,2)}
|
|
86
86
|
`)}return 0}return!specifiedProject&&(specifiedProject=await getLinkedProject(client).then(result=>{if(result.status==="linked")return result.project.name}),!specifiedProject)?(output_manager_default.error("No project linked. Either use `vc link` to link a project, or specify the project name."),1):await handleDisconnectProject(client,targetedResource,specifiedProject,skipConfirmation,asJson)}async function handleDisconnectProject(client,resource,projectName,skipConfirmation,asJson){let project=resource.projectsMetadata?.find(project2=>projectName===project2.name);if(!project)return output_manager_default.error(`Project ${import_chalk25.default.bold(projectName)} is not connected to resource ${import_chalk25.default.bold(resource.name)}.`),output_manager_default.log("Run `vercel integration list` to see which projects are connected to each resource."),1;let projectConnections=resource.projectsMetadata.filter(connection=>connection.projectId===project.projectId);if(!skipConfirmation&&client.nonInteractive)return outputAgentError(client,{status:"error",reason:"confirmation_required",message:"Disconnecting a resource requires confirmation. Re-run with --yes.",next:[{command:buildCommandWithYes(client.argv)}]},1),output_manager_default.error("Confirmation required. Use `--yes` to skip the confirmation prompt."),1;if(!skipConfirmation&&!client.stdin.isTTY)return output_manager_default.error("Confirmation required. Use `--yes` to skip the confirmation prompt."),1;if(!skipConfirmation&&!await confirmDisconnectProject(client,resource,project,projectConnections.length))return output_manager_default.log("Canceled"),0;try{output_manager_default.spinner("Disconnecting resource\u2026",500);for(let connection of projectConnections)await disconnectResourceFromProject(client,resource,connection)}catch(error){return output_manager_default.error(`A problem occurred while disconnecting: ${error.message}`),1}if(asJson)return output_manager_default.stopSpinner(),client.stdout.write(`${JSON.stringify({resource:resource.name,disconnected:!0,projects:[projectName]},null,2)}
|
|
@@ -98,7 +98,7 @@ ${table([["Name","Status","Product","Integration","Projects"].map(header=>import
|
|
|
98
98
|
`);else if(client.stdout.isTTY){let label=isResource?`Opening the ${import_chalk30.default.bold(name)} resource dashboard...`:`Opening the ${import_chalk30.default.bold(name)} dashboard...`;output_manager_default.print(label),(0,import_open8.default)(link)}else client.stdout.write(`${link}
|
|
99
99
|
`)}var import_chalk31=__toESM(require_source(),1);async function removeIntegration(client,configuration){return client.fetch(`/v2/integrations/installations/${configuration.id}/uninstall`,{json:!0,body:{},method:"POST"})}var IntegrationRemoveTelemetryClient=class extends TelemetryClient{trackCliArgumentIntegration(v,known){v&&this.trackCliArgument({arg:"integration",value:known?v:this.redactedValue})}trackCliFlagYes(v){v&&this.trackCliFlag("yes")}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function remove3(client,argv){let telemetry=new IntegrationRemoveTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArguments=null,flagsSpecification=getFlagsSpecification(removeSubcommand3.options);try{parsedArguments=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let formatResult=validateJsonOutput(parsedArguments.flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput,skipConfirmation=!!parsedArguments.flags["--yes"];if(telemetry.trackCliFlagYes(skipConfirmation),telemetry.trackCliOptionFormat(parsedArguments.flags["--format"]),asJson&&!skipConfirmation)return output_manager_default.error("--json requires --yes to skip confirmation prompts"),2;let{team}=await getScope(client);if(!team)return output_manager_default.error("Team not found."),1;if(client.config.currentTeam=team.id,parsedArguments.args.length<1){let message="You must specify an integration. See `--help` for details.";return outputAgentError(client,{status:"error",reason:AGENT_REASON.MISSING_ARGUMENTS,message,hint:"Put global flags (`--cwd`, `--non-interactive`, etc.) first, then `integration remove <slug> --yes`. Replace `<slug>` with your integration; non-interactive removal requires `--yes`.",next:[{command:buildCommandWithGlobalFlags(client.argv,"integration installations",packageName,{prependGlobalFlags:!0}),when:"List integration slugs for this team"},{command:buildCommandWithGlobalFlags(client.argv,"integration remove <slug> --yes",packageName,{prependGlobalFlags:!0}),when:"Substitute your integration slug for <slug> (angle brackets are not part of the command)"}]},2),output_manager_default.error(message),2}if(parsedArguments.args.length>1){let message="Cannot specify more than one integration at a time.";return outputAgentError(client,{status:"error",reason:AGENT_REASON.INVALID_ARGUMENTS,message,hint:`Use one slug only: \`${packageName} [global flags] integration remove <slug> --yes\`. Global flags belong before \`integration\`.`,next:[{command:buildCommandWithGlobalFlags(client.argv,"integration remove <slug> --yes",packageName,{prependGlobalFlags:!0}),when:"Single slug in place of <slug>; keep one integration remove invocation"}]},2),output_manager_default.error(message),2}let integrationName=parsedArguments.args[0];output_manager_default.spinner("Retrieving integration\u2026",500);let integrationConfiguration=await getFirstConfiguration(client,integrationName);if(output_manager_default.stopSpinner(),!integrationConfiguration)return output_manager_default.error(`No integration ${import_chalk31.default.bold(integrationName)} found.`),telemetry.trackCliArgumentIntegration(integrationName,!1),1;if(telemetry.trackCliArgumentIntegration(integrationName,!0),!skipConfirmation&&!client.stdin.isTTY)return output_manager_default.error("Confirmation required. Use `--yes` to skip the confirmation prompt."),1;if(!skipConfirmation&&!await confirmIntegrationRemoval(client,integrationConfiguration.slug,team))return output_manager_default.log("Canceled"),0;try{output_manager_default.spinner("Removing integration\u2026",1e3),await removeIntegration(client,integrationConfiguration)}catch(error){if(isAPIError(error)&&error.status===403&&error.serverMessage.includes("resources")){let resourceNames=[];try{let searchParams=new URLSearchParams;searchParams.set("teamId",team.id),searchParams.set("integrationConfigurationId",integrationConfiguration.id),searchParams.set("skip-metadata","true");let{stores}=await client.fetch(`/v1/storage/stores?${searchParams}`,{json:!0});resourceNames=stores.map(s2=>s2.name)}catch{}if(asJson||shouldEmitNonInteractiveCommandError(client)){output_manager_default.stopSpinner();let approvalHint="Delete each resource with --disconnect-all (non-interactive: include --yes). Get user approval before deleting resources.",resourceTail=asJson?"--disconnect-all --yes --json":"--disconnect-all --yes",integrationRemoveTail=asJson?"--yes --json":"--yes",suggestNextOpts={prependGlobalFlags:!0,excludeFlags:["--yes","-y"]},payload={status:"error",reason:AGENT_REASON.HAS_RESOURCES,integration:integrationName,removed:!1,error:"has_resources",message:`Cannot remove ${integrationName} because it still has resources.`,resources:resourceNames,hint:client.isAgent?`${approvalHint} Agents must obtain explicit user approval before running integration resource delete.`:approvalHint,userActionRequired:client.isAgent?!0:void 0,next:resourceNames.map(name=>({command:buildCommandWithGlobalFlags(client.argv,`integration resource delete ${name} ${resourceTail}`,packageName,suggestNextOpts),when:`Disconnect and remove resource ${name}; substitute the real resource name if different`})),retry:buildCommandWithGlobalFlags(client.argv,`integration remove ${integrationName} ${integrationRemoveTail}`,packageName,suggestNextOpts)};return client.stdout.write(`${JSON.stringify(payload,null,2)}
|
|
100
100
|
`),1}if(output_manager_default.error(`Cannot remove ${import_chalk31.default.bold(integrationName)} because it still has resources.`),resourceNames.length>0){output_manager_default.log(""),output_manager_default.log("Resources that must be removed first:");for(let name of resourceNames)output_manager_default.log(` ${import_chalk31.default.gray("-")} ${name}`);output_manager_default.log("")}return client.isAgent&&output_manager_default.log("AGENT: You must get user approval before running any resource removal commands."),output_manager_default.log(`Delete and disconnect all resources first with: ${import_chalk31.default.cyan(`${packageName} integration resource delete <resource-name> --disconnect-all`)}`),output_manager_default.log(`Then retry: ${import_chalk31.default.cyan(`${packageName} integration remove ${integrationName}`)}`),1}return output_manager_default.error(import_chalk31.default.red(`Failed to remove ${import_chalk31.default.bold(integrationName)}: ${error.message}`)),1}return asJson?(output_manager_default.stopSpinner(),client.stdout.write(`${JSON.stringify({integration:integrationName,removed:!0},null,2)}
|
|
101
|
-
`),0):(output_manager_default.success(`${import_chalk31.default.bold(integrationName)} successfully removed.`),0)}async function confirmIntegrationRemoval(client,integration,team){return output_manager_default.log(`The ${import_chalk31.default.bold(integration)} integration will be removed permanently from team ${import_chalk31.default.bold(team.name)}.`),client.input.confirm(`${import_chalk31.default.red("Are you sure?")}`,!1)}var import_chalk32=__toESM(require_source(),1);async function patchIntegrationConfiguration(client,configurationId,body){return client.fetch(`/v1/integrations/configuration/${encodeURIComponent(configurationId)}`,{method:"PATCH",body,json:!0})}var IntegrationUpdateTelemetryClient=class extends TelemetryClient{trackCliArgumentIntegration(v,known){v&&this.trackCliArgument({arg:"integration",value:known?v:this.redactedValue})}trackCliOptionPlan(v){v&&this.trackCliOption({option:"plan",value:this.redactedValue})}trackCliOptionAuthorizationId(v){v&&this.trackCliOption({option:"authorization-id",value:this.redactedValue})}trackCliOptionProjects(v){v?.length&&this.trackCliOption({option:"projects",value:this.redactedValue})}trackCliOptionInstallationId(v){v&&this.trackCliOption({option:"installation-id",value:this.redactedValue})}trackCliOptionFormat(v){v&&this.trackCliOption({option:"format",value:v})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};function selectConfiguration(configurations,integrationSlug,installationId){if(configurations.length===0)return{ok:!1,reason:AGENT_REASON.NOT_FOUND,message:`No integration "${integrationSlug}" found.`};if(installationId){let found=configurations.find(c=>c.id===installationId);if(!found){let known=configurations.map(c=>c.id).join(", ");return{ok:!1,reason:AGENT_REASON.INVALID_ARGUMENTS,message:`No installation matching --installation
|
|
101
|
+
`),0):(output_manager_default.success(`${import_chalk31.default.bold(integrationName)} successfully removed.`),0)}async function confirmIntegrationRemoval(client,integration,team){return output_manager_default.log(`The ${import_chalk31.default.bold(integration)} integration will be removed permanently from team ${import_chalk31.default.bold(team.name)}.`),client.input.confirm(`${import_chalk31.default.red("Are you sure?")}`,!1)}var import_chalk32=__toESM(require_source(),1);async function patchIntegrationConfiguration(client,configurationId,body){return client.fetch(`/v1/integrations/configuration/${encodeURIComponent(configurationId)}`,{method:"PATCH",body,json:!0})}var IntegrationUpdateTelemetryClient=class extends TelemetryClient{trackCliArgumentIntegration(v,known){v&&this.trackCliArgument({arg:"integration",value:known?v:this.redactedValue})}trackCliOptionBillingPlan(v){v&&this.trackCliOption({option:"billing-plan",value:this.redactedValue})}trackCliOptionPlan(v){v&&this.trackCliOption({option:"plan",value:this.redactedValue})}trackCliOptionAuthorization(v){v&&this.trackCliOption({option:"authorization",value:this.redactedValue})}trackCliOptionAuthorizationId(v){v&&this.trackCliOption({option:"authorization-id",value:this.redactedValue})}trackCliOptionProjects(v){v?.length&&this.trackCliOption({option:"projects",value:this.redactedValue})}trackCliOptionInstallation(v){v&&this.trackCliOption({option:"installation",value:this.redactedValue})}trackCliOptionInstallationId(v){v&&this.trackCliOption({option:"installation-id",value:this.redactedValue})}trackCliOptionFormat(v){v&&this.trackCliOption({option:"format",value:v})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};function selectConfiguration(configurations,integrationSlug,installationId){if(configurations.length===0)return{ok:!1,reason:AGENT_REASON.NOT_FOUND,message:`No integration "${integrationSlug}" found.`};if(installationId){let found=configurations.find(c=>c.id===installationId);if(!found){let known=configurations.map(c=>c.id).join(", ");return{ok:!1,reason:AGENT_REASON.INVALID_ARGUMENTS,message:`No installation matching --installation ${installationId}. Known configuration IDs: ${known}`}}return{ok:!0,configuration:found}}if(configurations.length>1){let list4=configurations.map(c=>c.id).join(", ");return{ok:!1,reason:AGENT_REASON.INVALID_ARGUMENTS,message:`Multiple installations found for "${integrationSlug}": ${list4}. Re-run with --installation <id> to select one. Run \`${packageName} integration installations\` to list installation IDs for this team.`}}return{ok:!0,configuration:configurations[0]}}function buildProjectsBody(raw){return!raw||raw.length===0?{error:'Expected at least one --projects value (use "all" or project IDs).'}:raw.length===1&&raw[0]==="all"?{projects:"all"}:raw.includes("all")?{error:'Cannot mix "all" with specific project IDs. Use only --projects all, or repeat --projects for each project ID.'}:{projects:raw}}function emitUpdateCliError(client,message,reason,exitCode,extra){outputAgentError(client,{status:"error",reason,message,...extra},exitCode),output_manager_default.error(message)}async function update2(client,argv){let telemetry=new IntegrationUpdateTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArguments,flagsSpecification=getFlagsSpecification(updateSubcommand2.options);try{parsedArguments=parseArguments(argv,flagsSpecification)}catch(error){let msg=error instanceof Error?error.message:String(error);return outputAgentError(client,{status:"error",reason:AGENT_REASON.INVALID_ARGUMENTS,message:msg},2),printError(error),2}let formatResult=validateJsonOutput(parsedArguments.flags);if(!formatResult.valid)return emitUpdateCliError(client,formatResult.error,AGENT_REASON.INVALID_ARGUMENTS,2),2;let preferJson=formatResult.jsonOutput||!!client.nonInteractive,{flags}=parsedArguments,json=preferJson,billingPlan=getRenamedOption(flags,"--billing-plan","--plan",{json,typedName:getTypedOptionName(argv,getFlagsSpecification(updateSubcommand2.options),"--plan")}),authorization=getRenamedOption(flags,"--authorization","--authorization-id",{json}),installation=getRenamedOption(flags,"--installation","--installation-id",{json});if("error"in billingPlan)return emitUpdateCliError(client,billingPlan.error,AGENT_REASON.INVALID_ARGUMENTS,2),2;if("error"in authorization)return emitUpdateCliError(client,authorization.error,AGENT_REASON.INVALID_ARGUMENTS,2),2;if("error"in installation)return emitUpdateCliError(client,installation.error,AGENT_REASON.INVALID_ARGUMENTS,2),2;let plan=billingPlan.value,projectsRaw=parsedArguments.flags["--projects"],authorizationId=authorization.value,installationId=installation.value;if(parsedArguments.args.length<1){let hadSubcommandOptsFirst=projectsRaw!==void 0&&projectsRaw.length>0||plan!==void 0,msg=hadSubcommandOptsFirst?`Put the integration slug immediately after \`update\`, before \`--projects\`, \`--billing-plan\`, or other subcommand options. Example: \`${packageName} integration update neon --projects all\`.`:`You must specify an integration slug after \`update\`. Example: \`${packageName} integration update neon --projects all\` or \`${packageName} integration update neon --billing-plan <plan-id>\`.`;return emitUpdateCliError(client,msg,AGENT_REASON.MISSING_ARGUMENTS,2,{hint:hadSubcommandOptsFirst?`You used \`--projects\` or \`--billing-plan\` without a preceding integration name. Use \`${packageName} integration update <integration> --projects \u2026\`. Global flags such as \`--cwd\` may appear anywhere.`:`Run \`${packageName} integration installations\` to list slugs and installation IDs for your team.`,next:[{command:buildCommandWithGlobalFlags(client.argv,"integration update neon --projects all",packageName,{prependGlobalFlags:!0}),when:"Correct order: integration slug first, then --projects (replace neon)"},{command:buildCommandWithGlobalFlags(client.argv,"integration installations",packageName,{prependGlobalFlags:!0}),when:"Discover which integration slug to use"}]}),2}if(parsedArguments.args.length>1)return emitUpdateCliError(client,"Cannot specify more than one integration at a time.",AGENT_REASON.INVALID_ARGUMENTS,2),2;let integrationSlug=parsedArguments.args[0],hasPlan=plan!==void 0,projectsOutcome=projectsRaw!==void 0?buildProjectsBody(projectsRaw):null;if(hasPlan&&projectsRaw!==void 0&&projectsRaw.length>0)return emitUpdateCliError(client,"Pass either --billing-plan or --projects, not both. See `vercel integration update --help`.",AGENT_REASON.INVALID_ARGUMENTS,2),2;if(!hasPlan&&!projectsOutcome)return emitUpdateCliError(client,"Nothing to update. Pass --billing-plan to change billing plan, or --projects to change project access.",AGENT_REASON.MISSING_ARGUMENTS,2,{hint:`Example: \`${packageName} integration update ${integrationSlug} --projects all\``}),2;if(projectsOutcome&&"error"in projectsOutcome)return emitUpdateCliError(client,projectsOutcome.error,AGENT_REASON.INVALID_ARGUMENTS,2),2;let hasProjects=!!(projectsOutcome&&!("error"in projectsOutcome));telemetry.trackCliOptionBillingPlan(flags["--billing-plan"]),telemetry.trackCliOptionPlan(flags["--plan"]),telemetry.trackCliOptionAuthorization(flags["--authorization"]),telemetry.trackCliOptionAuthorizationId(flags["--authorization-id"]),telemetry.trackCliOptionProjects(projectsRaw),telemetry.trackCliOptionInstallation(flags["--installation"]),telemetry.trackCliOptionInstallationId(flags["--installation-id"]),telemetry.trackCliOptionFormat(parsedArguments.flags["--format"]);let{team}=await getScope(client);if(!team)return emitUpdateCliError(client,"Team not found.",AGENT_REASON.MISSING_SCOPE,1,{next:[{command:buildCommandWithGlobalFlags(client.argv,"teams switch",packageName,{prependGlobalFlags:!0}),when:"Switch to a team that has this integration"}]}),1;client.config.currentTeam=team.id,output_manager_default.spinner("Retrieving integration\u2026",500);let configurations=await fetchMarketplaceIntegrations(client,integrationSlug);output_manager_default.stopSpinner();let selected=selectConfiguration(configurations,integrationSlug,installationId);if(!selected.ok)return emitUpdateCliError(client,selected.message,selected.reason,1),telemetry.trackCliArgumentIntegration(integrationSlug,!1),1;telemetry.trackCliArgumentIntegration(integrationSlug,!0);let body=hasPlan?{billingPlanId:plan,...authorizationId?{authorizationId}:{}}:projectsOutcome;try{output_manager_default.spinner("Updating integration\u2026",1e3),await patchIntegrationConfiguration(client,selected.configuration.id,body),output_manager_default.stopSpinner()}catch(error){output_manager_default.stopSpinner();let apiMsg=isAPIError(error)&&error.serverMessage||error.message;return emitUpdateCliError(client,`Failed to update ${integrationSlug}: ${apiMsg}`,AGENT_REASON.API_ERROR,1),1}return preferJson?(client.stdout.write(`${JSON.stringify(withWarnings({integration:integrationSlug,configurationId:selected.configuration.id,updated:!0,...hasPlan?{billingPlanId:plan}:{},...hasProjects?{projects:body.projects}:{}},[billingPlan.warning,authorization.warning,installation.warning]),null,2)}
|
|
102
102
|
`),0):(output_manager_default.success(`${import_chalk32.default.bold(integrationSlug)} installation updated successfully.`),0)}var import_chalk33=__toESM(require_source(),1);async function fetchIntegrationCategories(client){return client.fetch("/v2/integrations/categories",{json:!0})}async function categories2(client,args){let parsedArguments=null,flagsSpecification=getFlagsSpecification(categoriesSubcommand2.options);try{parsedArguments=parseArguments(args,flagsSpecification)}catch(error){return printError(error),2}if(parsedArguments.args.length>0)return output_manager_default.error("Invalid number of arguments. Usage: `vercel integration categories`"),2;let formatResult=validateJsonOutput(parsedArguments.flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput;output_manager_default.spinner("Fetching integration categories...",500);let fetched;try{fetched=await fetchIntegrationCategories(client)}catch(error){return output_manager_default.error(`Failed to fetch integration categories: ${error.message}`),1}output_manager_default.stopSpinner();let projected=fetched.map(({slug,title:title3})=>({slug,title:title3}));if(asJson)return client.stdout.write(`${JSON.stringify({categories:projected},null,2)}
|
|
103
103
|
`),0;if(projected.length===0)return output_manager_default.log("No integration categories found."),0;let formattedOutput=client.stderr.columns>0&&client.stderr.columns<80?formatCompactList2(projected):formatTable2(projected);return output_manager_default.log(`Available marketplace categories:
|
|
104
104
|
`+formattedOutput),0}function formatTable2(items){return table([["Slug","Title"].map(header=>import_chalk33.default.bold(import_chalk33.default.cyan(header))),...items.map(item=>[item.slug,item.title])],{hsep:4})}function formatCompactList2(items){return items.map(item=>`${import_chalk33.default.bold(item.slug)} ${item.title}`).join(`
|
|
@@ -124,7 +124,7 @@ ${table(lines,{hsep:2}).replace(/^/gm," ")}
|
|
|
124
124
|
`);return}output_manager_default.print(formatStoragePlan(plan))}async function confirmStorageChange(client,{skipConfirmation,question}){return skipConfirmation?!0:client.nonInteractive||!client.stdin.isTTY?failWith(client,{reason:AGENT_REASON.CONFIRMATION_REQUIRED,message:"This change requires confirmation. Re-run with --yes.",next:[{command:buildCommandWithYes(client.argv)}]}):client.input.confirm(import_chalk39.default.cyan(question),!0)}function getStorageEnvPullNext(client,scope,environments){if(!environments.includes("development"))return;let teamFlag=scope.teamSlug?` --scope ${quoteArg(scope.teamSlug)}`:"";return[{command:buildCommandWithGlobalFlags(client.argv,`env pull --environment development --project ${quoteArg(scope.project.id)}${teamFlag}`,void 0,{excludeFlags:["--yes"]}),when:"if needed, refresh local development variables in .env.local"}]}function writeStorageResult(client,plan,{applied,asJson,message,next}){if(asJson){let result={...plan,applied,...next?.length?{next}:{}};client.stdout.write(`${JSON.stringify(result,null,2)}
|
|
125
125
|
`);return}if(!applied){output_manager_default.print(formatStoragePlan(plan)),output_manager_default.log("No changes applied. Re-run without --dry-run to apply them.");return}message&&output_manager_default.success(message);let written=[...plan.envVars.add,...plan.envVars.keep];written.length&&output_manager_default.log(`Environment variables: ${written.join(", ")}`),plan.envVars.remove.length&&output_manager_default.log(`Removed: ${plan.envVars.remove.join(", ")}`);for(let note of plan.envVars.notes)output_manager_default.log(note)}async function readBackConnectionEnvVars(client,{store,projectId,environments,accountId}){try{let fresh=await getStorageStore(client,store.id,{accountId}),connection=resolveProjectConnection(fresh,projectId,environments);return connection.status!=="found"?void 0:connection.connection.environmentVariables}catch(error){output_manager_default.debug(`Could not read back storage connection env vars: ${error.message}`);return}}async function connect2(client,argv){let telemetry=new StorageConnectTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(connectSubcommand2.options),parsedArguments;try{parsedArguments=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags}=parsedArguments,formatResult=validateJsonOutput(flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput,dryRun=flags["--dry-run"]??!1,skipConfirmation=flags["--yes"]??!1,addRwToken=flags["--add-rw-token"]??!1;if(telemetry.trackCliOptionFormat(flags["--format"]),telemetry.trackCliFlagJson(flags["--json"]),telemetry.trackCliFlagYes(skipConfirmation),telemetry.trackCliFlagDryRun(dryRun),telemetry.trackCliFlagAddRwToken(addRwToken),telemetry.trackCliOptionAuth(flags["--auth"]),telemetry.trackCliOptionPrefix(flags["--prefix"]),telemetry.trackCliOptionProject(flags["--project"]),telemetry.trackCliOptionEnvironment(flags["--environment"]),telemetry.trackCliArgumentStore(args[0]),args.length<1)return failWith(client,{reason:AGENT_REASON.MISSING_ARGUMENTS,message:"You must specify a storage resource. See `--help` for details."});if(args.length>1)return failWith(client,{reason:AGENT_REASON.INVALID_ARGUMENTS,message:"Too many arguments. Usage: `vercel storage connect <store> [--project <name-or-id>]`."});if(asJson&&!skipConfirmation&&!dryRun)return output_manager_default.error("--json requires --yes or --dry-run to skip confirmation prompts"),2;let authMode=parseAuthMode(flags["--auth"]);if(!authMode.valid)return failWith(client,{reason:AGENT_REASON.INVALID_ARGUMENTS,message:authMode.error});let environments=resolveEnvironments(flags["--environment"]);if(!environments.valid)return failWith(client,{reason:AGENT_REASON.INVALID_ARGUMENTS,message:environments.message});let prefix=resolvePrefix(flags["--prefix"]);if(!prefix.valid)return failWith(client,{reason:AGENT_REASON.INVALID_ARGUMENTS,message:prefix.message});let scope=await resolveStorageScope(client,flags["--project"]);if(typeof scope=="number")return scope;let store=await resolveStorageStore(client,args[0],scope.accountId);if(typeof store=="number")return store;let auth=resolveStorageAuth({store,mode:authMode.mode,addRwToken});if(!auth.valid)return failWith(client,{reason:auth.reason,message:auth.error,hint:auth.hint});let overlapping=findOverlappingConnections(store,scope.project.id,environments.environments);if(overlapping.length>0)return failWith(client,{reason:"already_connected",message:`${store.name} is already connected to ${scope.project.name} in ${overlapping.flatMap(connection=>connection.environments).join(", ")}.`,hint:`Change the connection with ${getCommandName(`storage update ${store.name}`)}, or remove it with ${getCommandName(`storage disconnect ${store.name}`)}.`,next:[{command:getCommandNamePlain(`storage update ${store.name}`),when:"change environments, prefix, or credential mode"},{command:getCommandNamePlain(`storage disconnect ${store.name}`),when:"remove the existing connection first"}]});let envVars=planConnectEnvVars({store,auth:auth.auth,prefix:prefix.prefix,sibling:getConnections(store)[0]}),plan=buildStoragePlan({action:"connect",dryRun,store,projects:[scope.project],environments:environments.environments,envVarPrefix:prefix.prefix,auth:auth.auth,envVars});if(dryRun)return writeStorageResult(client,plan,{applied:!1,asJson}),0;asJson||printStoragePlan(client,plan,!1);let confirmed=await confirmStorageChange(client,{skipConfirmation,question:"Apply this change?"});if(typeof confirmed=="number")return confirmed;if(!confirmed)return output_manager_default.log("Canceled"),0;try{output_manager_default.spinner("Connecting storage resource\u2026",500),await connectStoreToProject(client,{store,projectId:scope.project.id,environments:environments.environments,envVarPrefix:prefix.prefix,auth:auth.auth,accountId:scope.accountId})}catch(error){return output_manager_default.stopSpinner(),reportConnectFailure(client,error,{storeName:store.name,projectName:scope.project.name,teamSlug:scope.teamSlug,environments:environments.environments,prefix:prefix.prefix})}output_manager_default.stopSpinner();let verified=await readBackConnectionEnvVars(client,{store,projectId:scope.project.id,environments:environments.environments,accountId:scope.accountId}),appliedPlan=verified?buildStoragePlan({action:"connect",dryRun:!1,store,projects:[scope.project],environments:environments.environments,envVarPrefix:prefix.prefix,auth:auth.auth,envVars:diffEnvVarNames([],verified)}):plan;return writeStorageResult(client,appliedPlan,{applied:!0,asJson,message:`Connected ${import_chalk40.default.bold(store.name)} to ${import_chalk40.default.bold(scope.project.name)} (${environments.environments.join(", ")})`,next:getStorageEnvPullNext(client,scope,environments.environments)}),0}function reportConnectFailure(client,error,{storeName,projectName,teamSlug,environments,prefix}){if(isAPIError(error)&&error.status===400){let conflict=error.serverMessage?.match(/existing environment variable with name ([A-Za-z_][A-Za-z0-9_]*)/);if(conflict){let varName=conflict[1],envRmCmd=["env remove",varName,environments.length===1?environments[0]:void 0,`--project ${projectName}`,teamSlug?`--scope ${teamSlug}`:void 0].filter(Boolean).join(" ");return failWith(client,{reason:"env_var_conflict",message:`Cannot connect ${storeName}: env var ${varName} already exists on ${projectName} in one of the target environments (${environments.join(", ")}).`,hint:prefix===void 0?"Re-run with `--prefix <PREFIX>` to namespace the new variables, or remove the existing one.":`Prefix \`${prefix}\` did not avoid the collision. Try a different prefix or remove the existing variable.`,next:[{command:buildCommandWithGlobalFlags(client.argv,envRmCmd,void 0,{excludeFlags:["--yes","-y"]}),when:`remove ${varName} from ${projectName}`}]})}}return failWith(client,{reason:AGENT_REASON.API_ERROR,message:`A problem occurred while connecting: ${error.message}`})}var import_chalk41=__toESM(require_source(),1);var StorageCreateTelemetryClient=class extends TelemetryClient{trackCliArgumentName(v){v&&this.trackCliArgument({arg:"name",value:this.redactedValue})}trackCliOptionType(v){v&&this.trackCliOption({option:"type",value:getStorageProvider(v)?.type??this.redactedValue})}trackCliOptionAccess(v){v&&this.trackCliOption({option:"access",value:["public","private"].includes(v)?v:this.redactedValue})}trackCliOptionRegion(v){v&&this.trackCliOption({option:"region",value:this.redactedValue})}trackCliOptionItems(v){v&&this.trackCliOption({option:"items",value:this.redactedValue})}trackCliFlagJson(v){v&&this.trackCliFlag("json")}};async function create2(client,argv){let telemetry=new StorageCreateTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(createSubcommand2.options),parsedArguments;try{parsedArguments=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags}=parsedArguments,formatResult=validateJsonOutput(flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput,name=args[0];if(telemetry.trackCliOptionFormat(flags["--format"]),telemetry.trackCliFlagJson(flags["--json"]),telemetry.trackCliArgumentName(name),telemetry.trackCliOptionType(flags["--type"]),telemetry.trackCliOptionAccess(flags["--access"]),telemetry.trackCliOptionRegion(flags["--region"]),telemetry.trackCliOptionItems(flags["--items"]),!name)return failWith(client,{reason:AGENT_REASON.MISSING_ARGUMENTS,message:"You must specify a name for the store. See `--help` for details.",next:[{command:buildCommandWithGlobalFlags(client.argv,"storage create <name> --type <type>"),when:`replace <name> and <type> (${listStorageProviderTypes().join(", ")})`}]});if(args.length>1)return failWith(client,{reason:AGENT_REASON.INVALID_ARGUMENTS,message:"Too many arguments. Usage: `vercel storage create <name> --type <type>`."});let interactive=canPrompt(client),provider=await resolveProvider(client,flags["--type"],interactive);if(typeof provider=="number")return provider;let foreignFlags=findForeignCreateFlags(provider,flags);if(foreignFlags.length>0)return failWith(client,{reason:AGENT_REASON.INVALID_ARGUMENTS,message:`${foreignFlags.join(", ")} ${foreignFlags.length===1?"does":"do"} not apply to ${provider.label} stores.`});let validation=await provider.validateCreate(flags,{prompt:interactive?{select:(message,choices)=>client.input.select({message,choices})}:void 0});if(!validation.valid)return failWith(client,{reason:validation.reason,message:validation.message});let account=await resolveStorageAccount(client);if(typeof account=="number")return account;output_manager_default.spinner(`Creating ${provider.label} store\u2026`,500);let created;try{created=await provider.create(client,{name,params:validation.params,accountId:account.accountId})}catch(error){return output_manager_default.stopSpinner(),failWith(client,{reason:AGENT_REASON.API_ERROR,message:`Failed to create the store: ${error.message}`})}output_manager_default.stopSpinner();let connectCommand=account.linkedProject?`storage connect ${created.name}`:`storage connect ${created.name} --project <project>`,next=[{command:getCommandNamePlain(`${connectCommand} --yes`),when:account.linkedProject?"connect the new store to the linked project":"connect the new store to a project (replace <project>)"}];if(asJson){let result={status:"ok",store:{id:created.id,name:created.name,type:provider.type,product:provider.label,details:created.details},next};return client.stdout.write(`${JSON.stringify(result,null,2)}
|
|
126
126
|
`),0}printAlignedLabel("Created",created.name,{gutter:"\u2713"}),printAlignedLabel("ID",created.id),printAlignedLabel("Type",provider.label);for(let[key,value]of Object.entries(created.details))value!==null&&value!==""&&printAlignedLabel(labelFor(key),String(value));return output_manager_default.print(`
|
|
127
|
-
`),output_manager_default.log(`Run ${import_chalk41.default.cyan(getCommandName(connectCommand))} to connect it to a project.`),0}async function resolveProvider(client,typeFlag,interactive){if(typeFlag){let provider=getStorageProvider(typeFlag);return provider||failWith(client,{reason:AGENT_REASON.INVALID_ARGUMENTS,message:`Unknown store type "${typeFlag}". Known types: ${listStorageProviderTypes().join(", ")}.`,hint:"Marketplace resources (Neon, Upstash, Supabase, \u2026) are created with `vercel integration add <integration>`.",next:[{command:getCommandNamePlain("integration add <integration>"),when:"provision a Marketplace resource (replace <integration>)"}]})}return interactive?client.input.select({message:"Choose the type of store to create",choices:STORAGE_PROVIDERS.map(provider=>({name:provider.label,value:provider}))}):failWith(client,{reason:AGENT_REASON.MISSING_ARGUMENTS,message:`You must specify --type. Known types: ${listStorageProviderTypes().join(", ")}.`,next:STORAGE_PROVIDERS.map(provider=>({command:buildCommandWithGlobalFlags(client.argv,`storage create <name> --type ${provider.type}`),when:`create a ${provider.label} store (replace <name>)`}))})}var import_chalk42=__toESM(require_source(),1);var StorageDeleteTelemetryClient=class extends TelemetryClient{trackCliOptionType(v){v&&this.trackCliOption({option:"type",value:getStorageProvider(v)?.type??this.redactedValue})}trackCliArgumentStore(v){v&&this.trackCliArgument({arg:"store",value:this.redactedValue})}};async function deleteStore(client,argv){let telemetry=new StorageDeleteTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(deleteSubcommand.options),parsedArguments;try{parsedArguments=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags}=parsedArguments;if(telemetry.trackCliArgumentStore(args[0]),telemetry.trackCliOptionType(flags["--type"]),args.length<1)return failWith(client,{reason:AGENT_REASON.MISSING_ARGUMENTS,message:"You must specify a storage resource. See `--help` for details.",next:[{command:getCommandNamePlain("storage list"),when:"list the storage resources in this scope"}]});if(args.length>1)return failWith(client,{reason:AGENT_REASON.INVALID_ARGUMENTS,message:"Too many arguments. Usage: `vercel storage delete <store> [--type <type>]`."});let account=await resolveStorageAccount(client);if(typeof account=="number")return account;let resolved=await resolveStorageStore(client,args[0],account.accountId,{type:flags["--type"]});if(typeof resolved=="number")return resolved;let provider=getStorageProvider(resolved.type);if(!provider)return resolved.type==="integration"?failWith(client,{reason:AGENT_REASON.INVALID_ARGUMENTS,message:`${resolved.name} is a Marketplace resource (${storeProductLabel(resolved)}). Use \`vercel integration
|
|
127
|
+
`),output_manager_default.log(`Run ${import_chalk41.default.cyan(getCommandName(connectCommand))} to connect it to a project.`),0}async function resolveProvider(client,typeFlag,interactive){if(typeFlag){let provider=getStorageProvider(typeFlag);return provider||failWith(client,{reason:AGENT_REASON.INVALID_ARGUMENTS,message:`Unknown store type "${typeFlag}". Known types: ${listStorageProviderTypes().join(", ")}.`,hint:"Marketplace resources (Neon, Upstash, Supabase, \u2026) are created with `vercel integration add <integration>`.",next:[{command:getCommandNamePlain("integration add <integration>"),when:"provision a Marketplace resource (replace <integration>)"}]})}return interactive?client.input.select({message:"Choose the type of store to create",choices:STORAGE_PROVIDERS.map(provider=>({name:provider.label,value:provider}))}):failWith(client,{reason:AGENT_REASON.MISSING_ARGUMENTS,message:`You must specify --type. Known types: ${listStorageProviderTypes().join(", ")}.`,next:STORAGE_PROVIDERS.map(provider=>({command:buildCommandWithGlobalFlags(client.argv,`storage create <name> --type ${provider.type}`),when:`create a ${provider.label} store (replace <name>)`}))})}var import_chalk42=__toESM(require_source(),1);var StorageDeleteTelemetryClient=class extends TelemetryClient{trackCliOptionType(v){v&&this.trackCliOption({option:"type",value:getStorageProvider(v)?.type??this.redactedValue})}trackCliArgumentStore(v){v&&this.trackCliArgument({arg:"store",value:this.redactedValue})}};async function deleteStore(client,argv){let telemetry=new StorageDeleteTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(deleteSubcommand.options),parsedArguments;try{parsedArguments=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags}=parsedArguments;if(telemetry.trackCliArgumentStore(args[0]),telemetry.trackCliOptionType(flags["--type"]),args.length<1)return failWith(client,{reason:AGENT_REASON.MISSING_ARGUMENTS,message:"You must specify a storage resource. See `--help` for details.",next:[{command:getCommandNamePlain("storage list"),when:"list the storage resources in this scope"}]});if(args.length>1)return failWith(client,{reason:AGENT_REASON.INVALID_ARGUMENTS,message:"Too many arguments. Usage: `vercel storage delete <store> [--type <type>]`."});let account=await resolveStorageAccount(client);if(typeof account=="number")return account;let resolved=await resolveStorageStore(client,args[0],account.accountId,{type:flags["--type"]});if(typeof resolved=="number")return resolved;let provider=getStorageProvider(resolved.type);if(!provider)return resolved.type==="integration"?failWith(client,{reason:AGENT_REASON.INVALID_ARGUMENTS,message:`${resolved.name} is a Marketplace resource (${storeProductLabel(resolved)}). Use \`vercel integration resource delete\` to delete it.`,next:[{command:getCommandNamePlain(`integration resource delete ${resolved.name}`),when:"delete the Marketplace resource"}]}):failWith(client,{reason:AGENT_REASON.INVALID_ARGUMENTS,message:`${storeProductLabel(resolved)} stores cannot be deleted with the CLI yet. Delete ${resolved.name} from the Vercel dashboard instead.`});if(!canPrompt(client)){let commandTail=[`storage delete ${args[0]}`,flags["--type"]?`--type ${flags["--type"]}`:void 0].filter(Boolean).join(" ");return outputActionRequired(client,{status:AGENT_STATUS.ACTION_REQUIRED,reason:AGENT_REASON.INTERACTIVE_CONFIRMATION_REQUIRED,action:AGENT_ACTION.CONFIRMATION_REQUIRED,message:"Deleting a storage resource cannot be undone, removes its project connections, and requires interactive confirmation. Agents must not make this change on behalf of a user.",userActionRequired:!0,hint:"A human must run the first command in next[] in an interactive terminal.",next:[{command:buildCommandWithGlobalFlags(client.argv,commandTail),when:"Review the store and confirm in a terminal"},{command:buildCommandWithGlobalFlags(client.argv,`storage inspect ${args[0]} --json`),when:"Inspect the store and its connections first"}]},1),output_manager_default.error("Confirmation required. Deleting a storage resource cannot be undone and must be confirmed in an interactive terminal."),1}let store;output_manager_default.spinner("Retrieving storage resource\u2026",500);try{store=await loadStoreDetails(client,resolved,account.accountId)}catch(error){return output_manager_default.stopSpinner(),printError(error),1}output_manager_default.stopSpinner();let connections=getConnections(store),projectNames=[...new Set(connections.map(connection=>connection.name))];printAlignedLabel("Store",store.name),printAlignedLabel("ID",store.id),printAlignedLabel("Type",provider.label),printAlignedLabel("Projects",projectNames.length?projectNames.join(", "):import_chalk42.default.dim("not connected")),output_manager_default.print(`
|
|
128
128
|
`);let consequence=projectNames.length?` This disconnects it from ${projectNames.length} ${projectNames.length===1?"project":"projects"} and removes their environment variables.`:"";if(!await client.input.confirm(`Delete ${import_chalk42.default.bold(store.name)}?${consequence} This cannot be undone.`,!1))return output_manager_default.log("Canceled"),0;output_manager_default.spinner(`Deleting ${provider.label} store\u2026`,500);try{await provider.delete(client,{store,accountId:account.accountId})}catch(error){return output_manager_default.stopSpinner(),failWith(client,{reason:AGENT_REASON.API_ERROR,message:`Failed to delete the store: ${error.message}`})}return output_manager_default.stopSpinner(),printAlignedLabel("Deleted",store.name,{gutter:"\u2713"}),projectNames.length&&(printAlignedLabel("Disconnected",projectNames.join(", ")),output_manager_default.print(`
|
|
129
129
|
`),output_manager_default.log(`Run ${import_chalk42.default.cyan(getCommandName("env pull"))} in the affected projects to refresh their local environment files.`)),0}var import_chalk43=__toESM(require_source(),1);var StorageDisconnectTelemetryClient=class extends TelemetryClient{trackCliArgumentStore(v){v&&this.trackCliArgument({arg:"store",value:this.redactedValue})}trackCliOptionProject(v){v&&this.trackCliOption({option:"project",value:this.redactedValue})}trackCliFlagAll(v){v&&this.trackCliFlag("all")}trackCliFlagDryRun(v){v&&this.trackCliFlag("dry-run")}trackCliFlagJson(v){v&&this.trackCliFlag("json")}};async function disconnect2(client,argv){let telemetry=new StorageDisconnectTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(disconnectSubcommand2.options),parsedArguments;try{parsedArguments=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags}=parsedArguments,formatResult=validateJsonOutput(flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput,dryRun=flags["--dry-run"]??!1,all=flags["--all"]??!1;if(telemetry.trackCliOptionFormat(flags["--format"]),telemetry.trackCliFlagJson(flags["--json"]),telemetry.trackCliFlagDryRun(dryRun),telemetry.trackCliFlagAll(all),telemetry.trackCliOptionProject(flags["--project"]),telemetry.trackCliArgumentStore(args[0]),args.length<1)return failWith(client,{reason:AGENT_REASON.MISSING_ARGUMENTS,message:"You must specify a storage resource. See `--help` for details."});if(args.length>1)return failWith(client,{reason:AGENT_REASON.INVALID_ARGUMENTS,message:"Too many arguments. Usage: `vercel storage disconnect <store> [--project <name-or-id>]`."});if(all&&flags["--project"])return failWith(client,{reason:AGENT_REASON.INVALID_ARGUMENTS,message:"--all and --project cannot be combined."});if(asJson&&!dryRun)return output_manager_default.error("--json requires --dry-run. Disconnecting removes environment variables from the project, so applying it always requires interactive confirmation."),2;if(!dryRun&&!canPrompt(client)){let commandTail=[`storage disconnect ${args[0]}`,all?"--all":void 0,flags["--project"]?`--project ${flags["--project"]}`:void 0].filter(Boolean).join(" ");return outputActionRequired(client,{status:AGENT_STATUS.ACTION_REQUIRED,reason:AGENT_REASON.INTERACTIVE_CONFIRMATION_REQUIRED,action:AGENT_ACTION.CONFIRMATION_REQUIRED,message:"Disconnecting a storage resource removes its environment variables from the project and requires interactive confirmation. Agents must not make this change on behalf of a user.",userActionRequired:!0,hint:"A human must run the first command in next[] in an interactive terminal. Agents may only run the --dry-run preview.",next:[{command:buildCommandWithGlobalFlags(client.argv,commandTail),when:"Review the change set and confirm in a terminal"},{command:buildCommandWithGlobalFlags(client.argv,`${commandTail} --dry-run --json`),when:"Preview the environment variables that would be removed"}]},1),output_manager_default.error("Confirmation required. Disconnecting removes environment variables from the project and must be confirmed in an interactive terminal."),1}let accountId,project;if(all){let{team}=await getScope(client);client.config.currentTeam=team?.id,accountId=team?.id}else{let scope=await resolveStorageScope(client,flags["--project"]);if(typeof scope=="number")return scope;accountId=scope.accountId,project=scope.project}let store=await resolveStorageStore(client,args[0],accountId);if(typeof store=="number")return store;let connections;if(all){if(connections=getConnections(store),connections.length===0)return failWith(client,{reason:AGENT_REASON.NOT_FOUND,message:`${store.name} is not connected to any project.`})}else{let target=resolveProjectConnection(store,project.id);if(target.status==="not_found")return failWith(client,{reason:AGENT_REASON.NOT_FOUND,message:`${store.name} is not connected to ${project.name}.`,next:[{command:getCommandNamePlain(`storage status ${store.name}`),when:"see which projects are connected"}]});connections=target.status==="found"?[target.connection]:target.connections}let plan=buildStoragePlan({action:"disconnect",dryRun,store,projects:connections.map(connection=>({id:connection.projectId,name:connection.name})),environments:[...new Set(connections.flatMap(connection=>connection.environments))],envVars:planDisconnectEnvVars(connections)});if(dryRun)return writeStorageResult(client,plan,{applied:!1,asJson}),0;printStoragePlan(client,plan,!1);let removedCount=plan.envVars.remove.length,targetName=all?`${connections.length} ${connections.length===1?"project":"projects"}`:import_chalk43.default.bold(connections[0]?.name??project.name),consequence=removedCount>0?` This removes ${removedCount} environment ${removedCount===1?"variable":"variables"}.`:"";if(!await client.input.confirm(`Disconnect ${import_chalk43.default.bold(store.name)} from ${targetName}?${consequence}`,!1))return output_manager_default.log("Canceled"),0;try{if(output_manager_default.spinner("Disconnecting storage resource\u2026",500),all)await disconnectAllStoreConnections(client,{store,accountId});else for(let connection of connections)await disconnectStoreConnection(client,{store,connectionId:connection.id,accountId})}catch(error){return output_manager_default.stopSpinner(),failWith(client,{reason:AGENT_REASON.API_ERROR,message:`A problem occurred while disconnecting: ${error.message}`})}output_manager_default.stopSpinner();let targetLabel=all?"all projects":import_chalk43.default.bold(connections[0]?.name??project.name);return writeStorageResult(client,plan,{applied:!0,asJson,message:`Disconnected ${import_chalk43.default.bold(store.name)} from ${targetLabel}`}),0}var import_chalk44=__toESM(require_source(),1);var StorageGetTelemetryClient=class extends TelemetryClient{trackCliOptionType(v){v&&this.trackCliOption({option:"type",value:getStorageProvider(v)?.type??this.redactedValue})}trackCliArgumentStore(v){v&&this.trackCliArgument({arg:"store",value:this.redactedValue})}trackCliFlagJson(v){v&&this.trackCliFlag("json")}};async function get(client,argv){let telemetry=new StorageGetTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(getSubcommand.options),parsedArguments;try{parsedArguments=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags}=parsedArguments,formatResult=validateJsonOutput(flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput;if(telemetry.trackCliOptionFormat(flags["--format"]),telemetry.trackCliFlagJson(flags["--json"]),telemetry.trackCliArgumentStore(args[0]),telemetry.trackCliOptionType(flags["--type"]),args.length<1)return failWith(client,{reason:AGENT_REASON.MISSING_ARGUMENTS,message:"You must specify a storage resource. See `--help` for details.",next:[{command:getCommandNamePlain("storage list"),when:"list the storage resources in this scope"}]});if(args.length>1)return failWith(client,{reason:AGENT_REASON.INVALID_ARGUMENTS,message:"Too many arguments. Usage: `vercel storage inspect <store> [--type <type>]`."});let account=await resolveStorageAccount(client);if(typeof account=="number")return account;let resolved=await resolveStorageStore(client,args[0],account.accountId,{type:flags["--type"]});if(typeof resolved=="number")return resolved;let store,details={};output_manager_default.spinner("Retrieving storage resource\u2026",500);try{store=await loadStoreDetails(client,resolved,account.accountId);let provider=getStorageProvider(store.type);provider&&(details=await provider.describe(client,{store,accountId:account.accountId}))}catch(error){return output_manager_default.stopSpinner(),printError(error),1}output_manager_default.stopSpinner();let result=summarizeStore(store,details,account.teamSlug);return asJson?(client.stdout.write(`${JSON.stringify(result,null,2)}
|
|
130
130
|
`),0):(printDetails(result),0)}function summarizeStore(store,details,teamSlug){let raw=store;return{id:store.id,name:store.name,type:storeTypeName(store),product:storeProductLabel(store),status:store.status??null,createdAt:raw.createdAt??null,updatedAt:raw.updatedAt??null,dashboardUrl:teamSlug?`https://vercel.com/${teamSlug}/~/stores/${encodeURIComponent(store.type??"unknown")}/${encodeURIComponent(store.id)}`:null,details,connections:getConnections(store).map(connection=>({id:connection.id,project:{id:connection.projectId,name:connection.name},environments:connection.environments}))}}function printDetails(result){printAlignedLabel("Store",result.name),printAlignedLabel("ID",result.id),printAlignedLabel("Type",result.product),result.status&&printAlignedLabel("Status",result.status);for(let[key,value]of Object.entries(result.details))value!==null&&value!==""&&printAlignedLabel(labelFor(key),String(value));result.createdAt&&printAlignedLabel("Created",formatDate(result.createdAt)),result.updatedAt&&printAlignedLabel("Updated",formatDate(result.updatedAt)),result.dashboardUrl&&printAlignedLabel("Dashboard",output_manager_default.link(result.dashboardUrl,result.dashboardUrl)||result.dashboardUrl),printAlignedLabel("Projects",result.connections.length?result.connections.map(connection=>`${connection.project.name} (${connection.environments.join(", ")})`).join(", "):import_chalk44.default.dim("not connected")),output_manager_default.print(`
|