@vercel/cli-support 0.0.0 → 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/LICENSE +202 -0
- package/README.md +100 -3
- 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-25565AGS.js +7 -0
- package/dist/chunks/chunk-2EYYB6YN.js +7 -0
- package/dist/chunks/chunk-2GHZGOWT.js +7 -0
- package/dist/chunks/chunk-2K3ISCQ6.js +7 -0
- package/dist/chunks/chunk-2NABMKFV.js +29 -0
- package/dist/chunks/chunk-2S6PE6GB.js +7 -0
- package/dist/chunks/chunk-2TUVL6WE.js +12 -0
- package/dist/chunks/chunk-363SJ4TN.js +7 -0
- package/dist/chunks/chunk-3G3FQYMW.js +7 -0
- package/dist/chunks/chunk-3LIKVGFT.js +8 -0
- package/dist/chunks/chunk-3XW7N4W3.js +9 -0
- package/dist/chunks/chunk-462YCCJZ.js +7 -0
- package/dist/chunks/chunk-4CACOKMS.js +7 -0
- package/dist/chunks/chunk-4N6LMERQ.js +57 -0
- package/dist/chunks/chunk-4NTBYNFR.js +17 -0
- package/dist/chunks/chunk-4SAVH3H7.js +7 -0
- package/dist/chunks/chunk-4VFYJU37.js +7 -0
- 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-5RMIM4S2.js +7 -0
- package/dist/chunks/chunk-5V53NA6C.js +7 -0
- package/dist/chunks/chunk-67GZ5REA.js +7 -0
- package/dist/chunks/chunk-6I6QJHCY.js +7 -0
- package/dist/chunks/chunk-6IDNVZZR.js +7 -0
- package/dist/chunks/chunk-6OVX3PWM.js +7 -0
- package/dist/chunks/chunk-6QKS6QK7.js +7 -0
- package/dist/chunks/chunk-6TXEVQA4.js +7 -0
- package/dist/chunks/chunk-6VH56CX2.js +19 -0
- package/dist/chunks/chunk-6Y2ZL5XJ.js +98 -0
- package/dist/chunks/chunk-6YXIWZ3X.js +25 -0
- package/dist/chunks/chunk-773GOZIR.js +13 -0
- package/dist/chunks/chunk-7E3WREH5.js +7 -0
- package/dist/chunks/chunk-7EJQLVWX.js +7 -0
- package/dist/chunks/chunk-7L2K4OKM.js +63 -0
- package/dist/chunks/chunk-7L5QUDUR.js +8 -0
- package/dist/chunks/chunk-7QAGSRCU.js +7 -0
- package/dist/chunks/chunk-7R6TRRG5.js +7 -0
- package/dist/chunks/chunk-7YKFF6CE.js +7 -0
- package/dist/chunks/chunk-A2RZZQEP.js +7 -0
- package/dist/chunks/chunk-ADLBLGT3.js +8 -0
- package/dist/chunks/chunk-AM46JVVN.js +7 -0
- package/dist/chunks/chunk-ANMDN3EG.js +9 -0
- package/dist/chunks/chunk-AYUUSAB7.js +7 -0
- package/dist/chunks/chunk-BLUPZPAS.js +7 -0
- package/dist/chunks/chunk-BPUANOGW.js +7 -0
- package/dist/chunks/chunk-BRQUZ5NC.js +7 -0
- package/dist/chunks/chunk-BS32OUOC.js +7 -0
- package/dist/chunks/chunk-BTI5TG6Q.js +7 -0
- package/dist/chunks/chunk-BUJITHGZ.js +8 -0
- package/dist/chunks/chunk-BVGGTBYE.js +7 -0
- package/dist/chunks/chunk-BVH2AEFE.js +7 -0
- package/dist/chunks/chunk-BZENIQ7N.js +7 -0
- package/dist/chunks/chunk-C6GY2G73.js +7 -0
- package/dist/chunks/chunk-C7FQMC6D.js +7 -0
- package/dist/chunks/chunk-CBVKB3DT.js +21 -0
- package/dist/chunks/chunk-CC6FLKIP.js +11 -0
- package/dist/chunks/chunk-COD3WAUI.js +7 -0
- package/dist/chunks/chunk-CR3NBTHV.js +7 -0
- package/dist/chunks/chunk-CWM2F235.js +7 -0
- package/dist/chunks/chunk-CZSOZKHX.js +7 -0
- package/dist/chunks/chunk-D3AHZ5LI.js +7 -0
- package/dist/chunks/chunk-D6REP5QQ.js +15 -0
- package/dist/chunks/chunk-DFVNL5ML.js +7 -0
- package/dist/chunks/chunk-DKJL2KV7.js +7 -0
- package/dist/chunks/chunk-DQ2SVW4R.js +12 -0
- package/dist/chunks/chunk-DWZBL4NK.js +7 -0
- package/dist/chunks/chunk-EAUDC24V.js +9 -0
- package/dist/chunks/chunk-EAXMWCOL.js +63 -0
- package/dist/chunks/chunk-ECEDD646.js +8 -0
- package/dist/chunks/chunk-ECQIO5K3.js +7 -0
- package/dist/chunks/chunk-EEUJLJEJ.js +7 -0
- package/dist/chunks/chunk-EGNR2DEI.js +7 -0
- package/dist/chunks/chunk-EISD3RG7.js +11 -0
- package/dist/chunks/chunk-EKZTFGDX.js +7 -0
- package/dist/chunks/chunk-ETV3C2CV.js +7 -0
- package/dist/chunks/chunk-EU2GBIPC.js +7 -0
- package/dist/chunks/chunk-F4KY2TOK.js +7 -0
- package/dist/chunks/chunk-F53OKXYI.js +7 -0
- package/dist/chunks/chunk-F6EBOT64.js +7 -0
- package/dist/chunks/chunk-F7AVGV4Y.js +7 -0
- package/dist/chunks/chunk-FBYA6LLM.js +7 -0
- package/dist/chunks/chunk-FGFLTLEA.js +7 -0
- package/dist/chunks/chunk-FHU2O7ZJ.js +8 -0
- package/dist/chunks/chunk-FLHO75XC.js +8 -0
- package/dist/chunks/chunk-FSPPKNKN.js +7 -0
- package/dist/chunks/chunk-FUX6LKNP.js +7 -0
- package/dist/chunks/chunk-GA277JFB.js +20 -0
- package/dist/chunks/chunk-GCZVIDNG.js +86 -0
- package/dist/chunks/chunk-GD7AV7BO.js +9 -0
- package/dist/chunks/chunk-GG5RME4X.js +7 -0
- package/dist/chunks/chunk-GHAY4PSD.js +7 -0
- package/dist/chunks/chunk-GYVJIIYL.js +7 -0
- package/dist/chunks/chunk-GZNDA6SV.js +8 -0
- package/dist/chunks/chunk-HCRD3JFL.js +7 -0
- package/dist/chunks/chunk-HEGJZJO7.js +7 -0
- package/dist/chunks/chunk-HRR57QNP.js +7 -0
- package/dist/chunks/chunk-HSFKISDH.js +9 -0
- package/dist/chunks/chunk-HTXDC7E2.js +10 -0
- package/dist/chunks/chunk-ID663OJ7.js +7 -0
- package/dist/chunks/chunk-IOZ3I765.js +7 -0
- package/dist/chunks/chunk-IQ7FPAI4.js +7 -0
- package/dist/chunks/chunk-IQKGQ2Y2.js +15 -0
- package/dist/chunks/chunk-ISWW3DKF.js +7 -0
- package/dist/chunks/chunk-IVSSTHB6.js +7 -0
- package/dist/chunks/chunk-J24BABG4.js +21 -0
- package/dist/chunks/chunk-JALVF3C2.js +7 -0
- package/dist/chunks/chunk-JELLVPCM.js +8 -0
- package/dist/chunks/chunk-JESNVRVR.js +7 -0
- package/dist/chunks/chunk-JLE7K4SY.js +9 -0
- package/dist/chunks/chunk-JLEJB6KM.js +7 -0
- package/dist/chunks/chunk-JP33AIDQ.js +7 -0
- package/dist/chunks/chunk-JRPNHWA3.js +7 -0
- package/dist/chunks/chunk-JUSR7V2L.js +7 -0
- package/dist/chunks/chunk-JWCEHQQF.js +29 -0
- package/dist/chunks/chunk-K5U47EVH.js +7 -0
- package/dist/chunks/chunk-KCKYPLIH.js +7 -0
- package/dist/chunks/chunk-KGBIRIFF.js +7 -0
- package/dist/chunks/chunk-KJA2GKPT.js +7 -0
- package/dist/chunks/chunk-KPQLUGFI.js +32 -0
- package/dist/chunks/chunk-KQCFC2JL.js +7 -0
- package/dist/chunks/chunk-KQCROPL3.js +8 -0
- package/dist/chunks/chunk-KRPY5FHJ.js +7 -0
- package/dist/chunks/chunk-KW6GSQXV.js +7 -0
- package/dist/chunks/chunk-KY335KWI.js +7 -0
- package/dist/chunks/chunk-L3JYCXVB.js +23 -0
- package/dist/chunks/chunk-LFOWP74R.js +7 -0
- package/dist/chunks/chunk-LOBA3E72.js +7 -0
- package/dist/chunks/chunk-LQVSU5HR.js +7 -0
- package/dist/chunks/chunk-LSF7FY6X.js +7 -0
- package/dist/chunks/chunk-LSQREJXO.js +11 -0
- package/dist/chunks/chunk-LW4N3CW6.js +9 -0
- package/dist/chunks/chunk-M2NXKZKX.js +16 -0
- package/dist/chunks/chunk-MBEKRUTQ.js +8 -0
- package/dist/chunks/chunk-MCRKBVZA.js +7 -0
- package/dist/chunks/chunk-MVGTMPMI.js +23 -0
- package/dist/chunks/chunk-MXTC4ZAQ.js +7 -0
- package/dist/chunks/chunk-N2FLYCCO.js +9 -0
- package/dist/chunks/chunk-N6JBQMOF.js +20 -0
- package/dist/chunks/chunk-NAX6IARA.js +11 -0
- package/dist/chunks/chunk-NB2WLB3J.js +12 -0
- package/dist/chunks/chunk-NGKO2OOU.js +8 -0
- package/dist/chunks/chunk-NW7WWUCQ.js +9 -0
- package/dist/chunks/chunk-NWGBDBZI.js +7 -0
- package/dist/chunks/chunk-NZ2TFADV.js +7 -0
- package/dist/chunks/chunk-O4WNSKQR.js +15 -0
- package/dist/chunks/chunk-O72YDZKD.js +10 -0
- package/dist/chunks/chunk-OAM5NJCU.js +9 -0
- package/dist/chunks/chunk-OCR5CRTH.js +10 -0
- package/dist/chunks/chunk-OFDTADPQ.js +7 -0
- package/dist/chunks/chunk-OHEOYFBU.js +9 -0
- package/dist/chunks/chunk-OO572JUC.js +7 -0
- package/dist/chunks/chunk-OPORM35X.js +7 -0
- package/dist/chunks/chunk-OZCQTXI4.js +7 -0
- package/dist/chunks/chunk-PADL3C6Z.js +7 -0
- package/dist/chunks/chunk-PFD7LETF.js +7 -0
- package/dist/chunks/chunk-PFPJLIFF.js +33 -0
- package/dist/chunks/chunk-PSOVLGHP.js +7 -0
- package/dist/chunks/chunk-PUKYAALC.js +7 -0
- package/dist/chunks/chunk-PVASGBEF.js +7 -0
- package/dist/chunks/chunk-Q4KTAQB3.js +7 -0
- package/dist/chunks/chunk-Q5ODLDCU.js +7 -0
- package/dist/chunks/chunk-Q7D7RGXM.js +7 -0
- package/dist/chunks/chunk-QB7F3UAP.js +7 -0
- package/dist/chunks/chunk-QHJLRTVY.js +7 -0
- package/dist/chunks/chunk-QIVX6SCR.js +27 -0
- package/dist/chunks/chunk-QVHXFHBV.js +14 -0
- package/dist/chunks/chunk-QVXS234E.js +7 -0
- package/dist/chunks/chunk-QVZAAMGQ.js +39 -0
- package/dist/chunks/chunk-R2BUF6Z7.js +7 -0
- package/dist/chunks/chunk-R2XHJDAP.js +7 -0
- package/dist/chunks/chunk-R6BEOVTU.js +7 -0
- package/dist/chunks/chunk-RLKS5G6C.js +12 -0
- package/dist/chunks/chunk-RM3ZDRYE.js +7 -0
- package/dist/chunks/chunk-RMZTB2IU.js +7 -0
- package/dist/chunks/chunk-RRDNKB2X.js +7 -0
- package/dist/chunks/chunk-RW3X523R.js +8 -0
- package/dist/chunks/chunk-S3L2OHPO.js +7 -0
- package/dist/chunks/chunk-SACGQMVQ.js +13 -0
- package/dist/chunks/chunk-SCV7XEEO.js +7 -0
- package/dist/chunks/chunk-SF4E3AQ3.js +7 -0
- package/dist/chunks/chunk-SLGUYM42.js +10 -0
- package/dist/chunks/chunk-SYFG2RM6.js +10 -0
- package/dist/chunks/chunk-T6243EDS.js +7 -0
- package/dist/chunks/chunk-TAAWMNNL.js +7 -0
- package/dist/chunks/chunk-TAISZMA2.js +7 -0
- package/dist/chunks/chunk-TEYREL44.js +7 -0
- package/dist/chunks/chunk-TG2RCYTH.js +7 -0
- package/dist/chunks/chunk-TIPQQ4TG.js +17 -0
- package/dist/chunks/chunk-U2OBPULW.js +7 -0
- package/dist/chunks/chunk-U4Z2MMOF.js +301 -0
- package/dist/chunks/chunk-U56NHYAH.js +7 -0
- package/dist/chunks/chunk-UGNIIDHR.js +32 -0
- package/dist/chunks/chunk-UHBMX3OK.js +7 -0
- package/dist/chunks/chunk-UVHKXCR5.js +11 -0
- package/dist/chunks/chunk-V6Y6UK6B.js +43 -0
- package/dist/chunks/chunk-VNIKIQVE.js +10 -0
- package/dist/chunks/chunk-VT6RIZJH.js +7 -0
- package/dist/chunks/chunk-WDXW6A4H.js +10 -0
- package/dist/chunks/chunk-WEH6XC4Y.js +22 -0
- package/dist/chunks/chunk-WKZ6JSGZ.js +7 -0
- package/dist/chunks/chunk-WVHCBDTB.js +7 -0
- package/dist/chunks/chunk-XC46OAAT.js +9 -0
- package/dist/chunks/chunk-XGTKHQTT.js +7 -0
- package/dist/chunks/chunk-XOETL6DB.js +96 -0
- package/dist/chunks/chunk-XP3FT56R.js +27 -0
- package/dist/chunks/chunk-XR6QY7RR.js +7 -0
- package/dist/chunks/chunk-XVDRGWXM.js +16 -0
- package/dist/chunks/chunk-Y5ZMKL7E.js +7 -0
- package/dist/chunks/chunk-YEZJNXQX.js +7 -0
- package/dist/chunks/chunk-YHPPP3SF.js +7 -0
- package/dist/chunks/chunk-YHULP2KK.js +7 -0
- package/dist/chunks/chunk-YMZ6WBKB.js +21 -0
- package/dist/chunks/chunk-ZF27J6FQ.js +7 -0
- package/dist/chunks/chunk-ZFRNVIHI.js +7 -0
- package/dist/chunks/chunk-ZN6CQWVP.js +7 -0
- package/dist/chunks/chunk-ZQBSAMFL.js +24 -0
- package/dist/chunks/cjs-2SMN43VH.js +54 -0
- package/dist/chunks/clear-FKVWDCVA.js +8 -0
- package/dist/chunks/compile-vercel-config-GWAJE44R.js +7 -0
- package/dist/chunks/config-5WVLG5SE.js +8 -0
- package/dist/chunks/config-RMOHN5YT.js +7 -0
- package/dist/chunks/config-validator.mjs +1 -0
- package/dist/chunks/connect-git-provider-FS5Q2HO4.js +7 -0
- package/dist/chunks/constants-JAB7MRSK.js +7 -0
- package/dist/chunks/create-project-IKCB6MB2.js +7 -0
- package/dist/chunks/delete-5WMB4WFR.js +9 -0
- package/dist/chunks/delete-EM4JZPFA.js +10 -0
- package/dist/chunks/detect-projects-OD4JEAW2.js +7 -0
- package/dist/chunks/detect-services-BSJGB4RM.js +7 -0
- package/dist/chunks/disable-QOM7UHQC.js +7 -0
- package/dist/chunks/discard-L5ZH7P5B.js +14 -0
- package/dist/chunks/dist-33WTJLVQ.js +7 -0
- package/dist/chunks/dist-RXYNZPEA.js +7 -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/esm-33752ISR.js +7 -0
- package/dist/chunks/esm-4JKEE7PC.js +7 -0
- package/dist/chunks/esm-BYG5BWYH.js +9 -0
- package/dist/chunks/esm-DFFBNKNU.js +20 -0
- package/dist/chunks/esm-IF453UWS.js +7 -0
- package/dist/chunks/esm-LABWDJ72.js +7 -0
- package/dist/chunks/esm-TG37FXTU.js +9 -0
- package/dist/chunks/exec-OZSY46V6.js +16372 -0
- package/dist/chunks/export-EPLYZF2Q.js +19 -0
- package/dist/chunks/fetch-proxy-45DGILKR.js +67 -0
- package/dist/chunks/future-V77DRMQG.js +7 -0
- package/dist/chunks/generate-cert-for-deploy-Y3YHBMPU.js +7 -0
- package/dist/chunks/image-CVXEXU5R.js +7 -0
- package/dist/chunks/import-builders-PGRKJOOE.js +7 -0
- package/dist/chunks/inspect-BTRNXRJT.js +9 -0
- package/dist/chunks/inspect-CZ7WXYE5.js +20 -0
- package/dist/chunks/inspect-FGDVWAQP.js +13 -0
- package/dist/chunks/inspect-HFDGZNWC.js +15 -0
- package/dist/chunks/inspect-T2AIREYK.js +19 -0
- package/dist/chunks/list-CKRRHAOE.js +12 -0
- package/dist/chunks/list-FLREMGJR.js +16 -0
- package/dist/chunks/list-ON4YTQRN.js +10 -0
- package/dist/chunks/login-55LJ5ZA6.js +9 -0
- package/dist/chunks/login-DQRZSD4Z.js +7 -0
- package/dist/chunks/logs-2HQXWOHM.js +7 -0
- package/dist/chunks/ls-2HUJHVLA.js +12 -0
- package/dist/chunks/ls-3DVM5HLK.js +12 -0
- package/dist/chunks/ls-4B3QYHCI.js +8 -0
- package/dist/chunks/ls-A7K4XDQB.js +8 -0
- package/dist/chunks/ls-FK5XEJEU.js +12 -0
- package/dist/chunks/ls-QGUKJJY5.js +12 -0
- package/dist/chunks/ls-VTKHPDWS.js +11 -0
- package/dist/chunks/mutate-7ADZBCZM.js +9 -0
- package/dist/chunks/notifications-XZJXE2K4.js +7 -0
- package/dist/chunks/open-EE5IZQD7.js +7 -0
- package/dist/chunks/openapi-QBX62ZXC.js +7 -0
- package/dist/chunks/permissions-VYJ4LL5R.js +7 -0
- package/dist/chunks/pkg-EDJQLCNP.js +7 -0
- package/dist/chunks/plugin-offer-TEGYA3TA.js +9 -0
- package/dist/chunks/prompt-missing-credentials-VP6OVCFM.js +7 -0
- 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-FXXLX6UB.js +12 -0
- package/dist/chunks/reauthenticate-IXQDC4UZ.js +7 -0
- package/dist/chunks/reorder-B4OXSYCI.js +10 -0
- package/dist/chunks/reply-F637K6XH.js +9 -0
- package/dist/chunks/repo-info-to-url-XQSULSEO.js +7 -0
- package/dist/chunks/resolve-E3F6NYQZ.js +12 -0
- package/dist/chunks/resolve-agent-team-EIPCH766.js +7 -0
- package/dist/chunks/resolve-deployment-framework-preset-AXXYBFCL.js +7 -0
- 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-PKTWMDWQ.js +7 -0
- package/dist/chunks/rule-inspect-LKQA5I4V.js +8 -0
- package/dist/chunks/schema-FBV42W7N.js +14 -0
- package/dist/chunks/schema-ZWE5MNMG.js +44 -0
- package/dist/chunks/select-org-WMB752Z6.js +7 -0
- package/dist/chunks/set-UTYIPOLC.js +7 -0
- package/dist/chunks/setup-and-link-ZLY5XQW5.js +7 -0
- package/dist/chunks/skills-RKIGVVNM.js +590 -0
- package/dist/chunks/slugify-NMMUASYK.js +7 -0
- package/dist/chunks/stamp-TKONNIJ5.js +7 -0
- package/dist/chunks/tags-UCLZ5UMX.js +7 -0
- package/dist/chunks/token-W6P2KNI5.js +7 -0
- package/dist/chunks/token-util-JDQI37VN.js +7 -0
- package/dist/chunks/types-YM7TMHXW.js +14 -0
- package/dist/chunks/update-BGDQ5TXO.js +8 -0
- package/dist/chunks/update-route-version-KWK5S4UW.js +7 -0
- package/dist/chunks/utils-IQZEE4DT.js +86 -0
- package/dist/chunks/vlt-builder-graph-XL2XRO4V.js +7 -0
- package/dist/chunks/vlt-builder-importer-RBUPAB6J.js +11 -0
- package/dist/chunks/zod-2C2SXNIK.js +7 -0
- package/dist/commands/build/builder-worker.cjs +281 -0
- package/dist/commands/build/index.js +34 -0
- package/dist/commands/deploy/index.js +72 -0
- package/dist/commands/dev/builder-worker.cjs +110 -0
- package/dist/commands/dev/index.js +157 -0
- package/dist/commands/env/index.js +40 -0
- package/dist/commands/link/index.js +10 -0
- package/dist/commands/list/index.js +14 -0
- package/dist/commands/project/index.js +113 -0
- package/dist/commands-account.js +209 -0
- package/dist/commands-ai.js +200 -0
- package/dist/commands-blob.js +107 -0
- package/dist/commands-core.js +222 -0
- package/dist/commands-deployments.js +84 -0
- package/dist/commands-flags.js +377 -0
- package/dist/commands-integrations.js +143 -0
- package/dist/commands-observability.js +122 -0
- package/dist/commands-routing.js +273 -0
- package/dist/fetch-dist-tags.cjs +60 -0
- package/dist/get-latest-worker.cjs +222 -0
- package/dist/help.js +7 -0
- package/dist/index.js +27 -0
- package/dist/internal-build-worker.js +10 -0
- package/dist/internal-build.js +11 -0
- package/dist/package.json +264 -0
- package/dist/root-help-commands.mjs +1 -0
- package/dist/runtime-assets/dev-tunnel/api/tunnel.ts +443 -0
- package/dist/runtime-assets/dev-tunnel/lib/env.ts +25 -0
- package/dist/runtime-assets/dev-tunnel/lib/tunnel_pb.ts +505 -0
- package/dist/runtime-assets/node-preloads/next-dev-websocket.cjs +220 -0
- package/dist/vc.js +404 -0
- package/dist/version.mjs +2 -0
- package/package.json +224 -14
- package/index.js +0 -1
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { createRequire as __createRequire } from 'node:module';
|
|
2
|
+
import { fileURLToPath as __fileURLToPath } from 'node:url';
|
|
3
|
+
import { dirname as __dirname_ } from 'node:path';
|
|
4
|
+
const require = __createRequire(import.meta.url);
|
|
5
|
+
const __filename = __fileURLToPath(import.meta.url);
|
|
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-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
|
+
`),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
|
+
`),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
|
+
`),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(`
|
|
11
|
+
`)).join(`
|
|
12
|
+
|
|
13
|
+
`)}var import_chalk2=__toESM(require_source(),1);async function categories(client,args,flags){let formatResult=validateJsonOutput(flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;if(args.length>0)return output_manager_default.error(`Too many arguments. Usage: \`${packageName} connect categories\``),2;output_manager_default.spinner("Fetching categories\u2026");let fetched;try{fetched=(await client.fetch("/v1/connect/services/categories",{teamOptional:!0})).categories??[]}catch(err){return output_manager_default.stopSpinner(),printError(err,client),1}return output_manager_default.stopSpinner(),formatResult.jsonOutput?(client.stdout.write(`${JSON.stringify({categories:fetched},null,2)}
|
|
14
|
+
`),0):fetched.length===0?(output_manager_default.log("No categories found."),0):(output_manager_default.print(`${table([["Slug","Label","Services"].map(h=>import_chalk2.default.bold(import_chalk2.default.cyan(h))),...fetched.map(c=>[sanitizeForTerminal(c.slug),sanitizeForTerminal(c.label),String(c.count)])],{hsep:4})}
|
|
15
|
+
`),output_manager_default.log(`Run \`${packageName} connect discover --category <slug>\` to see a category's services.`),0)}var import_open=__toESM(require_open(),1);import{readFile as readFile2}from"node:fs/promises";import{resolve as resolve2}from"node:path";import{text}from"node:stream/consumers";async function selectConnexTeam(client,message){let scope=await getScope(client,{resolveLocalScope:!0});if(scope.org.type==="team"){client.config.currentTeam=scope.org.id;return}let org=await selectOrg(client,message,!1);if(org.type!=="team")throw new Error("Connect requires a team. Re-run and select a team to continue.");client.config.currentTeam=org.id,client.writeToConfigFile()}import{randomBytes,createHash}from"node:crypto";var POLL_INTERVAL_MS=2e3,MAX_POLL_DURATION_MS=115*60*1e3,MAX_EARLY_404_COUNT=3;function generateRequestCode(){let verifier=randomBytes(37).toString("base64url"),requestCode=createHash("sha256").update(verifier).digest("base64url");return{verifier,requestCode}}async function awaitConnexResult(client,verifier){let deadline=Date.now()+MAX_POLL_DURATION_MS,early404Count=0,lastProgress;for(;Date.now()<deadline;){await sleep(POLL_INTERVAL_MS);try{let result=await client.fetch(`/v1/connect/result/${encodeURIComponent(verifier)}`);if(result.status==="success"&&result.data)return result.data;if(result.status==="partial"&&result.data){if(result.progress&&result.progress!==lastProgress){lastProgress=result.progress,output_manager_default.stopSpinner();let clientId=result.data.clientId;clientId&&output_manager_default.log(`Connector created: ${clientId}`),output_manager_default.spinner(`${result.progress}...`)}continue}if(result.status==="error"&&result.error)return output_manager_default.error(`Setup failed: ${result.error.message} (${result.error.code})`),null;if(result.status==="canceled")return output_manager_default.error("Setup was canceled in the browser."),null}catch(err){if(err.status===404){if(early404Count++,early404Count>MAX_EARLY_404_COUNT)return output_manager_default.error("Setup request expired. Please try again."),null;output_manager_default.debug(`Polling 404 (${early404Count}/${MAX_EARLY_404_COUNT}), will retry`);continue}output_manager_default.debug(`Polling error (will retry): ${err}`)}}return output_manager_default.error("Timed out waiting for setup to complete. Please try again."),null}import{readFile,stat}from"node:fs/promises";import{resolve}from"node:path";import{createHash as createHash2}from"node:crypto";var MAX_ICON_BYTES=5*1024*1024,MIN_IMAGE_BYTES=12,IMAGE_SIGNATURES=[/^ffd8ffdb/,/^ffd8ffe000104a4649460001/,/^ffd8ffee/,/^ffd8ffe1.{4}457869660000/,/^ffd8ffe0/,/^89504e470d0a1a0a/];function isImageBuffer(buf){if(buf.length<MIN_IMAGE_BYTES)return!1;let hex=buf.subarray(0,MIN_IMAGE_BYTES).toString("hex");return IMAGE_SIGNATURES.some(re=>re.test(hex))}async function prepareConnexIcon(filePath,cwd){let absPath=resolve(cwd,filePath),size;try{size=(await stat(absPath)).size}catch(err){throw new Error(`Could not read icon file at "${filePath}": ${err.message}`)}if(size>MAX_ICON_BYTES)throw new Error(`Icon file at "${filePath}" is ${size} bytes; maximum is ${MAX_ICON_BYTES} bytes (5 MB).`);let buf;try{buf=await readFile(absPath)}catch(err){throw new Error(`Could not read icon file at "${filePath}": ${err.message}`)}if(!isImageBuffer(buf))throw new Error(`Icon file at "${filePath}" is not a PNG or JPEG.`);let sha=createHash2("sha1").update(new Uint8Array(buf)).digest("hex");return{buf,sha}}async function uploadConnexIcon(client,prepared){try{await client.fetch("/v2/files",{method:"POST",json:!1,body:prepared.buf,headers:{"Content-Type":"application/octet-stream","Content-Length":String(prepared.buf.byteLength),"x-now-digest":prepared.sha,"x-now-size":String(prepared.buf.byteLength)}})}catch(err){let e=err;throw new Error(`Failed to upload icon: ${e.serverMessage??e.message}`)}return prepared.sha}var import_chalk3=__toESM(require_source(),1);var CONNEX_REDIRECT_URI="https://connect.vercel.com/callback",ConnexMethodError=class extends Error{},ENDPOINT_IDENTITY_KEYS=new Set(["serverConfig","serverUrl","discoveryServerUrl"]),SECRET_KEY_PATTERN=/secret|password|passwd|token|api[-_]?key|private[-_]?key|credential/i,CHOICE_INDENT=" ";async function fetchConnexServiceInfo(client,service,opts={}){try{return await client.fetch(`/v1/connect/services/${encodeURIComponent(service)}?schemas=true`,opts)}catch(err){if(err.status===404)return;throw err}}function parseConnexParams(values){let params={},warnings=[];for(let raw of values??[]){let separator=raw.indexOf("=");if(separator<=0)throw new ConnexMethodError(`Invalid --param "${raw}". Use --param KEY=VALUE.`);let key=raw.slice(0,separator).trim(),value=raw.slice(separator+1);if(!key)throw new ConnexMethodError(`Invalid --param "${raw}". Use --param KEY=VALUE.`);key in params&&warnings.push(`--param ${key} was passed more than once. Using the last value.`),params[key]=value}return{params,warnings}}function formatMethodOptions(methods){return methods.map(method=>`${method.connectionMethod} (${method.label})`).join(", ")}function formatTargetOptions(targets){return targets.map(target=>`${target.target} (${target.label})`).join(", ")}function createPathBadge(method){if(method.create.managed===!0)return"automatic registration";if(method.create.manual)return"bring your own credentials"}function soleTargetOf(method){return method.targets?.length===1?method.targets[0]:void 0}function renderConnexMarkdown(markdown){return markdown.replace(/\[([^\]]+)\]\(([^)\s]+)\)/g,(_match,text2,url)=>linksToSameTarget(text2,url)?output_manager_default.link(text2,url,{fallback:()=>import_chalk3.default.cyan(url)}):output_manager_default.link(text2,url)).replace(/\*\*([^*]+)\*\*/g,(_match,text2)=>import_chalk3.default.bold(text2))}function connexMarkdownToPlainText(markdown){return markdown.replace(/\[([^\]]+)\]\(([^)\s]+)\)/g,(_match,text2,url)=>linksToSameTarget(text2,url)?url:`${text2} (${url})`).replace(/\*\*([^*]+)\*\*/g,"$1")}function linksToSameTarget(text2,url){let normalize=value=>value.trim().replace(/^https?:\/\//,"").replace(/\/+$/,"").toLowerCase();return normalize(text2)===normalize(url)}function buildMethodGuidance(method,serviceName){let lines=[];if(method.type.type!=="api-key"){let registerUrl=method.settingsUrl??method.docUrl;lines.push(registerUrl?`Register an OAuth app for ${serviceName} at ${import_chalk3.default.cyan(registerUrl)} and copy its Client ID and Client Secret.`:`Register an OAuth app for ${serviceName} and copy its Client ID and Client Secret.`),lines.push(`Add ${import_chalk3.default.cyan(CONNEX_REDIRECT_URI)} as a redirect URI in that app.`),method.docUrl&&method.docUrl!==registerUrl&&lines.push(`Docs: ${import_chalk3.default.cyan(method.docUrl)}`)}return method.instructions&&lines.push(renderConnexMarkdown(method.instructions)),lines}function isSecretInputKey(method,key){let encrypted=method.type.encryptedFields;return encrypted&&encrypted.length>0?encrypted.includes(key):SECRET_KEY_PATTERN.test(key)}function needsCredentialPrompt(method,key,suppliedData){if(ENDPOINT_IDENTITY_KEYS.has(key)||suppliedData&&key in suppliedData)return!1;let defaults=method.type.createInputDefaults;return!(defaults&&key in defaults)}function describeCredentialFields(method){if(method.type.type==="oauth")return"clientId (required), clientSecret";if(method.type.type==="api-key")return'values: [{ "value": "<api key>" }]'}async function collectMethodCredentials(client,method,suppliedData,interactive,onFirstPrompt){let data={...suppliedData},announced=!1,announce=()=>{announced||(announced=!0,onFirstPrompt?.())};if(method.type.type==="oauth"){if(needsCredentialPrompt(method,"clientId",suppliedData)){if(!interactive)throw missingCredentialsError(method);announce(),data.clientId=await promptCredential(client,method,{key:"clientId",message:"Client ID",required:!0})}if(interactive&&needsCredentialPrompt(method,"clientSecret",suppliedData)){announce();let secret=await promptCredential(client,method,{key:"clientSecret",message:`Client Secret ${import_chalk3.default.dim("leave blank for a public client")}`,required:!1});secret&&(data.clientSecret=secret)}return data}if(method.type.type==="api-key"){if(data.values===void 0){if(!interactive)throw missingCredentialsError(method);announce();let value=await promptCredential(client,method,{key:"value",message:method.label,required:!0});data.values=[{value}]}return data}if(suppliedData===void 0){let schema=method.type.createInputSchema,hint=schema?`
|
|
16
|
+
|
|
17
|
+
Expected --data schema for connection method "${method.connectionMethod}":
|
|
18
|
+
${JSON.stringify(schema,null,2)}`:"";throw new ConnexMethodError(`Connection method "${method.connectionMethod}" needs credentials passed with --data. Pass --data @<path> to read from a file.${hint}`)}return data}async function promptCredential(client,method,opts){let validate=opts.required?value=>value.trim().length>0||`${opts.key} is required.`:void 0;return(isSecretInputKey(method,opts.key)?await client.input.password({message:opts.message,mask:!0,validate}):await client.input.text({message:opts.message,validate})).trim()}function missingCredentialsError(method){let fields=describeCredentialFields(method),withFields=fields?` with: ${fields}`:"";return new ConnexMethodError(`Missing credentials. Provide --data${withFields}. Pass --data @<path> to read from a file.`)}async function resolveConnexConnectionMethod(client,opts){let{methods,targets,connectionMethodFlag,targetFlag}=opts;if(methods.length===0)throw new ConnexMethodError(`"${opts.service}" doesn't publish connection methods.`);let explicitTarget=targetFlag?validateTarget(targetFlag,targets,opts.service):void 0;if(connectionMethodFlag){let method2=methods.find(candidate=>candidate.connectionMethod===connectionMethodFlag);if(!method2)throw new ConnexMethodError(`Unknown connection method "${connectionMethodFlag}" for "${opts.service}". Available: ${formatMethodOptions(methods)}.`);if(explicitTarget&&!servesTarget(method2,explicitTarget))throw new ConnexMethodError(`Connection method "${method2.connectionMethod}" doesn't connect to target "${explicitTarget}".`);return{method:method2,target:explicitTarget??soleTargetOf(method2)}}if(opts.resolvedConnectionMethod){let method2=methods.find(candidate=>candidate.connectionMethod===opts.resolvedConnectionMethod);if(method2&&(!explicitTarget||servesTarget(method2,explicitTarget)))return opts.interactive&&!opts.skipConfirm&&await confirmMethodSelection(client,opts.serviceName,method2),{method:method2,target:explicitTarget??soleTargetOf(method2)}}let width=choiceWidth(client),chosenTarget=explicitTarget;!chosenTarget&&targets&&targets.length>1&&opts.interactive&&(printOptionCatalog(`${opts.serviceName} products:`,targets.map(target2=>({label:target2.label,description:target2.description,docsUrl:target2.docsUrl})),width),chosenTarget=await client.input.select({message:"What do you want to connect to?",choices:targets.map(target2=>({name:choiceLabel(target2.label,width),value:target2.target}))}));let candidates=chosenTarget?methods.filter(method2=>servesTarget(method2,chosenTarget)):methods;if(candidates.length===0)throw new ConnexMethodError(`No connection method for "${opts.service}" connects to target "${chosenTarget}".`);if(candidates.length>1){if(!opts.interactive)throw new ConnexMethodError(`Missing --connection-method. "${opts.service}" supports: ${formatMethodOptions(candidates)}. Re-run with --connection-method <value>.`);printOptionCatalog(`Connection methods for ${opts.serviceName}:`,candidates.map(method3=>({label:method3.label,badge:createPathBadge(method3),description:method3.description,docsUrl:method3.docUrl})),width);let slug=await client.input.select({message:`How do you want to connect to ${opts.serviceName}?`,choices:candidates.map(method3=>({name:choiceLabel(method3.label,width),value:method3.connectionMethod}))}),method2=candidates.find(candidate=>candidate.connectionMethod===slug);if(!method2)throw new ConnexMethodError(`Unknown connection method "${slug}".`);return{method:method2,target:chosenTarget??soleTargetOf(method2)}}let method=candidates[0],target=chosenTarget??soleTargetOf(method);return opts.interactive&&!opts.skipConfirm&&await confirmMethodSelection(client,opts.serviceName,method),{method,target}}async function confirmMethodSelection(client,serviceName,method){let badge=createPathBadge(method),suffix=badge?` (${badge})`:"";if(!await client.input.confirm(`Connect to ${serviceName} with ${method.label}${suffix}?`,!0))throw new ConnexMethodError("Canceled.")}async function collectTemplateParams(client,method,suppliedParams,interactive){let fields=method.templateFields??[];if(fields.length===0){if(Object.keys(suppliedParams).length>0)throw new ConnexMethodError(`Connection method "${method.connectionMethod}" takes no --param values.`);return{}}let known=new Set(fields.map(field=>field.key));for(let key of Object.keys(suppliedParams))if(!known.has(key))throw new ConnexMethodError(`Unknown --param "${key}" for connection method "${method.connectionMethod}". Valid keys: ${fields.map(field=>field.key).join(", ")}.`);let params={};for(let field of fields){let supplied=(suppliedParams[field.key]??"").trim();if(supplied){let problem=templateValueProblem(field,supplied);if(problem)throw new ConnexMethodError(`Invalid --param ${field.key}="${supplied}". ${problem}`);params[field.key]=supplied;continue}if(interactive){let answer=await client.input.text({message:promptMessage(field),default:field.default,validate:value=>{let trimmed=value.trim();return trimmed?templateValueProblem(field,trimmed)??!0:`${field.label} is required.`}});params[field.key]=answer.trim();continue}if(field.default!==void 0){params[field.key]=field.default;continue}throw new ConnexMethodError(`Missing --param ${field.key}=<value> (${describeField(field)}) for connection method "${method.connectionMethod}".`)}return params}function promptMessage(field){let hints=[];return field.placeholder&&hints.push(`e.g. ${field.placeholder}`),field.help&&hints.push(field.help),hints.length>0?`${field.label} ${import_chalk3.default.dim(hints.join(" \xB7 "))}`:field.label}function describeField(field){return field.placeholder?`"${field.label}", e.g. ${field.placeholder}`:`"${field.label}"`}var HOSTNAME_RE=/^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]*[a-z0-9])?)+$/i;function templateValueProblem(field,value){let sample=field.default??field.placeholder;if(!(!sample||!HOSTNAME_RE.test(sample)||HOSTNAME_RE.test(value)))return`Enter a hostname like ${sample}, without the https:// prefix.`}function printOptionCatalog(heading,entries,width){if(entries.some(entry=>entry.description||entry.docsUrl)){output_manager_default.print(`
|
|
19
|
+
${import_chalk3.default.dim(heading)}
|
|
20
|
+
|
|
21
|
+
`);for(let entry of entries){let badge=entry.badge?import_chalk3.default.dim(` \u2014 ${entry.badge}`):"";if(output_manager_default.print(` ${import_chalk3.default.bold(entry.label)}${badge}
|
|
22
|
+
`),entry.description)for(let line of wrapPlain(entry.description,width-6))output_manager_default.print(` ${import_chalk3.default.dim(line)}
|
|
23
|
+
`);entry.docsUrl&&output_manager_default.print(` ${import_chalk3.default.dim(`Docs: ${entry.docsUrl}`)}
|
|
24
|
+
`),output_manager_default.print(`
|
|
25
|
+
`)}}}function choiceLabel(label,width){let max=Math.max(24,width-CHOICE_INDENT.length-1);return label.length>max?`${label.slice(0,max-1)}\u2026`:label}function choiceWidth(client){return Math.max(40,Math.min(client.stderr.columns||80,100))}function wrapPlain(text2,width){let words=text2.split(/\s+/).filter(Boolean),lines=[],line="";for(let word of words)line?line.length+1+word.length<=width?line+=` ${word}`:(lines.push(line),line=word):line=word;return line&&lines.push(line),lines}function servesTarget(method,target){return method.targets===void 0||method.targets.includes(target)}function validateTarget(target,targets,service){if(!targets||targets.length===0)throw new ConnexMethodError(`"${service}" doesn't publish targets, so --target can't be used.`);if(!targets.some(candidate=>candidate.target===target))throw new ConnexMethodError(`Unknown target "${target}". Available: ${formatTargetOptions(targets)}.`);return target}async function create(client,args,flags){let formatResult=validateJsonOutput(flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput,service=args[0];if(!service)return output_manager_default.error("Missing service. Usage: vercel connect create <service>"),2;let branchError=applyDeprecatedGitBranchFlag(client,flags,"--trigger-branch");if(branchError)return reportRenamedOptionError(client,branchError,{json:asJson});if(flags["--trigger-event"]&&!flags["--triggers"])return output_manager_default.error("The --trigger-event flag requires --triggers."),2;let triggerPath=flags["--trigger-path"],triggerProject=flags["--trigger-project"],triggerBranch=flags["--git-branch"],triggerEnvironment=flags["--trigger-environment"];if(!flags["--triggers"]&&(triggerPath!==void 0||triggerProject!==void 0||triggerBranch!==void 0||triggerEnvironment!==void 0))return output_manager_default.error("The --trigger-project, --trigger-path, --git-branch, and --trigger-environment flags require --triggers."),1;if(triggerBranch!==void 0&&triggerEnvironment!==void 0)return output_manager_default.error("The --git-branch and --trigger-environment flags are mutually exclusive."),2;if(triggerProject!==void 0&&triggerProject.trim()==="")return output_manager_default.error("The --trigger-project value must not be empty."),1;if(triggerPath!==void 0&&(triggerPath.length===0||triggerPath.length>2048))return output_manager_default.error("The --trigger-path value must be between 1 and 2048 characters."),2;if(triggerBranch!==void 0&&triggerBranch.trim()==="")return output_manager_default.error("The --git-branch value must not be empty."),1;if(triggerEnvironment!==void 0&&triggerEnvironment.trim()==="")return output_manager_default.error("The --trigger-environment value must not be empty."),1;let dataFlag=flags["--data"],connectorType=flags["--connector-type"],connectionMethodFlag=flags["--connection-method"],targetFlag=flags["--target"];if(connectorType&&dataFlag===void 0)return output_manager_default.error("The --connector-type flag requires --data."),2;if(connectorType&&connectionMethodFlag)return output_manager_default.error("The --connector-type and --connection-method flags cannot be combined. The connection method decides the connector type."),1;let hasDataFlag=dataFlag!==void 0,isDataOnlyCreate=hasDataFlag&&!connectionMethodFlag,suppliedParams={};try{let parsed=parseConnexParams(flags["--param"]);suppliedParams=parsed.params;for(let warning of parsed.warnings)output_manager_default.warn(warning)}catch(err){return output_manager_default.error(err.message),1}if(isDataOnlyCreate&&Object.keys(suppliedParams).length>0)return output_manager_default.error("The --param flag requires --connection-method."),2;if(isDataOnlyCreate&&targetFlag)return output_manager_default.error("The --target flag requires --connection-method."),2;let suppliedData,isDataFlagEmpty=!1;if(dataFlag!==void 0)try{let rawData=await resolveDataFlag(dataFlag,client);rawData.trim().length===0?isDataFlagEmpty=!0:(suppliedData=parseDataFlag(rawData),dataFlag.startsWith("@")||warnInlineSecret(suppliedData))}catch(err){return output_manager_default.error(err.message),1}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}let preparedIcon;if(iconFlag)try{preparedIcon=await prepareConnexIcon(iconFlag,client.cwd)}catch(err){return output_manager_default.error(err.message),1}await selectConnexTeam(client,"Select the team where you want to create this connector");let link=await getProjectLink(client,client.cwd),triggerProjectId;if(triggerProject!==void 0){output_manager_default.spinner("Looking up trigger destination project\u2026");try{let resolvedProject=await getProjectByNameOrId(client,triggerProject,client.config.currentTeam);if(output_manager_default.stopSpinner(),resolvedProject instanceof ProjectNotFound)return output_manager_default.error(`Trigger destination project ${triggerProject} was not found. Check the name/ID and try again.`),1;triggerProjectId=resolvedProject.id}catch(err){return output_manager_default.stopSpinner(),printError(err,client),1}}let destinationProjectId=triggerProjectId??link?.projectId;if((triggerPath!==void 0||triggerProject!==void 0||triggerBranch!==void 0||triggerEnvironment!==void 0)&&!destinationProjectId)return output_manager_default.error("Trigger destination flags require a linked project. Run `vercel link` first."),1;let customEnvironmentId;if(triggerEnvironment!==void 0&&destinationProjectId)try{let customEnvironments=await getCustomEnvironments(client,destinationProjectId),customEnvironment=pickCustomEnvironment(customEnvironments,triggerEnvironment);if(!customEnvironment)return output_manager_default.error(`Unknown trigger environment ${triggerEnvironment} for project ${destinationProjectId}. Use a custom environment slug or stable ID from that project.`),1;customEnvironmentId=customEnvironment.id}catch(err){return printError(err,client),1}if(isDataFlagEmpty&&isDataOnlyCreate)return await outputMissingDataError(client,service,connectorType);let interactive=!!client.stdin.isTTY&&!client.nonInteractive,name=flags["--name"];if(!name){if(!interactive)return output_manager_default.error("Missing required flag --name. In non-interactive mode, provide --name for the connector."),2;name=await client.input.text({message:`What would you like to name your ${service} app?`,validate:val=>val.trim().length>0||"Name cannot be empty"})}let selection,serviceName=service;if(!isDataOnlyCreate){let serviceInfo;try{output_manager_default.spinner("Loading connection methods\u2026"),serviceInfo=await fetchConnexServiceInfo(client,service)}catch(err){if(connectionMethodFlag)return output_manager_default.stopSpinner(),printError(err,client),1;output_manager_default.debug(`Failed to load connection methods: ${err.message}`)}finally{output_manager_default.stopSpinner()}serviceName=serviceInfo?.name??service;let methods=serviceInfo?.connectionMethods??[];if(methods.length===0){let unusable=connectionMethodFlag?"--connection-method":targetFlag?"--target":Object.keys(suppliedParams).length>0?"--param":void 0;if(unusable)return output_manager_default.error(`"${service}" doesn't publish connection methods, so ${unusable} can't be used.`),1}else try{selection=await resolveConnexConnectionMethod(client,{service,serviceName,methods,targets:serviceInfo?.targets,connectionMethodFlag,targetFlag,resolvedConnectionMethod:serviceInfo?.resolvedConnectionMethod,interactive,skipConfirm:flags["--yes"]===!0})}catch(err){if(err instanceof ConnexMethodError)return output_manager_default.error(err.message),1;throw err}}let useManagedMethodCreate=selection!==void 0&&selection.method.create.managed===!0&&!hasDataFlag,useManualMethodCreate=selection!==void 0&&!useManagedMethodCreate,methodParams={},methodData={};if(useManualMethodCreate&&selection)try{let{method}=selection;methodParams=await collectTemplateParams(client,method,suppliedParams,interactive),methodData=await collectMethodCredentials(client,method,suppliedData,interactive,()=>printMethodGuidance(method,serviceName))}catch(err){if(err instanceof ConnexMethodError)return output_manager_default.error(err.message),1;throw err}else if(useManagedMethodCreate&&Object.keys(suppliedParams).length>0&&selection)return output_manager_default.error(`Connection method "${selection.method.connectionMethod}" is registered automatically and takes no --param values.`),1;let iconSha;if(preparedIcon){try{output_manager_default.spinner("Uploading icon\u2026"),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={service,name};link?.projectId&&(body.projectId=link.projectId),body.triggers={enabled:flags["--triggers"]===!0},flags["--trigger-event"]!==void 0&&(body.events=flags["--trigger-event"]),(triggerPath!==void 0||triggerProject!==void 0||triggerBranch!==void 0||triggerEnvironment!==void 0)&&(body.triggerDestination={...triggerProjectId!==void 0?{projectId:triggerProjectId}:{},...triggerPath!==void 0?{path:triggerPath}:{},...triggerBranch!==void 0?{branch:triggerBranch}:{},...customEnvironmentId!==void 0?{customEnvironmentId}:{}}),iconSha&&(body.icon=iconSha),backgroundColor&&(body.backgroundColor=backgroundColor),accentColor&&(body.accentColor=accentColor),selection&&(body.connectionMethod=selection.method.connectionMethod,selection.target!==void 0&&(body.target=selection.target)),output_manager_default.spinner("Setting up\u2026");let createdClient=null,browserUrl,verifier;if(useManualMethodCreate){Object.keys(methodParams).length>0&&(body.params=methodParams),body.data=methodData;try{createdClient=await client.fetch("/v1/connect/connectors",{method:"POST",body})}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)}}else if(isDataOnlyCreate)try{let serviceInfo=connectorType===void 0||connectorType==="oauth"?await fetchConnexServiceInfo(client,service):void 0,resolvedConnectorType=connectorType??defaultConnectorType(serviceInfo)??"oauth";body.data=withDiscoveredServerUrl(suppliedData,resolvedConnectorType,serviceInfo),body.type=resolvedConnectorType,createdClient=await client.fetch("/v1/connect/connectors",{method:"POST",body})}catch(err){return err.status===404?(output_manager_default.stopSpinner(),output_manager_default.error("Connect is not enabled for this team. Contact support to enable it."),1):(output_manager_default.stopSpinner(),printError(err,client),1)}else{let request=generateRequestCode();verifier=request.verifier,body.request_code=request.requestCode;try{createdClient=await client.fetch("/v1/connect/connectors/managed?autoinstall=true",{method:"POST",body})}catch(err){let apiErr=err;if(apiErr.status===422&&apiErr.registerUrl)browserUrl=apiErr.registerUrl;else return apiErr.status===404?(output_manager_default.stopSpinner(),output_manager_default.error("Connect is not enabled for this team. Contact support to enable it."),1):(output_manager_default.stopSpinner(),printError(err,client),1)}}output_manager_default.stopSpinner();let hasBeenInstalled=!1,brandingPatchFailed=!1;if(browserUrl){let urlWithBranding=new URL(browserUrl);iconSha&&urlWithBranding.searchParams.set("icon",iconSha),backgroundColor&&urlWithBranding.searchParams.set("backgroundColor",backgroundColor),accentColor&&urlWithBranding.searchParams.set("accentColor",accentColor);let finalBrowserUrl=urlWithBranding.toString();if(output_manager_default.log(`Opening browser for ${service} app setup\u2026`),output_manager_default.log(`If the browser doesn't open, visit:
|
|
26
|
+
${finalBrowserUrl}`),(0,import_open.default)(finalBrowserUrl).catch(err=>output_manager_default.debug(`Failed to open browser: ${err}`)),output_manager_default.spinner("Waiting for you to complete setup in the browser\u2026"),!verifier)return output_manager_default.stopSpinner(),output_manager_default.error("Missing browser setup verifier."),1;let resultFromBrowser=await awaitConnexResult(client,verifier);if(output_manager_default.stopSpinner(),resultFromBrowser&&"clientId"in resultFromBrowser&&typeof resultFromBrowser.clientId=="string"){let clientId=resultFromBrowser.clientId;if(createdClient=await client.fetch(`/v1/connect/connectors/${encodeURIComponent(clientId)}`),!!(iconSha||backgroundColor||accentColor)){let brandingBody={};iconSha&&(brandingBody.icon=iconSha),backgroundColor&&(brandingBody.backgroundColor=backgroundColor),accentColor&&(brandingBody.accentColor=accentColor);try{output_manager_default.spinner("Applying branding\u2026"),createdClient=await client.fetch(`/v1/connect/connectors/${encodeURIComponent(clientId)}`,{method:"PATCH",body:brandingBody})}catch(err){output_manager_default.stopSpinner(),output_manager_default.warn(`Failed to apply branding: ${err.message}. The connector was created but branding was not applied.`),brandingPatchFailed=!0}output_manager_default.stopSpinner()}}resultFromBrowser&&"installationId"in resultFromBrowser&&resultFromBrowser.installationId&&(hasBeenInstalled=!0)}if(!createdClient)return 1;if(asJson)client.stdout.write(`${JSON.stringify({id:createdClient.id,uid:createdClient.uid,type:createdClient.type,name:createdClient.name,supportedSubjectTypes:createdClient.supportedSubjectTypes,icon:createdClient.icon??null,backgroundColor:createdClient.backgroundColor??null,accentColor:createdClient.accentColor??null,service:createdClient.service??null,connectionMethod:createdClient.connectionMethod??null,target:createdClient.target??null},null,2)}
|
|
27
|
+
`);else{let via=selection?` via ${selection.method.label}`:"",created=hasBeenInstalled?`${service} connector created and installed${via}`:`${service} connector created${via}`;output_manager_default.success(`${created}: ${createdClient.id} (UID ${createdClient.uid})`)}return brandingPatchFailed?1:0}function printMethodGuidance(method,serviceName){let lines=buildMethodGuidance(method,serviceName);if(lines.length!==0){output_manager_default.print(`
|
|
28
|
+
`);for(let line of lines)output_manager_default.print(` ${line}
|
|
29
|
+
`);output_manager_default.print(`
|
|
30
|
+
`)}}async function readStdinToEnd(stdin){return stdin.isTTY?"":text(stdin)}async function resolveDataFlag(raw,client){if(!raw.startsWith("@"))return raw;let source=raw.slice(1);if(source==="-")return readStdinToEnd(client.stdin);if(source.length===0)throw new Error("Invalid --data value. Use `@<path>` to read from a file or `@-` to read from stdin.");try{return await readFile2(resolve2(client.cwd,source),"utf8")}catch(err){throw new Error(`Could not read --data file at "${source}": ${err.message}`)}}var SECRET_KEY_PATTERN2=/secret|password|passwd|token|api[-_]?key|private[-_]?key|credential/i;function warnInlineSecret(data){let secretKey=Object.keys(data).find(key=>SECRET_KEY_PATTERN2.test(key));secretKey&&output_manager_default.warn(`--data was passed inline and appears to contain a credential ("${secretKey}"). Inline flag values leak into shell history and process listings. Pass \`--data @<path>\` to read from a file or \`--data @-\` to read from stdin instead.`)}function parseDataFlag(raw){let parsed;try{parsed=JSON.parse(raw)}catch{throw new Error("Invalid JSON for --data. Expected a JSON object.")}if(parsed===null||typeof parsed!="object"||Array.isArray(parsed))throw new Error("The --data value must be a JSON object.");return parsed}function withDiscoveredServerUrl(data,connectorType,serviceInfo){let serverUrl=serviceInfo?.discovery?.serverUrl;return!data||connectorType!=="oauth"||!serverUrl||data.serverUrl!==void 0?data:{serverUrl,...data}}async function outputMissingDataError(client,service,inputConnectorType){let{connectorType,createInputSchema}=await resolveMissingDataSchemaInfo(client,service,inputConnectorType),message="--data requires a non-empty JSON object.";return createInputSchema&&(message+=`
|
|
31
|
+
|
|
32
|
+
Expected --data schema for connector type "${connectorType}":
|
|
33
|
+
${JSON.stringify(createInputSchema,null,2)}`),output_manager_default.error(message),1}async function resolveMissingDataSchemaInfo(client,service,inputConnectorType){let serviceInfo=await fetchConnexServiceInfo(client,service),connectorType=inputConnectorType??defaultConnectorType(serviceInfo)??"oauth";return serviceInfo||(serviceInfo=await fetchConnexServiceInfo(client,inputConnectorType||"oauth")),{connectorType,createInputSchema:createInputSchemaForType(serviceInfo,connectorType)}}function defaultConnectorType(serviceInfo){let discoveredType=serviceInfo?.discovery?.type.type??serviceInfo?.types?.[0]?.type;if(typeof discoveredType=="string"&&discoveredType.length>0)return discoveredType}function createInputSchemaForType(serviceInfo,connectorType){let discoveryType=serviceInfo?.discovery?.type;return discoveryType?.type===connectorType?discoveryType.createInputSchema:serviceInfo?.types?.find(typeInfo=>typeInfo.type===connectorType)?.createInputSchema}var import_chalk4=__toESM(require_source(),1);var COMMAND="connect create";async function printCreateDynamicHelp(client,service,baseCommand,printHelp){if(!service)return!1;let serviceInfo;try{serviceInfo=await fetchConnexServiceInfo(client,service)}catch(err){output_manager_default.debug(`Failed to fetch service info for dynamic help: ${err}`);try{serviceInfo=await fetchConnexServiceInfo(client,service,{useCurrentTeam:!1})}catch(retryErr){return output_manager_default.debug(`Failed to fetch service info without a team: ${retryErr}`),!1}}let methods=serviceInfo?.connectionMethods??[];if(methods.length===0)return!1;let serviceName=serviceInfo?.name??service,targets=serviceInfo?.targets??[],width=Math.max(40,Math.min(client.stderr.columns||80,100));printHelp({...baseCommand,options:[],disabledGlobalOptions:globalCommandOptions.map(option=>option.name),examples:[]},{omitDocumentation:!0}),targets.length>1&&client.stdout.write(formatTargets(serviceName,targets,width)),client.stdout.write(formatMethods(serviceName,methods,targets,width)),client.stdout.write(formatExamples(service,methods));let documentationLines=buildCommandDocumentationLines(connexCommand,{columns:width});return documentationLines&&client.stdout.write(`
|
|
34
|
+
${documentationLines}`),!0}function formatTargets(serviceName,targets,width){let lines=["",` ${import_chalk4.default.dim(`${serviceName} products:`)}`,""];for(let target of targets){lines.push(` ${import_chalk4.default.bold(target.target)} ${target.label}`);for(let line of describeLines(target.description,target.docsUrl,width))lines.push(line);lines.push("")}return lines.join(`
|
|
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
|
+
`)}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
|
+
`)}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),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
|
+
`),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(`--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
|
+
`):client.stdout.write(`${data.token}
|
|
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
|
+
`),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)}
|
|
46
|
+
`),0):(shouldAttach&&output_manager_default.success(`Attached connector ${import_chalk8.default.bold(displayName)} to ${import_chalk8.default.bold(projectName)} for environments: ${attachmentEnvironments.join(", ")}.`),shouldRegisterTrigger&&desiredDestination&&output_manager_default.success(`Registered ${import_chalk8.default.bold(projectName)} as a trigger destination (${formatDestination(desiredDestination)}).`),0)}var import_chalk9=__toESM(require_source(),1);async function detach(client,args,flags){let formatResult=validateJsonOutput(flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput,skipConfirmation=!!flags["--yes"];if(asJson&&!skipConfirmation)return output_manager_default.error("--json requires --yes to skip confirmation prompts"),2;let clientIdOrUid=args[0];if(!clientIdOrUid)return output_manager_default.error("Missing connector ID or UID. Usage: vercel connect detach <connector>"),2;let 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_chalk9.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)}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_chalk9.default.bold(clientIdOrUid)}.`),1):(printError(err,client),1)}output_manager_default.stopSpinner();let displayName=sanitizeForTerminal(target.uid||target.name||target.id),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}if(!existingAttachment)return asJson?(client.stdout.write(`${JSON.stringify({clientId:target.id,uid:target.uid,projectId,unchanged:!0},null,2)}
|
|
47
|
+
`),0):(output_manager_default.log(`Connector ${import_chalk9.default.bold(displayName)} is not attached to ${import_chalk9.default.bold(projectName)}. 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){let envs=(existingAttachment.environments??[]).join(", ")||"\u2014";if(output_manager_default.log(`Connector ${import_chalk9.default.bold(displayName)} will be detached from ${import_chalk9.default.bold(projectName)}.`),output_manager_default.log(` Environments: ${envs}`),!await client.input.confirm("Continue?",!1))return output_manager_default.log("Canceled"),0}output_manager_default.spinner("Detaching project\u2026");try{await client.fetch(`/v1/connect/connectors/${encodeURIComponent(target.id)}/projects/${encodeURIComponent(projectId)}`,{method:"DELETE"})}catch(err){output_manager_default.stopSpinner();let status2=err.status;return status2===403?(output_manager_default.error("You don't have permission to detach projects on this team. Owner or Member role required."),1):status2===404?asJson?(client.stdout.write(`${JSON.stringify({clientId:target.id,uid:target.uid,projectId,unchanged:!0},null,2)}
|
|
48
|
+
`),0):(output_manager_default.log(`Connector ${import_chalk9.default.bold(displayName)} is not attached to ${import_chalk9.default.bold(projectName)}. Nothing to do.`),0):(printError(err,client),1)}return output_manager_default.stopSpinner(),asJson?(client.stdout.write(`${JSON.stringify({clientId:target.id,uid:target.uid,projectId,detached:!0},null,2)}
|
|
49
|
+
`),0):(output_manager_default.success(`Detached connector ${import_chalk9.default.bold(displayName)} from ${import_chalk9.default.bold(projectName)}.`),0)}var import_chalk10=__toESM(require_source(),1);async function remove(client,args,flags){let formatResult=validateJsonOutput(flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput,skipConfirmation=!!flags["--yes"],disconnectAll=!!flags["--disconnect-all"];if(asJson&&!skipConfirmation)return output_manager_default.error("--json requires --yes to skip confirmation prompts"),2;let clientIdOrUid=args[0];if(!clientIdOrUid)return output_manager_default.error("Missing connector ID or UID. Usage: vercel connect delete <connector>"),2;await selectConnexTeam(client,"Select the team for this connector"),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_chalk10.default.bold(clientIdOrUid)}.`),1):(output_manager_default.error(`Failed to look up ${import_chalk10.default.bold(clientIdOrUid)}: ${err.message}`),1)}output_manager_default.stopSpinner();let displayName=sanitizeForTerminal(target.uid||target.id),projectLinks;try{output_manager_default.spinner("Checking connected projects\u2026"),projectLinks=(await client.fetch(`/v1/connect/connectors/${encodeURIComponent(target.id)}/projects`)).projects??[]}catch(err){return output_manager_default.stopSpinner(),output_manager_default.error(`Failed to list connected projects for ${import_chalk10.default.bold(displayName)}: ${err.message}`),1}if(output_manager_default.stopSpinner(),projectLinks.length>0&&!disconnectAll){let count=projectLinks.length,plural=count===1?"project":"projects";return output_manager_default.error(`Cannot delete connector ${import_chalk10.default.bold(displayName)} while it has ${count} connected ${plural}. Please disconnect any projects using this connector first or use the \`--disconnect-all\` flag.`),1}if(!skipConfirmation&&!client.stdin.isTTY)return output_manager_default.error("Confirmation required. Use `--yes` to skip the confirmation prompt."),1;if(!skipConfirmation){let cascadeNote=projectLinks.length>0?` ${projectLinks.length} connected ${projectLinks.length===1?"project":"projects"} will be disconnected.`:"";if(output_manager_default.log(`Connector ${import_chalk10.default.bold(displayName)} will be deleted permanently.${cascadeNote}`),!await client.input.confirm(`${import_chalk10.default.red("Are you sure?")}`,!1))return output_manager_default.log("Canceled"),0}try{output_manager_default.spinner("Deleting connector\u2026"),await client.fetch(`/v1/connect/connectors/${encodeURIComponent(target.id)}`,{method:"DELETE"})}catch(err){return output_manager_default.stopSpinner(),output_manager_default.error(`A problem occurred when attempting to delete ${import_chalk10.default.bold(displayName)}: ${err.message}`),1}return output_manager_default.stopSpinner(),asJson?(client.stdout.write(`${JSON.stringify({id:target.id,uid:target.uid,removed:!0},null,2)}
|
|
50
|
+
`),0):(output_manager_default.success(`Connector ${import_chalk10.default.bold(displayName)} successfully deleted.`),0)}var import_chalk11=__toESM(require_source(),1);async function revokeTokens(client,args,flags){let formatResult=validateJsonOutput(flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput;if(asJson&&!flags["--yes"])return output_manager_default.error("--json requires --yes to skip confirmation prompts"),2;let clientIdOrUid=args[0];if(!clientIdOrUid)return output_manager_default.error("Missing connector ID or UID. Usage: vercel connect revoke-tokens <connector>"),2;let myTokens=!!flags["--my-tokens"],allTokens=!!flags["--all-tokens"];if(myTokens&&allTokens)return output_manager_default.error("--my-tokens and --all-tokens are mutually exclusive."),2;if(flags["--yes"]&&!myTokens&&!allTokens)return output_manager_default.error("--yes requires a scope flag. Use --yes --my-tokens or --yes --all-tokens."),1;await selectConnexTeam(client,"Select the team for this connector"),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_chalk11.default.bold(clientIdOrUid)}.`),1):(output_manager_default.error(`Failed to look up ${import_chalk11.default.bold(clientIdOrUid)}: ${err.message}`),1)}output_manager_default.stopSpinner();let displayName=sanitizeForTerminal(target.name||target.uid||target.id),supportsRevocation=target.supportsRevocation!==!1,subjectScope;if(myTokens)subjectScope="mine";else if(allTokens)subjectScope="all";else if(client.stdin.isTTY)subjectScope=await client.input.select({message:"Which tokens do you want to revoke?",choices:[{name:`My tokens \u2014 revoke only your own tokens for ${displayName}`,value:"mine"},{name:"All tokens \u2014 revoke every token for all users and installations",value:"all"}]});else return output_manager_default.error("Scope required. Use --my-tokens to revoke your tokens or --all-tokens to revoke all tokens."),1;if(!flags["--yes"]){if(!client.stdin.isTTY)return output_manager_default.error("Confirmation required. Use `--yes` to skip the confirmation prompt."),1;if(subjectScope==="mine"?output_manager_default.log(`Tokens issued from ${import_chalk11.default.bold(displayName)} for your account will stop working. You'll need to re-authorize to use this connector again.`):output_manager_default.log(`Every token issued from ${import_chalk11.default.bold(displayName)} will stop working. Anyone using this connector will need to re-authorize.`),supportsRevocation||output_manager_default.warn(`${import_chalk11.default.bold(displayName)} does not support provider-side token revocation. Tokens will be removed from Vercel Connect but may remain valid at the provider until they expire.`),!await client.input.confirm(`${import_chalk11.default.red("Are you sure?")}`,!1))return output_manager_default.log("Canceled"),0}let body=subjectScope==="mine"?{subject:{type:"user",id:client.authConfig.userId}}:{};output_manager_default.spinner("Revoking tokens\u2026");let result;try{result=await client.fetch(`/v1/connect/connectors/${encodeURIComponent(target.id)}/tokens`,{method:"DELETE",body:JSON.stringify(body),headers:{"Content-Type":"application/json"}})}catch(err){return output_manager_default.stopSpinner(),err.status===403?(output_manager_default.error(`You don't have permission to revoke tokens for ${import_chalk11.default.bold(displayName)}.`),1):(output_manager_default.error(`Failed to revoke tokens for ${import_chalk11.default.bold(displayName)}: ${err.message}`),1)}if(output_manager_default.stopSpinner(),asJson)return client.stdout.write(`${JSON.stringify({id:target.id,uid:target.uid,scope:subjectScope,supportsRevocation,tokensFound:result.tokensFound,deleted:result.deleted,providerRevoked:result.providerRevoked,providerSkipped:result.providerSkipped,providerFailed:result.providerFailed},null,2)}
|
|
51
|
+
`),0;let plural=result.deleted===1?"token":"tokens";return subjectScope==="mine"?output_manager_default.success(`Revoked your ${plural} from ${import_chalk11.default.bold(displayName)} (${result.deleted} ${plural} deleted).`):output_manager_default.success(`Revoked all ${plural} from ${import_chalk11.default.bold(displayName)} (${result.deleted} ${plural} deleted).`),supportsRevocation?result.providerFailed>0&&output_manager_default.warn(`${result.providerFailed} token(s) could not be revoked from the provider. They have been removed from Vercel Connect.`):output_manager_default.warn(`${import_chalk11.default.bold(displayName)} does not support provider-side token revocation. Tokens were removed from Vercel Connect but may remain valid at the provider until they expire.`),0}var import_chalk12=__toESM(require_source(),1),import_open3=__toESM(require_open(),1);async function openClient(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 open <id>"),2;await selectConnexTeam(client,"Select the team whose connector to open");let{team}=await getScope(client);if(!team)return output_manager_default.error("No team resolved. Run `vercel switch` or pass `--scope`."),1;output_manager_default.spinner("Looking up connector\u2026");let resolvedId;try{resolvedId=(await client.fetch(`/v1/connect/connectors/${encodeURIComponent(clientIdOrUid)}`)).id}catch(err){return output_manager_default.stopSpinner(),err.status===404?(output_manager_default.error(`Connector ${import_chalk12.default.bold(`"${clientIdOrUid}"`)} not found on team ${import_chalk12.default.bold(team.slug)}, or Connect is not enabled for this team.`),1):(printError(err),1)}output_manager_default.stopSpinner();let url=`https://vercel.com/${encodeURIComponent(team.slug)}/~/connect/${resolvedId}`;return asJson?(client.stdout.write(`${JSON.stringify({url},null,2)}
|
|
52
|
+
`),0):client.stdout.isTTY?(output_manager_default.print(`Opening connector ${import_chalk12.default.bold(clientIdOrUid)} in the dashboard\u2026
|
|
53
|
+
`),(0,import_open3.default)(url),0):(client.stdout.write(`${url}
|
|
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.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
|
+
${matches.map(m=>`- ${m.slug}: ${m.description}`).join(`
|
|
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
|
+
`),output_manager_default.log(`Installing ${import_chalk15.default.bold(integration.name)} requires accepting the following:`),output_manager_default.print(`
|
|
59
|
+
`);for(let{label,url}of documents)output_manager_default.print(` ${import_chalk15.default.bold(label)}
|
|
60
|
+
`),output_manager_default.print(` ${import_chalk15.default.dim(url)}
|
|
61
|
+
`),output_manager_default.print(`
|
|
62
|
+
`);return await client.input.confirm("Accept all of the documents listed above?",!1)?buildAcceptedPolicies(integration):(output_manager_default.error("All of the listed documents must be accepted to continue."),null)}function buildAcceptedPolicies(integration){let acceptedAt=new Date().toISOString(),acceptedPolicies={toc:acceptedAt};return integration.privacyDocUri&&(acceptedPolicies.privacy=acceptedAt),integration.eulaDocUri&&(acceptedPolicies.eula=acceptedAt),acceptedPolicies}var POLL_INTERVAL_MS2=2e3,DEFAULT_TIMEOUT_MS=5*60*1e3;async function acceptTermsViaBrowser(client,integration,teamId,teamSlug,timeoutMs=DEFAULT_TIMEOUT_MS){let url=new URL(`https://vercel.com/${encodeURIComponent(teamSlug)}/~/integrations/accept-terms/${encodeURIComponent(integration.slug)}`);if(url.searchParams.set("source","cli"),shouldEmitNonInteractiveCommandError(client)){let tail=buildIntegrationCommandTailFromArgv(client.argv),policyLinks=getMarketplacePolicyLinks(integration);outputActionRequired(client,{status:"action_required",reason:AGENT_REASON.INTEGRATION_TERMS_ACCEPTANCE_REQUIRED,message:`Accept marketplace terms for "${integration.name}" in your browser before this install can finish. Open verification_uri to start. This command does not wait for acceptance in non-interactive mode.`,verification_uri:url.href,policy_links:policyLinks,userActionRequired:!0,hint:`Read policy_links, complete verification_uri in the browser, then retry install from next[]. Confirm with ${packageName} integration installations.`,next:[{command:buildCommandWithGlobalFlags(client.argv,tail,packageName,{prependGlobalFlags:!0}),when:"Retry install after terms are accepted (browser or dashboard)"}]},1)}output_manager_default.log("Opening browser for terms acceptance. Accept the terms to continue..."),output_manager_default.log(`Visit this URL if the browser does not open: ${url.href}`);try{await(0,import_open5.default)(url.href)}catch(err){output_manager_default.debug(`Failed to open browser: ${err}`)}output_manager_default.spinner("Waiting for terms acceptance in browser...");let deadline=Date.now()+timeoutMs;for(;Date.now()<deadline;){await sleep(POLL_INTERVAL_MS2);try{let teamInstallation=(await fetchInstallations(client,integration)).find(i=>i.ownerId===teamId&&i.installationType==="marketplace");if(teamInstallation)return output_manager_default.stopSpinner(),output_manager_default.success("Terms accepted in browser."),teamInstallation}catch(error){output_manager_default.debug(`Polling error (will retry): ${error}`)}}return output_manager_default.stopSpinner(),output_manager_default.error("Timed out waiting for terms acceptance. Please try again and accept terms in the browser within 5 minutes."),null}async function selectProduct(client,products,productSlug){if(productSlug){let match2=products.find(p=>p.slug===productSlug);if(!match2){let available=products.map(p=>p.slug).join(", ");output_manager_default.error(`Product "${productSlug}" not found. Available products: ${available}`);return}return match2}return products.length===1?products[0]:client.input.select({message:"Select a product",choices:products.map(p=>({name:p.name,value:p,description:p.shortDescription}))})}function resolveProductSkills(product){let resolved=[];for(let entry of product.agentSkills??[]){let skill=resolveSkillFromUrl(entry);skill&&resolved.push(skill)}return resolved}function resolveSkillFromUrl(value){let url;try{url=new URL(value)}catch{return null}if(url.hostname.replace(/^www\./,"")!=="github.com")return null;let[owner,repo,kind,,...rest]=url.pathname.split("/").filter(Boolean);if(!owner||!repo)return null;let repoUrl=`https://github.com/${owner.toLowerCase()}/${repo.toLowerCase()}`,skill;if(kind==="blob"||kind==="tree"){let parts=rest.filter(part=>part.toLowerCase()!=="skill.md");skill=parts[parts.length-1]}let command=skill?`npx skills add ${repoUrl} --skill ${skill}`:`npx skills add ${repoUrl}`;return{repoUrl,skill,command}}var import_chalk16=__toESM(require_source(),1),import_open6=__toESM(require_open(),1);async function getResources(client){return(await client.fetch("/v1/storage/stores",{json:!0})).stores}var ClaimUrlError=class extends Error{constructor(message,code,status2){super(message);this.code=code,this.status=status2}};async function createClaimUrl(client,resource){let installationId=resource.product?.integrationConfigurationId;if(!installationId)throw new ClaimUrlError(`Resource "${resource.name}" is not associated with a marketplace installation and cannot be claimed.`,"not_marketplace");try{return await client.fetch(`/v1/integrations/installations/${encodeURIComponent(installationId)}/resources/${encodeURIComponent(resource.id)}/sandbox/claim-url`,{method:"POST",json:!0,body:{source:"cli"}})}catch(error){throw mapClaimUrlError(error,resource)}}function mapClaimUrlError(error,resource){if(!isAPIError(error))return error instanceof Error?new ClaimUrlError(`Provider could not generate a claim URL: ${error.message}`,"unknown"):new ClaimUrlError("Provider could not generate a claim URL.","unknown");let status2=error.status,serverMessage=(error.serverMessage||error.message||"").toString(),messageLower=serverMessage.toLowerCase();if(status2===403)return new ClaimUrlError("You don't have permission to claim resources in this team.","forbidden",status2);if(status2===404)return messageLower.includes("installation")?new ClaimUrlError("Integration installation not found. Run `vercel integration list`.","installation_not_found",status2):new ClaimUrlError(`No resource named '${resource.name}' found.`,"resource_not_found",status2);if(status2===400){if(messageLower.includes("sandbox")||messageLower.includes("ownership"))return new ClaimUrlError(`'${resource.name}' can no longer be claimed (likely already claimed). Run \`${packageName} integration list\` to refresh.`,"not_sandbox",status2);if(messageLower.includes("marketplace")||messageLower.includes("integration"))return new ClaimUrlError("This integration doesn't support claiming.","not_marketplace",status2)}return new ClaimUrlError(`Provider could not generate a claim URL: ${serverMessage||"unknown error"}`,"partner_error",status2)}var import_ms=__toESM(require_ms(),1);async function getResource(client,resourceId){let{store}=await client.fetch(`/v1/storage/stores/${encodeURIComponent(resourceId)}`,{json:!0});return store}var POLL_INTERVAL_MS3=2e3,DEFAULT_TIMEOUT_MS2=5*60*1e3,SANDBOX_CLAIM_IN_PROGRESS_MSG="Claim still in progress \u2014 finish in your browser, then run `vercel integration list` to verify.";async function pollForClaim(client,resourceId,options={}){let timeoutMs=options.timeoutMs??DEFAULT_TIMEOUT_MS2,cancelled=!1,resolveCancelled,cancelledSignal=new Promise(resolve3=>{resolveCancelled=resolve3}),onSigint=()=>{cancelled=!0,resolveCancelled?.()};process.on("SIGINT",onSigint);try{output_manager_default.spinner("Waiting for claim to complete in browser...");let deadline=Date.now()+timeoutMs;for(;Date.now()<deadline&&!cancelled&&(await Promise.race([sleep(POLL_INTERVAL_MS3),cancelledSignal]),!cancelled);)try{let updated=await getResource(client,resourceId);if(updated.ownership&&updated.ownership!=="sandbox")return output_manager_default.stopSpinner(),{status:"claimed",resource:updated}}catch(error){output_manager_default.debug(`Polling error (will retry): ${error}`)}return output_manager_default.stopSpinner(),cancelled?(output_manager_default.print(`
|
|
63
|
+
`),output_manager_default.log(SANDBOX_CLAIM_IN_PROGRESS_MSG),{status:"cancelled"}):(output_manager_default.error(`Claim did not complete within ${(0,import_ms.default)(timeoutMs,{long:!0})}.`),output_manager_default.log(SANDBOX_CLAIM_IN_PROGRESS_MSG),{status:"timeout"})}finally{process.off("SIGINT",onSigint)}}function isSandboxResource(resource){return resource.ownership==="sandbox"}var IntegrationResourceClaimTelemetryClient=class extends TelemetryClient{trackCliArgumentResource(v){v&&this.trackCliArgument({arg:"resource",value:this.redactedValue})}trackCliFlagYes(v){v&&this.trackCliFlag("yes")}trackCliFlagNoWait(v){v&&this.trackCliFlag("no-wait")}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function claim(client,argv){let telemetry=new IntegrationResourceClaimTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArguments=null,flagsSpecification=getFlagsSpecification(claimSubcommand.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"],noWait=!!parsedArguments.flags["--no-wait"];if(telemetry.trackCliOptionFormat(parsedArguments.flags["--format"]),telemetry.trackCliFlagYes(skipConfirmation),telemetry.trackCliFlagNoWait(noWait),parsedArguments.args.length>1)return output_manager_default.error("Too many arguments. Usage: `vercel integration resource claim [name]`."),2;let resourceNameArg=parsedArguments.args[0];telemetry.trackCliArgumentResource(resourceNameArg);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 resources\u2026",500);let allResources;try{allResources=await getResources(client)}catch(error){return output_manager_default.stopSpinner(),output_manager_default.error(`Failed to fetch resources: ${error.message}`),1}output_manager_default.stopSpinner();let targetResource;if(resourceNameArg){if(targetResource=allResources.find(r=>r.name===resourceNameArg),!targetResource)return output_manager_default.error(`No resource named '${resourceNameArg}' found.`),1}else{if(!client.stdin.isTTY)return output_manager_default.error("Missing resource name. Run `vercel integration list` to see available resources."),1;let sandboxResources=allResources.filter(isSandboxResource);if(sandboxResources.length===0)return output_manager_default.log("No sandbox resources to claim in the current project."),0;if(sandboxResources.length===1){let only=sandboxResources[0];if(skipConfirmation)targetResource=only;else{let productLabel=only.product?.name?` (${only.product.name} sandbox)`:"";if(!await client.input.confirm(`Claim ${import_chalk16.default.bold(only.name)}${productLabel}?`,!0))return output_manager_default.log("Canceled"),0;targetResource=only}}else{let choice=await client.input.select({message:"Which sandbox resource would you like to claim?",choices:sandboxResources.map(r=>({name:r.product?.name?`${r.name} (${r.product.name})`:r.name,value:r.id}))});if(targetResource=sandboxResources.find(r=>r.id===choice),!targetResource)return output_manager_default.error("No resource selected."),1}}return runClaimForResource(client,targetResource,{asJson,noWait})}async function runClaimForResource(client,targetResource,options={}){let{asJson,noWait,suppressActionRequired}=options;if(!isSandboxResource(targetResource)){let alreadyClaimed=targetResource.ownership==="owned"||targetResource.ownership==="linked";return output_manager_default.error(alreadyClaimed?`'${targetResource.name}' can no longer be claimed (already claimed). Run \`${packageName} integration list\` to refresh.`:`'${targetResource.name}' is not a sandbox resource and cannot be claimed.`),1}output_manager_default.spinner("Requesting claim URL\u2026",500);let claimUrl;try{claimUrl=(await createClaimUrl(client,targetResource)).claimUrl}catch(error){return output_manager_default.stopSpinner(),error instanceof ClaimUrlError?(output_manager_default.error(error.message),1):(output_manager_default.error(`A problem occurred while requesting the claim URL: ${error.message}`),1)}if(output_manager_default.stopSpinner(),!suppressActionRequired&&shouldEmitNonInteractiveCommandError(client)&&outputActionRequired(client,{status:"action_required",reason:AGENT_REASON.INTEGRATION_SANDBOX_CLAIM_REQUIRED,message:`Claim "${targetResource.name}" in your browser to finish provisioning. Open verification_uri to start. This command does not wait for the claim in non-interactive mode.`,verification_uri:claimUrl,userActionRequired:!0,hint:`Open verification_uri in a browser, complete the provider's claim flow, then run \`${packageName} integration list\` to confirm \`ownership\` flipped from sandbox to linked.`,next:[{command:buildCommandWithGlobalFlags(client.argv,"integration list",packageName,{prependGlobalFlags:!0}),when:"After claiming in the browser, verify ownership flipped to linked"}]},1),noWait){if(asJson){let json={resource:{id:targetResource.id,name:targetResource.name},claimUrl,status:"url_generated"};client.stdout.write(`${JSON.stringify(json,null,2)}
|
|
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
|
+
`)}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
|
+
`)}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})}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
|
+
`);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.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
|
+
`);return output_manager_default.error(`Integration "${integration.slug}" has multiple products. Specify one with:
|
|
71
|
+
|
|
72
|
+
${choices}
|
|
73
|
+
|
|
74
|
+
Example: vercel ${commandName} ${integration.slug}/${integration.products[0].slug}`),2}let[productResult,installationsResult]=await Promise.allSettled([selectProduct(client,integration.products,options.productSlug),fetchInstallations(client,integration)]);if(productResult.status==="rejected")return output_manager_default.error(`Failed to select product: ${productResult.reason.message}`),1;if(!productResult.value)return 1;if(installationsResult.status==="rejected")return output_manager_default.error(`Failed to get integration installations: ${installationsResult.reason.message}`),1;let product=productResult.value,installations=installationsResult.value,baseProps={integration_id:integration.id,integration_slug:integration.slug,integration_name:integration.name,product_id:product.id,product_slug:product.slug,team_id:team.id,source:"cli"};telemetry.trackMarketplaceEvent("marketplace_install_flow_started",baseProps),output_manager_default.log(`Installing ${import_chalk18.default.bold(product.name)} by ${import_chalk18.default.bold(integration.name)} under ${import_chalk18.default.bold(contextName)}`),output_manager_default.debug(`Selected product: ${product.slug} (id: ${product.id})`),output_manager_default.debug(`Product metadataSchema: ${JSON.stringify(product.metadataSchema,null,2)}`);let teamInstallation=installations.find(i=>i.ownerId===team.id&&i.installationType==="marketplace"),acceptedPolicies={},browserInstallationId;if(!teamInstallation)if(client.isAgent||!client.stdin.isTTY||integration.capabilities?.requiresBrowserInstall){let browserInstallation=await acceptTermsViaBrowser(client,integration,team.id,contextName);if(!browserInstallation)return telemetry.trackMarketplaceEvent("marketplace_install_flow_dropped",{...baseProps,reason:"browser_terms_timeout"}),1;browserInstallationId=browserInstallation.id}else{let policies=await promptForTermAcceptance(client,integration);if(!policies)return telemetry.trackMarketplaceEvent("marketplace_install_flow_dropped",{...baseProps,reason:"policy_declined"}),1;acceptedPolicies=policies}let integrationSchemaProps=integration.metadataSchema?.properties??{},productSchemaProps=product.metadataSchema.properties,mergedParsingSchema=mergeMetadataSchemas(product.metadataSchema,integration.metadataSchema)??product.metadataSchema;for(let key of Object.keys(integrationSchemaProps))key in productSchemaProps&&output_manager_default.debug(`Metadata key "${key}" exists in both product and installation schemas \u2014 product definition wins`);let metadata,installationMetadata={};if(options.metadata?.length){output_manager_default.debug(`Parsing metadata from flags: ${JSON.stringify(options.metadata)}`);let{metadata:parsed,errors}=parseMetadataFlags(options.metadata,mergedParsingSchema);if(errors.length){for(let error of errors)output_manager_default.error(error);return telemetry.trackMarketplaceEvent("marketplace_install_flow_dropped",{...baseProps,reason:"metadata_parse_error"}),1}if(!validateAndPrintRequiredMetadata(parsed,mergedParsingSchema))return telemetry.trackMarketplaceEvent("marketplace_install_flow_dropped",{...baseProps,reason:"metadata_validation_failed"}),1;let productMeta={},installMeta={};for(let[key,value]of Object.entries(parsed)){if(value===void 0)continue;let inProduct=key in productSchemaProps,inInstallation=key in integrationSchemaProps;inProduct?productMeta[key]=value:inInstallation?installMeta[key]=value:productMeta[key]=value}metadata=productMeta,installationMetadata=installMeta}else metadata={};let nameResult=resolveResourceName(product.slug,resourceNameArg);if("error"in nameResult)return output_manager_default.error(nameResult.error),telemetry.trackMarketplaceEvent("marketplace_install_flow_dropped",{...baseProps,reason:"resource_name_invalid"}),1;let{resourceName}=nameResult;output_manager_default.debug(`Collected metadata: ${JSON.stringify(metadata)}`),output_manager_default.debug(`Resource name: ${resourceName}`),telemetry.trackMarketplaceEvent("marketplace_checkout_plan_selected",{...baseProps,billing_plan_id:options.billingPlanId??null,plan_selection_method:options.billingPlanId?"cli_flag":"server_default"}),telemetry.trackMarketplaceEvent("marketplace_checkout_provisioning_started",baseProps),output_manager_default.spinner("Provisioning resource...");let result;try{result=await autoProvisionResource(client,integration.slug,product.slug,resourceName,metadata,acceptedPolicies,options.billingPlanId,browserInstallationId??options.installationId,installationMetadata)}catch(error){return output_manager_default.stopSpinner(),telemetry.trackMarketplaceEvent("marketplace_checkout_provisioning_failed",{...baseProps,error_message:(0,import_error_utils.errorToString)(error)}),output_manager_default.error((0,import_error_utils.errorToString)(error)),1}if(output_manager_default.stopSpinner(),output_manager_default.debug(`Auto-provision result: ${JSON.stringify(result,null,2)}`),result.kind==="unknown"&&result.reason==="multiple_installations"&&result.installations?.length){let installationsList2=result.installations.map(i=>{let parts=[i.id];return i.type&&parts.push(`type=${i.type}`),i.externalId&&parts.push(`externalId=${i.externalId}`),i.status&&parts.push(`status=${i.status}`),parts.join(", ")}).map(line=>` - ${line}`).join(`
|
|
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
|
+
${installationsList2}
|
|
77
|
+
|
|
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
|
+
`),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
|
+
`),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
|
+
`)}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)}
|
|
87
|
+
`),0;let connectionCount=projectConnections.length;return output_manager_default.success(connectionCount===1?`Disconnected ${import_chalk25.default.bold(project.name)} from ${import_chalk25.default.bold(resource.name)}`:`Disconnected all ${connectionCount} connections for ${import_chalk25.default.bold(project.name)} from ${import_chalk25.default.bold(resource.name)}`),0}async function handleDisconnectAllProjects(client,resource,skipConfirmation,asJson=!1){if(resource.projectsMetadata?.length===0){output_manager_default.log(`${import_chalk25.default.bold(resource.name)} has no projects to disconnect.`);return}if(!skipConfirmation&&client.nonInteractive)throw outputAgentError(client,{status:"error",reason:"confirmation_required",message:"Disconnecting all projects requires confirmation. Re-run with --yes.",next:[{command:buildCommandWithYes(client.argv)}]},1),new FailedError("Confirmation required. Use `--yes` to skip the confirmation prompt.");if(!skipConfirmation&&!client.stdin.isTTY)throw new FailedError("Confirmation required. Use `--yes` to skip the confirmation prompt.");if(!skipConfirmation&&!await confirmDisconnectAllProjects(client,resource))throw new CancelledError("Canceled");try{output_manager_default.spinner("Disconnecting projects from resource\u2026",500),await disconnectResourceFromAllProjects(client,resource),asJson?output_manager_default.stopSpinner():output_manager_default.success(`Disconnected all projects from ${import_chalk25.default.bold(resource.name)}`)}catch(error){throw new FailedError(`A problem occurred while disconnecting all projects: ${error.message}`)}}async function confirmDisconnectProject(client,resource,project,connectionCount){return output_manager_default.log(connectionCount===1?`The resource ${import_chalk25.default.bold(resource.name)} will be disconnected from project ${import_chalk25.default.bold(project.name)}.`:`All ${connectionCount} connections between resource ${import_chalk25.default.bold(resource.name)} and project ${import_chalk25.default.bold(project.name)} will be disconnected.`),client.input.confirm(`${import_chalk25.default.red("Are you sure?")}`,!1)}async function confirmDisconnectAllProjects(client,resource){if(output_manager_default.log("The following projects will be disconnected:"),!resource.projectsMetadata)return!1;for(let project of resource.projectsMetadata)output_manager_default.print(` ${project.name}
|
|
88
|
+
`);return client.input.confirm(import_chalk25.default.red("Are you sure?"),!1)}var import_chalk27=__toESM(require_source(),1),import_title2=__toESM(require_lib(),1);var import_chalk26=__toESM(require_source(),1),import_title=__toESM(require_lib(),1);function resourceStatus(status2,isSandbox=!1){let CIRCLE="\u25CF ",statusTitleCase=(0,import_title.default)(status2),sandboxTag=isSandbox?` ${import_chalk26.default.yellow("[SANDBOX]")}`:"";switch(status2){case"initializing":return import_chalk26.default.yellow(CIRCLE)+statusTitleCase+sandboxTag;case"error":return import_chalk26.default.red(CIRCLE)+statusTitleCase+sandboxTag;case"available":return import_chalk26.default.green(CIRCLE)+statusTitleCase+sandboxTag;case"suspended":return import_chalk26.default.white(CIRCLE)+statusTitleCase+sandboxTag;case"limits-exceeded-suspended":return`${import_chalk26.default.white(CIRCLE)}Limits exceeded${sandboxTag}`;default:return import_chalk26.default.gray(statusTitleCase)+sandboxTag}}function resourceDashboardUrl(orgSlug,resourceId){return`https://vercel.com/${orgSlug}/~/stores/integration/${resourceId}`}function resourceLink(orgSlug,resource){if(resource.name)return output_manager_default.link(resource.name,resourceDashboardUrl(orgSlug,resource.id),{fallback:()=>resource.name??"\u2013",color:!1})}var IntegrationResourceInspectTelemetryClient=class extends TelemetryClient{trackCliArgumentResource(v){v&&this.trackCliArgument({arg:"resource",value:this.redactedValue})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function inspect(client,argv){let telemetry=new IntegrationResourceInspectTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArguments=null,flagsSpecification=getFlagsSpecification(inspectSubcommand.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;if(telemetry.trackCliOptionFormat(parsedArguments.flags["--format"]),parsedArguments.args.length>1)return output_manager_default.error("Too many arguments. Usage: `vercel integration resource inspect <resource>`."),2;let resourceName=parsedArguments.args[0];if(telemetry.trackCliArgumentResource(resourceName),!resourceName)return output_manager_default.error("You must specify a resource. See `--help` for details."),2;let{contextName,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;try{resources=await getResources(client)}catch(error){return output_manager_default.stopSpinner(),output_manager_default.error(`Failed to fetch resources: ${error.message}`),1}let listed=resources.find(resource2=>resource2.type==="integration"&&resource2.name===resourceName);if(!listed)return output_manager_default.stopSpinner(),output_manager_default.error(`No resource ${import_chalk27.default.bold(resourceName)} found.`),1;let resource;try{let live=await getResource(client,listed.id);resource={...listed,...live}}catch(error){return output_manager_default.stopSpinner(),output_manager_default.error(`Failed to fetch live status for ${import_chalk27.default.bold(resourceName)}: ${error.message}`),1}output_manager_default.stopSpinner();let isSandbox=isSandboxResource(resource),dashboardUrl=resourceDashboardUrl(contextName,resource.id);if(asJson){let json={resource:{id:resource.id,name:resource.name,status:resource.status??null,ownership:resource.ownership??null,product:resource.product?.name??null,integration:resource.product?.slug??null,installationId:resource.product?.integrationConfigurationId??null,projects:resource.projectsMetadata?.map(project=>({id:project.projectId,name:project.name,environments:project.environments}))??[],billingPlan:resource.billingPlan?{id:resource.billingPlan.id,name:resource.billingPlan.name,type:resource.billingPlan.type,scope:resource.billingPlan.scope}:null,dashboard:dashboardUrl,...isSandbox?{claim_status:"sandbox"}:{}}};return client.stdout.write(`${JSON.stringify(json,null,2)}
|
|
89
|
+
`),0}if(output_manager_default.log(`Resource ${import_chalk27.default.bold(resource.name)} in ${import_chalk27.default.bold(contextName)}:`),output_manager_default.print(`
|
|
90
|
+
`),printAlignedLabel("Status",resourceStatus(resource.status??"\u2013",isSandbox)),resource.ownership&&printAlignedLabel("Ownership",(0,import_title2.default)(resource.ownership)),resource.product?.name){let productSlug=resource.product.slug?import_chalk27.default.gray(` (${resource.product.slug})`):"";printAlignedLabel("Product",`${resource.product.name}${productSlug}`)}let integration=integrationLink(resource,team);if(integration&&printAlignedLabel("Integration",integration),resource.billingPlan){let{name,type,scope}=resource.billingPlan,meta=[type,scope].filter(Boolean).join(" \xB7 ");printAlignedLabel("Plan",meta?`${name} \xB7 ${meta}`:name)}printAlignedLabel("Resource ID",import_chalk27.default.gray(resource.id)),printAlignedLabel("Dashboard",output_manager_default.link(dashboardUrl,dashboardUrl,{fallback:!1}));let projects=resource.projectsMetadata??[];if(output_manager_default.print(`
|
|
91
|
+
`),projects.length===0)output_manager_default.log(import_chalk27.default.gray("No connected projects."));else{output_manager_default.log("Connected projects:");for(let project of projects){let envs=project.environments?.length?import_chalk27.default.gray(` (${project.environments.join(", ")})`):"";output_manager_default.print(` ${project.name}${envs}
|
|
92
|
+
`)}}return isSandbox&&(output_manager_default.print(`
|
|
93
|
+
`),output_manager_default.log(`This is a sandbox resource. Run \`${packageName} integration resource claim ${resource.name}\` to claim it.`)),0}function integrationLink(resource,team){let slug=resource.product?.slug;if(!slug)return;let configurationId=resource.product?.integrationConfigurationId;if(!configurationId)return slug;let boldName=import_chalk27.default.bold(slug);return output_manager_default.link(boldName,buildSSOLink(team,configurationId),{fallback:()=>boldName,color:!1})}var import_chalk28=__toESM(require_source(),1);async function deleteResource(client,resource){return client.fetch(`/v1/storage/stores/integration/${resource.id}`,{json:!0,method:"DELETE"})}var IntegrationResourceRemoveTelemetryClient=class extends TelemetryClient{trackCliArgumentResource(v){v&&this.trackCliArgument({arg:"resource",value:this.redactedValue})}trackCliFlagDisconnectAll(v){v&&this.trackCliFlag("disconnect-all")}trackCliFlagYes(v){v&&this.trackCliFlag("yes")}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var suggestRemoveOpts={prependGlobalFlags:!0,excludeFlags:["--yes","-y"]};async function remove2(client,argv){let telemetry=new IntegrationResourceRemoveTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArguments=null,flagsSpecification=getFlagsSpecification(removeSubcommand2.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){let message="You must specify a resource. See `--help` for details.";return outputAgentError(client,{status:"error",reason:AGENT_REASON.MISSING_ARGUMENTS,message,hint:"Put global flags first, then `integration resource delete <resource> --yes`. Use `--disconnect-all` to detach projects before delete.",next:[{command:buildCommandWithGlobalFlags(client.argv,"integration resource delete <resource> --yes",packageName,suggestRemoveOpts),when:"Replace <resource> with the store name (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 resource at a time.";return outputAgentError(client,{status:"error",reason:AGENT_REASON.INVALID_ARGUMENTS,message,hint:`One resource per invocation: \`${packageName} [global flags] integration resource delete <resource> [--disconnect-all] --yes\`.`,next:[{command:buildCommandWithGlobalFlags(client.argv,"integration resource delete <resource> --disconnect-all --yes",packageName,suggestRemoveOpts),when:"Single resource name in place of <resource>"}]},2),output_manager_default.error(message),2}let disconnectAll=!!parsedArguments.flags["--disconnect-all"],resourceReference=parsedArguments.args[0];telemetry.trackCliArgumentResource(resourceReference),telemetry.trackCliFlagDisconnectAll(disconnectAll),telemetry.trackCliFlagYes(skipConfirmation),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_chalk28.default.bold(resourceReference)} found.`),1;if(disconnectAll)try{await handleDisconnectAllProjects(client,targetedResource,skipConfirmation,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}return await handleDeleteResource(client,targetedResource,{skipConfirmation,skipProjectCheck:disconnectAll,asJson})}async function handleDeleteResource(client,resource,options){let hasProjects=resource.projectsMetadata&&resource.projectsMetadata?.length>0;if(!options?.skipProjectCheck&&hasProjects)return output_manager_default.error(`Cannot delete resource ${import_chalk28.default.bold(resource.name)} while it has connected projects. Please disconnect any projects using this resource first or use the \`--disconnect-all\` flag.`),1;if(!options?.skipConfirmation&&!client.stdin.isTTY)return output_manager_default.error("Confirmation required. Use `--yes` to skip the confirmation prompt."),1;if(!options?.skipConfirmation&&!await confirmDeleteResource(client,resource))return output_manager_default.log("Canceled"),0;try{output_manager_default.spinner("Deleting resource\u2026",500),await deleteResource(client,resource)}catch(error){return output_manager_default.error(`A problem occurred when attempting to delete ${import_chalk28.default.bold(resource.name)}: ${error.message}`),1}return options?.asJson?(output_manager_default.stopSpinner(),client.stdout.write(`${JSON.stringify({resource:resource.name,removed:!0},null,2)}
|
|
94
|
+
`),0):(output_manager_default.success(`${import_chalk28.default.bold(resource.name)} successfully deleted.`),0)}async function confirmDeleteResource(client,resource){return output_manager_default.log(`${import_chalk28.default.bold(resource.name)} will be deleted permanently.`),client.input.confirm(`${import_chalk28.default.red("Are you sure?")}`,!1)}var COMMAND_CONFIG3={delete:getCommandAliases(removeSubcommand2),disconnect:getCommandAliases(disconnectSubcommand),connect:getCommandAliases(connectSubcommand),"create-threshold":getCommandAliases(createThresholdSubcommand),claim:getCommandAliases(claimSubcommand),inspect:getCommandAliases(inspectSubcommand)};async function dispatchResourceSubcommand(client,subArgs,needHelp,options){let telemetry=new IntegrationResourceTelemetryClient({opts:{store:client.telemetryEventStore}}),{subcommand,subcommandOriginal,args:innerArgs}=getSubcommand2(subArgs,COMMAND_CONFIG3);if(!subcommand&&needHelp)return telemetry.trackCliFlagHelp(options.helpBreadcrumb),output_manager_default.print(help(integrationResourceCommand,{columns:client.stderr.columns})),0;function printHelp(command){output_manager_default.print(help(command,{columns:client.stderr.columns,parent:options.parentForChildHelp}))}switch(subcommand){case"create-threshold":return needHelp?(telemetry.trackCliFlagHelp(options.helpBreadcrumb,subcommandOriginal),printHelp(createThresholdSubcommand),0):(telemetry.trackCliSubcommandCreateThreshold(subcommandOriginal),createThreshold(client,innerArgs));case"delete":return needHelp?(telemetry.trackCliFlagHelp(options.helpBreadcrumb,subcommandOriginal),printHelp(removeSubcommand2),0):(telemetry.trackCliSubcommandDelete(subcommandOriginal),subcommandOriginal==="remove"&&warnDeprecatedSubcommand(client,`${options.helpBreadcrumb} remove`,"integration resource delete"),remove2(client,innerArgs));case"disconnect":return needHelp?(telemetry.trackCliFlagHelp(options.helpBreadcrumb,subcommandOriginal),printHelp(disconnectSubcommand),0):(telemetry.trackCliSubcommandDisconnect(subcommandOriginal),disconnect(client,innerArgs));case"connect":return needHelp?(telemetry.trackCliFlagHelp(options.helpBreadcrumb,subcommandOriginal),printHelp(connectSubcommand),0):(telemetry.trackCliSubcommandConnect(subcommandOriginal),connect(client,innerArgs));case"claim":return needHelp?(telemetry.trackCliFlagHelp(options.helpBreadcrumb,subcommandOriginal),printHelp(claimSubcommand),0):(telemetry.trackCliSubcommandClaim(subcommandOriginal),claim(client,innerArgs));case"inspect":return needHelp?(telemetry.trackCliFlagHelp(options.helpBreadcrumb,subcommandOriginal),printHelp(inspectSubcommand),0):(telemetry.trackCliSubcommandInspect(subcommandOriginal),subcommandOriginal==="status"&&warnDeprecatedSubcommand(client,`${options.helpBreadcrumb} status`,"integration resource inspect"),inspect(client,innerArgs));default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG3)),2}}async function main(client){let{args,flags}=parseArguments(client.argv.slice(2),getFlagsSpecification(integrationResourceCommand.options),{permissive:!0});return(args[0]==="integration-resource"||args[0]==="ir")&&warnDeprecatedSubcommand(client,args[0],"integration resource"),dispatchResourceSubcommand(client,args.slice(1),!!flags["--help"],{helpBreadcrumb:"integration-resource",parentForChildHelp:integrationResourceCommand})}var import_chalk29=__toESM(require_source(),1);var IntegrationListTelemetryClient=class extends TelemetryClient{trackCliArgumentProject(v){v&&this.trackCliArgument({arg:"project",value:this.redactedValue})}trackCliOptionIntegration(v,known){v&&this.trackCliOption({option:"integration",value:known?v:this.redactedValue})}trackCliFlagAll(v){v&&this.trackCliFlag("all")}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function list2(client){let parsedArguments=null,flagsSpecification=getFlagsSpecification(listSubcommand2.options);try{parsedArguments=parseArguments(client.argv.slice(3),flagsSpecification)}catch(error){return printError(error),2}let telemetry=new IntegrationListTelemetryClient({opts:{store:client.telemetryEventStore}});telemetry.trackCliArgumentProject(parsedArguments.args[1]),telemetry.trackCliFlagAll(parsedArguments.flags["--all"]),telemetry.trackCliOptionFormat(parsedArguments.flags["--format"]);let formatResult=validateJsonOutput(parsedArguments.flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput,validationResult=validateLsArgs({commandName:"integration list [project]",args:parsedArguments.args,maxArgs:2,exitCode:1});if(validationResult!==0)return validationResult;let project;if(parsedArguments.args.length===2){if(parsedArguments.flags["--all"])return output_manager_default.error("Cannot specify a project when using the `--all` flag."),2;project={name:parsedArguments.args[1]}}let{contextName,team}=await getScope(client);if(!team)return output_manager_default.error("Team not found."),1;if(client.config.currentTeam=team.id,!project&&!parsedArguments.flags["--all"]&&(project=await getLinkedProject(client).then(result=>{if(result.status==="linked")return result.project}),!project))return output_manager_default.error("No project linked. Either use `vc link` to link a project, or the `--all` flag to list all resources."),1;let resources;try{output_manager_default.spinner("Retrieving resources\u2026",500),resources=await getResources(client)}catch(error){return output_manager_default.error(`Failed to fetch resources: ${error.message}`),1}let filterIntegration=parsedArguments.flags["--integration"]?.toLocaleLowerCase();function resourceIsFromMarketplace(resource){return resource.type==="integration"}let knownIntegration=!1;function filterOnIntegration(resource){if(!filterIntegration)return!0;let match2=filterIntegration===resource.product?.slug;return match2&&(knownIntegration=!0),match2}function filterOnProject(resource){return!project||!!resource.projectsMetadata?.find(metadata=>metadata.projectId===project?.id||metadata.name===project?.name)}function filterOnFlags(resource){return filterOnIntegration(resource)&&filterOnProject(resource)}let results=resources.filter(resourceIsFromMarketplace).filter(filterOnFlags).map(resource=>({id:resource.id,name:resource.name,status:resource.status,product:resource.product?.name,integration:resource.product?.slug,configurationId:resource.product?.integrationConfigurationId,projects:resource.projectsMetadata?.map(project2=>project2.name),isSandbox:isSandboxResource(resource)})),sandboxCount=results.filter(r=>r.isSandbox).length;if(telemetry.trackCliOptionIntegration(parsedArguments.flags["--integration"],knownIntegration),asJson){output_manager_default.stopSpinner();let jsonResources=results.map(result=>{let obj={id:result.id,name:result.name,status:result.status,product:result.product,installationId:result.configurationId,projects:result.projects};return result.isSandbox&&(obj.claim_status="sandbox"),obj});return client.stdout.write(`${JSON.stringify({resources:jsonResources},null,2)}
|
|
95
|
+
`),0}if(results.length===0)return output_manager_default.log("No resources found."),0;let headerMessage=project?`Integration resources for project ${import_chalk29.default.bold(project.name)} in ${import_chalk29.default.bold(contextName)}:`:`Integrations in ${import_chalk29.default.bold(contextName)}:`;if(output_manager_default.log(`${headerMessage}
|
|
96
|
+
${table([["Name","Status","Product","Integration","Projects"].map(header=>import_chalk29.default.bold(import_chalk29.default.cyan(header))),...results.map(result=>[resourceLink(contextName,result)??import_chalk29.default.gray("\u2013"),resourceStatus(result.status??"\u2013",result.isSandbox),result.product??import_chalk29.default.gray("\u2013"),integrationLink2(result,team)??import_chalk29.default.gray("\u2013"),import_chalk29.default.grey(result.projects?.length?result.projects.join(", "):"\u2013")])],{hsep:8})}`),sandboxCount>0){let noun=sandboxCount===1?"resource":"resources";output_manager_default.log(`${sandboxCount} sandbox ${noun} can be claimed.`),output_manager_default.print(` Run \`${packageName} integration resource claim <name>\` to claim one.
|
|
97
|
+
`)}return 0}function integrationLink2(integration,team){if(!integration.integration)return;if(!integration.configurationId)return integration.integration;let boldName=import_chalk29.default.bold(integration.integration),integrationDeepLink=buildSSOLink(team,integration.configurationId);return output_manager_default.link(boldName,integrationDeepLink,{fallback:()=>boldName,color:!1})}var import_chalk30=__toESM(require_source(),1),import_open8=__toESM(require_open(),1);var IntegrationOpenTelemetryClient=class extends TelemetryClient{trackCliArgumentName(v,known){this.trackCliArgument({arg:"name",value:known?v:this.redactedValue})}trackCliArgumentResource(v){v&&this.trackCliArgument({arg:"resource",value:this.redactedValue})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function openIntegration(client,subArgs){let telemetry=new IntegrationOpenTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(openSubcommand2.options),parsedArguments;try{parsedArguments=parseArguments(subArgs,flagsSpecification)}catch(error){return printError(error),2}let{args}=parsedArguments,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"]),args.length>2)return output_manager_default.error("Too many arguments. Usage: integration open <name> [resource]"),2;let integrationSlug=args[0],resourceName=args[1];if(!integrationSlug)return output_manager_default.error("You must pass an integration name"),2;let{team}=await getScope(client);if(!team)return output_manager_default.error("Team not found"),1;client.config.currentTeam=team.id;let configuration,knownIntegrationSlug=!1;try{configuration=await getFirstConfiguration(client,integrationSlug),knownIntegrationSlug=!!configuration}catch(error){return output_manager_default.error(`Failed to fetch configuration for ${import_chalk30.default.bold(`"${integrationSlug}"`)}: ${error.message}`),1}finally{telemetry.trackCliArgumentName(integrationSlug,knownIntegrationSlug),resourceName&&telemetry.trackCliArgumentResource(resourceName)}if(!configuration)return output_manager_default.error(`No configuration found for ${import_chalk30.default.bold(`"${integrationSlug}"`)}.`),1;let configurationId=configuration.id;if(resourceName){let resources;try{resources=await getResources(client)}catch(error){return output_manager_default.error(`Failed to fetch resources: ${error.message}`),1}let resource=resources.find(r=>r.name===resourceName&&r.product?.integrationConfigurationId===configurationId);if(!resource)return output_manager_default.error(`Resource ${import_chalk30.default.bold(`"${resourceName}"`)} not found for integration ${import_chalk30.default.bold(`"${integrationSlug}"`)}.`),1;let link2=buildSSOLink(team,configurationId,resource.externalResourceId);return outputLink(client,link2,asJson,resourceName,!0),0}let link=buildSSOLink(team,configurationId);return outputLink(client,link,asJson,integrationSlug,!1),0}function outputLink(client,link,json,name,isResource){if(json)client.stdout.write(`${JSON.stringify({url:link},null,2)}
|
|
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
|
+
`)}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
|
+
`),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})}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
|
+
`),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
|
+
`),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
|
+
`+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(`
|
|
105
|
+
`)}var import_chalk34=__toESM(require_source(),1);var IntegrationDiscoverTelemetryClient=class extends TelemetryClient{trackCliArgumentQuery(v){v&&this.trackCliArgument({arg:"query",value:this.redactedValue})}trackCliOptionCategory(v){if(v?.length)for(let _value of v)this.trackCliOption({option:"category",value:this.redactedValue})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var KNOWN_PROTOCOL_TYPES=new Set(["storage","ai","observability","messaging","compute"]);function resolveTags(productTags,integrationTagIds,categoryTitleById){let result=new Set,allTags=[...integrationTagIds??[],...productTags??[]];for(let tag of allTags)if(tag.startsWith("tag_")){let title3=categoryTitleById.get(tag);result.add(title3??tag.substring(4))}else KNOWN_PROTOCOL_TYPES.has(tag)||result.add(tag.charAt(0).toUpperCase()+tag.slice(1));return[...result]}async function discover2(client,args){let parsedArguments=null,flagsSpecification=getFlagsSpecification(discoverSubcommand2.options);try{parsedArguments=parseArguments(args,flagsSpecification)}catch(error){return printError(error),2}let telemetry=new IntegrationDiscoverTelemetryClient({opts:{store:client.telemetryEventStore}});if(parsedArguments.args.length>1)return output_manager_default.error("Invalid number of arguments. Usage: `vercel integration discover [query]`"),2;let query=parsedArguments.args[0]??"";telemetry.trackCliArgumentQuery(query);let categoryFilters=parsedArguments.flags["--category"];telemetry.trackCliOptionCategory(categoryFilters);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 marketplace integrations...",500);let integrations,categories3=[];try{let[integrationsResult,categoriesResult]=await Promise.allSettled([fetchMarketplaceIntegrationsList(client,categoryFilters),fetchIntegrationCategories(client)]);if(integrationsResult.status==="rejected")throw integrationsResult.reason;integrations=integrationsResult.value,categoriesResult.status==="fulfilled"?categories3=categoriesResult.value:output_manager_default.warn(`Failed to fetch integration categories. Continuing without categories: ${categoriesResult.reason instanceof Error?categoriesResult.reason.message:String(categoriesResult.reason)}`)}catch(error){return output_manager_default.error(`Failed to fetch marketplace integrations: ${error.message}`),1}let categoryTitleById=new Map(categories3.map(category=>[category.id,category.title])),results=[];for(let integration of integrations){if(!integration.isMarketplace||!integration.canInstall)continue;let products=integration.products??[];if(products.length===0)results.push({name:integration.name,slug:integration.slug,provider:integration.name,description:integration.shortDescription??"",tags:resolveTags(void 0,integration.tagIds,categoryTitleById)});else for(let product of products){let needsCompoundSlug=products.length>1||product.slug!==integration.slug;results.push({name:product.name,slug:needsCompoundSlug?`${integration.slug}/${product.slug}`:integration.slug,provider:integration.name,description:product.shortDescription??integration.shortDescription??"",tags:resolveTags(product.tags,integration.tagIds,categoryTitleById)})}}output_manager_default.stopSpinner();let filtered=query?results.filter(product=>matchesSearchTerm2(product,query)):results;if(asJson)return client.stdout.write(`${JSON.stringify({products:filtered},null,2)}
|
|
106
|
+
`),0;if(filtered.length===0)return query?output_manager_default.log(`No marketplace products matching "${query}" found.`):output_manager_default.log("No marketplace products found."),0;let formattedOutput=client.stderr.columns>0&&client.stderr.columns<120?formatCompactList3(filtered):formatTable3(filtered);return output_manager_default.log(`Available marketplace products:
|
|
107
|
+
`+formattedOutput),0}function formatTable3(products){return table([["Product Name","Slug","Provider","Description"].map(header=>import_chalk34.default.bold(import_chalk34.default.cyan(header))),...products.map(product=>[product.name,product.slug,product.provider,product.description||import_chalk34.default.gray("-")])],{hsep:4})}function matchesSearchTerm2(product,term){let lower=term.toLowerCase();return product.name.toLowerCase().includes(lower)||product.slug.toLowerCase().includes(lower)||product.provider.toLowerCase().includes(lower)||product.description.toLowerCase().includes(lower)||product.tags.some(tag=>tag.toLowerCase().includes(lower))}function formatCompactList3(products){return products.map(product=>[`${import_chalk34.default.bold(product.name)} (${product.slug})`,` Provider: ${product.provider}`,` Description: ${product.description||"-"}`].join(`
|
|
108
|
+
`)).join(`
|
|
109
|
+
|
|
110
|
+
`)}var import_chalk35=__toESM(require_source(),1);var IntegrationGuideTelemetryClient=class extends TelemetryClient{trackCliArgumentIntegration(v,known){v&&this.trackCliArgument({arg:"integration",value:known?v:this.redactedValue})}trackCliOptionFramework(v){v&&this.trackCliOption({option:"framework",value:this.redactedValue})}};async function guide(client,subArgs){let flagsSpecification=getFlagsSpecification(guideSubcommand.options),parsedArguments;try{parsedArguments=parseArguments(subArgs,flagsSpecification)}catch(error){return printError(error),2}let telemetry=new IntegrationGuideTelemetryClient({opts:{store:client.telemetryEventStore}}),frameworkFlag=parsedArguments.flags["--framework"];telemetry.trackCliOptionFramework(frameworkFlag);let rawArg=parsedArguments.args[0];if(!rawArg)return output_manager_default.error("You must specify an integration. Usage: vercel integration guide <integration>[/<product>]"),2;let integrationSlug=rawArg.split("/")[0],productSlug=rawArg.includes("/")?rawArg.split("/")[1]:void 0;output_manager_default.spinner("Fetching integration details\u2026",500);let integration;try{integration=await fetchIntegration(client,integrationSlug)}catch(error){return telemetry.trackCliArgumentIntegration(integrationSlug),output_manager_default.error(`Failed to fetch integration "${integrationSlug}": ${error.message}`),1}telemetry.trackCliArgumentIntegration(integrationSlug,!0);let products=integration.products??[];if(products.length===0)return output_manager_default.stopSpinner(),output_manager_default.log(`No products found for integration "${integrationSlug}".`),0;let product;if(productSlug){if(product=products.find(p=>p.slug===productSlug),!product){if(output_manager_default.stopSpinner(),output_manager_default.error(`Product "${productSlug}" not found for integration "${integrationSlug}".`),products.length>1){output_manager_default.log("Available products:");for(let p of products)output_manager_default.log(` ${import_chalk35.default.cyan(p.slug)} ${p.name}`)}return 1}}else if(products.length===1)product=products[0];else{if(output_manager_default.stopSpinner(),!client.stdin.isTTY){output_manager_default.error(`"${integrationSlug}" has multiple products. Specify one with: vercel integration guide ${integrationSlug}/<product>`),output_manager_default.log("Available products:");for(let p of products)output_manager_default.log(` ${import_chalk35.default.cyan(p.slug)} ${p.name}`);return 1}product=await client.input.select({message:`"${integrationSlug}" has multiple products. Select one:`,choices:products.map(p=>({name:`${p.name} (${p.slug})`,value:p}))})}output_manager_default.stopSpinner();let guides=product.guides??[],snippets=product.snippets??[],resourceLinks=product.resourceLinks??[];if(guides.length===0&&snippets.length===0)return output_manager_default.log(`No guides or snippets available for "${product.name}" yet.`),resourceLinks.length>0&&printResourceLinks(client,resourceLinks),0;let selectedGuide;if(guides.length>0)if(frameworkFlag){if(selectedGuide=guides.find(g=>g.framework===frameworkFlag),!selectedGuide){output_manager_default.error(`Framework "${frameworkFlag}" not found for "${product.name}".`),output_manager_default.log("Available frameworks:");for(let g of guides)output_manager_default.log(` ${import_chalk35.default.cyan(g.framework)} ${g.title}`);return 1}}else guides.length===1?selectedGuide=guides[0]:client.stdin.isTTY?selectedGuide=await client.input.select({message:"Select a framework guide:",choices:guides.map(g=>({name:g.title,value:g}))}):selectedGuide=guides[0];return printGuide(client,product,selectedGuide,snippets,resourceLinks),0}function printGuide(client,product,guide2,snippets,resourceLinks){let lines=[];if(lines.push(`# ${product.name}`),lines.push(""),lines.push(product.shortDescription),lines.push(""),guide2){lines.push(`## Getting Started with ${guide2.title}`),lines.push("");for(let i=0;i<guide2.steps.length;i++){let step=guide2.steps[i];lines.push(`### Step ${i+1}: ${step.title}`),lines.push(""),lines.push(step.content),lines.push("")}}if(snippets.length>0){lines.push("## Code Snippets"),lines.push("");for(let snippet of snippets)lines.push(`### ${snippet.name}`),lines.push(""),lines.push(`\`\`\`${snippet.language}`),lines.push(snippet.content),lines.push("```"),lines.push("")}resourceLinks.length>0&&appendResourceLinks(resourceLinks,lines),client.stdout.write(`${lines.join(`
|
|
111
|
+
`)}
|
|
112
|
+
`)}function appendResourceLinks(links,lines){lines.push("## Resources"),lines.push("");for(let link of links)lines.push(`- [${link.title}](${link.href})`);lines.push("")}function printResourceLinks(client,links){let lines=[];appendResourceLinks(links,lines),client.stdout.write(`${lines.join(`
|
|
113
|
+
`)}
|
|
114
|
+
`)}async function fetchAllMarketplaceInstallations(client){let searchParams=new URLSearchParams;return searchParams.set("view","account"),searchParams.set("installationType","marketplace"),client.fetch(`/v2/integrations/configurations?${searchParams}`,{json:!0})}var import_chalk36=__toESM(require_source(),1);function pickIntegrationKey(row){let integration=row.integration;return integration&&typeof integration.slug=="string"?integration.slug:typeof row.integrationId=="string"?row.integrationId:"-"}function redactPaymentSecrets(value){return Array.isArray(value)?value.map(redactPaymentSecrets):!value||typeof value!="object"?value:Object.fromEntries(Object.entries(value).map(([key,child])=>{if(key==="paymentIntent"&&child&&typeof child=="object"){let{clientSecret:_clientSecret,...rest}=child;return[key,redactPaymentSecrets(rest)]}return[key,redactPaymentSecrets(child)]}))}async function installationsList(client,argv){let spec=getFlagsSpecification(installationsSubcommand.options),parsed;try{parsed=parseArguments(argv,spec)}catch(e){return printError(e),2}let fr=validateJsonOutput(parsed.flags);if(!fr.valid)return output_manager_default.error(fr.error),1;if(parsed.args.length>0)return output_manager_default.error("Invalid number of arguments. Usage: `vercel integration installations [--integration <slug>] [--json]`"),2;let filterSlug=parsed.flags["--integration"],{team}=await getScope(client);if(!team)return output_manager_default.error("No team context. Run `vercel switch` or use --scope."),1;try{let rows=await fetchAllMarketplaceInstallations(client),filtered=filterSlug?rows.filter(r=>pickIntegrationKey(r)===filterSlug||String(r.integrationId)===filterSlug):rows;if(fr.jsonOutput)return client.stdout.write(`${JSON.stringify({installations:redactPaymentSecrets(filtered)},null,2)}
|
|
115
|
+
`),0;if(filtered.length===0)return output_manager_default.log("No marketplace installations found."),0;let lines=[["Installation","Integration","Owner"].map(h=>import_chalk36.default.cyan(h)),...filtered.map(r=>{let id=String(r.id??r.integrationConfigurationId??"-"),integ=pickIntegrationKey(r),owner=String(r.ownerId??"-");return[id,integ,owner]})];return output_manager_default.print(`
|
|
116
|
+
${table(lines,{hsep:2}).replace(/^/gm," ")}
|
|
117
|
+
`),0}catch(err){if(isAPIError(err))return output_manager_default.error(err.serverMessage||`Could not list installations (${err.status}). If your API version requires a specific integration, pass --integration <slug>.`),1;throw err}}var import_chalk37=__toESM(require_source(),1);async function installMarketplaceIntegration(client,integrationIdOrSlug,acceptedPolicies){return client.fetch(`/v2/integrations/integration/${encodeURIComponent(integrationIdOrSlug)}/marketplace/install`,{method:"POST",json:!0,body:{acceptedPolicies,source:"cli"}})}var INTEGRATIONS_SUPPORTING_YES=new Set(["neon"]);function logPolicyLinksSummary(links){output_manager_default.log(`Marketplace addendum: ${links.marketplace_addendum}`),links.integration_privacy_policy&&output_manager_default.log(`Privacy policy: ${links.integration_privacy_policy}`),links.integration_eula&&output_manager_default.log(`Terms of service: ${links.integration_eula}`)}async function acceptTerms(client,argv){let spec=getFlagsSpecification(acceptTermsSubcommand.options),parsed;try{parsed=parseArguments(argv,spec)}catch(e){return printError(e),2}let formatResult=validateJsonOutput(parsed.flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let preferJson=formatResult.jsonOutput||shouldEmitNonInteractiveCommandError(client);if(parsed.args.length<1){let msg=`Missing integration slug. Example: \`${packageName} integration accept-terms <integration>\``;return outputAgentError(client,{status:"error",reason:AGENT_REASON.MISSING_ARGUMENTS,message:msg,next:[{command:buildCommandWithGlobalFlags(client.argv,"integration discover",packageName,{prependGlobalFlags:!0}),when:"Find integration slugs"}]},2),output_manager_default.error(msg),2}if(parsed.args.length>1){let msg="Specify only one integration at a time.";return outputAgentError(client,{status:"error",reason:AGENT_REASON.INVALID_ARGUMENTS,message:msg},2),output_manager_default.error(msg),2}let integrationSlug=parsed.args[0],yes=!!parsed.flags["--yes"],{team}=await getScope(client);if(!team)return output_manager_default.error("Team not found. Run `vercel switch` or use --scope."),1;client.config.currentTeam=team.id;let integration;try{integration=await fetchIntegration(client,integrationSlug)}catch(error){let msg=isAPIError(error)&&error.serverMessage||error.message;return output_manager_default.error(`Failed to load integration "${integrationSlug}": ${msg}`),1}if(yes&&!INTEGRATIONS_SUPPORTING_YES.has(integration.slug)){let msg=`The --yes flag is not supported for integration "${integration.slug}". Run \`${packageName} integration accept-terms ${integration.slug}\` without --yes in an interactive terminal to accept the terms.`;return outputAgentError(client,{status:"error",reason:AGENT_REASON.INVALID_ARGUMENTS,message:msg,policy_links:getMarketplacePolicyLinks(integration)},2),output_manager_default.error(msg),2}if(integration.capabilities?.requiresBrowserInstall){let msg=`Integration "${integration.slug}" requires accepting terms in the browser (or device attestation). Use \`${packageName} integration add ${integration.slug}\` instead.`;return outputAgentError(client,{status:"error",reason:AGENT_REASON.INVALID_ARGUMENTS,message:msg,policy_links:getMarketplacePolicyLinks(integration),hint:"The dashboard accept-terms flow is required for this integration.",next:[{command:buildCommandWithGlobalFlags(client.argv,`integration add ${integration.slug}`,packageName,{prependGlobalFlags:!0}),when:"Open browser / complete required install steps"}]},2),output_manager_default.error(msg),2}let existing=(await fetchInstallations(client,integration)).find(i=>i.ownerId===team.id&&i.installationType==="marketplace"),policyLinks=getMarketplacePolicyLinks(integration);if(existing)return preferJson?(client.stdout.write(`${JSON.stringify({integration:integration.slug,installationId:existing.id,alreadyInstalled:!0,policy_links:policyLinks},null,2)}
|
|
118
|
+
`),0):(output_manager_default.log(`Integration ${import_chalk37.default.bold(integration.slug)} is already installed for this team.`),0);let acceptedPolicies;if(yes)acceptedPolicies=buildAcceptedPolicies(integration);else if(shouldEmitNonInteractiveCommandError(client)){let msg="Marketplace terms cannot be accepted in non-interactive mode. Run this command in an interactive terminal as a human.";return outputAgentError(client,{status:"error",reason:AGENT_REASON.INTEGRATION_TERMS_ACCEPTANCE_REQUIRED,message:msg,policy_links:getMarketplacePolicyLinks(integration),hint:`Open the policy links, then run \`${packageName} integration accept-terms ${integration.slug}\` interactively.`},1),output_manager_default.error(msg),1}else if(acceptedPolicies=await promptForTermAcceptance(client,integration),!acceptedPolicies)return 1;try{let result=await installMarketplaceIntegration(client,integration.id,acceptedPolicies);return preferJson?(client.stdout.write(`${JSON.stringify({integration:integration.slug,installationId:result.id,installed:!0,policy_links:policyLinks},null,2)}
|
|
119
|
+
`),0):(output_manager_default.success(`Terms accepted. Integration ${import_chalk37.default.bold(integration.slug)} is installed for this team.`),logPolicyLinksSummary(policyLinks),0)}catch(error){if(isAPIError(error)&&error.status===409)return preferJson?(client.stdout.write(`${JSON.stringify({integration:integration.slug,alreadyInstalled:!0,policy_links:policyLinks},null,2)}
|
|
120
|
+
`),0):(output_manager_default.log(`Integration ${import_chalk37.default.bold(integration.slug)} is already installed for this team.`),0);let msg=isAPIError(error)&&error.serverMessage||error.message;return output_manager_default.error(`Failed to accept terms for "${integration.slug}": ${msg}`),1}}var COMMAND_CONFIG4={add:getCommandAliases(addSubcommand),"accept-terms":getCommandAliases(acceptTermsSubcommand),open:getCommandAliases(openSubcommand2),list:getCommandAliases(listSubcommand2),installations:getCommandAliases(installationsSubcommand),categories:getCommandAliases(categoriesSubcommand2),discover:getCommandAliases(discoverSubcommand2),guide:getCommandAliases(guideSubcommand),balance:getCommandAliases(balanceSubcommand),remove:getCommandAliases(removeSubcommand3),resource:getCommandAliases(resourceSubcommand),update:getCommandAliases(updateSubcommand2)};async function main2(client){let telemetry=new IntegrationTelemetryClient({opts:{store:client.telemetryEventStore}}),{args,flags}=parseArguments(client.argv.slice(2),getFlagsSpecification(integrationCommand.options),{permissive:!0}),{subcommand,subcommandOriginal,args:subArgs}=getSubcommand2(args.slice(1),COMMAND_CONFIG4),needHelp=flags["--help"];function printHelp(command){output_manager_default.print(help(command,{columns:client.stderr.columns,parent:integrationCommand}))}function printHelpToStdout(command){client.stdout.write(help(command,{columns:client.stderr.columns,parent:integrationCommand}))}if(!subcommand&&needHelp)return telemetry.trackCliFlagHelp("integration"),output_manager_default.print(help(integrationCommand,{columns:client.stderr.columns})),0;switch(subcommand){case"add":{if(needHelp)return telemetry.trackCliFlagHelp("integration",subcommandOriginal),await printAddDynamicHelp(client,subArgs[0],addSubcommand,printHelpToStdout,"integration add")||printHelpToStdout(addSubcommand),0;telemetry.trackCliSubcommandAdd(subcommandOriginal),subcommandOriginal==="install"&&warnDeprecatedSubcommand(client,"integration install","integration add");let addFlagsSpec=getFlagsSpecification(addSubcommand.options),addParsedArgs;try{addParsedArgs=parseArguments(subArgs,addFlagsSpec)}catch(error){return printError(error),2}return add2(client,addParsedArgs.args,addParsedArgs.flags,"integration add")}case"accept-terms":return needHelp?(telemetry.trackCliFlagHelp("integration",subcommandOriginal),printHelp(acceptTermsSubcommand),0):(telemetry.trackCliSubcommandAcceptTerms(subcommandOriginal),acceptTerms(client,subArgs));case"list":return needHelp?(telemetry.trackCliFlagHelp("integration",subcommandOriginal),printHelp(listSubcommand2),0):(telemetry.trackCliSubcommandList(subcommandOriginal),list2(client));case"installations":return needHelp?(telemetry.trackCliFlagHelp("integration",subcommandOriginal),printHelp(installationsSubcommand),0):(telemetry.trackCliSubcommandInstallations(subcommandOriginal),installationsList(client,subArgs));case"categories":return needHelp?(telemetry.trackCliFlagHelp("integration",subcommandOriginal),printHelp(categoriesSubcommand2),0):(telemetry.trackCliSubcommandCategories(subcommandOriginal),categories2(client,subArgs));case"discover":return needHelp?(telemetry.trackCliFlagHelp("integration",subcommandOriginal),printHelp(discoverSubcommand2),0):(telemetry.trackCliSubcommandDiscover(subcommandOriginal),discover2(client,subArgs));case"guide":return needHelp?(telemetry.trackCliFlagHelp("integration",subcommandOriginal),printHelp(guideSubcommand),0):(telemetry.trackCliSubcommandGuide(subcommandOriginal),guide(client,subArgs));case"balance":return needHelp?(telemetry.trackCliFlagHelp("integration",subcommandOriginal),printHelp(balanceSubcommand),0):(telemetry.trackCliSubcommandBalance(subcommandOriginal),balance(client));case"open":return needHelp?(telemetry.trackCliFlagHelp("integration",subcommandOriginal),printHelp(openSubcommand2),0):(telemetry.trackCliSubcommandOpen(subcommandOriginal),openIntegration(client,subArgs));case"remove":return needHelp?(telemetry.trackCliFlagHelp("integration",subcommandOriginal),printHelp(removeSubcommand3),0):(telemetry.trackCliSubcommandRemove(subcommandOriginal),remove3(client,subArgs));case"resource":return subArgs.length===0&&needHelp?(telemetry.trackCliFlagHelp("integration",subcommandOriginal),printHelp(resourceSubcommand),0):(telemetry.trackCliSubcommandResource(subcommandOriginal),dispatchResourceSubcommand(client,subArgs,!!needHelp,{helpBreadcrumb:"integration resource",parentForChildHelp:resourceSubcommand}));case"update":return needHelp?(telemetry.trackCliFlagHelp("integration",subcommandOriginal),printHelp(updateSubcommand2),0):(telemetry.trackCliSubcommandUpdate(subcommandOriginal),update2(client,subArgs));default:{let validSubcommands=Object.keys(COMMAND_CONFIG4).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,hint:missingSubcommand?`Pass a subcommand after \`integration\`, for example \`${packageName} integration installations\` or \`${packageName} integration list\`. Global flags such as \`--cwd\` may appear anywhere.`:`Check the spelling or run \`${packageName} integration --help\` for the list of subcommands.`,next:[{command:buildCommandWithGlobalFlags(client.argv,"integration --help",packageName,{prependGlobalFlags:!0}),when:"Show all integration subcommands and options"},...missingSubcommand?[{command:buildCommandWithGlobalFlags(client.argv,"integration installations",packageName,{prependGlobalFlags:!0}),when:"List marketplace installations for the current team"}]:[]]},2),output_manager_default.error(message),2}}}var StorageTelemetryClient=class extends TelemetryClient{trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandCreate(actual){this.trackCliSubcommand({subcommand:"create",value:actual})}trackCliSubcommandInspect(actual){this.trackCliSubcommand({subcommand:"inspect",value:actual})}trackCliSubcommandDelete(actual){this.trackCliSubcommand({subcommand:"delete",value:actual})}trackCliSubcommandConnect(actual){this.trackCliSubcommand({subcommand:"connect",value:actual})}trackCliSubcommandStatus(actual){this.trackCliSubcommand({subcommand:"status",value:actual})}trackCliSubcommandUpdate(actual){this.trackCliSubcommand({subcommand:"update",value:actual})}trackCliSubcommandDisconnect(actual){this.trackCliSubcommand({subcommand:"disconnect",value:actual})}};var import_chalk40=__toESM(require_source(),1);var STORAGE_AUTH_MODES=["oidc","token"],DEFAULT_STORAGE_AUTH_MODE="oidc";function parseAuthMode(value){if(value===void 0)return{valid:!0,mode:DEFAULT_STORAGE_AUTH_MODE,explicit:!1};let normalized=value.toLowerCase();return STORAGE_AUTH_MODES.includes(normalized)?{valid:!0,mode:normalized,explicit:!0}:{valid:!1,error:`Invalid --auth value: "${value}". Must be one of: ${STORAGE_AUTH_MODES.join(", ")}.`}}function resolveStorageAuth({store,mode,addRwToken}){let product=storeProductLabel(store);return storeSupportsOidc(store)?mode==="token"&&!addRwToken?{valid:!1,reason:"rw_token_opt_in_required",error:"--auth token writes a long-lived read-write token into your project.",hint:"Pass --add-rw-token to confirm, or drop --auth token to use the OIDC default."}:mode==="token"?{valid:!0,auth:{requested:mode,effective:"token",useOidcHeader:!1,readWriteToken:!0,notes:[]}}:{valid:!0,auth:{requested:mode,effective:"oidc",useOidcHeader:!0,readWriteToken:addRwToken,notes:addRwToken?["The static read-write token is written alongside the OIDC variables because --add-rw-token was passed."]:[]}}:addRwToken?{valid:!1,reason:"unsupported_auth_mode",error:`--add-rw-token only applies to Vercel Blob stores. ${store.name} is a ${product} resource, and its credentials are issued by the provider.`,hint:"Re-run without --add-rw-token."}:{valid:!0,auth:{requested:mode,effective:"provider-managed",useOidcHeader:mode==="oidc",readWriteToken:!1,notes:[`${product} issues its own credentials for this resource; Vercel OIDC does not apply.`]}}}function storageAuthHeaders(auth){return auth.useOidcHeader?{"x-vercel-use-oidc":"1"}:{}}function describeStorageAuth(auth){switch(auth.effective){case"oidc":return auth.readWriteToken?"oidc + static read-write token":"oidc (no static credentials)";case"token":return"static read-write token";case"provider-managed":return"provider-managed credentials"}}function inferConnectionAuth(store,environmentVariables){if(!storeSupportsOidc(store))return"provider-managed";if(!environmentVariables)return"unknown";let hasStoreId=environmentVariables.some(name=>name.endsWith("_STORE_ID")),hasRwToken=environmentVariables.some(name=>name.endsWith("_READ_WRITE_TOKEN"));return hasStoreId?"oidc":hasRwToken?"token":"unknown"}async function connectStoreToProject(client,{store,projectId,environments,envVarPrefix,auth,accountId}){await client.fetch(`/v1/storage/stores/${encodeURIComponent(store.id)}/connections`,{json:!0,method:"POST",headers:storageAuthHeaders(auth),body:{projectId,envVarEnvironments:environments,...envVarPrefix!==void 0?{envVarPrefix}:{},...storeSupportsOidc(store)&&!auth.readWriteToken?{skipReadWriteToken:!0}:{}},accountId})}async function updateStoreConnection(client,{store,connectionId,environments,envVarPrefix,skipReadWriteToken,accountId}){await client.fetch(`/v1/storage/stores/${encodeURIComponent(store.id)}/connections/${encodeURIComponent(connectionId)}`,{json:!0,method:"PATCH",body:{...environments!==void 0?{envVarEnvironments:environments}:{},...envVarPrefix!==void 0?{envVarPrefix}:{},...skipReadWriteToken!==void 0?{skipReadWriteToken}:{}},accountId})}async function upgradeStoreConnectionToOidc(client,{store,connectionId,auth,accountId}){await client.fetch(`/v1/storage/stores/${encodeURIComponent(store.id)}/connections/${encodeURIComponent(connectionId)}/upgrade-to-oidc`,{json:!0,method:"POST",headers:storageAuthHeaders(auth),accountId})}async function disconnectStoreConnection(client,{store,connectionId,accountId}){await client.fetch(`/v1/storage/stores/${encodeURIComponent(store.id)}/connections/${encodeURIComponent(connectionId)}`,{json:!0,method:"DELETE",accountId})}async function disconnectAllStoreConnections(client,{store,accountId}){await client.fetch(`/v1/storage/stores/${encodeURIComponent(store.id)}/connections`,{json:!0,method:"DELETE",accountId})}var ENV_VAR_PREFIX_PATTERN=/^[a-zA-Z][a-zA-Z0-9_]*$/;function normalizeEnvVarPrefix(prefix){if(prefix==null)return;let canonical=prefix.replace(/_+$/,"");return canonical.length>0?canonical:void 0}var BLOB_DEFAULT_PREFIX="BLOB";function blobEnvVarNames(prefix){let base=normalizeEnvVarPrefix(prefix)??BLOB_DEFAULT_PREFIX;return{readWriteToken:`${base}_READ_WRITE_TOKEN`,storeId:`${base}_STORE_ID`,webhookPublicKey:`${base}_WEBHOOK_PUBLIC_KEY`}}function emptyPlan(source){return{add:[],remove:[],keep:[],source,notes:[]}}function sorted(names){return[...new Set(names)].sort()}function difference(a,b){let exclude=new Set(b);return sorted(a.filter(name=>!exclude.has(name)))}function intersection(a,b){let include=new Set(b);return sorted(a.filter(name=>include.has(name)))}function desiredBlobNames({auth,prefix,hasOidcVars}){let names=blobEnvVarNames(prefix),desired=[];return(auth.effective==="oidc"||hasOidcVars)&&desired.push(names.storeId,names.webhookPublicKey),auth.readWriteToken&&desired.push(names.readWriteToken),sorted(desired)}function planConnectEnvVars({store,auth,prefix,sibling}){return storeSupportsOidc(store)?{add:desiredBlobNames({auth,prefix,hasOidcVars:!1}),remove:[],keep:[],source:"computed",notes:[]}:sibling!==void 0&&normalizeEnvVarPrefix(sibling.envVarPrefix)===normalizeEnvVarPrefix(prefix)&&sibling?.environmentVariables&&sibling.environmentVariables.length>0?{add:sorted(sibling.environmentVariables),remove:[],keep:[],source:"connection",notes:[`Names mirror this store's existing connection to ${sibling.name}.`]}:{...emptyPlan("provider"),notes:[`${storeProductLabel(store)} names the variables for this resource. The exact list is reported once the connection is created.`]}}function planUpdateEnvVars({store,auth,prefix,connection,prefixChanged}){let current=sorted(connection.environmentVariables??[]);if(storeSupportsOidc(store)){let hasOidcVars=current.some(name=>name.endsWith("_STORE_ID")),desired=desiredBlobNames({auth,prefix,hasOidcVars}),plan={add:difference(desired,current),remove:difference(current,desired),keep:intersection(current,desired),source:"computed",notes:[]};return hasOidcVars&&auth.effective==="token"&&plan.notes.push("The OIDC variables stay in place \u2014 Vercel does not remove them once a connection has been upgraded."),plan}return current.length?prefixChanged?{add:[],remove:current,keep:[],source:"provider",notes:[`${storeProductLabel(store)} names the variables for this resource, so the re-prefixed names are reported once the update is applied.`]}:{add:[],remove:[],keep:current,source:"connection",notes:["The variables are re-scoped, not renamed."]}:{...emptyPlan("provider"),notes:[`${storeProductLabel(store)} names the variables for this resource. The exact list is reported once the update is applied.`]}}function diffEnvVarNames(before,after){return{add:difference(after,before),remove:difference(before,after),keep:intersection(before,after),source:"connection",notes:[]}}function planDisconnectEnvVars(connections){let known=connections.flatMap(connection=>connection.environmentVariables??[]),anyUnknown=connections.some(connection=>connection.environmentVariables===void 0);return!known.length&&anyUnknown?{...emptyPlan("provider"),notes:["Vercel did not report the variable names for this connection; every variable it owns is removed."]}:{add:[],remove:sorted(known),keep:[],source:"connection",notes:[]}}var import_chalk38=__toESM(require_source(),1);function buildStoragePlan({action,dryRun,store,projects,environments,envVarPrefix,auth,envVars}){return{action,dryRun,store:{id:store.id,name:store.name,type:store.type??"unknown",product:storeProductLabel(store)},projects,environments,envVarPrefix:envVarPrefix??null,...auth?{auth:{requested:auth.requested,effective:auth.effective,readWriteToken:auth.readWriteToken}}:{},envVars:{add:envVars.add,remove:envVars.remove,keep:envVars.keep,source:envVars.source,notes:[...auth?.notes??[],...envVars.notes]}}}var ACTION_TITLES={connect:"Storage connect plan",update:"Storage update plan",disconnect:"Storage disconnect plan"};function formatStoragePlan(plan){let lines=[`${import_chalk38.default.bold(ACTION_TITLES[plan.action])}${plan.dryRun?import_chalk38.default.dim(" (dry run)"):""}`,formatAlignedLabel("Store",`${plan.store.name} ${import_chalk38.default.dim(`(${plan.store.id})`)} \xB7 ${plan.store.product}`),formatAlignedLabel(plan.projects.length===1?"Project":"Projects",plan.projects.length?plan.projects.map(project=>`${project.name} ${import_chalk38.default.dim(`(${project.id})`)}`).join(", "):import_chalk38.default.dim("none"))];plan.environments.length&&lines.push(formatAlignedLabel("Environments",plan.environments.join(", "))),lines.push(formatAlignedLabel("Prefix",plan.envVarPrefix??import_chalk38.default.dim("none (product default)"))),plan.auth&&lines.push(formatAlignedLabel("Credentials",describeStorageAuth(plan.auth)));let changes=[...plan.envVars.add.map(name=>import_chalk38.default.green(`+ ${name}`)),...plan.envVars.remove.map(name=>import_chalk38.default.red(`- ${name}`)),...plan.envVars.keep.map(name=>import_chalk38.default.dim(`= ${name}`))];if(changes.length){lines.push(formatAlignedLabel("Env vars",changes[0]));for(let change of changes.slice(1))lines.push(formatAlignedLabel("",change))}else lines.push(formatAlignedLabel("Env vars",import_chalk38.default.dim(plan.envVars.source==="provider"?"names unavailable":"no changes")));for(let note of plan.envVars.notes)lines.push(formatAlignedLabel("Note",import_chalk38.default.dim(note)));return`${lines.join(`
|
|
121
|
+
`)}
|
|
122
|
+
`}var StorageConnectTelemetryClient=class extends TelemetryClient{trackCliArgumentStore(v){v&&this.trackCliArgument({arg:"store",value:this.redactedValue})}trackCliOptionProject(v){v&&this.trackCliOption({option:"project",value:this.redactedValue})}trackCliOptionEnvironment(v){v?.length&&this.trackCliOption({option:"environment",value:this.redactedValue})}trackCliOptionAuth(v){v&&this.trackCliOption({option:"auth",value:STORAGE_AUTH_MODES.includes(v.toLowerCase())?v.toLowerCase():this.redactedValue})}trackCliFlagAddRwToken(v){v&&this.trackCliFlag("add-rw-token")}trackCliOptionPrefix(v){v&&this.trackCliOption({option:"prefix",value:this.redactedValue})}trackCliFlagDryRun(v){v&&this.trackCliFlag("dry-run")}trackCliFlagYes(v){v&&this.trackCliFlag("yes")}trackCliFlagJson(v){v&&this.trackCliFlag("json")}};var import_chalk39=__toESM(require_source(),1);function failWith(client,{reason,message,hint,next}){let payload={status:AGENT_STATUS.ERROR,reason,message,...hint?{hint}:{},...next?{next}:{}};return outputAgentError(client,payload),wantsMachineReadableOutput(void 0,client.argv)&&client.stdout.write(`${JSON.stringify(payload,null,2)}
|
|
123
|
+
`),output_manager_default.error(message),hint&&output_manager_default.log(hint),getExitCodeForReason(reason)}async function resolveStorageScope(client,projectNameOrId){let link=await resolveProjectContext({client,projectNameOrId});return link.status==="error"?link.exitCode:link.status==="not_linked"?failWith(client,{reason:AGENT_REASON.NOT_LINKED,message:"No project resolved. Pass --project <name-or-id>, or link this directory first.",next:[{command:getCommandNamePlain("link"),when:"link this directory to a project"}]}):(client.config.currentTeam=link.org.type==="team"?link.org.id:void 0,{project:{id:link.project.id,name:link.project.name},accountId:link.org.id,teamSlug:link.org.slug})}async function resolveStorageAccount(client){let link=await getLinkedProject(client);if(link.status==="error")return link.exitCode;if(link.status==="linked")return client.config.currentTeam=link.org.type==="team"?link.org.id:void 0,{accountId:link.org.id,teamSlug:link.org.slug,linkedProject:{id:link.project.id,name:link.project.name}};let{team}=await getScope(client);return client.config.currentTeam=team?.id,{accountId:team?.id,teamSlug:team?.slug,linkedProject:void 0}}function labelFor(key){return key.replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\burl\b/i,"URL").replace(/\bid\b/i,"ID").replace(/^./,first=>first.toUpperCase())}async function resolveStorageStore(client,identifier,accountId,options={}){output_manager_default.spinner("Retrieving storage resources\u2026",500);let stores;try{stores=await getStorageStores(client,{accountId})}finally{output_manager_default.stopSpinner()}options.type&&(stores=stores.filter(store=>storeMatchesType(store,options.type)));let result=resolveStore(stores,identifier);if(result.status==="found")return result.store;if(result.status==="ambiguous"){let candidates=result.matches.map(store=>`${store.id} (${storeTypeName(store)})`).join(", ");return failWith(client,{reason:"ambiguous_store",message:`More than one storage resource is named ${identifier}: ${candidates}. Pass --type <type> or a store ID instead.`})}return failWith(client,{reason:AGENT_REASON.NOT_FOUND,message:`No storage resource ${identifier} found in this scope.`,next:[{command:getCommandNamePlain("storage list"),when:"list the storage resources in this scope"}]})}function resolveEnvironments(environmentFlags){if(!environmentFlags?.length)return{valid:!0,environments:[...VALID_ENVIRONMENTS],explicit:!1};let validation=validateEnvironments(environmentFlags);return validation.valid?{valid:!0,environments:[...new Set(environmentFlags)],explicit:!0}:{valid:!1,message:`Invalid environment value: ${validation.invalid.map(value=>`"${value}"`).join(", ")}. Must be one of: ${VALID_ENVIRONMENTS.join(", ")}.`}}function resolvePrefix(prefix){return prefix===void 0?{valid:!0,prefix:void 0}:ENV_VAR_PREFIX_PATTERN.test(prefix)?{valid:!0,prefix:normalizeEnvVarPrefix(prefix)}:{valid:!1,message:"Invalid --prefix value. It must start with a letter and contain only letters, digits, and underscores."}}function printStoragePlan(client,plan,asJson){if(asJson){client.stdout.write(`${JSON.stringify(plan,null,2)}
|
|
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
|
+
`);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
|
+
`),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 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
|
+
`);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
|
+
`),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
|
+
`),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(`
|
|
131
|
+
`)}var import_chalk45=__toESM(require_source(),1);var StorageListTelemetryClient=class extends TelemetryClient{trackCliOptionType(v){v&&this.trackCliOption({option:"type",value:getStorageProvider(v)?.type??this.redactedValue})}trackCliFlagJson(v){v&&this.trackCliFlag("json")}};async function list3(client,argv){let telemetry=new StorageListTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(listSubcommand3.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,typeFlag=flags["--type"];if(telemetry.trackCliOptionFormat(flags["--format"]),telemetry.trackCliFlagJson(flags["--json"]),telemetry.trackCliOptionType(typeFlag),args.length>0)return failWith(client,{reason:AGENT_REASON.INVALID_ARGUMENTS,message:"Too many arguments. Usage: `vercel storage list [--type <type>]`."});let typeFilter=typeFlag?getStorageProvider(typeFlag)?.type??typeFlag.toLowerCase():void 0,account=await resolveStorageAccount(client);if(typeof account=="number")return account;let stores;output_manager_default.spinner("Retrieving storage resources\u2026",500);try{stores=await getStorageStores(client,{accountId:account.accountId})}catch(error){return output_manager_default.stopSpinner(),printError(error),1}output_manager_default.stopSpinner();let entries=stores.filter(store=>!typeFilter||storeMatchesType(store,typeFilter)).map(summarizeStore2);return asJson?(client.stdout.write(`${JSON.stringify({stores:entries},null,2)}
|
|
132
|
+
`),0):entries.length===0?(typeFilter?output_manager_default.log(`No storage resources of type ${import_chalk45.default.bold(typeFilter)} found in this scope. Known types: ${listStorageProviderTypes().join(", ")}.`):output_manager_default.log(`No storage resources found in this scope. Run ${getCommandName("storage create <name> --type <type>")} to create one.`),0):(printListTable(entries),0)}function summarizeStore2(store){let projects=new Map;for(let connection of getConnections(store))projects.set(connection.projectId,connection.name);return{id:store.id,name:store.name,type:storeTypeName(store),product:storeProductLabel(store),status:store.status??null,projects:[...projects.entries()].map(([id,name])=>({id,name}))}}function printListTable(entries){let rows=[["Store","ID","Product","Status","Projects"].map(header=>import_chalk45.default.bold(import_chalk45.default.cyan(header)))];for(let entry of entries)rows.push([entry.name,import_chalk45.default.dim(entry.id),entry.product,entry.status??import_chalk45.default.dim("\u2013"),entry.projects.length?entry.projects.map(project=>project.name).join(", "):import_chalk45.default.dim("not connected")]);output_manager_default.print(`${table(rows,{hsep:3}).replace(/^/gm," ")}
|
|
133
|
+
|
|
134
|
+
`)}var import_chalk46=__toESM(require_source(),1);var StorageStatusTelemetryClient=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")}trackCliFlagJson(v){v&&this.trackCliFlag("json")}};async function status(client,argv){let telemetry=new StorageStatusTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(statusSubcommand.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,all=flags["--all"]??!1,storeIdentifier=args[0];if(telemetry.trackCliOptionFormat(flags["--format"]),telemetry.trackCliFlagJson(flags["--json"]),telemetry.trackCliFlagAll(all),telemetry.trackCliOptionProject(flags["--project"]),telemetry.trackCliArgumentStore(storeIdentifier),args.length>1)return failWith(client,{reason:AGENT_REASON.INVALID_ARGUMENTS,message:"Too many arguments. Usage: `vercel storage status [store]`."});if(all&&flags["--project"])return failWith(client,{reason:AGENT_REASON.INVALID_ARGUMENTS,message:"--all and --project cannot be combined."});let needsProject=!!flags["--project"]||!all&&!storeIdentifier,accountId,project;if(needsProject){let scope=await resolveStorageScope(client,flags["--project"]);if(typeof scope=="number")return scope;accountId=scope.accountId,project=scope.project}else{let{team}=await getScope(client);client.config.currentTeam=team?.id,accountId=team?.id}let stores;if(storeIdentifier){let store=await resolveStorageStore(client,storeIdentifier,accountId);if(typeof store=="number")return store;stores=[store]}else{output_manager_default.spinner("Retrieving storage resources\u2026",500);try{stores=await getStorageStores(client,{accountId})}catch(error){return output_manager_default.stopSpinner(),printError(error),1}output_manager_default.stopSpinner()}let scopedProjectId=project?.id,summaries=stores.map(store=>summarizeStore3(store,scopedProjectId)).filter(summary=>all||storeIdentifier||summary.connections.length>0);return asJson?(client.stdout.write(`${JSON.stringify({stores:summaries},null,2)}
|
|
135
|
+
`),0):summaries.length===0?(output_manager_default.log(project?`No storage resources are connected to ${import_chalk46.default.bold(project.name)}. Use ${getCommandName("storage status --all")} to list every resource in this scope.`:"No storage resources found in this scope."),0):(printStatusTable(summaries),0)}function summarizeStore3(store,projectId){let connections=getConnections(store).filter(connection=>!projectId||connection.projectId===projectId);return{id:store.id,name:store.name,type:store.type??"unknown",product:storeProductLabel(store),status:store.status??null,connections:connections.map(connection=>summarizeConnection(store,connection))}}function summarizeConnection(store,connection){return{id:connection.id,project:{id:connection.projectId,name:connection.name},environments:connection.environments,envVarPrefix:connection.envVarPrefix??null,auth:inferConnectionAuth(store,connection.environmentVariables),environmentVariables:connection.environmentVariables??null}}function formatAuthCell(connection){return connection.auth==="unknown"?import_chalk46.default.dim("unknown"):describeStorageAuth({effective:connection.auth,readWriteToken:(connection.environmentVariables??[]).some(name=>name.endsWith("_READ_WRITE_TOKEN"))})}function printStatusTable(summaries){let rows=[["Store","Product","Project","Environments","Credentials","Env vars"].map(header=>import_chalk46.default.bold(import_chalk46.default.cyan(header)))];for(let store of summaries){if(store.connections.length===0){rows.push([store.name,store.product,import_chalk46.default.dim("not connected"),import_chalk46.default.dim("\u2013"),import_chalk46.default.dim("\u2013"),import_chalk46.default.dim("\u2013")]);continue}for(let[index,connection]of store.connections.entries())rows.push([index===0?store.name:"",index===0?store.product:"",connection.project.name,connection.environments.join(", "),formatAuthCell(connection),connection.environmentVariables?.length?connection.environmentVariables.join(", "):import_chalk46.default.dim("\u2013")])}output_manager_default.print(`${table(rows,{hsep:3}).replace(/^/gm," ")}
|
|
136
|
+
|
|
137
|
+
`)}var import_chalk47=__toESM(require_source(),1);var StorageUpdateTelemetryClient=class extends TelemetryClient{trackCliArgumentStore(v){v&&this.trackCliArgument({arg:"store",value:this.redactedValue})}trackCliOptionProject(v){v&&this.trackCliOption({option:"project",value:this.redactedValue})}trackCliOptionEnvironment(v){v?.length&&this.trackCliOption({option:"environment",value:this.redactedValue})}trackCliOptionAuth(v){v&&this.trackCliOption({option:"auth",value:STORAGE_AUTH_MODES.includes(v.toLowerCase())?v.toLowerCase():this.redactedValue})}trackCliFlagAddRwToken(v){v&&this.trackCliFlag("add-rw-token")}trackCliOptionPrefix(v){v&&this.trackCliOption({option:"prefix",value:this.redactedValue})}trackCliFlagDryRun(v){v&&this.trackCliFlag("dry-run")}trackCliFlagYes(v){v&&this.trackCliFlag("yes")}trackCliFlagJson(v){v&&this.trackCliFlag("json")}};function sameEnvironments(a,b){if(a.length!==b.length)return!1;let left=new Set(a);return b.every(value=>left.has(value))}async function update3(client,argv){let telemetry=new StorageUpdateTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(updateSubcommand3.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,addRwTokenFlag=flags["--add-rw-token"]??!1;if(telemetry.trackCliOptionFormat(flags["--format"]),telemetry.trackCliFlagJson(flags["--json"]),telemetry.trackCliFlagYes(skipConfirmation),telemetry.trackCliFlagDryRun(dryRun),telemetry.trackCliFlagAddRwToken(addRwTokenFlag),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 update <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 environmentsFlag=resolveEnvironments(flags["--environment"]);if(!environmentsFlag.valid)return failWith(client,{reason:AGENT_REASON.INVALID_ARGUMENTS,message:environmentsFlag.message});let prefixFlag=resolvePrefix(flags["--prefix"]);if(!prefixFlag.valid)return failWith(client,{reason:AGENT_REASON.INVALID_ARGUMENTS,message:prefixFlag.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 target=resolveProjectConnection(store,scope.project.id,environmentsFlag.explicit?environmentsFlag.environments:void 0);if(target.status==="not_found")return failWith(client,{reason:AGENT_REASON.NOT_FOUND,message:`${store.name} is not connected to ${scope.project.name}.`,next:[{command:getCommandNamePlain(`storage connect ${store.name}`),when:"create the connection"}]});if(target.status==="ambiguous")return failWith(client,{reason:"ambiguous_connection",message:`${scope.project.name} has more than one connection to ${store.name} (${target.connections.map(connection2=>connection2.environments.join("+")).join(", ")}). Pass --environment to pick one.`});let connection=target.connection,currentEnvVars=connection.environmentVariables??[],currentAuth=inferConnectionAuth(store,connection.environmentVariables),hasOidcVars=currentEnvVars.some(name=>name.endsWith("_STORE_ID")),hasRwTokenNow=currentEnvVars.some(name=>name.endsWith("_READ_WRITE_TOKEN")),requestedMode=authMode.explicit?authMode.mode:currentAuth==="token"?"token":"oidc",addRwToken=addRwTokenFlag||!authMode.explicit&&hasRwTokenNow,auth=resolveStorageAuth({store,mode:requestedMode,addRwToken});if(!auth.valid)return failWith(client,{reason:auth.reason,message:auth.error,hint:auth.hint});let environments=environmentsFlag.explicit?environmentsFlag.environments:connection.environments,currentPrefix=normalizeEnvVarPrefix(connection.envVarPrefix),prefix=prefixFlag.prefix!==void 0?prefixFlag.prefix:currentPrefix,environmentsChanged=environmentsFlag.explicit&&!sameEnvironments(environments,connection.environments),prefixChanged=flags["--prefix"]!==void 0&&prefix!==currentPrefix,needsOidcUpgrade=storeSupportsOidc(store)&&auth.auth.effective==="oidc"&&!hasOidcVars,rwTokenChanged=storeSupportsOidc(store)&&auth.auth.readWriteToken!==hasRwTokenNow;if(!environmentsChanged&&!prefixChanged&&!needsOidcUpgrade&&!rwTokenChanged)return failWith(client,{reason:AGENT_REASON.NO_CHANGES_REQUESTED,message:`Nothing to update: ${store.name} on ${scope.project.name} already matches the requested configuration.`,next:[{command:getCommandNamePlain(`storage status ${store.name}`),when:"inspect the current connection"}]});let plan=buildStoragePlan({action:"update",dryRun,store,projects:[scope.project],environments,envVarPrefix:prefix,auth:auth.auth,envVars:planUpdateEnvVars({store,auth:auth.auth,prefix,connection,prefixChanged})});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("Updating storage connection\u2026",500),needsOidcUpgrade&&await upgradeStoreConnectionToOidc(client,{store,connectionId:connection.id,auth:auth.auth,accountId:scope.accountId});let patchEnvironments=environmentsChanged?environments:void 0,patchPrefix=prefixChanged?prefix??null:void 0,patchSkipReadWriteToken=storeSupportsOidc(store)?!auth.auth.readWriteToken:void 0;(patchEnvironments!==void 0||patchPrefix!==void 0||patchSkipReadWriteToken!==void 0)&&await updateStoreConnection(client,{store,connectionId:connection.id,accountId:scope.accountId,environments:patchEnvironments,envVarPrefix:patchPrefix,skipReadWriteToken:patchSkipReadWriteToken})}catch(error){return output_manager_default.stopSpinner(),failWith(client,{reason:AGENT_REASON.API_ERROR,message:`A problem occurred while updating the connection: ${error.message}`})}output_manager_default.stopSpinner();let verified=await readBackConnectionEnvVars(client,{store,projectId:scope.project.id,environments,accountId:scope.accountId}),appliedPlan=verified?buildStoragePlan({action:"update",dryRun:!1,store,projects:[scope.project],environments,envVarPrefix:prefix,auth:auth.auth,envVars:diffEnvVarNames(currentEnvVars,verified)}):plan;return writeStorageResult(client,appliedPlan,{applied:!0,asJson,message:`Updated ${import_chalk47.default.bold(store.name)} on ${import_chalk47.default.bold(scope.project.name)} (${environments.join(", ")})`,next:getStorageEnvPullNext(client,scope,[...connection.environments,...environments])}),0}var COMMAND_CONFIG5={list:getCommandAliases(listSubcommand3),create:getCommandAliases(createSubcommand2),inspect:getCommandAliases(getSubcommand),delete:getCommandAliases(deleteSubcommand),connect:getCommandAliases(connectSubcommand2),status:getCommandAliases(statusSubcommand),update:getCommandAliases(updateSubcommand3),disconnect:getCommandAliases(disconnectSubcommand2)};async function main3(client){let telemetry=new StorageTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArguments;try{parsedArguments=parseArguments(client.argv.slice(2),getFlagsSpecification(storageCommand.options),{permissive:!0})}catch(error){return printError(error),2}let needHelp=!!parsedArguments.flags["--help"],subArgs=parsedArguments.args.slice(1),{subcommand,subcommandOriginal,args}=getSubcommand2(subArgs,COMMAND_CONFIG5);if(!subcommand)return needHelp?(telemetry.trackCliFlagHelp("storage"),output_manager_default.print(help(storageCommand,{columns:client.stderr.columns})),0):subArgs.length>0?(output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG5)),2):(output_manager_default.print(help(storageCommand,{columns:client.stderr.columns})),2);function printHelp(command){output_manager_default.print(help(command,{columns:client.stderr.columns,parent:storageCommand}))}switch(subcommand){case"list":return needHelp?(telemetry.trackCliFlagHelp("storage",subcommandOriginal),printHelp(listSubcommand3),0):(telemetry.trackCliSubcommandList(subcommandOriginal),list3(client,args));case"create":return needHelp?(telemetry.trackCliFlagHelp("storage",subcommandOriginal),printHelp(createSubcommand2),0):(telemetry.trackCliSubcommandCreate(subcommandOriginal),create2(client,args));case"inspect":return needHelp?(telemetry.trackCliFlagHelp("storage",subcommandOriginal),printHelp(getSubcommand),0):(telemetry.trackCliSubcommandInspect(subcommandOriginal),subcommandOriginal==="get"&&warnDeprecatedSubcommand(client,"storage get","storage inspect"),get(client,args));case"delete":return needHelp?(telemetry.trackCliFlagHelp("storage",subcommandOriginal),printHelp(deleteSubcommand),0):(telemetry.trackCliSubcommandDelete(subcommandOriginal),deleteStore(client,args));case"connect":return needHelp?(telemetry.trackCliFlagHelp("storage",subcommandOriginal),printHelp(connectSubcommand2),0):(telemetry.trackCliSubcommandConnect(subcommandOriginal),connect2(client,args));case"status":return needHelp?(telemetry.trackCliFlagHelp("storage",subcommandOriginal),printHelp(statusSubcommand),0):(telemetry.trackCliSubcommandStatus(subcommandOriginal),status(client,args));case"update":return needHelp?(telemetry.trackCliFlagHelp("storage",subcommandOriginal),printHelp(updateSubcommand3),0):(telemetry.trackCliSubcommandUpdate(subcommandOriginal),update3(client,args));case"disconnect":return needHelp?(telemetry.trackCliFlagHelp("storage",subcommandOriginal),printHelp(disconnectSubcommand2),0):(telemetry.trackCliSubcommandDisconnect(subcommandOriginal),disconnect2(client,args));default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG5)),2}}var import_chalk52=__toESM(require_source(),1);var UsageTelemetryClient=class extends TelemetryClient{trackCliOptionSince(since){since&&this.trackCliOption({option:"since",value:this.redactedValue})}trackCliOptionUntil(until){until&&this.trackCliOption({option:"until",value:this.redactedValue})}trackCliOptionFrom(from){from&&this.trackCliOption({option:"from",value:this.redactedValue})}trackCliOptionTo(to){to&&this.trackCliOption({option:"to",value:this.redactedValue})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}trackCliOptionBreakdown(breakdown){breakdown&&this.trackCliOption({option:"breakdown",value:breakdown})}trackCliOptionGroupBy(groupBy){groupBy&&this.trackCliOption({option:"group-by",value:groupBy})}};var import_error_utils2=__toESM(require_dist(),1);var LuxonError=class extends Error{},InvalidDateTimeError=class extends LuxonError{constructor(reason){super(`Invalid DateTime: ${reason.toMessage()}`)}},InvalidIntervalError=class extends LuxonError{constructor(reason){super(`Invalid Interval: ${reason.toMessage()}`)}},InvalidDurationError=class extends LuxonError{constructor(reason){super(`Invalid Duration: ${reason.toMessage()}`)}},ConflictingSpecificationError=class extends LuxonError{},InvalidUnitError=class extends LuxonError{constructor(unit){super(`Invalid unit ${unit}`)}},InvalidArgumentError=class extends LuxonError{},ZoneIsAbstractError=class extends LuxonError{constructor(){super("Zone is an abstract class")}},n="numeric",s="short",l="long",DATE_SHORT={year:n,month:n,day:n},DATE_MED={year:n,month:s,day:n},DATE_MED_WITH_WEEKDAY={year:n,month:s,day:n,weekday:s},DATE_FULL={year:n,month:l,day:n},DATE_HUGE={year:n,month:l,day:n,weekday:l},TIME_SIMPLE={hour:n,minute:n},TIME_WITH_SECONDS={hour:n,minute:n,second:n},TIME_WITH_SHORT_OFFSET={hour:n,minute:n,second:n,timeZoneName:s},TIME_WITH_LONG_OFFSET={hour:n,minute:n,second:n,timeZoneName:l},TIME_24_SIMPLE={hour:n,minute:n,hourCycle:"h23"},TIME_24_WITH_SECONDS={hour:n,minute:n,second:n,hourCycle:"h23"},TIME_24_WITH_SHORT_OFFSET={hour:n,minute:n,second:n,hourCycle:"h23",timeZoneName:s},TIME_24_WITH_LONG_OFFSET={hour:n,minute:n,second:n,hourCycle:"h23",timeZoneName:l},DATETIME_SHORT={year:n,month:n,day:n,hour:n,minute:n},DATETIME_SHORT_WITH_SECONDS={year:n,month:n,day:n,hour:n,minute:n,second:n},DATETIME_MED={year:n,month:s,day:n,hour:n,minute:n},DATETIME_MED_WITH_SECONDS={year:n,month:s,day:n,hour:n,minute:n,second:n},DATETIME_MED_WITH_WEEKDAY={year:n,month:s,day:n,weekday:s,hour:n,minute:n},DATETIME_FULL={year:n,month:l,day:n,hour:n,minute:n,timeZoneName:s},DATETIME_FULL_WITH_SECONDS={year:n,month:l,day:n,hour:n,minute:n,second:n,timeZoneName:s},DATETIME_HUGE={year:n,month:l,day:n,weekday:l,hour:n,minute:n,timeZoneName:l},DATETIME_HUGE_WITH_SECONDS={year:n,month:l,day:n,weekday:l,hour:n,minute:n,second:n,timeZoneName:l},Zone=class{get type(){throw new ZoneIsAbstractError}get name(){throw new ZoneIsAbstractError}get ianaName(){return this.name}get isUniversal(){throw new ZoneIsAbstractError}offsetName(ts,opts){throw new ZoneIsAbstractError}formatOffset(ts,format){throw new ZoneIsAbstractError}offset(ts){throw new ZoneIsAbstractError}equals(otherZone){throw new ZoneIsAbstractError}get isValid(){throw new ZoneIsAbstractError}},singleton$1=null,SystemZone=class _SystemZone extends Zone{static get instance(){return singleton$1===null&&(singleton$1=new _SystemZone),singleton$1}get type(){return"system"}get name(){return new Intl.DateTimeFormat().resolvedOptions().timeZone}get isUniversal(){return!1}offsetName(ts,{format,locale}){return parseZoneInfo(ts,format,locale)}formatOffset(ts,format){return formatOffset(this.offset(ts),format)}offset(ts){return-new Date(ts).getTimezoneOffset()}equals(otherZone){return otherZone.type==="system"}get isValid(){return!0}},dtfCache=new Map;function makeDTF(zoneName){let dtf=dtfCache.get(zoneName);return dtf===void 0&&(dtf=new Intl.DateTimeFormat("en-US",{hour12:!1,timeZone:zoneName,year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit",era:"short"}),dtfCache.set(zoneName,dtf)),dtf}var typeToPos={year:0,month:1,day:2,era:3,hour:4,minute:5,second:6};function hackyOffset(dtf,date){let formatted=dtf.format(date).replace(/\u200E/g,""),parsed=/(\d+)\/(\d+)\/(\d+) (AD|BC),? (\d+):(\d+):(\d+)/.exec(formatted),[,fMonth,fDay,fYear,fadOrBc,fHour,fMinute,fSecond]=parsed;return[fYear,fMonth,fDay,fadOrBc,fHour,fMinute,fSecond]}function partsOffset(dtf,date){let formatted=dtf.formatToParts(date),filled=[];for(let i=0;i<formatted.length;i++){let{type,value}=formatted[i],pos=typeToPos[type];type==="era"?filled[pos]=value:isUndefined(pos)||(filled[pos]=parseInt(value,10))}return filled}var ianaZoneCache=new Map,IANAZone=class _IANAZone extends Zone{static create(name){let zone=ianaZoneCache.get(name);return zone===void 0&&ianaZoneCache.set(name,zone=new _IANAZone(name)),zone}static resetCache(){ianaZoneCache.clear(),dtfCache.clear()}static isValidSpecifier(s2){return this.isValidZone(s2)}static isValidZone(zone){if(!zone)return!1;try{return new Intl.DateTimeFormat("en-US",{timeZone:zone}).format(),!0}catch{return!1}}constructor(name){super(),this.zoneName=name,this.valid=_IANAZone.isValidZone(name)}get type(){return"iana"}get name(){return this.zoneName}get isUniversal(){return!1}offsetName(ts,{format,locale}){return parseZoneInfo(ts,format,locale,this.name)}formatOffset(ts,format){return formatOffset(this.offset(ts),format)}offset(ts){if(!this.valid)return NaN;let date=new Date(ts);if(isNaN(date))return NaN;let dtf=makeDTF(this.name),[year,month,day,adOrBc,hour,minute,second]=dtf.formatToParts?partsOffset(dtf,date):hackyOffset(dtf,date);adOrBc==="BC"&&(year=-Math.abs(year)+1);let asUTC=objToLocalTS({year,month,day,hour:hour===24?0:hour,minute,second,millisecond:0}),asTS=+date,over=asTS%1e3;return asTS-=over>=0?over:1e3+over,(asUTC-asTS)/(60*1e3)}equals(otherZone){return otherZone.type==="iana"&&otherZone.name===this.name}get isValid(){return this.valid}},intlLFCache={};function getCachedLF(locString,opts={}){let key=JSON.stringify([locString,opts]),dtf=intlLFCache[key];return dtf||(dtf=new Intl.ListFormat(locString,opts),intlLFCache[key]=dtf),dtf}var intlDTCache=new Map;function getCachedDTF(locString,opts={}){let key=JSON.stringify([locString,opts]),dtf=intlDTCache.get(key);return dtf===void 0&&(dtf=new Intl.DateTimeFormat(locString,opts),intlDTCache.set(key,dtf)),dtf}var intlNumCache=new Map;function getCachedINF(locString,opts={}){let key=JSON.stringify([locString,opts]),inf=intlNumCache.get(key);return inf===void 0&&(inf=new Intl.NumberFormat(locString,opts),intlNumCache.set(key,inf)),inf}var intlRelCache=new Map;function getCachedRTF(locString,opts={}){let{base,...cacheKeyOpts}=opts,key=JSON.stringify([locString,cacheKeyOpts]),inf=intlRelCache.get(key);return inf===void 0&&(inf=new Intl.RelativeTimeFormat(locString,opts),intlRelCache.set(key,inf)),inf}var sysLocaleCache=null;function systemLocale(){return sysLocaleCache||(sysLocaleCache=new Intl.DateTimeFormat().resolvedOptions().locale,sysLocaleCache)}var intlResolvedOptionsCache=new Map;function getCachedIntResolvedOptions(locString){let opts=intlResolvedOptionsCache.get(locString);return opts===void 0&&(opts=new Intl.DateTimeFormat(locString).resolvedOptions(),intlResolvedOptionsCache.set(locString,opts)),opts}var weekInfoCache=new Map;function getCachedWeekInfo(locString){let data=weekInfoCache.get(locString);if(!data){let locale=new Intl.Locale(locString);data="getWeekInfo"in locale?locale.getWeekInfo():locale.weekInfo,"minimalDays"in data||(data={...fallbackWeekSettings,...data}),weekInfoCache.set(locString,data)}return data}function parseLocaleString(localeStr){let xIndex=localeStr.indexOf("-x-");xIndex!==-1&&(localeStr=localeStr.substring(0,xIndex));let uIndex=localeStr.indexOf("-u-");if(uIndex===-1)return[localeStr];{let options,selectedStr;try{options=getCachedDTF(localeStr).resolvedOptions(),selectedStr=localeStr}catch{let smaller=localeStr.substring(0,uIndex);options=getCachedDTF(smaller).resolvedOptions(),selectedStr=smaller}let{numberingSystem,calendar}=options;return[selectedStr,numberingSystem,calendar]}}function intlConfigString(localeStr,numberingSystem,outputCalendar){return(outputCalendar||numberingSystem)&&(localeStr.includes("-u-")||(localeStr+="-u"),outputCalendar&&(localeStr+=`-ca-${outputCalendar}`),numberingSystem&&(localeStr+=`-nu-${numberingSystem}`)),localeStr}function mapMonths(f){let ms3=[];for(let i=1;i<=12;i++){let dt=DateTime.utc(2009,i,1);ms3.push(f(dt))}return ms3}function mapWeekdays(f){let ms3=[];for(let i=1;i<=7;i++){let dt=DateTime.utc(2016,11,13+i);ms3.push(f(dt))}return ms3}function listStuff(loc,length,englishFn,intlFn){let mode=loc.listingMode();return mode==="error"?null:mode==="en"?englishFn(length):intlFn(length)}function supportsFastNumbers(loc){return loc.numberingSystem&&loc.numberingSystem!=="latn"?!1:loc.numberingSystem==="latn"||!loc.locale||loc.locale.startsWith("en")||getCachedIntResolvedOptions(loc.locale).numberingSystem==="latn"}var PolyNumberFormatter=class{constructor(intl,forceSimple,opts){this.padTo=opts.padTo||0,this.floor=opts.floor||!1;let{padTo,floor,...otherOpts}=opts;if(!forceSimple||Object.keys(otherOpts).length>0){let intlOpts={useGrouping:!1,...opts};opts.padTo>0&&(intlOpts.minimumIntegerDigits=opts.padTo),this.inf=getCachedINF(intl,intlOpts)}}format(i){if(this.inf){let fixed=this.floor?Math.floor(i):i;return this.inf.format(fixed)}else{let fixed=this.floor?Math.floor(i):roundTo(i,3);return padStart(fixed,this.padTo)}}},PolyDateFormatter=class{constructor(dt,intl,opts){this.opts=opts,this.originalZone=void 0;let z;if(this.opts.timeZone)this.dt=dt;else if(dt.zone.type==="fixed"){let gmtOffset=-1*(dt.offset/60),offsetZ=gmtOffset>=0?`Etc/GMT+${gmtOffset}`:`Etc/GMT${gmtOffset}`;dt.offset!==0&&IANAZone.create(offsetZ).valid?(z=offsetZ,this.dt=dt):(z="UTC",this.dt=dt.offset===0?dt:dt.setZone("UTC").plus({minutes:dt.offset}),this.originalZone=dt.zone)}else dt.zone.type==="system"?this.dt=dt:dt.zone.type==="iana"?(this.dt=dt,z=dt.zone.name):(z="UTC",this.dt=dt.setZone("UTC").plus({minutes:dt.offset}),this.originalZone=dt.zone);let intlOpts={...this.opts};intlOpts.timeZone=intlOpts.timeZone||z,this.dtf=getCachedDTF(intl,intlOpts)}format(){return this.originalZone?this.formatToParts().map(({value})=>value).join(""):this.dtf.format(this.dt.toJSDate())}formatToParts(){let parts=this.dtf.formatToParts(this.dt.toJSDate());return this.originalZone?parts.map(part=>{if(part.type==="timeZoneName"){let offsetName=this.originalZone.offsetName(this.dt.ts,{locale:this.dt.locale,format:this.opts.timeZoneName});return{...part,value:offsetName}}else return part}):parts}resolvedOptions(){return this.dtf.resolvedOptions()}},PolyRelFormatter=class{constructor(intl,isEnglish,opts){this.opts={style:"long",...opts},!isEnglish&&hasRelative()&&(this.rtf=getCachedRTF(intl,opts))}format(count,unit){return this.rtf?this.rtf.format(count,unit):formatRelativeTime(unit,count,this.opts.numeric,this.opts.style!=="long")}formatToParts(count,unit){return this.rtf?this.rtf.formatToParts(count,unit):[]}},fallbackWeekSettings={firstDay:1,minimalDays:4,weekend:[6,7]},Locale=class _Locale{static fromOpts(opts){return _Locale.create(opts.locale,opts.numberingSystem,opts.outputCalendar,opts.weekSettings,opts.defaultToEN)}static create(locale,numberingSystem,outputCalendar,weekSettings,defaultToEN=!1){let specifiedLocale=locale||Settings.defaultLocale,localeR=specifiedLocale||(defaultToEN?"en-US":systemLocale()),numberingSystemR=numberingSystem||Settings.defaultNumberingSystem,outputCalendarR=outputCalendar||Settings.defaultOutputCalendar,weekSettingsR=validateWeekSettings(weekSettings)||Settings.defaultWeekSettings;return new _Locale(localeR,numberingSystemR,outputCalendarR,weekSettingsR,specifiedLocale)}static resetCache(){sysLocaleCache=null,intlDTCache.clear(),intlNumCache.clear(),intlRelCache.clear(),intlResolvedOptionsCache.clear(),weekInfoCache.clear()}static fromObject({locale,numberingSystem,outputCalendar,weekSettings}={}){return _Locale.create(locale,numberingSystem,outputCalendar,weekSettings)}constructor(locale,numbering,outputCalendar,weekSettings,specifiedLocale){let[parsedLocale,parsedNumberingSystem,parsedOutputCalendar]=parseLocaleString(locale);this.locale=parsedLocale,this.numberingSystem=numbering||parsedNumberingSystem||null,this.outputCalendar=outputCalendar||parsedOutputCalendar||null,this.weekSettings=weekSettings,this.intl=intlConfigString(this.locale,this.numberingSystem,this.outputCalendar),this.weekdaysCache={format:{},standalone:{}},this.monthsCache={format:{},standalone:{}},this.meridiemCache=null,this.eraCache={},this.specifiedLocale=specifiedLocale,this.fastNumbersCached=null}get fastNumbers(){return this.fastNumbersCached==null&&(this.fastNumbersCached=supportsFastNumbers(this)),this.fastNumbersCached}listingMode(){let isActuallyEn=this.isEnglish(),hasNoWeirdness=(this.numberingSystem===null||this.numberingSystem==="latn")&&(this.outputCalendar===null||this.outputCalendar==="gregory");return isActuallyEn&&hasNoWeirdness?"en":"intl"}clone(alts){return!alts||Object.getOwnPropertyNames(alts).length===0?this:_Locale.create(alts.locale||this.specifiedLocale,alts.numberingSystem||this.numberingSystem,alts.outputCalendar||this.outputCalendar,validateWeekSettings(alts.weekSettings)||this.weekSettings,alts.defaultToEN||!1)}redefaultToEN(alts={}){return this.clone({...alts,defaultToEN:!0})}redefaultToSystem(alts={}){return this.clone({...alts,defaultToEN:!1})}months(length,format=!1){return listStuff(this,length,months,()=>{let monthSpecialCase=this.intl==="ja"||this.intl.startsWith("ja-");format&=!monthSpecialCase;let intl=format?{month:length,day:"numeric"}:{month:length},formatStr=format?"format":"standalone";if(!this.monthsCache[formatStr][length]){let mapper=monthSpecialCase?dt=>this.dtFormatter(dt,intl).format():dt=>this.extract(dt,intl,"month");this.monthsCache[formatStr][length]=mapMonths(mapper)}return this.monthsCache[formatStr][length]})}weekdays(length,format=!1){return listStuff(this,length,weekdays,()=>{let intl=format?{weekday:length,year:"numeric",month:"long",day:"numeric"}:{weekday:length},formatStr=format?"format":"standalone";return this.weekdaysCache[formatStr][length]||(this.weekdaysCache[formatStr][length]=mapWeekdays(dt=>this.extract(dt,intl,"weekday"))),this.weekdaysCache[formatStr][length]})}meridiems(){return listStuff(this,void 0,()=>meridiems,()=>{if(!this.meridiemCache){let intl={hour:"numeric",hourCycle:"h12"};this.meridiemCache=[DateTime.utc(2016,11,13,9),DateTime.utc(2016,11,13,19)].map(dt=>this.extract(dt,intl,"dayperiod"))}return this.meridiemCache})}eras(length){return listStuff(this,length,eras,()=>{let intl={era:length};return this.eraCache[length]||(this.eraCache[length]=[DateTime.utc(-40,1,1),DateTime.utc(2017,1,1)].map(dt=>this.extract(dt,intl,"era"))),this.eraCache[length]})}extract(dt,intlOpts,field){let df=this.dtFormatter(dt,intlOpts),results=df.formatToParts(),matching=results.find(m=>m.type.toLowerCase()===field);return matching?matching.value:null}numberFormatter(opts={}){return new PolyNumberFormatter(this.intl,opts.forceSimple||this.fastNumbers,opts)}dtFormatter(dt,intlOpts={}){return new PolyDateFormatter(dt,this.intl,intlOpts)}relFormatter(opts={}){return new PolyRelFormatter(this.intl,this.isEnglish(),opts)}listFormatter(opts={}){return getCachedLF(this.intl,opts)}isEnglish(){return this.locale==="en"||this.locale.toLowerCase()==="en-us"||getCachedIntResolvedOptions(this.intl).locale.startsWith("en-us")}getWeekSettings(){return this.weekSettings?this.weekSettings:hasLocaleWeekInfo()?getCachedWeekInfo(this.locale):fallbackWeekSettings}getStartOfWeek(){return this.getWeekSettings().firstDay}getMinDaysInFirstWeek(){return this.getWeekSettings().minimalDays}getWeekendDays(){return this.getWeekSettings().weekend}equals(other){return this.locale===other.locale&&this.numberingSystem===other.numberingSystem&&this.outputCalendar===other.outputCalendar}toString(){return`Locale(${this.locale}, ${this.numberingSystem}, ${this.outputCalendar})`}},singleton=null,FixedOffsetZone=class _FixedOffsetZone extends Zone{static get utcInstance(){return singleton===null&&(singleton=new _FixedOffsetZone(0)),singleton}static instance(offset2){return offset2===0?_FixedOffsetZone.utcInstance:new _FixedOffsetZone(offset2)}static parseSpecifier(s2){if(s2){let r=s2.match(/^utc(?:([+-]\d{1,2})(?::(\d{2}))?)?$/i);if(r)return new _FixedOffsetZone(signedOffset(r[1],r[2]))}return null}constructor(offset2){super(),this.fixed=offset2}get type(){return"fixed"}get name(){return this.fixed===0?"UTC":`UTC${formatOffset(this.fixed,"narrow")}`}get ianaName(){return this.fixed===0?"Etc/UTC":`Etc/GMT${formatOffset(-this.fixed,"narrow")}`}offsetName(){return this.name}formatOffset(ts,format){return formatOffset(this.fixed,format)}get isUniversal(){return!0}offset(){return this.fixed}equals(otherZone){return otherZone.type==="fixed"&&otherZone.fixed===this.fixed}get isValid(){return!0}},InvalidZone=class extends Zone{constructor(zoneName){super(),this.zoneName=zoneName}get type(){return"invalid"}get name(){return this.zoneName}get isUniversal(){return!1}offsetName(){return null}formatOffset(){return""}offset(){return NaN}equals(){return!1}get isValid(){return!1}};function normalizeZone(input,defaultZone2){if(isUndefined(input)||input===null)return defaultZone2;if(input instanceof Zone)return input;if(isString(input)){let lowered=input.toLowerCase();return lowered==="default"?defaultZone2:lowered==="local"||lowered==="system"?SystemZone.instance:lowered==="utc"||lowered==="gmt"?FixedOffsetZone.utcInstance:FixedOffsetZone.parseSpecifier(lowered)||IANAZone.create(input)}else return isNumber(input)?FixedOffsetZone.instance(input):typeof input=="object"&&"offset"in input&&typeof input.offset=="function"?input:new InvalidZone(input)}var numberingSystems={arab:"[\u0660-\u0669]",arabext:"[\u06F0-\u06F9]",bali:"[\u1B50-\u1B59]",beng:"[\u09E6-\u09EF]",deva:"[\u0966-\u096F]",fullwide:"[\uFF10-\uFF19]",gujr:"[\u0AE6-\u0AEF]",hanidec:"[\u3007|\u4E00|\u4E8C|\u4E09|\u56DB|\u4E94|\u516D|\u4E03|\u516B|\u4E5D]",khmr:"[\u17E0-\u17E9]",knda:"[\u0CE6-\u0CEF]",laoo:"[\u0ED0-\u0ED9]",limb:"[\u1946-\u194F]",mlym:"[\u0D66-\u0D6F]",mong:"[\u1810-\u1819]",mymr:"[\u1040-\u1049]",orya:"[\u0B66-\u0B6F]",tamldec:"[\u0BE6-\u0BEF]",telu:"[\u0C66-\u0C6F]",thai:"[\u0E50-\u0E59]",tibt:"[\u0F20-\u0F29]",latn:"\\d"},numberingSystemsUTF16={arab:[1632,1641],arabext:[1776,1785],bali:[6992,7001],beng:[2534,2543],deva:[2406,2415],fullwide:[65296,65303],gujr:[2790,2799],khmr:[6112,6121],knda:[3302,3311],laoo:[3792,3801],limb:[6470,6479],mlym:[3430,3439],mong:[6160,6169],mymr:[4160,4169],orya:[2918,2927],tamldec:[3046,3055],telu:[3174,3183],thai:[3664,3673],tibt:[3872,3881]},hanidecChars=numberingSystems.hanidec.replace(/[\[|\]]/g,"").split("");function parseDigits(str){let value=parseInt(str,10);if(isNaN(value)){value="";for(let i=0;i<str.length;i++){let code=str.charCodeAt(i);if(str[i].search(numberingSystems.hanidec)!==-1)value+=hanidecChars.indexOf(str[i]);else for(let key in numberingSystemsUTF16){let[min,max]=numberingSystemsUTF16[key];code>=min&&code<=max&&(value+=code-min)}}return parseInt(value,10)}else return value}var digitRegexCache=new Map;function resetDigitRegexCache(){digitRegexCache.clear()}function digitRegex({numberingSystem},append=""){let ns=numberingSystem||"latn",appendCache=digitRegexCache.get(ns);appendCache===void 0&&(appendCache=new Map,digitRegexCache.set(ns,appendCache));let regex=appendCache.get(append);return regex===void 0&&(regex=new RegExp(`${numberingSystems[ns]}${append}`),appendCache.set(append,regex)),regex}var now=()=>Date.now(),defaultZone="system",defaultLocale=null,defaultNumberingSystem=null,defaultOutputCalendar=null,twoDigitCutoffYear=60,throwOnInvalid,defaultWeekSettings=null,Settings=class{static get now(){return now}static set now(n2){now=n2}static set defaultZone(zone){defaultZone=zone}static get defaultZone(){return normalizeZone(defaultZone,SystemZone.instance)}static get defaultLocale(){return defaultLocale}static set defaultLocale(locale){defaultLocale=locale}static get defaultNumberingSystem(){return defaultNumberingSystem}static set defaultNumberingSystem(numberingSystem){defaultNumberingSystem=numberingSystem}static get defaultOutputCalendar(){return defaultOutputCalendar}static set defaultOutputCalendar(outputCalendar){defaultOutputCalendar=outputCalendar}static get defaultWeekSettings(){return defaultWeekSettings}static set defaultWeekSettings(weekSettings){defaultWeekSettings=validateWeekSettings(weekSettings)}static get twoDigitCutoffYear(){return twoDigitCutoffYear}static set twoDigitCutoffYear(cutoffYear){twoDigitCutoffYear=cutoffYear%100}static get throwOnInvalid(){return throwOnInvalid}static set throwOnInvalid(t){throwOnInvalid=t}static resetCaches(){Locale.resetCache(),IANAZone.resetCache(),DateTime.resetCache(),resetDigitRegexCache()}},Invalid=class{constructor(reason,explanation){this.reason=reason,this.explanation=explanation}toMessage(){return this.explanation?`${this.reason}: ${this.explanation}`:this.reason}},nonLeapLadder=[0,31,59,90,120,151,181,212,243,273,304,334],leapLadder=[0,31,60,91,121,152,182,213,244,274,305,335];function unitOutOfRange(unit,value){return new Invalid("unit out of range",`you specified ${value} (of type ${typeof value}) as a ${unit}, which is invalid`)}function dayOfWeek(year,month,day){let d=new Date(Date.UTC(year,month-1,day));year<100&&year>=0&&d.setUTCFullYear(d.getUTCFullYear()-1900);let js=d.getUTCDay();return js===0?7:js}function computeOrdinal(year,month,day){return day+(isLeapYear(year)?leapLadder:nonLeapLadder)[month-1]}function uncomputeOrdinal(year,ordinal){let table2=isLeapYear(year)?leapLadder:nonLeapLadder,month0=table2.findIndex(i=>i<ordinal),day=ordinal-table2[month0];return{month:month0+1,day}}function isoWeekdayToLocal(isoWeekday,startOfWeek){return(isoWeekday-startOfWeek+7)%7+1}function gregorianToWeek(gregObj,minDaysInFirstWeek=4,startOfWeek=1){let{year,month,day}=gregObj,ordinal=computeOrdinal(year,month,day),weekday=isoWeekdayToLocal(dayOfWeek(year,month,day),startOfWeek),weekNumber=Math.floor((ordinal-weekday+14-minDaysInFirstWeek)/7),weekYear;return weekNumber<1?(weekYear=year-1,weekNumber=weeksInWeekYear(weekYear,minDaysInFirstWeek,startOfWeek)):weekNumber>weeksInWeekYear(year,minDaysInFirstWeek,startOfWeek)?(weekYear=year+1,weekNumber=1):weekYear=year,{weekYear,weekNumber,weekday,...timeObject(gregObj)}}function weekToGregorian(weekData,minDaysInFirstWeek=4,startOfWeek=1){let{weekYear,weekNumber,weekday}=weekData,weekdayOfJan4=isoWeekdayToLocal(dayOfWeek(weekYear,1,minDaysInFirstWeek),startOfWeek),yearInDays=daysInYear(weekYear),ordinal=weekNumber*7+weekday-weekdayOfJan4-7+minDaysInFirstWeek,year;ordinal<1?(year=weekYear-1,ordinal+=daysInYear(year)):ordinal>yearInDays?(year=weekYear+1,ordinal-=daysInYear(weekYear)):year=weekYear;let{month,day}=uncomputeOrdinal(year,ordinal);return{year,month,day,...timeObject(weekData)}}function gregorianToOrdinal(gregData){let{year,month,day}=gregData,ordinal=computeOrdinal(year,month,day);return{year,ordinal,...timeObject(gregData)}}function ordinalToGregorian(ordinalData){let{year,ordinal}=ordinalData,{month,day}=uncomputeOrdinal(year,ordinal);return{year,month,day,...timeObject(ordinalData)}}function usesLocalWeekValues(obj,loc){if(!isUndefined(obj.localWeekday)||!isUndefined(obj.localWeekNumber)||!isUndefined(obj.localWeekYear)){if(!isUndefined(obj.weekday)||!isUndefined(obj.weekNumber)||!isUndefined(obj.weekYear))throw new ConflictingSpecificationError("Cannot mix locale-based week fields with ISO-based week fields");return isUndefined(obj.localWeekday)||(obj.weekday=obj.localWeekday),isUndefined(obj.localWeekNumber)||(obj.weekNumber=obj.localWeekNumber),isUndefined(obj.localWeekYear)||(obj.weekYear=obj.localWeekYear),delete obj.localWeekday,delete obj.localWeekNumber,delete obj.localWeekYear,{minDaysInFirstWeek:loc.getMinDaysInFirstWeek(),startOfWeek:loc.getStartOfWeek()}}else return{minDaysInFirstWeek:4,startOfWeek:1}}function hasInvalidWeekData(obj,minDaysInFirstWeek=4,startOfWeek=1){let validYear=isInteger(obj.weekYear),validWeek=integerBetween(obj.weekNumber,1,weeksInWeekYear(obj.weekYear,minDaysInFirstWeek,startOfWeek)),validWeekday=integerBetween(obj.weekday,1,7);return validYear?validWeek?validWeekday?!1:unitOutOfRange("weekday",obj.weekday):unitOutOfRange("week",obj.weekNumber):unitOutOfRange("weekYear",obj.weekYear)}function hasInvalidOrdinalData(obj){let validYear=isInteger(obj.year),validOrdinal=integerBetween(obj.ordinal,1,daysInYear(obj.year));return validYear?validOrdinal?!1:unitOutOfRange("ordinal",obj.ordinal):unitOutOfRange("year",obj.year)}function hasInvalidGregorianData(obj){let validYear=isInteger(obj.year),validMonth=integerBetween(obj.month,1,12),validDay=integerBetween(obj.day,1,daysInMonth(obj.year,obj.month));return validYear?validMonth?validDay?!1:unitOutOfRange("day",obj.day):unitOutOfRange("month",obj.month):unitOutOfRange("year",obj.year)}function hasInvalidTimeData(obj){let{hour,minute,second,millisecond}=obj,validHour=integerBetween(hour,0,23)||hour===24&&minute===0&&second===0&&millisecond===0,validMinute=integerBetween(minute,0,59),validSecond=integerBetween(second,0,59),validMillisecond=integerBetween(millisecond,0,999);return validHour?validMinute?validSecond?validMillisecond?!1:unitOutOfRange("millisecond",millisecond):unitOutOfRange("second",second):unitOutOfRange("minute",minute):unitOutOfRange("hour",hour)}function isUndefined(o){return typeof o>"u"}function isNumber(o){return typeof o=="number"}function isInteger(o){return typeof o=="number"&&o%1===0}function isString(o){return typeof o=="string"}function isDate(o){return Object.prototype.toString.call(o)==="[object Date]"}function hasRelative(){try{return typeof Intl<"u"&&!!Intl.RelativeTimeFormat}catch{return!1}}function hasLocaleWeekInfo(){try{return typeof Intl<"u"&&!!Intl.Locale&&("weekInfo"in Intl.Locale.prototype||"getWeekInfo"in Intl.Locale.prototype)}catch{return!1}}function maybeArray(thing){return Array.isArray(thing)?thing:[thing]}function bestBy(arr,by,compare){if(arr.length!==0)return arr.reduce((best,next)=>{let pair=[by(next),next];return best&&compare(best[0],pair[0])===best[0]?best:pair},null)[1]}function pick(obj,keys){return keys.reduce((a,k)=>(a[k]=obj[k],a),{})}function hasOwnProperty(obj,prop){return Object.prototype.hasOwnProperty.call(obj,prop)}function validateWeekSettings(settings){if(settings==null)return null;if(typeof settings!="object")throw new InvalidArgumentError("Week settings must be an object");if(!integerBetween(settings.firstDay,1,7)||!integerBetween(settings.minimalDays,1,7)||!Array.isArray(settings.weekend)||settings.weekend.some(v=>!integerBetween(v,1,7)))throw new InvalidArgumentError("Invalid week settings");return{firstDay:settings.firstDay,minimalDays:settings.minimalDays,weekend:Array.from(settings.weekend)}}function integerBetween(thing,bottom,top){return isInteger(thing)&&thing>=bottom&&thing<=top}function floorMod(x,n2){return x-n2*Math.floor(x/n2)}function padStart(input,n2=2){let isNeg=input<0,padded;return isNeg?padded="-"+(""+-input).padStart(n2,"0"):padded=(""+input).padStart(n2,"0"),padded}function parseInteger(string){if(!(isUndefined(string)||string===null||string===""))return parseInt(string,10)}function parseFloating(string){if(!(isUndefined(string)||string===null||string===""))return parseFloat(string)}function parseMillis(fraction){if(!(isUndefined(fraction)||fraction===null||fraction==="")){let f=parseFloat("0."+fraction)*1e3;return Math.floor(f)}}function roundTo(number,digits,rounding="round"){let factor=10**digits;switch(rounding){case"expand":return number>0?Math.ceil(number*factor)/factor:Math.floor(number*factor)/factor;case"trunc":return Math.trunc(number*factor)/factor;case"round":return Math.round(number*factor)/factor;case"floor":return Math.floor(number*factor)/factor;case"ceil":return Math.ceil(number*factor)/factor;default:throw new RangeError(`Value rounding ${rounding} is out of range`)}}function isLeapYear(year){return year%4===0&&(year%100!==0||year%400===0)}function daysInYear(year){return isLeapYear(year)?366:365}function daysInMonth(year,month){let modMonth=floorMod(month-1,12)+1,modYear=year+(month-modMonth)/12;return modMonth===2?isLeapYear(modYear)?29:28:[31,null,31,30,31,30,31,31,30,31,30,31][modMonth-1]}function objToLocalTS(obj){let d=Date.UTC(obj.year,obj.month-1,obj.day,obj.hour,obj.minute,obj.second,obj.millisecond);return obj.year<100&&obj.year>=0&&(d=new Date(d),d.setUTCFullYear(obj.year,obj.month-1,obj.day)),+d}function firstWeekOffset(year,minDaysInFirstWeek,startOfWeek){return-isoWeekdayToLocal(dayOfWeek(year,1,minDaysInFirstWeek),startOfWeek)+minDaysInFirstWeek-1}function weeksInWeekYear(weekYear,minDaysInFirstWeek=4,startOfWeek=1){let weekOffset=firstWeekOffset(weekYear,minDaysInFirstWeek,startOfWeek),weekOffsetNext=firstWeekOffset(weekYear+1,minDaysInFirstWeek,startOfWeek);return(daysInYear(weekYear)-weekOffset+weekOffsetNext)/7}function untruncateYear(year){return year>99?year:year>Settings.twoDigitCutoffYear?1900+year:2e3+year}function parseZoneInfo(ts,offsetFormat,locale,timeZone=null){let date=new Date(ts),intlOpts={hourCycle:"h23",year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"};timeZone&&(intlOpts.timeZone=timeZone);let modified={timeZoneName:offsetFormat,...intlOpts},parsed=new Intl.DateTimeFormat(locale,modified).formatToParts(date).find(m=>m.type.toLowerCase()==="timezonename");return parsed?parsed.value:null}function signedOffset(offHourStr,offMinuteStr){let offHour=parseInt(offHourStr,10);Number.isNaN(offHour)&&(offHour=0);let offMin=parseInt(offMinuteStr,10)||0,offMinSigned=offHour<0||Object.is(offHour,-0)?-offMin:offMin;return offHour*60+offMinSigned}function asNumber(value){let numericValue=Number(value);if(typeof value=="boolean"||value===""||!Number.isFinite(numericValue))throw new InvalidArgumentError(`Invalid unit value ${value}`);return numericValue}function normalizeObject(obj,normalizer){let normalized={};for(let u in obj)if(hasOwnProperty(obj,u)){let v=obj[u];if(v==null)continue;normalized[normalizer(u)]=asNumber(v)}return normalized}function formatOffset(offset2,format){let hours=Math.trunc(Math.abs(offset2/60)),minutes=Math.trunc(Math.abs(offset2%60)),sign=offset2>=0?"+":"-";switch(format){case"short":return`${sign}${padStart(hours,2)}:${padStart(minutes,2)}`;case"narrow":return`${sign}${hours}${minutes>0?`:${minutes}`:""}`;case"techie":return`${sign}${padStart(hours,2)}${padStart(minutes,2)}`;default:throw new RangeError(`Value format ${format} is out of range for property format`)}}function timeObject(obj){return pick(obj,["hour","minute","second","millisecond"])}var monthsLong=["January","February","March","April","May","June","July","August","September","October","November","December"],monthsShort=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],monthsNarrow=["J","F","M","A","M","J","J","A","S","O","N","D"];function months(length){switch(length){case"narrow":return[...monthsNarrow];case"short":return[...monthsShort];case"long":return[...monthsLong];case"numeric":return["1","2","3","4","5","6","7","8","9","10","11","12"];case"2-digit":return["01","02","03","04","05","06","07","08","09","10","11","12"];default:return null}}var weekdaysLong=["Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"],weekdaysShort=["Mon","Tue","Wed","Thu","Fri","Sat","Sun"],weekdaysNarrow=["M","T","W","T","F","S","S"];function weekdays(length){switch(length){case"narrow":return[...weekdaysNarrow];case"short":return[...weekdaysShort];case"long":return[...weekdaysLong];case"numeric":return["1","2","3","4","5","6","7"];default:return null}}var meridiems=["AM","PM"],erasLong=["Before Christ","Anno Domini"],erasShort=["BC","AD"],erasNarrow=["B","A"];function eras(length){switch(length){case"narrow":return[...erasNarrow];case"short":return[...erasShort];case"long":return[...erasLong];default:return null}}function meridiemForDateTime(dt){return meridiems[dt.hour<12?0:1]}function weekdayForDateTime(dt,length){return weekdays(length)[dt.weekday-1]}function monthForDateTime(dt,length){return months(length)[dt.month-1]}function eraForDateTime(dt,length){return eras(length)[dt.year<0?0:1]}function formatRelativeTime(unit,count,numeric="always",narrow=!1){let units={years:["year","yr."],quarters:["quarter","qtr."],months:["month","mo."],weeks:["week","wk."],days:["day","day","days"],hours:["hour","hr."],minutes:["minute","min."],seconds:["second","sec."]},lastable=["hours","minutes","seconds"].indexOf(unit)===-1;if(numeric==="auto"&&lastable){let isDay=unit==="days";switch(count){case 1:return isDay?"tomorrow":`next ${units[unit][0]}`;case-1:return isDay?"yesterday":`last ${units[unit][0]}`;case 0:return isDay?"today":`this ${units[unit][0]}`}}let isInPast=Object.is(count,-0)||count<0,fmtValue=Math.abs(count),singular=fmtValue===1,lilUnits=units[unit],fmtUnit=narrow?singular?lilUnits[1]:lilUnits[2]||lilUnits[1]:singular?units[unit][0]:unit;return isInPast?`${fmtValue} ${fmtUnit} ago`:`in ${fmtValue} ${fmtUnit}`}function stringifyTokens(splits,tokenToString){let s2="";for(let token2 of splits)token2.literal?s2+=token2.val:s2+=tokenToString(token2.val);return s2}var macroTokenToFormatOpts={D:DATE_SHORT,DD:DATE_MED,DDD:DATE_FULL,DDDD:DATE_HUGE,t:TIME_SIMPLE,tt:TIME_WITH_SECONDS,ttt:TIME_WITH_SHORT_OFFSET,tttt:TIME_WITH_LONG_OFFSET,T:TIME_24_SIMPLE,TT:TIME_24_WITH_SECONDS,TTT:TIME_24_WITH_SHORT_OFFSET,TTTT:TIME_24_WITH_LONG_OFFSET,f:DATETIME_SHORT,ff:DATETIME_MED,fff:DATETIME_FULL,ffff:DATETIME_HUGE,F:DATETIME_SHORT_WITH_SECONDS,FF:DATETIME_MED_WITH_SECONDS,FFF:DATETIME_FULL_WITH_SECONDS,FFFF:DATETIME_HUGE_WITH_SECONDS},Formatter=class _Formatter{static create(locale,opts={}){return new _Formatter(locale,opts)}static parseFormat(fmt){let current=null,currentFull="",bracketed=!1,splits=[];for(let i=0;i<fmt.length;i++){let c=fmt.charAt(i);c==="'"?((currentFull.length>0||bracketed)&&splits.push({literal:bracketed||/^\s+$/.test(currentFull),val:currentFull===""?"'":currentFull}),current=null,currentFull="",bracketed=!bracketed):bracketed||c===current?currentFull+=c:(currentFull.length>0&&splits.push({literal:/^\s+$/.test(currentFull),val:currentFull}),currentFull=c,current=c)}return currentFull.length>0&&splits.push({literal:bracketed||/^\s+$/.test(currentFull),val:currentFull}),splits}static macroTokenToFormatOpts(token2){return macroTokenToFormatOpts[token2]}constructor(locale,formatOpts){this.opts=formatOpts,this.loc=locale,this.systemLoc=null}formatWithSystemDefault(dt,opts){return this.systemLoc===null&&(this.systemLoc=this.loc.redefaultToSystem()),this.systemLoc.dtFormatter(dt,{...this.opts,...opts}).format()}dtFormatter(dt,opts={}){return this.loc.dtFormatter(dt,{...this.opts,...opts})}formatDateTime(dt,opts){return this.dtFormatter(dt,opts).format()}formatDateTimeParts(dt,opts){return this.dtFormatter(dt,opts).formatToParts()}formatInterval(interval,opts){return this.dtFormatter(interval.start,opts).dtf.formatRange(interval.start.toJSDate(),interval.end.toJSDate())}resolvedOptions(dt,opts){return this.dtFormatter(dt,opts).resolvedOptions()}num(n2,p=0,signDisplay=void 0){if(this.opts.forceSimple)return padStart(n2,p);let opts={...this.opts};return p>0&&(opts.padTo=p),signDisplay&&(opts.signDisplay=signDisplay),this.loc.numberFormatter(opts).format(n2)}formatDateTimeFromString(dt,fmt){let knownEnglish=this.loc.listingMode()==="en",useDateTimeFormatter=this.loc.outputCalendar&&this.loc.outputCalendar!=="gregory",string=(opts,extract)=>this.loc.extract(dt,opts,extract),formatOffset2=opts=>dt.isOffsetFixed&&dt.offset===0&&opts.allowZ?"Z":dt.isValid?dt.zone.formatOffset(dt.ts,opts.format):"",meridiem=()=>knownEnglish?meridiemForDateTime(dt):string({hour:"numeric",hourCycle:"h12"},"dayperiod"),month=(length,standalone)=>knownEnglish?monthForDateTime(dt,length):string(standalone?{month:length}:{month:length,day:"numeric"},"month"),weekday=(length,standalone)=>knownEnglish?weekdayForDateTime(dt,length):string(standalone?{weekday:length}:{weekday:length,month:"long",day:"numeric"},"weekday"),maybeMacro=token2=>{let formatOpts=_Formatter.macroTokenToFormatOpts(token2);return formatOpts?this.formatWithSystemDefault(dt,formatOpts):token2},era=length=>knownEnglish?eraForDateTime(dt,length):string({era:length},"era"),tokenToString=token2=>{switch(token2){case"S":return this.num(dt.millisecond);case"u":case"SSS":return this.num(dt.millisecond,3);case"s":return this.num(dt.second);case"ss":return this.num(dt.second,2);case"uu":return this.num(Math.floor(dt.millisecond/10),2);case"uuu":return this.num(Math.floor(dt.millisecond/100));case"m":return this.num(dt.minute);case"mm":return this.num(dt.minute,2);case"h":return this.num(dt.hour%12===0?12:dt.hour%12);case"hh":return this.num(dt.hour%12===0?12:dt.hour%12,2);case"H":return this.num(dt.hour);case"HH":return this.num(dt.hour,2);case"Z":return formatOffset2({format:"narrow",allowZ:this.opts.allowZ});case"ZZ":return formatOffset2({format:"short",allowZ:this.opts.allowZ});case"ZZZ":return formatOffset2({format:"techie",allowZ:this.opts.allowZ});case"ZZZZ":return dt.zone.offsetName(dt.ts,{format:"short",locale:this.loc.locale});case"ZZZZZ":return dt.zone.offsetName(dt.ts,{format:"long",locale:this.loc.locale});case"z":return dt.zoneName;case"a":return meridiem();case"d":return useDateTimeFormatter?string({day:"numeric"},"day"):this.num(dt.day);case"dd":return useDateTimeFormatter?string({day:"2-digit"},"day"):this.num(dt.day,2);case"c":return this.num(dt.weekday);case"ccc":return weekday("short",!0);case"cccc":return weekday("long",!0);case"ccccc":return weekday("narrow",!0);case"E":return this.num(dt.weekday);case"EEE":return weekday("short",!1);case"EEEE":return weekday("long",!1);case"EEEEE":return weekday("narrow",!1);case"L":return useDateTimeFormatter?string({month:"numeric",day:"numeric"},"month"):this.num(dt.month);case"LL":return useDateTimeFormatter?string({month:"2-digit",day:"numeric"},"month"):this.num(dt.month,2);case"LLL":return month("short",!0);case"LLLL":return month("long",!0);case"LLLLL":return month("narrow",!0);case"M":return useDateTimeFormatter?string({month:"numeric"},"month"):this.num(dt.month);case"MM":return useDateTimeFormatter?string({month:"2-digit"},"month"):this.num(dt.month,2);case"MMM":return month("short",!1);case"MMMM":return month("long",!1);case"MMMMM":return month("narrow",!1);case"y":return useDateTimeFormatter?string({year:"numeric"},"year"):this.num(dt.year);case"yy":return useDateTimeFormatter?string({year:"2-digit"},"year"):this.num(dt.year.toString().slice(-2),2);case"yyyy":return useDateTimeFormatter?string({year:"numeric"},"year"):this.num(dt.year,4);case"yyyyyy":return useDateTimeFormatter?string({year:"numeric"},"year"):this.num(dt.year,6);case"G":return era("short");case"GG":return era("long");case"GGGGG":return era("narrow");case"kk":return this.num(dt.weekYear.toString().slice(-2),2);case"kkkk":return this.num(dt.weekYear,4);case"W":return this.num(dt.weekNumber);case"WW":return this.num(dt.weekNumber,2);case"n":return this.num(dt.localWeekNumber);case"nn":return this.num(dt.localWeekNumber,2);case"ii":return this.num(dt.localWeekYear.toString().slice(-2),2);case"iiii":return this.num(dt.localWeekYear,4);case"o":return this.num(dt.ordinal);case"ooo":return this.num(dt.ordinal,3);case"q":return this.num(dt.quarter);case"qq":return this.num(dt.quarter,2);case"X":return this.num(Math.floor(dt.ts/1e3));case"x":return this.num(dt.ts);default:return maybeMacro(token2)}};return stringifyTokens(_Formatter.parseFormat(fmt),tokenToString)}formatDurationFromString(dur,fmt){let invertLargest=this.opts.signMode==="negativeLargestOnly"?-1:1,tokenToField=token2=>{switch(token2[0]){case"S":return"milliseconds";case"s":return"seconds";case"m":return"minutes";case"h":return"hours";case"d":return"days";case"w":return"weeks";case"M":return"months";case"y":return"years";default:return null}},tokenToString=(lildur,info)=>token2=>{let mapped=tokenToField(token2);if(mapped){let inversionFactor=info.isNegativeDuration&&mapped!==info.largestUnit?invertLargest:1,signDisplay;return this.opts.signMode==="negativeLargestOnly"&&mapped!==info.largestUnit?signDisplay="never":this.opts.signMode==="all"?signDisplay="always":signDisplay="auto",this.num(lildur.get(mapped)*inversionFactor,token2.length,signDisplay)}else return token2},tokens=_Formatter.parseFormat(fmt),realTokens=tokens.reduce((found,{literal,val})=>literal?found:found.concat(val),[]),collapsed=dur.shiftTo(...realTokens.map(tokenToField).filter(t=>t)),durationInfo={isNegativeDuration:collapsed<0,largestUnit:Object.keys(collapsed.values)[0]};return stringifyTokens(tokens,tokenToString(collapsed,durationInfo))}},ianaRegex=/[A-Za-z_+-]{1,256}(?::?\/[A-Za-z0-9_+-]{1,256}(?:\/[A-Za-z0-9_+-]{1,256})?)?/;function combineRegexes(...regexes){let full=regexes.reduce((f,r)=>f+r.source,"");return RegExp(`^${full}$`)}function combineExtractors(...extractors){return m=>extractors.reduce(([mergedVals,mergedZone,cursor],ex)=>{let[val,zone,next]=ex(m,cursor);return[{...mergedVals,...val},zone||mergedZone,next]},[{},null,1]).slice(0,2)}function parse(s2,...patterns){if(s2==null)return[null,null];for(let[regex,extractor]of patterns){let m=regex.exec(s2);if(m)return extractor(m)}return[null,null]}function simpleParse(...keys){return(match2,cursor)=>{let ret={},i;for(i=0;i<keys.length;i++)ret[keys[i]]=parseInteger(match2[cursor+i]);return[ret,null,cursor+i]}}var offsetRegex=/(?:([Zz])|([+-]\d\d)(?::?(\d\d))?)/,isoExtendedZone=`(?:${offsetRegex.source}?(?:\\[(${ianaRegex.source})\\])?)?`,isoTimeBaseRegex=/(\d\d)(?::?(\d\d)(?::?(\d\d)(?:[.,](\d{1,30}))?)?)?/,isoTimeRegex=RegExp(`${isoTimeBaseRegex.source}${isoExtendedZone}`),isoTimeExtensionRegex=RegExp(`(?:[Tt]${isoTimeRegex.source})?`),isoYmdRegex=/([+-]\d{6}|\d{4})(?:-?(\d\d)(?:-?(\d\d))?)?/,isoWeekRegex=/(\d{4})-?W(\d\d)(?:-?(\d))?/,isoOrdinalRegex=/(\d{4})-?(\d{3})/,extractISOWeekData=simpleParse("weekYear","weekNumber","weekDay"),extractISOOrdinalData=simpleParse("year","ordinal"),sqlYmdRegex=/(\d{4})-(\d\d)-(\d\d)/,sqlTimeRegex=RegExp(`${isoTimeBaseRegex.source} ?(?:${offsetRegex.source}|(${ianaRegex.source}))?`),sqlTimeExtensionRegex=RegExp(`(?: ${sqlTimeRegex.source})?`);function int(match2,pos,fallback){let m=match2[pos];return isUndefined(m)?fallback:parseInteger(m)}function extractISOYmd(match2,cursor){return[{year:int(match2,cursor),month:int(match2,cursor+1,1),day:int(match2,cursor+2,1)},null,cursor+3]}function extractISOTime(match2,cursor){return[{hours:int(match2,cursor,0),minutes:int(match2,cursor+1,0),seconds:int(match2,cursor+2,0),milliseconds:parseMillis(match2[cursor+3])},null,cursor+4]}function extractISOOffset(match2,cursor){let local=!match2[cursor]&&!match2[cursor+1],fullOffset=signedOffset(match2[cursor+1],match2[cursor+2]),zone=local?null:FixedOffsetZone.instance(fullOffset);return[{},zone,cursor+3]}function extractIANAZone(match2,cursor){let zone=match2[cursor]?IANAZone.create(match2[cursor]):null;return[{},zone,cursor+1]}var isoTimeOnly=RegExp(`^T?${isoTimeBaseRegex.source}$`),isoDuration=/^-?P(?:(?:(-?\d{1,20}(?:\.\d{1,20})?)Y)?(?:(-?\d{1,20}(?:\.\d{1,20})?)M)?(?:(-?\d{1,20}(?:\.\d{1,20})?)W)?(?:(-?\d{1,20}(?:\.\d{1,20})?)D)?(?:T(?:(-?\d{1,20}(?:\.\d{1,20})?)H)?(?:(-?\d{1,20}(?:\.\d{1,20})?)M)?(?:(-?\d{1,20})(?:[.,](-?\d{1,20}))?S)?)?)$/;function extractISODuration(match2){let[s2,yearStr,monthStr,weekStr,dayStr,hourStr,minuteStr,secondStr,millisecondsStr]=match2,hasNegativePrefix=s2[0]==="-",negativeSeconds=secondStr&&secondStr[0]==="-",maybeNegate=(num,force=!1)=>num!==void 0&&(force||num&&hasNegativePrefix)?-num:num;return[{years:maybeNegate(parseFloating(yearStr)),months:maybeNegate(parseFloating(monthStr)),weeks:maybeNegate(parseFloating(weekStr)),days:maybeNegate(parseFloating(dayStr)),hours:maybeNegate(parseFloating(hourStr)),minutes:maybeNegate(parseFloating(minuteStr)),seconds:maybeNegate(parseFloating(secondStr),secondStr==="-0"),milliseconds:maybeNegate(parseMillis(millisecondsStr),negativeSeconds)}]}var obsOffsets={GMT:0,EDT:-4*60,EST:-5*60,CDT:-5*60,CST:-6*60,MDT:-6*60,MST:-7*60,PDT:-7*60,PST:-8*60};function fromStrings(weekdayStr,yearStr,monthStr,dayStr,hourStr,minuteStr,secondStr){let result={year:yearStr.length===2?untruncateYear(parseInteger(yearStr)):parseInteger(yearStr),month:monthsShort.indexOf(monthStr)+1,day:parseInteger(dayStr),hour:parseInteger(hourStr),minute:parseInteger(minuteStr)};return secondStr&&(result.second=parseInteger(secondStr)),weekdayStr&&(result.weekday=weekdayStr.length>3?weekdaysLong.indexOf(weekdayStr)+1:weekdaysShort.indexOf(weekdayStr)+1),result}var rfc2822=/^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|(?:([+-]\d\d)(\d\d)))$/;function extractRFC2822(match2){let[,weekdayStr,dayStr,monthStr,yearStr,hourStr,minuteStr,secondStr,obsOffset,milOffset,offHourStr,offMinuteStr]=match2,result=fromStrings(weekdayStr,yearStr,monthStr,dayStr,hourStr,minuteStr,secondStr),offset2;return obsOffset?offset2=obsOffsets[obsOffset]:milOffset?offset2=0:offset2=signedOffset(offHourStr,offMinuteStr),[result,new FixedOffsetZone(offset2)]}function preprocessRFC2822(s2){return s2.replace(/\([^()]*\)|[\n\t]/g," ").replace(/(\s\s+)/g," ").trim()}var rfc1123=/^(Mon|Tue|Wed|Thu|Fri|Sat|Sun), (\d\d) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (\d{4}) (\d\d):(\d\d):(\d\d) GMT$/,rfc850=/^(Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday), (\d\d)-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-(\d\d) (\d\d):(\d\d):(\d\d) GMT$/,ascii=/^(Mon|Tue|Wed|Thu|Fri|Sat|Sun) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) ( \d|\d\d) (\d\d):(\d\d):(\d\d) (\d{4})$/;function extractRFC1123Or850(match2){let[,weekdayStr,dayStr,monthStr,yearStr,hourStr,minuteStr,secondStr]=match2;return[fromStrings(weekdayStr,yearStr,monthStr,dayStr,hourStr,minuteStr,secondStr),FixedOffsetZone.utcInstance]}function extractASCII(match2){let[,weekdayStr,monthStr,dayStr,hourStr,minuteStr,secondStr,yearStr]=match2;return[fromStrings(weekdayStr,yearStr,monthStr,dayStr,hourStr,minuteStr,secondStr),FixedOffsetZone.utcInstance]}var isoYmdWithTimeExtensionRegex=combineRegexes(isoYmdRegex,isoTimeExtensionRegex),isoWeekWithTimeExtensionRegex=combineRegexes(isoWeekRegex,isoTimeExtensionRegex),isoOrdinalWithTimeExtensionRegex=combineRegexes(isoOrdinalRegex,isoTimeExtensionRegex),isoTimeCombinedRegex=combineRegexes(isoTimeRegex),extractISOYmdTimeAndOffset=combineExtractors(extractISOYmd,extractISOTime,extractISOOffset,extractIANAZone),extractISOWeekTimeAndOffset=combineExtractors(extractISOWeekData,extractISOTime,extractISOOffset,extractIANAZone),extractISOOrdinalDateAndTime=combineExtractors(extractISOOrdinalData,extractISOTime,extractISOOffset,extractIANAZone),extractISOTimeAndOffset=combineExtractors(extractISOTime,extractISOOffset,extractIANAZone);function parseISODate(s2){return parse(s2,[isoYmdWithTimeExtensionRegex,extractISOYmdTimeAndOffset],[isoWeekWithTimeExtensionRegex,extractISOWeekTimeAndOffset],[isoOrdinalWithTimeExtensionRegex,extractISOOrdinalDateAndTime],[isoTimeCombinedRegex,extractISOTimeAndOffset])}function parseRFC2822Date(s2){return parse(preprocessRFC2822(s2),[rfc2822,extractRFC2822])}function parseHTTPDate(s2){return parse(s2,[rfc1123,extractRFC1123Or850],[rfc850,extractRFC1123Or850],[ascii,extractASCII])}function parseISODuration(s2){return parse(s2,[isoDuration,extractISODuration])}var extractISOTimeOnly=combineExtractors(extractISOTime);function parseISOTimeOnly(s2){return parse(s2,[isoTimeOnly,extractISOTimeOnly])}var sqlYmdWithTimeExtensionRegex=combineRegexes(sqlYmdRegex,sqlTimeExtensionRegex),sqlTimeCombinedRegex=combineRegexes(sqlTimeRegex),extractISOTimeOffsetAndIANAZone=combineExtractors(extractISOTime,extractISOOffset,extractIANAZone);function parseSQL(s2){return parse(s2,[sqlYmdWithTimeExtensionRegex,extractISOYmdTimeAndOffset],[sqlTimeCombinedRegex,extractISOTimeOffsetAndIANAZone])}var INVALID$2="Invalid Duration",lowOrderMatrix={weeks:{days:7,hours:7*24,minutes:7*24*60,seconds:7*24*60*60,milliseconds:7*24*60*60*1e3},days:{hours:24,minutes:24*60,seconds:24*60*60,milliseconds:24*60*60*1e3},hours:{minutes:60,seconds:60*60,milliseconds:60*60*1e3},minutes:{seconds:60,milliseconds:60*1e3},seconds:{milliseconds:1e3}},casualMatrix={years:{quarters:4,months:12,weeks:52,days:365,hours:365*24,minutes:365*24*60,seconds:365*24*60*60,milliseconds:365*24*60*60*1e3},quarters:{months:3,weeks:13,days:91,hours:91*24,minutes:91*24*60,seconds:91*24*60*60,milliseconds:91*24*60*60*1e3},months:{weeks:4,days:30,hours:30*24,minutes:30*24*60,seconds:30*24*60*60,milliseconds:30*24*60*60*1e3},...lowOrderMatrix},daysInYearAccurate=146097/400,daysInMonthAccurate=146097/4800,accurateMatrix={years:{quarters:4,months:12,weeks:daysInYearAccurate/7,days:daysInYearAccurate,hours:daysInYearAccurate*24,minutes:daysInYearAccurate*24*60,seconds:daysInYearAccurate*24*60*60,milliseconds:daysInYearAccurate*24*60*60*1e3},quarters:{months:3,weeks:daysInYearAccurate/28,days:daysInYearAccurate/4,hours:daysInYearAccurate*24/4,minutes:daysInYearAccurate*24*60/4,seconds:daysInYearAccurate*24*60*60/4,milliseconds:daysInYearAccurate*24*60*60*1e3/4},months:{weeks:daysInMonthAccurate/7,days:daysInMonthAccurate,hours:daysInMonthAccurate*24,minutes:daysInMonthAccurate*24*60,seconds:daysInMonthAccurate*24*60*60,milliseconds:daysInMonthAccurate*24*60*60*1e3},...lowOrderMatrix},orderedUnits$1=["years","quarters","months","weeks","days","hours","minutes","seconds","milliseconds"],reverseUnits=orderedUnits$1.slice(0).reverse();function clone$1(dur,alts,clear=!1){let conf={values:clear?alts.values:{...dur.values,...alts.values||{}},loc:dur.loc.clone(alts.loc),conversionAccuracy:alts.conversionAccuracy||dur.conversionAccuracy,matrix:alts.matrix||dur.matrix};return new Duration(conf)}function durationToMillis(matrix,vals){let sum=vals.milliseconds??0;for(let unit of reverseUnits.slice(1))vals[unit]&&(sum+=vals[unit]*matrix[unit].milliseconds);return sum}function normalizeValues(matrix,vals){let factor=durationToMillis(matrix,vals)<0?-1:1;orderedUnits$1.reduceRight((previous,current)=>{if(isUndefined(vals[current]))return previous;if(previous){let previousVal=vals[previous]*factor,conv=matrix[current][previous],rollUp=Math.floor(previousVal/conv);vals[current]+=rollUp*factor,vals[previous]-=rollUp*conv*factor}return current},null),orderedUnits$1.reduce((previous,current)=>{if(isUndefined(vals[current]))return previous;if(previous){let fraction=vals[previous]%1;vals[previous]-=fraction,vals[current]+=fraction*matrix[previous][current]}return current},null)}function removeZeroes(vals){let newVals={};for(let[key,value]of Object.entries(vals))value!==0&&(newVals[key]=value);return newVals}var Duration=class _Duration{constructor(config){let accurate=config.conversionAccuracy==="longterm"||!1,matrix=accurate?accurateMatrix:casualMatrix;config.matrix&&(matrix=config.matrix),this.values=config.values,this.loc=config.loc||Locale.create(),this.conversionAccuracy=accurate?"longterm":"casual",this.invalid=config.invalid||null,this.matrix=matrix,this.isLuxonDuration=!0}static fromMillis(count,opts){return _Duration.fromObject({milliseconds:count},opts)}static fromObject(obj,opts={}){if(obj==null||typeof obj!="object")throw new InvalidArgumentError(`Duration.fromObject: argument expected to be an object, got ${obj===null?"null":typeof obj}`);return new _Duration({values:normalizeObject(obj,_Duration.normalizeUnit),loc:Locale.fromObject(opts),conversionAccuracy:opts.conversionAccuracy,matrix:opts.matrix})}static fromDurationLike(durationLike){if(isNumber(durationLike))return _Duration.fromMillis(durationLike);if(_Duration.isDuration(durationLike))return durationLike;if(typeof durationLike=="object")return _Duration.fromObject(durationLike);throw new InvalidArgumentError(`Unknown duration argument ${durationLike} of type ${typeof durationLike}`)}static fromISO(text2,opts){let[parsed]=parseISODuration(text2);return parsed?_Duration.fromObject(parsed,opts):_Duration.invalid("unparsable",`the input "${text2}" can't be parsed as ISO 8601`)}static fromISOTime(text2,opts){let[parsed]=parseISOTimeOnly(text2);return parsed?_Duration.fromObject(parsed,opts):_Duration.invalid("unparsable",`the input "${text2}" can't be parsed as ISO 8601`)}static invalid(reason,explanation=null){if(!reason)throw new InvalidArgumentError("need to specify a reason the Duration is invalid");let invalid=reason instanceof Invalid?reason:new Invalid(reason,explanation);if(Settings.throwOnInvalid)throw new InvalidDurationError(invalid);return new _Duration({invalid})}static normalizeUnit(unit){let normalized={year:"years",years:"years",quarter:"quarters",quarters:"quarters",month:"months",months:"months",week:"weeks",weeks:"weeks",day:"days",days:"days",hour:"hours",hours:"hours",minute:"minutes",minutes:"minutes",second:"seconds",seconds:"seconds",millisecond:"milliseconds",milliseconds:"milliseconds"}[unit&&unit.toLowerCase()];if(!normalized)throw new InvalidUnitError(unit);return normalized}static isDuration(o){return o&&o.isLuxonDuration||!1}get locale(){return this.isValid?this.loc.locale:null}get numberingSystem(){return this.isValid?this.loc.numberingSystem:null}toFormat(fmt,opts={}){let fmtOpts={...opts,floor:opts.round!==!1&&opts.floor!==!1};return this.isValid?Formatter.create(this.loc,fmtOpts).formatDurationFromString(this,fmt):INVALID$2}toHuman(opts={}){if(!this.isValid)return INVALID$2;let showZeros=opts.showZeros!==!1,l2=orderedUnits$1.map(unit=>{let val=this.values[unit];return isUndefined(val)||val===0&&!showZeros?null:this.loc.numberFormatter({style:"unit",unitDisplay:"long",...opts,unit:unit.slice(0,-1)}).format(val)}).filter(n2=>n2);return this.loc.listFormatter({type:"conjunction",style:opts.listStyle||"narrow",...opts}).format(l2)}toObject(){return this.isValid?{...this.values}:{}}toISO(){if(!this.isValid)return null;let s2="P";return this.years!==0&&(s2+=this.years+"Y"),(this.months!==0||this.quarters!==0)&&(s2+=this.months+this.quarters*3+"M"),this.weeks!==0&&(s2+=this.weeks+"W"),this.days!==0&&(s2+=this.days+"D"),(this.hours!==0||this.minutes!==0||this.seconds!==0||this.milliseconds!==0)&&(s2+="T"),this.hours!==0&&(s2+=this.hours+"H"),this.minutes!==0&&(s2+=this.minutes+"M"),(this.seconds!==0||this.milliseconds!==0)&&(s2+=roundTo(this.seconds+this.milliseconds/1e3,3)+"S"),s2==="P"&&(s2+="T0S"),s2}toISOTime(opts={}){if(!this.isValid)return null;let millis=this.toMillis();return millis<0||millis>=864e5?null:(opts={suppressMilliseconds:!1,suppressSeconds:!1,includePrefix:!1,format:"extended",...opts,includeOffset:!1},DateTime.fromMillis(millis,{zone:"UTC"}).toISOTime(opts))}toJSON(){return this.toISO()}toString(){return this.toISO()}[Symbol.for("nodejs.util.inspect.custom")](){return this.isValid?`Duration { values: ${JSON.stringify(this.values)} }`:`Duration { Invalid, reason: ${this.invalidReason} }`}toMillis(){return this.isValid?durationToMillis(this.matrix,this.values):NaN}valueOf(){return this.toMillis()}plus(duration){if(!this.isValid)return this;let dur=_Duration.fromDurationLike(duration),result={};for(let k of orderedUnits$1)(hasOwnProperty(dur.values,k)||hasOwnProperty(this.values,k))&&(result[k]=dur.get(k)+this.get(k));return clone$1(this,{values:result},!0)}minus(duration){if(!this.isValid)return this;let dur=_Duration.fromDurationLike(duration);return this.plus(dur.negate())}mapUnits(fn){if(!this.isValid)return this;let result={};for(let k of Object.keys(this.values))result[k]=asNumber(fn(this.values[k],k));return clone$1(this,{values:result},!0)}get(unit){return this[_Duration.normalizeUnit(unit)]}set(values){if(!this.isValid)return this;let mixed={...this.values,...normalizeObject(values,_Duration.normalizeUnit)};return clone$1(this,{values:mixed})}reconfigure({locale,numberingSystem,conversionAccuracy,matrix}={}){let opts={loc:this.loc.clone({locale,numberingSystem}),matrix,conversionAccuracy};return clone$1(this,opts)}as(unit){return this.isValid?this.shiftTo(unit).get(unit):NaN}normalize(){if(!this.isValid)return this;let vals=this.toObject();return normalizeValues(this.matrix,vals),clone$1(this,{values:vals},!0)}rescale(){if(!this.isValid)return this;let vals=removeZeroes(this.normalize().shiftToAll().toObject());return clone$1(this,{values:vals},!0)}shiftTo(...units){if(!this.isValid)return this;if(units.length===0)return this;units=units.map(u=>_Duration.normalizeUnit(u));let built={},accumulated={},vals=this.toObject(),lastUnit;for(let k of orderedUnits$1)if(units.indexOf(k)>=0){lastUnit=k;let own=0;for(let ak in accumulated)own+=this.matrix[ak][k]*accumulated[ak],accumulated[ak]=0;isNumber(vals[k])&&(own+=vals[k]);let i=Math.trunc(own);built[k]=i,accumulated[k]=(own*1e3-i*1e3)/1e3}else isNumber(vals[k])&&(accumulated[k]=vals[k]);for(let key in accumulated)accumulated[key]!==0&&(built[lastUnit]+=key===lastUnit?accumulated[key]:accumulated[key]/this.matrix[lastUnit][key]);return normalizeValues(this.matrix,built),clone$1(this,{values:built},!0)}shiftToAll(){return this.isValid?this.shiftTo("years","months","weeks","days","hours","minutes","seconds","milliseconds"):this}negate(){if(!this.isValid)return this;let negated={};for(let k of Object.keys(this.values))negated[k]=this.values[k]===0?0:-this.values[k];return clone$1(this,{values:negated},!0)}removeZeros(){if(!this.isValid)return this;let vals=removeZeroes(this.values);return clone$1(this,{values:vals},!0)}get years(){return this.isValid?this.values.years||0:NaN}get quarters(){return this.isValid?this.values.quarters||0:NaN}get months(){return this.isValid?this.values.months||0:NaN}get weeks(){return this.isValid?this.values.weeks||0:NaN}get days(){return this.isValid?this.values.days||0:NaN}get hours(){return this.isValid?this.values.hours||0:NaN}get minutes(){return this.isValid?this.values.minutes||0:NaN}get seconds(){return this.isValid?this.values.seconds||0:NaN}get milliseconds(){return this.isValid?this.values.milliseconds||0:NaN}get isValid(){return this.invalid===null}get invalidReason(){return this.invalid?this.invalid.reason:null}get invalidExplanation(){return this.invalid?this.invalid.explanation:null}equals(other){if(!this.isValid||!other.isValid||!this.loc.equals(other.loc))return!1;function eq(v1,v2){return v1===void 0||v1===0?v2===void 0||v2===0:v1===v2}for(let u of orderedUnits$1)if(!eq(this.values[u],other.values[u]))return!1;return!0}},INVALID$1="Invalid Interval";function validateStartEnd(start,end){return!start||!start.isValid?Interval.invalid("missing or invalid start"):!end||!end.isValid?Interval.invalid("missing or invalid end"):end<start?Interval.invalid("end before start",`The end of an interval must be after its start, but you had start=${start.toISO()} and end=${end.toISO()}`):null}var Interval=class _Interval{constructor(config){this.s=config.start,this.e=config.end,this.invalid=config.invalid||null,this.isLuxonInterval=!0}static invalid(reason,explanation=null){if(!reason)throw new InvalidArgumentError("need to specify a reason the Interval is invalid");let invalid=reason instanceof Invalid?reason:new Invalid(reason,explanation);if(Settings.throwOnInvalid)throw new InvalidIntervalError(invalid);return new _Interval({invalid})}static fromDateTimes(start,end){let builtStart=friendlyDateTime(start),builtEnd=friendlyDateTime(end),validateError=validateStartEnd(builtStart,builtEnd);return validateError??new _Interval({start:builtStart,end:builtEnd})}static after(start,duration){let dur=Duration.fromDurationLike(duration),dt=friendlyDateTime(start);return _Interval.fromDateTimes(dt,dt.plus(dur))}static before(end,duration){let dur=Duration.fromDurationLike(duration),dt=friendlyDateTime(end);return _Interval.fromDateTimes(dt.minus(dur),dt)}static fromISO(text2,opts){let[s2,e]=(text2||"").split("/",2);if(s2&&e){let start,startIsValid;try{start=DateTime.fromISO(s2,opts),startIsValid=start.isValid}catch{startIsValid=!1}let end,endIsValid;try{end=DateTime.fromISO(e,opts),endIsValid=end.isValid}catch{endIsValid=!1}if(startIsValid&&endIsValid)return _Interval.fromDateTimes(start,end);if(startIsValid){let dur=Duration.fromISO(e,opts);if(dur.isValid)return _Interval.after(start,dur)}else if(endIsValid){let dur=Duration.fromISO(s2,opts);if(dur.isValid)return _Interval.before(end,dur)}}return _Interval.invalid("unparsable",`the input "${text2}" can't be parsed as ISO 8601`)}static isInterval(o){return o&&o.isLuxonInterval||!1}get start(){return this.isValid?this.s:null}get end(){return this.isValid?this.e:null}get lastDateTime(){return this.isValid&&this.e?this.e.minus(1):null}get isValid(){return this.invalidReason===null}get invalidReason(){return this.invalid?this.invalid.reason:null}get invalidExplanation(){return this.invalid?this.invalid.explanation:null}length(unit="milliseconds"){return this.isValid?this.toDuration(unit).get(unit):NaN}count(unit="milliseconds",opts){if(!this.isValid)return NaN;let start=this.start.startOf(unit,opts),end;return opts?.useLocaleWeeks?end=this.end.reconfigure({locale:start.locale}):end=this.end,end=end.startOf(unit,opts),Math.floor(end.diff(start,unit).get(unit))+(end.valueOf()!==this.end.valueOf())}hasSame(unit){return this.isValid?this.isEmpty()||this.e.minus(1).hasSame(this.s,unit):!1}isEmpty(){return this.s.valueOf()===this.e.valueOf()}isAfter(dateTime){return this.isValid?this.s>dateTime:!1}isBefore(dateTime){return this.isValid?this.e<=dateTime:!1}contains(dateTime){return this.isValid?this.s<=dateTime&&this.e>dateTime:!1}set({start,end}={}){return this.isValid?_Interval.fromDateTimes(start||this.s,end||this.e):this}splitAt(...dateTimes){if(!this.isValid)return[];let sorted2=dateTimes.map(friendlyDateTime).filter(d=>this.contains(d)).sort((a,b)=>a.toMillis()-b.toMillis()),results=[],{s:s2}=this,i=0;for(;s2<this.e;){let added=sorted2[i]||this.e,next=+added>+this.e?this.e:added;results.push(_Interval.fromDateTimes(s2,next)),s2=next,i+=1}return results}splitBy(duration){let dur=Duration.fromDurationLike(duration);if(!this.isValid||!dur.isValid||dur.as("milliseconds")===0)return[];let{s:s2}=this,idx=1,next,results=[];for(;s2<this.e;){let added=this.start.plus(dur.mapUnits(x=>x*idx));next=+added>+this.e?this.e:added,results.push(_Interval.fromDateTimes(s2,next)),s2=next,idx+=1}return results}divideEqually(numberOfParts){return this.isValid?this.splitBy(this.length()/numberOfParts).slice(0,numberOfParts):[]}overlaps(other){return this.e>other.s&&this.s<other.e}abutsStart(other){return this.isValid?+this.e==+other.s:!1}abutsEnd(other){return this.isValid?+other.e==+this.s:!1}engulfs(other){return this.isValid?this.s<=other.s&&this.e>=other.e:!1}equals(other){return!this.isValid||!other.isValid?!1:this.s.equals(other.s)&&this.e.equals(other.e)}intersection(other){if(!this.isValid)return this;let s2=this.s>other.s?this.s:other.s,e=this.e<other.e?this.e:other.e;return s2>=e?null:_Interval.fromDateTimes(s2,e)}union(other){if(!this.isValid)return this;let s2=this.s<other.s?this.s:other.s,e=this.e>other.e?this.e:other.e;return _Interval.fromDateTimes(s2,e)}static merge(intervals){let[found,final]=intervals.sort((a,b)=>a.s-b.s).reduce(([sofar,current],item)=>current?current.overlaps(item)||current.abutsStart(item)?[sofar,current.union(item)]:[sofar.concat([current]),item]:[sofar,item],[[],null]);return final&&found.push(final),found}static xor(intervals){let start=null,currentCount=0,results=[],ends=intervals.map(i=>[{time:i.s,type:"s"},{time:i.e,type:"e"}]),flattened=Array.prototype.concat(...ends),arr=flattened.sort((a,b)=>a.time-b.time);for(let i of arr)currentCount+=i.type==="s"?1:-1,currentCount===1?start=i.time:(start&&+start!=+i.time&&results.push(_Interval.fromDateTimes(start,i.time)),start=null);return _Interval.merge(results)}difference(...intervals){return _Interval.xor([this].concat(intervals)).map(i=>this.intersection(i)).filter(i=>i&&!i.isEmpty())}toString(){return this.isValid?`[${this.s.toISO()} \u2013 ${this.e.toISO()})`:INVALID$1}[Symbol.for("nodejs.util.inspect.custom")](){return this.isValid?`Interval { start: ${this.s.toISO()}, end: ${this.e.toISO()} }`:`Interval { Invalid, reason: ${this.invalidReason} }`}toLocaleString(formatOpts=DATE_SHORT,opts={}){return this.isValid?Formatter.create(this.s.loc.clone(opts),formatOpts).formatInterval(this):INVALID$1}toISO(opts){return this.isValid?`${this.s.toISO(opts)}/${this.e.toISO(opts)}`:INVALID$1}toISODate(){return this.isValid?`${this.s.toISODate()}/${this.e.toISODate()}`:INVALID$1}toISOTime(opts){return this.isValid?`${this.s.toISOTime(opts)}/${this.e.toISOTime(opts)}`:INVALID$1}toFormat(dateFormat,{separator=" \u2013 "}={}){return this.isValid?`${this.s.toFormat(dateFormat)}${separator}${this.e.toFormat(dateFormat)}`:INVALID$1}toDuration(unit,opts){return this.isValid?this.e.diff(this.s,unit,opts):Duration.invalid(this.invalidReason)}mapEndpoints(mapFn){return _Interval.fromDateTimes(mapFn(this.s),mapFn(this.e))}},Info=class{static hasDST(zone=Settings.defaultZone){let proto=DateTime.now().setZone(zone).set({month:12});return!zone.isUniversal&&proto.offset!==proto.set({month:6}).offset}static isValidIANAZone(zone){return IANAZone.isValidZone(zone)}static normalizeZone(input){return normalizeZone(input,Settings.defaultZone)}static getStartOfWeek({locale=null,locObj=null}={}){return(locObj||Locale.create(locale)).getStartOfWeek()}static getMinimumDaysInFirstWeek({locale=null,locObj=null}={}){return(locObj||Locale.create(locale)).getMinDaysInFirstWeek()}static getWeekendWeekdays({locale=null,locObj=null}={}){return(locObj||Locale.create(locale)).getWeekendDays().slice()}static months(length="long",{locale=null,numberingSystem=null,locObj=null,outputCalendar="gregory"}={}){return(locObj||Locale.create(locale,numberingSystem,outputCalendar)).months(length)}static monthsFormat(length="long",{locale=null,numberingSystem=null,locObj=null,outputCalendar="gregory"}={}){return(locObj||Locale.create(locale,numberingSystem,outputCalendar)).months(length,!0)}static weekdays(length="long",{locale=null,numberingSystem=null,locObj=null}={}){return(locObj||Locale.create(locale,numberingSystem,null)).weekdays(length)}static weekdaysFormat(length="long",{locale=null,numberingSystem=null,locObj=null}={}){return(locObj||Locale.create(locale,numberingSystem,null)).weekdays(length,!0)}static meridiems({locale=null}={}){return Locale.create(locale).meridiems()}static eras(length="short",{locale=null}={}){return Locale.create(locale,null,"gregory").eras(length)}static features(){return{relative:hasRelative(),localeWeek:hasLocaleWeekInfo()}}};function dayDiff(earlier,later){let utcDayStart=dt=>dt.toUTC(0,{keepLocalTime:!0}).startOf("day").valueOf(),ms3=utcDayStart(later)-utcDayStart(earlier);return Math.floor(Duration.fromMillis(ms3).as("days"))}function highOrderDiffs(cursor,later,units){let differs=[["years",(a,b)=>b.year-a.year],["quarters",(a,b)=>b.quarter-a.quarter+(b.year-a.year)*4],["months",(a,b)=>b.month-a.month+(b.year-a.year)*12],["weeks",(a,b)=>{let days=dayDiff(a,b);return(days-days%7)/7}],["days",dayDiff]],results={},earlier=cursor,lowestOrder,highWater;for(let[unit,differ]of differs)units.indexOf(unit)>=0&&(lowestOrder=unit,results[unit]=differ(cursor,later),highWater=earlier.plus(results),highWater>later?(results[unit]--,cursor=earlier.plus(results),cursor>later&&(highWater=cursor,results[unit]--,cursor=earlier.plus(results))):cursor=highWater);return[cursor,results,highWater,lowestOrder]}function diff(earlier,later,units,opts){let[cursor,results,highWater,lowestOrder]=highOrderDiffs(earlier,later,units),remainingMillis=later-cursor,lowerOrderUnits=units.filter(u=>["hours","minutes","seconds","milliseconds"].indexOf(u)>=0);lowerOrderUnits.length===0&&(highWater<later&&(highWater=cursor.plus({[lowestOrder]:1})),highWater!==cursor&&(results[lowestOrder]=(results[lowestOrder]||0)+remainingMillis/(highWater-cursor)));let duration=Duration.fromObject(results,opts);return lowerOrderUnits.length>0?Duration.fromMillis(remainingMillis,opts).shiftTo(...lowerOrderUnits).plus(duration):duration}var MISSING_FTP="missing Intl.DateTimeFormat.formatToParts support";function intUnit(regex,post=i=>i){return{regex,deser:([s2])=>post(parseDigits(s2))}}var NBSP=String.fromCharCode(160),spaceOrNBSP=`[ ${NBSP}]`,spaceOrNBSPRegExp=new RegExp(spaceOrNBSP,"g");function fixListRegex(s2){return s2.replace(/\./g,"\\.?").replace(spaceOrNBSPRegExp,spaceOrNBSP)}function stripInsensitivities(s2){return s2.replace(/\./g,"").replace(spaceOrNBSPRegExp," ").toLowerCase()}function oneOf(strings,startIndex){return strings===null?null:{regex:RegExp(strings.map(fixListRegex).join("|")),deser:([s2])=>strings.findIndex(i=>stripInsensitivities(s2)===stripInsensitivities(i))+startIndex}}function offset(regex,groups){return{regex,deser:([,h,m])=>signedOffset(h,m),groups}}function simple(regex){return{regex,deser:([s2])=>s2}}function escapeToken(value){return value.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&")}function unitForToken(token2,loc){let one=digitRegex(loc),two=digitRegex(loc,"{2}"),three=digitRegex(loc,"{3}"),four=digitRegex(loc,"{4}"),six=digitRegex(loc,"{6}"),oneOrTwo=digitRegex(loc,"{1,2}"),oneToThree=digitRegex(loc,"{1,3}"),oneToSix=digitRegex(loc,"{1,6}"),oneToNine=digitRegex(loc,"{1,9}"),twoToFour=digitRegex(loc,"{2,4}"),fourToSix=digitRegex(loc,"{4,6}"),literal=t=>({regex:RegExp(escapeToken(t.val)),deser:([s2])=>s2,literal:!0}),unit=(t=>{if(token2.literal)return literal(t);switch(t.val){case"G":return oneOf(loc.eras("short"),0);case"GG":return oneOf(loc.eras("long"),0);case"y":return intUnit(oneToSix);case"yy":return intUnit(twoToFour,untruncateYear);case"yyyy":return intUnit(four);case"yyyyy":return intUnit(fourToSix);case"yyyyyy":return intUnit(six);case"M":return intUnit(oneOrTwo);case"MM":return intUnit(two);case"MMM":return oneOf(loc.months("short",!0),1);case"MMMM":return oneOf(loc.months("long",!0),1);case"L":return intUnit(oneOrTwo);case"LL":return intUnit(two);case"LLL":return oneOf(loc.months("short",!1),1);case"LLLL":return oneOf(loc.months("long",!1),1);case"d":return intUnit(oneOrTwo);case"dd":return intUnit(two);case"o":return intUnit(oneToThree);case"ooo":return intUnit(three);case"HH":return intUnit(two);case"H":return intUnit(oneOrTwo);case"hh":return intUnit(two);case"h":return intUnit(oneOrTwo);case"mm":return intUnit(two);case"m":return intUnit(oneOrTwo);case"q":return intUnit(oneOrTwo);case"qq":return intUnit(two);case"s":return intUnit(oneOrTwo);case"ss":return intUnit(two);case"S":return intUnit(oneToThree);case"SSS":return intUnit(three);case"u":return simple(oneToNine);case"uu":return simple(oneOrTwo);case"uuu":return intUnit(one);case"a":return oneOf(loc.meridiems(),0);case"kkkk":return intUnit(four);case"kk":return intUnit(twoToFour,untruncateYear);case"W":return intUnit(oneOrTwo);case"WW":return intUnit(two);case"E":case"c":return intUnit(one);case"EEE":return oneOf(loc.weekdays("short",!1),1);case"EEEE":return oneOf(loc.weekdays("long",!1),1);case"ccc":return oneOf(loc.weekdays("short",!0),1);case"cccc":return oneOf(loc.weekdays("long",!0),1);case"Z":case"ZZ":return offset(new RegExp(`([+-]${oneOrTwo.source})(?::(${two.source}))?`),2);case"ZZZ":return offset(new RegExp(`([+-]${oneOrTwo.source})(${two.source})?`),2);case"z":return simple(/[a-z_+-/]{1,256}?/i);case" ":return simple(/[^\S\n\r]/);default:return literal(t)}})(token2)||{invalidReason:MISSING_FTP};return unit.token=token2,unit}var partTypeStyleToTokenVal={year:{"2-digit":"yy",numeric:"yyyyy"},month:{numeric:"M","2-digit":"MM",short:"MMM",long:"MMMM"},day:{numeric:"d","2-digit":"dd"},weekday:{short:"EEE",long:"EEEE"},dayperiod:"a",dayPeriod:"a",hour12:{numeric:"h","2-digit":"hh"},hour24:{numeric:"H","2-digit":"HH"},minute:{numeric:"m","2-digit":"mm"},second:{numeric:"s","2-digit":"ss"},timeZoneName:{long:"ZZZZZ",short:"ZZZ"}};function tokenForPart(part,formatOpts,resolvedOpts){let{type,value}=part;if(type==="literal"){let isSpace=/^\s+$/.test(value);return{literal:!isSpace,val:isSpace?" ":value}}let style=formatOpts[type],actualType=type;type==="hour"&&(formatOpts.hour12!=null?actualType=formatOpts.hour12?"hour12":"hour24":formatOpts.hourCycle!=null?formatOpts.hourCycle==="h11"||formatOpts.hourCycle==="h12"?actualType="hour12":actualType="hour24":actualType=resolvedOpts.hour12?"hour12":"hour24");let val=partTypeStyleToTokenVal[actualType];if(typeof val=="object"&&(val=val[style]),val)return{literal:!1,val}}function buildRegex(units){return[`^${units.map(u=>u.regex).reduce((f,r)=>`${f}(${r.source})`,"")}$`,units]}function match(input,regex,handlers){let matches=input.match(regex);if(matches){let all={},matchIndex=1;for(let i in handlers)if(hasOwnProperty(handlers,i)){let h=handlers[i],groups=h.groups?h.groups+1:1;!h.literal&&h.token&&(all[h.token.val[0]]=h.deser(matches.slice(matchIndex,matchIndex+groups))),matchIndex+=groups}return[matches,all]}else return[matches,{}]}function dateTimeFromMatches(matches){let toField=token2=>{switch(token2){case"S":return"millisecond";case"s":return"second";case"m":return"minute";case"h":case"H":return"hour";case"d":return"day";case"o":return"ordinal";case"L":case"M":return"month";case"y":return"year";case"E":case"c":return"weekday";case"W":return"weekNumber";case"k":return"weekYear";case"q":return"quarter";default:return null}},zone=null,specificOffset;return isUndefined(matches.z)||(zone=IANAZone.create(matches.z)),isUndefined(matches.Z)||(zone||(zone=new FixedOffsetZone(matches.Z)),specificOffset=matches.Z),isUndefined(matches.q)||(matches.M=(matches.q-1)*3+1),isUndefined(matches.h)||(matches.h<12&&matches.a===1?matches.h+=12:matches.h===12&&matches.a===0&&(matches.h=0)),matches.G===0&&matches.y&&(matches.y=-matches.y),isUndefined(matches.u)||(matches.S=parseMillis(matches.u)),[Object.keys(matches).reduce((r,k)=>{let f=toField(k);return f&&(r[f]=matches[k]),r},{}),zone,specificOffset]}var dummyDateTimeCache=null;function getDummyDateTime(){return dummyDateTimeCache||(dummyDateTimeCache=DateTime.fromMillis(1555555555555)),dummyDateTimeCache}function maybeExpandMacroToken(token2,locale){if(token2.literal)return token2;let formatOpts=Formatter.macroTokenToFormatOpts(token2.val),tokens=formatOptsToTokens(formatOpts,locale);return tokens==null||tokens.includes(void 0)?token2:tokens}function expandMacroTokens(tokens,locale){return Array.prototype.concat(...tokens.map(t=>maybeExpandMacroToken(t,locale)))}var TokenParser=class{constructor(locale,format){if(this.locale=locale,this.format=format,this.tokens=expandMacroTokens(Formatter.parseFormat(format),locale),this.units=this.tokens.map(t=>unitForToken(t,locale)),this.disqualifyingUnit=this.units.find(t=>t.invalidReason),!this.disqualifyingUnit){let[regexString,handlers]=buildRegex(this.units);this.regex=RegExp(regexString,"i"),this.handlers=handlers}}explainFromTokens(input){if(this.isValid){let[rawMatches,matches]=match(input,this.regex,this.handlers),[result,zone,specificOffset]=matches?dateTimeFromMatches(matches):[null,null,void 0];if(hasOwnProperty(matches,"a")&&hasOwnProperty(matches,"H"))throw new ConflictingSpecificationError("Can't include meridiem when specifying 24-hour format");return{input,tokens:this.tokens,regex:this.regex,rawMatches,matches,result,zone,specificOffset}}else return{input,tokens:this.tokens,invalidReason:this.invalidReason}}get isValid(){return!this.disqualifyingUnit}get invalidReason(){return this.disqualifyingUnit?this.disqualifyingUnit.invalidReason:null}};function explainFromTokens(locale,input,format){return new TokenParser(locale,format).explainFromTokens(input)}function parseFromTokens(locale,input,format){let{result,zone,specificOffset,invalidReason}=explainFromTokens(locale,input,format);return[result,zone,specificOffset,invalidReason]}function formatOptsToTokens(formatOpts,locale){if(!formatOpts)return null;let df=Formatter.create(locale,formatOpts).dtFormatter(getDummyDateTime()),parts=df.formatToParts(),resolvedOpts=df.resolvedOptions();return parts.map(p=>tokenForPart(p,formatOpts,resolvedOpts))}var INVALID="Invalid DateTime",MAX_DATE=864e13;function unsupportedZone(zone){return new Invalid("unsupported zone",`the zone "${zone.name}" is not supported`)}function possiblyCachedWeekData(dt){return dt.weekData===null&&(dt.weekData=gregorianToWeek(dt.c)),dt.weekData}function possiblyCachedLocalWeekData(dt){return dt.localWeekData===null&&(dt.localWeekData=gregorianToWeek(dt.c,dt.loc.getMinDaysInFirstWeek(),dt.loc.getStartOfWeek())),dt.localWeekData}function clone(inst,alts){let current={ts:inst.ts,zone:inst.zone,c:inst.c,o:inst.o,loc:inst.loc,invalid:inst.invalid};return new DateTime({...current,...alts,old:current})}function fixOffset(localTS,o,tz){let utcGuess=localTS-o*60*1e3,o2=tz.offset(utcGuess);if(o===o2)return[utcGuess,o];utcGuess-=(o2-o)*60*1e3;let o3=tz.offset(utcGuess);return o2===o3?[utcGuess,o2]:[localTS-Math.min(o2,o3)*60*1e3,Math.max(o2,o3)]}function tsToObj(ts,offset2){ts+=offset2*60*1e3;let d=new Date(ts);return{year:d.getUTCFullYear(),month:d.getUTCMonth()+1,day:d.getUTCDate(),hour:d.getUTCHours(),minute:d.getUTCMinutes(),second:d.getUTCSeconds(),millisecond:d.getUTCMilliseconds()}}function objToTS(obj,offset2,zone){return fixOffset(objToLocalTS(obj),offset2,zone)}function adjustTime(inst,dur){let oPre=inst.o,year=inst.c.year+Math.trunc(dur.years),month=inst.c.month+Math.trunc(dur.months)+Math.trunc(dur.quarters)*3,c={...inst.c,year,month,day:Math.min(inst.c.day,daysInMonth(year,month))+Math.trunc(dur.days)+Math.trunc(dur.weeks)*7},millisToAdd=Duration.fromObject({years:dur.years-Math.trunc(dur.years),quarters:dur.quarters-Math.trunc(dur.quarters),months:dur.months-Math.trunc(dur.months),weeks:dur.weeks-Math.trunc(dur.weeks),days:dur.days-Math.trunc(dur.days),hours:dur.hours,minutes:dur.minutes,seconds:dur.seconds,milliseconds:dur.milliseconds}).as("milliseconds"),localTS=objToLocalTS(c),[ts,o]=fixOffset(localTS,oPre,inst.zone);return millisToAdd!==0&&(ts+=millisToAdd,o=inst.zone.offset(ts)),{ts,o}}function parseDataToDateTime(parsed,parsedZone,opts,format,text2,specificOffset){let{setZone,zone}=opts;if(parsed&&Object.keys(parsed).length!==0||parsedZone){let interpretationZone=parsedZone||zone,inst=DateTime.fromObject(parsed,{...opts,zone:interpretationZone,specificOffset});return setZone?inst:inst.setZone(zone)}else return DateTime.invalid(new Invalid("unparsable",`the input "${text2}" can't be parsed as ${format}`))}function toTechFormat(dt,format,allowZ=!0){return dt.isValid?Formatter.create(Locale.create("en-US"),{allowZ,forceSimple:!0}).formatDateTimeFromString(dt,format):null}function toISODate(o,extended,precision){let longFormat=o.c.year>9999||o.c.year<0,c="";if(longFormat&&o.c.year>=0&&(c+="+"),c+=padStart(o.c.year,longFormat?6:4),precision==="year")return c;if(extended){if(c+="-",c+=padStart(o.c.month),precision==="month")return c;c+="-"}else if(c+=padStart(o.c.month),precision==="month")return c;return c+=padStart(o.c.day),c}function toISOTime(o,extended,suppressSeconds,suppressMilliseconds,includeOffset,extendedZone,precision){let showSeconds=!suppressSeconds||o.c.millisecond!==0||o.c.second!==0,c="";switch(precision){case"day":case"month":case"year":break;default:if(c+=padStart(o.c.hour),precision==="hour")break;if(extended){if(c+=":",c+=padStart(o.c.minute),precision==="minute")break;showSeconds&&(c+=":",c+=padStart(o.c.second))}else{if(c+=padStart(o.c.minute),precision==="minute")break;showSeconds&&(c+=padStart(o.c.second))}if(precision==="second")break;showSeconds&&(!suppressMilliseconds||o.c.millisecond!==0)&&(c+=".",c+=padStart(o.c.millisecond,3))}return includeOffset&&(o.isOffsetFixed&&o.offset===0&&!extendedZone?c+="Z":o.o<0?(c+="-",c+=padStart(Math.trunc(-o.o/60)),c+=":",c+=padStart(Math.trunc(-o.o%60))):(c+="+",c+=padStart(Math.trunc(o.o/60)),c+=":",c+=padStart(Math.trunc(o.o%60)))),extendedZone&&(c+="["+o.zone.ianaName+"]"),c}var defaultUnitValues={month:1,day:1,hour:0,minute:0,second:0,millisecond:0},defaultWeekUnitValues={weekNumber:1,weekday:1,hour:0,minute:0,second:0,millisecond:0},defaultOrdinalUnitValues={ordinal:1,hour:0,minute:0,second:0,millisecond:0},orderedUnits=["year","month","day","hour","minute","second","millisecond"],orderedWeekUnits=["weekYear","weekNumber","weekday","hour","minute","second","millisecond"],orderedOrdinalUnits=["year","ordinal","hour","minute","second","millisecond"];function normalizeUnit(unit){let normalized={year:"year",years:"year",month:"month",months:"month",day:"day",days:"day",hour:"hour",hours:"hour",minute:"minute",minutes:"minute",quarter:"quarter",quarters:"quarter",second:"second",seconds:"second",millisecond:"millisecond",milliseconds:"millisecond",weekday:"weekday",weekdays:"weekday",weeknumber:"weekNumber",weeksnumber:"weekNumber",weeknumbers:"weekNumber",weekyear:"weekYear",weekyears:"weekYear",ordinal:"ordinal"}[unit.toLowerCase()];if(!normalized)throw new InvalidUnitError(unit);return normalized}function normalizeUnitWithLocalWeeks(unit){switch(unit.toLowerCase()){case"localweekday":case"localweekdays":return"localWeekday";case"localweeknumber":case"localweeknumbers":return"localWeekNumber";case"localweekyear":case"localweekyears":return"localWeekYear";default:return normalizeUnit(unit)}}function guessOffsetForZone(zone){if(zoneOffsetTs===void 0&&(zoneOffsetTs=Settings.now()),zone.type!=="iana")return zone.offset(zoneOffsetTs);let zoneName=zone.name,offsetGuess=zoneOffsetGuessCache.get(zoneName);return offsetGuess===void 0&&(offsetGuess=zone.offset(zoneOffsetTs),zoneOffsetGuessCache.set(zoneName,offsetGuess)),offsetGuess}function quickDT(obj,opts){let zone=normalizeZone(opts.zone,Settings.defaultZone);if(!zone.isValid)return DateTime.invalid(unsupportedZone(zone));let loc=Locale.fromObject(opts),ts,o;if(isUndefined(obj.year))ts=Settings.now();else{for(let u of orderedUnits)isUndefined(obj[u])&&(obj[u]=defaultUnitValues[u]);let invalid=hasInvalidGregorianData(obj)||hasInvalidTimeData(obj);if(invalid)return DateTime.invalid(invalid);let offsetProvis=guessOffsetForZone(zone);[ts,o]=objToTS(obj,offsetProvis,zone)}return new DateTime({ts,zone,loc,o})}function diffRelative(start,end,opts){let round=isUndefined(opts.round)?!0:opts.round,rounding=isUndefined(opts.rounding)?"trunc":opts.rounding,format=(c,unit)=>(c=roundTo(c,round||opts.calendary?0:2,opts.calendary?"round":rounding),end.loc.clone(opts).relFormatter(opts).format(c,unit)),differ=unit=>opts.calendary?end.hasSame(start,unit)?0:end.startOf(unit).diff(start.startOf(unit),unit).get(unit):end.diff(start,unit).get(unit);if(opts.unit)return format(differ(opts.unit),opts.unit);for(let unit of opts.units){let count=differ(unit);if(Math.abs(count)>=1)return format(count,unit)}return format(start>end?-0:0,opts.units[opts.units.length-1])}function lastOpts(argList){let opts={},args;return argList.length>0&&typeof argList[argList.length-1]=="object"?(opts=argList[argList.length-1],args=Array.from(argList).slice(0,argList.length-1)):args=Array.from(argList),[opts,args]}var zoneOffsetTs,zoneOffsetGuessCache=new Map,DateTime=class _DateTime{constructor(config){let zone=config.zone||Settings.defaultZone,invalid=config.invalid||(Number.isNaN(config.ts)?new Invalid("invalid input"):null)||(zone.isValid?null:unsupportedZone(zone));this.ts=isUndefined(config.ts)?Settings.now():config.ts;let c=null,o=null;if(!invalid)if(config.old&&config.old.ts===this.ts&&config.old.zone.equals(zone))[c,o]=[config.old.c,config.old.o];else{let ot=isNumber(config.o)&&!config.old?config.o:zone.offset(this.ts);c=tsToObj(this.ts,ot),invalid=Number.isNaN(c.year)?new Invalid("invalid input"):null,c=invalid?null:c,o=invalid?null:ot}this._zone=zone,this.loc=config.loc||Locale.create(),this.invalid=invalid,this.weekData=null,this.localWeekData=null,this.c=c,this.o=o,this.isLuxonDateTime=!0}static now(){return new _DateTime({})}static local(){let[opts,args]=lastOpts(arguments),[year,month,day,hour,minute,second,millisecond]=args;return quickDT({year,month,day,hour,minute,second,millisecond},opts)}static utc(){let[opts,args]=lastOpts(arguments),[year,month,day,hour,minute,second,millisecond]=args;return opts.zone=FixedOffsetZone.utcInstance,quickDT({year,month,day,hour,minute,second,millisecond},opts)}static fromJSDate(date,options={}){let ts=isDate(date)?date.valueOf():NaN;if(Number.isNaN(ts))return _DateTime.invalid("invalid input");let zoneToUse=normalizeZone(options.zone,Settings.defaultZone);return zoneToUse.isValid?new _DateTime({ts,zone:zoneToUse,loc:Locale.fromObject(options)}):_DateTime.invalid(unsupportedZone(zoneToUse))}static fromMillis(milliseconds,options={}){if(isNumber(milliseconds))return milliseconds<-MAX_DATE||milliseconds>MAX_DATE?_DateTime.invalid("Timestamp out of range"):new _DateTime({ts:milliseconds,zone:normalizeZone(options.zone,Settings.defaultZone),loc:Locale.fromObject(options)});throw new InvalidArgumentError(`fromMillis requires a numerical input, but received a ${typeof milliseconds} with value ${milliseconds}`)}static fromSeconds(seconds,options={}){if(isNumber(seconds))return new _DateTime({ts:seconds*1e3,zone:normalizeZone(options.zone,Settings.defaultZone),loc:Locale.fromObject(options)});throw new InvalidArgumentError("fromSeconds requires a numerical input")}static fromObject(obj,opts={}){obj=obj||{};let zoneToUse=normalizeZone(opts.zone,Settings.defaultZone);if(!zoneToUse.isValid)return _DateTime.invalid(unsupportedZone(zoneToUse));let loc=Locale.fromObject(opts),normalized=normalizeObject(obj,normalizeUnitWithLocalWeeks),{minDaysInFirstWeek,startOfWeek}=usesLocalWeekValues(normalized,loc),tsNow=Settings.now(),offsetProvis=isUndefined(opts.specificOffset)?zoneToUse.offset(tsNow):opts.specificOffset,containsOrdinal=!isUndefined(normalized.ordinal),containsGregorYear=!isUndefined(normalized.year),containsGregorMD=!isUndefined(normalized.month)||!isUndefined(normalized.day),containsGregor=containsGregorYear||containsGregorMD,definiteWeekDef=normalized.weekYear||normalized.weekNumber;if((containsGregor||containsOrdinal)&&definiteWeekDef)throw new ConflictingSpecificationError("Can't mix weekYear/weekNumber units with year/month/day or ordinals");if(containsGregorMD&&containsOrdinal)throw new ConflictingSpecificationError("Can't mix ordinal dates with month/day");let useWeekData=definiteWeekDef||normalized.weekday&&!containsGregor,units,defaultValues,objNow=tsToObj(tsNow,offsetProvis);useWeekData?(units=orderedWeekUnits,defaultValues=defaultWeekUnitValues,objNow=gregorianToWeek(objNow,minDaysInFirstWeek,startOfWeek)):containsOrdinal?(units=orderedOrdinalUnits,defaultValues=defaultOrdinalUnitValues,objNow=gregorianToOrdinal(objNow)):(units=orderedUnits,defaultValues=defaultUnitValues);let foundFirst=!1;for(let u of units){let v=normalized[u];isUndefined(v)?foundFirst?normalized[u]=defaultValues[u]:normalized[u]=objNow[u]:foundFirst=!0}let higherOrderInvalid=useWeekData?hasInvalidWeekData(normalized,minDaysInFirstWeek,startOfWeek):containsOrdinal?hasInvalidOrdinalData(normalized):hasInvalidGregorianData(normalized),invalid=higherOrderInvalid||hasInvalidTimeData(normalized);if(invalid)return _DateTime.invalid(invalid);let gregorian=useWeekData?weekToGregorian(normalized,minDaysInFirstWeek,startOfWeek):containsOrdinal?ordinalToGregorian(normalized):normalized,[tsFinal,offsetFinal]=objToTS(gregorian,offsetProvis,zoneToUse),inst=new _DateTime({ts:tsFinal,zone:zoneToUse,o:offsetFinal,loc});return normalized.weekday&&containsGregor&&obj.weekday!==inst.weekday?_DateTime.invalid("mismatched weekday",`you can't specify both a weekday of ${normalized.weekday} and a date of ${inst.toISO()}`):inst.isValid?inst:_DateTime.invalid(inst.invalid)}static fromISO(text2,opts={}){let[vals,parsedZone]=parseISODate(text2);return parseDataToDateTime(vals,parsedZone,opts,"ISO 8601",text2)}static fromRFC2822(text2,opts={}){let[vals,parsedZone]=parseRFC2822Date(text2);return parseDataToDateTime(vals,parsedZone,opts,"RFC 2822",text2)}static fromHTTP(text2,opts={}){let[vals,parsedZone]=parseHTTPDate(text2);return parseDataToDateTime(vals,parsedZone,opts,"HTTP",opts)}static fromFormat(text2,fmt,opts={}){if(isUndefined(text2)||isUndefined(fmt))throw new InvalidArgumentError("fromFormat requires an input string and a format");let{locale=null,numberingSystem=null}=opts,localeToUse=Locale.fromOpts({locale,numberingSystem,defaultToEN:!0}),[vals,parsedZone,specificOffset,invalid]=parseFromTokens(localeToUse,text2,fmt);return invalid?_DateTime.invalid(invalid):parseDataToDateTime(vals,parsedZone,opts,`format ${fmt}`,text2,specificOffset)}static fromString(text2,fmt,opts={}){return _DateTime.fromFormat(text2,fmt,opts)}static fromSQL(text2,opts={}){let[vals,parsedZone]=parseSQL(text2);return parseDataToDateTime(vals,parsedZone,opts,"SQL",text2)}static invalid(reason,explanation=null){if(!reason)throw new InvalidArgumentError("need to specify a reason the DateTime is invalid");let invalid=reason instanceof Invalid?reason:new Invalid(reason,explanation);if(Settings.throwOnInvalid)throw new InvalidDateTimeError(invalid);return new _DateTime({invalid})}static isDateTime(o){return o&&o.isLuxonDateTime||!1}static parseFormatForOpts(formatOpts,localeOpts={}){let tokenList=formatOptsToTokens(formatOpts,Locale.fromObject(localeOpts));return tokenList?tokenList.map(t=>t?t.val:null).join(""):null}static expandFormat(fmt,localeOpts={}){return expandMacroTokens(Formatter.parseFormat(fmt),Locale.fromObject(localeOpts)).map(t=>t.val).join("")}static resetCache(){zoneOffsetTs=void 0,zoneOffsetGuessCache.clear()}get(unit){return this[unit]}get isValid(){return this.invalid===null}get invalidReason(){return this.invalid?this.invalid.reason:null}get invalidExplanation(){return this.invalid?this.invalid.explanation:null}get locale(){return this.isValid?this.loc.locale:null}get numberingSystem(){return this.isValid?this.loc.numberingSystem:null}get outputCalendar(){return this.isValid?this.loc.outputCalendar:null}get zone(){return this._zone}get zoneName(){return this.isValid?this.zone.name:null}get year(){return this.isValid?this.c.year:NaN}get quarter(){return this.isValid?Math.ceil(this.c.month/3):NaN}get month(){return this.isValid?this.c.month:NaN}get day(){return this.isValid?this.c.day:NaN}get hour(){return this.isValid?this.c.hour:NaN}get minute(){return this.isValid?this.c.minute:NaN}get second(){return this.isValid?this.c.second:NaN}get millisecond(){return this.isValid?this.c.millisecond:NaN}get weekYear(){return this.isValid?possiblyCachedWeekData(this).weekYear:NaN}get weekNumber(){return this.isValid?possiblyCachedWeekData(this).weekNumber:NaN}get weekday(){return this.isValid?possiblyCachedWeekData(this).weekday:NaN}get isWeekend(){return this.isValid&&this.loc.getWeekendDays().includes(this.weekday)}get localWeekday(){return this.isValid?possiblyCachedLocalWeekData(this).weekday:NaN}get localWeekNumber(){return this.isValid?possiblyCachedLocalWeekData(this).weekNumber:NaN}get localWeekYear(){return this.isValid?possiblyCachedLocalWeekData(this).weekYear:NaN}get ordinal(){return this.isValid?gregorianToOrdinal(this.c).ordinal:NaN}get monthShort(){return this.isValid?Info.months("short",{locObj:this.loc})[this.month-1]:null}get monthLong(){return this.isValid?Info.months("long",{locObj:this.loc})[this.month-1]:null}get weekdayShort(){return this.isValid?Info.weekdays("short",{locObj:this.loc})[this.weekday-1]:null}get weekdayLong(){return this.isValid?Info.weekdays("long",{locObj:this.loc})[this.weekday-1]:null}get offset(){return this.isValid?+this.o:NaN}get offsetNameShort(){return this.isValid?this.zone.offsetName(this.ts,{format:"short",locale:this.locale}):null}get offsetNameLong(){return this.isValid?this.zone.offsetName(this.ts,{format:"long",locale:this.locale}):null}get isOffsetFixed(){return this.isValid?this.zone.isUniversal:null}get isInDST(){return this.isOffsetFixed?!1:this.offset>this.set({month:1,day:1}).offset||this.offset>this.set({month:5}).offset}getPossibleOffsets(){if(!this.isValid||this.isOffsetFixed)return[this];let dayMs=864e5,minuteMs=6e4,localTS=objToLocalTS(this.c),oEarlier=this.zone.offset(localTS-dayMs),oLater=this.zone.offset(localTS+dayMs),o1=this.zone.offset(localTS-oEarlier*minuteMs),o2=this.zone.offset(localTS-oLater*minuteMs);if(o1===o2)return[this];let ts1=localTS-o1*minuteMs,ts2=localTS-o2*minuteMs,c1=tsToObj(ts1,o1),c2=tsToObj(ts2,o2);return c1.hour===c2.hour&&c1.minute===c2.minute&&c1.second===c2.second&&c1.millisecond===c2.millisecond?[clone(this,{ts:ts1}),clone(this,{ts:ts2})]:[this]}get isInLeapYear(){return isLeapYear(this.year)}get daysInMonth(){return daysInMonth(this.year,this.month)}get daysInYear(){return this.isValid?daysInYear(this.year):NaN}get weeksInWeekYear(){return this.isValid?weeksInWeekYear(this.weekYear):NaN}get weeksInLocalWeekYear(){return this.isValid?weeksInWeekYear(this.localWeekYear,this.loc.getMinDaysInFirstWeek(),this.loc.getStartOfWeek()):NaN}resolvedLocaleOptions(opts={}){let{locale,numberingSystem,calendar}=Formatter.create(this.loc.clone(opts),opts).resolvedOptions(this);return{locale,numberingSystem,outputCalendar:calendar}}toUTC(offset2=0,opts={}){return this.setZone(FixedOffsetZone.instance(offset2),opts)}toLocal(){return this.setZone(Settings.defaultZone)}setZone(zone,{keepLocalTime=!1,keepCalendarTime=!1}={}){if(zone=normalizeZone(zone,Settings.defaultZone),zone.equals(this.zone))return this;if(zone.isValid){let newTS=this.ts;if(keepLocalTime||keepCalendarTime){let offsetGuess=zone.offset(this.ts),asObj=this.toObject();[newTS]=objToTS(asObj,offsetGuess,zone)}return clone(this,{ts:newTS,zone})}else return _DateTime.invalid(unsupportedZone(zone))}reconfigure({locale,numberingSystem,outputCalendar}={}){let loc=this.loc.clone({locale,numberingSystem,outputCalendar});return clone(this,{loc})}setLocale(locale){return this.reconfigure({locale})}set(values){if(!this.isValid)return this;let normalized=normalizeObject(values,normalizeUnitWithLocalWeeks),{minDaysInFirstWeek,startOfWeek}=usesLocalWeekValues(normalized,this.loc),settingWeekStuff=!isUndefined(normalized.weekYear)||!isUndefined(normalized.weekNumber)||!isUndefined(normalized.weekday),containsOrdinal=!isUndefined(normalized.ordinal),containsGregorYear=!isUndefined(normalized.year),containsGregorMD=!isUndefined(normalized.month)||!isUndefined(normalized.day),containsGregor=containsGregorYear||containsGregorMD,definiteWeekDef=normalized.weekYear||normalized.weekNumber;if((containsGregor||containsOrdinal)&&definiteWeekDef)throw new ConflictingSpecificationError("Can't mix weekYear/weekNumber units with year/month/day or ordinals");if(containsGregorMD&&containsOrdinal)throw new ConflictingSpecificationError("Can't mix ordinal dates with month/day");let mixed;settingWeekStuff?mixed=weekToGregorian({...gregorianToWeek(this.c,minDaysInFirstWeek,startOfWeek),...normalized},minDaysInFirstWeek,startOfWeek):isUndefined(normalized.ordinal)?(mixed={...this.toObject(),...normalized},isUndefined(normalized.day)&&(mixed.day=Math.min(daysInMonth(mixed.year,mixed.month),mixed.day))):mixed=ordinalToGregorian({...gregorianToOrdinal(this.c),...normalized});let[ts,o]=objToTS(mixed,this.o,this.zone);return clone(this,{ts,o})}plus(duration){if(!this.isValid)return this;let dur=Duration.fromDurationLike(duration);return clone(this,adjustTime(this,dur))}minus(duration){if(!this.isValid)return this;let dur=Duration.fromDurationLike(duration).negate();return clone(this,adjustTime(this,dur))}startOf(unit,{useLocaleWeeks=!1}={}){if(!this.isValid)return this;let o={},normalizedUnit=Duration.normalizeUnit(unit);switch(normalizedUnit){case"years":o.month=1;case"quarters":case"months":o.day=1;case"weeks":case"days":o.hour=0;case"hours":o.minute=0;case"minutes":o.second=0;case"seconds":o.millisecond=0;break}if(normalizedUnit==="weeks")if(useLocaleWeeks){let startOfWeek=this.loc.getStartOfWeek(),{weekday}=this;weekday<startOfWeek&&(o.weekNumber=this.weekNumber-1),o.weekday=startOfWeek}else o.weekday=1;if(normalizedUnit==="quarters"){let q=Math.ceil(this.month/3);o.month=(q-1)*3+1}return this.set(o)}endOf(unit,opts){return this.isValid?this.plus({[unit]:1}).startOf(unit,opts).minus(1):this}toFormat(fmt,opts={}){return this.isValid?Formatter.create(this.loc.redefaultToEN(opts)).formatDateTimeFromString(this,fmt):INVALID}toLocaleString(formatOpts=DATE_SHORT,opts={}){return this.isValid?Formatter.create(this.loc.clone(opts),formatOpts).formatDateTime(this):INVALID}toLocaleParts(opts={}){return this.isValid?Formatter.create(this.loc.clone(opts),opts).formatDateTimeParts(this):[]}toISO({format="extended",suppressSeconds=!1,suppressMilliseconds=!1,includeOffset=!0,extendedZone=!1,precision="milliseconds"}={}){if(!this.isValid)return null;precision=normalizeUnit(precision);let ext=format==="extended",c=toISODate(this,ext,precision);return orderedUnits.indexOf(precision)>=3&&(c+="T"),c+=toISOTime(this,ext,suppressSeconds,suppressMilliseconds,includeOffset,extendedZone,precision),c}toISODate({format="extended",precision="day"}={}){return this.isValid?toISODate(this,format==="extended",normalizeUnit(precision)):null}toISOWeekDate(){return toTechFormat(this,"kkkk-'W'WW-c")}toISOTime({suppressMilliseconds=!1,suppressSeconds=!1,includeOffset=!0,includePrefix=!1,extendedZone=!1,format="extended",precision="milliseconds"}={}){return this.isValid?(precision=normalizeUnit(precision),(includePrefix&&orderedUnits.indexOf(precision)>=3?"T":"")+toISOTime(this,format==="extended",suppressSeconds,suppressMilliseconds,includeOffset,extendedZone,precision)):null}toRFC2822(){return toTechFormat(this,"EEE, dd LLL yyyy HH:mm:ss ZZZ",!1)}toHTTP(){return toTechFormat(this.toUTC(),"EEE, dd LLL yyyy HH:mm:ss 'GMT'")}toSQLDate(){return this.isValid?toISODate(this,!0):null}toSQLTime({includeOffset=!0,includeZone=!1,includeOffsetSpace=!0}={}){let fmt="HH:mm:ss.SSS";return(includeZone||includeOffset)&&(includeOffsetSpace&&(fmt+=" "),includeZone?fmt+="z":includeOffset&&(fmt+="ZZ")),toTechFormat(this,fmt,!0)}toSQL(opts={}){return this.isValid?`${this.toSQLDate()} ${this.toSQLTime(opts)}`:null}toString(){return this.isValid?this.toISO():INVALID}[Symbol.for("nodejs.util.inspect.custom")](){return this.isValid?`DateTime { ts: ${this.toISO()}, zone: ${this.zone.name}, locale: ${this.locale} }`:`DateTime { Invalid, reason: ${this.invalidReason} }`}valueOf(){return this.toMillis()}toMillis(){return this.isValid?this.ts:NaN}toSeconds(){return this.isValid?this.ts/1e3:NaN}toUnixInteger(){return this.isValid?Math.floor(this.ts/1e3):NaN}toJSON(){return this.toISO()}toBSON(){return this.toJSDate()}toObject(opts={}){if(!this.isValid)return{};let base={...this.c};return opts.includeConfig&&(base.outputCalendar=this.outputCalendar,base.numberingSystem=this.loc.numberingSystem,base.locale=this.loc.locale),base}toJSDate(){return new Date(this.isValid?this.ts:NaN)}diff(otherDateTime,unit="milliseconds",opts={}){if(!this.isValid||!otherDateTime.isValid)return Duration.invalid("created by diffing an invalid DateTime");let durOpts={locale:this.locale,numberingSystem:this.numberingSystem,...opts},units=maybeArray(unit).map(Duration.normalizeUnit),otherIsLater=otherDateTime.valueOf()>this.valueOf(),earlier=otherIsLater?this:otherDateTime,later=otherIsLater?otherDateTime:this,diffed=diff(earlier,later,units,durOpts);return otherIsLater?diffed.negate():diffed}diffNow(unit="milliseconds",opts={}){return this.diff(_DateTime.now(),unit,opts)}until(otherDateTime){return this.isValid?Interval.fromDateTimes(this,otherDateTime):this}hasSame(otherDateTime,unit,opts){if(!this.isValid)return!1;let inputMs=otherDateTime.valueOf(),adjustedToZone=this.setZone(otherDateTime.zone,{keepLocalTime:!0});return adjustedToZone.startOf(unit,opts)<=inputMs&&inputMs<=adjustedToZone.endOf(unit,opts)}equals(other){return this.isValid&&other.isValid&&this.valueOf()===other.valueOf()&&this.zone.equals(other.zone)&&this.loc.equals(other.loc)}toRelative(options={}){if(!this.isValid)return null;let base=options.base||_DateTime.fromObject({},{zone:this.zone}),padding=options.padding?this<base?-options.padding:options.padding:0,units=["years","months","days","hours","minutes","seconds"],unit=options.unit;return Array.isArray(options.unit)&&(units=options.unit,unit=void 0),diffRelative(base,this.plus(padding),{...options,numeric:"always",units,unit})}toRelativeCalendar(options={}){return this.isValid?diffRelative(options.base||_DateTime.fromObject({},{zone:this.zone}),this,{...options,numeric:"auto",units:["years","months","days"],calendary:!0}):null}static min(...dateTimes){if(!dateTimes.every(_DateTime.isDateTime))throw new InvalidArgumentError("min requires all arguments be DateTimes");return bestBy(dateTimes,i=>i.valueOf(),Math.min)}static max(...dateTimes){if(!dateTimes.every(_DateTime.isDateTime))throw new InvalidArgumentError("max requires all arguments be DateTimes");return bestBy(dateTimes,i=>i.valueOf(),Math.max)}static fromFormatExplain(text2,fmt,options={}){let{locale=null,numberingSystem=null}=options,localeToUse=Locale.fromOpts({locale,numberingSystem,defaultToEN:!0});return explainFromTokens(localeToUse,text2,fmt)}static fromStringExplain(text2,fmt,options={}){return _DateTime.fromFormatExplain(text2,fmt,options)}static buildFormatParser(fmt,options={}){let{locale=null,numberingSystem=null}=options,localeToUse=Locale.fromOpts({locale,numberingSystem,defaultToEN:!0});return new TokenParser(localeToUse,fmt)}static fromFormatParser(text2,formatParser,opts={}){if(isUndefined(text2)||isUndefined(formatParser))throw new InvalidArgumentError("fromFormatParser requires an input string and a format parser");let{locale=null,numberingSystem=null}=opts,localeToUse=Locale.fromOpts({locale,numberingSystem,defaultToEN:!0});if(!localeToUse.equals(formatParser.locale))throw new InvalidArgumentError(`fromFormatParser called with a locale of ${localeToUse}, but the format parser was created for ${formatParser.locale}`);let{result,zone,specificOffset,invalidReason}=formatParser.explainFromTokens(text2);return invalidReason?_DateTime.invalid(invalidReason):parseDataToDateTime(result,zone,opts,`format ${formatParser.format}`,text2,specificOffset)}static get DATE_SHORT(){return DATE_SHORT}static get DATE_MED(){return DATE_MED}static get DATE_MED_WITH_WEEKDAY(){return DATE_MED_WITH_WEEKDAY}static get DATE_FULL(){return DATE_FULL}static get DATE_HUGE(){return DATE_HUGE}static get TIME_SIMPLE(){return TIME_SIMPLE}static get TIME_WITH_SECONDS(){return TIME_WITH_SECONDS}static get TIME_WITH_SHORT_OFFSET(){return TIME_WITH_SHORT_OFFSET}static get TIME_WITH_LONG_OFFSET(){return TIME_WITH_LONG_OFFSET}static get TIME_24_SIMPLE(){return TIME_24_SIMPLE}static get TIME_24_WITH_SECONDS(){return TIME_24_WITH_SECONDS}static get TIME_24_WITH_SHORT_OFFSET(){return TIME_24_WITH_SHORT_OFFSET}static get TIME_24_WITH_LONG_OFFSET(){return TIME_24_WITH_LONG_OFFSET}static get DATETIME_SHORT(){return DATETIME_SHORT}static get DATETIME_SHORT_WITH_SECONDS(){return DATETIME_SHORT_WITH_SECONDS}static get DATETIME_MED(){return DATETIME_MED}static get DATETIME_MED_WITH_SECONDS(){return DATETIME_MED_WITH_SECONDS}static get DATETIME_MED_WITH_WEEKDAY(){return DATETIME_MED_WITH_WEEKDAY}static get DATETIME_FULL(){return DATETIME_FULL}static get DATETIME_FULL_WITH_SECONDS(){return DATETIME_FULL_WITH_SECONDS}static get DATETIME_HUGE(){return DATETIME_HUGE}static get DATETIME_HUGE_WITH_SECONDS(){return DATETIME_HUGE_WITH_SECONDS}};function friendlyDateTime(dateTimeish){if(DateTime.isDateTime(dateTimeish))return dateTimeish;if(dateTimeish&&dateTimeish.valueOf&&isNumber(dateTimeish.valueOf()))return DateTime.fromJSDate(dateTimeish);if(dateTimeish&&typeof dateTimeish=="object")return DateTime.fromObject(dateTimeish);throw new InvalidArgumentError(`Unknown datetime argument: ${dateTimeish}, of type ${typeof dateTimeish}`)}var import_ms2=__toESM(require_ms(),1),LA_TIMEZONE="America/Los_Angeles";function toISOOrThrow(dt){if(!dt.isValid)throw new Error(`Invalid DateTime: ${dt.invalidReason}`);let iso=dt.toISO();if(!iso)throw new Error("Failed to convert DateTime to ISO");return iso}function getDefaultFromDateTime(){return DateTime.now().setZone(LA_TIMEZONE).startOf("month")}function getDefaultToDateTime(){return DateTime.utc()}function getDefaultFromDate(){let dt=getDefaultFromDateTime();return toISOOrThrow(dt.toUTC())}function getDefaultToDate(){let dt=getDefaultToDateTime();return toISOOrThrow(dt.toUTC())}function isRelativeTime(input){return(0,import_ms2.default)(input)!==void 0}function parseBillingDate(dateStr,isEndDate=!1){let relativeMs=(0,import_ms2.default)(dateStr);if(relativeMs!==void 0)return new Date(Date.now()-relativeMs).toISOString();if(dateStr.includes("T")){if(!DateTime.fromISO(dateStr).isValid)throw new Error(`Invalid date: "${dateStr}". Expected YYYY-MM-DD, ISO 8601 (YYYY-MM-DDTHH:mm:ss), or relative (7d)`);return dateStr}let laDateTime=DateTime.fromISO(dateStr,{zone:LA_TIMEZONE}).startOf("day");if(!laDateTime.isValid)throw new Error(`Invalid date: "${dateStr}". Expected YYYY-MM-DD, ISO 8601, or relative (7d)`);let finalDateTime=isEndDate?laDateTime.plus({days:1}):laDateTime;return toISOOrThrow(finalDateTime.toUTC())}function getISOWeekNumber(dateStr){let date=new Date(dateStr);date.setUTCDate(date.getUTCDate()+4-(date.getUTCDay()||7));let yearStart=new Date(Date.UTC(date.getUTCFullYear(),0,1));return Math.ceil(((date.getTime()-yearStart.getTime())/864e5+1)/7)}function getISOWeekYear(dateStr){let date=new Date(dateStr);return date.setUTCDate(date.getUTCDate()+4-(date.getUTCDay()||7)),date.getUTCFullYear()}function getPeriodKey(chargePeriodStart,breakdownPeriod){if(!chargePeriodStart)return"Unknown";switch(breakdownPeriod){case"daily":return chargePeriodStart.substring(0,10);case"weekly":{let weekYear=getISOWeekYear(chargePeriodStart),weekNum=getISOWeekNumber(chargePeriodStart);return`${weekYear}-W${weekNum.toString().padStart(2,"0")}`}case"monthly":return chargePeriodStart.substring(0,7);default:return chargePeriodStart.substring(0,10)}}var VALID_BREAKDOWN_PERIODS=["daily","weekly","monthly"];function isValidBreakdownPeriod(value){return value!==void 0&&VALID_BREAKDOWN_PERIODS.includes(value)}var VALID_GROUP_BY_DIMENSIONS=["project","region"];function isValidGroupByDimension(value){return value!==void 0&&VALID_GROUP_BY_DIMENSIONS.includes(value)}var import_chalk49=__toESM(require_source(),1);function formatUsageAmount(amount,unit){if(unit==="managed_infrastructure_units")return formatUsageQuantity(amount,"MIUs",{showSmallValues:!0});let formattedAmount=amount.toFixed(2);return amount!==0&&Number(formattedAmount)===0?amount>0?"<$0.01":">-$0.01":`$${formattedAmount}`}function formatUsageQuantity(quantity,unit="",options={}){let displayUnit=quantity===1&&options.singularUnit?options.singularUnit:unit;if(options.unitKind==="digitalStorage")return formatStorageQuantity(quantity,unit,options.showSmallValues);let formatter=new Intl.NumberFormat("en-US",{maximumFractionDigits:2,notation:options.compact&&Math.abs(quantity)>=1e3?"compact":"standard"}),formattedQuantity=formatter.format(quantity),roundsToZero=formatter.format(Math.abs(quantity))===formatter.format(0),displayQuantity=options.showSmallValues&&quantity!==0&&roundsToZero?quantity>0?`<${formatter.format(.01)}`:`>${formatter.format(-.01)}`:formattedQuantity;return displayUnit?`${displayQuantity} ${displayUnit}`:displayQuantity}function formatStorageQuantity(quantity,unit,showSmallValues=!1){let units=["byte","kilobyte","megabyte","gigabyte","terabyte"],symbols=["B","KB","MB","GB","TB"],startIndex=units.indexOf(unit.toLowerCase());if(startIndex===-1)return formatUsageQuantity(quantity,unit,{showSmallValues});let value=quantity,unitIndex=startIndex;for(;Math.abs(value)>=1e3&&unitIndex<symbols.length-1;)value/=1e3,unitIndex++;return formatUsageQuantity(value,symbols[unitIndex],{showSmallValues})}var import_chalk48=__toESM(require_source(),1);function formatServiceName(name,service){return service.included?`${name} (Flat Rate CDN)`:name}function formatServiceCost(service,costUnit){return service.included?"Included":formatUsageAmount(service.cost,costUnit)}function isEmptyService(service){return(service.category==="subscription"||service.quantity===0)&&service.cost===0}function visibleServices(services){return[...services.values()].filter(service=>!isEmptyService(service)).map(service=>[service.name,service])}function outputUsageHeader(data,title3,elapsedSuffix){let{log}=output_manager_default;log(`${title3} for ${data.contextType} ${import_chalk48.default.bold(data.contextName)} ${elapsedSuffix}`),log(""),data.usingDefaults?log(`${import_chalk48.default.gray("Billing cycle:")} ${formatRange(data.fromDisplay,data.toDisplay)}`):log(`${import_chalk48.default.gray("Period:")} ${formatRange(data.fromDisplay,data.toDisplay)}`),log(import_chalk48.default.gray(`Accrued through ${formatDate2(data.usageThrough)} in ${data.costUnit==="managed_infrastructure_units"?"MIUs":"USD"}, before credits and discounts.`)),log("")}function outputHiddenServicesHint(hiddenCount){hiddenCount<=0||output_manager_default.log(import_chalk48.default.gray(`${hiddenCount} ${hiddenCount===1?"service":"services"} with no usage hidden. Add --json to include ${hiddenCount===1?"it":"them"}.`))}function formatRange(from,to){let start=parseDate(from),end=parseDate(to);if(!start||!end)return`${from} to ${to}`;let sameYear=start.year===end.year;return`${start.toFormat(sameYear?"LLL d":"LLL d, yyyy")}\u2013${end.toFormat("LLL d, yyyy")}`}function formatDate2(value){return parseDate(value)?.toFormat("LLL d, yyyy")??value}function parseDate(value){let date=DateTime.fromISO(value,{zone:"utc"});return date.isValid?date:null}function outputAggregated({data,startTime}){let{print,log}=output_manager_default;if(outputUsageHeader(data,"Usage",elapsed(Date.now()-startTime)),data.creditBalance){log(import_chalk49.default.bold("Current credit balance")),data.creditBalance.cadence&&log(` ${import_chalk49.default.gray("Cadence")} ${formatCadence(data.creditBalance.cadence)}`),log(` ${import_chalk49.default.gray("Used")} ${formatCredit(data.creditBalance.used,data.creditBalance.currency)} of ${formatCredit(data.creditBalance.allocated,data.creditBalance.currency)}`),log(` ${import_chalk49.default.gray("Remaining")} ${formatCredit(data.creditBalance.remaining,data.creditBalance.currency)}`);let progress=data.creditBalance.allocated>0?data.creditBalance.used/data.creditBalance.allocated*100:0;log(` ${import_chalk49.default.gray("Progress")} ${Math.round(progress)}%`),log("")}let allServices=[...data.services.entries()],sortedServices=visibleServices(data.services).sort((a,b)=>b[1].cost-a[1].cost);if(sortedServices.length===0){log("No usage data found for this period."),outputHiddenServicesHint(allServices.length);return}let usage2=sortedServices.filter(([,service])=>service.category==="usage"),subscriptions=sortedServices.filter(([,service])=>service.category==="subscription");usage2.length>0&&(log(import_chalk49.default.bold("Infrastructure")),printTable(print,usage2,"Infrastructure subtotal",data.costUnit),log("")),subscriptions.length>0&&(log(import_chalk49.default.bold("Subscription licenses")),printTable(print,subscriptions,"Subscriptions subtotal",data.costUnit),log("")),printCostSummary(print,usage2,subscriptions,data.costUnit),outputHiddenServicesHint(allServices.length-sortedServices.length)}function formatCadence(cadence){return cadence.split("_").map(word=>word[0].toUpperCase()+word.slice(1)).join(" ")}function formatCredit(amount,currency){return formatUsageAmount(amount,currency)}function printCostSummary(print,usage2,subscriptions,costUnit){let subscriptionCost=sumCost(subscriptions),infrastructureCost=sumCost(usage2),rows=[["Subscriptions",formatUsageAmount(subscriptionCost,costUnit)],["Infrastructure usage",formatUsageAmount(infrastructureCost,costUnit)],[import_chalk49.default.bold("Estimated total"),import_chalk49.default.bold(formatUsageAmount(subscriptionCost+infrastructureCost,costUnit))]],tablePrint=table(rows,{hsep:4,align:["l","r"]}).replace(/^/gm," ");print(`${tablePrint}
|
|
138
|
+
`)}function sumCost(services){return services.reduce((total,[,service])=>total+service.cost,0)}function printTable(print,services,subtotalLabel,costUnit){let headers=["Service","Usage","Cost"],rows=services.map(([name,service])=>[formatServiceName(name,service),formatUsageQuantity(service.quantity,service.unit,{compact:!0,showSmallValues:service.category==="usage",singularUnit:service.singularUnit,unitKind:service.unitKind}),formatServiceCost(service,costUnit)]),subtotal=services.reduce((total,[,service])=>total+service.cost,0);rows.push([import_chalk49.default.bold(subtotalLabel),"",import_chalk49.default.bold(formatUsageAmount(subtotal,costUnit))]);let tablePrint=table([headers.map(header=>import_chalk49.default.bold(import_chalk49.default.cyan(header))),...rows],{hsep:4,align:["l","l","r"]}).replace(/^/gm," ");print(`
|
|
139
|
+
${tablePrint}
|
|
140
|
+
`)}var import_chalk50=__toESM(require_source(),1);function getPeriodLabel(period){switch(period){case"daily":return"Daily";case"weekly":return"Weekly";case"monthly":return"Monthly"}}function outputBreakdown({data,breakdownPeriod,startTime}){let{print,log}=output_manager_default,periodLabel=getPeriodLabel(breakdownPeriod);outputUsageHeader(data,`${periodLabel} usage`,elapsed(Date.now()-startTime));let sortedPeriods=[...data.periodUsage.keys()].sort();if(sortedPeriods.length===0){log("No usage data found for this period.");return}let hiddenCount=0;for(let periodKey of sortedPeriods){let periodData=data.periodUsage.get(periodKey),allServices=[...periodData.services.entries()],sortedServices=visibleServices(periodData.services).sort((a,b)=>b[1].cost-a[1].cost);if(hiddenCount+=allServices.length-sortedServices.length,sortedServices.length===0)continue;log(`${import_chalk50.default.bold(import_chalk50.default.cyan(periodKey))} (${formatUsageAmount(periodData.totalCost,data.costUnit)})`);let rows=sortedServices.map(([name,service])=>[formatServiceName(name,service),formatUsageQuantity(service.quantity,service.unit,{compact:!0,showSmallValues:!0,singularUnit:service.singularUnit,unitKind:service.unitKind}),formatServiceCost(service,data.costUnit)]),tablePrint=table([["Service","Usage","Cost"].map(header=>import_chalk50.default.bold(import_chalk50.default.gray(header))),...rows],{hsep:4,align:["l","l","r"]}).replace(/^/gm," ");print(`${tablePrint}
|
|
141
|
+
`)}outputHiddenServicesHint(hiddenCount)}var import_chalk51=__toESM(require_source(),1);function getDimensionLabel(dimension){return dimension==="project"?"Project":"Region"}function outputGroupBy({data,groupByDimension,startTime}){let{print,log}=output_manager_default,dimensionLabel=getDimensionLabel(groupByDimension);outputUsageHeader(data,`Usage by ${dimensionLabel}`,elapsed(Date.now()-startTime));let sortedGroups=[...data.groupByUsage.entries()].sort((a,b)=>b[1].totalCost-a[1].totalCost);if(sortedGroups.length===0){log("No usage data found for this period.");return}let hiddenCount=0;for(let[groupName,groupData]of sortedGroups){let allServices=[...groupData.services.entries()],services=visibleServices(groupData.services).sort((a,b)=>b[1].cost-a[1].cost);if(hiddenCount+=allServices.length-services.length,services.length===0)continue;log(`${import_chalk51.default.bold(import_chalk51.default.cyan(groupName))} (${formatUsageAmount(groupData.totalCost,data.costUnit)})`);let rows=services.map(([name,service])=>[formatServiceName(name,service),formatUsageQuantity(service.quantity,service.unit,{compact:!0,showSmallValues:!0,singularUnit:service.singularUnit,unitKind:service.unitKind}),formatServiceCost(service,data.costUnit)]),tablePrint=table([["Service","Usage","Cost"].map(header=>import_chalk51.default.bold(import_chalk51.default.gray(header))),...rows],{hsep:4,align:["l","l","r"]}).replace(/^/gm," ");print(`${tablePrint}
|
|
142
|
+
`)}log(""),log(`${import_chalk51.default.gray("Estimated total:")} ${import_chalk51.default.bold(formatUsageAmount(data.totalCost,data.costUnit))}`),outputHiddenServicesHint(hiddenCount)}function serializeService(service){return{name:service.name,product:service.product,quantity:service.quantity,unit:service.unit,cost:service.cost,included:service.included,category:service.category}}function outputJson(client,{data,fromDate,toDate,breakdownPeriod,groupByDimension}){let sortedServices=[...data.services.entries()].sort((a,b)=>b[1].cost-a[1].cost),jsonOutput={period:{from:fromDate,to:toDate},context:data.contextName,costUnit:data.costUnit};data.creditBalance&&(jsonOutput.creditBalance=data.creditBalance),breakdownPeriod&&(jsonOutput.breakdown={period:breakdownPeriod,data:[...data.periodUsage.keys()].sort().map(periodKey=>{let period=data.periodUsage.get(periodKey);return{periodKey,services:[...period.services.entries()].sort((a,b)=>b[1].cost-a[1].cost).map(([,service])=>serializeService(service)),totals:{cost:period.totalCost}}})}),groupByDimension&&(jsonOutput.groupBy={dimension:groupByDimension,data:[...data.groupByUsage.entries()].sort((a,b)=>b[1].totalCost-a[1].totalCost).map(([name,group])=>({name,services:[...group.services.entries()].sort((a,b)=>b[1].cost-a[1].cost).map(([,service])=>serializeService(service)),totals:{cost:group.totalCost}}))}),jsonOutput.services=sortedServices.map(([,service])=>serializeService(service)),jsonOutput.totals={cost:data.totalCost},client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
|
|
143
|
+
`)}var GROSS_COST_METRIC="gross_cost",SUMMARY_VIEW="byProduct",DETAIL_VIEW="byProductRegionProject";function getCostViews(groupByDimension){let views={};return groupByDimension&&(views[DETAIL_VIEW]={groupBy:["product","region","project"]}),views[SUMMARY_VIEW]={groupBy:["product"]},{views,summaryViewName:SUMMARY_VIEW,detailViewName:groupByDimension?DETAIL_VIEW:void 0}}async function usage(client){let{print,error,debug,spinner,warn}=output_manager_default,flagsSpecification=getFlagsSpecification(usageCommand.options),parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(err){return printError(err),2}let telemetry=new UsageTelemetryClient({opts:{store:client.telemetryEventStore}});if(parsedArgs.flags["--help"])return telemetry.trackCliFlagHelp("usage"),print(help(usageCommand,{columns:client.stderr.columns})),0;let formatResult=validateJsonOutput(parsedArgs.flags);if(!formatResult.valid)return error(formatResult.error),2;let asJson=formatResult.jsonOutput,fromFlag=parsedArgs.flags["--from"],toFlag=parsedArgs.flags["--to"];if(fromFlag!==void 0&&parsedArgs.flags["--since"]!==void 0)return error("Pass only one of --since or --from. (--from is deprecated.)"),2;if(toFlag!==void 0&&parsedArgs.flags["--until"]!==void 0)return error("Pass only one of --until or --to. (--to is deprecated.)"),2;fromFlag!==void 0&&warn("`--from` is deprecated, please use `--since` instead"),toFlag!==void 0&&warn("`--to` is deprecated, please use `--until` instead");let sinceFlag=parsedArgs.flags["--since"]??fromFlag,untilFlag=parsedArgs.flags["--until"]??toFlag;if(untilFlag&&!sinceFlag)return error("--until requires --since. Omit both to show the current billing cycle."),2;let breakdownFlag=parsedArgs.flags["--breakdown"];if(breakdownFlag&&!isValidBreakdownPeriod(breakdownFlag))return error(`Invalid breakdown period: "${breakdownFlag}". Valid options are: ${VALID_BREAKDOWN_PERIODS.join(", ")}`),2;let breakdownPeriod=breakdownFlag,groupByFlag=parsedArgs.flags["--group-by"];if(groupByFlag&&!isValidGroupByDimension(groupByFlag))return error(`Invalid group-by dimension: "${groupByFlag}". Valid options are: ${VALID_GROUP_BY_DIMENSIONS.join(", ")}`),2;let groupByDimension=groupByFlag;if(breakdownPeriod&&groupByDimension)return error("--breakdown and --group-by cannot be used together. Use one or the other."),2;let sinceDate,untilDate;try{sinceDate=sinceFlag?parseBillingDate(sinceFlag,!1):void 0,untilDate=untilFlag?parseBillingDate(untilFlag,!0):void 0}catch(err){return error(err.message),2}telemetry.trackCliOptionSince(parsedArgs.flags["--since"]),telemetry.trackCliOptionUntil(parsedArgs.flags["--until"]),telemetry.trackCliOptionFrom(fromFlag),telemetry.trackCliOptionTo(toFlag),telemetry.trackCliOptionFormat(parsedArgs.flags["--format"]),telemetry.trackCliFlagJson(parsedArgs.flags["--json"]),telemetry.trackCliOptionBreakdown(breakdownFlag),telemetry.trackCliOptionGroupBy(groupByFlag);let contextName,contextType,teamId,billingPeriod,hasPrecommitment=!1;try{let scope=await getScope(client),owner=scope.team??scope.user;contextName=scope.contextName,contextType=scope.team?"team":"personal account",teamId=scope.team?.id;let billing=owner?.billing;billingPeriod=billing?.subscriptions?.find(subscription=>subscription.frequency.interval==="month"&&subscription.frequency.intervalCount===1)?.period??billing?.period,hasPrecommitment=billing?.plan==="enterprise"||billing?.planIteration==="plus"||billing?.plan==="pro"&&billing?.planIteration==="flex"}catch(err){if((0,import_error_utils2.isErrnoException)(err)&&(err.code==="NOT_AUTHORIZED"||err.code==="TEAM_DELETED"))return error(err.message),1;throw err}let usingDefaults=!sinceFlag,fromDate=sinceDate??(billingPeriod?new Date(billingPeriod.start).toISOString():getDefaultFromDate()),toDate=untilDate??(sinceFlag?new Date().toISOString():billingPeriod?new Date(billingPeriod.end).toISOString():getDefaultToDate()),fromDisplay=sinceFlag&&!isRelativeTime(sinceFlag)?sinceFlag:extractDatePortion(fromDate),toDisplay=untilFlag&&!isRelativeTime(untilFlag)?untilFlag:extractDatePortion(toDate);debug(`Fetching dashboard usage from ${fromDate} to ${toDate}`);let start=Date.now();asJson||spinner(`Fetching usage data for ${import_chalk52.default.bold(contextName)}`);try{let query=new URLSearchParams;teamId&&query.set("teamId",teamId);let viewPlan=getCostViews(groupByDimension),queryString=query.toString(),costsRequest=client.fetch(`/v2/billing/costs${queryString?`?${queryString}`:""}`,{method:"POST",body:{from:fromDate,to:toDate,metrics:[GROSS_COST_METRIC,"quantity"],format:"timeseries",views:viewPlan.views,userAgent:"vercel-cli.usage"},useCurrentTeam:!1}),commitmentRequest=usingDefaults&&teamId&&hasPrecommitment?client.fetch(`/v1/invoices/pre-commitment-usage?teamId=${encodeURIComponent(teamId)}`,{useCurrentTeam:!1}).catch(err=>(debug(`Unable to fetch infrastructure credit: ${String(err)}`),null)):Promise.resolve(null),[response,commitmentUsage]=await Promise.all([costsRequest,commitmentRequest]),usageData=processCosts(response,{summaryView:response.results.views[viewPlan.summaryViewName],detailView:viewPlan.detailViewName?response.results.views[viewPlan.detailViewName]:void 0,contextName,contextType,scope:parsedArgs.flags["--scope"],fromDisplay,toDisplay,usingDefaults,breakdownPeriod,groupByDimension});return attachCredit(usageData,commitmentUsage),asJson?(outputJson(client,{data:usageData,fromDate,toDate,breakdownPeriod,groupByDimension}),0):(groupByDimension?outputGroupBy({data:usageData,groupByDimension,startTime:start}):breakdownPeriod?outputBreakdown({data:usageData,breakdownPeriod,startTime:start}):outputAggregated({data:usageData,startTime:start}),0)}catch(err){return isAPIError(err)&&err.status===404&&err.code==="costs_not_found"?error(`Billing cost data is unavailable for ${fromDisplay} through ${toDisplay}. This does not mean usage was zero. It usually means the team has no active subscription for that range, or the range is before the team's billing data starts. Check that the selected team and date range are correct.`):output_manager_default.prettyError(err),1}}function roundToHundredths(value){return Math.round((value+Number.EPSILON)*100)/100}function getUsageThrough(queriedAt,toDisplay){let queriedDate=extractDatePortion(queriedAt);return queriedDate<toDisplay?queriedDate:toDisplay}function attachCredit(usageData,commitmentUsage){if(!commitmentUsage)return;let creditLedger=commitmentUsage.creditLedgers.find(ledger=>ledger.currency===usageData.costUnit);if(!creditLedger)return;let used=roundToHundredths(creditLedger.total-creditLedger.remaining);usageData.creditBalance={cadence:commitmentUsage.cadence,currency:creditLedger.currency,allocated:creditLedger.total,used,remaining:creditLedger.remaining}}function processCosts(response,options){let{summaryView,detailView,contextName,contextType,scope,fromDisplay,toDisplay,usingDefaults,breakdownPeriod,groupByDimension}=options;if(!summaryView)throw new Error("The billing API did not return the requested usage summary.");let costUnit=getCostUnit(response);if(response.availableCurrencies?.some(currency=>currency!==costUnit))throw new Error("Can't show complete costs for this date range because some costs use a different billing currency. Choose a date range within the current billing currency or view usage in the dashboard.");let products=response.results.dimensionsMeta.product?.values??{},projects=response.results.dimensionsMeta.project?.values??{},regions=response.results.dimensionsMeta.region?.values??{};if(groupByDimension&&(!detailView||!detailView.groupBy.includes(groupByDimension)))throw new Error(`Usage cannot be grouped by ${groupByDimension} for this team.`);let services=new Map,periodUsage=new Map,groupByUsage=new Map,totalCost=0;for(let result of summaryView?.results??[]){let product=result.dimensionValues.product;if(!product)continue;let productMetadata=products[product],serviceName=productMetadata?.title??product,aggregation=aggregateResult(result,product,serviceName,response.metrics,void 0,productMetadata?.category==="Subscription Licenses");if(addService(services,serviceName,aggregation),totalCost+=aggregation.cost,breakdownPeriod)for(let index=0;index<response.results.times.length;index++){let periodKey=getPeriodKey(response.results.times[index],breakdownPeriod),period=periodUsage.get(periodKey)??emptyAggregation(),sample=aggregateResult(result,product,serviceName,response.metrics,index,productMetadata?.category==="Subscription Licenses");addService(period.services,serviceName,sample),period.totalCost+=sample.cost,periodUsage.set(periodKey,period)}}if(groupByDimension)for(let result of detailView?.results??[]){let product=result.dimensionValues.product;if(!product)continue;let productMetadata=products[product],serviceName=productMetadata?.title??product,aggregation=aggregateResult(result,product,serviceName,response.metrics,void 0,productMetadata?.category==="Subscription Licenses"),id=result.dimensionValues[groupByDimension],groupName=id?(groupByDimension==="project"?projects:regions)[id]?.title??id:groupByDimension==="project"?"(unattributed)":"(global)",group=groupByUsage.get(groupName)??emptyAggregation();addService(group.services,serviceName,aggregation),group.totalCost+=aggregation.cost,groupByUsage.set(groupName,group)}return{contextName,contextType,scope,fromDisplay,toDisplay,usageThrough:getUsageThrough(response.queriedAt,toDisplay),usingDefaults,costUnit,services,periodUsage,groupByUsage,totalCost}}function getCostUnit(response){let unit=response.metrics.find(metric=>metric.slug===GROSS_COST_METRIC)?.unit;return unit?.singular==="MIU"||unit?.plural==="MIUs"?"managed_infrastructure_units":"USD"}function aggregateResult(result,product,name,metrics,sampleIndex,isSubscription=!1){let grossCostIndex=result.metrics.indexOf(GROSS_COST_METRIC),quantityIndex=result.metrics.findIndex(metric=>metric!==GROSS_COST_METRIC),quantityMetric=metrics.find(metric=>metric.slug===result.metrics[quantityIndex]),values=sampleIndex===void 0?result.totalValue:result.values[sampleIndex]??[],cost=grossCostIndex===-1?0:values[grossCostIndex]??0,included=result.flatRate===!0,rawQuantity=quantityIndex===-1?0:values[quantityIndex]??0,quantity=isSubscription&&sampleIndex===void 0&&quantityIndex!==-1?result.values.reduce((maximum,sample)=>Math.max(maximum,sample[quantityIndex]??0),0):rawQuantity,units=getQuantityUnits(quantityMetric,product,isSubscription);return{name,product,quantity,...units,cost,included,category:isSubscription?"subscription":"usage"}}function getQuantityUnits(metric,product,isSubscription){if(isSubscription)return{unit:"licenses",singularUnit:"license"};if(!metric?.unit)return{};if(metric.unit.kind==="custom"){let singularUnit=metric.unit.singular,unit2=metric.unit.plural??singularUnit;return!unit2||singularUnit===metric.title||unit2===metric.title?{}:{unit:unit2,singularUnit}}if(metric.unit.kind==="digitalStorage"&&metric.unit.name)return{unit:metric.unit.name,unitKind:metric.unit.kind};let unit=metric.unit.name;return!unit||unit===metric.title||unit===product?{}:{unit,unitKind:metric.unit.kind}}function addService(services,name,value){let key=JSON.stringify([value.product,value.included]),existing=services.get(key);if(!existing){services.set(key,{...value,name});return}let previousQuantity=existing.quantity;existing.quantity=existing.category==="subscription"?Math.max(previousQuantity,value.quantity):previousQuantity+value.quantity,existing.cost+=value.cost}function emptyAggregation(){return{services:new Map,totalCost:0}}export{connex,install,main2 as integration,main as integrationResource,main3 as storage,usage};
|