vercel 63.0.2 → 63.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunks/{add-QKGWNVQS.js → add-CCFBYKZH.js} +1 -1
- package/dist/chunks/{add-BODUK747.js → add-FNCCXJZO.js} +1 -1
- package/dist/chunks/{add-QBGY56BR.js → add-LU5TSLJU.js} +1 -1
- package/dist/chunks/{build-SD6SLRK7.js → build-PUIFBQKZ.js} +1 -1
- package/dist/chunks/{chunk-MEJTHWZB.js → chunk-36EFWYTN.js} +1 -1
- package/dist/chunks/{chunk-JUSQYKFF.js → chunk-3TJDVDDJ.js} +1 -1
- package/dist/chunks/{chunk-QW2UP4W4.js → chunk-3YQVBYQD.js} +1 -1
- package/dist/chunks/{chunk-7D2HVBVP.js → chunk-5O2CW3SX.js} +1 -1
- package/dist/chunks/chunk-5YQP44VL.js +10 -0
- package/dist/chunks/{chunk-KNBEUC4P.js → chunk-6BE4D57F.js} +1 -1
- package/dist/chunks/{chunk-HJ3NY4UA.js → chunk-6LXX5P3A.js} +1 -1
- package/dist/chunks/{chunk-64U5W6GU.js → chunk-6OUBLFZ2.js} +1 -1
- package/dist/chunks/{chunk-YLTCVZOL.js → chunk-6TEFVB2U.js} +1 -1
- package/dist/chunks/{chunk-3AF3TTCR.js → chunk-7SGM233C.js} +1 -1
- package/dist/chunks/{chunk-PSBBSY46.js → chunk-A6RRKSD3.js} +1 -1
- package/dist/chunks/{chunk-ESMQCFCX.js → chunk-AHSMFZWH.js} +1 -1
- package/dist/chunks/{chunk-TKA7PPGY.js → chunk-BIFAR2CO.js} +1 -1
- package/dist/chunks/{chunk-X3JK3SQ2.js → chunk-D7KEDMBF.js} +1 -1
- package/dist/chunks/{chunk-6LRVRPYO.js → chunk-E6UKNYFF.js} +1 -1
- package/dist/chunks/{chunk-NZBUIMZG.js → chunk-EDVP7QUI.js} +1 -1
- package/dist/chunks/{chunk-WF5YVWWY.js → chunk-FU7KGU6V.js} +1 -1
- package/dist/chunks/{chunk-IYL5CKZ4.js → chunk-GAG42XNF.js} +1 -1
- package/dist/chunks/{chunk-DZ6GORJ7.js → chunk-HWYHRPWP.js} +1 -1
- package/dist/chunks/{chunk-UTW2FDSC.js → chunk-I3D36ZLJ.js} +1 -1
- package/dist/chunks/{chunk-KTNRWBHM.js → chunk-I7FGFRN3.js} +1 -1
- package/dist/chunks/{chunk-MA4K5IWW.js → chunk-IFNTXDX2.js} +1 -1
- package/dist/chunks/{chunk-JTAAWOJS.js → chunk-IMC63GXI.js} +1 -1
- package/dist/chunks/{chunk-VIBUYIZ3.js → chunk-J2LAZELI.js} +1 -1
- package/dist/chunks/{chunk-SY4EANZH.js → chunk-JORUFFOD.js} +3 -3
- package/dist/chunks/{chunk-4A5SGLIH.js → chunk-JYFYL3ON.js} +1 -1
- package/dist/chunks/{chunk-IAUAFUO2.js → chunk-K5GYV5CW.js} +1 -1
- package/dist/chunks/{chunk-B3PZ3I4Z.js → chunk-KCQERNQX.js} +1 -1
- package/dist/chunks/{chunk-QZRZ6ECD.js → chunk-KG3OGJ3U.js} +1 -1
- package/dist/chunks/{chunk-2H243SJV.js → chunk-MSH7V3FL.js} +1 -1
- package/dist/chunks/{chunk-VNSQCAVT.js → chunk-MT4MO7DT.js} +1 -1
- package/dist/chunks/{chunk-XJOOPPSQ.js → chunk-NUITF4GR.js} +1 -1
- package/dist/chunks/chunk-OB5XGIDM.js +9 -0
- package/dist/chunks/{chunk-25S4PQNK.js → chunk-OPVNMCAF.js} +1 -1
- package/dist/chunks/{chunk-AZ76R3LW.js → chunk-PLG4UIV4.js} +1 -1
- package/dist/chunks/{chunk-CRO7VQWK.js → chunk-PR7SYJVT.js} +1 -1
- package/dist/chunks/{chunk-2WYDLP7X.js → chunk-R6OWQQMZ.js} +1 -1
- package/dist/chunks/{chunk-SSEVYTJ7.js → chunk-RIPCUZO6.js} +1 -1
- package/dist/chunks/{chunk-VJEQAITW.js → chunk-RV77ZW7T.js} +1 -1
- package/dist/chunks/{chunk-V2BKSCXI.js → chunk-SKTP7MSL.js} +1 -1
- package/dist/chunks/{chunk-MYMM34ZH.js → chunk-SWJYZETA.js} +4 -4
- package/dist/chunks/{chunk-BZYQ6RFV.js → chunk-SYEKOJHT.js} +1 -1
- package/dist/chunks/{chunk-VOB4W7DO.js → chunk-SZRSBECO.js} +1 -1
- package/dist/chunks/{chunk-2LGNEOKV.js → chunk-T3PAZMDW.js} +1 -1
- package/dist/chunks/{chunk-V336CYEI.js → chunk-T6GXMIXO.js} +1 -1
- package/dist/chunks/{chunk-HUJPGK7W.js → chunk-TNZMCRAP.js} +1 -1
- package/dist/chunks/chunk-TUJ3WXOZ.js +7 -0
- package/dist/chunks/{chunk-BRUTDRAQ.js → chunk-VLSSMFTF.js} +1 -1
- package/dist/chunks/{chunk-VSE5BAPP.js → chunk-WPQN5UKR.js} +1 -1
- package/dist/chunks/{chunk-3DMY3OJR.js → chunk-X5GP2FBT.js} +1 -1
- package/dist/chunks/{chunk-AUZEOUZU.js → chunk-XKDY4OFQ.js} +1 -1
- package/dist/chunks/{chunk-H7LHZZKU.js → chunk-Y35RMGOU.js} +1 -1
- package/dist/chunks/{chunk-AZULOP7M.js → chunk-YIIPBH2D.js} +2 -2
- package/dist/chunks/{chunk-T6SFC3IH.js → chunk-Z6HYEIYV.js} +1 -1
- package/dist/chunks/{chunk-BWY67LI6.js → chunk-ZH4DW3T3.js} +1 -1
- package/dist/chunks/{chunk-T76ITV65.js → chunk-ZQBMRI57.js} +2 -2
- package/dist/chunks/{clear-PYDGQBSS.js → clear-E6TSPA67.js} +1 -1
- package/dist/chunks/{compile-vercel-config-KWSIFONF.js → compile-vercel-config-2HBWORW5.js} +1 -1
- package/dist/chunks/{config-Y3JEZPVK.js → config-MTH57FUD.js} +1 -1
- package/dist/chunks/{config-6TQFY5DN.js → config-NWNQSZNZ.js} +1 -1
- package/dist/chunks/{connect-git-provider-HW23GK35.js → connect-git-provider-VJYXBRYG.js} +1 -1
- package/dist/chunks/{delete-ZISJ7HIW.js → delete-MZ4LAS3L.js} +1 -1
- package/dist/chunks/{delete-HAOLSE35.js → delete-NIPKCWUT.js} +1 -1
- package/dist/chunks/{detect-services-22KZAGH2.js → detect-services-5CVG24CL.js} +1 -1
- package/dist/chunks/{disable-ZCEEK2BD.js → disable-YZATFLNR.js} +1 -1
- package/dist/chunks/{discard-VHO5BXYN.js → discard-B5IFVCDR.js} +1 -1
- package/dist/chunks/{edit-ZPNWEZWU.js → edit-3PKYF5FY.js} +1 -1
- package/dist/chunks/{edit-JRYFZ5N5.js → edit-EDTBD7PX.js} +1 -1
- package/dist/chunks/{enable-USQVAN4K.js → enable-AKGADEKU.js} +1 -1
- package/dist/chunks/{export-H7YV6NVF.js → export-NKCN63SF.js} +1 -1
- package/dist/chunks/{future-PHRPWAVY.js → future-AQR2QP74.js} +1 -1
- package/dist/chunks/{generate-cert-for-deploy-WLYVWTBG.js → generate-cert-for-deploy-UNRGDROB.js} +1 -1
- package/dist/chunks/{image-6KIQRC65.js → image-IQJVHHAW.js} +1 -1
- package/dist/chunks/{import-builders-YAC6UE33.js → import-builders-4K4WE66I.js} +1 -1
- package/dist/chunks/{inspect-MRJ6JO7M.js → inspect-2UUTLI4H.js} +1 -1
- package/dist/chunks/{inspect-BQELJ5EI.js → inspect-4DASZGPR.js} +1 -1
- package/dist/chunks/{inspect-HJQWRFHR.js → inspect-FVB5P54P.js} +1 -1
- package/dist/chunks/{inspect-SEGNEPGI.js → inspect-GKZFZINR.js} +1 -1
- package/dist/chunks/{inspect-DWOQ6566.js → inspect-IU2VMHWZ.js} +1 -1
- package/dist/chunks/{list-S2XKQMNX.js → list-5LMFTD7U.js} +1 -1
- package/dist/chunks/{list-HS54LLJ5.js → list-OYT6T3TA.js} +1 -1
- package/dist/chunks/{list-OCU47YHP.js → list-TL7VBVR5.js} +1 -1
- package/dist/chunks/{login-SKAMFH7S.js → login-PFAKA6JO.js} +1 -1
- package/dist/chunks/{login-K6VYVJPS.js → login-UWL7N6ZS.js} +1 -1
- package/dist/chunks/{logs-KZSKOQUN.js → logs-4FOJKWAW.js} +1 -1
- package/dist/chunks/{ls-ZYM3DQXI.js → ls-6TRT3UFZ.js} +1 -1
- package/dist/chunks/{ls-LBBI45ZT.js → ls-B3D7XA2S.js} +1 -1
- package/dist/chunks/{ls-G5NTVYUB.js → ls-H7YO6MS5.js} +1 -1
- package/dist/chunks/{ls-NUM6IQL6.js → ls-SJDE4U7I.js} +1 -1
- package/dist/chunks/{ls-TE7BAMHR.js → ls-SXE2THDP.js} +1 -1
- package/dist/chunks/{ls-DTEGGHQA.js → ls-VFV23YCF.js} +1 -1
- package/dist/chunks/{ls-LCY7BHOP.js → ls-VNOGQ64O.js} +1 -1
- package/dist/chunks/{mutate-BAFVNNRU.js → mutate-IGC37SCR.js} +1 -1
- package/dist/chunks/{notifications-3EB3ZEU3.js → notifications-47EDEA5C.js} +1 -1
- package/dist/chunks/{open-J4X5KJ6A.js → open-NP444BUR.js} +1 -1
- package/dist/chunks/{openapi-C5BHMHWS.js → openapi-LW24FRTC.js} +1 -1
- package/dist/chunks/{permissions-2WMWMXFP.js → permissions-CP57O3II.js} +1 -1
- package/dist/chunks/{prompt-missing-credentials-VS3ZJSCQ.js → prompt-missing-credentials-C3OIQONK.js} +1 -1
- package/dist/chunks/{publish-WWI5HOAL.js → publish-5TK3IVYM.js} +1 -1
- package/dist/chunks/{pull-MTQAMT4L.js → pull-FCQKXYBD.js} +1 -1
- package/dist/chunks/{purchase-domain-if-available-ZIIAF7CC.js → purchase-domain-if-available-QBDRKJZ5.js} +1 -1
- package/dist/chunks/{push-PBKUSKXQ.js → push-SIR5XTJN.js} +1 -1
- package/dist/chunks/{query-5VGUVE2A.js → query-IEBWCCMJ.js} +1 -1
- package/dist/chunks/{reauthenticate-UGBXSWZE.js → reauthenticate-XSNRCXPC.js} +1 -1
- package/dist/chunks/{reorder-S2ZJML5K.js → reorder-TPLZXSRB.js} +1 -1
- package/dist/chunks/{reply-3GFULOMZ.js → reply-BCDQQ6I2.js} +1 -1
- package/dist/chunks/{resolve-USEBSFUT.js → resolve-VKJAE7KO.js} +1 -1
- package/dist/chunks/{restore-JD7IGDTY.js → restore-TZAXCNLL.js} +1 -1
- package/dist/chunks/{rm-LL2AWOZT.js → rm-53HZ5XOQ.js} +1 -1
- package/dist/chunks/{rm-RHRKS7XG.js → rm-A2NTZ4EJ.js} +1 -1
- package/dist/chunks/{rm-BYOBKSWY.js → rm-DPVWWH4Q.js} +1 -1
- package/dist/chunks/{rm-EQYVIFNX.js → rm-TTZBAVUG.js} +1 -1
- package/dist/chunks/{rm-3V47KPK6.js → rm-V4M46PRZ.js} +1 -1
- package/dist/chunks/{routes-NID5V7EJ.js → routes-PKCKZ5T6.js} +1 -1
- package/dist/chunks/{rule-inspect-5DZ7OXGE.js → rule-inspect-5QXLEJZA.js} +1 -1
- package/dist/chunks/{rules-CM2ARIWZ.js → rules-2SBYOL6R.js} +1 -1
- package/dist/chunks/{schema-V75RRXXF.js → schema-OGGOD3HX.js} +1 -1
- package/dist/chunks/{schema-SZUKDSY2.js → schema-PGGJZ2AT.js} +1 -1
- package/dist/chunks/{select-org-SH4JT6RI.js → select-org-VBP5DCYP.js} +1 -1
- package/dist/chunks/{set-LY4YI5FZ.js → set-6BCSH3I3.js} +1 -1
- package/dist/chunks/{setup-and-link-MWLALWAS.js → setup-and-link-FPGTZUH6.js} +1 -1
- package/dist/chunks/{tags-P5GB7HTF.js → tags-77REB4BF.js} +1 -1
- package/dist/chunks/{types-OC7OTQNK.js → types-4C5N66YA.js} +1 -1
- package/dist/chunks/{update-SOD622HT.js → update-7BNVIJWB.js} +1 -1
- package/dist/commands/build/index.js +1 -1
- package/dist/commands/deploy/index.js +4 -4
- package/dist/commands/dev/index.js +2 -2
- package/dist/commands/env/index.js +1 -1
- package/dist/commands/link/index.js +1 -1
- package/dist/commands/list/index.js +1 -1
- package/dist/commands-bulk.js +48 -36
- package/dist/index.js +2 -2
- package/dist/internal-build.js +1 -1
- package/dist/version.mjs +1 -1
- package/package.json +14 -14
- package/dist/chunks/chunk-5RR3435W.js +0 -10
- package/dist/chunks/chunk-U5C6XOLA.js +0 -9
- package/dist/chunks/chunk-W6LNIG5O.js +0 -7
package/dist/commands-bulk.js
CHANGED
|
@@ -4,7 +4,7 @@ import { dirname as __dirname_ } from 'node:path';
|
|
|
4
4
|
const require = __createRequire(import.meta.url);
|
|
5
5
|
const __filename = __fileURLToPath(import.meta.url);
|
|
6
6
|
const __dirname = __dirname_(__filename);
|
|
7
|
-
import{handleTracingApiError,invalidArguments,resolveConfigScope,resolveScope}from"./chunks/chunk-64U5W6GU.js";import{ALL_ACTION_CHOICES,MAX_CONDITIONS,MAX_DESCRIPTION_LENGTH,MAX_NAME_LENGTH,REDIRECT_STATUS_CODES,VALID_SYNTAXES,collectActionDetails,collectHeadersAndTransforms,collectInteractiveConditions,convertRouteToCurrentRoute,extractTransformFlags,generateRoute,generatedRouteToAddInput,parseConditions,populateRouteEnv,printGeneratedRoutePreview,runInteractiveEditLoop,stripQuotes,validateActionFlags}from"./chunks/chunk-KNBEUC4P.js";import{getRouteVersions}from"./chunks/chunk-BVH2AEFE.js";import{TRANSFORM_TYPE_LABELS,findVersionById,formatCondition,formatTransform,getRouteTypeLabel,getRoutes,getSrcSyntaxLabel,isTargetTransform,offerAutoPromote,parsePosition,parseSubcommandArgs,parseSubcommandArguments,requireProjectContext,validateRequiredArguments,withGlobalFlags as withGlobalFlags2}from"./chunks/chunk-MA4K5IWW.js";import{FILTER_DEPRECATION_WARNING,computeGranularity,formatText,generateSparkline,toGranularityMsFromDuration,usesODataSyntax}from"./chunks/chunk-MEJTHWZB.js";import{OBSERVABILITY_METRICS_PATH,getRollupColumnName,handleApiError}from"./chunks/chunk-VNSQCAVT.js";import{RoutesAddTelemetryClient,RoutesTelemetryClient}from"./chunks/chunk-T6SFC3IH.js";import{canPrompt}from"./chunks/chunk-XD2LZRBS.js";import"./chunks/chunk-IVSSTHB6.js";import{formatDate,formatDateWithoutTime}from"./chunks/chunk-HRR57QNP.js";import{indent_default}from"./chunks/chunk-GZNDA6SV.js";import{handleValidationError,normalizeRepeatableStringFilters,outputError,parseTimeFlag,resolveTimeRange,validateIntegerRangeWithDefault,validateTimeBound,validateTimeOrder}from"./chunks/chunk-WH3SHWVK.js";import{collectBuildLogs,displayBuildLogs,displayRuntimeLogs,require_split2}from"./chunks/chunk-25S4PQNK.js";import{require_format}from"./chunks/chunk-PFD7LETF.js";import{addDomain,createCertForCns,extractDomain,getDomainByName,isWildcardAlias,require_cjs,setupDomain}from"./chunks/chunk-4A5SGLIH.js";import{collectContactInformation,getDomainPrice,getDomainStatus,pollForOrder,purchaseDomain}from"./chunks/chunk-W6LNIG5O.js";import{api,tryOpenApiFallback}from"./chunks/chunk-V2BKSCXI.js";import"./chunks/chunk-GHAY4PSD.js";import{login}from"./chunks/chunk-X3JK3SQ2.js";import{main}from"./chunks/chunk-AUZEOUZU.js";import{LOCAL_SCHEDULES_SESSION_HEADER,isLocalSchedulesOrigin,readLocalSchedulesSessions}from"./chunks/chunk-SF4E3AQ3.js";import{selectOrg}from"./chunks/chunk-NZBUIMZG.js";import{createProject}from"./chunks/chunk-QHJLRTVY.js";import{require_fast_deep_equal}from"./chunks/chunk-MCRKBVZA.js";import{CURL_INSTALL_COMMAND,NATIVE_UPDATE_SELECT_PRODUCTION_ENV,NATIVE_UPDATE_VERSION_ENV,box,cacheNativeUpdateDiscoveryAttempt,cacheNativeUpdateVersion,did_you_mean_default,executeUpgrade,handleCommandTypo,installAndActivatePrBinary,installAndActivateProductionVersion,isAutoUpdateEnabled,isCurlInstall,isNativeAutoUpdateEnabled,isNativeUpdateChild,listAvailableVersions,listNativeTrackSlots,markNativeUpdateStaged,parsePrTarget,pinPackageVersion,readActivePointer,readNativeInstallState,require_tar_fs,resolveLatestNativeVersion,restoreNativeUpdateAfterDiscoveryFailure,setAutoUpdate,setMinReleaseAgeBypass,spawnNativeUpdateChild,stageProductionUpdate,withDirectoryLock}from"./chunks/chunk-IYL5CKZ4.js";import{OpenApiCache,resolveOpenApiTagForProjectsCli,resolveOpenApiTagForTeamsCli}from"./chunks/chunk-B3K6GM2W.js";import{getUpdateCommand,getUpdateCommandInfo,isGlobal}from"./chunks/chunk-JUSQYKFF.js";import{readJSONFile}from"./chunks/chunk-BRUTDRAQ.js";import{Now,getBuildMachineResourceConfig,isDeploying,printDeploymentStatus}from"./chunks/chunk-T76ITV65.js";import{require_async_sema}from"./chunks/chunk-NZ2TFADV.js";import"./chunks/chunk-3DMY3OJR.js";import{dump,load}from"./chunks/chunk-V6Y6UK6B.js";import{checkExistsAndConnect,disconnectGitProvider,list,parseRepoUrl,printRemoteUrls,selectAndParseRemoteUrl}from"./chunks/chunk-BZYQ6RFV.js";import"./chunks/chunk-EAUDC24V.js";import"./chunks/chunk-WF5YVWWY.js";import{require_dist as require_dist3}from"./chunks/chunk-YAPHSZJ7.js";import{require_dist2}from"./chunks/chunk-WJ4VNTE3.js";import"./chunks/chunk-VOB4W7DO.js";import"./chunks/chunk-RRDNKB2X.js";import"./chunks/chunk-MVGTMPMI.js";import"./chunks/chunk-SACGQMVQ.js";import"./chunks/chunk-U56NHYAH.js";import"./chunks/chunk-2EYYB6YN.js";import{require_semver}from"./chunks/chunk-BPUANOGW.js";import"./chunks/chunk-3E364MJE.js";import"./chunks/chunk-7EJQLVWX.js";import{responseError}from"./chunks/chunk-SY4EANZH.js";import"./chunks/chunk-O4FDRZ22.js";import{sleep}from"./chunks/chunk-T3GQAMBJ.js";import"./chunks/chunk-P2O5DOYE.js";import{CHECKBOX_INSTRUCTIONS,getCustomEnvironments,pickCustomEnvironment,readStandardInput,require_dist as require_dist4}from"./chunks/chunk-6JGC4YDH.js";import{getInvalidSubcommand}from"./chunks/chunk-TG2RCYTH.js";import{ellipsis}from"./chunks/chunk-F4KY2TOK.js";import{formatTable,strlen}from"./chunks/chunk-LSQREJXO.js";import{ellipsizeMiddle,truncateEnd}from"./chunks/chunk-ID663OJ7.js";import{GATEWAY_ANTHROPIC_BASE_URL,GATEWAY_API_KEY_ENV,GATEWAY_CODEX_BASE_URL,GATEWAY_CODING_AGENT_BASE_URL,GATEWAY_CURSOR_BASE_URL,GATEWAY_DEFAULT_MODEL,KEY_PLACEHOLDER,MANAGED_BLOCK_END,MANAGED_BLOCK_START,autoInstallVercelPlugin,backupFile,claudeCode,ensureMode,isFile,isSymlink,maskSecret,mergeJson,mergeJsonc,mergeToml,parseJsonObjectOrNull,pathExists,publishNoClobber,readFileOrNull,resolveGatewayBaseUrl,setupVercelPlugin,upsertManagedBlock,writeConfigFile}from"./chunks/chunk-N7L3XLWC.js";import{require_execa}from"./chunks/chunk-GSOPJJO5.js";import{createEnvObject,envPullCommandLogic,pull}from"./chunks/chunk-BWY67LI6.js";import{resolveProjectContext}from"./chunks/chunk-IAUAFUO2.js";import"./chunks/chunk-25565AGS.js";import{isGuidanceEnabled}from"./chunks/chunk-A5R2HHNK.js";import{stamp_default}from"./chunks/chunk-A2RZZQEP.js";import{getSubcommand as getSubcommand7}from"./chunks/chunk-ETV3C2CV.js";import{init_main,parse}from"./chunks/chunk-J24BABG4.js";import{ensureLink}from"./chunks/chunk-3AF3TTCR.js";import"./chunks/chunk-QW2UP4W4.js";import{performDeviceCodeFlow,saveDeviceCodeTokens}from"./chunks/chunk-KTNRWBHM.js";import{require_open}from"./chunks/chunk-PVASGBEF.js";import{require_frameworks}from"./chunks/chunk-MVCAUS4F.js";import{CI_LOG_LEVELS,CREDIT_TYPE_LABELS,FLAG_ATTRIBUTE_TYPES,FLAG_CONDITION_LIST_COMPARATORS,FLAG_CONDITION_RHS_OPTIONAL_COMPARATORS,FLAG_EVALUATIONS_DIMENSIONS,FLAG_EVALUATIONS_DIMENSION_NAMES,FLAG_EVALUATIONS_GRANULARITIES,KMS_ALGORITHMS,PROJECT_GRANT_POLICY_KIND,PROJECT_MEMBER_ROLES,STORAGE_PROVIDERS,SUPPORTED_ADDON_NAMES,SUPPORTED_CREDIT_TYPES,abortSubcommand,acceptTermsSubcommand,accessGroupsSubcommand,accessSummarySubcommand,activateKeySubcommand,addGrantSubcommand,addKeySubcommand,addSubcommand,addSubcommand10 as addSubcommand9,addSubcommand11,addSubcommand12,addSubcommand2,addSubcommand3,addSubcommand4,addSubcommand5,addSubcommand6,addSubcommand7,addSubcommand9 as addSubcommand8,addToGroupSubcommand,addonSubcommand,agentCommand,agentRunsCommand,aiGatewayCommand,alertsInspectSubcommand,alertsListSubcommand,alertsSubcommand,aliasCommand,analyzeSubcommand,apiKeysSubcommand,approveSubcommand,archiveSubcommand,attachSubcommand,attackModeDisableSubcommand,attackModeEnableSubcommand,attackModeSubcommand,autoRenewSubcommand,autoupdateSubcommand,backupsSubcommand,balanceSubcommand,bisectCommand,blobCommand,botManagementSubcommand,budgetCommand,budgetsDefaultsListSubcommand,budgetsDefaultsRemoveSubcommand,budgetsDefaultsSetSubcommand,budgetsDefaultsSubcommand,budgetsInspectSubcommand,budgetsListSubcommand,budgetsRemoveSubcommand,budgetsSetSubcommand,budgetsSubcommand,buildersCommand,buyCommand,buySubcommand,cacheCommand,categoriesSubcommand,certsCommand,changelogCommand,checkSubcommand,checkSubcommand2,checkSubcommand3,checksAddFlags,checksRemoveFlags,checksSubcommand,ciCommand,claimSubcommand,codingAgentsSubcommand,completeSubcommand,configureSubcommand,connectSubcommand,connectSubcommand2,connectSubcommand3,connectionsAddSubcommand,connectionsListSubcommand,connectionsRemoveSubcommand,connectionsSubcommand,connexCommand,contactsAddSubcommand,contactsSubcommand,contractCommand,copySubcommand,createGroupSubcommand,createStoreSubcommand,createSubcommand,createSubcommand2,createSubcommand3,createSubcommand4,createSubcommand5,createSubcommand6,createSubcommand7,createSubcommand8 as createSubcommand9,createThresholdSubcommand,creditsSubcommand,cronsCommand,curlCommand,dangerouslyDeleteImmutableStaticAssetSubcommand,dangerouslyDeleteSubcommand,decideSubcommand,delSubcommand,deleteGroupSubcommand,deleteStoreSubcommand,deleteSubcommand as deleteSubcommand2,deleteSubcommand2 as deleteSubcommand4,deleteSubcommand3 as deleteSubcommand5,deployHooksCommand,detachSubcommand,diagnoseSubcommand,diffSubcommand,disableSubcommand,disableSubcommand2,disableSubcommand3 as disableSubcommand4,disableSubcommand4 as disableSubcommand5,discardSubcommand,disconnectSubcommand,disconnectSubcommand2,disconnectSubcommand3,discoverSubcommand,dnsCommand,domainSubcommand,domainsCommand,emptyStoreSubcommand,enableSubcommand,enableSubcommand2,enableSubcommand3 as enableSubcommand4,enableSubcommand4 as enableSubcommand5,entitiesCreateSubcommand,entitiesListSubcommand,entitiesRemoveSubcommand,entitiesSubcommand,entitiesUpdateSubcommand,evaluationsSubcommand,executionsListSubcommand,executionsSubcommand,experimentsCommand,fetchSubcommand,findForeignCreateFlags,findOverlappingConnections,firewallCommand,flagsCommand,flushSubcommand,formatFlagAttributeTypeList,formatFlagConditionComparator,formatFlagConditionComparatorList,getCommandAliases,getConnections,getFlagAttributeType,getStorageProvider,getStorageStore,getStorageStores,getStoreInfoSubcommand,getSubcommand,getSubcommand2,getSubcommand3,getSubcommand4 as getSubcommand5,getSubcommand5 as getSubcommand6,gitCommand,globalConfigCommand,grepSubcommand,guidanceCommand,guideSubcommand,httpstatCommand,importKeySubcommand,importSubcommand,importSubcommand2,initCommand,inspectCommand,inspectGroupSubcommand,inspectSubcommand,inspectSubcommand10 as inspectSubcommand12,inspectSubcommand11 as inspectSubcommand15,inspectSubcommand2,inspectSubcommand3 as inspectSubcommand4,inspectSubcommand4 as inspectSubcommand6,inspectSubcommand5 as inspectSubcommand7,inspectSubcommand6 as inspectSubcommand8,inspectSubcommand7 as inspectSubcommand9,inspectSubcommand8 as inspectSubcommand10,inspectSubcommand9 as inspectSubcommand11,installCommand,installationsSubcommand,installedSubcommand,integrationCommand,integrationResourceCommand,invalidateSubcommand,inviteSubcommand,invokeSubcommand,ipBlocksBlockSubcommand,ipBlocksListSubcommand,ipBlocksSubcommand,ipBlocksUnblockSubcommand,isBucketingAttribute,isCustomEnvironmentAddonAlias,isFlagAttributeType,isFlagEvaluationsDimension,isFlagEvaluationsGranularity,isProjectGrant,isTimestampAttributeType,issueSubcommand,issuerJwksUrl,issuerUrl,itemsSubcommand,kmsCommand,labelsListSubcommand,labelsSubcommand,leaderboardAppsSubcommand,leaderboardLabsSubcommand,leaderboardModelsSubcommand,leaderboardProvidersSubcommand,leaderboardSubcommand,listStorageProviderTypes,listStoresSubcommand,listSubcommand,listSubcommand10 as listSubcommand12,listSubcommand11 as listSubcommand13,listSubcommand12 as listSubcommand14,listSubcommand13 as listSubcommand15,listSubcommand14 as listSubcommand16,listSubcommand15 as listSubcommand17,listSubcommand16 as listSubcommand18,listSubcommand17 as listSubcommand19,listSubcommand18 as listSubcommand21,listSubcommand19 as listSubcommand22,listSubcommand2,listSubcommand20 as listSubcommand23,listSubcommand21 as listSubcommand24,listSubcommand22 as listSubcommand25,listSubcommand23 as listSubcommand27,listSubcommand24 as listSubcommand28,listSubcommand25 as listSubcommand29,listSubcommand26 as listSubcommand30,listSubcommand3 as listSubcommand4,listSubcommand4 as listSubcommand5,listSubcommand5 as listSubcommand6,listSubcommand6 as listSubcommand8,listSubcommand7 as listSubcommand9,listSubcommand8 as listSubcommand10,listSubcommand9 as listSubcommand11,listVersionsSubcommand,loadStoreDetails,logoutCommand,logsSubcommand,mcpCommand,membersAddFlags,membersInviteSubcommand,membersRemoveFlags,membersRemoveSubcommand,membersSubcommand,membersSubcommand2,microfrontendsCommand,modelsEndpointsSubcommand,modelsListSubcommand,modelsSubcommand,moveSubcommand,observabilitySubcommand,openCommand,openSubcommand as openSubcommand2,openSubcommand2 as openSubcommand3,openSubcommand3 as openSubcommand4,openSubcommand4 as openSubcommand5,overrideSubcommand,overviewSubcommand,pauseSubcommand,persistentActionsInspectSubcommand,persistentActionsListSubcommand,persistentActionsSubcommand,preinstallSubcommand,prepareSubcommand,presignSubcommand,priceSubcommand,pricingCommand,prioritySubcommand,proSubcommand,projectCommand,projectsSubcommand,promoteCommand,promoteSubcommand,protectionSubcommand,publishSubcommand,pullSubcommand,purgeSubcommand,putImageSubcommand,putSubcommand,redeployCommand,redirectsCommand,removeCommand,removeFromGroupSubcommand,removeGrantSubcommand,removeSubcommand,removeSubcommand10,removeSubcommand11,removeSubcommand12,removeSubcommand13,removeSubcommand14,removeSubcommand15,removeSubcommand16 as removeSubcommand17,removeSubcommand17 as removeSubcommand18,removeSubcommand2,removeSubcommand3,removeSubcommand4,removeSubcommand5,removeSubcommand6,removeSubcommand7,removeSubcommand8,removeSubcommand9,renameSubcommand,renewSubcommand,requestSubcommand,rerunSubcommand,reseedEnrollmentSubcommand,resolveProjectConnection,resolveStore,resourceSubcommand,restartAnalysisSubcommand,restoreSubcommand,resumeSubcommand,returnToDraftSubcommand,revokeKeySubcommand,revokeTokensSubcommand,rollbackCommand,rollingReleaseCommand,rolloutSubcommand,rulesAddSubcommand,rulesAddSubcommand2 as rulesAddSubcommand3,rulesAddSubcommand3 as rulesAddSubcommand4,rulesDisableSubcommand,rulesEditSubcommand,rulesEditSubcommand2,rulesEnableSubcommand,rulesInspectSubcommand as rulesInspectSubcommand2,rulesListSubcommand,rulesListSubcommand2,rulesListSubcommand3,rulesMoveSubcommand,rulesRemoveSubcommand,rulesRemoveSubcommand2,rulesRemoveSubcommand3,rulesReorderSubcommand,rulesSubcommand,rulesSubcommand2,rulesSubcommand3,rulesUpdateSubcommand as rulesUpdateSubcommand2,runSubcommand,schedulesCommand,sdkKeysAddSubcommand,sdkKeysListSubcommand,sdkKeysRemoveSubcommand,sdkKeysSubcommand,searchSubcommand,searchSubcommand2,securityCommand,segmentsCreateSubcommand,segmentsInspectSubcommand,segmentsListSubcommand,segmentsRemoveSubcommand,segmentsSubcommand,segmentsUpdateSubcommand,setRampSubcommand,setSubcommand,setSubcommand2,setSubcommand3,setupCommand,setupSubcommand,signedTokenSubcommand,signupCommand,skillsCommand,speedInsightsSubcommand,splitSubcommand,ssoSubcommand,staleSubcommand,startSubcommand,startSubcommand2,statusSubcommand,statusSubcommand2,statusSubcommand3,statusSubcommand4,statusSubcommand5,statusSubcommand6,storageCommand,storeMatchesType,storeProductLabel,storeSupportsOidc,storeTypeName,switchSubcommand,systemBypassAddSubcommand,systemBypassListSubcommand,systemBypassRemoveSubcommand,systemBypassSubcommand,systemMitigationsPauseSubcommand,systemMitigationsResumeSubcommand,systemMitigationsSubcommand,targetCommand,targetsAddSubcommand,targetsListSubcommand,targetsRemoveSubcommand,targetsSubcommand,teamsCommand,telemetryCommand,tokenSubcommand,tokenSubcommand2,tokensCommand,tokensSubcommand,traceSubcommand,trafficInspectSubcommand,trafficListSubcommand,trafficSubcommand,transferInSubcommand,unarchiveSubcommand,updateGrantSubcommand,updateSubcommand,updateSubcommand10,updateSubcommand11,updateSubcommand2,updateSubcommand3,updateSubcommand4,updateSubcommand5,updateSubcommand6,updateSubcommand7,updateSubcommand8,updateSubcommand9,upgradeCommand,uploadSubcommand,usageCommand,useSubcommand,useTargetingSubcommand,verifySubcommand,versionCommand,versionsDiffSubcommand,versionsListSubcommand,versionsSubcommand,virtualModelsCreateSubcommand,virtualModelsEditSubcommand,virtualModelsInspectSubcommand,virtualModelsListSubcommand,virtualModelsRemoveSubcommand,virtualModelsRestoreSubcommand,virtualModelsSubcommand,webAnalyticsSubcommand,webhooksCommand,whoamiCommand}from"./chunks/chunk-U5C6XOLA.js";import{createSubcommand as createSubcommand8,getSubcommand as getSubcommand4,searchSubcommand as searchSubcommand3,tracesCommand}from"./chunks/chunk-OH2RT2GN.js";import{tracesConfigCommand}from"./chunks/chunk-UFXKCETS.js";import{addSubcommand as addSubcommand13,buildSubcommand,configSubcommand,inspectSubcommand as inspectSubcommand14,listSubcommand as listSubcommand26,loginSubcommand,pushSubcommand,removeSubcommand as removeSubcommand16,vcrCommand}from"./chunks/chunk-RZGWCQP7.js";import{imageAggregateCommand,imageInspectSubcommand,imageLsSubcommand,imageRmSubcommand}from"./chunks/chunk-AG5QQNJ3.js";import{PERMISSIONS_ACTIONS,permissionsAddSubcommand,permissionsAggregateCommand,permissionsClearSubcommand,permissionsLsSubcommand,permissionsRmSubcommand}from"./chunks/chunk-AU42HSQ3.js";import{tagsAggregateCommand,tagsInspectSubcommand,tagsLsSubcommand}from"./chunks/chunk-L5FUUGYX.js";import{addSubcommand as addSubcommand10,deleteSubcommand as deleteSubcommand3,disableSubcommand as disableSubcommand3,discardSubcommand as discardSubcommand2,editSubcommand as editSubcommand2,enableSubcommand as enableSubcommand3,exportSubcommand,inspectSubcommand as inspectSubcommand13,listSubcommand as listSubcommand20,listVersionsSubcommand as listVersionsSubcommand2,publishSubcommand as publishSubcommand2,reorderSubcommand,restoreSubcommand as restoreSubcommand2,routesCommand}from"./chunks/chunk-QC47UKDR.js";import{metricsCommand,schemaSubcommand}from"./chunks/chunk-QJKJBD2M.js";import{commentsCommand,deleteSubcommand,editSubcommand,inspectSubcommand as inspectSubcommand5,listSubcommand as listSubcommand7,openSubcommand,reopenSubcommand,replySubcommand,resolveSubcommand}from"./chunks/chunk-MYCQIZU6.js";import{alertsCommand,inspectSubcommand as inspectSubcommand3,listSubcommand as listSubcommand3}from"./chunks/chunk-CNU4T7FO.js";import{rulesAddSubcommand as rulesAddSubcommand2,rulesAggregateCommand,rulesInspectSubcommand,rulesLsSubcommand,rulesNotificationsAggregateCommand,rulesNotificationsLinkSubcommand,rulesNotificationsLsSubcommand,rulesNotificationsUnlinkSubcommand,rulesNotificationsUpdateSubcommand,rulesRmSubcommand,rulesSchemaSubcommand,rulesUpdateSubcommand}from"./chunks/chunk-LU5O3NH7.js";import{logsCommand}from"./chunks/chunk-AMDHTZDV.js";import{activityCommand,typesSubcommand}from"./chunks/chunk-2JBVMF2Y.js";import"./chunks/chunk-JLXG2XWW.js";import"./chunks/chunk-B4YYOSPY.js";import"./chunks/chunk-UTW2FDSC.js";import{DEV_RESOURCE_TOKEN}from"./chunks/chunk-S7XZC23O.js";import"./chunks/chunk-JALVF3C2.js";import"./chunks/chunk-FBYA6LLM.js";import{envTargetChoices,isValidEnvTarget}from"./chunks/chunk-HJ3NY4UA.js";import{getTeams}from"./chunks/chunk-2H243SJV.js";import"./chunks/chunk-SCV7XEEO.js";import{param}from"./chunks/chunk-3G3FQYMW.js";import{getPaginationOpts,isValidName}from"./chunks/chunk-ILFUNCJZ.js";import{getCommandFlags}from"./chunks/chunk-OUHPDA7Q.js";import{formatEnvironment}from"./chunks/chunk-JSBEAHKA.js";import{validateLsArgs}from"./chunks/chunk-EO7GUARB.js";import{STANDARD_ENVIRONMENTS,formatProject}from"./chunks/chunk-3EYOQC4R.js";import{elapsed}from"./chunks/chunk-Q7D7RGXM.js";import"./chunks/chunk-XEQT373M.js";import{getDeployment,toHost}from"./chunks/chunk-VIBUYIZ3.js";import{mapCertError}from"./chunks/chunk-6LRVRPYO.js";import"./chunks/chunk-GRTIWUV2.js";import{buildCommandDocumentationLines,help}from"./chunks/chunk-7D2HVBVP.js";import{table}from"./chunks/chunk-773GOZIR.js";import{printError}from"./chunks/chunk-V336CYEI.js";import{AGENT_ACTION,AGENT_REASON,AGENT_STATUS,BUY_PRO_COMMAND,PRIORITY_PROJECT_ENABLE_COMMAND,argvHasNonInteractive,buildCommandWithGlobalFlags,buildCommandWithYes,buildIntegrationCommandTailFromArgv,buyProFix,clientObservabilityPlanRecovery,exitWithNonInteractiveError,getExitCodeForReason,getGlobalFlagsFromArgv,isProOrEnterprisePlan,openUrlInBrowserCommand,outputActionRequired,outputAgentError,outputAgentSuccess,shouldEmitNonInteractiveCommandError,targetRecovery,withGlobalFlags,writeAgentError}from"./chunks/chunk-5RR3435W.js";import"./chunks/chunk-67GZ5REA.js";import{require_strip_ansi}from"./chunks/chunk-BS32OUOC.js";import{validateJsonOutput,wantsMachineReadableOutput}from"./chunks/chunk-D4MW3RDW.js";import{detectExplicitScope,getContextName,getScope,introspectToken,isAppPrincipalEnabled,persistAuthConfig,readLocalConfig,resolveAppFromToken,writeToConfigFile}from"./chunks/chunk-DZ6GORJ7.js";import{getGlobalPathConfig}from"./chunks/chunk-HMS3UIQ2.js";import{require_ms}from"./chunks/chunk-MXTC4ZAQ.js";import{TelemetryClient}from"./chunks/chunk-HUJPGK7W.js";import"./chunks/chunk-VKXEOL4K.js";import{getInstallRoot,isNativeBinaryInstall}from"./chunks/chunk-YYPNUQDI.js";import"./chunks/chunk-4SAVH3H7.js";import"./chunks/chunk-ZS2WS4AM.js";import{processRevocationResponse,revocationRequest,ua_default}from"./chunks/chunk-AOWWC6WZ.js";import{directFetch,fetch as fetch2,getFetchDispatcher,toNodeReadable}from"./chunks/chunk-MY4MONOH.js";import{isArgumentError,parseArguments,require_arg}from"./chunks/chunk-R4VVQRLX.js";import{quoteArg}from"./chunks/chunk-BKV35LVB.js";import{GLOBAL_CLI_FLAG_NAMES,arg_common_default,formatOption,getFlagsSpecification,getGlobalFlagsFromArgs,getProjectOptionFromArgs,getSameSubcommandSuggestionFlags,globalCommandOptions,jsonOption,normalizeFlagName,stripSensitiveAuthArgs}from"./chunks/chunk-5IPBCD7K.js";import{VERCEL_CONFIG_EXTENSIONS,execFileAsync,getGitConfigPath,getGitExecutable,getLinkFromDir,getLinkedProject,getProjectByNameOrId,getProjectLink,getVercelDirectory,parseGitConfig,pluckRemoteUrls,require_lib,require_pluralize,resolveProjectCwd}from"./chunks/chunk-MYMM34ZH.js";import"./chunks/chunk-ROPQIBWJ.js";import"./chunks/chunk-VKPZP4LC.js";import{humanizePath}from"./chunks/chunk-PPCFQQSU.js";import{ALIGNED_LABEL_WIDTH,formatAlignedLabel,printAlignedLabel}from"./chunks/chunk-N7Q2IESO.js";import{getUser}from"./chunks/chunk-VSE5BAPP.js";import{getTeamByIdOrSlug,teamCache}from"./chunks/chunk-VOZEB6PD.js";import{APIError,AliasInUse,CertConfigurationError,CertError,CertMissing,CertNotFound,CertOrderNotFound,CertsPermissionDenied,DNSConflictingRecord,DNSInvalidPort,DNSInvalidType,DNSPermissionDenied,DeploymentFailedAliasImpossible,DeploymentNotFound,DeploymentNotReady,DeploymentPermissionDenied,DomainAlreadyExists,DomainExternal,DomainMoveConflict,DomainNotAvailable,DomainNotFound,DomainNotVerified,DomainPaymentError,DomainPermissionDenied,DomainPurchasePending,DomainRemovalConflict,InvalidAlias,InvalidAliasInConfig,InvalidDeploymentId,InvalidDomain,InvalidMoveDestination,InvalidToken,LinkRequiredError,NoAliasInConfig,NowError,ProjectNotFound,SourceNotFound,TLDNotSupportedViaCLI,TooManyRequests,UnexpectedDomainPurchaseError,UnexpectedDomainTransferError,UnsupportedTLD,UserAborted,code,isAPIError,require_bytes}from"./chunks/chunk-AZULOP7M.js";import{cmd,getCommandName,getCommandNamePlain,packageName,require_lib as require_lib2}from"./chunks/chunk-JESNVRVR.js";import{chars_default,emoji,eraseLines,link_default,output_manager_default,prependEmoji}from"./chunks/chunk-75IAMKGV.js";import{require_dist}from"./chunks/chunk-RM3ZDRYE.js";import{pkg_default}from"./chunks/chunk-OO572JUC.js";import"./chunks/chunk-D3AHZ5LI.js";import"./chunks/chunk-2GHZGOWT.js";import"./chunks/chunk-YHPPP3SF.js";import{require_source}from"./chunks/chunk-NB2WLB3J.js";import"./chunks/chunk-ISWW3DKF.js";import"./chunks/chunk-BRQUZ5NC.js";import{__require,__toESM}from"./chunks/chunk-BZENIQ7N.js";var AgentTelemetryClient=class extends TelemetryClient{trackCliArgumentInit(value){value&&this.trackCliArgument({arg:"init",value})}trackCliFlagYes(value){value&&this.trackCliFlag("yes")}};var import_chalk=__toESM(require_source(),1);import{readFile,writeFile}from"node:fs/promises";import{join}from"node:path";import{KNOWN_AGENTS}from"@vercel/detect-agent";var BEST_PRACTICES_START="<!-- VERCEL BEST PRACTICES START -->",BEST_PRACTICES_END="<!-- VERCEL BEST PRACTICES END -->",BEST_PRACTICES_BODY=`## Best practices for developing on Vercel
|
|
7
|
+
import{handleTracingApiError,invalidArguments,resolveConfigScope,resolveScope}from"./chunks/chunk-6OUBLFZ2.js";import{ALL_ACTION_CHOICES,MAX_CONDITIONS,MAX_DESCRIPTION_LENGTH,MAX_NAME_LENGTH,REDIRECT_STATUS_CODES,VALID_SYNTAXES,collectActionDetails,collectHeadersAndTransforms,collectInteractiveConditions,convertRouteToCurrentRoute,extractTransformFlags,generateRoute,generatedRouteToAddInput,parseConditions,populateRouteEnv,printGeneratedRoutePreview,runInteractiveEditLoop,stripQuotes,validateActionFlags}from"./chunks/chunk-6BE4D57F.js";import{getRouteVersions}from"./chunks/chunk-BVH2AEFE.js";import{TRANSFORM_TYPE_LABELS,findVersionById,formatCondition,formatTransform,getRouteTypeLabel,getRoutes,getSrcSyntaxLabel,isTargetTransform,offerAutoPromote,parsePosition,parseSubcommandArgs,parseSubcommandArguments,requireProjectContext,validateRequiredArguments,withGlobalFlags as withGlobalFlags2}from"./chunks/chunk-IFNTXDX2.js";import{FILTER_DEPRECATION_WARNING,computeGranularity,formatText,generateSparkline,toGranularityMsFromDuration,usesODataSyntax}from"./chunks/chunk-36EFWYTN.js";import{OBSERVABILITY_METRICS_PATH,getRollupColumnName,handleApiError}from"./chunks/chunk-MT4MO7DT.js";import{RoutesAddTelemetryClient,RoutesTelemetryClient}from"./chunks/chunk-Z6HYEIYV.js";import{canPrompt}from"./chunks/chunk-XD2LZRBS.js";import"./chunks/chunk-IVSSTHB6.js";import{formatDate,formatDateWithoutTime}from"./chunks/chunk-HRR57QNP.js";import{indent_default}from"./chunks/chunk-GZNDA6SV.js";import{handleValidationError,normalizeRepeatableStringFilters,outputError,parseTimeFlag,resolveTimeRange,validateIntegerRangeWithDefault,validateTimeBound,validateTimeOrder}from"./chunks/chunk-WH3SHWVK.js";import{collectBuildLogs,displayBuildLogs,displayRuntimeLogs,require_split2}from"./chunks/chunk-OPVNMCAF.js";import{require_format}from"./chunks/chunk-PFD7LETF.js";import{addDomain,createCertForCns,extractDomain,getDomainByName,isWildcardAlias,require_cjs,setupDomain}from"./chunks/chunk-JYFYL3ON.js";import{CONTACT_FIELDS,billingFieldsUsed,collectContactInformation,getBillingContact,getDomainPrice,getDomainStatus,getOrderOutcome,mergeContact,missingContactFields,pollForOrder,purchaseDomain,readContactFlags}from"./chunks/chunk-TUJ3WXOZ.js";import{api,tryOpenApiFallback}from"./chunks/chunk-SKTP7MSL.js";import"./chunks/chunk-GHAY4PSD.js";import{login}from"./chunks/chunk-D7KEDMBF.js";import{main}from"./chunks/chunk-XKDY4OFQ.js";import{LOCAL_SCHEDULES_SESSION_HEADER,isLocalSchedulesOrigin,readLocalSchedulesSessions}from"./chunks/chunk-SF4E3AQ3.js";import{selectOrg}from"./chunks/chunk-EDVP7QUI.js";import{createProject}from"./chunks/chunk-QHJLRTVY.js";import{require_fast_deep_equal}from"./chunks/chunk-MCRKBVZA.js";import{CURL_INSTALL_COMMAND,NATIVE_UPDATE_SELECT_PRODUCTION_ENV,NATIVE_UPDATE_VERSION_ENV,box,cacheNativeUpdateDiscoveryAttempt,cacheNativeUpdateVersion,did_you_mean_default,executeUpgrade,handleCommandTypo,installAndActivatePrBinary,installAndActivateProductionVersion,isAutoUpdateEnabled,isCurlInstall,isNativeAutoUpdateEnabled,isNativeUpdateChild,listAvailableVersions,listNativeTrackSlots,markNativeUpdateStaged,parsePrTarget,pinPackageVersion,readActivePointer,readNativeInstallState,require_tar_fs,resolveLatestNativeVersion,restoreNativeUpdateAfterDiscoveryFailure,setAutoUpdate,setMinReleaseAgeBypass,spawnNativeUpdateChild,stageProductionUpdate,withDirectoryLock}from"./chunks/chunk-GAG42XNF.js";import{OpenApiCache,resolveOpenApiTagForProjectsCli,resolveOpenApiTagForTeamsCli}from"./chunks/chunk-B3K6GM2W.js";import{getUpdateCommand,getUpdateCommandInfo,isGlobal}from"./chunks/chunk-3TJDVDDJ.js";import{readJSONFile}from"./chunks/chunk-VLSSMFTF.js";import{Now,getBuildMachineResourceConfig,isDeploying,printDeploymentStatus}from"./chunks/chunk-ZQBMRI57.js";import{require_async_sema}from"./chunks/chunk-NZ2TFADV.js";import"./chunks/chunk-X5GP2FBT.js";import{dump,load}from"./chunks/chunk-V6Y6UK6B.js";import{checkExistsAndConnect,disconnectGitProvider,list,parseRepoUrl,printRemoteUrls,selectAndParseRemoteUrl}from"./chunks/chunk-SYEKOJHT.js";import"./chunks/chunk-EAUDC24V.js";import"./chunks/chunk-FU7KGU6V.js";import{require_dist as require_dist3}from"./chunks/chunk-YAPHSZJ7.js";import{require_dist2}from"./chunks/chunk-WJ4VNTE3.js";import"./chunks/chunk-SZRSBECO.js";import"./chunks/chunk-RRDNKB2X.js";import"./chunks/chunk-MVGTMPMI.js";import"./chunks/chunk-SACGQMVQ.js";import"./chunks/chunk-U56NHYAH.js";import"./chunks/chunk-2EYYB6YN.js";import{require_semver}from"./chunks/chunk-BPUANOGW.js";import"./chunks/chunk-3E364MJE.js";import"./chunks/chunk-7EJQLVWX.js";import{responseError}from"./chunks/chunk-JORUFFOD.js";import"./chunks/chunk-O4FDRZ22.js";import{sleep}from"./chunks/chunk-T3GQAMBJ.js";import"./chunks/chunk-P2O5DOYE.js";import{CHECKBOX_INSTRUCTIONS,getCustomEnvironments,pickCustomEnvironment,readStandardInput,require_dist as require_dist4}from"./chunks/chunk-6JGC4YDH.js";import{getInvalidSubcommand}from"./chunks/chunk-TG2RCYTH.js";import{ellipsis}from"./chunks/chunk-F4KY2TOK.js";import{formatTable,strlen}from"./chunks/chunk-LSQREJXO.js";import{ellipsizeMiddle,truncateEnd}from"./chunks/chunk-ID663OJ7.js";import{GATEWAY_ANTHROPIC_BASE_URL,GATEWAY_API_KEY_ENV,GATEWAY_CODEX_BASE_URL,GATEWAY_CODING_AGENT_BASE_URL,GATEWAY_CURSOR_BASE_URL,GATEWAY_DEFAULT_MODEL,KEY_PLACEHOLDER,MANAGED_BLOCK_END,MANAGED_BLOCK_START,autoInstallVercelPlugin,backupFile,claudeCode,ensureMode,isFile,isSymlink,maskSecret,mergeJson,mergeJsonc,mergeToml,parseJsonObjectOrNull,pathExists,publishNoClobber,readFileOrNull,resolveGatewayBaseUrl,setupVercelPlugin,upsertManagedBlock,writeConfigFile}from"./chunks/chunk-N7L3XLWC.js";import{require_execa}from"./chunks/chunk-GSOPJJO5.js";import{createEnvObject,envPullCommandLogic,pull}from"./chunks/chunk-ZH4DW3T3.js";import{resolveProjectContext}from"./chunks/chunk-K5GYV5CW.js";import"./chunks/chunk-25565AGS.js";import{isGuidanceEnabled}from"./chunks/chunk-A5R2HHNK.js";import{stamp_default}from"./chunks/chunk-A2RZZQEP.js";import{getSubcommand as getSubcommand7}from"./chunks/chunk-ETV3C2CV.js";import{init_main,parse}from"./chunks/chunk-J24BABG4.js";import{ensureLink}from"./chunks/chunk-7SGM233C.js";import"./chunks/chunk-3YQVBYQD.js";import{performDeviceCodeFlow,saveDeviceCodeTokens}from"./chunks/chunk-I7FGFRN3.js";import{require_open}from"./chunks/chunk-PVASGBEF.js";import{require_frameworks}from"./chunks/chunk-MVCAUS4F.js";import{CI_LOG_LEVELS,CREDIT_TYPE_LABELS,FLAG_ATTRIBUTE_TYPES,FLAG_CONDITION_LIST_COMPARATORS,FLAG_CONDITION_RHS_OPTIONAL_COMPARATORS,FLAG_EVALUATIONS_DIMENSIONS,FLAG_EVALUATIONS_DIMENSION_NAMES,FLAG_EVALUATIONS_GRANULARITIES,KMS_ALGORITHMS,PROJECT_GRANT_POLICY_KIND,PROJECT_MEMBER_ROLES,STORAGE_PROVIDERS,SUPPORTED_ADDON_NAMES,SUPPORTED_CREDIT_TYPES,abortSubcommand,acceptTermsSubcommand,accessGroupsSubcommand,accessSummarySubcommand,activateKeySubcommand,addGrantSubcommand,addKeySubcommand,addSubcommand,addSubcommand10 as addSubcommand9,addSubcommand11,addSubcommand12,addSubcommand2,addSubcommand3,addSubcommand4,addSubcommand5,addSubcommand6,addSubcommand7,addSubcommand9 as addSubcommand8,addToGroupSubcommand,addonSubcommand,agentCommand,agentRunsCommand,aiGatewayCommand,alertsInspectSubcommand,alertsListSubcommand,alertsSubcommand,aliasCommand,analyzeSubcommand,apiKeysSubcommand,approveSubcommand,archiveSubcommand,attachSubcommand,attackModeDisableSubcommand,attackModeEnableSubcommand,attackModeSubcommand,autoRenewSubcommand,autoupdateSubcommand,backupsSubcommand,balanceSubcommand,bisectCommand,blobCommand,botManagementSubcommand,budgetCommand,budgetsDefaultsListSubcommand,budgetsDefaultsRemoveSubcommand,budgetsDefaultsSetSubcommand,budgetsDefaultsSubcommand,budgetsInspectSubcommand,budgetsListSubcommand,budgetsRemoveSubcommand,budgetsSetSubcommand,budgetsSubcommand,buildersCommand,buyCommand,buySubcommand,cacheCommand,categoriesSubcommand,certsCommand,changelogCommand,checkSubcommand,checkSubcommand2,checkSubcommand3,checksAddFlags,checksRemoveFlags,checksSubcommand,ciCommand,claimSubcommand,codingAgentsSubcommand,completeSubcommand,configureSubcommand,connectSubcommand,connectSubcommand2,connectSubcommand3,connectionsAddSubcommand,connectionsListSubcommand,connectionsRemoveSubcommand,connectionsSubcommand,connexCommand,contactsAddSubcommand,contactsSubcommand,contractCommand,copySubcommand,createGroupSubcommand,createStoreSubcommand,createSubcommand,createSubcommand2,createSubcommand3,createSubcommand4,createSubcommand5,createSubcommand6,createSubcommand7,createSubcommand8 as createSubcommand9,createThresholdSubcommand,creditsSubcommand,cronsCommand,curlCommand,dangerouslyDeleteImmutableStaticAssetSubcommand,dangerouslyDeleteSubcommand,decideSubcommand,delSubcommand,deleteGroupSubcommand,deleteStoreSubcommand,deleteSubcommand as deleteSubcommand2,deleteSubcommand2 as deleteSubcommand4,deleteSubcommand3 as deleteSubcommand5,deployHooksCommand,detachSubcommand,diagnoseSubcommand,diffSubcommand,disableSubcommand,disableSubcommand2,disableSubcommand3 as disableSubcommand4,disableSubcommand4 as disableSubcommand5,discardSubcommand,disconnectSubcommand,disconnectSubcommand2,disconnectSubcommand3,discoverSubcommand,dnsCommand,domainSubcommand,domainsCommand,emptyStoreSubcommand,enableSubcommand,enableSubcommand2,enableSubcommand3 as enableSubcommand4,enableSubcommand4 as enableSubcommand5,entitiesCreateSubcommand,entitiesListSubcommand,entitiesRemoveSubcommand,entitiesSubcommand,entitiesUpdateSubcommand,evaluationsSubcommand,executionsListSubcommand,executionsSubcommand,experimentsCommand,fetchSubcommand,findForeignCreateFlags,findOverlappingConnections,firewallCommand,flagsCommand,flushSubcommand,formatFlagAttributeTypeList,formatFlagConditionComparator,formatFlagConditionComparatorList,getCommandAliases,getConnections,getFlagAttributeType,getStorageProvider,getStorageStore,getStorageStores,getStoreInfoSubcommand,getSubcommand,getSubcommand2,getSubcommand3,getSubcommand4 as getSubcommand5,getSubcommand5 as getSubcommand6,gitCommand,globalConfigCommand,grepSubcommand,guidanceCommand,guideSubcommand,httpstatCommand,importKeySubcommand,importSubcommand,importSubcommand2,initCommand,inspectCommand,inspectGroupSubcommand,inspectSubcommand,inspectSubcommand10 as inspectSubcommand12,inspectSubcommand11 as inspectSubcommand15,inspectSubcommand2,inspectSubcommand3 as inspectSubcommand4,inspectSubcommand4 as inspectSubcommand5,inspectSubcommand5 as inspectSubcommand7,inspectSubcommand6 as inspectSubcommand8,inspectSubcommand7 as inspectSubcommand9,inspectSubcommand8 as inspectSubcommand10,inspectSubcommand9 as inspectSubcommand11,installCommand,installationsSubcommand,installedSubcommand,integrationCommand,integrationResourceCommand,invalidateSubcommand,inviteSubcommand,invokeSubcommand,ipBlocksBlockSubcommand,ipBlocksListSubcommand,ipBlocksSubcommand,ipBlocksUnblockSubcommand,isBucketingAttribute,isCustomEnvironmentAddonAlias,isFlagAttributeType,isFlagEvaluationsDimension,isFlagEvaluationsGranularity,isProjectGrant,isTimestampAttributeType,issueSubcommand,issuerJwksUrl,issuerUrl,itemsSubcommand,kmsCommand,labelsListSubcommand,labelsSubcommand,leaderboardAppsSubcommand,leaderboardLabsSubcommand,leaderboardModelsSubcommand,leaderboardProvidersSubcommand,leaderboardSubcommand,listStorageProviderTypes,listStoresSubcommand,listSubcommand,listSubcommand10 as listSubcommand12,listSubcommand11 as listSubcommand13,listSubcommand12 as listSubcommand14,listSubcommand13 as listSubcommand15,listSubcommand14 as listSubcommand16,listSubcommand15 as listSubcommand17,listSubcommand16 as listSubcommand18,listSubcommand17 as listSubcommand19,listSubcommand18 as listSubcommand21,listSubcommand19 as listSubcommand22,listSubcommand2,listSubcommand20 as listSubcommand23,listSubcommand21 as listSubcommand24,listSubcommand22 as listSubcommand25,listSubcommand23 as listSubcommand27,listSubcommand24 as listSubcommand28,listSubcommand25 as listSubcommand29,listSubcommand26 as listSubcommand30,listSubcommand3 as listSubcommand4,listSubcommand4 as listSubcommand5,listSubcommand5 as listSubcommand6,listSubcommand6 as listSubcommand7,listSubcommand7 as listSubcommand9,listSubcommand8 as listSubcommand10,listSubcommand9 as listSubcommand11,listVersionsSubcommand,loadStoreDetails,logoutCommand,logsSubcommand,mcpCommand,membersAddFlags,membersInviteSubcommand,membersRemoveFlags,membersRemoveSubcommand,membersSubcommand,membersSubcommand2,microfrontendsCommand,modelsEndpointsSubcommand,modelsListSubcommand,modelsSubcommand,moveSubcommand,observabilitySubcommand,openCommand,openSubcommand as openSubcommand2,openSubcommand2 as openSubcommand3,openSubcommand3 as openSubcommand4,openSubcommand4 as openSubcommand5,overrideSubcommand,overviewSubcommand,pauseSubcommand,persistentActionsInspectSubcommand,persistentActionsListSubcommand,persistentActionsSubcommand,preinstallSubcommand,prepareSubcommand,presignSubcommand,priceSubcommand,pricingCommand,prioritySubcommand,proSubcommand,projectCommand,projectsSubcommand,promoteCommand,promoteSubcommand,protectionSubcommand,publishSubcommand,pullSubcommand,purgeSubcommand,putImageSubcommand,putSubcommand,redeployCommand,redirectsCommand,removeCommand,removeFromGroupSubcommand,removeGrantSubcommand,removeSubcommand,removeSubcommand10,removeSubcommand11,removeSubcommand12,removeSubcommand13,removeSubcommand14,removeSubcommand15,removeSubcommand16 as removeSubcommand17,removeSubcommand17 as removeSubcommand18,removeSubcommand2,removeSubcommand3,removeSubcommand4,removeSubcommand5,removeSubcommand6,removeSubcommand7,removeSubcommand8,removeSubcommand9,renameSubcommand,renewSubcommand,requestSubcommand,rerunSubcommand,reseedEnrollmentSubcommand,resolveProjectConnection,resolveStore,resourceSubcommand,restartAnalysisSubcommand,restoreSubcommand,resumeSubcommand,returnToDraftSubcommand,revokeKeySubcommand,revokeTokensSubcommand,rollbackCommand,rollingReleaseCommand,rolloutSubcommand,rulesAddSubcommand,rulesAddSubcommand2 as rulesAddSubcommand3,rulesAddSubcommand3 as rulesAddSubcommand4,rulesDisableSubcommand,rulesEditSubcommand,rulesEditSubcommand2,rulesEnableSubcommand,rulesInspectSubcommand as rulesInspectSubcommand2,rulesListSubcommand,rulesListSubcommand2,rulesListSubcommand3,rulesMoveSubcommand,rulesRemoveSubcommand,rulesRemoveSubcommand2,rulesRemoveSubcommand3,rulesReorderSubcommand,rulesSubcommand,rulesSubcommand2,rulesSubcommand3,rulesUpdateSubcommand as rulesUpdateSubcommand2,runSubcommand,schedulesCommand,sdkKeysAddSubcommand,sdkKeysListSubcommand,sdkKeysRemoveSubcommand,sdkKeysSubcommand,searchSubcommand,searchSubcommand2,securityCommand,segmentsCreateSubcommand,segmentsInspectSubcommand,segmentsListSubcommand,segmentsRemoveSubcommand,segmentsSubcommand,segmentsUpdateSubcommand,setRampSubcommand,setSubcommand,setSubcommand2,setSubcommand3,setupCommand,setupSubcommand,signedTokenSubcommand,signupCommand,skillsCommand,speedInsightsSubcommand,splitSubcommand,ssoSubcommand,staleSubcommand,startSubcommand,startSubcommand2,statusSubcommand,statusSubcommand2,statusSubcommand3,statusSubcommand4,statusSubcommand5,statusSubcommand6,storageCommand,storeMatchesType,storeProductLabel,storeSupportsOidc,storeTypeName,switchSubcommand,systemBypassAddSubcommand,systemBypassListSubcommand,systemBypassRemoveSubcommand,systemBypassSubcommand,systemMitigationsPauseSubcommand,systemMitigationsResumeSubcommand,systemMitigationsSubcommand,targetCommand,targetsAddSubcommand,targetsListSubcommand,targetsRemoveSubcommand,targetsSubcommand,teamsCommand,telemetryCommand,tokenSubcommand,tokenSubcommand2,tokensCommand,tokensSubcommand,traceSubcommand,trafficInspectSubcommand,trafficListSubcommand,trafficSubcommand,transferInSubcommand,unarchiveSubcommand,updateGrantSubcommand,updateSubcommand,updateSubcommand10,updateSubcommand11,updateSubcommand2,updateSubcommand3,updateSubcommand4,updateSubcommand5,updateSubcommand6,updateSubcommand7,updateSubcommand8,updateSubcommand9,upgradeCommand,uploadSubcommand,usageCommand,useSubcommand,useTargetingSubcommand,verifySubcommand,versionCommand,versionsDiffSubcommand,versionsListSubcommand,versionsSubcommand,virtualModelsCreateSubcommand,virtualModelsEditSubcommand,virtualModelsInspectSubcommand,virtualModelsListSubcommand,virtualModelsRemoveSubcommand,virtualModelsRestoreSubcommand,virtualModelsSubcommand,webAnalyticsSubcommand,webhooksCommand,whoamiCommand}from"./chunks/chunk-OB5XGIDM.js";import{createSubcommand as createSubcommand8,getSubcommand as getSubcommand4,searchSubcommand as searchSubcommand3,tracesCommand}from"./chunks/chunk-OH2RT2GN.js";import{tracesConfigCommand}from"./chunks/chunk-UFXKCETS.js";import{addSubcommand as addSubcommand13,buildSubcommand,configSubcommand,inspectSubcommand as inspectSubcommand14,listSubcommand as listSubcommand26,loginSubcommand,pushSubcommand,removeSubcommand as removeSubcommand16,vcrCommand}from"./chunks/chunk-RZGWCQP7.js";import{imageAggregateCommand,imageInspectSubcommand,imageLsSubcommand,imageRmSubcommand}from"./chunks/chunk-AG5QQNJ3.js";import{PERMISSIONS_ACTIONS,permissionsAddSubcommand,permissionsAggregateCommand,permissionsClearSubcommand,permissionsLsSubcommand,permissionsRmSubcommand}from"./chunks/chunk-AU42HSQ3.js";import{tagsAggregateCommand,tagsInspectSubcommand,tagsLsSubcommand}from"./chunks/chunk-L5FUUGYX.js";import{addSubcommand as addSubcommand10,deleteSubcommand as deleteSubcommand3,disableSubcommand as disableSubcommand3,discardSubcommand as discardSubcommand2,editSubcommand as editSubcommand2,enableSubcommand as enableSubcommand3,exportSubcommand,inspectSubcommand as inspectSubcommand13,listSubcommand as listSubcommand20,listVersionsSubcommand as listVersionsSubcommand2,publishSubcommand as publishSubcommand2,reorderSubcommand,restoreSubcommand as restoreSubcommand2,routesCommand}from"./chunks/chunk-QC47UKDR.js";import{metricsCommand,schemaSubcommand}from"./chunks/chunk-QJKJBD2M.js";import{commentsCommand,deleteSubcommand,editSubcommand,inspectSubcommand as inspectSubcommand6,listSubcommand as listSubcommand8,openSubcommand,reopenSubcommand,replySubcommand,resolveSubcommand}from"./chunks/chunk-MYCQIZU6.js";import{alertsCommand,inspectSubcommand as inspectSubcommand3,listSubcommand as listSubcommand3}from"./chunks/chunk-CNU4T7FO.js";import{rulesAddSubcommand as rulesAddSubcommand2,rulesAggregateCommand,rulesInspectSubcommand,rulesLsSubcommand,rulesNotificationsAggregateCommand,rulesNotificationsLinkSubcommand,rulesNotificationsLsSubcommand,rulesNotificationsUnlinkSubcommand,rulesNotificationsUpdateSubcommand,rulesRmSubcommand,rulesSchemaSubcommand,rulesUpdateSubcommand}from"./chunks/chunk-LU5O3NH7.js";import{logsCommand}from"./chunks/chunk-AMDHTZDV.js";import{activityCommand,typesSubcommand}from"./chunks/chunk-2JBVMF2Y.js";import"./chunks/chunk-JLXG2XWW.js";import"./chunks/chunk-B4YYOSPY.js";import"./chunks/chunk-I3D36ZLJ.js";import{DEV_RESOURCE_TOKEN}from"./chunks/chunk-S7XZC23O.js";import"./chunks/chunk-JALVF3C2.js";import"./chunks/chunk-FBYA6LLM.js";import{envTargetChoices,isValidEnvTarget}from"./chunks/chunk-6LXX5P3A.js";import{getTeams}from"./chunks/chunk-MSH7V3FL.js";import"./chunks/chunk-SCV7XEEO.js";import{param}from"./chunks/chunk-3G3FQYMW.js";import{getPaginationOpts,isValidName}from"./chunks/chunk-ILFUNCJZ.js";import{getCommandFlags}from"./chunks/chunk-OUHPDA7Q.js";import{formatEnvironment}from"./chunks/chunk-JSBEAHKA.js";import{validateLsArgs}from"./chunks/chunk-EO7GUARB.js";import{STANDARD_ENVIRONMENTS,formatProject}from"./chunks/chunk-3EYOQC4R.js";import{elapsed}from"./chunks/chunk-Q7D7RGXM.js";import"./chunks/chunk-XEQT373M.js";import{getDeployment,toHost}from"./chunks/chunk-J2LAZELI.js";import{mapCertError}from"./chunks/chunk-E6UKNYFF.js";import"./chunks/chunk-GRTIWUV2.js";import{buildCommandDocumentationLines,help}from"./chunks/chunk-5O2CW3SX.js";import{table}from"./chunks/chunk-773GOZIR.js";import{printError}from"./chunks/chunk-T6GXMIXO.js";import{AGENT_ACTION,AGENT_REASON,AGENT_STATUS,BUY_PRO_COMMAND,PRIORITY_PROJECT_ENABLE_COMMAND,argvHasNonInteractive,buildCommandWithGlobalFlags,buildCommandWithYes,buildIntegrationCommandTailFromArgv,buyProFix,clientObservabilityPlanRecovery,exitWithNonInteractiveError,getExitCodeForReason,getGlobalFlagsFromArgv,isProOrEnterprisePlan,openUrlInBrowserCommand,outputActionRequired,outputAgentError,outputAgentSuccess,shouldEmitNonInteractiveCommandError,targetRecovery,withGlobalFlags,writeAgentError}from"./chunks/chunk-5YQP44VL.js";import"./chunks/chunk-67GZ5REA.js";import{require_strip_ansi}from"./chunks/chunk-BS32OUOC.js";import{validateJsonOutput,wantsMachineReadableOutput}from"./chunks/chunk-D4MW3RDW.js";import{detectExplicitScope,getContextName,getScope,introspectToken,isAppPrincipalEnabled,persistAuthConfig,readLocalConfig,resolveAppFromToken,scopeFlagPassed,writeToConfigFile}from"./chunks/chunk-HWYHRPWP.js";import{getGlobalPathConfig}from"./chunks/chunk-HMS3UIQ2.js";import{require_ms}from"./chunks/chunk-MXTC4ZAQ.js";import{TelemetryClient}from"./chunks/chunk-TNZMCRAP.js";import"./chunks/chunk-VKXEOL4K.js";import{getInstallRoot,isNativeBinaryInstall}from"./chunks/chunk-YYPNUQDI.js";import"./chunks/chunk-4SAVH3H7.js";import"./chunks/chunk-ZS2WS4AM.js";import{processRevocationResponse,revocationRequest,ua_default}from"./chunks/chunk-AOWWC6WZ.js";import{directFetch,fetch as fetch2,getFetchDispatcher,toNodeReadable}from"./chunks/chunk-MY4MONOH.js";import{isArgumentError,parseArguments,require_arg}from"./chunks/chunk-R4VVQRLX.js";import{quoteArg}from"./chunks/chunk-BKV35LVB.js";import{GLOBAL_CLI_FLAG_NAMES,arg_common_default,formatOption,getFlagsSpecification,getGlobalFlagsFromArgs,getProjectOptionFromArgs,getSameSubcommandSuggestionFlags,globalCommandOptions,jsonOption,normalizeFlagName,stripSensitiveAuthArgs}from"./chunks/chunk-5IPBCD7K.js";import{VERCEL_CONFIG_EXTENSIONS,execFileAsync,getGitConfigPath,getGitExecutable,getLinkFromDir,getLinkedProject,getProjectByNameOrId,getProjectLink,getVercelDirectory,parseGitConfig,pluckRemoteUrls,require_lib,require_pluralize,resolveProjectCwd}from"./chunks/chunk-SWJYZETA.js";import"./chunks/chunk-ROPQIBWJ.js";import"./chunks/chunk-VKPZP4LC.js";import{humanizePath}from"./chunks/chunk-PPCFQQSU.js";import{ALIGNED_LABEL_WIDTH,formatAlignedLabel,printAlignedLabel}from"./chunks/chunk-N7Q2IESO.js";import{getUser}from"./chunks/chunk-WPQN5UKR.js";import{getTeamByIdOrSlug,teamCache}from"./chunks/chunk-VOZEB6PD.js";import{APIError,AliasInUse,CertConfigurationError,CertError,CertMissing,CertNotFound,CertOrderNotFound,CertsPermissionDenied,DNSConflictingRecord,DNSInvalidPort,DNSInvalidType,DNSPermissionDenied,DeploymentFailedAliasImpossible,DeploymentNotFound,DeploymentNotReady,DeploymentPermissionDenied,DomainAlreadyExists,DomainChargeOutcomeUnknown,DomainExternal,DomainMoveConflict,DomainNotAvailable,DomainNotFound,DomainNotVerified,DomainPaymentError,DomainPermissionDenied,DomainPriceChanged,DomainPurchasePending,DomainPurchaseRefundFailed,DomainPurchaseRefunded,DomainRemovalConflict,InvalidAlias,InvalidAliasInConfig,InvalidDeploymentId,InvalidDomain,InvalidMoveDestination,InvalidToken,LinkRequiredError,NoAliasInConfig,NowError,ProjectNotFound,SourceNotFound,TLDNotSupportedViaCLI,TooManyRequests,UnexpectedDomainPurchaseError,UnexpectedDomainTransferError,UnsupportedTLD,UserAborted,code,isAPIError,require_bytes}from"./chunks/chunk-YIIPBH2D.js";import{cmd,getCommandName,getCommandNamePlain,packageName,require_lib as require_lib2}from"./chunks/chunk-JESNVRVR.js";import{chars_default,emoji,eraseLines,link_default,output_manager_default,prependEmoji,require_build_utils}from"./chunks/chunk-75IAMKGV.js";import{require_dist}from"./chunks/chunk-RM3ZDRYE.js";import{pkg_default}from"./chunks/chunk-OO572JUC.js";import"./chunks/chunk-D3AHZ5LI.js";import"./chunks/chunk-2GHZGOWT.js";import"./chunks/chunk-YHPPP3SF.js";import{require_source}from"./chunks/chunk-NB2WLB3J.js";import"./chunks/chunk-ISWW3DKF.js";import"./chunks/chunk-BRQUZ5NC.js";import{__require,__toESM}from"./chunks/chunk-BZENIQ7N.js";var AgentTelemetryClient=class extends TelemetryClient{trackCliArgumentInit(value){value&&this.trackCliArgument({arg:"init",value})}trackCliFlagYes(value){value&&this.trackCliFlag("yes")}};var import_chalk=__toESM(require_source(),1);import{readFile,writeFile}from"node:fs/promises";import{join}from"node:path";import{KNOWN_AGENTS}from"@vercel/detect-agent";var BEST_PRACTICES_START="<!-- VERCEL BEST PRACTICES START -->",BEST_PRACTICES_END="<!-- VERCEL BEST PRACTICES END -->",BEST_PRACTICES_BODY=`## Best practices for developing on Vercel
|
|
8
8
|
|
|
9
9
|
These defaults are optimized for AI coding agents (and humans) working on apps that deploy to Vercel.
|
|
10
10
|
|
|
@@ -55,7 +55,7 @@ ${table(subagentRows,{hsep:3})}`)}return`${sections.join(`
|
|
|
55
55
|
`),0;let projectList=asArray(data.projects??data.items);if(projectList.length===0)return output_manager_default.log("No projects with Agent Runs activity found."),0;output_manager_default.log(`Projects with Agent Runs under ${import_chalk5.default.bold(scope.contextName)} ${fetchStamp()}`);let rows=[["Project","Runs","Avg Duration"].map(header=>import_chalk5.default.bold(import_chalk5.default.cyan(header))),...projectList.map(project=>[import_chalk5.default.bold(readString(project,"projectName","name","project","projectId","id")??"-"),formatCount(readNumber(project,"runs","runCount","totalRuns")),import_chalk5.default.gray(formatDurationMs(readNumber(project,"avgDurationMs","averageDurationMs","avgDuration")))])];return client.stdout.write(`
|
|
56
56
|
${table(rows,{hsep:3}).replace(/^/gm," ")}
|
|
57
57
|
|
|
58
|
-
`),output_manager_default.log(`Run ${cmd("vercel agent-runs list --project <name>")} to list its Agent Runs.`),0}var COMMAND_CONFIG={list:getCommandAliases(listSubcommand),inspect:getCommandAliases(inspectSubcommand),trace:getCommandAliases(traceSubcommand),projects:getCommandAliases(projectsSubcommand)};async function agentRuns(client){let telemetry2=new AgentRunsTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(agentRunsCommand.options),parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(error){return printError(error),2}let subArgs=parsedArgs.args.slice(1),{subcommand,subcommandOriginal}=getSubcommand7(subArgs,COMMAND_CONFIG),needHelp=parsedArgs.flags["--help"];function printHelp(command2){output_manager_default.print(help(command2,{parent:agentRunsCommand,columns:client.stderr.columns}))}if(!subcommand){let unknown=subArgs.find(arg2=>!arg2.startsWith("-"));return unknown?(output_manager_default.error(`Unknown subcommand: ${unknown}`),output_manager_default.print(help(agentRunsCommand,{columns:client.stderr.columns})),2):(needHelp&&telemetry2.trackCliFlagHelp("agent-runs"),output_manager_default.print(help(agentRunsCommand,{columns:client.stderr.columns})),0)}switch(subcommand){case"list":return needHelp?(telemetry2.trackCliFlagHelp("agent-runs",subcommandOriginal),printHelp(listSubcommand),0):(telemetry2.trackCliSubcommandList(subcommandOriginal),await list2(client));case"inspect":return needHelp?(telemetry2.trackCliFlagHelp("agent-runs",subcommandOriginal),printHelp(inspectSubcommand),0):(telemetry2.trackCliSubcommandInspect(subcommandOriginal),await inspect(client));case"trace":return needHelp?(telemetry2.trackCliFlagHelp("agent-runs",subcommandOriginal),printHelp(traceSubcommand),0):(telemetry2.trackCliSubcommandTrace(subcommandOriginal),await trace(client));case"projects":return needHelp?(telemetry2.trackCliFlagHelp("agent-runs",subcommandOriginal),printHelp(projectsSubcommand),0):(telemetry2.trackCliSubcommandProjects(subcommandOriginal),await projects(client));default:return output_manager_default.error(`Unknown subcommand: ${subcommandOriginal}`),output_manager_default.print(help(agentRunsCommand,{columns:client.stderr.columns})),2}}var ActivityTelemetryClient=class extends TelemetryClient{trackCliSubcommandLs(v){v&&this.trackCliSubcommand({subcommand:"ls",value:v})}trackCliSubcommandTypes(v){v&&this.trackCliSubcommand({subcommand:"types",value:v})}trackCliOptionType(v){v&&v.length>0&&this.trackCliOption({option:"type",value:v.join(",")})}trackCliOptionSince(v){v&&this.trackCliOption({option:"since",value:this.redactedValue})}trackCliOptionUntil(v){v&&this.trackCliOption({option:"until",value:this.redactedValue})}trackCliFlagAll(v){v&&this.trackCliFlag("all")}trackCliOptionLimit(v){typeof v=="number"&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliOptionNext(v){typeof v=="number"&&this.trackCliOption({option:"next",value:this.redactedValue})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var COMMAND_CONFIG2={types:getCommandAliases(typesSubcommand)};async function activity(client){let telemetry2=new ActivityTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(activityCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),2}let{subcommand,subcommandOriginal}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG2),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("activity",subcommand),output_manager_default.print(help(activityCommand,{columns:client.stderr.columns})),0;function printSubcommandHelp(command2){output_manager_default.print(help(command2,{parent:activityCommand,columns:client.stderr.columns}))}switch(subcommand){case"types":{if(needHelp)return telemetry2.trackCliFlagHelp("activity",subcommandOriginal),printSubcommandHelp(typesSubcommand),0;telemetry2.trackCliSubcommandTypes(subcommandOriginal);let typesFn=(await import("./chunks/types-OC7OTQNK.js")).default;return typesFn(client,telemetry2)}default:{if(needHelp)return telemetry2.trackCliFlagHelp("activity",subcommandOriginal),output_manager_default.print(help(activityCommand,{columns:client.stderr.columns})),0;telemetry2.trackCliSubcommandLs(subcommandOriginal);let listFn=(await import("./chunks/list-HS54LLJ5.js")).default;return listFn(client,telemetry2)}}}var import_chalk6=__toESM(require_source(),1);var DEFAULT_LIST_LIMIT=20,MAX_LIST_LIMIT=100;function parseListLimit(value,{defaultLimit=DEFAULT_LIST_LIMIT,maxLimit=MAX_LIST_LIMIT}={}){if(value===void 0)return defaultLimit;if(!Number.isInteger(value)||value<1||value>maxLimit)throw new Error(`The --limit option must be an integer from 1 to ${maxLimit}.`);return value}var PaginationError=class extends Error{constructor(message){super(message),this.name="PaginationError"}};async function fetchAllPages(fetchPage,{maxPages=1e3}={}){let items=[],seen=new Set,next;for(let pages=0;pages<maxPages;pages++){let page=await fetchPage(next);if(items.push(...page.items),!page.next)return items;if(seen.has(page.next))throw new PaginationError("Pagination returned a cursor it already returned. The list is incomplete.");seen.add(page.next),next=page.next}throw new PaginationError(`Stopped after ${maxPages} pages. The list is incomplete. Use --limit and --next to page through it manually.`)}var CURSOR_FLAGS=new Set(["--next","-N"]);function quoteShellArg(value){return/^[A-Za-z0-9_./@:,=+-]+$/.test(value)?value:`'${value.replace(/'/g,"'\\''")}'`}function getNextPageCommand(argv,next){let args=stripSensitiveAuthArgs(argv.slice(2)),kept=[];for(let i=0;i<args.length;i++){let arg2=args[i],name=normalizeFlagName(arg2);if(CURSOR_FLAGS.has(name)){!arg2.includes("=")&&i+1<args.length&&i++;continue}kept.push(arg2)}return kept.push(`--next=${next}`),`${packageName} ${kept.map(quoteShellArg).join(" ")}`}function printNextPageHint(client,next){next&&output_manager_default.log(`To display the next page, run ${cmd(getNextPageCommand(client.argv,next))}`)}var MAX_PAGE_SIZE=100,MAX_SEARCH_LENGTH=256;async function listApiKeysPage(client,opts={}){let query=new URLSearchParams({purpose:"ai-gateway"});opts.limit!==void 0&&query.set("limit",String(opts.limit)),opts.next&&query.set("until",opts.next),opts.search&&query.set("search",opts.search);let{apiKeys:apiKeys2,pagination}=await client.fetch(`/v1/api-keys?${query.toString()}`,{method:"GET"});return{items:apiKeys2??[],next:pagination?.next??null}}async function listAllApiKeys(client,opts={}){return fetchAllPages(next=>listApiKeysPage(client,{...opts,limit:MAX_PAGE_SIZE,next}))}async function getApiKey(client,apiKeyId){let{apiKey}=await client.fetch(`/v1/api-keys/${encodeURIComponent(apiKeyId)}`,{method:"GET"});return apiKey}async function updateApiKeyQuota(client,apiKeyId,input){return client.fetch(`/v1/api-keys/${encodeURIComponent(apiKeyId)}/quota`,{method:"PATCH",body:input})}function describeApiKeyLookupError(identifier,resolved){switch(resolved.error){case"ambiguous":return`Multiple API keys named "${identifier}" (${resolved.count}). Use the key id instead.`;case"incomplete":return`Could not search every API key for "${identifier}": ${resolved.message} Use the key id instead.`;default:return`API key not found: ${identifier}`}}async function findApiKeyByIdOrName(client,identifier){try{let apiKey=await getApiKey(client,identifier);if(apiKey&&apiKey.purpose==="ai-gateway")return{apiKey}}catch{}let search3=identifier.length<=MAX_SEARCH_LENGTH?identifier:void 0,keys;try{keys=await listAllApiKeys(client,{search:search3})}catch(err){if(err instanceof PaginationError)return{error:"incomplete",message:err.message};throw err}let matches=keys.filter(key=>key.name===identifier);return matches.length===1?{apiKey:matches[0]}:matches.length>1?{error:"ambiguous",count:matches.length}:{error:"not_found"}}async function deleteApiKey(client,apiKeyId){await client.fetch(`/v1/api-keys/${encodeURIComponent(apiKeyId)}`,{method:"DELETE"})}async function createApiKey(client,payload){return await client.fetch("/v1/api-keys",{method:"POST",body:{purpose:"ai-gateway",...payload}})}var AiGatewayApiKeysCreateTelemetryClient=class extends TelemetryClient{trackCliOptionName(name){name&&this.trackCliOption({option:"name",value:this.redactedValue})}trackCliOptionBudget(budget2){budget2!==void 0&&this.trackCliOption({option:"budget",value:this.redactedValue})}trackCliOptionLimit(limit){limit!==void 0&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliOptionRefreshPeriod(refreshPeriod){refreshPeriod&&this.trackCliOption({option:"refresh-period",value:refreshPeriod})}trackCliFlagIncludeByok(includeByok){includeByok&&this.trackCliFlag("include-byok")}trackCliOptionAlertThresholds(alertThresholds){alertThresholds&&this.trackCliOption({option:"alert-thresholds",value:alertThresholds})}trackCliOptionExpiration(expiration){expiration&&this.trackCliOption({option:"expiration",value:expiration})}trackCliFlagZdrExempt(zdrExempt){zdrExempt&&this.trackCliFlag("zdr-exempt")}trackCliFlagBypassAllSettings(bypassAllSettings){bypassAllSettings&&this.trackCliFlag("bypass-all-settings")}};var VALID_REFRESH_PERIODS=["daily","weekly","monthly","none"];function isValidRefreshPeriod(period){return VALID_REFRESH_PERIODS.includes(period)}var VALID_ALERT_THRESHOLDS=[50,75,100];function parseAlertThresholds(input){let values=[],tokens=input.split(",").map(token2=>token2.trim()).filter(token2=>token2.length>0);for(let token2 of tokens){let num=Number(token2);if(!Number.isInteger(num)||!VALID_ALERT_THRESHOLDS.includes(num))return{valid:!1,invalid:token2};values.includes(num)||values.push(num)}return{valid:!0,values}}function buildQuota(opts){let effectiveRefresh=opts.refreshPeriod&&opts.refreshPeriod!=="none"?opts.refreshPeriod:void 0,hasAlertThresholds=opts.alertThresholds!==void 0&&opts.alertThresholds.length>0;if(!(opts.budget===void 0&&!effectiveRefresh&&!opts.includeByok&&!hasAlertThresholds))return{...opts.budget!==void 0&&{limitAmount:opts.budget},...effectiveRefresh&&{refreshPeriod:effectiveRefresh},...opts.includeByok&&{includeByokInQuota:!0},...hasAlertThresholds&&{alertThresholds:opts.alertThresholds}}}var EXPIRY_PRESETS=[{label:"7 days",value:"7d"},{label:"30 days",value:"30d"},{label:"60 days",value:"60d"},{label:"90 days",value:"90d"},{label:"1 year",value:"1y"}],DEFAULT_EXPIRY_PRESET="30d",VALID_EXPIRY_VALUES=[...EXPIRY_PRESETS.map(p=>p.value),"none"];function isValidExpiry(value){return VALID_EXPIRY_VALUES.includes(value)}var DAY_MS=864e5;function presetToExpiresAt(value,now=Date.now()){switch(value){case"7d":return now+7*DAY_MS;case"30d":return now+30*DAY_MS;case"60d":return now+60*DAY_MS;case"90d":return now+90*DAY_MS;case"1y":{let date=new Date(now);return date.setFullYear(date.getFullYear()+1),date.getTime()}default:return}}async function create(client,argv){let telemetry2=new AiGatewayApiKeysCreateTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(createSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{flags:opts}=parsedArgs,name=opts["--name"],budgetFlag=opts["--budget"],limitFlag=opts["--limit"],refreshPeriod=opts["--refresh-period"],includeByok=opts["--include-byok"],alertThresholdsInput=opts["--alert-thresholds"],expiration=opts["--expiration"],zdrExempt=opts["--zdr-exempt"],bypassAll=opts["--bypass-all-settings"];if(telemetry2.trackCliOptionName(name),telemetry2.trackCliOptionBudget(budgetFlag),telemetry2.trackCliOptionLimit(limitFlag),telemetry2.trackCliOptionRefreshPeriod(refreshPeriod),telemetry2.trackCliFlagIncludeByok(includeByok),telemetry2.trackCliOptionAlertThresholds(alertThresholdsInput),telemetry2.trackCliOptionExpiration(expiration),telemetry2.trackCliFlagZdrExempt(zdrExempt),telemetry2.trackCliFlagBypassAllSettings(bypassAll),budgetFlag!==void 0&&limitFlag!==void 0){let message="Pass only one of --limit or --budget. (--budget is deprecated; use --limit.)";return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_BUDGET,message,next:[{command:getCommandNamePlain("ai-gateway api-keys create --limit 500")}]},2),output_manager_default.error(message),2}budgetFlag!==void 0&&output_manager_default.warn("`--budget` is deprecated, please use `--limit` instead");let budget2=limitFlag??budgetFlag;if(budget2!==void 0&&budget2<1){let message="Budget must be a positive number in dollars (minimum 1).";return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_BUDGET,message,next:[{command:getCommandNamePlain("ai-gateway api-keys create --limit 500")}]},2),output_manager_default.error(message),2}if(refreshPeriod&&!isValidRefreshPeriod(refreshPeriod)){let message=`Invalid refresh period "${refreshPeriod}". Must be one of: ${VALID_REFRESH_PERIODS.join(", ")}.`;return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_REFRESH_PERIOD,message,next:[{command:getCommandNamePlain("ai-gateway api-keys create --refresh-period monthly")}]},2),output_manager_default.error(message),2}let alertThresholds;if(alertThresholdsInput!==void 0){let result=parseAlertThresholds(alertThresholdsInput);if(!result.valid){let message=`Invalid alert threshold "${result.invalid}". Must be a comma-separated subset of: ${VALID_ALERT_THRESHOLDS.join(", ")}.`;return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ALERT_THRESHOLDS,message,next:[{command:getCommandNamePlain("ai-gateway api-keys create --alert-thresholds 50,75,100")}]},2),output_manager_default.error(message),2}alertThresholds=result.values}if(expiration!==void 0&&!isValidExpiry(expiration)){let message=`Invalid expiration "${expiration}". Must be one of: ${VALID_EXPIRY_VALUES.join(", ")}.`;return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_EXPIRATION,message,next:[{command:getCommandNamePlain("ai-gateway api-keys create --expiration 90d")}]},2),output_manager_default.error(message),2}let expiresAt=expiration!==void 0?presetToExpiresAt(expiration):void 0,aiGatewayQuota=buildQuota({budget:budget2,refreshPeriod,includeByok,alertThresholds});if(!client.config.currentTeam){if(!client.stdin.isTTY)return output_manager_default.error("No team selected. Use `vercel --scope <team-slug> ai-gateway api-keys create` or run `vercel switch` first."),1;let org=await selectOrg(client,"Which team should own this API key?");org.type==="team"&&(client.config.currentTeam=org.id)}let createStamp=stamp_default();output_manager_default.spinner("Creating API key");let metadata={...zdrExempt&&{zdr:{enableNonZdrModels:!0}},...bypassAll&&{bypassAll:!0}};try{let result=await createApiKey(client,{name,aiGatewayQuota,...expiresAt!==void 0&&{expiresAt},...Object.keys(metadata).length>0&&{metadata}});return output_manager_default.stopSpinner(),client.stdout.write(`${result.apiKeyString}
|
|
58
|
+
`),output_manager_default.log(`Run ${cmd("vercel agent-runs list --project <name>")} to list its Agent Runs.`),0}var COMMAND_CONFIG={list:getCommandAliases(listSubcommand),inspect:getCommandAliases(inspectSubcommand),trace:getCommandAliases(traceSubcommand),projects:getCommandAliases(projectsSubcommand)};async function agentRuns(client){let telemetry2=new AgentRunsTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(agentRunsCommand.options),parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(error){return printError(error),2}let subArgs=parsedArgs.args.slice(1),{subcommand,subcommandOriginal}=getSubcommand7(subArgs,COMMAND_CONFIG),needHelp=parsedArgs.flags["--help"];function printHelp(command2){output_manager_default.print(help(command2,{parent:agentRunsCommand,columns:client.stderr.columns}))}if(!subcommand){let unknown=subArgs.find(arg2=>!arg2.startsWith("-"));return unknown?(output_manager_default.error(`Unknown subcommand: ${unknown}`),output_manager_default.print(help(agentRunsCommand,{columns:client.stderr.columns})),2):(needHelp&&telemetry2.trackCliFlagHelp("agent-runs"),output_manager_default.print(help(agentRunsCommand,{columns:client.stderr.columns})),0)}switch(subcommand){case"list":return needHelp?(telemetry2.trackCliFlagHelp("agent-runs",subcommandOriginal),printHelp(listSubcommand),0):(telemetry2.trackCliSubcommandList(subcommandOriginal),await list2(client));case"inspect":return needHelp?(telemetry2.trackCliFlagHelp("agent-runs",subcommandOriginal),printHelp(inspectSubcommand),0):(telemetry2.trackCliSubcommandInspect(subcommandOriginal),await inspect(client));case"trace":return needHelp?(telemetry2.trackCliFlagHelp("agent-runs",subcommandOriginal),printHelp(traceSubcommand),0):(telemetry2.trackCliSubcommandTrace(subcommandOriginal),await trace(client));case"projects":return needHelp?(telemetry2.trackCliFlagHelp("agent-runs",subcommandOriginal),printHelp(projectsSubcommand),0):(telemetry2.trackCliSubcommandProjects(subcommandOriginal),await projects(client));default:return output_manager_default.error(`Unknown subcommand: ${subcommandOriginal}`),output_manager_default.print(help(agentRunsCommand,{columns:client.stderr.columns})),2}}var ActivityTelemetryClient=class extends TelemetryClient{trackCliSubcommandLs(v){v&&this.trackCliSubcommand({subcommand:"ls",value:v})}trackCliSubcommandTypes(v){v&&this.trackCliSubcommand({subcommand:"types",value:v})}trackCliOptionType(v){v&&v.length>0&&this.trackCliOption({option:"type",value:v.join(",")})}trackCliOptionSince(v){v&&this.trackCliOption({option:"since",value:this.redactedValue})}trackCliOptionUntil(v){v&&this.trackCliOption({option:"until",value:this.redactedValue})}trackCliFlagAll(v){v&&this.trackCliFlag("all")}trackCliOptionLimit(v){typeof v=="number"&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliOptionNext(v){typeof v=="number"&&this.trackCliOption({option:"next",value:this.redactedValue})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var COMMAND_CONFIG2={types:getCommandAliases(typesSubcommand)};async function activity(client){let telemetry2=new ActivityTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(activityCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),2}let{subcommand,subcommandOriginal}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG2),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("activity",subcommand),output_manager_default.print(help(activityCommand,{columns:client.stderr.columns})),0;function printSubcommandHelp(command2){output_manager_default.print(help(command2,{parent:activityCommand,columns:client.stderr.columns}))}switch(subcommand){case"types":{if(needHelp)return telemetry2.trackCliFlagHelp("activity",subcommandOriginal),printSubcommandHelp(typesSubcommand),0;telemetry2.trackCliSubcommandTypes(subcommandOriginal);let typesFn=(await import("./chunks/types-4C5N66YA.js")).default;return typesFn(client,telemetry2)}default:{if(needHelp)return telemetry2.trackCliFlagHelp("activity",subcommandOriginal),output_manager_default.print(help(activityCommand,{columns:client.stderr.columns})),0;telemetry2.trackCliSubcommandLs(subcommandOriginal);let listFn=(await import("./chunks/list-OYT6T3TA.js")).default;return listFn(client,telemetry2)}}}var import_chalk6=__toESM(require_source(),1);var DEFAULT_LIST_LIMIT=20,MAX_LIST_LIMIT=100;function parseListLimit(value,{defaultLimit=DEFAULT_LIST_LIMIT,maxLimit=MAX_LIST_LIMIT}={}){if(value===void 0)return defaultLimit;if(!Number.isInteger(value)||value<1||value>maxLimit)throw new Error(`The --limit option must be an integer from 1 to ${maxLimit}.`);return value}var PaginationError=class extends Error{constructor(message){super(message),this.name="PaginationError"}};async function fetchAllPages(fetchPage,{maxPages=1e3}={}){let items=[],seen=new Set,next;for(let pages=0;pages<maxPages;pages++){let page=await fetchPage(next);if(items.push(...page.items),!page.next)return items;if(seen.has(page.next))throw new PaginationError("Pagination returned a cursor it already returned. The list is incomplete.");seen.add(page.next),next=page.next}throw new PaginationError(`Stopped after ${maxPages} pages. The list is incomplete. Use --limit and --next to page through it manually.`)}var CURSOR_FLAGS=new Set(["--next","-N"]);function quoteShellArg(value){return/^[A-Za-z0-9_./@:,=+-]+$/.test(value)?value:`'${value.replace(/'/g,"'\\''")}'`}function getNextPageCommand(argv,next){let args=stripSensitiveAuthArgs(argv.slice(2)),kept=[];for(let i=0;i<args.length;i++){let arg2=args[i],name=normalizeFlagName(arg2);if(CURSOR_FLAGS.has(name)){!arg2.includes("=")&&i+1<args.length&&i++;continue}kept.push(arg2)}return kept.push(`--next=${next}`),`${packageName} ${kept.map(quoteShellArg).join(" ")}`}function printNextPageHint(client,next){next&&output_manager_default.log(`To display the next page, run ${cmd(getNextPageCommand(client.argv,next))}`)}var MAX_PAGE_SIZE=100,MAX_SEARCH_LENGTH=256;async function listApiKeysPage(client,opts={}){let query=new URLSearchParams({purpose:"ai-gateway"});opts.limit!==void 0&&query.set("limit",String(opts.limit)),opts.next&&query.set("until",opts.next),opts.search&&query.set("search",opts.search);let{apiKeys:apiKeys2,pagination}=await client.fetch(`/v1/api-keys?${query.toString()}`,{method:"GET"});return{items:apiKeys2??[],next:pagination?.next??null}}async function listAllApiKeys(client,opts={}){return fetchAllPages(next=>listApiKeysPage(client,{...opts,limit:MAX_PAGE_SIZE,next}))}async function getApiKey(client,apiKeyId){let{apiKey}=await client.fetch(`/v1/api-keys/${encodeURIComponent(apiKeyId)}`,{method:"GET"});return apiKey}async function updateApiKeyQuota(client,apiKeyId,input){return client.fetch(`/v1/api-keys/${encodeURIComponent(apiKeyId)}/quota`,{method:"PATCH",body:input})}function describeApiKeyLookupError(identifier,resolved){switch(resolved.error){case"ambiguous":return`Multiple API keys named "${identifier}" (${resolved.count}). Use the key id instead.`;case"incomplete":return`Could not search every API key for "${identifier}": ${resolved.message} Use the key id instead.`;default:return`API key not found: ${identifier}`}}async function findApiKeyByIdOrName(client,identifier){try{let apiKey=await getApiKey(client,identifier);if(apiKey&&apiKey.purpose==="ai-gateway")return{apiKey}}catch{}let search3=identifier.length<=MAX_SEARCH_LENGTH?identifier:void 0,keys;try{keys=await listAllApiKeys(client,{search:search3})}catch(err){if(err instanceof PaginationError)return{error:"incomplete",message:err.message};throw err}let matches=keys.filter(key=>key.name===identifier);return matches.length===1?{apiKey:matches[0]}:matches.length>1?{error:"ambiguous",count:matches.length}:{error:"not_found"}}async function deleteApiKey(client,apiKeyId){await client.fetch(`/v1/api-keys/${encodeURIComponent(apiKeyId)}`,{method:"DELETE"})}async function createApiKey(client,payload){return await client.fetch("/v1/api-keys",{method:"POST",body:{purpose:"ai-gateway",...payload}})}var AiGatewayApiKeysCreateTelemetryClient=class extends TelemetryClient{trackCliOptionName(name){name&&this.trackCliOption({option:"name",value:this.redactedValue})}trackCliOptionBudget(budget2){budget2!==void 0&&this.trackCliOption({option:"budget",value:this.redactedValue})}trackCliOptionLimit(limit){limit!==void 0&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliOptionRefreshPeriod(refreshPeriod){refreshPeriod&&this.trackCliOption({option:"refresh-period",value:refreshPeriod})}trackCliFlagIncludeByok(includeByok){includeByok&&this.trackCliFlag("include-byok")}trackCliOptionAlertThresholds(alertThresholds){alertThresholds&&this.trackCliOption({option:"alert-thresholds",value:alertThresholds})}trackCliOptionExpiration(expiration){expiration&&this.trackCliOption({option:"expiration",value:expiration})}trackCliFlagZdrExempt(zdrExempt){zdrExempt&&this.trackCliFlag("zdr-exempt")}trackCliFlagBypassAllSettings(bypassAllSettings){bypassAllSettings&&this.trackCliFlag("bypass-all-settings")}};var VALID_REFRESH_PERIODS=["daily","weekly","monthly","none"];function isValidRefreshPeriod(period){return VALID_REFRESH_PERIODS.includes(period)}var VALID_ALERT_THRESHOLDS=[50,75,100];function parseAlertThresholds(input){let values=[],tokens=input.split(",").map(token2=>token2.trim()).filter(token2=>token2.length>0);for(let token2 of tokens){let num=Number(token2);if(!Number.isInteger(num)||!VALID_ALERT_THRESHOLDS.includes(num))return{valid:!1,invalid:token2};values.includes(num)||values.push(num)}return{valid:!0,values}}function buildQuota(opts){let effectiveRefresh=opts.refreshPeriod&&opts.refreshPeriod!=="none"?opts.refreshPeriod:void 0,hasAlertThresholds=opts.alertThresholds!==void 0&&opts.alertThresholds.length>0;if(!(opts.budget===void 0&&!effectiveRefresh&&!opts.includeByok&&!hasAlertThresholds))return{...opts.budget!==void 0&&{limitAmount:opts.budget},...effectiveRefresh&&{refreshPeriod:effectiveRefresh},...opts.includeByok&&{includeByokInQuota:!0},...hasAlertThresholds&&{alertThresholds:opts.alertThresholds}}}var EXPIRY_PRESETS=[{label:"7 days",value:"7d"},{label:"30 days",value:"30d"},{label:"60 days",value:"60d"},{label:"90 days",value:"90d"},{label:"1 year",value:"1y"}],DEFAULT_EXPIRY_PRESET="30d",VALID_EXPIRY_VALUES=[...EXPIRY_PRESETS.map(p=>p.value),"none"];function isValidExpiry(value){return VALID_EXPIRY_VALUES.includes(value)}var DAY_MS=864e5;function presetToExpiresAt(value,now=Date.now()){switch(value){case"7d":return now+7*DAY_MS;case"30d":return now+30*DAY_MS;case"60d":return now+60*DAY_MS;case"90d":return now+90*DAY_MS;case"1y":{let date=new Date(now);return date.setFullYear(date.getFullYear()+1),date.getTime()}default:return}}async function create(client,argv){let telemetry2=new AiGatewayApiKeysCreateTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(createSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{flags:opts}=parsedArgs,name=opts["--name"],budgetFlag=opts["--budget"],limitFlag=opts["--limit"],refreshPeriod=opts["--refresh-period"],includeByok=opts["--include-byok"],alertThresholdsInput=opts["--alert-thresholds"],expiration=opts["--expiration"],zdrExempt=opts["--zdr-exempt"],bypassAll=opts["--bypass-all-settings"];if(telemetry2.trackCliOptionName(name),telemetry2.trackCliOptionBudget(budgetFlag),telemetry2.trackCliOptionLimit(limitFlag),telemetry2.trackCliOptionRefreshPeriod(refreshPeriod),telemetry2.trackCliFlagIncludeByok(includeByok),telemetry2.trackCliOptionAlertThresholds(alertThresholdsInput),telemetry2.trackCliOptionExpiration(expiration),telemetry2.trackCliFlagZdrExempt(zdrExempt),telemetry2.trackCliFlagBypassAllSettings(bypassAll),budgetFlag!==void 0&&limitFlag!==void 0){let message="Pass only one of --limit or --budget. (--budget is deprecated; use --limit.)";return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_BUDGET,message,next:[{command:getCommandNamePlain("ai-gateway api-keys create --limit 500")}]},2),output_manager_default.error(message),2}budgetFlag!==void 0&&output_manager_default.warn("`--budget` is deprecated, please use `--limit` instead");let budget2=limitFlag??budgetFlag;if(budget2!==void 0&&budget2<1){let message="Budget must be a positive number in dollars (minimum 1).";return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_BUDGET,message,next:[{command:getCommandNamePlain("ai-gateway api-keys create --limit 500")}]},2),output_manager_default.error(message),2}if(refreshPeriod&&!isValidRefreshPeriod(refreshPeriod)){let message=`Invalid refresh period "${refreshPeriod}". Must be one of: ${VALID_REFRESH_PERIODS.join(", ")}.`;return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_REFRESH_PERIOD,message,next:[{command:getCommandNamePlain("ai-gateway api-keys create --refresh-period monthly")}]},2),output_manager_default.error(message),2}let alertThresholds;if(alertThresholdsInput!==void 0){let result=parseAlertThresholds(alertThresholdsInput);if(!result.valid){let message=`Invalid alert threshold "${result.invalid}". Must be a comma-separated subset of: ${VALID_ALERT_THRESHOLDS.join(", ")}.`;return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ALERT_THRESHOLDS,message,next:[{command:getCommandNamePlain("ai-gateway api-keys create --alert-thresholds 50,75,100")}]},2),output_manager_default.error(message),2}alertThresholds=result.values}if(expiration!==void 0&&!isValidExpiry(expiration)){let message=`Invalid expiration "${expiration}". Must be one of: ${VALID_EXPIRY_VALUES.join(", ")}.`;return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_EXPIRATION,message,next:[{command:getCommandNamePlain("ai-gateway api-keys create --expiration 90d")}]},2),output_manager_default.error(message),2}let expiresAt=expiration!==void 0?presetToExpiresAt(expiration):void 0,aiGatewayQuota=buildQuota({budget:budget2,refreshPeriod,includeByok,alertThresholds});if(!client.config.currentTeam){if(!client.stdin.isTTY)return output_manager_default.error("No team selected. Use `vercel --scope <team-slug> ai-gateway api-keys create` or run `vercel switch` first."),1;let org=await selectOrg(client,"Which team should own this API key?");org.type==="team"&&(client.config.currentTeam=org.id)}let createStamp=stamp_default();output_manager_default.spinner("Creating API key");let metadata={...zdrExempt&&{zdr:{enableNonZdrModels:!0}},...bypassAll&&{bypassAll:!0}};try{let result=await createApiKey(client,{name,aiGatewayQuota,...expiresAt!==void 0&&{expiresAt},...Object.keys(metadata).length>0&&{metadata}});return output_manager_default.stopSpinner(),client.stdout.write(`${result.apiKeyString}
|
|
59
59
|
`),output_manager_default.success(`API key ${import_chalk6.default.bold(result.apiKey.name)} (${result.apiKey.id}) created ${createStamp()}`),output_manager_default.log(budget2!==void 0?`Spend on this key also counts toward any user and team budgets. List them with ${getCommandName("ai-gateway budgets list")}.`:`No key budget set. Spend still counts toward any API key default, user, and team budgets. List them with ${getCommandName("ai-gateway budgets list")}.`),0}catch(err){if(output_manager_default.stopSpinner(),isAPIError(err))return output_manager_default.error(err.message),1;throw err}}var import_chalk7=__toESM(require_source(),1);async function ensureTeam(client){if(client.config.currentTeam)return!0;if(client.nonInteractive||client.isAgent||!client.stdin.isTTY)return output_manager_default.error("No team selected. Use `vercel --scope <team-slug> ai-gateway \u2026` or run `vercel switch` first."),!1;let org=await selectOrg(client,"Which team?");return org.type==="team"?(client.config.currentTeam=org.id,!0):(output_manager_default.error("AI Gateway resources are managed per team. Switch to a team scope and try again."),!1)}var AiGatewayApiKeysListTelemetryClient=class extends TelemetryClient{trackCliOptionLimit(limit){limit!==void 0&&this.trackCliOption({option:"limit",value:String(limit)})}trackCliOptionNext(next){next&&this.trackCliOption({option:"next",value:this.redactedValue})}trackCliOptionFormat(format3){format3&&this.trackCliOption({option:"format",value:format3})}};async function renderResource(client,{asJson,spinnerText,fetch:fetch3,toJSON,isEmpty,emptyMessage,header,renderTable:renderTable2,notFoundMessage,next}){let lsStamp=stamp_default(),json=asJson||client.nonInteractive;client.nonInteractive||output_manager_default.spinner(spinnerText);let data;try{data=await fetch3()}catch(err){if(output_manager_default.stopSpinner(),isAPIError(err))return output_manager_default.error(err.status===404&¬FoundMessage?notFoundMessage:err.message),1;throw err}return output_manager_default.stopSpinner(),json?(client.stdout.write(`${JSON.stringify(toJSON(data),null,2)}
|
|
60
60
|
`),0):isEmpty(data)?(output_manager_default.log(emptyMessage),0):(output_manager_default.log(`${header(data)} ${lsStamp()}`),client.stdout.write(renderTable2(data)),next&&printNextPageHint(client,next(data)),0)}var BUDGET_SCOPE_TYPES=["team","project","user","api-key"];function parseBudgetScope(args,opts={}){let[scopeArg,...rest]=args;if(!scopeArg)return{error:`Expected a scope. Specify ${BUDGET_SCOPE_TYPES.join(" or ")}.`};if(!BUDGET_SCOPE_TYPES.includes(scopeArg))return{error:`Unknown scope "${scopeArg}". Expected one of: ${BUDGET_SCOPE_TYPES.join(", ")}.`};if(scopeArg==="team")return opts.isDefault?{error:"The team scope does not support --default. Set the team budget directly."}:rest.length>0?{error:`The team scope does not take a name (got "${rest[0]}").`}:{scope:{scopeType:"team"}};let[name,...extra]=rest;if(opts.isDefault)return name?{error:`The ${scopeArg} scope takes either a name or --default, not both.`}:{scope:{scopeType:scopeArg,isDefault:!0}};if(!name){let required={project:"a project name or id",user:"a user email, username, or id","api-key":"an API key name or id"}[scopeArg];return{error:`The ${scopeArg} scope requires ${required}. Pass --default for the per-${scopeArg} default budget.`}}return extra.length>0?{error:`Unexpected argument "${extra[0]}".`}:{scope:{scopeType:scopeArg,name}}}var PERIOD_PHRASE={daily:"a day",weekly:"a week",monthly:"a month",none:"total"};function formatBudgetCap(limitAmount,refreshPeriod){return`$${limitAmount} ${PERIOD_PHRASE[refreshPeriod]}`}async function listBudgets(client,scopeType){let query=scopeType?`?scopeType=${scopeType}`:"",{budgets:budgets2}=await client.fetch(`/ai-gateway/budgets/list${query}`,{method:"GET"});return budgets2??[]}async function setBudget(client,input){return client.fetch("/ai-gateway/budgets",{method:"PUT",body:input})}async function removeBudget(client,scopeType,opts={}){let params=new URLSearchParams({scopeType});opts.projectId&¶ms.set("projectId",opts.projectId),opts.userId&¶ms.set("userId",opts.userId),await client.fetch(`/ai-gateway/budgets?${params.toString()}`,{method:"DELETE"})}var BUDGET_DEFAULT_SCOPE_TYPES=["project","api-key","user"],BUDGET_DEFAULT_COVERED={project:"Projects","api-key":"API keys",user:"Team members"},BUDGET_DEFAULT_APPLIES_TO={project:"every project without its own budget","api-key":"every API key without its own budget",user:"every team member without their own budget"};function parseBudgetDefaultScope(args){let[scopeArg,...rest]=args;return scopeArg?BUDGET_DEFAULT_SCOPE_TYPES.includes(scopeArg)?rest.length>0?{error:`Unexpected argument "${rest[0]}".`}:{scopeType:scopeArg}:{error:`Unknown scope "${scopeArg}". Expected one of: ${BUDGET_DEFAULT_SCOPE_TYPES.join(", ")}.`}:{error:`Expected a scope. Specify ${BUDGET_DEFAULT_SCOPE_TYPES.join(" or ")}.`}}async function listScopeBudgetDefaults(client){let{defaults}=await client.fetch("/ai-gateway/budgets/defaults/list",{method:"GET"});return defaults??[]}async function upsertScopeBudgetDefault(client,input){return client.fetch("/ai-gateway/budgets/defaults",{method:"PUT",body:input})}async function deleteScopeBudgetDefault(client,scopeType){let params=new URLSearchParams({scopeType});await client.fetch(`/ai-gateway/budgets/defaults?${params.toString()}`,{method:"DELETE"})}async function list3(client,argv){let telemetry2=new AiGatewayApiKeysListTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(listSubcommand2.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{flags:opts}=parsedArgs,limitFlag=opts["--limit"],next=opts["--next"];telemetry2.trackCliOptionLimit(limitFlag),telemetry2.trackCliOptionNext(next),telemetry2.trackCliOptionFormat(opts["--format"]);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let limit;try{limit=parseListLimit(limitFlag)}catch(err){return output_manager_default.error(err.message),1}if(!await ensureTeam(client))return 1;let keyDefault;if(!formatResult.jsonOutput)try{keyDefault=(await listScopeBudgetDefaults(client)).find(d=>d.scopeType==="api-key"&&d.active!==!1)}catch{}return renderResource(client,{asJson:formatResult.jsonOutput,spinnerText:"Fetching API keys",fetch:()=>listApiKeysPage(client,{limit,next}),toJSON:page=>({apiKeys:page.items,pagination:{next:page.next}}),isEmpty:page=>page.items.length===0,emptyMessage:next?"No more API keys.":`No API keys found. Create one with ${getCommandName("ai-gateway api-keys create")}.`,header:()=>"API keys",renderTable:page=>printApiKeysTable(page.items,keyDefault),next:page=>page.next})}function printApiKeysTable(apiKeys2,keyDefault){return`${table([["id","name","key","budget","spend","refresh","created"].map(header=>import_chalk7.default.gray(header)),...apiKeys2.map(apiKey=>[apiKey.id,apiKey.name||import_chalk7.default.gray("\u2013"),apiKey.partialKey?`\u2026${apiKey.partialKey}`:import_chalk7.default.gray("\u2013"),apiKey.quota?`$${apiKey.quota.limitAmount}`:keyDefault?`$${keyDefault.limitAmount} ${import_chalk7.default.gray("(default)")}`:import_chalk7.default.gray("\u2013"),apiKey.quota?`$${apiKey.quota.currentSpend}`:import_chalk7.default.gray("\u2013"),apiKey.quota?.refreshPeriod??keyDefault?.refreshPeriod??import_chalk7.default.gray("\u2013"),apiKey.createdAt?new Date(apiKey.createdAt).toLocaleDateString():import_chalk7.default.gray("\u2013")])],{align:["l","l","l","l","l","l","l"],hsep:4}).replace(/^/gm," ")}
|
|
61
61
|
|
|
@@ -171,7 +171,7 @@ ${sections.join(`
|
|
|
171
171
|
`;return flags["--out"]!==void 0?writeToFile(client,flags["--out"],content,config.label):(client.stdout.write(content),0)}return renderTimeseriesTable(client,data,{metric:resolvedMetric,modality:resolvedModality,date:flags["--date"],entityLabel:config.entityLabel,label:config.label})}function renderTimeseriesTable(client,data,options){let rows=data.rows??[];if(options.date!==void 0&&!rows.some(r=>r.date===options.date)){let dates=availableDates(rows);return output_manager_default.error(`No data for ${options.date}.${dates.length?` Available dates: ${dates.slice(0,5).join(", ")}${dates.length>5?", \u2026":""}`:""}`),1}let filtered=filterTimeseries(rows,{metric:options.metric,date:options.date});if(filtered.length===0)return output_manager_default.log(`No ${options.label} data for ${options.metric}.`),0;let day=options.date??latestDate(rows);return output_manager_default.log(`${options.label} \xB7 ${import_chalk31.default.bold(options.metric)} \xB7 ${options.modality} \xB7 ${day}`),client.stdout.write(`${table([["#",options.entityLabel,"share"].map(header=>import_chalk31.default.gray(header)),...filtered.map((row,index)=>[String(index+1),row.name,`${row.share_percent.toFixed(2)}%`])],{align:["r","l","r"],hsep:3}).replace(/^/gm," ")}
|
|
172
172
|
`),printLicense(),0}async function runRankedLeaderboard(client,flags,telemetry2,config){telemetry2.trackCliOptionFormat(flags["--format"]),telemetry2.trackCliOptionOut(flags["--out"]);let formatResult=resolveFormat(client,flags);if("error"in formatResult)return output_manager_default.error(formatResult.error),1;let{format:format3}=formatResult;if(format3==="csv"){let result2=await fetchWithSpinner(()=>fetchLeaderboardCsv(client,{dataset:config.dataset}),`Fetching ${config.label}`);return"exitCode"in result2?result2.exitCode:flags["--out"]!==void 0?writeToFile(client,flags["--out"],result2.data,config.label):(client.stdout.write(result2.data),0)}let result=await fetchWithSpinner(()=>fetchLeaderboard(client,{dataset:config.dataset}),`Fetching ${config.label}`);if("exitCode"in result)return result.exitCode;let data=result.data;if(format3==="json"){let content=`${JSON.stringify(data,null,2)}
|
|
173
173
|
`;return flags["--out"]!==void 0?writeToFile(client,flags["--out"],content,config.label):(client.stdout.write(content),0)}return renderRankedTable(client,data,config.label)}function renderRankedTable(client,data,label){let rows=data.rows??[];if(rows.length===0)return output_manager_default.log(`No ${label} data.`),0;let lsStamp=stamp_default(),rankedBy=rows[0]?.ranked_by;return output_manager_default.log(`${label}${rankedBy?` \xB7 ${import_chalk31.default.bold(rankedBy)}`:""} ${lsStamp()}`),client.stdout.write(`${table([["#","name","description"].map(header=>import_chalk31.default.gray(header)),...rows.map(row=>[String(row.rank),row.name,row.description?row.description:dash2()])],{align:["r","l","l"],hsep:3}).replace(/^/gm," ")}
|
|
174
|
-
`),printLicense(),0}function printLicense(){output_manager_default.log(import_chalk31.default.gray("Source: AI Gateway Leaderboard data, licensed under CC BY 4.0."))}async function runLeaderboardSubcommand(client,argv,subcommand,variant){let parsedArgs,flagsSpecification=getFlagsSpecification(subcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let flags=parsedArgs.flags;return variant.kind==="timeseries"?runTimeseriesLeaderboard(client,flags,variant.telemetry,{dataset:variant.dataset,entityLabel:variant.entityLabel,label:variant.label}):runRankedLeaderboard(client,flags,variant.telemetry,{dataset:variant.dataset,label:variant.label})}var AiGatewayLeaderboardModelsTelemetryClient=class extends TelemetryClient{trackCliOptionModality(value){value&&this.trackCliOption({option:"modality",value})}trackCliOptionMetric(value){value&&this.trackCliOption({option:"metric",value})}trackCliOptionDate(value){value&&this.trackCliOption({option:"date",value})}trackCliOptionFormat(value){value&&this.trackCliOption({option:"format",value})}trackCliOptionOut(value){value&&this.trackCliOption({option:"out",value:this.redactedValue})}};async function models2(client,argv){return runLeaderboardSubcommand(client,argv,leaderboardModelsSubcommand,{kind:"timeseries",telemetry:new AiGatewayLeaderboardModelsTelemetryClient({opts:{store:client.telemetryEventStore}}),dataset:"models",entityLabel:"model",label:"Top models"})}var AiGatewayLeaderboardLabsTelemetryClient=class extends TelemetryClient{trackCliOptionModality(value){value&&this.trackCliOption({option:"modality",value})}trackCliOptionMetric(value){value&&this.trackCliOption({option:"metric",value})}trackCliOptionDate(value){value&&this.trackCliOption({option:"date",value})}trackCliOptionFormat(value){value&&this.trackCliOption({option:"format",value})}trackCliOptionOut(value){value&&this.trackCliOption({option:"out",value:this.redactedValue})}};async function labs(client,argv){return runLeaderboardSubcommand(client,argv,leaderboardLabsSubcommand,{kind:"timeseries",telemetry:new AiGatewayLeaderboardLabsTelemetryClient({opts:{store:client.telemetryEventStore}}),dataset:"labs",entityLabel:"lab",label:"Top labs"})}var AiGatewayLeaderboardAppsTelemetryClient=class extends TelemetryClient{trackCliOptionFormat(value){value&&this.trackCliOption({option:"format",value})}trackCliOptionOut(value){value&&this.trackCliOption({option:"out",value:this.redactedValue})}};async function apps(client,argv){return runLeaderboardSubcommand(client,argv,leaderboardAppsSubcommand,{kind:"ranked",telemetry:new AiGatewayLeaderboardAppsTelemetryClient({opts:{store:client.telemetryEventStore}}),dataset:"apps",label:"Top apps"})}var AiGatewayLeaderboardProvidersTelemetryClient=class extends TelemetryClient{trackCliOptionFormat(value){value&&this.trackCliOption({option:"format",value})}trackCliOptionOut(value){value&&this.trackCliOption({option:"out",value:this.redactedValue})}};async function providers(client,argv){return runLeaderboardSubcommand(client,argv,leaderboardProvidersSubcommand,{kind:"ranked",telemetry:new AiGatewayLeaderboardProvidersTelemetryClient({opts:{store:client.telemetryEventStore}}),dataset:"providers",label:"Top providers"})}var AiGatewayLeaderboardTelemetryClient=class extends TelemetryClient{trackCliSubcommandModels(actual){this.trackCliSubcommand({subcommand:"models",value:actual})}trackCliSubcommandLabs(actual){this.trackCliSubcommand({subcommand:"labs",value:actual})}trackCliSubcommandApps(actual){this.trackCliSubcommand({subcommand:"apps",value:actual})}trackCliSubcommandProviders(actual){this.trackCliSubcommand({subcommand:"providers",value:actual})}};var COMMAND_CONFIG10={models:getCommandAliases(leaderboardModelsSubcommand),labs:getCommandAliases(leaderboardLabsSubcommand),apps:getCommandAliases(leaderboardAppsSubcommand),providers:getCommandAliases(leaderboardProvidersSubcommand)};async function leaderboard(client){let telemetry2=new AiGatewayLeaderboardTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(leaderboardSubcommand.options),parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),2}let subArgs=parsedArgs.args.slice(2),{subcommand,args,subcommandOriginal}=getSubcommand7(subArgs,COMMAND_CONFIG10),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("ai-gateway leaderboard",subcommandOriginal),output_manager_default.print(help(leaderboardSubcommand,{columns:client.stderr.columns})),0;function printHelp(command2){output_manager_default.print(help(command2,{parent:leaderboardSubcommand,columns:client.stderr.columns}))}switch(subcommand){case"models":return needHelp?(telemetry2.trackCliFlagHelp("ai-gateway leaderboard",subcommandOriginal),printHelp(leaderboardModelsSubcommand),0):(telemetry2.trackCliSubcommandModels(subcommandOriginal),models2(client,args));case"labs":return needHelp?(telemetry2.trackCliFlagHelp("ai-gateway leaderboard",subcommandOriginal),printHelp(leaderboardLabsSubcommand),0):(telemetry2.trackCliSubcommandLabs(subcommandOriginal),labs(client,args));case"apps":return needHelp?(telemetry2.trackCliFlagHelp("ai-gateway leaderboard",subcommandOriginal),printHelp(leaderboardAppsSubcommand),0):(telemetry2.trackCliSubcommandApps(subcommandOriginal),apps(client,args));case"providers":return needHelp?(telemetry2.trackCliFlagHelp("ai-gateway leaderboard",subcommandOriginal),printHelp(leaderboardProvidersSubcommand),0):(telemetry2.trackCliSubcommandProviders(subcommandOriginal),providers(client,args));default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG10)),output_manager_default.print(help(leaderboardSubcommand,{columns:client.stderr.columns})),2}}var AiGatewayTelemetryClient=class extends TelemetryClient{trackCliSubcommandApiKeys(actual){this.trackCliSubcommand({subcommand:"api-keys",value:actual})}trackCliSubcommandBudgets(actual){this.trackCliSubcommand({subcommand:"budgets",value:actual})}trackCliSubcommandRules(actual){this.trackCliSubcommand({subcommand:"rules",value:actual})}trackCliSubcommandVirtualModels(actual){this.trackCliSubcommand({subcommand:"virtual-models",value:actual})}trackCliSubcommandCodingAgents(actual){this.trackCliSubcommand({subcommand:"coding-agents",value:actual})}trackCliSubcommandSetup(actual){this.trackCliSubcommand({subcommand:"setup",value:actual})}trackCliSubcommandModels(actual){this.trackCliSubcommand({subcommand:"models",value:actual})}trackCliSubcommandLeaderboard(actual){this.trackCliSubcommand({subcommand:"leaderboard",value:actual})}};var COMMAND_CONFIG11={"api-keys":getCommandAliases(apiKeysSubcommand),budgets:getCommandAliases(budgetsSubcommand),rules:getCommandAliases(rulesSubcommand),"virtual-models":getCommandAliases(virtualModelsSubcommand),"coding-agents":getCommandAliases(codingAgentsSubcommand),setup:getCommandAliases(setupSubcommand),models:getCommandAliases(modelsSubcommand),leaderboard:getCommandAliases(leaderboardSubcommand)};async function main2(client){let parsedArgs,flagsSpecification=getFlagsSpecification(aiGatewayCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(error){return printError(error),2}let telemetry2=new AiGatewayTelemetryClient({opts:{store:client.telemetryEventStore}}),{subcommand,args,subcommandOriginal}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG11),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("ai-gateway"),output_manager_default.print(help(aiGatewayCommand,{columns:client.stderr.columns})),0;switch(subcommand){case"api-keys":return telemetry2.trackCliSubcommandApiKeys(subcommandOriginal),apiKeys(client);case"budgets":return telemetry2.trackCliSubcommandBudgets(subcommandOriginal),budgets(client);case"rules":return telemetry2.trackCliSubcommandRules(subcommandOriginal),rules(client);case"virtual-models":return telemetry2.trackCliSubcommandVirtualModels(subcommandOriginal),virtualModels(client);case"coding-agents":return telemetry2.trackCliSubcommandCodingAgents(subcommandOriginal),codingAgents(client);case"setup":return needHelp?(telemetry2.trackCliFlagHelp("ai-gateway",subcommandOriginal),output_manager_default.print(help(setupSubcommand,{parent:aiGatewayCommand,columns:client.stderr.columns})),0):(telemetry2.trackCliSubcommandSetup(subcommandOriginal),codingAgentsSetup(client,args));case"models":return telemetry2.trackCliSubcommandModels(subcommandOriginal),models(client);case"leaderboard":return telemetry2.trackCliSubcommandLeaderboard(subcommandOriginal),leaderboard(client);default:return needHelp?(telemetry2.trackCliFlagHelp("ai-gateway",subcommandOriginal),output_manager_default.print(help(aiGatewayCommand,{columns:client.stderr.columns})),0):(output_manager_default.error("Please specify a subcommand. Run `vercel ai-gateway --help` for usage information."),2)}}var AlertsTelemetryClient=class extends TelemetryClient{trackCliSubcommandLs(v){v&&this.trackCliSubcommand({subcommand:"ls",value:v})}trackCliSubcommandInspect(actual){this.trackCliSubcommand({subcommand:"inspect",value:actual})}trackCliSubcommandRules(actual){this.trackCliSubcommand({subcommand:"rules",value:actual})}trackCliOptionType(v){v&&v.length>0&&this.trackCliOption({option:"type",value:v.join(",")})}trackCliOptionSince(v){v&&this.trackCliOption({option:"since",value:this.redactedValue})}trackCliOptionUntil(v){v&&this.trackCliOption({option:"until",value:this.redactedValue})}trackCliFlagAll(v){v&&this.trackCliFlag("all")}trackCliFlagAi(v){v&&this.trackCliFlag("ai")}trackCliOptionLimit(v){typeof v=="number"&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var COMMAND_CONFIG12={inspect:getCommandAliases(inspectSubcommand3),ls:getCommandAliases(listSubcommand3),rules:["rules"]};function getFlagSpecValue(flagsSpecification,flag){let value=flagsSpecification[flag];return typeof value=="string"?flagsSpecification[value]:value}function flagConsumesValue(rawArg,flagsSpecification){if(!rawArg.startsWith("-")||rawArg==="-"||rawArg.includes("="))return!1;let value=getFlagSpecValue(flagsSpecification,rawArg);return value===String||value===Number||Array.isArray(value)}function findCommandIndex(rawArgs,commandName,flagsSpecification){if(!commandName)return-1;for(let index=0;index<rawArgs.length;index++){let rawArg=rawArgs[index];if(rawArg==="--")return rawArgs.indexOf(commandName,index+1);if(rawArg.startsWith("-")){flagConsumesValue(rawArg,flagsSpecification)&&index++;continue}if(rawArg===commandName)return index}return-1}function normalizeHelpAlias(rawArgs){return rawArgs.map(arg2=>arg2==="-help"?"--help":arg2)}function getRulesTelemetryAction(args){if(args[0]!=="notifications")return args[0]??"ls";let action=args[1];return!action||action.startsWith("-")?"notifications:ls":action.startsWith("ar_")?"notifications:inspect":action==="ls"||action==="list"?args[2]?.startsWith("ar_")?"notifications:inspect":"notifications:ls":`notifications:${action}`}function getAlertsSubcommand(rawArgs,parsedArgs,flagsSpecification){let commandIndex=findCommandIndex(rawArgs,parsedArgs[0],flagsSpecification),rawArgsAfterCommand=commandIndex===-1?[]:rawArgs.slice(commandIndex+1),rawSubcommand=rawArgsAfterCommand[0];return!rawSubcommand||rawSubcommand.startsWith("-")?{...getSubcommand7([],COMMAND_CONFIG12),rawSubcommandArgs:rawArgsAfterCommand}:{...getSubcommand7(parsedArgs.slice(1),COMMAND_CONFIG12),rawSubcommandArgs:rawArgsAfterCommand.slice(1)}}async function alerts(client){let telemetry2=new AlertsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(alertsCommand.options),rawArgs=normalizeHelpAlias(client.argv.slice(2));try{parsedArgs=parseArguments(rawArgs,flagsSpecification,{permissive:!0})}catch(err){let msg=err instanceof Error?err.message:String(err),projectFlagMissingArg=msg.includes("--project")&&msg.includes("requires argument");return shouldEmitNonInteractiveCommandError(client)&&outputAgentError(client,{status:"error",reason:AGENT_REASON.INVALID_ARGUMENTS,message:projectFlagMissingArg?"`--project` requires a project name or id (for example `--project my-app`).":msg,next:projectFlagMissingArg?[{command:buildCommandWithGlobalFlags(client.argv,"alerts --project <name-or-id>"),when:"Re-run with a project name or id (replace placeholder)"},{command:buildCommandWithGlobalFlags(client.argv,"alerts --help"),when:"See all `alerts` flags and examples"}]:[{command:buildCommandWithGlobalFlags(client.argv,"alerts --help"),when:"See valid flags and examples"}]},2),printError(err),2}let{subcommand,args,subcommandOriginal,rawSubcommandArgs}=getAlertsSubcommand(rawArgs,parsedArgs.args,{...arg_common_default(),...flagsSpecification}),needHelp=parsedArgs.flags["--help"];function printHelp(command2,parent=alertsCommand){output_manager_default.print(help(command2,{parent,columns:client.stderr.columns}))}if(needHelp){if(subcommand==="inspect")return telemetry2.trackCliFlagHelp("alerts","inspect"),printHelp(inspectSubcommand3),0;if(subcommand==="rules"){telemetry2.trackCliFlagHelp("alerts","rules");let nested=args[0];if(nested==="ls"||nested==="list")return printHelp(rulesLsSubcommand,rulesAggregateCommand),0;if(nested==="schema")return printHelp(rulesSchemaSubcommand,rulesAggregateCommand),0;if(nested==="add"||nested==="create")return printHelp(rulesAddSubcommand2,rulesAggregateCommand),0;if(nested==="inspect"||nested==="get")return printHelp(rulesInspectSubcommand,rulesAggregateCommand),0;if(nested==="rm"||nested==="remove"||nested==="delete")return printHelp(rulesRmSubcommand,rulesAggregateCommand),0;if(nested==="update"||nested==="patch")return printHelp(rulesUpdateSubcommand,rulesAggregateCommand),0;if(nested==="notifications"){let notificationAction=args[1];return notificationAction==="ls"||notificationAction==="list"||notificationAction?.startsWith("ar_")?(printHelp(rulesNotificationsLsSubcommand,rulesNotificationsAggregateCommand),0):notificationAction==="link"?(printHelp(rulesNotificationsLinkSubcommand,rulesNotificationsAggregateCommand),0):notificationAction==="update"||notificationAction==="patch"?(printHelp(rulesNotificationsUpdateSubcommand,rulesNotificationsAggregateCommand),0):notificationAction==="unlink"?(printHelp(rulesNotificationsUnlinkSubcommand,rulesNotificationsAggregateCommand),0):(printHelp(rulesNotificationsAggregateCommand,rulesAggregateCommand),0)}return output_manager_default.print(help(rulesAggregateCommand,{parent:alertsCommand,columns:client.stderr.columns})),0}return telemetry2.trackCliFlagHelp("alerts",subcommandOriginal),output_manager_default.print(help(alertsCommand,{columns:client.stderr.columns})),0}switch(subcommand){case"inspect":{telemetry2.trackCliSubcommandInspect(subcommandOriginal);let inspectFn=(await import("./chunks/inspect-HJQWRFHR.js")).default;return inspectFn(client,rawSubcommandArgs)}case"rules":{telemetry2.trackCliSubcommandRules(getRulesTelemetryAction(args));let rulesFn=(await import("./chunks/rules-CM2ARIWZ.js")).default;return rulesFn(client,rawSubcommandArgs)}default:{telemetry2.trackCliSubcommandLs(subcommandOriginal);let listFn=(await import("./chunks/list-OCU47YHP.js")).default;return listFn(client,telemetry2)}}}var import_chalk32=__toESM(require_source(),1),import_ms2=__toESM(require_ms(),1);async function getAliases(client,deploymentId,next,limit=20){let aliasUrl=`/v3/now/aliases?limit=${limit}`;next&&(aliasUrl+=`&until=${next}`);let to=deploymentId?`/now/deployments/${deploymentId}/aliases`:aliasUrl;try{return await client.fetch(to)}catch(err){if(isAPIError(err)){let contextName=await getScope(client).then(scope=>scope.contextName);if(err.status===404)throw new DeploymentNotFound({id:deploymentId,context:contextName});if(err.status===403&&deploymentId)throw new DeploymentPermissionDenied(deploymentId,contextName);if(err.status===400&&err.message.includes("`id`")&&deploymentId)throw new InvalidDeploymentId(deploymentId)}throw err}}var AliasListTelemetryClient=class extends TelemetryClient{trackCliOptionLimit(limit){limit&&this.trackCliOption({option:"limit",value:String(limit)})}trackCliOptionNext(next){next&&this.trackCliOption({option:"next",value:this.redactedValue})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function ls(client,argv){let parsedArguments,flagsSpecification=getFlagsSpecification(listSubcommand4.options);try{parsedArguments=parseArguments(argv,flagsSpecification)}catch(err){return printError(err),2}let{args,flags:opts}=parsedArguments,validationResult=validateLsArgs({commandName:"alias ls",args});if(validationResult!==0)return validationResult;let contextName=await getContextName(client),telemetryClient=new AliasListTelemetryClient({opts:{store:client.telemetryEventStore}}),paginationOptions,formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput;try{paginationOptions=getPaginationOpts(opts);let[next,limit]=paginationOptions;telemetryClient.trackCliOptionNext(next),telemetryClient.trackCliOptionLimit(limit),telemetryClient.trackCliOptionFormat(opts["--format"])}catch(err){return output_manager_default.prettyError(err),1}let lsStamp=stamp_default();output_manager_default.spinner(`Fetching aliases under ${import_chalk32.default.bold(contextName)}`);let{aliases:aliases2,pagination}=await getAliases(client,void 0,...paginationOptions);if(asJson){output_manager_default.stopSpinner();let jsonOutput={aliases:aliases2.map(a=>({alias:a.alias,deploymentId:a.deploymentId,url:a.deployment?.url??null,createdAt:a.createdAt})),pagination};client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
|
|
174
|
+
`),printLicense(),0}function printLicense(){output_manager_default.log(import_chalk31.default.gray("Source: AI Gateway Leaderboard data, licensed under CC BY 4.0."))}async function runLeaderboardSubcommand(client,argv,subcommand,variant){let parsedArgs,flagsSpecification=getFlagsSpecification(subcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let flags=parsedArgs.flags;return variant.kind==="timeseries"?runTimeseriesLeaderboard(client,flags,variant.telemetry,{dataset:variant.dataset,entityLabel:variant.entityLabel,label:variant.label}):runRankedLeaderboard(client,flags,variant.telemetry,{dataset:variant.dataset,label:variant.label})}var AiGatewayLeaderboardModelsTelemetryClient=class extends TelemetryClient{trackCliOptionModality(value){value&&this.trackCliOption({option:"modality",value})}trackCliOptionMetric(value){value&&this.trackCliOption({option:"metric",value})}trackCliOptionDate(value){value&&this.trackCliOption({option:"date",value})}trackCliOptionFormat(value){value&&this.trackCliOption({option:"format",value})}trackCliOptionOut(value){value&&this.trackCliOption({option:"out",value:this.redactedValue})}};async function models2(client,argv){return runLeaderboardSubcommand(client,argv,leaderboardModelsSubcommand,{kind:"timeseries",telemetry:new AiGatewayLeaderboardModelsTelemetryClient({opts:{store:client.telemetryEventStore}}),dataset:"models",entityLabel:"model",label:"Top models"})}var AiGatewayLeaderboardLabsTelemetryClient=class extends TelemetryClient{trackCliOptionModality(value){value&&this.trackCliOption({option:"modality",value})}trackCliOptionMetric(value){value&&this.trackCliOption({option:"metric",value})}trackCliOptionDate(value){value&&this.trackCliOption({option:"date",value})}trackCliOptionFormat(value){value&&this.trackCliOption({option:"format",value})}trackCliOptionOut(value){value&&this.trackCliOption({option:"out",value:this.redactedValue})}};async function labs(client,argv){return runLeaderboardSubcommand(client,argv,leaderboardLabsSubcommand,{kind:"timeseries",telemetry:new AiGatewayLeaderboardLabsTelemetryClient({opts:{store:client.telemetryEventStore}}),dataset:"labs",entityLabel:"lab",label:"Top labs"})}var AiGatewayLeaderboardAppsTelemetryClient=class extends TelemetryClient{trackCliOptionFormat(value){value&&this.trackCliOption({option:"format",value})}trackCliOptionOut(value){value&&this.trackCliOption({option:"out",value:this.redactedValue})}};async function apps(client,argv){return runLeaderboardSubcommand(client,argv,leaderboardAppsSubcommand,{kind:"ranked",telemetry:new AiGatewayLeaderboardAppsTelemetryClient({opts:{store:client.telemetryEventStore}}),dataset:"apps",label:"Top apps"})}var AiGatewayLeaderboardProvidersTelemetryClient=class extends TelemetryClient{trackCliOptionFormat(value){value&&this.trackCliOption({option:"format",value})}trackCliOptionOut(value){value&&this.trackCliOption({option:"out",value:this.redactedValue})}};async function providers(client,argv){return runLeaderboardSubcommand(client,argv,leaderboardProvidersSubcommand,{kind:"ranked",telemetry:new AiGatewayLeaderboardProvidersTelemetryClient({opts:{store:client.telemetryEventStore}}),dataset:"providers",label:"Top providers"})}var AiGatewayLeaderboardTelemetryClient=class extends TelemetryClient{trackCliSubcommandModels(actual){this.trackCliSubcommand({subcommand:"models",value:actual})}trackCliSubcommandLabs(actual){this.trackCliSubcommand({subcommand:"labs",value:actual})}trackCliSubcommandApps(actual){this.trackCliSubcommand({subcommand:"apps",value:actual})}trackCliSubcommandProviders(actual){this.trackCliSubcommand({subcommand:"providers",value:actual})}};var COMMAND_CONFIG10={models:getCommandAliases(leaderboardModelsSubcommand),labs:getCommandAliases(leaderboardLabsSubcommand),apps:getCommandAliases(leaderboardAppsSubcommand),providers:getCommandAliases(leaderboardProvidersSubcommand)};async function leaderboard(client){let telemetry2=new AiGatewayLeaderboardTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(leaderboardSubcommand.options),parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),2}let subArgs=parsedArgs.args.slice(2),{subcommand,args,subcommandOriginal}=getSubcommand7(subArgs,COMMAND_CONFIG10),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("ai-gateway leaderboard",subcommandOriginal),output_manager_default.print(help(leaderboardSubcommand,{columns:client.stderr.columns})),0;function printHelp(command2){output_manager_default.print(help(command2,{parent:leaderboardSubcommand,columns:client.stderr.columns}))}switch(subcommand){case"models":return needHelp?(telemetry2.trackCliFlagHelp("ai-gateway leaderboard",subcommandOriginal),printHelp(leaderboardModelsSubcommand),0):(telemetry2.trackCliSubcommandModels(subcommandOriginal),models2(client,args));case"labs":return needHelp?(telemetry2.trackCliFlagHelp("ai-gateway leaderboard",subcommandOriginal),printHelp(leaderboardLabsSubcommand),0):(telemetry2.trackCliSubcommandLabs(subcommandOriginal),labs(client,args));case"apps":return needHelp?(telemetry2.trackCliFlagHelp("ai-gateway leaderboard",subcommandOriginal),printHelp(leaderboardAppsSubcommand),0):(telemetry2.trackCliSubcommandApps(subcommandOriginal),apps(client,args));case"providers":return needHelp?(telemetry2.trackCliFlagHelp("ai-gateway leaderboard",subcommandOriginal),printHelp(leaderboardProvidersSubcommand),0):(telemetry2.trackCliSubcommandProviders(subcommandOriginal),providers(client,args));default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG10)),output_manager_default.print(help(leaderboardSubcommand,{columns:client.stderr.columns})),2}}var AiGatewayTelemetryClient=class extends TelemetryClient{trackCliSubcommandApiKeys(actual){this.trackCliSubcommand({subcommand:"api-keys",value:actual})}trackCliSubcommandBudgets(actual){this.trackCliSubcommand({subcommand:"budgets",value:actual})}trackCliSubcommandRules(actual){this.trackCliSubcommand({subcommand:"rules",value:actual})}trackCliSubcommandVirtualModels(actual){this.trackCliSubcommand({subcommand:"virtual-models",value:actual})}trackCliSubcommandCodingAgents(actual){this.trackCliSubcommand({subcommand:"coding-agents",value:actual})}trackCliSubcommandSetup(actual){this.trackCliSubcommand({subcommand:"setup",value:actual})}trackCliSubcommandModels(actual){this.trackCliSubcommand({subcommand:"models",value:actual})}trackCliSubcommandLeaderboard(actual){this.trackCliSubcommand({subcommand:"leaderboard",value:actual})}};var COMMAND_CONFIG11={"api-keys":getCommandAliases(apiKeysSubcommand),budgets:getCommandAliases(budgetsSubcommand),rules:getCommandAliases(rulesSubcommand),"virtual-models":getCommandAliases(virtualModelsSubcommand),"coding-agents":getCommandAliases(codingAgentsSubcommand),setup:getCommandAliases(setupSubcommand),models:getCommandAliases(modelsSubcommand),leaderboard:getCommandAliases(leaderboardSubcommand)};async function main2(client){let parsedArgs,flagsSpecification=getFlagsSpecification(aiGatewayCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(error){return printError(error),2}let telemetry2=new AiGatewayTelemetryClient({opts:{store:client.telemetryEventStore}}),{subcommand,args,subcommandOriginal}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG11),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("ai-gateway"),output_manager_default.print(help(aiGatewayCommand,{columns:client.stderr.columns})),0;switch(subcommand){case"api-keys":return telemetry2.trackCliSubcommandApiKeys(subcommandOriginal),apiKeys(client);case"budgets":return telemetry2.trackCliSubcommandBudgets(subcommandOriginal),budgets(client);case"rules":return telemetry2.trackCliSubcommandRules(subcommandOriginal),rules(client);case"virtual-models":return telemetry2.trackCliSubcommandVirtualModels(subcommandOriginal),virtualModels(client);case"coding-agents":return telemetry2.trackCliSubcommandCodingAgents(subcommandOriginal),codingAgents(client);case"setup":return needHelp?(telemetry2.trackCliFlagHelp("ai-gateway",subcommandOriginal),output_manager_default.print(help(setupSubcommand,{parent:aiGatewayCommand,columns:client.stderr.columns})),0):(telemetry2.trackCliSubcommandSetup(subcommandOriginal),codingAgentsSetup(client,args));case"models":return telemetry2.trackCliSubcommandModels(subcommandOriginal),models(client);case"leaderboard":return telemetry2.trackCliSubcommandLeaderboard(subcommandOriginal),leaderboard(client);default:return needHelp?(telemetry2.trackCliFlagHelp("ai-gateway",subcommandOriginal),output_manager_default.print(help(aiGatewayCommand,{columns:client.stderr.columns})),0):(output_manager_default.error("Please specify a subcommand. Run `vercel ai-gateway --help` for usage information."),2)}}var AlertsTelemetryClient=class extends TelemetryClient{trackCliSubcommandLs(v){v&&this.trackCliSubcommand({subcommand:"ls",value:v})}trackCliSubcommandInspect(actual){this.trackCliSubcommand({subcommand:"inspect",value:actual})}trackCliSubcommandRules(actual){this.trackCliSubcommand({subcommand:"rules",value:actual})}trackCliOptionType(v){v&&v.length>0&&this.trackCliOption({option:"type",value:v.join(",")})}trackCliOptionSince(v){v&&this.trackCliOption({option:"since",value:this.redactedValue})}trackCliOptionUntil(v){v&&this.trackCliOption({option:"until",value:this.redactedValue})}trackCliFlagAll(v){v&&this.trackCliFlag("all")}trackCliFlagAi(v){v&&this.trackCliFlag("ai")}trackCliOptionLimit(v){typeof v=="number"&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var COMMAND_CONFIG12={inspect:getCommandAliases(inspectSubcommand3),ls:getCommandAliases(listSubcommand3),rules:["rules"]};function getFlagSpecValue(flagsSpecification,flag){let value=flagsSpecification[flag];return typeof value=="string"?flagsSpecification[value]:value}function flagConsumesValue(rawArg,flagsSpecification){if(!rawArg.startsWith("-")||rawArg==="-"||rawArg.includes("="))return!1;let value=getFlagSpecValue(flagsSpecification,rawArg);return value===String||value===Number||Array.isArray(value)}function findCommandIndex(rawArgs,commandName,flagsSpecification){if(!commandName)return-1;for(let index=0;index<rawArgs.length;index++){let rawArg=rawArgs[index];if(rawArg==="--")return rawArgs.indexOf(commandName,index+1);if(rawArg.startsWith("-")){flagConsumesValue(rawArg,flagsSpecification)&&index++;continue}if(rawArg===commandName)return index}return-1}function normalizeHelpAlias(rawArgs){return rawArgs.map(arg2=>arg2==="-help"?"--help":arg2)}function getRulesTelemetryAction(args){if(args[0]!=="notifications")return args[0]??"ls";let action=args[1];return!action||action.startsWith("-")?"notifications:ls":action.startsWith("ar_")?"notifications:inspect":action==="ls"||action==="list"?args[2]?.startsWith("ar_")?"notifications:inspect":"notifications:ls":`notifications:${action}`}function getAlertsSubcommand(rawArgs,parsedArgs,flagsSpecification){let commandIndex=findCommandIndex(rawArgs,parsedArgs[0],flagsSpecification),rawArgsAfterCommand=commandIndex===-1?[]:rawArgs.slice(commandIndex+1),rawSubcommand=rawArgsAfterCommand[0];return!rawSubcommand||rawSubcommand.startsWith("-")?{...getSubcommand7([],COMMAND_CONFIG12),rawSubcommandArgs:rawArgsAfterCommand}:{...getSubcommand7(parsedArgs.slice(1),COMMAND_CONFIG12),rawSubcommandArgs:rawArgsAfterCommand.slice(1)}}async function alerts(client){let telemetry2=new AlertsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(alertsCommand.options),rawArgs=normalizeHelpAlias(client.argv.slice(2));try{parsedArgs=parseArguments(rawArgs,flagsSpecification,{permissive:!0})}catch(err){let msg=err instanceof Error?err.message:String(err),projectFlagMissingArg=msg.includes("--project")&&msg.includes("requires argument");return shouldEmitNonInteractiveCommandError(client)&&outputAgentError(client,{status:"error",reason:AGENT_REASON.INVALID_ARGUMENTS,message:projectFlagMissingArg?"`--project` requires a project name or id (for example `--project my-app`).":msg,next:projectFlagMissingArg?[{command:buildCommandWithGlobalFlags(client.argv,"alerts --project <name-or-id>"),when:"Re-run with a project name or id (replace placeholder)"},{command:buildCommandWithGlobalFlags(client.argv,"alerts --help"),when:"See all `alerts` flags and examples"}]:[{command:buildCommandWithGlobalFlags(client.argv,"alerts --help"),when:"See valid flags and examples"}]},2),printError(err),2}let{subcommand,args,subcommandOriginal,rawSubcommandArgs}=getAlertsSubcommand(rawArgs,parsedArgs.args,{...arg_common_default(),...flagsSpecification}),needHelp=parsedArgs.flags["--help"];function printHelp(command2,parent=alertsCommand){output_manager_default.print(help(command2,{parent,columns:client.stderr.columns}))}if(needHelp){if(subcommand==="inspect")return telemetry2.trackCliFlagHelp("alerts","inspect"),printHelp(inspectSubcommand3),0;if(subcommand==="rules"){telemetry2.trackCliFlagHelp("alerts","rules");let nested=args[0];if(nested==="ls"||nested==="list")return printHelp(rulesLsSubcommand,rulesAggregateCommand),0;if(nested==="schema")return printHelp(rulesSchemaSubcommand,rulesAggregateCommand),0;if(nested==="add"||nested==="create")return printHelp(rulesAddSubcommand2,rulesAggregateCommand),0;if(nested==="inspect"||nested==="get")return printHelp(rulesInspectSubcommand,rulesAggregateCommand),0;if(nested==="rm"||nested==="remove"||nested==="delete")return printHelp(rulesRmSubcommand,rulesAggregateCommand),0;if(nested==="update"||nested==="patch")return printHelp(rulesUpdateSubcommand,rulesAggregateCommand),0;if(nested==="notifications"){let notificationAction=args[1];return notificationAction==="ls"||notificationAction==="list"||notificationAction?.startsWith("ar_")?(printHelp(rulesNotificationsLsSubcommand,rulesNotificationsAggregateCommand),0):notificationAction==="link"?(printHelp(rulesNotificationsLinkSubcommand,rulesNotificationsAggregateCommand),0):notificationAction==="update"||notificationAction==="patch"?(printHelp(rulesNotificationsUpdateSubcommand,rulesNotificationsAggregateCommand),0):notificationAction==="unlink"?(printHelp(rulesNotificationsUnlinkSubcommand,rulesNotificationsAggregateCommand),0):(printHelp(rulesNotificationsAggregateCommand,rulesAggregateCommand),0)}return output_manager_default.print(help(rulesAggregateCommand,{parent:alertsCommand,columns:client.stderr.columns})),0}return telemetry2.trackCliFlagHelp("alerts",subcommandOriginal),output_manager_default.print(help(alertsCommand,{columns:client.stderr.columns})),0}switch(subcommand){case"inspect":{telemetry2.trackCliSubcommandInspect(subcommandOriginal);let inspectFn=(await import("./chunks/inspect-FVB5P54P.js")).default;return inspectFn(client,rawSubcommandArgs)}case"rules":{telemetry2.trackCliSubcommandRules(getRulesTelemetryAction(args));let rulesFn=(await import("./chunks/rules-2SBYOL6R.js")).default;return rulesFn(client,rawSubcommandArgs)}default:{telemetry2.trackCliSubcommandLs(subcommandOriginal);let listFn=(await import("./chunks/list-TL7VBVR5.js")).default;return listFn(client,telemetry2)}}}var import_chalk32=__toESM(require_source(),1),import_ms2=__toESM(require_ms(),1);async function getAliases(client,deploymentId,next,limit=20){let aliasUrl=`/v3/now/aliases?limit=${limit}`;next&&(aliasUrl+=`&until=${next}`);let to=deploymentId?`/now/deployments/${deploymentId}/aliases`:aliasUrl;try{return await client.fetch(to)}catch(err){if(isAPIError(err)){let contextName=await getScope(client).then(scope=>scope.contextName);if(err.status===404)throw new DeploymentNotFound({id:deploymentId,context:contextName});if(err.status===403&&deploymentId)throw new DeploymentPermissionDenied(deploymentId,contextName);if(err.status===400&&err.message.includes("`id`")&&deploymentId)throw new InvalidDeploymentId(deploymentId)}throw err}}var AliasListTelemetryClient=class extends TelemetryClient{trackCliOptionLimit(limit){limit&&this.trackCliOption({option:"limit",value:String(limit)})}trackCliOptionNext(next){next&&this.trackCliOption({option:"next",value:this.redactedValue})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function ls(client,argv){let parsedArguments,flagsSpecification=getFlagsSpecification(listSubcommand4.options);try{parsedArguments=parseArguments(argv,flagsSpecification)}catch(err){return printError(err),2}let{args,flags:opts}=parsedArguments,validationResult=validateLsArgs({commandName:"alias ls",args});if(validationResult!==0)return validationResult;let contextName=await getContextName(client),telemetryClient=new AliasListTelemetryClient({opts:{store:client.telemetryEventStore}}),paginationOptions,formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput;try{paginationOptions=getPaginationOpts(opts);let[next,limit]=paginationOptions;telemetryClient.trackCliOptionNext(next),telemetryClient.trackCliOptionLimit(limit),telemetryClient.trackCliOptionFormat(opts["--format"])}catch(err){return output_manager_default.prettyError(err),1}let lsStamp=stamp_default();output_manager_default.spinner(`Fetching aliases under ${import_chalk32.default.bold(contextName)}`);let{aliases:aliases2,pagination}=await getAliases(client,void 0,...paginationOptions);if(asJson){output_manager_default.stopSpinner();let jsonOutput={aliases:aliases2.map(a=>({alias:a.alias,deploymentId:a.deploymentId,url:a.deployment?.url??null,createdAt:a.createdAt})),pagination};client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
|
|
175
175
|
`)}else if(output_manager_default.log(`aliases found under ${import_chalk32.default.bold(contextName)} ${lsStamp()}`),client.stdout.write(printAliasTable(aliases2)),pagination.next){let flags=getCommandFlags(opts,["_","--next","--format"]);output_manager_default.log(`To display the next page run ${getCommandName(`alias ls${flags} --next ${pagination.next}`)}`)}return 0}function printAliasTable(aliases2){return`${table([["source","url","age"].map(header=>import_chalk32.default.gray(header)),...aliases2.map(a=>[a.deployment?.url?a.deployment.url:import_chalk32.default.gray("\u2013"),a.alias,(0,import_ms2.default)(Date.now()-a.createdAt)])],{align:["l","l","r"],hsep:4}).replace(/^/gm," ")}
|
|
176
176
|
|
|
177
177
|
`}var import_chalk33=__toESM(require_source(),1),import_ms3=__toESM(require_ms(),1);async function removeAliasById(client,id2){return client.fetch(`/now/aliases/${id2}`,{method:"DELETE"})}async function findAliasByAliasOrId(client,aliasOrId){return client.fetch(`/now/aliases/${encodeURIComponent(getSafeAlias(aliasOrId))}`)}function getSafeAlias(alias2){return alias2.replace(/^https:\/\//i,"").replace(/^\.+/,"").replace(/\.+$/,"").toLowerCase()}var AliasRemoveTelemetryClient=class extends TelemetryClient{trackCliArgumentAlias(alias2){alias2&&this.trackCliArgument({arg:"alias",value:this.redactedValue})}trackCliFlagYes(yes){yes&&this.trackCliFlag("yes")}};async function rm(client,argv){let parsedArguments,flagsSpecification=getFlagsSpecification(removeSubcommand2.options);try{parsedArguments=parseArguments(argv,flagsSpecification)}catch(err){return printError(err),2}let{args,flags:opts}=parsedArguments,contextName=await getContextName(client),telemetryClient=new AliasRemoveTelemetryClient({opts:{store:client.telemetryEventStore}});telemetryClient.trackCliFlagYes(opts["--yes"]);let[aliasOrId]=args;if(telemetryClient.trackCliArgumentAlias(aliasOrId),args.length!==1)return output_manager_default.error(`Invalid number of arguments. Usage: ${import_chalk33.default.cyan(`${getCommandName("alias rm <alias>")}`)}`),2;if(!aliasOrId)return output_manager_default.error(`${getCommandName("alias rm <alias>")} expects one argument`),2;if(!isValidName(aliasOrId))return output_manager_default.error(`The provided argument "${aliasOrId}" is not a valid alias`),2;let alias2=await findAliasByAliasOrId(client,aliasOrId);if(!alias2)return output_manager_default.error(`Alias not found by "${aliasOrId}" under ${import_chalk33.default.bold(contextName)}`),output_manager_default.log(`Run ${getCommandName("alias ls")} to see your aliases.`),1;let removeStamp=stamp_default();return!opts["--yes"]&&!await confirmAliasRemove(client,alias2)?(output_manager_default.log("Canceled"),0):(await removeAliasById(client,alias2.uid),output_manager_default.success(`Alias ${import_chalk33.default.bold(alias2.alias)} removed ${removeStamp()}`),0)}async function confirmAliasRemove(client,alias2){let srcUrl=alias2.deployment?import_chalk33.default.underline(alias2.deployment.url):null,tbl=table([[...srcUrl?[srcUrl]:[],import_chalk33.default.underline(alias2.alias),import_chalk33.default.gray(`${(0,import_ms3.default)(Date.now()-alias2.createdAt)} ago`)]],{hsep:4});return output_manager_default.log("The following alias will be removed permanently"),output_manager_default.print(` ${tbl}
|
|
@@ -188,7 +188,7 @@ ${sections.join(`
|
|
|
188
188
|
`)),1}return error}var AliasSetTelemetryClient=class extends TelemetryClient{trackCliFlagDebug(flag){flag&&this.trackCliFlag("debug")}trackCliOptionLocalConfig(localConfig){localConfig&&this.trackCliOption({option:"local-config",value:this.redactedValue})}trackCliArgumentIdOrUrl(idOrUrl){idOrUrl&&this.trackCliArgument({arg:"id-or-url",value:this.redactedValue})}trackCliArgumentAlias(customDomain){customDomain&&this.trackCliArgument({arg:"custom-domain",value:this.redactedValue})}};async function set3(client,argv){let parsedArguments,flagsSpecification=getFlagsSpecification(listSubcommand4.options);try{parsedArguments=parseArguments(argv,flagsSpecification)}catch(err){return printError(err),2}let{args,flags:opts}=parsedArguments,setStamp=stamp_default(),{localConfig}=client,telemetryClient=new AliasSetTelemetryClient({opts:{store:client.telemetryEventStore}});telemetryClient.trackCliFlagDebug(opts["--debug"]),telemetryClient.trackCliOptionLocalConfig(opts["--local-config"]);let{contextName,user}=await getScope(client);if(args.length>2)return output_manager_default.error(`${getCommandName("alias <id-or-url> <target>")} accepts at most two arguments`),1;if(args.length>=1&&!isValidName(args[0]))return output_manager_default.error(`The provided argument "${args[0]}" is not a valid ID or URL`),2;if(args.length>=2&&!isValidName(args[1]))return output_manager_default.error(`The provided argument "${args[1]}" is not a valid domain`),2;if(args.length===0)return output_manager_default.error(`To ship to production, optionally configure your domains (${link_default("https://vercel.link/domain-configuration")}) and run ${getCommandName("--prod")}.`),1;if(args.length===1){let[aliasTarget2]=args;telemetryClient.trackCliArgumentAlias(aliasTarget2);let deployment=handleCertError(await getDeploymentForAlias(client,opts["--local-config"],user,contextName,localConfig));if(deployment===1)return deployment;if(deployment instanceof Error)return output_manager_default.error(deployment.message),1;if(!deployment)return output_manager_default.error("Couldn't find a deployment to alias. Please provide one as an argument."),1;let targets2=getTargetsForAlias(args,localConfig);if(targets2 instanceof Error)return output_manager_default.prettyError(targets2),1;for(let target of targets2){output_manager_default.log(`Assigning alias ${target} to deployment ${deployment.url}`);let record2=await assignAlias(client,deployment.id,target,contextName),handleResult2=handleSetupDomainError(handleCreateAliasError(record2));if(handleResult2===1)return 1;output_manager_default.success(`${import_chalk37.default.bold(`${isWildcardAlias(target)?"":"https://"}${handleResult2.alias}`)} now points to https://${deployment.url} ${setStamp()}`)}return 0}let[idOrUrl,aliasTarget]=args;telemetryClient.trackCliArgumentIdOrUrl(idOrUrl),telemetryClient.trackCliArgumentAlias(aliasTarget),output_manager_default.log(`Assigning alias ${aliasTarget} to ${idOrUrl}`);let isWildcard=isWildcardAlias(aliasTarget),idOrUrlForRequest=idOrUrl.includes(".")?toHost(idOrUrl):idOrUrl,record=await assignAlias(client,idOrUrlForRequest,aliasTarget,contextName),handleResult=handleSetupDomainError(handleCreateAliasError(record));if(handleResult===1)return 1;let prefix=isWildcard?"":"https://";return output_manager_default.success(`${import_chalk37.default.bold(`${prefix}${handleResult.alias}`)} now points to ${idOrUrl} ${setStamp()}`),0}function handleSetupDomainError(error){return error instanceof DomainPermissionDenied?(output_manager_default.error(`You don't have permissions over domain ${import_chalk37.default.underline(error.meta.domain)} under ${import_chalk37.default.bold(error.meta.context)}.`),1):error instanceof UserAborted?(output_manager_default.error("User canceled."),1):error instanceof DomainNotFound?(output_manager_default.error("You should buy the domain before aliasing."),1):error instanceof UnsupportedTLD?(output_manager_default.error(`The TLD for domain name ${error.meta.domain} is not supported.`),1):error instanceof InvalidDomain?(output_manager_default.error(`The domain ${error.meta.domain} used for the alias is not valid.`),1):error instanceof DomainNotAvailable?(output_manager_default.error(`The domain ${error.meta.domain} is not available to be purchased.`),1):error instanceof UnexpectedDomainPurchaseError?(output_manager_default.error("There was an unexpected error while purchasing the domain."),1):error instanceof DomainAlreadyExists?(output_manager_default.error(`The domain ${error.meta.domain} exists for a different account.`),1):error instanceof DomainPurchasePending?(output_manager_default.error(`The domain ${error.meta.domain} is processing and will be available once the order is completed.`),output_manager_default.print(` An email will be sent upon completion so you can alias to your new domain.
|
|
189
189
|
`),1):error instanceof SourceNotFound?(output_manager_default.error("You can't purchase the domain you're aliasing to since you have no valid payment method."),output_manager_default.print(` Please add a valid payment method and retry.
|
|
190
190
|
`),1):error instanceof DomainPaymentError?(output_manager_default.error("You can't purchase the domain you're aliasing to since your card was declined."),output_manager_default.print(` Please add a valid payment method and retry.
|
|
191
|
-
`),1):error instanceof TLDNotSupportedViaCLI?(output_manager_default.error(`The TLD for domain name ${error.meta.domain} is not supported via the CLI. Use the REST API or the dashboard to purchase.`),1):error}function handleCreateAliasError(errorOrResult){let error=handleCertError(errorOrResult);return error===1?error:error instanceof AliasInUse?(output_manager_default.error(`The alias ${import_chalk37.default.dim(error.meta.alias)} is a deployment URL or it's in use by a different team.`),1):error instanceof DeploymentNotFound?(output_manager_default.error(`Failed to find ID or URL ${import_chalk37.default.dim(error.meta.id)} under ${import_chalk37.default.bold(error.meta.context)}`),1):error instanceof InvalidAlias?(output_manager_default.error("Invalid alias. Please confirm that the alias you provided is a valid hostname. Note: For `vercel.app`, only sub and sub-sub domains are supported."),1):error instanceof DeploymentPermissionDenied?(output_manager_default.error(`No permission to access ID or URL ${import_chalk37.default.dim(error.meta.id)} under ${import_chalk37.default.bold(error.meta.context)}`),1):error instanceof CertMissing?(output_manager_default.error(`There is no certificate for the domain ${error.meta.domain} and it could not be created.`),output_manager_default.log(`Please generate a new certificate manually with ${getCommandName(`certs issue ${error.meta.domain}`)}`),1):error instanceof InvalidDomain?(output_manager_default.error(`The domain ${error.meta.domain} used for the alias is not valid.`),1):error instanceof DomainPermissionDenied||error instanceof DeploymentFailedAliasImpossible||error instanceof InvalidDeploymentId?(output_manager_default.error(error.message),1):error instanceof DeploymentNotReady?(output_manager_default.error(error.message),1):error}function getTargetsForAlias(args,{alias:alias2}={}){return args.length?[args[args.length-1]].map(target=>target.indexOf(".")!==-1?toHost(target):target).filter(x=>!!x&&typeof x=="string"):alias2?typeof alias2!="string"&&!Array.isArray(alias2)?new InvalidAliasInConfig(alias2):typeof alias2=="string"?[alias2]:alias2:new NoAliasInConfig}var AliasTelemetryClient=class extends TelemetryClient{trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandSet(actual){this.trackCliSubcommand({subcommand:"set",value:actual})}trackCliSubcommandRemove(actual){this.trackCliSubcommand({subcommand:"rm",value:actual})}};var COMMAND_CONFIG13={ls:getCommandAliases(listSubcommand4),rm:getCommandAliases(removeSubcommand2),set:getCommandAliases(setSubcommand)};async function alias(client){let telemetry2=new AliasTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArguments,flagsSpecification=getFlagsSpecification(aliasCommand.options);try{parsedArguments=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),2}let{subcommand,args,subcommandOriginal}=getSubcommand7(parsedArguments.args.slice(1),COMMAND_CONFIG13),needHelp=parsedArguments.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("alias"),output_manager_default.print(help(aliasCommand,{columns:client.stderr.columns})),0;function printHelp(command2){output_manager_default.print(help(command2,{parent:aliasCommand,columns:client.stderr.columns}))}switch(subcommand){case"ls":return needHelp?(telemetry2.trackCliFlagHelp("alias",subcommandOriginal),printHelp(listSubcommand4),0):(telemetry2.trackCliSubcommandList(subcommandOriginal),ls(client,args));case"rm":return needHelp?(telemetry2.trackCliFlagHelp("alias",subcommandOriginal),printHelp(removeSubcommand2),0):(telemetry2.trackCliSubcommandRemove(subcommandOriginal),rm(client,args));case"set":return needHelp?(telemetry2.trackCliFlagHelp("alias",subcommandOriginal),printHelp(setSubcommand),0):(telemetry2.trackCliSubcommandSet(subcommandOriginal),set3(client,args));default:return needHelp?(telemetry2.trackCliFlagHelp("alias",subcommandOriginal),printHelp(setSubcommand),0):(telemetry2.trackCliSubcommandSet(subcommandOriginal),set3(client,args))}}var import_open=__toESM(require_open(),1),import_execa=__toESM(require_execa(),1),import_pluralize=__toESM(require_pluralize(),1),import_chalk38=__toESM(require_source(),1);import{resolve as resolve3}from"path";import{URLSearchParams as URLSearchParams2,parse as parse4}from"url";function hasScheme(url){return url.startsWith("http://")||url.startsWith("https://")}function normalizeURL(url){return hasScheme(url)?url:`https://${url}`}var BisectTelemetryClient=class extends TelemetryClient{trackCliOptionGood(good2){good2&&this.trackCliOption({option:"good",value:this.redactedValue})}trackCliOptionBad(bad2){bad2&&this.trackCliOption({option:"bad",value:this.redactedValue})}trackCliOptionPath(path3){path3&&this.trackCliOption({option:"path",value:this.redactedValue})}trackCliOptionRun(run3){run3&&this.trackCliOption({option:"run",value:this.redactedValue})}trackCliFlagOpen(open18){open18&&this.trackCliFlag("open")}};async function bisect(client){let parsedArgs=null,flagsSpecification=getFlagsSpecification(bisectCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return printError(error),2}let telemetry2=new BisectTelemetryClient({opts:{store:client.telemetryEventStore}});if(parsedArgs.flags["--help"])return telemetry2.trackCliFlagHelp("bisect"),output_manager_default.print(help(bisectCommand,{columns:client.stderr.columns})),0;telemetry2.trackCliOptionGood(parsedArgs.flags["--good"]),telemetry2.trackCliOptionBad(parsedArgs.flags["--bad"]),telemetry2.trackCliOptionPath(parsedArgs.flags["--path"]),telemetry2.trackCliOptionRun(parsedArgs.flags["--run"]),telemetry2.trackCliFlagOpen(parsedArgs.flags["--open"]);let scope=await getScope(client),{contextName}=scope,bad2=parsedArgs.flags["--bad"]||await client.input.text({message:"Specify a URL where the bug occurs:",validate:val=>val?!0:"A URL must be provided"}),good2=parsedArgs.flags["--good"]||await client.input.text({message:"Specify a URL where the bug does not occur:",validate:val=>val?!0:"A URL must be provided"}),subpath=parsedArgs.flags["--path"]||"",run3=parsedArgs.flags["--run"]||"",openEnabled=parsedArgs.flags["--open"]||!1;run3&&(run3=resolve3(run3)),bad2=normalizeURL(bad2);let parsed=parse4(bad2);if(!parsed.hostname)return output_manager_default.error("Invalid input: no hostname provided"),1;if(bad2=parsed.hostname,typeof parsed.path=="string"&&parsed.path!=="/"&&(subpath&&subpath!==parsed.path?output_manager_default.note(`Ignoring subpath ${import_chalk38.default.bold(parsed.path)} in favor of \`--path\` argument ${import_chalk38.default.bold(subpath)}`):subpath=parsed.path),good2=normalizeURL(good2),parsed=parse4(good2),!parsed.hostname)return output_manager_default.error("Invalid input: no hostname provided"),1;good2=parsed.hostname,typeof parsed.path=="string"&&parsed.path!=="/"&&subpath&&subpath!==parsed.path&&output_manager_default.note(`Ignoring subpath ${import_chalk38.default.bold(parsed.path)} which does not match ${import_chalk38.default.bold(subpath)}`),subpath||(subpath=await client.input.text({message:"Specify the URL subpath where the bug occurs:",validate:val=>val?!0:"A subpath must be provided"})),output_manager_default.spinner("Retrieving deployments\u2026");let badDeployment=await getDeployment(client,contextName,bad2).catch(err=>err);if(badDeployment){if(badDeployment instanceof Error)return badDeployment.message+=` when requesting bad deployment "${normalizeURL(bad2)}"`,output_manager_default.prettyError(badDeployment),1;bad2=badDeployment.url}else return output_manager_default.error(`Failed to retrieve ${import_chalk38.default.bold("bad")} Deployment: ${bad2}`),1;let goodDeployment=await getDeployment(client,contextName,good2).catch(err=>err);if(goodDeployment){if(goodDeployment instanceof Error)return goodDeployment.message+=` when requesting good deployment "${normalizeURL(good2)}"`,output_manager_default.prettyError(goodDeployment),1;good2=goodDeployment.url}else return output_manager_default.error(`Failed to retrieve ${import_chalk38.default.bold("good")} Deployment: ${good2}`),1;let{projectId}=badDeployment;if(projectId!==goodDeployment.projectId)return output_manager_default.error("Good and Bad deployments must be from the same Project"),1;if(badDeployment.url===goodDeployment.url)return output_manager_default.error("Good and Bad deployments must be different"),1;if(badDeployment.createdAt<goodDeployment.createdAt)return output_manager_default.error("Good deployment must be older than the Bad deployment"),1;if(badDeployment.target!==goodDeployment.target)return output_manager_default.error(`Bad deployment target "${badDeployment.target||"preview"}" does not match good deployment target "${goodDeployment.target||"preview"}"`),1;let deployments=[],query=new URLSearchParams2;query.set("projectId",projectId),badDeployment.target&&query.set("target",badDeployment.target),query.set("state","READY"),query.set("until",String(badDeployment.createdAt+1));for await(let chunk of client.fetchPaginated(`/v6/deployments?${query}`,{accountId:badDeployment.ownerId})){let newDeployments=chunk.deployments,hasGood=!1;for(let i=0;i<newDeployments.length;i++)if(newDeployments[i].url===good2){newDeployments=newDeployments.slice(0,i),hasGood=!0;break}if(deployments=deployments.concat(newDeployments),hasGood)break}if(!deployments.length)return output_manager_default.error("Cannot bisect because this project does not have any deployments"),1;let lastBad=deployments.shift();for(;deployments.length>0;){output_manager_default.print(`
|
|
191
|
+
`),1):error instanceof TLDNotSupportedViaCLI?(output_manager_default.error(`The TLD for domain name ${error.meta.domain} is not supported via the CLI. Use the REST API or the dashboard to purchase.`),1):error instanceof DomainPurchaseRefundFailed||error instanceof DomainPurchaseRefunded||error instanceof DomainChargeOutcomeUnknown||error instanceof DomainPriceChanged?(output_manager_default.error(error.message),1):error}function handleCreateAliasError(errorOrResult){let error=handleCertError(errorOrResult);return error===1?error:error instanceof AliasInUse?(output_manager_default.error(`The alias ${import_chalk37.default.dim(error.meta.alias)} is a deployment URL or it's in use by a different team.`),1):error instanceof DeploymentNotFound?(output_manager_default.error(`Failed to find ID or URL ${import_chalk37.default.dim(error.meta.id)} under ${import_chalk37.default.bold(error.meta.context)}`),1):error instanceof InvalidAlias?(output_manager_default.error("Invalid alias. Please confirm that the alias you provided is a valid hostname. Note: For `vercel.app`, only sub and sub-sub domains are supported."),1):error instanceof DeploymentPermissionDenied?(output_manager_default.error(`No permission to access ID or URL ${import_chalk37.default.dim(error.meta.id)} under ${import_chalk37.default.bold(error.meta.context)}`),1):error instanceof CertMissing?(output_manager_default.error(`There is no certificate for the domain ${error.meta.domain} and it could not be created.`),output_manager_default.log(`Please generate a new certificate manually with ${getCommandName(`certs issue ${error.meta.domain}`)}`),1):error instanceof InvalidDomain?(output_manager_default.error(`The domain ${error.meta.domain} used for the alias is not valid.`),1):error instanceof DomainPermissionDenied||error instanceof DeploymentFailedAliasImpossible||error instanceof InvalidDeploymentId?(output_manager_default.error(error.message),1):error instanceof DeploymentNotReady?(output_manager_default.error(error.message),1):error}function getTargetsForAlias(args,{alias:alias2}={}){return args.length?[args[args.length-1]].map(target=>target.indexOf(".")!==-1?toHost(target):target).filter(x=>!!x&&typeof x=="string"):alias2?typeof alias2!="string"&&!Array.isArray(alias2)?new InvalidAliasInConfig(alias2):typeof alias2=="string"?[alias2]:alias2:new NoAliasInConfig}var AliasTelemetryClient=class extends TelemetryClient{trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandSet(actual){this.trackCliSubcommand({subcommand:"set",value:actual})}trackCliSubcommandRemove(actual){this.trackCliSubcommand({subcommand:"rm",value:actual})}};var COMMAND_CONFIG13={ls:getCommandAliases(listSubcommand4),rm:getCommandAliases(removeSubcommand2),set:getCommandAliases(setSubcommand)};async function alias(client){let telemetry2=new AliasTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArguments,flagsSpecification=getFlagsSpecification(aliasCommand.options);try{parsedArguments=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),2}let{subcommand,args,subcommandOriginal}=getSubcommand7(parsedArguments.args.slice(1),COMMAND_CONFIG13),needHelp=parsedArguments.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("alias"),output_manager_default.print(help(aliasCommand,{columns:client.stderr.columns})),0;function printHelp(command2){output_manager_default.print(help(command2,{parent:aliasCommand,columns:client.stderr.columns}))}switch(subcommand){case"ls":return needHelp?(telemetry2.trackCliFlagHelp("alias",subcommandOriginal),printHelp(listSubcommand4),0):(telemetry2.trackCliSubcommandList(subcommandOriginal),ls(client,args));case"rm":return needHelp?(telemetry2.trackCliFlagHelp("alias",subcommandOriginal),printHelp(removeSubcommand2),0):(telemetry2.trackCliSubcommandRemove(subcommandOriginal),rm(client,args));case"set":return needHelp?(telemetry2.trackCliFlagHelp("alias",subcommandOriginal),printHelp(setSubcommand),0):(telemetry2.trackCliSubcommandSet(subcommandOriginal),set3(client,args));default:return needHelp?(telemetry2.trackCliFlagHelp("alias",subcommandOriginal),printHelp(setSubcommand),0):(telemetry2.trackCliSubcommandSet(subcommandOriginal),set3(client,args))}}var import_open=__toESM(require_open(),1),import_execa=__toESM(require_execa(),1),import_pluralize=__toESM(require_pluralize(),1),import_chalk38=__toESM(require_source(),1);import{resolve as resolve3}from"path";import{URLSearchParams as URLSearchParams2,parse as parse4}from"url";function hasScheme(url){return url.startsWith("http://")||url.startsWith("https://")}function normalizeURL(url){return hasScheme(url)?url:`https://${url}`}var BisectTelemetryClient=class extends TelemetryClient{trackCliOptionGood(good2){good2&&this.trackCliOption({option:"good",value:this.redactedValue})}trackCliOptionBad(bad2){bad2&&this.trackCliOption({option:"bad",value:this.redactedValue})}trackCliOptionPath(path3){path3&&this.trackCliOption({option:"path",value:this.redactedValue})}trackCliOptionRun(run3){run3&&this.trackCliOption({option:"run",value:this.redactedValue})}trackCliFlagOpen(open18){open18&&this.trackCliFlag("open")}};async function bisect(client){let parsedArgs=null,flagsSpecification=getFlagsSpecification(bisectCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return printError(error),2}let telemetry2=new BisectTelemetryClient({opts:{store:client.telemetryEventStore}});if(parsedArgs.flags["--help"])return telemetry2.trackCliFlagHelp("bisect"),output_manager_default.print(help(bisectCommand,{columns:client.stderr.columns})),0;telemetry2.trackCliOptionGood(parsedArgs.flags["--good"]),telemetry2.trackCliOptionBad(parsedArgs.flags["--bad"]),telemetry2.trackCliOptionPath(parsedArgs.flags["--path"]),telemetry2.trackCliOptionRun(parsedArgs.flags["--run"]),telemetry2.trackCliFlagOpen(parsedArgs.flags["--open"]);let scope=await getScope(client),{contextName}=scope,bad2=parsedArgs.flags["--bad"]||await client.input.text({message:"Specify a URL where the bug occurs:",validate:val=>val?!0:"A URL must be provided"}),good2=parsedArgs.flags["--good"]||await client.input.text({message:"Specify a URL where the bug does not occur:",validate:val=>val?!0:"A URL must be provided"}),subpath=parsedArgs.flags["--path"]||"",run3=parsedArgs.flags["--run"]||"",openEnabled=parsedArgs.flags["--open"]||!1;run3&&(run3=resolve3(run3)),bad2=normalizeURL(bad2);let parsed=parse4(bad2);if(!parsed.hostname)return output_manager_default.error("Invalid input: no hostname provided"),1;if(bad2=parsed.hostname,typeof parsed.path=="string"&&parsed.path!=="/"&&(subpath&&subpath!==parsed.path?output_manager_default.note(`Ignoring subpath ${import_chalk38.default.bold(parsed.path)} in favor of \`--path\` argument ${import_chalk38.default.bold(subpath)}`):subpath=parsed.path),good2=normalizeURL(good2),parsed=parse4(good2),!parsed.hostname)return output_manager_default.error("Invalid input: no hostname provided"),1;good2=parsed.hostname,typeof parsed.path=="string"&&parsed.path!=="/"&&subpath&&subpath!==parsed.path&&output_manager_default.note(`Ignoring subpath ${import_chalk38.default.bold(parsed.path)} which does not match ${import_chalk38.default.bold(subpath)}`),subpath||(subpath=await client.input.text({message:"Specify the URL subpath where the bug occurs:",validate:val=>val?!0:"A subpath must be provided"})),output_manager_default.spinner("Retrieving deployments\u2026");let badDeployment=await getDeployment(client,contextName,bad2).catch(err=>err);if(badDeployment){if(badDeployment instanceof Error)return badDeployment.message+=` when requesting bad deployment "${normalizeURL(bad2)}"`,output_manager_default.prettyError(badDeployment),1;bad2=badDeployment.url}else return output_manager_default.error(`Failed to retrieve ${import_chalk38.default.bold("bad")} Deployment: ${bad2}`),1;let goodDeployment=await getDeployment(client,contextName,good2).catch(err=>err);if(goodDeployment){if(goodDeployment instanceof Error)return goodDeployment.message+=` when requesting good deployment "${normalizeURL(good2)}"`,output_manager_default.prettyError(goodDeployment),1;good2=goodDeployment.url}else return output_manager_default.error(`Failed to retrieve ${import_chalk38.default.bold("good")} Deployment: ${good2}`),1;let{projectId}=badDeployment;if(projectId!==goodDeployment.projectId)return output_manager_default.error("Good and Bad deployments must be from the same Project"),1;if(badDeployment.url===goodDeployment.url)return output_manager_default.error("Good and Bad deployments must be different"),1;if(badDeployment.createdAt<goodDeployment.createdAt)return output_manager_default.error("Good deployment must be older than the Bad deployment"),1;if(badDeployment.target!==goodDeployment.target)return output_manager_default.error(`Bad deployment target "${badDeployment.target||"preview"}" does not match good deployment target "${goodDeployment.target||"preview"}"`),1;let deployments=[],query=new URLSearchParams2;query.set("projectId",projectId),badDeployment.target&&query.set("target",badDeployment.target),query.set("state","READY"),query.set("until",String(badDeployment.createdAt+1));for await(let chunk of client.fetchPaginated(`/v6/deployments?${query}`,{accountId:badDeployment.ownerId})){let newDeployments=chunk.deployments,hasGood=!1;for(let i=0;i<newDeployments.length;i++)if(newDeployments[i].url===good2){newDeployments=newDeployments.slice(0,i),hasGood=!0;break}if(deployments=deployments.concat(newDeployments),hasGood)break}if(!deployments.length)return output_manager_default.error("Cannot bisect because this project does not have any deployments"),1;let lastBad=deployments.shift();for(;deployments.length>0;){output_manager_default.print(`
|
|
192
192
|
`);let middleIndex=Math.floor(deployments.length/2),deployment=deployments[middleIndex],rem=(0,import_pluralize.default)("deployment",deployments.length,!0),steps=Math.floor(Math.log2(deployments.length)),pSteps=(0,import_pluralize.default)("step",steps,!0);output_manager_default.log(import_chalk38.default.magenta(`${import_chalk38.default.bold("Bisecting:")} ${rem} left to test after this (roughly ${pSteps})`),import_chalk38.default.magenta);let testUrl=`https://${deployment.url}${subpath}`;output_manager_default.log(`${import_chalk38.default.bold("Deployment URL:")} ${link_default(testUrl)}`),output_manager_default.log(`${import_chalk38.default.bold("Date:")} ${formatDate(deployment.createdAt)}`);let commit2=getCommit(deployment);if(commit2){let shortSha=commit2.sha.substring(0,7),firstLine=commit2.message?.split(`
|
|
193
193
|
`)[0];output_manager_default.log(`${import_chalk38.default.bold("Commit:")} [${shortSha}] ${firstLine}`)}let action;if(run3){let proc=await(0,import_execa.default)(run3,[testUrl],{stdio:"inherit",reject:!1,env:{...process.env,HOST:deployment.url,URL:testUrl}});if(proc instanceof Error&&typeof proc.exitCode!="number")return output_manager_default.prettyError(proc),1;let{exitCode:exitCode2}=proc,color;exitCode2===0?(color=import_chalk38.default.green,action="good"):exitCode2===125?(action="skip",color=import_chalk38.default.grey):(action="bad",color=import_chalk38.default.red),output_manager_default.log(`Run script returned exit code ${import_chalk38.default.bold(String(exitCode2))}: ${color(action)}`)}else openEnabled&&await(0,import_open.default)(testUrl),action=await client.input.expand({message:"Select an action:",choices:[{key:"g",name:"Good",value:"good"},{key:"b",name:"Bad",value:"bad"},{key:"s",name:"Skip",value:"skip"}]});action==="good"?deployments=deployments.slice(0,middleIndex):action==="bad"?(lastBad=deployment,deployments=deployments.slice(middleIndex+1)):action==="skip"&&deployments.splice(middleIndex,1)}output_manager_default.print(`
|
|
194
194
|
`);let result=[import_chalk38.default.bold(`The first bad deployment is: ${link_default(`https://${lastBad.url}`)}`),"",` ${import_chalk38.default.bold("Date:")} ${formatDate(lastBad.createdAt)}`],commit=getCommit(lastBad);if(commit){let shortSha=commit.sha.substring(0,7),firstLine=commit.message?.split(`
|
|
@@ -229,19 +229,29 @@ validUntil=${result.validUntil} (${new Date(result.validUntil).toISOString()})
|
|
|
229
229
|
`):(output_manager_default.success(`Purchased ${import_chalk48.default.bold(`$${amount}`)} of ${label} credits for ${import_chalk48.default.bold(contextName)} ${purchaseStamp()}`),result.purchaseIntent&&output_manager_default.debug(`Purchase intent: ${result.purchaseIntent.id}`)),0}catch(err){return output_manager_default.stopSpinner(),handlePurchaseError(err,contextName,{openBrowser:!!client.stdout.isTTY})}}var import_chalk49=__toESM(require_source(),1);var import_error_utils4=__toESM(require_dist(),1);function handleCustomEnvironmentPurchaseError(err){if(isAPIError(err)){if(err.code==="upgrade_required")return output_manager_default.error("Custom environment purchases require an active Pro or Enterprise plan."),output_manager_default.log(`Upgrade with ${getCommandName("buy pro")} or visit ${output_manager_default.link("vercel.com/pricing","https://vercel.com/pricing")}.`),1;if(err.code==="custom_environments_not_available_to_purchase")return output_manager_default.error(err.serverMessage||"Custom environments are not available to purchase on this team."),1;if(err.code==="custom_environments_in_use")return output_manager_default.error(err.serverMessage||"This project is using more custom environments than the requested capacity allows."),1;if(err.code==="bad_request"&&err.serverMessage)return output_manager_default.error(err.serverMessage),1;if(err.code==="forbidden")return output_manager_default.error(err.serverMessage||"You do not have permission to update custom environment capacity for this project."),1}return output_manager_default.error("An error occurred while updating custom environment capacity. Please try again later."),output_manager_default.debug(`Server response: ${(0,import_error_utils4.errorToString)(err)}`),1}async function purchaseCustomEnvironmentCapacity(client,{packs,yes,projectName,commandName}){let{cwd}=client,link=await ensureLink(commandName,client,cwd,{autoConfirm:yes,projectName,failIfNotFound:!!projectName});if(typeof link=="number")return link;let projectId=link.project.id,projectNameResolved=link.project.name;output_manager_default.spinner("Fetching custom environment settings");let settings;try{settings=await client.fetch(`/v1/projects/custom-environments/settings?projectId=${encodeURIComponent(projectId)}`,{accountId:link.org.id})}catch(err){return output_manager_default.stopSpinner(),handleCustomEnvironmentPurchaseError(err)}output_manager_default.stopSpinner();let{packSize}=settings,purchasedPacks=settings.purchasedAmount/packSize,minPacks=settings.minPurchasedAmount/packSize,maxPacks=settings.maxPurchasedAmount/packSize;if(packs<minPacks||packs>maxPacks){let minEnvironments=minPacks*packSize,maxEnvironments=maxPacks*packSize;return output_manager_default.error(`Packs must be between ${minPacks} and ${maxPacks} for this project (${minEnvironments}-${maxEnvironments} purchased environments).`),2}if(packs===purchasedPacks)return output_manager_default.log(`Project ${import_chalk49.default.bold(projectNameResolved)} already has ${import_chalk49.default.bold(packs)} custom environment pack${packs===1?"":"s"} purchased.`),0;let purchasedAmount=packs*packSize,isIncreasing=packs>purchasedPacks;if(!yes){if(!client.stdin.isTTY)return output_manager_default.error("Confirmation required. Use --yes to skip the confirmation prompt in non-interactive mode."),1;if(!await client.input.confirm(`${isIncreasing?"Purchase":"Reduce to"} ${import_chalk49.default.bold(packs)} custom environment pack${packs===1?"":"s"} (${purchasedAmount} environments) for project ${import_chalk49.default.bold(projectNameResolved)}?`,!1))return 0}let purchaseStamp=stamp_default();output_manager_default.spinner("Updating custom environment capacity");try{let result=await client.fetch(`/v1/projects/custom-environments/settings?projectId=${encodeURIComponent(projectId)}`,{method:"POST",body:{purchasedAmount},accountId:link.org.id});return output_manager_default.stopSpinner(),output_manager_default.success(`Updated custom environment capacity for ${import_chalk49.default.bold(projectNameResolved)} to ${import_chalk49.default.bold(packs)} pack${packs===1?"":"s"} (${result.purchasedAmount} environments) ${purchaseStamp()}`),0}catch(err){return output_manager_default.stopSpinner(),handleCustomEnvironmentPurchaseError(err)}}function validateCustomEnvironmentPacks(packsStr){if(!packsStr)return{error:"Missing packs. Specify the number of custom environment packs to purchase.",usage:`Example: ${getCommandName(`buy addon custom-environment ${2}`)} \u2014 each pack adds ${5} environments.`};let packs=Number(packsStr);return Number.isInteger(packs)?packs<0?{error:`Invalid packs "${packsStr}". Please specify a non-negative number.`}:{packs}:{error:`Invalid packs "${packsStr}". Please specify a whole number.`}}var OBSERVABILITY_PLUS_ADDON_ALIASES=new Set(["observability","observabilityplus","observability-plus","observability_plus"]);function isObservabilityPlusAddonAlias(name){return OBSERVABILITY_PLUS_ADDON_ALIASES.has(name.toLowerCase())}var import_error_utils5=__toESM(require_dist(),1);var OBSERVABILITY_PLUS_PRODUCT_ALIAS="observabilityPlus";async function purchaseObservabilityPlus(client,{yes,asJson}){let{team,contextName}=await getScope(client);if(!team)return output_manager_default.error("Observability Plus requires a team. Use --scope to specify one."),1;if(team.billing?.plan==="hobby")return output_manager_default.error("Observability Plus requires an active Pro or Enterprise plan."),output_manager_default.log(`Upgrade with ${getCommandName("buy pro")}.`),1;let currentConfiguration;asJson||output_manager_default.spinner("Checking Observability Plus status");try{currentConfiguration=await client.fetch("/v1/observability/manage/configuration")}catch(err){return output_manager_default.stopSpinner(),output_manager_default.error("Failed to check Observability Plus status."),output_manager_default.debug(`Server response: ${(0,import_error_utils5.errorToString)(err)}`),1}if(output_manager_default.stopSpinner(),currentConfiguration.observabilityPlus.subscribed)return asJson?client.stdout.write(`${JSON.stringify({productAlias:OBSERVABILITY_PLUS_PRODUCT_ALIAS,quantity:1,team:contextName,teamEnabled:currentConfiguration.observabilityPlus.enabled},null,2)}
|
|
230
230
|
`):(printAlignedLabel("Status","Already enabled"),printAlignedLabel("Team",contextName)),0;if(!yes&&(!client.stdin.isTTY||client.nonInteractive))return output_manager_default.error("Confirmation required. Use --yes to skip the confirmation prompt in non-interactive mode."),1;if((!asJson||!yes)&&(printAlignedLabel("Add-on","Observability Plus"),printAlignedLabel("Team",contextName),printAlignedLabel("Usage","Billed as accrued")),!yes&&!await client.input.confirm("Enable this add-on?",!1))return 0;asJson||output_manager_default.spinner("Enabling Observability Plus");try{let result=await client.fetch("/v1/observability/manage/configuration",{method:"PATCH",body:{teamEnabled:!0}});return output_manager_default.stopSpinner(),result.teamEnabled?(asJson?client.stdout.write(`${JSON.stringify({productAlias:OBSERVABILITY_PLUS_PRODUCT_ALIAS,quantity:1,team:contextName,teamEnabled:result.teamEnabled},null,2)}
|
|
231
231
|
`):(printAlignedLabel("Enabled","Observability Plus",{gutter:"\u2713"}),printAlignedLabel("Team",contextName)),0):(output_manager_default.error("The API did not confirm Observability Plus access for this team. Check the team billing settings before retrying."),1)}catch(err){return output_manager_default.stopSpinner(),handleObservabilityPlusPurchaseError(err,contextName)}}function handleObservabilityPlusPurchaseError(err,teamSlug){if(isAPIError(err)){if(err.code==="forbidden")return output_manager_default.error("Only team owners can purchase Observability Plus. Ask a team owner."),1;if(err.code==="invalid_plan_status")return output_manager_default.error("Observability Plus can't be enabled while this team's subscription is in its current state."),output_manager_default.log(`Review the team billing settings: ${output_manager_default.link(getTeamBillingUrl(teamSlug),getTeamBillingUrl(teamSlug))}`),1;if(err.code==="invalid_product"||err.code==="invalid_price")return output_manager_default.error("Observability Plus isn't available for this team's current plan."),output_manager_default.log(`Review the team billing settings: ${output_manager_default.link(getTeamBillingUrl(teamSlug),getTeamBillingUrl(teamSlug))}`),1}return output_manager_default.error("Failed to enable Observability Plus."),output_manager_default.debug(`Server response: ${(0,import_error_utils5.errorToString)(err)}`),1}async function addon(client,argv){let flagsSpecification=getFlagsSpecification(addonSubcommand.options),parsedArgs;try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags}=parsedArgs,[addonName,quantityStr]=args;if(addonName&&isCustomEnvironmentAddonAlias(addonName)){let packsResult=validateCustomEnvironmentPacks(quantityStr);if("error"in packsResult)return output_manager_default.error(packsResult.error),packsResult.usage&&output_manager_default.log(packsResult.usage),1;let project=flags["--project"];return purchaseCustomEnvironmentCapacity(client,{packs:packsResult.packs,yes:!!flags["--yes"],projectName:typeof project=="string"?project:void 0,commandName:"buy"})}if(addonName&&isObservabilityPlusAddonAlias(addonName)){if(flags["--project"]!==void 0)return output_manager_default.error("--project isn't supported for Observability Plus because it is enabled for a team. Use --scope <team> to select the team."),1;if(quantityStr!==void 0)return output_manager_default.error(`Observability Plus does not accept a quantity. Run ${getCommandName("buy addon observability-plus")} without one.`),1;let formatResult=validateJsonOutput(parsedArgs.flags);return formatResult.valid?purchaseObservabilityPlus(client,{yes:!!flags["--yes"],asJson:formatResult.jsonOutput}):(output_manager_default.error(formatResult.error),2)}return addonName?(output_manager_default.error(`Invalid addon "${addonName}". Supported addons: ${SUPPORTED_ADDON_NAMES.join(", ")}.`),1):(output_manager_default.error(`Missing addon name. Supported addons: ${SUPPORTED_ADDON_NAMES.join(", ")}`),output_manager_default.log(`Run ${getCommandName("buy addon --help")} for usage.`),2)}var import_chalk50=__toESM(require_source(),1);async function pro(client,argv){let flagsSpecification=getFlagsSpecification(proSubcommand.options),parsedArgs;try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let formatResult=validateJsonOutput(parsedArgs.flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput,{team,contextName}=await getScope(client);if(!team)return output_manager_default.error("This command must be run with a team scope. Use --scope to specify a team."),1;if(!parsedArgs.flags["--yes"]){if(!client.stdin.isTTY)return output_manager_default.error("Confirmation required. Use --yes to skip the confirmation prompt in non-interactive mode."),1;if(!await client.input.confirm(`Upgrade team ${import_chalk50.default.bold(contextName)} to Vercel Pro?`,!1))return 0}let purchaseStamp=stamp_default();output_manager_default.spinner("Processing purchase");try{let result=await createPurchase(client,{type:"subscription",planSlug:"pro"});return output_manager_default.stopSpinner(),asJson?client.stdout.write(`${JSON.stringify({team:contextName,subscriptionIntent:result.subscriptionIntent},null,2)}
|
|
232
|
-
`):(output_manager_default.success(`Upgraded ${import_chalk50.default.bold(contextName)} to Vercel Pro ${purchaseStamp()}`),result.subscriptionIntent&&output_manager_default.debug(`Subscription intent: ${result.subscriptionIntent.id}`)),0}catch(err){return output_manager_default.stopSpinner(),handlePurchaseError(err,contextName,{openBrowser:!!client.stdout.isTTY})}}var import_chalk51=__toESM(require_source(),1),import_tldts3=__toESM(require_cjs(),1),import_error_utils6=__toESM(require_dist(),1);var DomainsBuyTelemetryClient=class extends TelemetryClient{trackCliArgumentDomain(v){v&&this.trackCliArgument({arg:"domain",value:this.redactedValue})}};var VERCEL_DOMAINS_URL="https://vercel.com/dashboard/domains";async function buy(client,argv){let telemetry2=new DomainsBuyTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(buySubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return client.nonInteractive&&outputAgentError(client,{status:"error",reason:"invalid_arguments",message:error instanceof Error?error.message:String(error)},2),printError(error),2}let{args}=parsedArgs,[domainName]=args,skipConfirmation=!!process.env.CI;if(telemetry2.trackCliArgumentDomain(domainName),!domainName){if(client.nonInteractive){let flags=getGlobalFlagsFromArgs(client.argv.slice(2)),cmd2=getCommandNamePlain(`domains buy <domain> ${flags.join(" ")}`.trim());outputAgentError(client,{status:"error",reason:"missing_arguments",message:`Missing domain name. This command cannot be completed non-interactively without a domain. Run: ${cmd2}`,next:[{command:cmd2,when:"user must run interactively; agents must not purchase on behalf of a user"}]},2)}return output_manager_default.error(`Missing domain name. Run ${getCommandName("domains --help")}`),2}if(client.nonInteractive){let flags=getGlobalFlagsFromArgs(client.argv.slice(2)),interactiveCmd=getCommandNamePlain(`domains buy ${domainName} ${flags.filter(f=>f!=="--non-interactive").join(" ")}`.trim());return outputAgentError(client,{status:"error",reason:"purchase_requires_user",message:"Domain purchase cannot be performed non-interactively. Agents must not purchase domains on behalf of a user. The user must run this command interactively in a terminal to confirm price, auto-renew, and provide registrant contact details. Alternatively the user can complete purchase in the Vercel dashboard.",next:[{command:openUrlInBrowserCommand(VERCEL_DOMAINS_URL),when:"user opens Domains in the browser to purchase"},{command:interactiveCmd,when:"user runs this command interactively (remove --non-interactive)"}]},1),1}let contextName=await getContextName(client),parsedDomain=(0,import_tldts3.parse)(domainName),{domain:rootDomain,subdomain}=parsedDomain;if(subdomain||!rootDomain)return client.nonInteractive&&outputAgentError(client,{status:"error",reason:"invalid_domain",message:`Invalid domain name '${domainName}'. Use a registrable root domain (no subdomain).`},1),output_manager_default.error(`Invalid domain name "${domainName}". Run ${getCommandName("domains --help")}`),1;let availableStamp=stamp_default(),[domainPrice,domainStatus]=await Promise.all([getDomainPrice(client,domainName),getDomainStatus(client,domainName)]);if(domainPrice instanceof Error)return output_manager_default.prettyError(domainPrice),1;if(!domainStatus.available)return output_manager_default.error(`The domain ${param(domainName)} is ${import_chalk51.default.underline("unavailable")}! ${availableStamp()}`),1;let{years,purchasePrice,renewalPrice}=domainPrice;if(purchasePrice===null||renewalPrice===null)return output_manager_default.error("Domain price not found"),1;if(output_manager_default.log(`The domain ${param(domainName)} is ${import_chalk51.default.underline("available")} to buy under ${import_chalk51.default.bold(contextName)}! ${availableStamp()}`),skipConfirmation)return output_manager_default.error("Domain purchase in CI mode is not supported. Please run this command interactively to provide contact information."),1;if(!await client.input.confirm(`Buy now for ${import_chalk51.default.bold(`$${purchasePrice}`)} (${`${years}yr${years>1?"s":""}`})?`,!1))return 0;let autoRenew2=await client.input.confirm(years===1?`Auto renew yearly for ${import_chalk51.default.bold(`$${renewalPrice}`)}?`:`Auto renew every ${years} years for ${import_chalk51.default.bold(`$${renewalPrice}`)}?`,!0),contactInformation=await collectContactInformation(client),buyResult,purchaseStamp=stamp_default();output_manager_default.spinner("Purchasing");try{buyResult=await purchaseDomain(client,domainName,purchasePrice,years,autoRenew2,contactInformation)}catch(err){return output_manager_default.error("An unexpected error occurred while purchasing your domain. Please try again later."),output_manager_default.debug(`Server response: ${(0,import_error_utils6.errorToString)(err)}`),1}return output_manager_default.stopSpinner(),buyResult instanceof UnsupportedTLD?(output_manager_default.error(`The TLD for domain name ${buyResult.meta.domain} is not supported.`),1):buyResult instanceof TLDNotSupportedViaCLI?(output_manager_default.error(`Purchased for the TLD for domain name ${buyResult.meta.domain} are not supported via the CLI. Use the REST API or the dashboard to purchase.`),1):buyResult instanceof InvalidDomain?(output_manager_default.error(`The domain ${buyResult.meta.domain} is not valid.`),1):buyResult instanceof DomainNotAvailable?(output_manager_default.error(`The domain ${buyResult.meta.domain} is not available.`),1):buyResult instanceof UnexpectedDomainPurchaseError?(output_manager_default.error("An unexpected error happened while performing the purchase."),1):buyResult instanceof DomainPaymentError?(output_manager_default.error("Your card was declined."),1):(output_manager_default.success(`Domain ${param(domainName)} purchased ${purchaseStamp()}`),output_manager_default.note(`You may now use your domain as an alias to your deployments. Run ${getCommandName("alias --help")}`),0)}async function domain(client,argv){return buy(client,argv)}var BuyTelemetryClient=class extends TelemetryClient{trackCliSubcommandCredits(actual){this.trackCliSubcommand({subcommand:"credits",value:actual})}trackCliSubcommandAddon(actual){this.trackCliSubcommand({subcommand:"addon",value:actual})}trackCliSubcommandPro(actual){this.trackCliSubcommand({subcommand:"pro",value:actual})}trackCliSubcommandDomain(actual){this.trackCliSubcommand({subcommand:"domain",value:actual})}};var COMMAND_CONFIG17={credits:getCommandAliases(creditsSubcommand),addon:getCommandAliases(addonSubcommand),pro:getCommandAliases(proSubcommand),domain:getCommandAliases(domainSubcommand)};async function main4(client){let parsedArgs,flagsSpecification=getFlagsSpecification(buyCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(error){return printError(error),2}let telemetry2=new BuyTelemetryClient({opts:{store:client.telemetryEventStore}}),{subcommand,args,subcommandOriginal}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG17),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("buy"),output_manager_default.print(help(buyCommand,{columns:client.stderr.columns})),0;function printHelp(command2){return output_manager_default.print(help(command2,{parent:buyCommand,columns:client.stderr.columns})),0}if(!subcommand)return output_manager_default.print(help(buyCommand,{columns:client.stderr.columns})),2;switch(subcommand){case"credits":return needHelp?(telemetry2.trackCliFlagHelp("buy",subcommandOriginal),printHelp(creditsSubcommand)):(telemetry2.trackCliSubcommandCredits(subcommandOriginal),credits(client,args));case"addon":return needHelp?(telemetry2.trackCliFlagHelp("buy",subcommandOriginal),printHelp(addonSubcommand)):(telemetry2.trackCliSubcommandAddon(subcommandOriginal),addon(client,args));case"pro":return needHelp?(telemetry2.trackCliFlagHelp("buy",subcommandOriginal),printHelp(proSubcommand)):(telemetry2.trackCliSubcommandPro(subcommandOriginal),pro(client,args));case"domain":return needHelp?(telemetry2.trackCliFlagHelp("buy",subcommandOriginal),printHelp(domainSubcommand)):(telemetry2.trackCliSubcommandDomain(subcommandOriginal),domain(client,args));default:return output_manager_default.error(`Unknown subcommand: ${subcommand}`),output_manager_default.print(help(buyCommand,{columns:client.stderr.columns})),2}}var CachePurgeTelemetryClient=class extends TelemetryClient{trackCliFlagYes(yes){yes&&this.trackCliFlag("yes")}trackCliOptionType(type){type&&this.trackCliOption({option:"type",value:type})}};async function purge(client,argv){let telemetry2=new CachePurgeTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(purgeSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(err){return printError(err),2}let projectName=parsedArgs.flags["--project"];telemetry2.trackCliOptionProject(projectName);let link=await resolveProjectContext({client,projectNameOrId:projectName});if(link.status==="not_linked")return output_manager_default.error("No project linked. Run `vercel link` to link a project to this directory."),1;if(link.status==="error")return link.exitCode;let{project,org}=link;client.config.currentTeam=org.type==="team"?org.id:void 0;let yes=!!parsedArgs.flags["--yes"];telemetry2.trackCliFlagYes(yes);let type=parsedArgs.flags["--type"]||"all";telemetry2.trackCliOptionType(parsedArgs.flags["--type"]);let cacheTypeMap={cdn:"the CDN cache",data:"the Data cache",all:"the CDN cache and Data cache"},validTypes=Object.keys(cacheTypeMap);if(!validTypes.includes(type))return output_manager_default.error(`Invalid cache type "${type}". Valid types are: ${validTypes.join(", ")}`),1;let typeDesciption=cacheTypeMap[type],msg=`You are about to purge ${typeDesciption} for project ${project.name}`,query=new URLSearchParams({projectIdOrName:project.id}).toString();if(!yes){if(!process.stdin.isTTY){let projectFlag=projectName?` --project ${projectName}`:"";return output_manager_default.print(`${msg}. To continue, run ${getCommandName(`cache purge${projectFlag} --yes`)}.`),1}if(!await client.input.confirm(`${msg}. Continue?`,!0))return output_manager_default.print(`Canceled.
|
|
232
|
+
`):(output_manager_default.success(`Upgraded ${import_chalk50.default.bold(contextName)} to Vercel Pro ${purchaseStamp()}`),result.subscriptionIntent&&output_manager_default.debug(`Subscription intent: ${result.subscriptionIntent.id}`)),0}catch(err){return output_manager_default.stopSpinner(),handlePurchaseError(err,contextName,{openBrowser:!!client.stdout.isTTY})}}var import_chalk51=__toESM(require_source(),1),import_strip_ansi=__toESM(require_strip_ansi(),1),import_tldts3=__toESM(require_cjs(),1),import_error_utils6=__toESM(require_dist(),1);var DomainsBuyTelemetryClient=class extends TelemetryClient{trackCliArgumentDomain(v){v&&this.trackCliArgument({arg:"domain",value:this.redactedValue})}trackCliOptionAmount(v){this.trackRedactedCliOption("amount",v)}trackCliFlagUseBillingDetails(v){v&&this.trackCliFlag("use-billing-details")}trackCliOptionFirstName(v){this.trackRedactedCliOption("first-name",v)}trackCliOptionLastName(v){this.trackRedactedCliOption("last-name",v)}trackCliOptionEmail(v){this.trackRedactedCliOption("email",v)}trackCliOptionPhone(v){this.trackRedactedCliOption("phone",v)}trackCliOptionAddress(v){this.trackRedactedCliOption("address",v)}trackCliOptionCity(v){this.trackRedactedCliOption("city",v)}trackCliOptionState(v){this.trackRedactedCliOption("state",v)}trackCliOptionZip(v){this.trackRedactedCliOption("zip",v)}trackCliOptionCountry(v){this.trackRedactedCliOption("country",v)}trackCliOptionCompany(v){this.trackRedactedCliOption("company",v)}trackCliFlagAutoRenew(v){v&&this.trackCliFlag("auto-renew")}trackCliFlagNoAutoRenew(v){v&&this.trackCliFlag("no-auto-renew")}trackCliFlagJson(v){v&&this.trackCliFlag("json")}};var import_build_utils=__toESM(require_build_utils(),1);var AMOUNT_PATTERN=/^\d+(\.\d{1,2})?$/,REASON_BY_CODE={UNSUPPORTED_TLD:AGENT_REASON.TLD_NOT_SUPPORTED,UNSUPPORTED_TLD_VIA_CLI:AGENT_REASON.TLD_NOT_SUPPORTED,INVALID_DOMAIN:AGENT_REASON.INVALID_DOMAIN,DOMAIN_NOT_AVAILABLE:AGENT_REASON.DOMAIN_NOT_AVAILABLE,DOMAIN_PAYMENT_ERROR:AGENT_REASON.PAYMENT_FAILED};function chargeFailureReason(err){let code2=err.code;return typeof code2=="string"&&REASON_BY_CODE[code2]||AGENT_REASON.API_ERROR}function parseAmount(raw){if(raw===void 0)return;let value=raw.trim();return!AMOUNT_PATTERN.test(value)||Number(value)<=0?new Error(`Invalid --amount "${raw}". Use the price in USD, such as 20.00.`):Number(value)}function amountMatchesPrice(amount,price2){return Math.round(amount*100)===Math.round(price2*100)}function formatAmountArg(price2){return price2.toFixed(2)}function formatTerm(years){return`${years} ${years===1?"year":"years"}`}function canPromptForCharge(client,json){return canPrompt(client)&&!process.env.CI&&!json}function chargeFlagWithValue(argv,flags){for(let arg2 of argv){if(arg2==="--")break;let name=arg2.split("=")[0];if(arg2.includes("=")&&flags.includes(name))return`${name} doesn't take a value. Pass it on its own, or leave it out${name==="--auto-renew"?" and pass --no-auto-renew":""}.`}}function chargeTeamStatus(client,teamId){let orgId=(0,import_build_utils.getPlatformEnv)("ORG_ID");return orgId&&orgId!==teamId?"conflict":scopeFlagPassed(client.argv)||orgId===teamId?"named":"unnamed"}function printChargeRecovery(headline,instruction,command2){output_manager_default.fatal(`${headline}
|
|
233
|
+
|
|
234
|
+
${instruction}:
|
|
235
|
+
${command2}`)}function writeChargeAction(client,json,payload){outputActionRequired(client,payload,1),json&&client.stdout.write(`${JSON.stringify(payload,null,2)}
|
|
236
|
+
`)}function reportUsageError(client,reason,message){let exitCode2=getExitCodeForReason(reason);return outputAgentError(client,{status:"error",reason,message},exitCode2),output_manager_default.error(message),exitCode2}function reportChargeFailure(client,json,payload,opts={}){let document={status:"error",...payload,...opts.apiMessage&&{data:{...payload.data,apiMessage:opts.apiMessage}}};outputAgentError(client,document,1),json&&client.stdout.write(`${JSON.stringify(document,null,2)}
|
|
237
|
+
`);let headline=opts.apiMessage?`${payload.message}
|
|
238
|
+
${opts.apiMessage}`:payload.message;return opts.recovery?printChargeRecovery(headline,opts.recovery.instruction,opts.recovery.command):output_manager_default.fatal(headline),1}function reportUnknownOutcome(client,json,opts){let done=opts.verb==="buy"?"was bought":"was renewed",action=opts.verb==="buy"?"purchase":"renewal";return reportChargeFailure(client,json,{reason:AGENT_REASON.UNKNOWN_OUTCOME,message:`Can't confirm whether ${opts.domain} ${done}. Check the domain before running ${opts.verb} again, or you may be charged twice.`,next:[{command:opts.inspectCommand,when:`Check whether the ${action} went through before retrying`}]},{recovery:{instruction:`Check whether the ${action} went through`,command:opts.inspectCommand}})}function refuseUnnamedTeam(client,json,opts){let{verb,domain:domain2,team}=opts,status6=chargeTeamStatus(client,team.id);if(status6==="named")return;if(status6==="conflict")return reportChargeFailure(client,json,{reason:AGENT_REASON.CONFLICT,message:`Can't ${verb} ${domain2}. VERCEL_ORG_ID names a different team than ${team.slug}, the team this run would charge. Nothing was charged.`,userActionRequired:!0,hint:"Set VERCEL_ORG_ID to the team to charge, or unset it and pass --scope with that team.",data:{domain:domain2,team:team.slug}});let message=`Can't ${verb} ${domain2} without naming the team to charge in non-interactive mode. It would charge ${team.slug}. Nothing was charged.`;return writeChargeAction(client,json,{status:AGENT_STATUS.ACTION_REQUIRED,reason:AGENT_REASON.MISSING_SCOPE,action:AGENT_ACTION.CONFIRMATION_REQUIRED,message,userActionRequired:!0,data:{domain:domain2,team:team.slug},missing:["--scope"],next:[{command:opts.nextCommand,when:`Only after a human approves charging ${team.slug}`}]}),printChargeRecovery(message,"Once a person approves the team to charge, run",opts.nextCommand),1}function reportPriceChanged(client,opts){let{verb,domain:domain2,amount,price:price2,nextCommand}=opts;return reportChargeFailure(client,opts.json,{reason:AGENT_REASON.PRICE_CHANGED,message:price2===void 0?`Can't ${verb} ${domain2}. Its price changed from ${formatUsd(amount)}. Nothing was charged.`:`Can't ${verb} ${domain2}. Its price is ${formatUsd(price2)}, not ${formatUsd(amount)}. Nothing was charged.`,userActionRequired:!0,data:price2===void 0?{domain:domain2}:{domain:domain2,amount:price2,currency:"USD"},next:[{command:nextCommand,when:price2===void 0?"Get the current price, then ask a human to approve it":`Only after a human approves the price of ${formatUsd(price2)}`}]},{recovery:{instruction:price2===void 0?"Get the current price":"Once a person approves the price, run",command:nextCommand}})}function buildBuyCommand(client,domain2,opts){let parts=[`domains buy ${domain2}`];opts.team&&parts.push(`--scope ${opts.team}`),opts.amount!==void 0&&parts.push(`--amount ${formatAmountArg(opts.amount)}`),opts.useBilling&&parts.push("--use-billing-details");for(let{field,flag}of CONTACT_FIELDS){let value=opts.contact[field];value!==void 0?parts.push(`${flag} ${quoteArg(value)}`):opts.missing.includes(field)&&parts.push(`${flag} <${flag.slice(2)}>`)}return opts.autoRenew===!0&&parts.push("--auto-renew"),opts.autoRenew===!1&&parts.push("--no-auto-renew"),opts.json&&parts.push("--json"),buildCommandWithGlobalFlags(client.argv,parts.join(" "))}function flagFor(field){return CONTACT_FIELDS.find(f=>f.field===field).flag}function usageError(client,message){return reportUsageError(client,AGENT_REASON.INVALID_ARGUMENTS,message)}async function buy(client,argv){let telemetry2=new DomainsBuyTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(buySubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return client.nonInteractive&&outputAgentError(client,{status:"error",reason:"invalid_arguments",message:error instanceof Error?error.message:String(error)},2),printError(error),2}let{args,flags}=parsedArgs,[domainName]=args;if(telemetry2.trackCliArgumentDomain(domainName),telemetry2.trackCliOptionAmount(flags["--amount"]),telemetry2.trackCliFlagUseBillingDetails(flags["--use-billing-details"]),telemetry2.trackCliOptionFirstName(flags["--first-name"]),telemetry2.trackCliOptionLastName(flags["--last-name"]),telemetry2.trackCliOptionEmail(flags["--email"]),telemetry2.trackCliOptionPhone(flags["--phone"]),telemetry2.trackCliOptionAddress(flags["--address"]),telemetry2.trackCliOptionCity(flags["--city"]),telemetry2.trackCliOptionState(flags["--state"]),telemetry2.trackCliOptionZip(flags["--zip"]),telemetry2.trackCliOptionCountry(flags["--country"]),telemetry2.trackCliOptionCompany(flags["--company"]),telemetry2.trackCliFlagAutoRenew(flags["--auto-renew"]),telemetry2.trackCliFlagNoAutoRenew(flags["--no-auto-renew"]),telemetry2.trackCliOptionFormat(flags["--format"]),telemetry2.trackCliFlagJson(flags["--json"]),!domainName){if(client.nonInteractive){let globalFlags=getGlobalFlagsFromArgs(client.argv.slice(2)),cmd2=getCommandNamePlain(`domains buy <domain> ${globalFlags.join(" ")}`.trim());outputAgentError(client,{status:"error",reason:"missing_arguments",message:`Missing domain name. Run: ${cmd2}`,next:[{command:cmd2,when:"Replace <domain> with the domain to buy"}]},2)}return output_manager_default.error(`Missing domain name. Run ${getCommandName("domains --help")}`),2}if(args.length>1){let extra=args[1].toLowerCase();return usageError(client,extra==="true"||extra==="false"?"Unexpected extra argument. On/off options like --auto-renew don't take a value: pass --auto-renew or --no-auto-renew.":'Unexpected extra argument. domains buy takes one domain; quote option values that contain spaces, like --address "1 Main St".')}let formatResult=validateJsonOutput(flags);if(!formatResult.valid)return usageError(client,formatResult.error);let asJson=formatResult.jsonOutput,{domain:rootDomain,subdomain}=(0,import_tldts3.parse)(domainName);if(subdomain||!rootDomain)return client.nonInteractive&&outputAgentError(client,{status:"error",reason:"invalid_domain",message:`Invalid domain name '${domainName}'. Use a registrable root domain (no subdomain).`},1),output_manager_default.error(`Invalid domain name "${domainName}". Run ${getCommandName("domains --help")}`),1;let amount=parseAmount(flags["--amount"]);if(amount instanceof Error)return usageError(client,amount.message);let fromFlags=readContactFlags(flags);if(typeof fromFlags=="string")return usageError(client,fromFlags);let valuedFlag=chargeFlagWithValue(argv,["--auto-renew","--no-auto-renew","--use-billing-details"]);if(valuedFlag)return usageError(client,valuedFlag);let useBilling=!!flags["--use-billing-details"];if(flags["--auto-renew"]&&flags["--no-auto-renew"])return usageError(client,"Can't use --auto-renew with --no-auto-renew.");let autoRenewChoice=flags["--auto-renew"]?!0:flags["--no-auto-renew"]?!1:void 0,{contextName,team}=await getScope(client),availableStamp=stamp_default(),[domainPrice,domainStatus]=await Promise.all([getDomainPrice(client,domainName),getDomainStatus(client,domainName)]);if(domainPrice instanceof Error)return reportChargeFailure(client,asJson,{reason:chargeFailureReason(domainPrice),message:domainPrice.message});if(!domainStatus.available)return reportChargeFailure(client,asJson,{reason:AGENT_REASON.DOMAIN_NOT_AVAILABLE,message:`The domain ${domainName} is unavailable.`});let{years,purchasePrice,renewalPrice}=domainPrice;if(purchasePrice===null||renewalPrice===null)return reportChargeFailure(client,asJson,{reason:AGENT_REASON.API_ERROR,message:`The price of ${domainName} was not found.`});output_manager_default.log(`The domain ${param(domainName)} is ${import_chalk51.default.underline("available")} to buy under ${import_chalk51.default.bold(contextName)}! ${availableStamp()}`);let billing=getBillingContact(team),contact=mergeContact(fromFlags,useBilling?billing:{}),commandOptions={team:team?.slug,useBilling,contact:fromFlags,autoRenew:autoRenewChoice,json:asJson};if(amount!==void 0&&!amountMatchesPrice(amount,purchasePrice))return reportPriceChanged(client,{verb:"buy",domain:domainName,amount,price:purchasePrice,nextCommand:buildBuyCommand(client,domainName,{...commandOptions,amount:purchasePrice,missing:missingContactFields(contact)}),json:asJson});let autoRenew2,contactInformation;if(canPromptForCharge(client,asJson)){if(amount===void 0&&!await client.input.confirm(`Buy now for ${import_chalk51.default.bold(formatUsd(purchasePrice))} (${formatTerm(years)})?`,!1))return 0;autoRenew2=autoRenewChoice??await client.input.confirm(years===1?`Auto renew yearly for ${import_chalk51.default.bold(formatUsd(renewalPrice))}?`:`Auto renew every ${years} years for ${import_chalk51.default.bold(formatUsd(renewalPrice))}?`,!0),contactInformation=await collectContactInformation(client,{provided:contact,defaults:mergeContact(fromFlags,billing)})}else{let missing=missingContactFields(contact);if(amount===void 0||missing.length>0||autoRenewChoice===void 0)return requireApproval(client,{domain:domainName,team:team?.slug,contextName,price:purchasePrice,renewalPrice,years,amount,fromFlags,billing,useBilling,autoRenew:autoRenewChoice,json:asJson});if(team){let refused=refuseUnnamedTeam(client,asJson,{verb:"buy",domain:domainName,team,nextCommand:buildBuyCommand(client,domainName,{...commandOptions,amount,missing:[]})});if(refused!==void 0)return refused}autoRenew2=autoRenewChoice,contactInformation={...contact,companyName:contact.companyName||void 0}}let inspectCommand2=buildCommandWithGlobalFlags(client.argv,`domains inspect ${domainName}`),buyResult,purchaseStamp=stamp_default();output_manager_default.spinner("Purchasing");try{buyResult=await purchaseDomain(client,domainName,purchasePrice,years,autoRenew2,contactInformation)}catch(err){output_manager_default.stopSpinner(),output_manager_default.debug(`Server response: ${(0,import_error_utils6.errorToString)(err)}`);let apiError=isAPIError(err)?err:void 0;return reportChargeFailure(client,asJson,{reason:AGENT_REASON.API_ERROR,message:apiError?`Couldn't buy ${domainName}. The API returned an error (${apiError.code}). Nothing was charged.`:`Couldn't buy ${domainName}. The order wasn't sent, so nothing was charged.`},{apiMessage:apiError?.serverMessage})}return output_manager_default.stopSpinner(),buyResult instanceof DomainPriceChanged?reportPriceChanged(client,{verb:"buy",domain:domainName,amount:purchasePrice,nextCommand:buildBuyCommand(client,domainName,{...commandOptions,missing:[]}),json:asJson}):buyResult instanceof DomainChargeOutcomeUnknown?reportUnknownOutcome(client,asJson,{verb:"buy",domain:domainName,inspectCommand:inspectCommand2}):buyResult instanceof Error?reportChargeFailure(client,asJson,{reason:chargeFailureReason(buyResult),message:buyResult.message}):asJson?(client.stdout.write(`${JSON.stringify({status:AGENT_STATUS.OK,domain:domainName,years,charge:{amount:purchasePrice,currency:"USD"},orderId:buyResult.orderId,autoRenew:autoRenew2,renewalPrice,message:`Domain ${domainName} purchased.`},null,2)}
|
|
239
|
+
`),0):(client.stdout.write(`${domainName}
|
|
240
|
+
`),output_manager_default.success(`Domain ${param(domainName)} purchased ${purchaseStamp()}`),output_manager_default.log(`Charged ${formatUsd(purchasePrice)} for ${formatTerm(years)}. Registered to ${contactInformation.firstName} ${contactInformation.lastName} (${contactInformation.email}).`),output_manager_default.note(`You may now use your domain as an alias to your deployments. Run ${getCommandName("alias --help")}`),0)}function requireApproval(client,opts){let{domain:domain2,price:price2,renewalPrice,years,billing,autoRenew:autoRenew2}=opts,shown=billingFieldsUsed(opts.fromFlags,billing),shownFields=CONTACT_FIELDS.filter(({field})=>shown[field]),hasBilling=shownFields.length>0,useBilling=opts.useBilling||hasBilling,missing=missingContactFields(mergeContact(opts.fromFlags,useBilling?billing:{})),missingFlags=missing.map(flagFor),missingNow=missingContactFields(mergeContact(opts.fromFlags,opts.useBilling?billing:{})),needs=[...opts.amount===void 0?["an approved price (--amount)"]:[],...autoRenew2===void 0?["an auto-renew choice (--auto-renew or --no-auto-renew)"]:[],...missingNow.length>0?["registrant details"]:[]],headline=`Can't buy ${domain2} without ${needs.join(" and ")} in non-interactive mode.`,every=years===1?"year":formatTerm(years),renewal=autoRenew2===void 0?`Auto-renew isn't chosen: --auto-renew renews it every ${every} (currently ${formatUsd(renewalPrice)}), --no-auto-renew lets it expire.`:autoRenew2?`Then it auto-renews every ${every} (currently ${formatUsd(renewalPrice)}).`:"Auto-renew is off.",priceLine=`Price: ${formatUsd(price2)} for ${formatTerm(years)}, charged to ${opts.contextName}. ${renewal}`,stillNeeded=missingFlags.length>0?`Still needed: ${missingFlags.join(", ")}.`:"",next=(autoRenew2===void 0?[!0,!1]:[autoRenew2]).map(renews=>({command:buildBuyCommand(client,domain2,{team:opts.team,amount:price2,useBilling,contact:opts.fromFlags,missing,autoRenew:renews,json:opts.json}),when:`Only after a human approves: charges ${formatUsd(price2)} now${renews?` and renews every ${every} (currently ${formatUsd(renewalPrice)})`:", with no renewal"}`}));writeChargeAction(client,opts.json,{status:AGENT_STATUS.ACTION_REQUIRED,reason:opts.amount===void 0||autoRenew2===void 0?AGENT_REASON.CONFIRMATION_REQUIRED:AGENT_REASON.MISSING_REQUIREMENTS,action:AGENT_ACTION.CONFIRMATION_REQUIRED,message:[headline,priceLine,hasBilling?`The team's billing info has the registrant ${shownFields.map(({label})=>label.toLowerCase()).join(", ")} (data.billingDetails). Confirm them with the user; --use-billing-details uses them, and any contact option you pass replaces them.`:"",stillNeeded].filter(Boolean).join(" "),userActionRequired:!0,hint:"Show the user the price, renewal terms, and registrant details, and get their approval before running next[]. Domain registrations are non-refundable.",data:{domain:domain2,...opts.team&&{team:opts.team},amount:price2,currency:"USD",years,autoRenew:autoRenew2??null,renewalAmount:renewalPrice,...hasBilling&&{billingDetails:shown}},missing:[...opts.amount===void 0?["--amount"]:[],...autoRenew2===void 0?["--auto-renew|--no-auto-renew"]:[],...useBilling&&!opts.useBilling?["--use-billing-details"]:[],...missingFlags],next});let billingRows=hasBilling?[`From ${opts.contextName}'s billing info:`,...shownFields.map(({field,label})=>` ${label.padEnd(10)}${(0,import_strip_ansi.default)(shown[field])}`)]:[];return printChargeRecovery([headline,priceLine,...billingRows,stillNeeded].filter(Boolean).join(`
|
|
241
|
+
`),next.length>1?"Once a person approves the price, details, and auto-renew choice, run one of":"Once a person approves the price and details, run",next.map(({command:command2})=>command2).join(`
|
|
242
|
+
`)),1}async function domain(client,argv){return buy(client,argv)}var BuyTelemetryClient=class extends TelemetryClient{trackCliSubcommandCredits(actual){this.trackCliSubcommand({subcommand:"credits",value:actual})}trackCliSubcommandAddon(actual){this.trackCliSubcommand({subcommand:"addon",value:actual})}trackCliSubcommandPro(actual){this.trackCliSubcommand({subcommand:"pro",value:actual})}trackCliSubcommandDomain(actual){this.trackCliSubcommand({subcommand:"domain",value:actual})}};var COMMAND_CONFIG17={credits:getCommandAliases(creditsSubcommand),addon:getCommandAliases(addonSubcommand),pro:getCommandAliases(proSubcommand),domain:getCommandAliases(domainSubcommand)};async function main4(client){let parsedArgs,flagsSpecification=getFlagsSpecification(buyCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(error){return printError(error),2}let telemetry2=new BuyTelemetryClient({opts:{store:client.telemetryEventStore}}),{subcommand,args,subcommandOriginal}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG17),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("buy"),output_manager_default.print(help(buyCommand,{columns:client.stderr.columns})),0;function printHelp(command2){return output_manager_default.print(help(command2,{parent:buyCommand,columns:client.stderr.columns})),0}if(!subcommand)return output_manager_default.print(help(buyCommand,{columns:client.stderr.columns})),2;switch(subcommand){case"credits":return needHelp?(telemetry2.trackCliFlagHelp("buy",subcommandOriginal),printHelp(creditsSubcommand)):(telemetry2.trackCliSubcommandCredits(subcommandOriginal),credits(client,args));case"addon":return needHelp?(telemetry2.trackCliFlagHelp("buy",subcommandOriginal),printHelp(addonSubcommand)):(telemetry2.trackCliSubcommandAddon(subcommandOriginal),addon(client,args));case"pro":return needHelp?(telemetry2.trackCliFlagHelp("buy",subcommandOriginal),printHelp(proSubcommand)):(telemetry2.trackCliSubcommandPro(subcommandOriginal),pro(client,args));case"domain":return needHelp?(telemetry2.trackCliFlagHelp("buy",subcommandOriginal),printHelp(domainSubcommand)):(telemetry2.trackCliSubcommandDomain(subcommandOriginal),domain(client,args));default:return output_manager_default.error(`Unknown subcommand: ${subcommand}`),output_manager_default.print(help(buyCommand,{columns:client.stderr.columns})),2}}var CachePurgeTelemetryClient=class extends TelemetryClient{trackCliFlagYes(yes){yes&&this.trackCliFlag("yes")}trackCliOptionType(type){type&&this.trackCliOption({option:"type",value:type})}};async function purge(client,argv){let telemetry2=new CachePurgeTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(purgeSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(err){return printError(err),2}let projectName=parsedArgs.flags["--project"];telemetry2.trackCliOptionProject(projectName);let link=await resolveProjectContext({client,projectNameOrId:projectName});if(link.status==="not_linked")return output_manager_default.error("No project linked. Run `vercel link` to link a project to this directory."),1;if(link.status==="error")return link.exitCode;let{project,org}=link;client.config.currentTeam=org.type==="team"?org.id:void 0;let yes=!!parsedArgs.flags["--yes"];telemetry2.trackCliFlagYes(yes);let type=parsedArgs.flags["--type"]||"all";telemetry2.trackCliOptionType(parsedArgs.flags["--type"]);let cacheTypeMap={cdn:"the CDN cache",data:"the Data cache",all:"the CDN cache and Data cache"},validTypes=Object.keys(cacheTypeMap);if(!validTypes.includes(type))return output_manager_default.error(`Invalid cache type "${type}". Valid types are: ${validTypes.join(", ")}`),1;let typeDesciption=cacheTypeMap[type],msg=`You are about to purge ${typeDesciption} for project ${project.name}`,query=new URLSearchParams({projectIdOrName:project.id}).toString();if(!yes){if(!process.stdin.isTTY){let projectFlag=projectName?` --project ${projectName}`:"";return output_manager_default.print(`${msg}. To continue, run ${getCommandName(`cache purge${projectFlag} --yes`)}.`),1}if(!await client.input.confirm(`${msg}. Continue?`,!0))return output_manager_default.print(`Canceled.
|
|
233
243
|
`),0}let requests=[];return(type==="cdn"||type==="all")&&requests.push(client.fetch(`/v1/edge-cache/purge-all?${query}`,{method:"POST",headers:{"Content-Type":"application/json"}})),(type==="data"||type==="all")&&requests.push(client.fetch(`/v1/data-cache/purge-all?${query}`,{method:"DELETE",headers:{"Content-Type":"application/json"}})),await Promise.all(requests),output_manager_default.print(prependEmoji(`Successfully purged ${typeDesciption}`,emoji("success"))+`
|
|
234
244
|
`),0}var CacheInvalidateTelemetryClient=class extends TelemetryClient{trackCliFlagYes(yes){yes&&this.trackCliFlag("yes")}trackCliOptionTag(tag){tag&&this.trackCliOption({option:"tag",value:tag})}trackCliOptionSrcimg(srcimg){srcimg&&this.trackCliOption({option:"srcimg",value:srcimg})}};var import_pluralize2=__toESM(require_pluralize(),1);async function invalidate(client,argv){let telemetry2=new CacheInvalidateTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(invalidateSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(err){return printError(err),2}let projectName=parsedArgs.flags["--project"];telemetry2.trackCliOptionProject(projectName);let link=await resolveProjectContext({client,projectNameOrId:projectName});if(link.status==="not_linked")return output_manager_default.error("No project linked. Run `vercel link` to link a project to this directory."),1;if(link.status==="error")return link.exitCode;let{project,org}=link;client.config.currentTeam=org.type==="team"?org.id:void 0;let yes=!!parsedArgs.flags["--yes"],tag=parsedArgs.flags["--tag"],srcimg=parsedArgs.flags["--srcimg"];if(telemetry2.trackCliFlagYes(yes),telemetry2.trackCliOptionTag(tag),telemetry2.trackCliOptionSrcimg(srcimg),tag&&srcimg)return output_manager_default.error("Cannot use both --tag and --srcimg options"),2;let itemName="",itemValue="",flag="",postUrl="",postBody={};if(tag)itemName=(0,import_pluralize2.default)("tag",tag.split(",").length,!1),itemValue=tag,flag="--tag",postUrl="/v1/edge-cache/invalidate-by-tags",postBody={tags:tag};else if(srcimg)itemName="source image",itemValue=srcimg,flag="--srcimg",postUrl="/v1/edge-cache/invalidate-by-src-images",postBody={srcImages:[srcimg]};else return output_manager_default.error("The --tag or --srcimg option is required"),2;let msg=`You are about to invalidate all cached content associated with ${itemName} ${itemValue} for project ${project.name}`;if(!yes){if(!process.stdin.isTTY){let projectFlag=projectName?` --project ${projectName}`:"";return output_manager_default.print(`${msg}. To continue, run ${getCommandName(`cache invalidate ${flag} ${itemValue}${projectFlag} --yes`)}.`),1}if(!await client.input.confirm(`${msg}. Continue?`,!0))return output_manager_default.print(`Canceled.
|
|
235
245
|
`),0}return await client.fetch(`${postUrl}?projectIdOrName=${project.id}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(postBody)}),output_manager_default.print(prependEmoji(`Successfully invalidated all cached content associated with ${itemName} ${itemValue}`,emoji("success"))+`
|
|
236
246
|
`),0}var CacheDangerouslyDeleteTelemetryClient=class extends TelemetryClient{trackCliFlagYes(yes){yes&&this.trackCliFlag("yes")}trackCliOptionTag(tag){tag&&this.trackCliOption({option:"tag",value:tag})}trackCliOptionSrcimg(srcimg){srcimg&&this.trackCliOption({option:"srcimg",value:srcimg})}trackCliOptionRevalidationDeadlineSeconds(seconds){seconds&&this.trackCliOption({option:"revalidation-deadline-seconds",value:seconds?.toString()})}};var import_pluralize3=__toESM(require_pluralize(),1);async function dangerouslyDelete(client,argv){let telemetry2=new CacheDangerouslyDeleteTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(dangerouslyDeleteSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(err){return printError(err),2}let projectName=parsedArgs.flags["--project"];telemetry2.trackCliOptionProject(projectName);let link=await resolveProjectContext({client,projectNameOrId:projectName});if(link.status==="not_linked")return output_manager_default.error("No project linked. Run `vercel link` to link a project to this directory."),1;if(link.status==="error")return link.exitCode;let{project,org}=link;client.config.currentTeam=org.type==="team"?org.id:void 0;let yes=!!parsedArgs.flags["--yes"],tag=parsedArgs.flags["--tag"],srcimg=parsedArgs.flags["--srcimg"],revalidate=parsedArgs.flags["--revalidation-deadline-seconds"];if(telemetry2.trackCliFlagYes(yes),telemetry2.trackCliOptionTag(tag),telemetry2.trackCliOptionSrcimg(srcimg),telemetry2.trackCliOptionRevalidationDeadlineSeconds(revalidate),tag&&srcimg)return output_manager_default.error("Cannot use both --tag and --srcimg options"),2;let itemName="",itemValue="",flag="",postUrl="",postBody={};if(tag)itemName=(0,import_pluralize3.default)("tag",tag.split(",").length,!1),itemValue=tag,flag="--tag",postUrl="/v1/edge-cache/dangerously-delete-by-tags",postBody={tags:tag,revalidationDeadlineSeconds:revalidate};else if(srcimg)itemName="source image",itemValue=srcimg,flag="--srcimg",postUrl="/v1/edge-cache/dangerously-delete-by-src-images",postBody={srcImages:[srcimg],revalidationDeadlineSeconds:revalidate};else return output_manager_default.error("The --tag or --srcimg option is required"),2;let msg=`You are about to dangerously delete all cached content associated with ${itemName} ${itemValue} for project ${project.name}`;if(!yes){if(!process.stdin.isTTY){let projectFlag=projectName?` --project ${projectName}`:"",optional=typeof revalidate<"u"?` --revalidation-deadline-seconds ${revalidate}`:"";return output_manager_default.print(`${msg}. To continue, run ${getCommandName(`cache dangerously-delete ${flag} ${itemValue}${projectFlag}${optional} --yes`)}.`),1}if(!await client.input.confirm(`${msg}. Continue?`,!0))return output_manager_default.print(`Canceled.
|
|
237
247
|
`),0}return await client.fetch(`${postUrl}?projectIdOrName=${project.id}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(postBody)}),output_manager_default.print(prependEmoji(`Successfully deleted all cached content associated with ${itemName} ${itemValue}`,emoji("success"))+`
|
|
238
|
-
`),0}var CacheTelemetryClient=class extends TelemetryClient{trackCliSubcommandPurge(actual){this.trackCliSubcommand({subcommand:"purge",value:actual})}trackCliSubcommandInvalidate(actual){this.trackCliSubcommand({subcommand:"invalidate",value:actual})}trackCliSubcommandDangerouslyDelete(actual){this.trackCliSubcommand({subcommand:"dangerously-delete",value:actual})}};var COMMAND_CONFIG18={purge:getCommandAliases(purgeSubcommand),invalidate:getCommandAliases(invalidateSubcommand),"dangerously-delete":getCommandAliases(dangerouslyDeleteSubcommand)};async function main5(client){let telemetry2=new CacheTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(cacheCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),2}let subArgs=parsedArgs.args.slice(1),{subcommand,args,subcommandOriginal}=getSubcommand7(subArgs,COMMAND_CONFIG18),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp(cacheCommand.name),output_manager_default.print(help(cacheCommand,{columns:client.stderr.columns})),0;function printHelp(command2){telemetry2.trackCliFlagHelp(command2.name,subcommandOriginal),output_manager_default.print(help(command2,{parent:cacheCommand,columns:client.stderr.columns}))}switch(subcommand){case"purge":return needHelp?(printHelp(purgeSubcommand),0):(telemetry2.trackCliSubcommandPurge(subcommandOriginal),purge(client,args));case"invalidate":return needHelp?(printHelp(invalidateSubcommand),0):(telemetry2.trackCliSubcommandInvalidate(subcommandOriginal),invalidate(client,args));case"dangerously-delete":return needHelp?(printHelp(dangerouslyDeleteSubcommand),0):(telemetry2.trackCliSubcommandDangerouslyDelete(subcommandOriginal),dangerouslyDelete(client,args));default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG18)),output_manager_default.print(help(cacheCommand,{columns:client.stderr.columns})),2}}var import_chalk52=__toESM(require_source(),1),
|
|
248
|
+
`),0}var CacheTelemetryClient=class extends TelemetryClient{trackCliSubcommandPurge(actual){this.trackCliSubcommand({subcommand:"purge",value:actual})}trackCliSubcommandInvalidate(actual){this.trackCliSubcommand({subcommand:"invalidate",value:actual})}trackCliSubcommandDangerouslyDelete(actual){this.trackCliSubcommand({subcommand:"dangerously-delete",value:actual})}};var COMMAND_CONFIG18={purge:getCommandAliases(purgeSubcommand),invalidate:getCommandAliases(invalidateSubcommand),"dangerously-delete":getCommandAliases(dangerouslyDeleteSubcommand)};async function main5(client){let telemetry2=new CacheTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(cacheCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),2}let subArgs=parsedArgs.args.slice(1),{subcommand,args,subcommandOriginal}=getSubcommand7(subArgs,COMMAND_CONFIG18),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp(cacheCommand.name),output_manager_default.print(help(cacheCommand,{columns:client.stderr.columns})),0;function printHelp(command2){telemetry2.trackCliFlagHelp(command2.name,subcommandOriginal),output_manager_default.print(help(command2,{parent:cacheCommand,columns:client.stderr.columns}))}switch(subcommand){case"purge":return needHelp?(printHelp(purgeSubcommand),0):(telemetry2.trackCliSubcommandPurge(subcommandOriginal),purge(client,args));case"invalidate":return needHelp?(printHelp(invalidateSubcommand),0):(telemetry2.trackCliSubcommandInvalidate(subcommandOriginal),invalidate(client,args));case"dangerously-delete":return needHelp?(printHelp(dangerouslyDeleteSubcommand),0):(telemetry2.trackCliSubcommandDangerouslyDelete(subcommandOriginal),dangerouslyDelete(client,args));default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG18)),output_manager_default.print(help(cacheCommand,{columns:client.stderr.columns})),2}}var import_chalk52=__toESM(require_source(),1),import_strip_ansi2=__toESM(require_strip_ansi(),1);var ChangelogTelemetryClient=class extends TelemetryClient{trackCliSubcommandSearch(actual){this.trackCliSubcommand({subcommand:"search",value:actual})}trackCliOptionLimit(limit){limit!==void 0&&this.trackCliOption({option:"limit",value:String(limit)})}trackCliOptionFormat(format3){format3&&this.trackCliOption({option:"format",value:format3})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var CHANGELOG_API_URL="https://vercel.com/api/changelog",DEFAULT_LIMIT=5,MAX_LIMIT=20,COMMAND_CONFIG19={search:getCommandAliases(searchSubcommand2)};function cleanLine(value){return(0,import_strip_ansi2.default)(value).replace(/\s+/g," ").trim()}function formatDate2(value){let date=new Date(value);return Number.isNaN(date.getTime())?"":new Intl.DateTimeFormat("en-US",{month:"short",day:"numeric",timeZone:"UTC"}).format(date)}function isChangelogItem(value){if(!value||typeof value!="object")return!1;let item=value;return Array.isArray(item.authors)&&item.authors.every(author=>typeof author=="string")&&(item.content===void 0||typeof item.content=="string")&&typeof item.publishedAt=="string"&&typeof item.slug=="string"&&(typeof item.summary=="string"||item.summary===null)&&typeof item.title=="string"&&typeof item.url=="string"}function printEntries(items){let entries=items.map(item=>{let lines=[` ${formatDate2(item.publishedAt).padEnd(6)} ${cleanLine(item.title)}`,` ${import_chalk52.default.cyan(cleanLine(item.url))}`],content=item.content?(0,import_strip_ansi2.default)(item.content).trim():"";return content&&lines.push("",content),lines.join(`
|
|
239
249
|
`)});output_manager_default.print(`${entries.join(`
|
|
240
250
|
|
|
241
251
|
`)}
|
|
242
|
-
`)}async function fetchEntries(query,limit){let url=new URL(query?`${CHANGELOG_API_URL}/search`:CHANGELOG_API_URL);url.searchParams.set("limit",String(limit)),query?url.searchParams.set("q",query):url.searchParams.set("include","content");try{let response=await fetch2(url,{headers:{accept:"application/json","user-agent":ua_default}});if(!response.ok){response.status===429?output_manager_default.error("Too many changelog requests. Try again shortly."):output_manager_default.error("Failed to fetch changelog entries.");return}let data=await response.json();if(!data||typeof data!="object")throw new Error("Invalid changelog response");let items=data.items;if(!Array.isArray(items)||!items.every(isChangelogItem))throw new Error("Invalid changelog response");return items}catch{output_manager_default.error("Failed to fetch changelog entries. Check your connection and try again.");return}}function printCommandHelp(client,command2){output_manager_default.print(help(command2,{columns:client.stderr.columns,parent:command2===changelogCommand?void 0:changelogCommand}))}async function changelog(client){let telemetry2=new ChangelogTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(changelogCommand.options),rawArgs=client.argv.slice(2).filter(arg2=>arg2!=="--changelog"),parsedArgs;try{parsedArgs=parseArguments(rawArgs,flagsSpecification)}catch(err){return printError(err),2}let commandOffset=parsedArgs.args[0]===changelogCommand.name?1:0,{subcommand,args,subcommandOriginal}=getSubcommand7(parsedArgs.args.slice(commandOffset),COMMAND_CONFIG19);if(parsedArgs.flags["--help"])return telemetry2.trackCliFlagHelp(changelogCommand.name,subcommand==="search"?subcommandOriginal:void 0),printCommandHelp(client,subcommand==="search"?
|
|
252
|
+
`)}async function fetchEntries(query,limit){let url=new URL(query?`${CHANGELOG_API_URL}/search`:CHANGELOG_API_URL);url.searchParams.set("limit",String(limit)),query?url.searchParams.set("q",query):url.searchParams.set("include","content");try{let response=await fetch2(url,{headers:{accept:"application/json","user-agent":ua_default}});if(!response.ok){response.status===429?output_manager_default.error("Too many changelog requests. Try again shortly."):output_manager_default.error("Failed to fetch changelog entries.");return}let data=await response.json();if(!data||typeof data!="object")throw new Error("Invalid changelog response");let items=data.items;if(!Array.isArray(items)||!items.every(isChangelogItem))throw new Error("Invalid changelog response");return items}catch{output_manager_default.error("Failed to fetch changelog entries. Check your connection and try again.");return}}function printCommandHelp(client,command2){output_manager_default.print(help(command2,{columns:client.stderr.columns,parent:command2===changelogCommand?void 0:changelogCommand}))}async function changelog(client){let telemetry2=new ChangelogTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(changelogCommand.options),rawArgs=client.argv.slice(2).filter(arg2=>arg2!=="--changelog"),parsedArgs;try{parsedArgs=parseArguments(rawArgs,flagsSpecification)}catch(err){return printError(err),2}let commandOffset=parsedArgs.args[0]===changelogCommand.name?1:0,{subcommand,args,subcommandOriginal}=getSubcommand7(parsedArgs.args.slice(commandOffset),COMMAND_CONFIG19);if(parsedArgs.flags["--help"])return telemetry2.trackCliFlagHelp(changelogCommand.name,subcommand==="search"?subcommandOriginal:void 0),printCommandHelp(client,subcommand==="search"?searchSubcommand2:changelogCommand),0;if(!subcommand&&args.length>0)return output_manager_default.error(`Unknown changelog command: ${args[0]}`),printCommandHelp(client,changelogCommand),1;let limit=parsedArgs.flags["--limit"]??DEFAULT_LIMIT;if(!Number.isInteger(limit)||limit<1||limit>MAX_LIMIT)return output_manager_default.error(`--limit must be between 1 and ${MAX_LIMIT}.`),2;telemetry2.trackCliOptionLimit(parsedArgs.flags["--limit"]),telemetry2.trackCliOptionFormat(parsedArgs.flags["--format"]),telemetry2.trackCliFlagJson(parsedArgs.flags["--json"]);let formatResult=validateJsonOutput(parsedArgs.flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let jsonOutput=formatResult.jsonOutput,query;if(subcommand==="search"&&(telemetry2.trackCliSubcommandSearch(subcommandOriginal),query=args.join(" ").trim(),!query))return output_manager_default.error("Search query is required."),printCommandHelp(client,searchSubcommand2),2;jsonOutput||output_manager_default.spinner(query?"Searching the changelog\u2026":"Fetching the changelog\u2026");let items=await fetchEntries(query,limit);return jsonOutput||output_manager_default.stopSpinner(),items?jsonOutput?(client.stdout.write(`${JSON.stringify({items},null,2)}
|
|
243
253
|
`),0):items.length===0?(output_manager_default.log(query?"No changelog entries match the query.":"No changelog entries found."),0):(printEntries(items),0):1}var CiTelemetryClient=class extends TelemetryClient{trackCliSubcommandInspect(actual){this.trackCliSubcommand({subcommand:"inspect",value:actual})}trackCliSubcommandLogs(actual){this.trackCliSubcommand({subcommand:"logs",value:actual})}trackCliSubcommandGrep(actual){this.trackCliSubcommand({subcommand:"grep",value:actual})}trackCliSubcommandRerun(actual){this.trackCliSubcommand({subcommand:"rerun",value:actual})}trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}};var import_chalk54=__toESM(require_source(),1),import_ms9=__toESM(require_ms(),1),import_pluralize4=__toESM(require_pluralize(),1);var import_split2=__toESM(require_split2(),1);import{Transform}from"node:stream";import{pipeline as pipeline3}from"node:stream/promises";async function*readNdjson(client,url,options={}){let response=await client.fetch(url,{json:!1,accountId:options.accountId,signal:options.signal}),source=toNodeReadable(response.body),maxFrameBytes=8*1024*1024,frameBytes=0,bounded=new Transform({transform(chunk,_encoding,callback){let start=0;for(;start<chunk.length;){let newline=chunk.indexOf(10,start),end=newline===-1?chunk.length:newline;if(frameBytes+=end-start,frameBytes>maxFrameBytes){callback(new Error("Vercel CI response frame exceeds 8 MiB."));return}if(newline===-1)break;frameBytes=0,start=newline+1}callback(null,chunk)}}),lines=(0,import_split2.default)(),completion=pipeline3(source,bounded,lines,{signal:options.signal}).then(()=>{},error=>error);try{let snapshot=response.headers.get("content-type")?.split(";")[0]==="application/json",json="",bytes5=0;for await(let line2 of lines)if(snapshot){if(bytes5+=Buffer.byteLength(line2)+1,bytes5>8*1024*1024)throw new Error("Vercel CI JSON snapshot exceeds 8 MiB.");json+=`${line2}
|
|
244
|
-
`}else line2.trim()&&(yield JSON.parse(line2));let error=await completion;if(error)throw error;snapshot&&(yield JSON.parse(json))}finally{source.destroy(),bounded.destroy(),lines.destroy(),await completion}}async function resolveCiTeam(_client){return{ok:!0}}function listCiInvocations(client,params,accountId){let query=new URLSearchParams({provider:params.provider,repository:params.repository});params.branch&&query.set("branchName",params.branch),params.commitSha&&query.set("snapshot",params.commitSha);for(let status6 of params.statuses??[])query.append("status",status6);for(let conclusion2 of params.conclusions??[])query.append("conclusion",conclusion2);return params.limit&&query.set("limit",String(params.limit)),params.cursor&&query.set("cursor",params.cursor),client.fetch(`/v2/vercel-ci/invocations?${query}`,{accountId})}function getCiInvocationTree(client,invocationId,options={}){let query=new URLSearchParams;options.attempt&&query.set("attempt",String(options.attempt));let suffix=query.size?`?${query}`:"";return client.fetch(`/v1/vercel-ci/invocations/${encodeURIComponent(invocationId)}/tree${suffix}`,{accountId:options.accountId})}function streamCiInvocationTree(client,invocationId,options){let query=new URLSearchParams({attempt:String(options.attempt),follow:"1"});return readNdjson(client,`/v1/vercel-ci/invocations/${encodeURIComponent(invocationId)}/tree?${query}`,{accountId:options.accountId,signal:options.signal})}async function getLatestCiAttempt(client,invocationId,accountId){let{attempts}=await client.fetch(`/v1/vercel-ci/invocations/${encodeURIComponent(invocationId)}/attempts`,{accountId});return Math.max(1,...attempts.map(attempt=>attempt.attempt))}function searchCiLogs(client,runs,filters,accountId){let query=new URLSearchParams;for(let run3 of runs)query.append("invocation",`${run3.invocationId}:${run3.attempt}`);query.set("search",filters.search);for(let level of filters.levels??[])query.append("level",level);return client.fetch(`/v1/vercel-ci/log-search?${query}`,{accountId})}function getCiTaskLogs(client,invocationId,attempt,filters,accountId){let query=new URLSearchParams;for(let task of filters.tasks??[])query.append("task",task);for(let conclusion2 of filters.conclusions??[])query.append("conclusion",conclusion2);for(let level of filters.levels??[])query.append("level",level);filters.search&&query.set("search",filters.search),filters.limit&&query.set("limit",String(filters.limit));let suffix=query.size?`?${query}`:"";return client.fetch(`/v1/vercel-ci/invocations/${encodeURIComponent(invocationId)}/attempts/${attempt}/task-logs${suffix}`,{accountId})}function streamCiTaskRunLogs(client,locator,options){let query=new URLSearchParams({follow:"1"});options.since!==void 0&&query.set("since",String(options.since));for(let level of options.levels??[])query.append("level",level);return readNdjson(client,`${ciTaskRunLogsPath(locator)}?${query}`,{accountId:options.accountId,signal:options.signal})}async function getCiTaskRunLogs(client,locator,options={}){let query=new URLSearchParams;for(let level of options.levels??[])query.append("level",level);let suffix=query.size?`?${query}`:"",snapshot;for await(let value of readNdjson(client,`${ciTaskRunLogsPath(locator)}${suffix}`,{accountId:options.accountId})){if(snapshot||typeof value!="object"||value===null||!("lines"in value)||!Array.isArray(value.lines))throw new Error("Invalid Vercel CI log snapshot.");snapshot=value}if(!snapshot)throw new Error("Missing Vercel CI log snapshot.");return snapshot}function ciTaskRunLogsPath(locator){return`/v1/vercel-ci/${["invocations",locator.invocationId,"attempts",locator.attempt,"job-definitions",locator.jobDefinitionId,"runs",locator.jobRunAttempt,"task-definitions",locator.taskDefinitionId,"runs",locator.taskRunAttempt,"logs"].map(segment=>encodeURIComponent(String(segment))).join("/")}`}async function getCiSetupLogs(client,invocationId,attempt,options={}){let base=`/v1/vercel-ci/invocations/${encodeURIComponent(invocationId)}/attempts/${attempt}`,{invocation}=await client.fetch(base,{accountId:options.accountId});if(invocation.setupConclusion?.result!=="failed")return{failed:!1,lines:[]};let query=new URLSearchParams;for(let level of options.levels??[])query.append("level",level);let suffix=query.size?`?${query}`:"",{lines}=await client.fetch(`${base}/logs${suffix}`,{accountId:options.accountId});return{failed:!0,lines}}var FAILED_SETUP_STATUSES=new Set(["bootstrapping_failed","jobs_on_hive_failed"]);function getRunStatus(invocation){return invocation.runConclusion?invocation.runConclusion.result:invocation.completed?.conclusion?invocation.completed.conclusion:invocation.status==="skipped"?"skipped":FAILED_SETUP_STATUSES.has(invocation.status)?"failed":invocation.status==="completed"?"completed":invocation.status==="new"?"queued":"running"}var CI_RUN_STATUSES=["queued","running","succeeded","failed","skipped"],RUNNING_API_STATUSES=["bootstrapping","snapshotted","sandbox_named","jobs_on_hive_clone_dispatched","jobs_on_hive_dispatched","jobs_on_hive_completed","awaiting_jobs"];function toRunStatusFilter(status6){switch(status6){case"queued":return{statuses:["new"]};case"running":return{statuses:RUNNING_API_STATUSES};case"completed":return{statuses:["completed"]};default:return{conclusions:[status6]}}}function isTerminalRunStatus(status6){return status6!=="queued"&&status6!=="running"}function toBranchName(ref){return ref.startsWith("refs/heads/")?ref.slice(11):ref}function toShortSha(sha){return sha.slice(0,7)}var RUN_ID_PREFIX="invo1_",RUN_ID_PATTERN=/^[A-Za-z0-9]+$/;function toDisplayRunId(id2){return id2.startsWith(RUN_ID_PREFIX)?id2.slice(RUN_ID_PREFIX.length):id2}function toApiRunId(input){let id2=toDisplayRunId(input.trim());return RUN_ID_PATTERN.test(id2)?`${RUN_ID_PREFIX}${id2}`:null}function toRunSummary(invocation,repositories){let repository=repositories[invocation.repositoryKey];return{id:toDisplayRunId(invocation.invocationId),attempt:invocation.attempt,status:getRunStatus(invocation),...getRunReason(invocation),repository:repository?`${repository.owner}/${repository.name}`:"",branch:toBranchName(invocation.ref),commitSha:invocation.commitSha,createdAt:toIso(invocation.createdAt)}}function getRunReason(invocation){return invocation.skipped?{reason:invocation.skipped.reason}:invocation.setupConclusion?.result==="failed"?{reason:"setup_failed"}:{}}function toRunView(tree){return{run:toRunSummary(tree.invocation,tree.repositories),jobs:tree.jobs.map(job=>({name:job.definition.name,kind:job.definition.kind,...toStepTiming(job.run),tasks:job.tasks.map(task=>({name:task.definition.name,...toStepTiming(task.run)}))}))}}function toStepTiming(run3){let startedAt=run3?.started?.startedAt,completedAt=run3?.completed?.completedAt,conclusion2=run3?.completed?.conclusion,status6="queued";return conclusion2?status6=conclusion2.result:startedAt!==void 0&&(status6="running"),{status:status6,...conclusion2&&"reason"in conclusion2?{reason:conclusion2.reason}:{},...startedAt!==void 0?{startedAt:toIso(startedAt)}:{},...completedAt!==void 0?{completedAt:toIso(completedAt)}:{},...startedAt!==void 0&&completedAt!==void 0?{durationMs:Math.max(completedAt-startedAt,0)}:{}}}function toIso(timestamp2){return new Date(timestamp2).toISOString()}function countTasks(view){let total=0,finished=0;for(let job of view.jobs)for(let task of job.tasks)total++,task.status!=="queued"&&task.status!=="running"&&finished++;return{total,finished}}var import_strip_ansi2=__toESM(require_strip_ansi(),1);function ciDisplayText(value){return Array.from((0,import_strip_ansi2.default)(value),char=>{let code2=char.codePointAt(0);return code2>=127&&code2<=159?`\\u${code2.toString(16).padStart(4,"0")}`:code2<32?JSON.stringify(char).slice(1,-1):char}).join("")}function quoteCiCommandArg(value){return/^[a-zA-Z0-9_./:@%+,=-]+$/.test(value)?value:`'${value.replace(/'/g,"'\\''")}'`}function buildCiCommand(argv,args){return getCommandNamePlain([...args,...getGlobalFlagsFromArgv(argv)].map(quoteCiCommandArg).join(" "))}var CiGrepTelemetryClient=class extends TelemetryClient{trackCliArgumentText(text3){text3&&this.trackCliArgument({arg:"text",value:this.redactedValue})}trackCliOptionBranch(branch){branch&&this.trackCliOption({option:"branch",value:this.redactedValue})}trackCliFlagAllBranches(allBranches){allBranches&&this.trackCliFlag("all-branches")}trackCliOptionStatus(status6){status6&&this.trackCliOption({option:"status",value:status6})}trackCliOptionRuns(runs){runs!==void 0&&this.trackCliOption({option:"runs",value:String(runs)})}trackCliOptionLevel(levels){levels?.length&&this.trackCliOption({option:"level",value:levels.join(",")})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var SUPPORTED_PROVIDERS=["github"];async function getCiGitContext(cwd){let git=await getGitExecutable(cwd),[remote,branch,commitSha]=await Promise.all([readGit(git,cwd,["remote","get-url","origin"]),readGit(git,cwd,["rev-parse","--abbrev-ref","HEAD"]),readGit(git,cwd,["rev-parse","HEAD"])]);if(!remote)return null;let repo=parseRepoUrl(remote),provider=SUPPORTED_PROVIDERS.find(p=>p===repo?.provider);return!repo||!provider?(output_manager_default.debug(`Unsupported Git remote for Vercel CI: ${remote}`),null):{provider,repository:`${repo.org}/${repo.repo}`,...branch&&branch!=="HEAD"?{branch}:{},...commitSha?{commitSha}:{}}}var COMMIT_SHA_PATTERN=/^[0-9a-f]{4,40}$/i;async function resolveCommitSha(cwd,value){let sha=value.trim().toLowerCase();if(!COMMIT_SHA_PATTERN.test(sha))return null;if(sha.length===40)return sha;let git=await getGitExecutable(cwd);return await readGit(git,cwd,["rev-parse","--verify","--quiet",`${sha}^{commit}`])??null}async function readGit(git,cwd,args){try{let{stdout}=await execFileAsync(git,args,{cwd});return stdout.trim()||void 0}catch(error){output_manager_default.debug(`git ${args.join(" ")} failed: ${error}`);return}}function failCi(client,failure){return shouldEmitNonInteractiveCommandError(client)?writeAgentError(client,{status:AGENT_STATUS.ERROR,...failure}):output_manager_default.fatal(failure.message),getExitCodeForReason(failure.reason)}function invalidCiArguments(client,message){return failCi(client,{reason:AGENT_REASON.INVALID_ARGUMENTS,message})}function handleCiApiError(client,action,err){if(isAPIError(err)){let detail=err.serverMessage?` ${err.serverMessage}`:"";switch(err.status){case 403:return failCi(client,{reason:AGENT_REASON.PERMISSION_DENIED,message:`Can't ${action}. You don't have access to Vercel CI runs for this team.`});case 404:return failCi(client,{reason:AGENT_REASON.CI_RUN_NOT_FOUND,message:"Couldn't find that Vercel CI run for this team."});case 429:return failCi(client,{reason:AGENT_REASON.RATE_LIMITED,message:`Failed to ${action}. Too many requests. Wait a moment, then try again.`});default:return failCi(client,{reason:AGENT_REASON.API_ERROR,message:`Failed to ${action}.${detail}`})}}throw err}async function resolveCiContext(client){let git=await getCiGitContext(client.cwd);if(!git)return failCi(client,{reason:AGENT_REASON.GIT_REPOSITORY_REQUIRED,message:"Couldn't find a supported Git repository here. Vercel CI currently supports GitHub repositories with an origin remote."});let team=await resolveCiTeam(client);return team.ok?{git,accountId:team.accountId}:team.exitCode}var import_chalk53=__toESM(require_source(),1),import_ms8=__toESM(require_ms(),1);function formatStatus2(status6){switch(status6){case"succeeded":return import_chalk53.default.green(status6);case"failed":return import_chalk53.default.red(status6);case"skipped":case"cached":return import_chalk53.default.gray(status6);default:return ciDisplayText(status6)}}function formatCiTable(headers,rows){return formatTable(headers,headers.map(()=>"l"),[{rows}]).split(`
|
|
254
|
+
`}else line2.trim()&&(yield JSON.parse(line2));let error=await completion;if(error)throw error;snapshot&&(yield JSON.parse(json))}finally{source.destroy(),bounded.destroy(),lines.destroy(),await completion}}async function resolveCiTeam(_client){return{ok:!0}}function listCiInvocations(client,params,accountId){let query=new URLSearchParams({provider:params.provider,repository:params.repository});params.branch&&query.set("branchName",params.branch),params.commitSha&&query.set("snapshot",params.commitSha);for(let status6 of params.statuses??[])query.append("status",status6);for(let conclusion2 of params.conclusions??[])query.append("conclusion",conclusion2);return params.limit&&query.set("limit",String(params.limit)),params.cursor&&query.set("cursor",params.cursor),client.fetch(`/v2/vercel-ci/invocations?${query}`,{accountId})}function getCiInvocationTree(client,invocationId,options={}){let query=new URLSearchParams;options.attempt&&query.set("attempt",String(options.attempt));let suffix=query.size?`?${query}`:"";return client.fetch(`/v1/vercel-ci/invocations/${encodeURIComponent(invocationId)}/tree${suffix}`,{accountId:options.accountId})}function streamCiInvocationTree(client,invocationId,options){let query=new URLSearchParams({attempt:String(options.attempt),follow:"1"});return readNdjson(client,`/v1/vercel-ci/invocations/${encodeURIComponent(invocationId)}/tree?${query}`,{accountId:options.accountId,signal:options.signal})}async function getLatestCiAttempt(client,invocationId,accountId){let{attempts}=await client.fetch(`/v1/vercel-ci/invocations/${encodeURIComponent(invocationId)}/attempts`,{accountId});return Math.max(1,...attempts.map(attempt=>attempt.attempt))}function searchCiLogs(client,runs,filters,accountId){let query=new URLSearchParams;for(let run3 of runs)query.append("invocation",`${run3.invocationId}:${run3.attempt}`);query.set("search",filters.search);for(let level of filters.levels??[])query.append("level",level);return client.fetch(`/v1/vercel-ci/log-search?${query}`,{accountId})}function getCiTaskLogs(client,invocationId,attempt,filters,accountId){let query=new URLSearchParams;for(let task of filters.tasks??[])query.append("task",task);for(let conclusion2 of filters.conclusions??[])query.append("conclusion",conclusion2);for(let level of filters.levels??[])query.append("level",level);filters.search&&query.set("search",filters.search),filters.limit&&query.set("limit",String(filters.limit));let suffix=query.size?`?${query}`:"";return client.fetch(`/v1/vercel-ci/invocations/${encodeURIComponent(invocationId)}/attempts/${attempt}/task-logs${suffix}`,{accountId})}function streamCiTaskRunLogs(client,locator,options){let query=new URLSearchParams({follow:"1"});options.since!==void 0&&query.set("since",String(options.since));for(let level of options.levels??[])query.append("level",level);return readNdjson(client,`${ciTaskRunLogsPath(locator)}?${query}`,{accountId:options.accountId,signal:options.signal})}async function getCiTaskRunLogs(client,locator,options={}){let query=new URLSearchParams;for(let level of options.levels??[])query.append("level",level);let suffix=query.size?`?${query}`:"",snapshot;for await(let value of readNdjson(client,`${ciTaskRunLogsPath(locator)}${suffix}`,{accountId:options.accountId})){if(snapshot||typeof value!="object"||value===null||!("lines"in value)||!Array.isArray(value.lines))throw new Error("Invalid Vercel CI log snapshot.");snapshot=value}if(!snapshot)throw new Error("Missing Vercel CI log snapshot.");return snapshot}function ciTaskRunLogsPath(locator){return`/v1/vercel-ci/${["invocations",locator.invocationId,"attempts",locator.attempt,"job-definitions",locator.jobDefinitionId,"runs",locator.jobRunAttempt,"task-definitions",locator.taskDefinitionId,"runs",locator.taskRunAttempt,"logs"].map(segment=>encodeURIComponent(String(segment))).join("/")}`}async function getCiSetupLogs(client,invocationId,attempt,options={}){let base=`/v1/vercel-ci/invocations/${encodeURIComponent(invocationId)}/attempts/${attempt}`,{invocation}=await client.fetch(base,{accountId:options.accountId});if(invocation.setupConclusion?.result!=="failed")return{failed:!1,lines:[]};let query=new URLSearchParams;for(let level of options.levels??[])query.append("level",level);let suffix=query.size?`?${query}`:"",{lines}=await client.fetch(`${base}/logs${suffix}`,{accountId:options.accountId});return{failed:!0,lines}}var FAILED_SETUP_STATUSES=new Set(["bootstrapping_failed","jobs_on_hive_failed"]);function getRunStatus(invocation){return invocation.runConclusion?invocation.runConclusion.result:invocation.completed?.conclusion?invocation.completed.conclusion:invocation.status==="skipped"?"skipped":FAILED_SETUP_STATUSES.has(invocation.status)?"failed":invocation.status==="completed"?"completed":invocation.status==="new"?"queued":"running"}var CI_RUN_STATUSES=["queued","running","succeeded","failed","skipped"],RUNNING_API_STATUSES=["bootstrapping","snapshotted","sandbox_named","jobs_on_hive_clone_dispatched","jobs_on_hive_dispatched","jobs_on_hive_completed","awaiting_jobs"];function toRunStatusFilter(status6){switch(status6){case"queued":return{statuses:["new"]};case"running":return{statuses:RUNNING_API_STATUSES};case"completed":return{statuses:["completed"]};default:return{conclusions:[status6]}}}function isTerminalRunStatus(status6){return status6!=="queued"&&status6!=="running"}function toBranchName(ref){return ref.startsWith("refs/heads/")?ref.slice(11):ref}function toShortSha(sha){return sha.slice(0,7)}var RUN_ID_PREFIX="invo1_",RUN_ID_PATTERN=/^[A-Za-z0-9]+$/;function toDisplayRunId(id2){return id2.startsWith(RUN_ID_PREFIX)?id2.slice(RUN_ID_PREFIX.length):id2}function toApiRunId(input){let id2=toDisplayRunId(input.trim());return RUN_ID_PATTERN.test(id2)?`${RUN_ID_PREFIX}${id2}`:null}function toRunSummary(invocation,repositories){let repository=repositories[invocation.repositoryKey];return{id:toDisplayRunId(invocation.invocationId),attempt:invocation.attempt,status:getRunStatus(invocation),...getRunReason(invocation),repository:repository?`${repository.owner}/${repository.name}`:"",branch:toBranchName(invocation.ref),commitSha:invocation.commitSha,createdAt:toIso(invocation.createdAt)}}function getRunReason(invocation){return invocation.skipped?{reason:invocation.skipped.reason}:invocation.setupConclusion?.result==="failed"?{reason:"setup_failed"}:{}}function toRunView(tree){return{run:toRunSummary(tree.invocation,tree.repositories),jobs:tree.jobs.map(job=>({name:job.definition.name,kind:job.definition.kind,...toStepTiming(job.run),tasks:job.tasks.map(task=>({name:task.definition.name,...toStepTiming(task.run)}))}))}}function toStepTiming(run3){let startedAt=run3?.started?.startedAt,completedAt=run3?.completed?.completedAt,conclusion2=run3?.completed?.conclusion,status6="queued";return conclusion2?status6=conclusion2.result:startedAt!==void 0&&(status6="running"),{status:status6,...conclusion2&&"reason"in conclusion2?{reason:conclusion2.reason}:{},...startedAt!==void 0?{startedAt:toIso(startedAt)}:{},...completedAt!==void 0?{completedAt:toIso(completedAt)}:{},...startedAt!==void 0&&completedAt!==void 0?{durationMs:Math.max(completedAt-startedAt,0)}:{}}}function toIso(timestamp2){return new Date(timestamp2).toISOString()}function countTasks(view){let total=0,finished=0;for(let job of view.jobs)for(let task of job.tasks)total++,task.status!=="queued"&&task.status!=="running"&&finished++;return{total,finished}}var import_strip_ansi3=__toESM(require_strip_ansi(),1);function ciDisplayText(value){return Array.from((0,import_strip_ansi3.default)(value),char=>{let code2=char.codePointAt(0);return code2>=127&&code2<=159?`\\u${code2.toString(16).padStart(4,"0")}`:code2<32?JSON.stringify(char).slice(1,-1):char}).join("")}function quoteCiCommandArg(value){return/^[a-zA-Z0-9_./:@%+,=-]+$/.test(value)?value:`'${value.replace(/'/g,"'\\''")}'`}function buildCiCommand(argv,args){return getCommandNamePlain([...args,...getGlobalFlagsFromArgv(argv)].map(quoteCiCommandArg).join(" "))}var CiGrepTelemetryClient=class extends TelemetryClient{trackCliArgumentText(text3){text3&&this.trackCliArgument({arg:"text",value:this.redactedValue})}trackCliOptionBranch(branch){branch&&this.trackCliOption({option:"branch",value:this.redactedValue})}trackCliFlagAllBranches(allBranches){allBranches&&this.trackCliFlag("all-branches")}trackCliOptionStatus(status6){status6&&this.trackCliOption({option:"status",value:status6})}trackCliOptionRuns(runs){runs!==void 0&&this.trackCliOption({option:"runs",value:String(runs)})}trackCliOptionLevel(levels){levels?.length&&this.trackCliOption({option:"level",value:levels.join(",")})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var SUPPORTED_PROVIDERS=["github"];async function getCiGitContext(cwd){let git=await getGitExecutable(cwd),[remote,branch,commitSha]=await Promise.all([readGit(git,cwd,["remote","get-url","origin"]),readGit(git,cwd,["rev-parse","--abbrev-ref","HEAD"]),readGit(git,cwd,["rev-parse","HEAD"])]);if(!remote)return null;let repo=parseRepoUrl(remote),provider=SUPPORTED_PROVIDERS.find(p=>p===repo?.provider);return!repo||!provider?(output_manager_default.debug(`Unsupported Git remote for Vercel CI: ${remote}`),null):{provider,repository:`${repo.org}/${repo.repo}`,...branch&&branch!=="HEAD"?{branch}:{},...commitSha?{commitSha}:{}}}var COMMIT_SHA_PATTERN=/^[0-9a-f]{4,40}$/i;async function resolveCommitSha(cwd,value){let sha=value.trim().toLowerCase();if(!COMMIT_SHA_PATTERN.test(sha))return null;if(sha.length===40)return sha;let git=await getGitExecutable(cwd);return await readGit(git,cwd,["rev-parse","--verify","--quiet",`${sha}^{commit}`])??null}async function readGit(git,cwd,args){try{let{stdout}=await execFileAsync(git,args,{cwd});return stdout.trim()||void 0}catch(error){output_manager_default.debug(`git ${args.join(" ")} failed: ${error}`);return}}function failCi(client,failure){return shouldEmitNonInteractiveCommandError(client)?writeAgentError(client,{status:AGENT_STATUS.ERROR,...failure}):output_manager_default.fatal(failure.message),getExitCodeForReason(failure.reason)}function invalidCiArguments(client,message){return failCi(client,{reason:AGENT_REASON.INVALID_ARGUMENTS,message})}function handleCiApiError(client,action,err){if(isAPIError(err)){let detail=err.serverMessage?` ${err.serverMessage}`:"";switch(err.status){case 403:return failCi(client,{reason:AGENT_REASON.PERMISSION_DENIED,message:`Can't ${action}. You don't have access to Vercel CI runs for this team.`});case 404:return failCi(client,{reason:AGENT_REASON.CI_RUN_NOT_FOUND,message:"Couldn't find that Vercel CI run for this team."});case 429:return failCi(client,{reason:AGENT_REASON.RATE_LIMITED,message:`Failed to ${action}. Too many requests. Wait a moment, then try again.`});default:return failCi(client,{reason:AGENT_REASON.API_ERROR,message:`Failed to ${action}.${detail}`})}}throw err}async function resolveCiContext(client){let git=await getCiGitContext(client.cwd);if(!git)return failCi(client,{reason:AGENT_REASON.GIT_REPOSITORY_REQUIRED,message:"Couldn't find a supported Git repository here. Vercel CI currently supports GitHub repositories with an origin remote."});let team=await resolveCiTeam(client);return team.ok?{git,accountId:team.accountId}:team.exitCode}var import_chalk53=__toESM(require_source(),1),import_ms8=__toESM(require_ms(),1);function formatStatus2(status6){switch(status6){case"succeeded":return import_chalk53.default.green(status6);case"failed":return import_chalk53.default.red(status6);case"skipped":case"cached":return import_chalk53.default.gray(status6);default:return ciDisplayText(status6)}}function formatCiTable(headers,rows){return formatTable(headers,headers.map(()=>"l"),[{rows}]).split(`
|
|
245
255
|
`).map(line2=>line2.trimEnd()).filter(line2=>line2.length>0).join(`
|
|
246
256
|
`)}function printRunView(view,elapsed2){let{run:run3}=view;output_manager_default.log(`Vercel CI run ${import_chalk53.default.bold(ciDisplayText(run3.id))} ${import_chalk53.default.gray(elapsed2)}`),output_manager_default.print(`
|
|
247
257
|
`),printAlignedLabel("Status",formatStatus2(run3.status)),run3.reason&&printAlignedLabel("Reason",ciDisplayText(run3.reason)),run3.repository&&printAlignedLabel("Repository",ciDisplayText(run3.repository)),printAlignedLabel("Branch",ciDisplayText(run3.branch)),printAlignedLabel("Commit",ciDisplayText(toShortSha(run3.commitSha))),printAlignedLabel("Attempt",String(run3.attempt)),printAlignedLabel("Created",`${(0,import_ms8.default)(Math.max(Date.now()-Date.parse(run3.createdAt),0))} ago`),view.jobs.length===0&&run3.reason==="setup_failed"&&output_manager_default.print(`
|
|
@@ -260,7 +270,7 @@ validUntil=${result.validUntil} (${new Date(result.validUntil).toISOString()})
|
|
|
260
270
|
`),output_manager_default.log(`${(0,import_pluralize4.default)("matching line",lineCount,!0)} in ${(0,import_pluralize4.default)("run",matches.length,!0)} of ${runs.length} searched`),result.hasMore&&output_manager_default.log(`Showing the newest ${lineCount} matching lines. Narrow with --status, --level, or fewer --runs.`),0}function isAddressableTask(tree,task){let named=tree.jobs.flatMap(job2=>job2.tasks.filter(current2=>current2.definition.name===task.taskName).map(current2=>({job:job2,current:current2})));if(named.length!==1||task.taskRunAttempt===void 0)return!1;let{job,current}=named[0];return job.definition.jobDefinitionId===task.jobDefinitionId&&job.run?.attempt===task.jobRunAttempt&¤t.definition.jobDefinitionId===task.jobDefinitionId&¤t.definition.jobRunAttempt===task.jobRunAttempt&¤t.definition.taskDefinitionId===task.taskDefinitionId&¤t.run?.taskDefinitionId===task.taskDefinitionId&¤t.run.attempt===task.taskRunAttempt}function latestAttempts(invocations){let latest=new Map;for(let invocation of invocations){let current=latest.get(invocation.invocationId);(!current||invocation.attempt>current.attempt)&&latest.set(invocation.invocationId,invocation)}return[...latest.values()]}function printNoRuns(client,asJson,text3,scope,selection,scanNotice){return asJson?(client.stdout.write(`${JSON.stringify({...client.nonInteractive?{status:AGENT_STATUS.OK,message:selection.limited?`No Vercel CI runs match the current filters among the runs checked. ${scanNotice}`:"No Vercel CI runs match the current filters.",next:[]}:{},search:text3,searchedRuns:0,selection,matches:{lines:0,runs:0},runs:[],hasMore:!1},null,2)}
|
|
261
271
|
`),0):(scanNotice&&output_manager_default.print(`! ${scanNotice}
|
|
262
272
|
`),output_manager_default.log(selection.limited?`No Vercel CI runs match the current filters among the runs checked for ${scope}.`:selection.scannedRuns>0?`No Vercel CI runs match the current filters for ${scope}.`:`No Vercel CI runs found for ${scope}.`),0)}function describeScope(git,branch){let repo=import_chalk54.default.bold(ciDisplayText(git.repository));return branch?`${repo} on ${import_chalk54.default.bold(ciDisplayText(branch))}`:`${repo} on all branches`}function plainScope(git,branch){return branch?`${ciDisplayText(git.repository)} on ${ciDisplayText(branch)}`:`${ciDisplayText(git.repository)} on all branches`}function describeRun(run3,now,showBranch){return[`Run ${import_chalk54.default.bold(ciDisplayText(run3.id))}`,formatStatus2(run3.status),...run3.attempt>1?[`attempt ${run3.attempt}`]:[],...showBranch?[ciDisplayText(run3.branch)]:[],ciDisplayText(toShortSha(run3.commitSha)),`${(0,import_ms9.default)(Math.max(now-Date.parse(run3.createdAt),0))} ago`].join(import_chalk54.default.gray(" \xB7 "))}function formatTime(timestamp2){return new Date(timestamp2).toLocaleTimeString("en-US",{hour12:!1})}function highlight(message,text3){let literal=text3.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return message.replace(new RegExp(literal,"giu"),match=>import_chalk54.default.red.bold(match))}function handleGrepApiError(client,action,err){return isAPIError(err)&&err.status===404?failCi(client,{reason:AGENT_REASON.API_ERROR,message:`Failed to ${action}. The Vercel CI endpoint wasn't found.`}):handleCiApiError(client,action,err)}var import_chalk55=__toESM(require_source(),1);var CiInspectTelemetryClient=class extends TelemetryClient{trackCliArgumentRun(run3){run3&&this.trackCliArgument({arg:"run",value:this.redactedValue})}trackCliOptionAttempt(attempt){attempt!==void 0&&this.trackCliOption({option:"attempt",value:String(attempt)})}trackCliFlagWait(wait){wait&&this.trackCliFlag("wait")}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};import{z}from"zod";var MAX_STREAM_FAILURES=3,STREAM_RETRY_DELAY_MS=2e3,WAIT_TIMEOUT_MS=10*60*1e3,id=z.string().min(1),attemptNumber=z.number().int().positive(),timestamp=z.number().refine(value=>Number.isFinite(new Date(value).getTime())),conclusionResult=z.enum(["succeeded","failed","skipped"]),conclusion=z.object({result:conclusionResult}),stepConclusion=z.object({result:conclusionResult,reason:z.string().optional()}),stepRun=z.object({attempt:attemptNumber,createdAt:timestamp,started:z.object({startedAt:timestamp}).optional()}),treeSchema=z.object({invocation:z.object({invocationId:id,attempt:attemptNumber,teamId:id,createdAt:timestamp,repositoryKey:id,ref:z.string(),commitSha:z.string(),status:z.enum(["new","running","bootstrapping","bootstrapping_failed","snapshotted","sandbox_named","jobs_on_hive_clone_dispatched","jobs_on_hive_dispatched","jobs_on_hive_completed","jobs_on_hive_failed","awaiting_jobs","completed","skipped"]),skipped:z.object({reason:z.string()}).optional(),completed:z.object({completedAt:timestamp,conclusion:conclusionResult.optional()}).optional(),runConclusion:conclusion.optional(),setupConclusion:conclusion.optional()}),repositories:z.record(z.string(),z.object({owner:z.string(),name:z.string()})),jobs:z.array(z.object({definition:z.object({jobDefinitionId:id,kind:z.enum(["command","turbo"]),name:z.string(),command:z.string(),createdAt:timestamp}),run:stepRun.extend({jobDefinitionId:id,completed:z.object({completedAt:timestamp,conclusion:stepConclusion}).optional()}).optional(),tasks:z.array(z.object({definition:z.object({jobDefinitionId:id,jobRunAttempt:attemptNumber,taskDefinitionId:id,name:z.string(),dependencyTaskDefinitionIds:z.array(id),createdAt:timestamp}),run:stepRun.extend({taskDefinitionId:id,completed:z.object({completedAt:timestamp,conclusion:stepConclusion.extend({result:z.enum(["succeeded","cached","failed","skipped"])})}).optional()}).optional()}))}))});function validateTree(tree,expected){let parsed=treeSchema.safeParse(tree);if(!parsed.success||parsed.data.invocation.invocationId!==expected.invocationId||parsed.data.invocation.attempt!==expected.attempt||parsed.data.invocation.teamId!==expected.teamId)throw new Error("Invalid Vercel CI run tree.")}var CiWaitError=class extends Error{constructor(reason){super(reason==="ci_wait_timeout"?"Stopped waiting after 10 minutes. The run may still be running.":"Failed to wait for the Vercel CI run after 3 interrupted streams. The run may still be running.");this.reason=reason}};async function waitForRun(client,target,initial,asJson){let expected={invocationId:target.invocationId,attempt:target.attempt??initial.invocation?.attempt,teamId:target.accountId??initial.invocation?.teamId};if(validateTree(initial,expected),isTerminalRunStatus(getRunStatus(initial.invocation)))return initial;let tree=initial,attempt=initial.invocation.attempt,controller=new AbortController,timeoutError=new CiWaitError("ci_wait_timeout"),timer,deadline=new Promise((_resolve,reject)=>{timer=setTimeout(()=>{reject(timeoutError),controller.abort()},WAIT_TIMEOUT_MS)}),updateSpinner=()=>{if(asJson)return;let{total,finished}=countTasks(toRunView(tree)),progress=total>0?` ${finished} of ${total} tasks finished`:"";output_manager_default.spinner(`Waiting for the run to finish\u2026${progress}`)};asJson||(output_manager_default.stopSpinner(),output_manager_default.log("Waiting for the run to finish (up to 10 minutes). Press Ctrl+C to stop waiting; the run keeps going."));let follow=async()=>{let failures=0,incompleteStreams=0;for(;!controller.signal.aborted;){updateSpinner();let timedOut=!1,validTree=!1;try{for await(let event of streamCiInvocationTree(client,target.invocationId,{attempt,accountId:target.accountId,signal:controller.signal})){if(controller.signal.aborted)throw timeoutError;if(!event||typeof event!="object")throw new Error("Invalid Vercel CI run stream event.");if(event.type==="tree"){let{type:_type,...next}=event;if(validateTree(next,expected),countTasks(toRunView(next)),tree=next,validTree=!0,isTerminalRunStatus(getRunStatus(tree.invocation)))return tree;updateSpinner()}else if(event.type==="end"&&event.reason==="timeout"){timedOut=!0;break}else throw new Error("Vercel CI run stream ended without completion.")}}catch(err){if(controller.signal.aborted)throw timeoutError;if(isAPIError(err))throw err;output_manager_default.debug(`Vercel CI run stream interrupted: ${err}`)}if(timedOut)validTree&&(failures=0);else if(++failures>=MAX_STREAM_FAILURES||++incompleteStreams>=MAX_STREAM_FAILURES)throw new CiWaitError("ci_wait_interrupted");await new Promise((resolve14,reject)=>{let onAbort=()=>{clearTimeout(retryTimer),reject(timeoutError)},retryTimer=setTimeout(()=>{controller.signal.removeEventListener("abort",onAbort),resolve14()},STREAM_RETRY_DELAY_MS);controller.signal.addEventListener("abort",onAbort,{once:!0}),controller.signal.aborted&&onAbort()})}throw timeoutError};try{return await Promise.race([follow(),deadline])}finally{clearTimeout(timer),controller.abort(),asJson||output_manager_default.stopSpinner()}}async function resolveRunTarget(client,runArg,attempt){if(runArg!==void 0){let invocationId2=toApiRunId(runArg);if(!invocationId2)return invalidCiArguments(client,`Run IDs contain only letters and numbers. Find one with ${getCommandName("ci ls")}.`);let team=await resolveCiTeam(client);return team.ok?{invocationId:invocationId2,attempt,accountId:team.accountId}:team.exitCode}let context=await resolveCiContext(client);if(typeof context=="number")return context;let{git,accountId}=context;if(!git.commitSha)return failCi(client,{reason:AGENT_REASON.CI_RUN_NOT_FOUND,message:"This repository doesn't have any commits yet. Commit and push, then try again."});if(!git.branch){let command2=buildCiCommand(client.argv,["ci","ls","--all-branches"]),exitCode2=failCi(client,{reason:AGENT_REASON.CI_RUN_NOT_FOUND,message:"Can't find the run for HEAD while HEAD is detached. Check out its branch and try again, or list runs across all branches and pass a run ID.",next:[{command:command2,when:"Find a run ID across all branches, then pass it explicitly"}]});return shouldEmitNonInteractiveCommandError(client)||output_manager_default.print(` ${command2}
|
|
263
|
-
`),exitCode2}let invocationId;try{let{invocations}=await listCiInvocations(client,{provider:git.provider,repository:git.repository,branch:git.branch,commitSha:git.commitSha,limit:1},accountId);invocationId=invocations.find(invocation=>invocation.commitSha===git.commitSha)?.invocationId}catch(err){return handleCiApiError(client,"find the Vercel CI run for HEAD",err)}if(!invocationId){let where=` on ${ciDisplayText(git.branch)}`;return failCi(client,{reason:AGENT_REASON.CI_RUN_NOT_FOUND,message:`No Vercel CI run found for ${toShortSha(git.commitSha)}${where}. Push the commit, or pass a run ID from ${getCommandName("ci ls")}.`,next:[{command:buildCiCommand(client.argv,["ci","ls"]),when:"List recent runs for this branch"}]})}return{invocationId,attempt,accountId}}async function resolveAttemptNumber(client,target){return target.attempt??await getLatestCiAttempt(client,target.invocationId,target.accountId)}async function inspect6(client,argv){let telemetry2=new CiInspectTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs;try{parsedArgs=parseArguments(argv,getFlagsSpecification(
|
|
273
|
+
`),exitCode2}let invocationId;try{let{invocations}=await listCiInvocations(client,{provider:git.provider,repository:git.repository,branch:git.branch,commitSha:git.commitSha,limit:1},accountId);invocationId=invocations.find(invocation=>invocation.commitSha===git.commitSha)?.invocationId}catch(err){return handleCiApiError(client,"find the Vercel CI run for HEAD",err)}if(!invocationId){let where=` on ${ciDisplayText(git.branch)}`;return failCi(client,{reason:AGENT_REASON.CI_RUN_NOT_FOUND,message:`No Vercel CI run found for ${toShortSha(git.commitSha)}${where}. Push the commit, or pass a run ID from ${getCommandName("ci ls")}.`,next:[{command:buildCiCommand(client.argv,["ci","ls"]),when:"List recent runs for this branch"}]})}return{invocationId,attempt,accountId}}async function resolveAttemptNumber(client,target){return target.attempt??await getLatestCiAttempt(client,target.invocationId,target.accountId)}async function inspect6(client,argv){let telemetry2=new CiInspectTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs;try{parsedArgs=parseArguments(argv,getFlagsSpecification(inspectSubcommand5.options))}catch(error){return printError(error,client),2}let{args,flags}=parsedArgs;if(telemetry2.trackCliArgumentRun(args[0]),telemetry2.trackCliOptionAttempt(flags["--attempt"]),telemetry2.trackCliFlagWait(flags["--wait"]),telemetry2.trackCliOptionFormat(flags["--format"]),telemetry2.trackCliFlagJson(flags["--json"]),args.length>1)return invalidCiArguments(client,`Pass at most 1 run ID. Usage: ${getCommandName("ci inspect [run]")}`);let formatResult=validateJsonOutput(flags);if(!formatResult.valid)return invalidCiArguments(client,formatResult.error);let asJson=formatResult.jsonOutput||client.nonInteractive,attempt=flags["--attempt"];if(attempt!==void 0&&(!Number.isInteger(attempt)||attempt<1))return invalidCiArguments(client,"--attempt must be a whole number of 1 or more.");let target=await resolveRunTarget(client,args[0],attempt);if(typeof target=="number")return target;let inspectStamp=stamp_default(),tree;try{if(asJson||output_manager_default.spinner("Fetching Vercel CI run\u2026"),tree=await getCiInvocationTree(client,target.invocationId,{attempt:target.attempt,accountId:target.accountId}),flags["--wait"])try{tree=await waitForRun(client,target,tree,asJson)}catch(err){if(!(err instanceof CiWaitError))throw err;output_manager_default.stopSpinner();let command2=buildCiCommand(client.argv,["ci","inspect",toRunView(tree).run.id,"--attempt",String(tree.invocation.attempt)]),failure={reason:err.reason,message:err.message,next:[{command:command2,when:"Check the status of this attempt"}]};if(asJson)return client.stdout.write(`${JSON.stringify({status:AGENT_STATUS.ERROR,...failure},null,2)}
|
|
264
274
|
`),1;let exitCode2=failCi(client,failure);return output_manager_default.print(` ${command2}
|
|
265
275
|
`),exitCode2}}catch(err){return output_manager_default.stopSpinner(),handleCiApiError(client,"fetch the Vercel CI run",err)}output_manager_default.stopSpinner();let view=toRunView(tree),next=getNextSteps(client,view,tree.invocation.source),failedWait=flags["--wait"]&&view.run.status==="failed";if(asJson){let payload=client.nonInteractive?{status:failedWait?AGENT_STATUS.ERROR:AGENT_STATUS.OK,message:`The Vercel CI run ${view.run.status}.`,...failedWait?{reason:"ci_run_failed"}:{},...view,next}:view;client.stdout.write(`${JSON.stringify(payload,null,2)}
|
|
266
276
|
`)}else{printRunView(view,inspectStamp());for(let step of next)output_manager_default.log(`${step.when}: ${import_chalk55.default.cyan(step.command)}`)}return failedWait?1:0}function getNextSteps(client,view,source){if(!toApiRunId(view.run.id))return[];let attemptArgs=["--attempt",String(view.run.attempt)];return isTerminalRunStatus(view.run.status)?view.run.status==="failed"?[{command:buildCiCommand(client.argv,["ci","logs",view.run.id,"--failed",...attemptArgs]),when:"Show logs for the failed tasks"},...source?.type==="vercel-ci"?[{command:buildCiCommand(client.argv,["ci","rerun",view.run.id]),when:"Start a new attempt of this run"}]:[]]:[]:[{command:buildCiCommand(client.argv,["ci","inspect",view.run.id,"--wait",...attemptArgs]),when:"Wait for this run to finish"}]}var import_chalk56=__toESM(require_source(),1),import_pluralize5=__toESM(require_pluralize(),1);var CiStreamOutputError=class extends Error{},CiReplayLimitError=class extends Error{};async function writeCiOutput(stream,text3){await new Promise((resolve14,reject)=>{let cleanup=()=>{stream.removeListener("drain",onDrain),stream.removeListener("error",onError),stream.removeListener("close",onClose)},onDrain=()=>{cleanup(),resolve14()},onError=()=>{cleanup(),reject(new CiStreamOutputError("Failed to write task logs."))},onClose=()=>{cleanup(),reject(new CiStreamOutputError("Task log output closed."))};if(stream.once("drain",onDrain),stream.once("error",onError),stream.once("close",onClose),stream.destroyed)return onClose();try{stream.write(text3)&&onDrain()}catch{onError()}})}var CiLogReplay=class{constructor(maxBytes=8*1024*1024,maxKeys=5e4){this.maxBytes=maxBytes;this.maxKeys=maxKeys;this.counts=new Map;this.bytes=0}begin(){let remaining=new Map(this.counts);return line2=>{let key=JSON.stringify([line2.timestamp,line2.level,line2.message]),count2=remaining.get(key)??0;if(count2>0)return remaining.set(key,count2-1),!1;if(!this.counts.has(key)){let bytes5=Buffer.byteLength(key)+128;if(this.bytes+bytes5>this.maxBytes||this.counts.size>=this.maxKeys)throw new CiReplayLimitError("Stopped following task logs because full replay reached its memory limit. Fetch task logs without --follow.");this.bytes+=bytes5}return this.counts.set(key,(this.counts.get(key)??0)+1),!0}}};async function reportCiStreamError(client,asJson,report){if(!asJson)return report(client);let payload="",reportingClient=new Proxy(client,{get(target,property){return property==="nonInteractive"?!0:property==="stdout"?{write:text3=>(payload+=text3,!0)}:Reflect.get(target,property,target)}}),code2=report(reportingClient);return payload&&await writeCiOutput(client.stdout,`${JSON.stringify(JSON.parse(payload))}
|
|
@@ -287,11 +297,11 @@ validUntil=${result.validUntil} (${new Date(result.validUntil).toISOString()})
|
|
|
287
297
|
`);return failed?1:0}function apiFailureReason(err){if(isAPIError(err)){if(err.status===403)return AGENT_REASON.PERMISSION_DENIED;if(err.status===404)return AGENT_REASON.CI_RUN_NOT_FOUND;if(err.status===429)return AGENT_REASON.RATE_LIMITED}return AGENT_REASON.API_ERROR}function reportFailure(client,asJson,failure){if(asJson)client.stdout.write(`${JSON.stringify({status:AGENT_STATUS.ERROR,...failure},null,2)}
|
|
288
298
|
`);else{output_manager_default.fatal(failure.message);for(let step of failure.next)output_manager_default.print(` ${step.when}:
|
|
289
299
|
${step.command}
|
|
290
|
-
`)}return 1}var import_chalk57=__toESM(require_source(),1),import_ms10=__toESM(require_ms(),1),import_pluralize6=__toESM(require_pluralize(),1);var CiLsTelemetryClient=class extends TelemetryClient{trackCliOptionBranch(branch){branch&&this.trackCliOption({option:"branch",value:this.redactedValue})}trackCliFlagAllBranches(allBranches){allBranches&&this.trackCliFlag("all-branches")}trackCliOptionCommit(commit){commit&&this.trackCliOption({option:"commit",value:this.redactedValue})}trackCliOptionStatus(status6){status6&&this.trackCliOption({option:"status",value:status6})}trackCliOptionLimit(limit){limit!==void 0&&this.trackCliOption({option:"limit",value:String(limit)})}trackCliOptionNext(next){next&&this.trackCliOption({option:"next",value:this.redactedValue})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var MAX_LIMIT2=100,SAFE_CURSOR_PATTERN=/^[A-Za-z0-9_\-.=+/]+$/;async function ls2(client,argv){let telemetry2=new CiLsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs;try{parsedArgs=parseArguments(argv,getFlagsSpecification(
|
|
300
|
+
`)}return 1}var import_chalk57=__toESM(require_source(),1),import_ms10=__toESM(require_ms(),1),import_pluralize6=__toESM(require_pluralize(),1);var CiLsTelemetryClient=class extends TelemetryClient{trackCliOptionBranch(branch){branch&&this.trackCliOption({option:"branch",value:this.redactedValue})}trackCliFlagAllBranches(allBranches){allBranches&&this.trackCliFlag("all-branches")}trackCliOptionCommit(commit){commit&&this.trackCliOption({option:"commit",value:this.redactedValue})}trackCliOptionStatus(status6){status6&&this.trackCliOption({option:"status",value:status6})}trackCliOptionLimit(limit){limit!==void 0&&this.trackCliOption({option:"limit",value:String(limit)})}trackCliOptionNext(next){next&&this.trackCliOption({option:"next",value:this.redactedValue})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var MAX_LIMIT2=100,SAFE_CURSOR_PATTERN=/^[A-Za-z0-9_\-.=+/]+$/;async function ls2(client,argv){let telemetry2=new CiLsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs;try{parsedArgs=parseArguments(argv,getFlagsSpecification(listSubcommand7.options))}catch(error){return printError(error,client),2}let{args,flags}=parsedArgs;if(telemetry2.trackCliOptionBranch(flags["--branch"]),telemetry2.trackCliFlagAllBranches(flags["--all-branches"]),telemetry2.trackCliOptionCommit(flags["--commit"]),telemetry2.trackCliOptionStatus(flags["--status"]),telemetry2.trackCliOptionLimit(flags["--limit"]),telemetry2.trackCliOptionNext(flags["--next"]),telemetry2.trackCliOptionFormat(flags["--format"]),telemetry2.trackCliFlagJson(flags["--json"]),args.length>0)return invalidCiArguments(client,`\`${getCommandNamePlain("ci ls")}\` doesn't take arguments. Filter runs with --branch, --commit, or --status.`);let formatResult=validateJsonOutput(flags);if(!formatResult.valid)return invalidCiArguments(client,formatResult.error);let asJson=formatResult.jsonOutput||client.nonInteractive;if(flags["--branch"]&&flags["--all-branches"])return invalidCiArguments(client,"Can't combine --branch with --all-branches. Pass one of them.");if(flags["--commit"]&&flags["--all-branches"])return invalidCiArguments(client,"Can't combine --commit with --all-branches. Commit filters require a branch.");let status6=flags["--status"];if(status6!==void 0&&!CI_RUN_STATUSES.includes(status6))return invalidCiArguments(client,`Status must be one of: ${CI_RUN_STATUSES.join(", ")}.`);let limit=flags["--limit"];if(limit!==void 0&&(!Number.isInteger(limit)||limit<1||limit>MAX_LIMIT2))return invalidCiArguments(client,`--limit must be a whole number from 1 to ${MAX_LIMIT2}.`);let context=await resolveCiContext(client);if(typeof context=="number")return context;let{git,accountId}=context,commitSha;if(flags["--commit"]){let resolved=await resolveCommitSha(client.cwd,flags["--commit"]);if(!resolved)return invalidCiArguments(client,"Couldn't resolve --commit to a commit in this repository. Pass the full 40-character SHA.");commitSha=resolved}let branch=flags["--all-branches"]?void 0:flags["--branch"]??git.branch;if(commitSha&&!branch)return invalidCiArguments(client,"--commit requires a branch. Pass --branch when HEAD is detached.");let lsStamp=stamp_default();asJson||output_manager_default.spinner("Fetching Vercel CI runs\u2026");let invocations,nextCursor;try{let response=await listCiInvocations(client,{provider:git.provider,repository:git.repository,branch,commitSha,...status6?toRunStatusFilter(status6):{},limit,cursor:flags["--next"]},accountId);invocations=commitSha?response.invocations.filter(inv=>inv.commitSha===commitSha):response.invocations,nextCursor=response.pagination.nextCursor}catch(err){return output_manager_default.stopSpinner(),handleCiApiError(client,"list Vercel CI runs",err)}output_manager_default.stopSpinner();let runs=invocations.map(invocation=>({...toRunSummary(invocation,{}),repository:git.repository})),nextArgs=nextCursor&&SAFE_CURSOR_PATTERN.test(nextCursor)?["ci ls",...Object.entries(flags).flatMap(([flag,value])=>flag==="--next"||GLOBAL_CLI_FLAG_NAMES.has(flag)?[]:typeof value=="boolean"?value?[flag]:[]:[flag,quoteCiCommandArg(String(value))]),...getGlobalFlagsFromArgv(client.argv).map(quoteCiCommandArg),"--next",nextCursor].join(" "):void 0;if(asJson){let payload={runs,pagination:{next:nextCursor??null}},agentPayload=client.nonInteractive?{status:AGENT_STATUS.OK,...payload,message:runs.length?`Found ${(0,import_pluralize6.default)("Vercel CI run",runs.length,!0)}.`:"No Vercel CI runs found.",next:[...nextArgs?[{command:getCommandNamePlain(nextArgs),when:"Show the next page of runs"}]:[]]}:payload;return client.stdout.write(`${JSON.stringify(agentPayload,null,2)}
|
|
291
301
|
`),0}let scope=describeScope2(git.repository,branch,commitSha);if(runs.length===0){let filtered=!!(status6||commitSha||flags["--next"]);return output_manager_default.log(filtered?"No Vercel CI runs match the current filters.":`No Vercel CI runs found for ${scope}.`),0}return output_manager_default.log(`${(0,import_pluralize6.default)("Vercel CI run",runs.length,!0)} for ${scope} ${import_chalk57.default.gray(lsStamp())}`),output_manager_default.print(`
|
|
292
302
|
${formatRunsTable(invocations)}
|
|
293
303
|
|
|
294
|
-
`),nextArgs&&output_manager_default.log(`To display the next page, run ${getCommandName(nextArgs)}`),0}function describeScope2(repository,branch,commitSha){let repo=import_chalk57.default.bold(ciDisplayText(repository));return commitSha?`${repo} at ${import_chalk57.default.bold(toShortSha(commitSha))}`:branch?`${repo} on ${import_chalk57.default.bold(ciDisplayText(branch))}`:`${repo} on all branches`}function formatRunsTable(invocations){let now=Date.now(),rows=invocations.map(invocation=>[ciDisplayText(toDisplayRunId(invocation.invocationId)),formatStatus2(getRunStatus(invocation)),ciDisplayText(toBranchName(invocation.ref)),toShortSha(invocation.commitSha),import_chalk57.default.gray((0,import_ms10.default)(Math.max(now-invocation.createdAt,0)))]);return formatCiTable(["Run","Status","Branch","Commit","Age"],rows)}var COMMAND_CONFIG20={ls:getCommandAliases(listSubcommand6),inspect:getCommandAliases(inspectSubcommand4),logs:getCommandAliases(logsSubcommand),grep:getCommandAliases(grepSubcommand),rerun:getCommandAliases(rerunSubcommand)};async function main6(client){let parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(2),getFlagsSpecification(ciCommand.options),{permissive:!0})}catch(error){return printError(error,client),2}let telemetry2=new CiTelemetryClient({opts:{store:client.telemetryEventStore}}),{subcommand,args,subcommandOriginal}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG20),needHelp=parsedArgs.flags["--help"];function printHelp(command2){return output_manager_default.print(help(command2,{parent:ciCommand,columns:client.stderr.columns})),0}switch(subcommand){case"ls":return needHelp?(telemetry2.trackCliFlagHelp("ci",subcommandOriginal),printHelp(listSubcommand6)):(telemetry2.trackCliSubcommandList(subcommandOriginal),ls2(client,args));case"inspect":return needHelp?(telemetry2.trackCliFlagHelp("ci",subcommandOriginal),printHelp(inspectSubcommand4)):(telemetry2.trackCliSubcommandInspect(subcommandOriginal),inspect6(client,args));case"logs":return needHelp?(telemetry2.trackCliFlagHelp("ci",subcommandOriginal),printHelp(logsSubcommand)):(telemetry2.trackCliSubcommandLogs(subcommandOriginal),logs(client,args));case"grep":return needHelp?(telemetry2.trackCliFlagHelp("ci",subcommandOriginal),printHelp(grepSubcommand)):(telemetry2.trackCliSubcommandGrep(subcommandOriginal),grep(client,args));case"rerun":return needHelp?(telemetry2.trackCliFlagHelp("ci",subcommandOriginal),printHelp(rerunSubcommand)):(telemetry2.trackCliSubcommandRerun(subcommandOriginal),rerun(client,args));default:return needHelp&&telemetry2.trackCliFlagHelp("ci"),output_manager_default.print(help(ciCommand,{columns:client.stderr.columns})),needHelp?0:2}}var CommentsTelemetryClient=class extends TelemetryClient{trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandInspect(actual){this.trackCliSubcommand({subcommand:"inspect",value:actual})}trackCliSubcommandOpen(actual){this.trackCliSubcommand({subcommand:"open",value:actual})}trackCliSubcommandReply(actual){this.trackCliSubcommand({subcommand:"reply",value:actual})}trackCliSubcommandResolve(actual){this.trackCliSubcommand({subcommand:"resolve",value:actual})}trackCliSubcommandReopen(actual){this.trackCliSubcommand({subcommand:"reopen",value:actual})}trackCliSubcommandEdit(actual){this.trackCliSubcommand({subcommand:"edit",value:actual})}trackCliSubcommandDelete(actual){this.trackCliSubcommand({subcommand:"delete",value:actual})}trackCliOptionFormat(v){v&&this.trackCliOption({option:"format",value:v})}trackCliOptionStatus(v){v&&this.trackCliOption({option:"status",value:v})}trackCliFlagAllBranches(v){v&&this.trackCliFlag("all-branches")}trackCliFlagYes(v){v&&this.trackCliFlag("yes")}trackCliFlagContext(v){v&&this.trackCliFlag("context")}trackCliOptionProject(v){v&&this.trackCliOption({option:"project",value:this.redactedValue})}trackCliOptionBranch(v){v&&v.length>0&&this.trackCliOption({option:"branch",value:this.redactedValue})}trackCliOptionPage(v){v&&v.length>0&&this.trackCliOption({option:"page",value:this.redactedValue})}trackCliOptionPagePath(v){v&&v.length>0&&this.trackCliOption({option:"page-path",value:this.redactedValue})}trackCliOptionAuthor(v){v&&v.length>0&&this.trackCliOption({option:"author",value:this.redactedValue})}trackCliOptionContentId(v){v&&v.length>0&&this.trackCliOption({option:"content-id",value:this.redactedValue})}trackCliOptionSearch(v){v&&this.trackCliOption({option:"search",value:this.redactedValue})}trackCliOptionLimit(v){typeof v=="number"&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliOptionNext(v){v&&this.trackCliOption({option:"next",value:this.redactedValue})}trackCliOptionMessage(v){v&&this.trackCliOption({option:"message",value:this.redactedValue})}trackCliOptionFile(v){v&&this.trackCliOption({option:"file",value:this.redactedValue})}trackCliOptionAttach(v){v&&v.length>0&&this.trackCliOption({option:"attach",value:this.redactedValue})}trackCliArgumentThread(v){v&&this.trackCliArgument({arg:"thread",value:this.redactedValue})}trackCliArgumentMessageId(v){v&&this.trackCliArgument({arg:"message-id",value:this.redactedValue})}trackCliArgumentSearch(v){v&&this.trackCliArgument({arg:"search",value:this.redactedValue})}};var COMMAND_CONFIG21={list:getCommandAliases(listSubcommand7),inspect:getCommandAliases(inspectSubcommand5),open:getCommandAliases(openSubcommand),reply:getCommandAliases(replySubcommand),resolve:getCommandAliases(resolveSubcommand),reopen:getCommandAliases(reopenSubcommand),edit:getCommandAliases(editSubcommand),delete:getCommandAliases(deleteSubcommand)};async function comments(client){let telemetry2=new CommentsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(commentsCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),2}let{subcommand,subcommandOriginal}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG21),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("comments",subcommand),output_manager_default.print(help(commentsCommand,{columns:client.stderr.columns})),0;function printSubcommandHelp(command2){output_manager_default.print(help(command2,{parent:commentsCommand,columns:client.stderr.columns}))}function handleHelp(command2){return needHelp?(telemetry2.trackCliFlagHelp("comments",subcommandOriginal),printSubcommandHelp(command2),!0):!1}switch(subcommand){case"inspect":return handleHelp(inspectSubcommand5)?0:(telemetry2.trackCliSubcommandInspect(subcommandOriginal),(await import("./chunks/inspect-DWOQ6566.js")).default(client,telemetry2));case"open":return handleHelp(openSubcommand)?0:(telemetry2.trackCliSubcommandOpen(subcommandOriginal),(await import("./chunks/open-J4X5KJ6A.js")).default(client,telemetry2));case"reply":return handleHelp(replySubcommand)?0:(telemetry2.trackCliSubcommandReply(subcommandOriginal),(await import("./chunks/reply-3GFULOMZ.js")).default(client,telemetry2));case"resolve":return handleHelp(resolveSubcommand)?0:(telemetry2.trackCliSubcommandResolve(subcommandOriginal),(await import("./chunks/resolve-USEBSFUT.js")).default(client,telemetry2,!0));case"reopen":return handleHelp(reopenSubcommand)?0:(telemetry2.trackCliSubcommandReopen(subcommandOriginal),(await import("./chunks/resolve-USEBSFUT.js")).default(client,telemetry2,!1));case"edit":return handleHelp(editSubcommand)?0:(telemetry2.trackCliSubcommandEdit(subcommandOriginal),(await import("./chunks/edit-JRYFZ5N5.js")).default(client,telemetry2));case"delete":return handleHelp(deleteSubcommand)?0:(telemetry2.trackCliSubcommandDelete(subcommandOriginal),(await import("./chunks/delete-HAOLSE35.js")).default(client,telemetry2));default:{if(needHelp)return telemetry2.trackCliFlagHelp("comments",subcommandOriginal),subcommandOriginal!=="default"?printSubcommandHelp(listSubcommand7):output_manager_default.print(help(commentsCommand,{columns:client.stderr.columns})),0;telemetry2.trackCliSubcommandList(subcommandOriginal);let defaultInvocation=subcommandOriginal==="default";return(await import("./chunks/list-S2XKQMNX.js")).default(client,telemetry2,defaultInvocation)}}}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{trackCliSubcommandCreate(actual){this.trackCliSubcommand({subcommand:"create",value:actual})}trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandToken(actual){this.trackCliSubcommand({subcommand:"token",value:actual})}trackCliSubcommandRemove(actual){this.trackCliSubcommand({subcommand:"remove",value:actual})}trackCliSubcommandOpen(actual){this.trackCliSubcommand({subcommand:"open",value:actual})}trackCliSubcommandContacts(actual){this.trackCliSubcommand({subcommand:"contacts",value:actual})}trackCliSubcommandAttach(actual){this.trackCliSubcommand({subcommand:"attach",value:actual})}trackCliSubcommandDetach(actual){this.trackCliSubcommand({subcommand:"detach",value:actual})}trackCliSubcommandUpdate(actual){this.trackCliSubcommand({subcommand:"update",value:actual})}trackCliSubcommandRevokeTokens(actual){this.trackCliSubcommand({subcommand:"revoke-tokens",value:actual})}trackCliArgumentClient(v){v&&this.trackCliArgument({arg:"client",value:this.redactedValue})}trackCliArgumentId(v){v&&this.trackCliArgument({arg:"id",value:this.redactedValue})}trackCliArgumentService(v){if(v){let value=serviceTelemetryValue(v);this.trackCliArgument({arg:"service",value:value??this.redactedValue})}}trackCliOptionName(v){v&&this.trackCliOption({option:"name",value:this.redactedValue})}trackCliOptionSubject(v){v&&this.trackCliOption({option:"subject",value:v==="user"||v==="app"?v:this.redactedValue})}trackCliOptionInstallationId(v){v&&this.trackCliOption({option:"installation-id",value:this.redactedValue})}trackCliOptionScopes(v){v&&this.trackCliOption({option:"scopes",value:this.redactedValue})}trackCliFlagNoDefaultScopes(v){v&&this.trackCliFlag("no-default-scopes")}trackCliOptionIcon(v){v&&this.trackCliOption({option:"icon",value:this.redactedValue})}trackCliOptionBackgroundColor(v){v&&this.trackCliOption({option:"background-color",value:isValidHexColor(v)?v:this.redactedValue})}trackCliOptionAccentColor(v){v&&this.trackCliOption({option:"accent-color",value:isValidHexColor(v)?v:this.redactedValue})}trackCliOptionData(v){v!==void 0&&this.trackCliOption({option:"data",value:this.redactedValue})}trackCliOptionConnectorType(v){v&&this.trackCliOption({option:"connector-type",value:v})}trackCliOptionConnectionMethod(v){v&&this.trackCliOption({option:"connection-method",value:v})}trackCliOptionTarget(v){v&&this.trackCliOption({option:"target",value:v})}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)})}trackCliOptionTriggerBranch(v){v&&this.trackCliOption({option:"trigger-branch",value:this.redactedValue})}trackCliOptionTriggerEnvironment(v){v&&this.trackCliOption({option:"trigger-environment",value:this.redactedValue})}trackCliOptionTriggerPath(v){v&&this.trackCliOption({option:"trigger-path",value:this.redactedValue})}trackCliOptionTriggerProject(v){v&&this.trackCliOption({option:"trigger-project",value:this.redactedValue})}trackCliFlagMyTokens(v){v&&this.trackCliFlag("my-tokens")}trackCliFlagAllTokens(v){v&&this.trackCliFlag("all-tokens")}trackCliFlagAllProjects(v){v&&this.trackCliFlag("all-projects")}trackCliOptionLimit(v){v!==void 0&&this.trackCliOption({option:"limit",value:String(v)})}trackCliOptionNext(v){v&&this.trackCliOption({option:"next",value:this.redactedValue})}trackCliOptionSearch(v){v&&this.trackCliOption({option:"search",value:this.redactedValue})}trackCliOptionService(v){if(!(!v||v.length===0))for(let raw of v)for(let svc of raw.split(","))svc.trim()&&this.trackCliOption({option:"service",value:this.redactedValue})}trackCliOptionType(v){if(!(!v||v.length===0))for(let raw of v)for(let t of raw.split(",")){let trimmed=t.trim();trimmed&&this.trackCliOption({option:"type",value:trimmed})}}trackCliOptionFormat(v){v&&this.trackCliOption({option:"format",value:v})}trackCliOptionEnvironment(v){if(!(!v||v.length===0))for(let raw of v)for(let env of raw.split(",")){let trimmed=env.trim();trimmed&&this.trackCliOption({option:"environment",value:this.redactedTargetName(trimmed)})}}};var import_open3=__toESM(require_open(),1);import{readFile as readFile3}from"node:fs/promises";import{resolve as resolve6}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 as createHash2}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=createHash2("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 as readFile2,stat as stat2}from"node:fs/promises";import{resolve as resolve5}from"node:path";import{createHash as createHash3}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=resolve5(cwd,filePath),size;try{size=(await stat2(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 readFile2(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=createHash3("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 e2=err;throw new Error(`Failed to upload icon: ${e2.serverMessage??e2.message}`)}return prepared.sha}var import_chalk58=__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(targets2){return targets2.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,text3,url)=>linksToSameTarget(text3,url)?output_manager_default.link(text3,url,{fallback:()=>import_chalk58.default.cyan(url)}):output_manager_default.link(text3,url)).replace(/\*\*([^*]+)\*\*/g,(_match,text3)=>import_chalk58.default.bold(text3))}function connexMarkdownToPlainText(markdown){return markdown.replace(/\[([^\]]+)\]\(([^)\s]+)\)/g,(_match,text3,url)=>linksToSameTarget(text3,url)?url:`${text3} (${url})`).replace(/\*\*([^*]+)\*\*/g,"$1")}function linksToSameTarget(text3,url){let normalize=value=>value.trim().replace(/^https?:\/\//,"").replace(/\/+$/,"").toLowerCase();return normalize(text3)===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_chalk58.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_chalk58.default.cyan(CONNEX_REDIRECT_URI)} as a redirect URI in that app.`),method.docUrl&&method.docUrl!==registerUrl&&lines.push(`Docs: ${import_chalk58.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_chalk58.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?`
|
|
304
|
+
`),nextArgs&&output_manager_default.log(`To display the next page, run ${getCommandName(nextArgs)}`),0}function describeScope2(repository,branch,commitSha){let repo=import_chalk57.default.bold(ciDisplayText(repository));return commitSha?`${repo} at ${import_chalk57.default.bold(toShortSha(commitSha))}`:branch?`${repo} on ${import_chalk57.default.bold(ciDisplayText(branch))}`:`${repo} on all branches`}function formatRunsTable(invocations){let now=Date.now(),rows=invocations.map(invocation=>[ciDisplayText(toDisplayRunId(invocation.invocationId)),formatStatus2(getRunStatus(invocation)),ciDisplayText(toBranchName(invocation.ref)),toShortSha(invocation.commitSha),import_chalk57.default.gray((0,import_ms10.default)(Math.max(now-invocation.createdAt,0)))]);return formatCiTable(["Run","Status","Branch","Commit","Age"],rows)}var COMMAND_CONFIG20={ls:getCommandAliases(listSubcommand7),inspect:getCommandAliases(inspectSubcommand5),logs:getCommandAliases(logsSubcommand),grep:getCommandAliases(grepSubcommand),rerun:getCommandAliases(rerunSubcommand)};async function main6(client){let parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(2),getFlagsSpecification(ciCommand.options),{permissive:!0})}catch(error){return printError(error,client),2}let telemetry2=new CiTelemetryClient({opts:{store:client.telemetryEventStore}}),{subcommand,args,subcommandOriginal}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG20),needHelp=parsedArgs.flags["--help"];function printHelp(command2){return output_manager_default.print(help(command2,{parent:ciCommand,columns:client.stderr.columns})),0}switch(subcommand){case"ls":return needHelp?(telemetry2.trackCliFlagHelp("ci",subcommandOriginal),printHelp(listSubcommand7)):(telemetry2.trackCliSubcommandList(subcommandOriginal),ls2(client,args));case"inspect":return needHelp?(telemetry2.trackCliFlagHelp("ci",subcommandOriginal),printHelp(inspectSubcommand5)):(telemetry2.trackCliSubcommandInspect(subcommandOriginal),inspect6(client,args));case"logs":return needHelp?(telemetry2.trackCliFlagHelp("ci",subcommandOriginal),printHelp(logsSubcommand)):(telemetry2.trackCliSubcommandLogs(subcommandOriginal),logs(client,args));case"grep":return needHelp?(telemetry2.trackCliFlagHelp("ci",subcommandOriginal),printHelp(grepSubcommand)):(telemetry2.trackCliSubcommandGrep(subcommandOriginal),grep(client,args));case"rerun":return needHelp?(telemetry2.trackCliFlagHelp("ci",subcommandOriginal),printHelp(rerunSubcommand)):(telemetry2.trackCliSubcommandRerun(subcommandOriginal),rerun(client,args));default:return needHelp&&telemetry2.trackCliFlagHelp("ci"),output_manager_default.print(help(ciCommand,{columns:client.stderr.columns})),needHelp?0:2}}var CommentsTelemetryClient=class extends TelemetryClient{trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandInspect(actual){this.trackCliSubcommand({subcommand:"inspect",value:actual})}trackCliSubcommandOpen(actual){this.trackCliSubcommand({subcommand:"open",value:actual})}trackCliSubcommandReply(actual){this.trackCliSubcommand({subcommand:"reply",value:actual})}trackCliSubcommandResolve(actual){this.trackCliSubcommand({subcommand:"resolve",value:actual})}trackCliSubcommandReopen(actual){this.trackCliSubcommand({subcommand:"reopen",value:actual})}trackCliSubcommandEdit(actual){this.trackCliSubcommand({subcommand:"edit",value:actual})}trackCliSubcommandDelete(actual){this.trackCliSubcommand({subcommand:"delete",value:actual})}trackCliOptionFormat(v){v&&this.trackCliOption({option:"format",value:v})}trackCliOptionStatus(v){v&&this.trackCliOption({option:"status",value:v})}trackCliFlagAllBranches(v){v&&this.trackCliFlag("all-branches")}trackCliFlagYes(v){v&&this.trackCliFlag("yes")}trackCliFlagContext(v){v&&this.trackCliFlag("context")}trackCliOptionProject(v){v&&this.trackCliOption({option:"project",value:this.redactedValue})}trackCliOptionBranch(v){v&&v.length>0&&this.trackCliOption({option:"branch",value:this.redactedValue})}trackCliOptionPage(v){v&&v.length>0&&this.trackCliOption({option:"page",value:this.redactedValue})}trackCliOptionPagePath(v){v&&v.length>0&&this.trackCliOption({option:"page-path",value:this.redactedValue})}trackCliOptionAuthor(v){v&&v.length>0&&this.trackCliOption({option:"author",value:this.redactedValue})}trackCliOptionContentId(v){v&&v.length>0&&this.trackCliOption({option:"content-id",value:this.redactedValue})}trackCliOptionSearch(v){v&&this.trackCliOption({option:"search",value:this.redactedValue})}trackCliOptionLimit(v){typeof v=="number"&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliOptionNext(v){v&&this.trackCliOption({option:"next",value:this.redactedValue})}trackCliOptionMessage(v){v&&this.trackCliOption({option:"message",value:this.redactedValue})}trackCliOptionFile(v){v&&this.trackCliOption({option:"file",value:this.redactedValue})}trackCliOptionAttach(v){v&&v.length>0&&this.trackCliOption({option:"attach",value:this.redactedValue})}trackCliArgumentThread(v){v&&this.trackCliArgument({arg:"thread",value:this.redactedValue})}trackCliArgumentMessageId(v){v&&this.trackCliArgument({arg:"message-id",value:this.redactedValue})}trackCliArgumentSearch(v){v&&this.trackCliArgument({arg:"search",value:this.redactedValue})}};var COMMAND_CONFIG21={list:getCommandAliases(listSubcommand8),inspect:getCommandAliases(inspectSubcommand6),open:getCommandAliases(openSubcommand),reply:getCommandAliases(replySubcommand),resolve:getCommandAliases(resolveSubcommand),reopen:getCommandAliases(reopenSubcommand),edit:getCommandAliases(editSubcommand),delete:getCommandAliases(deleteSubcommand)};async function comments(client){let telemetry2=new CommentsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(commentsCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),2}let{subcommand,subcommandOriginal}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG21),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("comments",subcommand),output_manager_default.print(help(commentsCommand,{columns:client.stderr.columns})),0;function printSubcommandHelp(command2){output_manager_default.print(help(command2,{parent:commentsCommand,columns:client.stderr.columns}))}function handleHelp(command2){return needHelp?(telemetry2.trackCliFlagHelp("comments",subcommandOriginal),printSubcommandHelp(command2),!0):!1}switch(subcommand){case"inspect":return handleHelp(inspectSubcommand6)?0:(telemetry2.trackCliSubcommandInspect(subcommandOriginal),(await import("./chunks/inspect-IU2VMHWZ.js")).default(client,telemetry2));case"open":return handleHelp(openSubcommand)?0:(telemetry2.trackCliSubcommandOpen(subcommandOriginal),(await import("./chunks/open-NP444BUR.js")).default(client,telemetry2));case"reply":return handleHelp(replySubcommand)?0:(telemetry2.trackCliSubcommandReply(subcommandOriginal),(await import("./chunks/reply-BCDQQ6I2.js")).default(client,telemetry2));case"resolve":return handleHelp(resolveSubcommand)?0:(telemetry2.trackCliSubcommandResolve(subcommandOriginal),(await import("./chunks/resolve-VKJAE7KO.js")).default(client,telemetry2,!0));case"reopen":return handleHelp(reopenSubcommand)?0:(telemetry2.trackCliSubcommandReopen(subcommandOriginal),(await import("./chunks/resolve-VKJAE7KO.js")).default(client,telemetry2,!1));case"edit":return handleHelp(editSubcommand)?0:(telemetry2.trackCliSubcommandEdit(subcommandOriginal),(await import("./chunks/edit-EDTBD7PX.js")).default(client,telemetry2));case"delete":return handleHelp(deleteSubcommand)?0:(telemetry2.trackCliSubcommandDelete(subcommandOriginal),(await import("./chunks/delete-NIPKCWUT.js")).default(client,telemetry2));default:{if(needHelp)return telemetry2.trackCliFlagHelp("comments",subcommandOriginal),subcommandOriginal!=="default"?printSubcommandHelp(listSubcommand8):output_manager_default.print(help(commentsCommand,{columns:client.stderr.columns})),0;telemetry2.trackCliSubcommandList(subcommandOriginal);let defaultInvocation=subcommandOriginal==="default";return(await import("./chunks/list-5LMFTD7U.js")).default(client,telemetry2,defaultInvocation)}}}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{trackCliSubcommandCreate(actual){this.trackCliSubcommand({subcommand:"create",value:actual})}trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandToken(actual){this.trackCliSubcommand({subcommand:"token",value:actual})}trackCliSubcommandRemove(actual){this.trackCliSubcommand({subcommand:"remove",value:actual})}trackCliSubcommandOpen(actual){this.trackCliSubcommand({subcommand:"open",value:actual})}trackCliSubcommandContacts(actual){this.trackCliSubcommand({subcommand:"contacts",value:actual})}trackCliSubcommandAttach(actual){this.trackCliSubcommand({subcommand:"attach",value:actual})}trackCliSubcommandDetach(actual){this.trackCliSubcommand({subcommand:"detach",value:actual})}trackCliSubcommandUpdate(actual){this.trackCliSubcommand({subcommand:"update",value:actual})}trackCliSubcommandRevokeTokens(actual){this.trackCliSubcommand({subcommand:"revoke-tokens",value:actual})}trackCliArgumentClient(v){v&&this.trackCliArgument({arg:"client",value:this.redactedValue})}trackCliArgumentId(v){v&&this.trackCliArgument({arg:"id",value:this.redactedValue})}trackCliArgumentService(v){if(v){let value=serviceTelemetryValue(v);this.trackCliArgument({arg:"service",value:value??this.redactedValue})}}trackCliOptionName(v){v&&this.trackCliOption({option:"name",value:this.redactedValue})}trackCliOptionSubject(v){v&&this.trackCliOption({option:"subject",value:v==="user"||v==="app"?v:this.redactedValue})}trackCliOptionInstallationId(v){v&&this.trackCliOption({option:"installation-id",value:this.redactedValue})}trackCliOptionScopes(v){v&&this.trackCliOption({option:"scopes",value:this.redactedValue})}trackCliFlagNoDefaultScopes(v){v&&this.trackCliFlag("no-default-scopes")}trackCliOptionIcon(v){v&&this.trackCliOption({option:"icon",value:this.redactedValue})}trackCliOptionBackgroundColor(v){v&&this.trackCliOption({option:"background-color",value:isValidHexColor(v)?v:this.redactedValue})}trackCliOptionAccentColor(v){v&&this.trackCliOption({option:"accent-color",value:isValidHexColor(v)?v:this.redactedValue})}trackCliOptionData(v){v!==void 0&&this.trackCliOption({option:"data",value:this.redactedValue})}trackCliOptionConnectorType(v){v&&this.trackCliOption({option:"connector-type",value:v})}trackCliOptionConnectionMethod(v){v&&this.trackCliOption({option:"connection-method",value:v})}trackCliOptionTarget(v){v&&this.trackCliOption({option:"target",value:v})}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)})}trackCliOptionTriggerBranch(v){v&&this.trackCliOption({option:"trigger-branch",value:this.redactedValue})}trackCliOptionTriggerEnvironment(v){v&&this.trackCliOption({option:"trigger-environment",value:this.redactedValue})}trackCliOptionTriggerPath(v){v&&this.trackCliOption({option:"trigger-path",value:this.redactedValue})}trackCliOptionTriggerProject(v){v&&this.trackCliOption({option:"trigger-project",value:this.redactedValue})}trackCliFlagMyTokens(v){v&&this.trackCliFlag("my-tokens")}trackCliFlagAllTokens(v){v&&this.trackCliFlag("all-tokens")}trackCliFlagAllProjects(v){v&&this.trackCliFlag("all-projects")}trackCliOptionLimit(v){v!==void 0&&this.trackCliOption({option:"limit",value:String(v)})}trackCliOptionNext(v){v&&this.trackCliOption({option:"next",value:this.redactedValue})}trackCliOptionSearch(v){v&&this.trackCliOption({option:"search",value:this.redactedValue})}trackCliOptionService(v){if(!(!v||v.length===0))for(let raw of v)for(let svc of raw.split(","))svc.trim()&&this.trackCliOption({option:"service",value:this.redactedValue})}trackCliOptionType(v){if(!(!v||v.length===0))for(let raw of v)for(let t of raw.split(",")){let trimmed=t.trim();trimmed&&this.trackCliOption({option:"type",value:trimmed})}}trackCliOptionFormat(v){v&&this.trackCliOption({option:"format",value:v})}trackCliOptionEnvironment(v){if(!(!v||v.length===0))for(let raw of v)for(let env of raw.split(",")){let trimmed=env.trim();trimmed&&this.trackCliOption({option:"environment",value:this.redactedTargetName(trimmed)})}}};var import_open3=__toESM(require_open(),1);import{readFile as readFile3}from"node:fs/promises";import{resolve as resolve6}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 as createHash2}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=createHash2("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 as readFile2,stat as stat2}from"node:fs/promises";import{resolve as resolve5}from"node:path";import{createHash as createHash3}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=resolve5(cwd,filePath),size;try{size=(await stat2(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 readFile2(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=createHash3("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 e2=err;throw new Error(`Failed to upload icon: ${e2.serverMessage??e2.message}`)}return prepared.sha}var import_chalk58=__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(targets2){return targets2.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,text3,url)=>linksToSameTarget(text3,url)?output_manager_default.link(text3,url,{fallback:()=>import_chalk58.default.cyan(url)}):output_manager_default.link(text3,url)).replace(/\*\*([^*]+)\*\*/g,(_match,text3)=>import_chalk58.default.bold(text3))}function connexMarkdownToPlainText(markdown){return markdown.replace(/\[([^\]]+)\]\(([^)\s]+)\)/g,(_match,text3,url)=>linksToSameTarget(text3,url)?url:`${text3} (${url})`).replace(/\*\*([^*]+)\*\*/g,"$1")}function linksToSameTarget(text3,url){let normalize=value=>value.trim().replace(/^https?:\/\//,"").replace(/\/+$/,"").toLowerCase();return normalize(text3)===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_chalk58.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_chalk58.default.cyan(CONNEX_REDIRECT_URI)} as a redirect URI in that app.`),method.docUrl&&method.docUrl!==registerUrl&&lines.push(`Docs: ${import_chalk58.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_chalk58.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?`
|
|
295
305
|
|
|
296
306
|
Expected --data schema for connection method "${method.connectionMethod}":
|
|
297
307
|
${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:targets2,connectionMethodFlag,targetFlag}=opts;if(methods.length===0)throw new ConnexMethodError(`"${opts.service}" doesn't publish connection methods.`);let explicitTarget=targetFlag?validateTarget(targetFlag,targets2,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&&targets2&&targets2.length>1&&opts.interactive&&(printOptionCatalog(`${opts.serviceName} products:`,targets2.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:targets2.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_chalk58.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(entry2=>entry2.description||entry2.docsUrl)){output_manager_default.print(`
|
|
@@ -314,7 +324,7 @@ ${documentationLines}`),!0}function formatTargets(serviceName,targets2,width){le
|
|
|
314
324
|
`)}function formatMethods(serviceName,methods,targets2,width){let lines=["",` ${import_chalk59.default.dim(`Connection methods for ${serviceName}:`)}`,""];for(let method of methods){let badge=createPathBadge(method);lines.push(` ${import_chalk59.default.bold(method.connectionMethod)} ${method.label}${badge?import_chalk59.default.dim(` \u2014 ${badge}`):""}`);for(let line2 of describeLines(method.description,void 0,width))lines.push(line2);let connectsTo=(method.targets??[]).map(slug=>targets2.find(t=>t.target===slug)?.label??slug).join(", ");connectsTo&&targets2.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_chalk59.default.cyan(registerUrl)}`));for(let field of method.templateFields??[]){let detail=field.default?`default: ${field.default}`:field.placeholder?`e.g. ${field.placeholder}`:void 0;lines.push(indented(`--param ${field.key}=<value> ${import_chalk59.default.dim(detail?`${field.label} \xB7 ${detail}`:field.label)}`))}if(method.instructions)for(let line2 of wrapPlain(connexMarkdownToPlainText(method.instructions),width-6))lines.push(indented(import_chalk59.default.dim(line2)));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_chalk59.default.dim(credentials)}`))}lines.push("")}return lines.join(`
|
|
315
325
|
`)}function formatExamples(service,methods){let lines=["",` ${import_chalk59.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_chalk59.default.dim("-")} Connect with ${method.label}`),lines.push(""),lines.push(` ${import_chalk59.default.cyan(`$ ${parts.join(" ")}`)}`)}return lines.push(""),lines.push(` ${import_chalk59.default.dim(`Run \`${packageName} ${COMMAND} --help\` for all options.`)}`),lines.push(""),lines.join(`
|
|
316
326
|
`)}function describeLines(description,docsUrl,width){let lines=[];if(description)for(let line2 of wrapPlain(description,width-6))lines.push(indented(import_chalk59.default.dim(line2)));return docsUrl&&lines.push(indented(import_chalk59.default.dim(`Docs: ${docsUrl}`))),lines}function indented(text3){return` ${text3}`}var import_chalk60=__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_chalk60.default.bold(clientIdOrUid)}`):output_manager_default.error(`Failed to verify ${import_chalk60.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_chalk60.default.bold(clientIdOrUid)}`),1):(output_manager_default.error(`Failed to update ${import_chalk60.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)}
|
|
317
|
-
`);else{let displayName=updated.uid||updated.id;output_manager_default.success(`Connector ${import_chalk60.default.bold(displayName)} updated.`)}return 0}var import_chalk61=__toESM(require_source(),1);var
|
|
327
|
+
`);else{let displayName=updated.uid||updated.id;output_manager_default.success(`Connector ${import_chalk60.default.bold(displayName)} updated.`)}return 0}var import_chalk61=__toESM(require_source(),1);var import_strip_ansi4=__toESM(require_strip_ansi(),1);function sanitizeForTerminal(value){return(0,import_strip_ansi4.default)(value)}async function list13(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(s=>s.trim().toLowerCase())).filter(Boolean),services=(flags["--service"]??[]).flatMap(v=>v.split(",").map(s=>s.trim().toLowerCase())).filter(Boolean),searchQuery=flags["--search"],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({connectors:jsonClients,cursor:response.cursor},null,2)}
|
|
318
328
|
`),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_chalk61.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_chalk61.default.bold(projectName)}:`);let headers=["UID","ID","Name","Type"];unscoped&&headers.push("Projects");let rows=clients.map(c=>{let row=[sanitizeForTerminal(c.uid||"")||import_chalk61.default.gray("\u2013"),c.id,sanitizeForTerminal(c.name||"")||import_chalk61.default.gray("\u2013"),sanitizeForTerminal(c.typeName||c.type)];if(unscoped){let projectsInclude=c.includes?.projects,names=(projectsInclude?.items??[]).map(p=>p.project?.name).filter(n=>!!n).map(sanitizeForTerminal),more=projectsInclude?.hasMore===!0,cell2;if(names.length===0&&!more)cell2=import_chalk61.default.gray("\u2013");else{let parts=[];names.length&&parts.push(names.join(", ")),more&&parts.push(import_chalk61.default.gray("+ more")),cell2=parts.join(" ")}row.push(cell2)}return row});if(output_manager_default.print(`${table([headers.map(h=>import_chalk61.default.bold(import_chalk61.default.cyan(h))),...rows],{hsep:4})}
|
|
319
329
|
`),response.cursor){let parts=[`${packageName} connect list`];allProjects&&parts.push("--all-projects");for(let t of types)parts.push(`--type ${t}`);for(let s of services)parts.push(`--service ${s}`);searchQuery&&parts.push(`--search "${searchQuery}"`),parts.push(`--next ${response.cursor}`),output_manager_default.log(`To see more, run \`${parts.join(" ")}\``)}return 0}var import_open4=__toESM(require_open(),1);async function token(client,args,flags){let formatResult=validateJsonOutput(flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput,clientId=args[0];if(!clientId)return output_manager_default.error("Missing connector ID or UID. Usage: vercel connect token <id>"),2;let subject=flags["--subject"];if(subject&&subject!=="app"&&subject!=="user")return output_manager_default.error('Invalid --subject value. Must be "app" or "user".'),2;await selectConnexTeam(client,"Select the team for this token request");let tokenParams={};flags["--installation-id"]&&(tokenParams.installationId=flags["--installation-id"]),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);let errorCode=result.errorCode,errorMessage2=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(`${errorMessage2} This connector does not support getting a token for the requested subject.`),1;if(!isActionable(errorCode))return output_manager_default.error(errorMessage2),1;let teamId=client.config.currentTeam;if(!teamId)return output_manager_default.error(`${errorMessage2} 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(errorMessage2),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(errorMessage2),!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:
|
|
320
330
|
${actionUrl}`),(0,import_open4.default)(actionUrl).catch(err=>output_manager_default.debug(`Failed to open browser: ${err}`)),output_manager_default.spinner(`Waiting for ${actionLabel} to complete in the browser...`);let pollData=await awaitConnexResult(client,verifier);if(output_manager_default.stopSpinner(),!pollData)return 1;let retryBody={...body};pollData.installationId&&!retryBody.installationId&&(retryBody.installationId=pollData.installationId),output_manager_default.spinner("Fetching token...");let retryResult=await fetchToken(client,clientId,retryBody);return output_manager_default.stopSpinner(),retryResult.ok?printTokenResult(client,retryResult.data,asJson):(output_manager_default.error(retryResult.errorMessage??`Failed to get token after ${actionLabel}`),1)}function parseScopes(raw){return raw.split(/[\s,]+/).map(s=>s.trim()).filter(Boolean)}function isActionable(code2){return code2==="user_authorization_required"||code2==="client_installation_required"}function buildActionUrl(code2,clientId,teamId,requestCode,tokenParams){let path3=code2==="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/${path3}/${encodeURIComponent(clientId)}?${params.toString()}`}function printTokenResult(client,data,asJson){return asJson?client.stdout.write(`${JSON.stringify(data,null,2)}
|
|
@@ -330,10 +340,10 @@ ${actionUrl}`),(0,import_open4.default)(actionUrl).catch(err=>output_manager_def
|
|
|
330
340
|
`),0):client.stdout.isTTY?(output_manager_default.print(`Opening connector ${import_chalk67.default.bold(clientIdOrUid)} in the dashboard\u2026
|
|
331
341
|
`),(0,import_open5.default)(url),0):(client.stdout.write(`${url}
|
|
332
342
|
`),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_chalk68=__toESM(require_source(),1);async function add2(client,argv){let telemetry2=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;telemetry2.trackCliArgumentConnector(args[0]),telemetry2.trackCliOptionPhoneNumber(flags["--phone-number"]),telemetry2.trackCliOptionFormat(flags["--format"]),telemetry2.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)}
|
|
333
|
-
`),0;let safePhoneNumber=sanitizeForTerminal(phoneNumber);return output_manager_default.success(`Contact ${import_chalk68.default.bold(safePhoneNumber)} added.`),verification.instructions&&output_manager_default.log(sanitizeForTerminal(verification.instructions)),0}var COMMAND_CONFIG22={add:getCommandAliases(contactsAddSubcommand)};async function contacts(client){let telemetry2=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}=getSubcommand7(parsedArgs.args,COMMAND_CONFIG22),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("connect contacts"),output_manager_default.print(help(contactsSubcommand,{parent:connexCommand,columns:client.stderr.columns})),0;function printHelp(command2){output_manager_default.print(help(command2,{parent:contactsSubcommand,columns:client.stderr.columns}))}switch(subcommand){case"add":return needHelp?(telemetry2.trackCliFlagHelp("connect contacts",subcommandOriginal),printHelp(contactsAddSubcommand),0):(telemetry2.trackCliSubcommandAdd(subcommandOriginal),add2(client,subArgs));default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG22)),output_manager_default.print(help(contactsSubcommand,{parent:connexCommand,columns:client.stderr.columns})),2}}var COMMAND_CONFIG23={create:getCommandAliases(createSubcommand2),update:getCommandAliases(updateSubcommand),list:getCommandAliases(listSubcommand8),token:getCommandAliases(tokenSubcommand),attach:getCommandAliases(attachSubcommand),detach:getCommandAliases(detachSubcommand),remove:getCommandAliases(removeSubcommand4),"revoke-tokens":getCommandAliases(revokeTokensSubcommand),open:getCommandAliases(openSubcommand2),contacts:getCommandAliases(contactsSubcommand)};async function connex(client){let telemetry2=new ConnexTelemetryClient({opts:{store:client.telemetryEventStore}}),{args,flags}=parseArguments(client.argv.slice(2),getFlagsSpecification(connexCommand.options),{permissive:!0}),{subcommand,subcommandOriginal,args:subArgs}=getSubcommand7(args.slice(1),COMMAND_CONFIG23),needHelp=flags["--help"];function printHelp(command2,options){output_manager_default.print(help(command2,{...options,columns:client.stderr.columns,parent:connexCommand}))}function printHelpToStdout(command2,options){client.stdout.write(help(command2,{...options,columns:client.stderr.columns,parent:connexCommand}))}if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("connect"),output_manager_default.print(help(connexCommand,{columns:client.stderr.columns})),0;try{switch(subcommand){case"create":{if(needHelp)return telemetry2.trackCliFlagHelp("connect",subcommandOriginal),await printCreateDynamicHelp(client,findHelpServiceArg(subArgs),createSubcommand2,printHelpToStdout)||printHelpToStdout(createSubcommand2),0;telemetry2.trackCliSubcommandCreate(subcommandOriginal);let createFlagsSpec=getFlagsSpecification(createSubcommand2.options),createParsedArgs=parseArguments(normalizeCreateDataArgs(subArgs),createFlagsSpec);return telemetry2.trackCliArgumentService(createParsedArgs.args[0]),telemetry2.trackCliOptionName(createParsedArgs.flags["--name"]),telemetry2.trackCliOptionIcon(createParsedArgs.flags["--icon"]),telemetry2.trackCliOptionBackgroundColor(createParsedArgs.flags["--background-color"]),telemetry2.trackCliOptionAccentColor(createParsedArgs.flags["--accent-color"]),telemetry2.trackCliOptionData(createParsedArgs.flags["--data"]),telemetry2.trackCliOptionConnectorType(createParsedArgs.flags["--connector-type"]),telemetry2.trackCliOptionTriggerEvent(createParsedArgs.flags["--trigger-event"]),telemetry2.trackCliOptionConnectionMethod(createParsedArgs.flags["--connection-method"]),telemetry2.trackCliOptionTarget(createParsedArgs.flags["--target"]),telemetry2.trackCliOptionParam(createParsedArgs.flags["--param"]),telemetry2.trackCliFlagYes(createParsedArgs.flags["--yes"]),telemetry2.trackCliFlagTriggers(createParsedArgs.flags["--triggers"]),telemetry2.trackCliOptionTriggerPath(createParsedArgs.flags["--trigger-path"]),telemetry2.trackCliOptionTriggerProject(createParsedArgs.flags["--trigger-project"]),telemetry2.trackCliOptionTriggerBranch(createParsedArgs.flags["--trigger-branch"]),telemetry2.trackCliOptionTriggerEnvironment(createParsedArgs.flags["--trigger-environment"]),telemetry2.trackCliOptionFormat(createParsedArgs.flags["--format"]),await create3(client,createParsedArgs.args,createParsedArgs.flags)}case"update":{if(needHelp)return telemetry2.trackCliFlagHelp("connect",subcommandOriginal),printHelp(updateSubcommand),0;telemetry2.trackCliSubcommandUpdate(subcommandOriginal);let updateFlagsSpec=getFlagsSpecification(updateSubcommand.options),updateParsedArgs=parseArguments(subArgs,updateFlagsSpec);return telemetry2.trackCliArgumentId(updateParsedArgs.args[0]),telemetry2.trackCliOptionIcon(updateParsedArgs.flags["--icon"]),telemetry2.trackCliOptionBackgroundColor(updateParsedArgs.flags["--background-color"]),telemetry2.trackCliOptionAccentColor(updateParsedArgs.flags["--accent-color"]),telemetry2.trackCliOptionFormat(updateParsedArgs.flags["--format"]),await update(client,updateParsedArgs.args,updateParsedArgs.flags)}case"list":{if(needHelp)return telemetry2.trackCliFlagHelp("connect",subcommandOriginal),printHelp(listSubcommand8),0;telemetry2.trackCliSubcommandList(subcommandOriginal);let listFlagsSpec=getFlagsSpecification(listSubcommand8.options),listParsedArgs=parseArguments(subArgs,listFlagsSpec);return telemetry2.trackCliFlagAllProjects(listParsedArgs.flags["--all-projects"]),telemetry2.trackCliOptionLimit(listParsedArgs.flags["--limit"]),telemetry2.trackCliOptionNext(listParsedArgs.flags["--next"]),telemetry2.trackCliOptionSearch(listParsedArgs.flags["--search"]),telemetry2.trackCliOptionService(listParsedArgs.flags["--service"]),telemetry2.trackCliOptionType(listParsedArgs.flags["--type"]),telemetry2.trackCliOptionFormat(listParsedArgs.flags["--format"]),await list13(client,listParsedArgs.flags)}case"token":{if(needHelp)return telemetry2.trackCliFlagHelp("connect",subcommandOriginal),printHelp(tokenSubcommand),0;telemetry2.trackCliSubcommandToken(subcommandOriginal);let tokenFlagsSpec=getFlagsSpecification(tokenSubcommand.options),tokenParsedArgs=parseArguments(subArgs,tokenFlagsSpec);return telemetry2.trackCliArgumentId(tokenParsedArgs.args[0]),telemetry2.trackCliOptionSubject(tokenParsedArgs.flags["--subject"]),telemetry2.trackCliOptionInstallationId(tokenParsedArgs.flags["--installation-id"]),telemetry2.trackCliOptionScopes(tokenParsedArgs.flags["--scopes"]),telemetry2.trackCliFlagNoDefaultScopes(tokenParsedArgs.flags["--no-default-scopes"]),telemetry2.trackCliFlagYes(tokenParsedArgs.flags["--yes"]),telemetry2.trackCliOptionFormat(tokenParsedArgs.flags["--format"]),await token(client,tokenParsedArgs.args,tokenParsedArgs.flags)}case"attach":{if(needHelp)return telemetry2.trackCliFlagHelp("connect",subcommandOriginal),printHelp(attachSubcommand),0;telemetry2.trackCliSubcommandAttach(subcommandOriginal);let attachFlagsSpec=getFlagsSpecification(attachSubcommand.options),attachParsedArgs=parseArguments(subArgs,attachFlagsSpec);return telemetry2.trackCliArgumentClient(attachParsedArgs.args[0]),telemetry2.trackCliOptionEnvironment(attachParsedArgs.flags["--environment"]),telemetry2.trackCliOptionProject(attachParsedArgs.flags["--project"]),telemetry2.trackCliFlagTriggers(attachParsedArgs.flags["--triggers"]),telemetry2.trackCliOptionTriggerBranch(attachParsedArgs.flags["--trigger-branch"]),telemetry2.trackCliOptionTriggerEnvironment(attachParsedArgs.flags["--trigger-environment"]),telemetry2.trackCliOptionTriggerPath(attachParsedArgs.flags["--trigger-path"]),telemetry2.trackCliFlagYes(attachParsedArgs.flags["--yes"]),telemetry2.trackCliOptionFormat(attachParsedArgs.flags["--format"]),await attach(client,attachParsedArgs.args,attachParsedArgs.flags)}case"detach":{if(needHelp)return telemetry2.trackCliFlagHelp("connect",subcommandOriginal),printHelp(detachSubcommand),0;telemetry2.trackCliSubcommandDetach(subcommandOriginal);let detachFlagsSpec=getFlagsSpecification(detachSubcommand.options),detachParsedArgs=parseArguments(subArgs,detachFlagsSpec);return telemetry2.trackCliArgumentClient(detachParsedArgs.args[0]),telemetry2.trackCliOptionProject(detachParsedArgs.flags["--project"]),telemetry2.trackCliFlagYes(detachParsedArgs.flags["--yes"]),telemetry2.trackCliOptionFormat(detachParsedArgs.flags["--format"]),await detach(client,detachParsedArgs.args,detachParsedArgs.flags)}case"remove":{if(needHelp)return telemetry2.trackCliFlagHelp("connect",subcommandOriginal),printHelp(removeSubcommand4),0;telemetry2.trackCliSubcommandRemove(subcommandOriginal);let removeFlagsSpec=getFlagsSpecification(removeSubcommand4.options),removeParsedArgs=parseArguments(subArgs,removeFlagsSpec);return telemetry2.trackCliArgumentClient(removeParsedArgs.args[0]),telemetry2.trackCliFlagYes(removeParsedArgs.flags["--yes"]),telemetry2.trackCliFlagDisconnectAll(removeParsedArgs.flags["--disconnect-all"]),telemetry2.trackCliOptionFormat(removeParsedArgs.flags["--format"]),await remove7(client,removeParsedArgs.args,removeParsedArgs.flags)}case"revoke-tokens":{if(needHelp)return telemetry2.trackCliFlagHelp("connect",subcommandOriginal),printHelp(revokeTokensSubcommand),0;telemetry2.trackCliSubcommandRevokeTokens(subcommandOriginal);let revokeTokensFlagsSpec=getFlagsSpecification(revokeTokensSubcommand.options),revokeTokensParsedArgs=parseArguments(subArgs,revokeTokensFlagsSpec);return telemetry2.trackCliArgumentId(revokeTokensParsedArgs.args[0]),telemetry2.trackCliFlagMyTokens(revokeTokensParsedArgs.flags["--my-tokens"]),telemetry2.trackCliFlagAllTokens(revokeTokensParsedArgs.flags["--all-tokens"]),telemetry2.trackCliFlagYes(revokeTokensParsedArgs.flags["--yes"]),telemetry2.trackCliOptionFormat(revokeTokensParsedArgs.flags["--format"]),await revokeTokens(client,revokeTokensParsedArgs.args,revokeTokensParsedArgs.flags)}case"contacts":return telemetry2.trackCliSubcommandContacts(subcommandOriginal),await contacts(client);case"open":{if(needHelp)return telemetry2.trackCliFlagHelp("connect",subcommandOriginal),printHelp(openSubcommand2),0;telemetry2.trackCliSubcommandOpen(subcommandOriginal);let openFlagsSpec=getFlagsSpecification(openSubcommand2.options),openParsedArgs=parseArguments(subArgs,openFlagsSpec);return telemetry2.trackCliOptionFormat(openParsedArgs.flags["--format"]),await openClient(client,openParsedArgs.args,openParsedArgs.flags)}default:{let validSubcommands=Object.keys(COMMAND_CONFIG23).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(createSubcommand2.options),{permissive:!0});return args.find(arg2=>!arg2.startsWith("-"))}catch{return}}function normalizeCreateDataArgs(args){let normalized=[];for(let i=0;i<args.length;i++){let arg2=args[i];if(normalized.push(arg2),arg2==="--data"){let next=args[i+1];(next===void 0||next.startsWith("-"))&&normalized.push("")}}return normalized}var import_chalk69=__toESM(require_source(),1);var ContractTelemetryClient=class extends TelemetryClient{trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var import_error_utils7=__toESM(require_dist(),1);function formatCurrency(amount){return`$${amount.toFixed(4)}`}function formatQuantity(quantity,unit){return unit==="USD"?`$${quantity.toFixed(4)}`:quantity.toFixed(4)}function extractDatePortion(isoString){return isoString.slice(0,10)}async function contract(client){let{print,log,error,spinner}=output_manager_default,flagsSpecification=getFlagsSpecification(contractCommand.options),parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(err){return printError(err),2}let telemetry2=new ContractTelemetryClient({opts:{store:client.telemetryEventStore}});if(parsedArgs.flags["--help"])return telemetry2.trackCliFlagHelp("contract"),print(help(contractCommand,{columns:client.stderr.columns})),0;let formatResult=validateJsonOutput(parsedArgs.flags);if(!formatResult.valid)return error(formatResult.error),2;let asJson=formatResult.jsonOutput;telemetry2.trackCliOptionFormat(parsedArgs.flags["--format"]),telemetry2.trackCliFlagJson(parsedArgs.flags["--json"]);let contextName,teamId;try{let scope=await getScope(client);contextName=scope.contextName,teamId=scope.team?.id}catch(err){if((0,import_error_utils7.isErrnoException)(err)&&(err.code==="NOT_AUTHORIZED"||err.code==="TEAM_DELETED"))return error(err.message),1;throw err}let start=Date.now();asJson||spinner(`Fetching contract commitments for ${import_chalk69.default.bold(contextName)}`);let query=new URLSearchParams;teamId&&query.set("teamId",teamId);try{let response=await client.fetch(`/v1/billing/contract-commitments?${query}`,{json:!1,useCurrentTeam:!1});if(!response.ok){let errorText=await response.text();return error(`Failed to fetch contract commitments: ${response.status} ${errorText}`),1}let text3=await response.text(),data=text3?JSON.parse(text3):null,commitments=Array.isArray(data)?data:[];if(asJson){let jsonOutput={context:contextName,commitments:commitments.map(c=>({contractId:c.ContractId,contractPeriodStart:c.ContractPeriodStart,contractPeriodEnd:c.ContractPeriodEnd,commitmentId:c.ContractCommitmentId,commitmentType:c.ContractCommitmentType,commitmentCategory:c.ContractCommitmentCategory,commitmentPeriodStart:c.ContractCommitmentPeriodStart,commitmentPeriodEnd:c.ContractCommitmentPeriodEnd,commitmentCost:c.ContractCommitmentCost,commitmentQuantity:c.ContractCommitmentQuantity,commitmentUnit:c.ContractCommitmentUnit,billingCurrency:c.BillingCurrency,description:c.ContractCommitmentDescription})),totalCommitments:commitments.length};return client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
|
|
343
|
+
`),0;let safePhoneNumber=sanitizeForTerminal(phoneNumber);return output_manager_default.success(`Contact ${import_chalk68.default.bold(safePhoneNumber)} added.`),verification.instructions&&output_manager_default.log(sanitizeForTerminal(verification.instructions)),0}var COMMAND_CONFIG22={add:getCommandAliases(contactsAddSubcommand)};async function contacts(client){let telemetry2=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}=getSubcommand7(parsedArgs.args,COMMAND_CONFIG22),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("connect contacts"),output_manager_default.print(help(contactsSubcommand,{parent:connexCommand,columns:client.stderr.columns})),0;function printHelp(command2){output_manager_default.print(help(command2,{parent:contactsSubcommand,columns:client.stderr.columns}))}switch(subcommand){case"add":return needHelp?(telemetry2.trackCliFlagHelp("connect contacts",subcommandOriginal),printHelp(contactsAddSubcommand),0):(telemetry2.trackCliSubcommandAdd(subcommandOriginal),add2(client,subArgs));default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG22)),output_manager_default.print(help(contactsSubcommand,{parent:connexCommand,columns:client.stderr.columns})),2}}var COMMAND_CONFIG23={create:getCommandAliases(createSubcommand2),update:getCommandAliases(updateSubcommand),list:getCommandAliases(listSubcommand9),token:getCommandAliases(tokenSubcommand),attach:getCommandAliases(attachSubcommand),detach:getCommandAliases(detachSubcommand),remove:getCommandAliases(removeSubcommand5),"revoke-tokens":getCommandAliases(revokeTokensSubcommand),open:getCommandAliases(openSubcommand2),contacts:getCommandAliases(contactsSubcommand)};async function connex(client){let telemetry2=new ConnexTelemetryClient({opts:{store:client.telemetryEventStore}}),{args,flags}=parseArguments(client.argv.slice(2),getFlagsSpecification(connexCommand.options),{permissive:!0}),{subcommand,subcommandOriginal,args:subArgs}=getSubcommand7(args.slice(1),COMMAND_CONFIG23),needHelp=flags["--help"];function printHelp(command2,options){output_manager_default.print(help(command2,{...options,columns:client.stderr.columns,parent:connexCommand}))}function printHelpToStdout(command2,options){client.stdout.write(help(command2,{...options,columns:client.stderr.columns,parent:connexCommand}))}if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("connect"),output_manager_default.print(help(connexCommand,{columns:client.stderr.columns})),0;try{switch(subcommand){case"create":{if(needHelp)return telemetry2.trackCliFlagHelp("connect",subcommandOriginal),await printCreateDynamicHelp(client,findHelpServiceArg(subArgs),createSubcommand2,printHelpToStdout)||printHelpToStdout(createSubcommand2),0;telemetry2.trackCliSubcommandCreate(subcommandOriginal);let createFlagsSpec=getFlagsSpecification(createSubcommand2.options),createParsedArgs=parseArguments(normalizeCreateDataArgs(subArgs),createFlagsSpec);return telemetry2.trackCliArgumentService(createParsedArgs.args[0]),telemetry2.trackCliOptionName(createParsedArgs.flags["--name"]),telemetry2.trackCliOptionIcon(createParsedArgs.flags["--icon"]),telemetry2.trackCliOptionBackgroundColor(createParsedArgs.flags["--background-color"]),telemetry2.trackCliOptionAccentColor(createParsedArgs.flags["--accent-color"]),telemetry2.trackCliOptionData(createParsedArgs.flags["--data"]),telemetry2.trackCliOptionConnectorType(createParsedArgs.flags["--connector-type"]),telemetry2.trackCliOptionTriggerEvent(createParsedArgs.flags["--trigger-event"]),telemetry2.trackCliOptionConnectionMethod(createParsedArgs.flags["--connection-method"]),telemetry2.trackCliOptionTarget(createParsedArgs.flags["--target"]),telemetry2.trackCliOptionParam(createParsedArgs.flags["--param"]),telemetry2.trackCliFlagYes(createParsedArgs.flags["--yes"]),telemetry2.trackCliFlagTriggers(createParsedArgs.flags["--triggers"]),telemetry2.trackCliOptionTriggerPath(createParsedArgs.flags["--trigger-path"]),telemetry2.trackCliOptionTriggerProject(createParsedArgs.flags["--trigger-project"]),telemetry2.trackCliOptionTriggerBranch(createParsedArgs.flags["--trigger-branch"]),telemetry2.trackCliOptionTriggerEnvironment(createParsedArgs.flags["--trigger-environment"]),telemetry2.trackCliOptionFormat(createParsedArgs.flags["--format"]),await create3(client,createParsedArgs.args,createParsedArgs.flags)}case"update":{if(needHelp)return telemetry2.trackCliFlagHelp("connect",subcommandOriginal),printHelp(updateSubcommand),0;telemetry2.trackCliSubcommandUpdate(subcommandOriginal);let updateFlagsSpec=getFlagsSpecification(updateSubcommand.options),updateParsedArgs=parseArguments(subArgs,updateFlagsSpec);return telemetry2.trackCliArgumentId(updateParsedArgs.args[0]),telemetry2.trackCliOptionIcon(updateParsedArgs.flags["--icon"]),telemetry2.trackCliOptionBackgroundColor(updateParsedArgs.flags["--background-color"]),telemetry2.trackCliOptionAccentColor(updateParsedArgs.flags["--accent-color"]),telemetry2.trackCliOptionFormat(updateParsedArgs.flags["--format"]),await update(client,updateParsedArgs.args,updateParsedArgs.flags)}case"list":{if(needHelp)return telemetry2.trackCliFlagHelp("connect",subcommandOriginal),printHelp(listSubcommand9),0;telemetry2.trackCliSubcommandList(subcommandOriginal);let listFlagsSpec=getFlagsSpecification(listSubcommand9.options),listParsedArgs=parseArguments(subArgs,listFlagsSpec);return telemetry2.trackCliFlagAllProjects(listParsedArgs.flags["--all-projects"]),telemetry2.trackCliOptionLimit(listParsedArgs.flags["--limit"]),telemetry2.trackCliOptionNext(listParsedArgs.flags["--next"]),telemetry2.trackCliOptionSearch(listParsedArgs.flags["--search"]),telemetry2.trackCliOptionService(listParsedArgs.flags["--service"]),telemetry2.trackCliOptionType(listParsedArgs.flags["--type"]),telemetry2.trackCliOptionFormat(listParsedArgs.flags["--format"]),await list13(client,listParsedArgs.flags)}case"token":{if(needHelp)return telemetry2.trackCliFlagHelp("connect",subcommandOriginal),printHelp(tokenSubcommand),0;telemetry2.trackCliSubcommandToken(subcommandOriginal);let tokenFlagsSpec=getFlagsSpecification(tokenSubcommand.options),tokenParsedArgs=parseArguments(subArgs,tokenFlagsSpec);return telemetry2.trackCliArgumentId(tokenParsedArgs.args[0]),telemetry2.trackCliOptionSubject(tokenParsedArgs.flags["--subject"]),telemetry2.trackCliOptionInstallationId(tokenParsedArgs.flags["--installation-id"]),telemetry2.trackCliOptionScopes(tokenParsedArgs.flags["--scopes"]),telemetry2.trackCliFlagNoDefaultScopes(tokenParsedArgs.flags["--no-default-scopes"]),telemetry2.trackCliFlagYes(tokenParsedArgs.flags["--yes"]),telemetry2.trackCliOptionFormat(tokenParsedArgs.flags["--format"]),await token(client,tokenParsedArgs.args,tokenParsedArgs.flags)}case"attach":{if(needHelp)return telemetry2.trackCliFlagHelp("connect",subcommandOriginal),printHelp(attachSubcommand),0;telemetry2.trackCliSubcommandAttach(subcommandOriginal);let attachFlagsSpec=getFlagsSpecification(attachSubcommand.options),attachParsedArgs=parseArguments(subArgs,attachFlagsSpec);return telemetry2.trackCliArgumentClient(attachParsedArgs.args[0]),telemetry2.trackCliOptionEnvironment(attachParsedArgs.flags["--environment"]),telemetry2.trackCliOptionProject(attachParsedArgs.flags["--project"]),telemetry2.trackCliFlagTriggers(attachParsedArgs.flags["--triggers"]),telemetry2.trackCliOptionTriggerBranch(attachParsedArgs.flags["--trigger-branch"]),telemetry2.trackCliOptionTriggerEnvironment(attachParsedArgs.flags["--trigger-environment"]),telemetry2.trackCliOptionTriggerPath(attachParsedArgs.flags["--trigger-path"]),telemetry2.trackCliFlagYes(attachParsedArgs.flags["--yes"]),telemetry2.trackCliOptionFormat(attachParsedArgs.flags["--format"]),await attach(client,attachParsedArgs.args,attachParsedArgs.flags)}case"detach":{if(needHelp)return telemetry2.trackCliFlagHelp("connect",subcommandOriginal),printHelp(detachSubcommand),0;telemetry2.trackCliSubcommandDetach(subcommandOriginal);let detachFlagsSpec=getFlagsSpecification(detachSubcommand.options),detachParsedArgs=parseArguments(subArgs,detachFlagsSpec);return telemetry2.trackCliArgumentClient(detachParsedArgs.args[0]),telemetry2.trackCliOptionProject(detachParsedArgs.flags["--project"]),telemetry2.trackCliFlagYes(detachParsedArgs.flags["--yes"]),telemetry2.trackCliOptionFormat(detachParsedArgs.flags["--format"]),await detach(client,detachParsedArgs.args,detachParsedArgs.flags)}case"remove":{if(needHelp)return telemetry2.trackCliFlagHelp("connect",subcommandOriginal),printHelp(removeSubcommand5),0;telemetry2.trackCliSubcommandRemove(subcommandOriginal);let removeFlagsSpec=getFlagsSpecification(removeSubcommand5.options),removeParsedArgs=parseArguments(subArgs,removeFlagsSpec);return telemetry2.trackCliArgumentClient(removeParsedArgs.args[0]),telemetry2.trackCliFlagYes(removeParsedArgs.flags["--yes"]),telemetry2.trackCliFlagDisconnectAll(removeParsedArgs.flags["--disconnect-all"]),telemetry2.trackCliOptionFormat(removeParsedArgs.flags["--format"]),await remove7(client,removeParsedArgs.args,removeParsedArgs.flags)}case"revoke-tokens":{if(needHelp)return telemetry2.trackCliFlagHelp("connect",subcommandOriginal),printHelp(revokeTokensSubcommand),0;telemetry2.trackCliSubcommandRevokeTokens(subcommandOriginal);let revokeTokensFlagsSpec=getFlagsSpecification(revokeTokensSubcommand.options),revokeTokensParsedArgs=parseArguments(subArgs,revokeTokensFlagsSpec);return telemetry2.trackCliArgumentId(revokeTokensParsedArgs.args[0]),telemetry2.trackCliFlagMyTokens(revokeTokensParsedArgs.flags["--my-tokens"]),telemetry2.trackCliFlagAllTokens(revokeTokensParsedArgs.flags["--all-tokens"]),telemetry2.trackCliFlagYes(revokeTokensParsedArgs.flags["--yes"]),telemetry2.trackCliOptionFormat(revokeTokensParsedArgs.flags["--format"]),await revokeTokens(client,revokeTokensParsedArgs.args,revokeTokensParsedArgs.flags)}case"contacts":return telemetry2.trackCliSubcommandContacts(subcommandOriginal),await contacts(client);case"open":{if(needHelp)return telemetry2.trackCliFlagHelp("connect",subcommandOriginal),printHelp(openSubcommand2),0;telemetry2.trackCliSubcommandOpen(subcommandOriginal);let openFlagsSpec=getFlagsSpecification(openSubcommand2.options),openParsedArgs=parseArguments(subArgs,openFlagsSpec);return telemetry2.trackCliOptionFormat(openParsedArgs.flags["--format"]),await openClient(client,openParsedArgs.args,openParsedArgs.flags)}default:{let validSubcommands=Object.keys(COMMAND_CONFIG23).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(createSubcommand2.options),{permissive:!0});return args.find(arg2=>!arg2.startsWith("-"))}catch{return}}function normalizeCreateDataArgs(args){let normalized=[];for(let i=0;i<args.length;i++){let arg2=args[i];if(normalized.push(arg2),arg2==="--data"){let next=args[i+1];(next===void 0||next.startsWith("-"))&&normalized.push("")}}return normalized}var import_chalk69=__toESM(require_source(),1);var ContractTelemetryClient=class extends TelemetryClient{trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var import_error_utils7=__toESM(require_dist(),1);function formatCurrency(amount){return`$${amount.toFixed(4)}`}function formatQuantity(quantity,unit){return unit==="USD"?`$${quantity.toFixed(4)}`:quantity.toFixed(4)}function extractDatePortion(isoString){return isoString.slice(0,10)}async function contract(client){let{print,log,error,spinner}=output_manager_default,flagsSpecification=getFlagsSpecification(contractCommand.options),parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(err){return printError(err),2}let telemetry2=new ContractTelemetryClient({opts:{store:client.telemetryEventStore}});if(parsedArgs.flags["--help"])return telemetry2.trackCliFlagHelp("contract"),print(help(contractCommand,{columns:client.stderr.columns})),0;let formatResult=validateJsonOutput(parsedArgs.flags);if(!formatResult.valid)return error(formatResult.error),2;let asJson=formatResult.jsonOutput;telemetry2.trackCliOptionFormat(parsedArgs.flags["--format"]),telemetry2.trackCliFlagJson(parsedArgs.flags["--json"]);let contextName,teamId;try{let scope=await getScope(client);contextName=scope.contextName,teamId=scope.team?.id}catch(err){if((0,import_error_utils7.isErrnoException)(err)&&(err.code==="NOT_AUTHORIZED"||err.code==="TEAM_DELETED"))return error(err.message),1;throw err}let start=Date.now();asJson||spinner(`Fetching contract commitments for ${import_chalk69.default.bold(contextName)}`);let query=new URLSearchParams;teamId&&query.set("teamId",teamId);try{let response=await client.fetch(`/v1/billing/contract-commitments?${query}`,{json:!1,useCurrentTeam:!1});if(!response.ok){let errorText=await response.text();return error(`Failed to fetch contract commitments: ${response.status} ${errorText}`),1}let text3=await response.text(),data=text3?JSON.parse(text3):null,commitments=Array.isArray(data)?data:[];if(asJson){let jsonOutput={context:contextName,commitments:commitments.map(c=>({contractId:c.ContractId,contractPeriodStart:c.ContractPeriodStart,contractPeriodEnd:c.ContractPeriodEnd,commitmentId:c.ContractCommitmentId,commitmentType:c.ContractCommitmentType,commitmentCategory:c.ContractCommitmentCategory,commitmentPeriodStart:c.ContractCommitmentPeriodStart,commitmentPeriodEnd:c.ContractCommitmentPeriodEnd,commitmentCost:c.ContractCommitmentCost,commitmentQuantity:c.ContractCommitmentQuantity,commitmentUnit:c.ContractCommitmentUnit,billingCurrency:c.BillingCurrency,description:c.ContractCommitmentDescription})),totalCommitments:commitments.length};return client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
|
|
334
344
|
`),0}if(log(`Contract commitments for ${import_chalk69.default.bold(contextName)} ${elapsed(Date.now()-start)}`),log(""),commitments.length===0)return log("No contract commitments found."),0;let contractGroups=new Map;for(let commitment of commitments){let existing=contractGroups.get(commitment.ContractId)||[];existing.push(commitment),contractGroups.set(commitment.ContractId,existing)}for(let[contractId,contractCommitments]of contractGroups){let firstCommitment=contractCommitments[0];log(import_chalk69.default.bold(`Contract: ${contractId}`)),log(`${import_chalk69.default.gray("Period:")} ${extractDatePortion(firstCommitment.ContractPeriodStart)} to ${extractDatePortion(firstCommitment.ContractPeriodEnd)}`),log("");let headers=["Type","Category","Period","Commitment","Description"],rows=contractCommitments.map(c=>{let periodStr=`${extractDatePortion(c.ContractCommitmentPeriodStart)} - ${extractDatePortion(c.ContractCommitmentPeriodEnd)}`,commitmentValue;return c.ContractCommitmentCategory==="Spend"&&c.ContractCommitmentCost!==void 0?commitmentValue=formatCurrency(c.ContractCommitmentCost):c.ContractCommitmentCategory==="Usage"&&c.ContractCommitmentQuantity!==void 0?commitmentValue=formatQuantity(c.ContractCommitmentQuantity,c.ContractCommitmentUnit):commitmentValue="-",[c.ContractCommitmentType,c.ContractCommitmentCategory,periodStr,commitmentValue,c.ContractCommitmentDescription||"-"]}),tablePrint=table([headers.map(h=>import_chalk69.default.bold(import_chalk69.default.cyan(h))),...rows],{hsep:3,align:["l","l","l","r","l"]}).replace(/^/gm," ");print(`${tablePrint}
|
|
335
345
|
|
|
336
|
-
`)}return log(`${import_chalk69.default.gray("Total commitments:")} ${commitments.length}`),0}catch(err){return output_manager_default.prettyError(err),1}}var import_chalk70=__toESM(require_source(),1);var import_error_utils8=__toESM(require_dist(),1);import{readFileSync}from"fs";import{resolve as resolve7}from"path";async function createCertFromFile(client,keyPath2,certPath,caPath){output_manager_default.spinner("Adding your custom certificate");try{let cert=readFileSync(resolve7(certPath),"utf8"),key=readFileSync(resolve7(keyPath2),"utf8"),ca=readFileSync(resolve7(caPath),"utf8");return await client.fetch("/v3/certs",{method:"PUT",body:{ca,cert,key}})}catch(err){if((0,import_error_utils8.isErrnoException)(err)&&err.code==="ENOENT")return new Error(`The specified file "${err.path}" doesn't exist.`);if(isAPIError(err)&&err.status<500)return err;throw err}}var CertsAddTelemetryClient=class extends TelemetryClient{trackCliFlagOverwrite(v){v&&this.trackCliFlag("overwrite")}trackCliOptionCrt(v){v&&this.trackCliOption({option:"crt",value:this.redactedValue})}trackCliOptionKey(v){v&&this.trackCliOption({option:"key",value:this.redactedValue})}trackCliOptionCa(v){v&&this.trackCliOption({option:"ca",value:this.redactedValue})}};async function add3(client,argv){let{telemetryEventStore}=client,addStamp=stamp_default(),parsedArgs,flagsSpecification=getFlagsSpecification(
|
|
346
|
+
`)}return log(`${import_chalk69.default.gray("Total commitments:")} ${commitments.length}`),0}catch(err){return output_manager_default.prettyError(err),1}}var import_chalk70=__toESM(require_source(),1);var import_error_utils8=__toESM(require_dist(),1);import{readFileSync}from"fs";import{resolve as resolve7}from"path";async function createCertFromFile(client,keyPath2,certPath,caPath){output_manager_default.spinner("Adding your custom certificate");try{let cert=readFileSync(resolve7(certPath),"utf8"),key=readFileSync(resolve7(keyPath2),"utf8"),ca=readFileSync(resolve7(caPath),"utf8");return await client.fetch("/v3/certs",{method:"PUT",body:{ca,cert,key}})}catch(err){if((0,import_error_utils8.isErrnoException)(err)&&err.code==="ENOENT")return new Error(`The specified file "${err.path}" doesn't exist.`);if(isAPIError(err)&&err.status<500)return err;throw err}}var CertsAddTelemetryClient=class extends TelemetryClient{trackCliFlagOverwrite(v){v&&this.trackCliFlag("overwrite")}trackCliOptionCrt(v){v&&this.trackCliOption({option:"crt",value:this.redactedValue})}trackCliOptionKey(v){v&&this.trackCliOption({option:"key",value:this.redactedValue})}trackCliOptionCa(v){v&&this.trackCliOption({option:"ca",value:this.redactedValue})}};async function add3(client,argv){let{telemetryEventStore}=client,addStamp=stamp_default(),parsedArgs,flagsSpecification=getFlagsSpecification(addSubcommand2.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(err){return printError(err),2}let{args,flags:opts}=parsedArgs,cert,{"--overwrite":overwrite,"--crt":crtPath,"--key":keyPath2,"--ca":caPath}=opts,telemetry2=new CertsAddTelemetryClient({opts:{store:telemetryEventStore}});if(telemetry2.trackCliFlagOverwrite(overwrite),telemetry2.trackCliOptionCrt(crtPath),telemetry2.trackCliOptionKey(keyPath2),telemetry2.trackCliOptionCa(caPath),overwrite)return output_manager_default.error("Overwrite option is deprecated"),1;if(crtPath||keyPath2||caPath){if(args.length!==0||!crtPath||!keyPath2||!caPath)return output_manager_default.error("Invalid number of arguments to create a custom certificate entry. Usage:"),output_manager_default.print(` ${import_chalk70.default.cyan(`${getCommandName("certs add --crt <domain.crt> --key <domain.key> --ca <ca.crt>")}`)}
|
|
337
347
|
`),1;cert=await createCertFromFile(client,keyPath2,crtPath,caPath)}else{if(output_manager_default.warn(`${import_chalk70.default.cyan(getCommandName("certs add"))} will be soon deprecated. Please use ${import_chalk70.default.cyan(getCommandName("certs issue <cn> <cns>"))} instead`),args.length<1)return output_manager_default.error("Invalid number of arguments to create a custom certificate entry. Usage:"),output_manager_default.print(` ${import_chalk70.default.cyan(getCommandName("certs add <cn>[, <cn>]"))}
|
|
338
348
|
`),2;let cns=args.reduce((res,item)=>res.concat(item.split(",")),[]);output_manager_default.spinner(`Generating a certificate for ${import_chalk70.default.bold(cns.join(", "))}`);let contextName=await getContextName(client);cert=await createCertForCns(client,cns,contextName),output_manager_default.stopSpinner()}return cert instanceof Error?(output_manager_default.error(cert.message),1):(output_manager_default.success(`Certificate entry for ${import_chalk70.default.bold(cert.cns.join(", "))} created ${addStamp()}`),0)}var add_default=add3;var import_chalk73=__toESM(require_source(),1),import_tldts4=__toESM(require_cjs(),1);var import_chalk71=__toESM(require_source(),1);async function startCertOrder(client,cns,context){output_manager_default.spinner(`Issuing a certificate for ${import_chalk71.default.bold(cns.join(", "))}`);try{return await client.fetch("/v3/certs",{method:"PATCH",body:{op:"finalizeOrder",domains:cns}})}catch(err){if(isAPIError(err)){if(err.code==="cert_order_not_found")return new CertOrderNotFound(cns);let mappedError=mapCertError(err,cns);if(mappedError)return mappedError}throw err}}function getCnsFromArgs(args){return args.reduce((res,item)=>[...res,...item.split(",")],[]).filter(i=>i)}var import_chalk72=__toESM(require_source(),1);async function startCertOrder2(client,cns,contextName){return output_manager_default.spinner(`Starting certificate issuance for ${import_chalk72.default.bold(cns.join(", "))} under ${import_chalk72.default.bold(contextName)}`),await client.fetch("/v3/certs",{method:"PATCH",body:{op:"startOrder",domains:cns}})}var CertsIssueTelemetryClient=class extends CertsAddTelemetryClient{trackCliArgumentCn(value){value&&this.trackCliArgument({arg:"cn",value:this.redactedValue})}trackCliFlagChallengeOnly(v){v&&this.trackCliFlag("challenge-only")}};async function issue(client,argv){let cert,{telemetryEventStore}=client,addStamp=stamp_default(),parsedArgs,flagsSpecification=getFlagsSpecification(issueSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(err){return printError(err),2}let{args,flags:opts}=parsedArgs,{"--challenge-only":challengeOnly,"--overwrite":overwrite,"--crt":crtPath,"--key":keyPath2,"--ca":caPath}=opts,telemetry2=new CertsIssueTelemetryClient({opts:{store:telemetryEventStore}});if(telemetry2.trackCliFlagChallengeOnly(challengeOnly),telemetry2.trackCliFlagOverwrite(overwrite),telemetry2.trackCliOptionCrt(crtPath),telemetry2.trackCliOptionKey(keyPath2),telemetry2.trackCliOptionCa(caPath),overwrite)return output_manager_default.error("Overwrite option is deprecated"),1;if(crtPath||keyPath2||caPath)return args.length!==0||!crtPath||!keyPath2||!caPath?(output_manager_default.error("Invalid number of arguments to create a custom certificate entry. Usage:"),output_manager_default.print(` ${import_chalk73.default.cyan(getCommandName("certs issue --crt <domain.crt> --key <domain.key> --ca <ca.crt>"))}
|
|
339
349
|
`),1):(cert=await createCertFromFile(client,keyPath2,crtPath,caPath),cert instanceof Error?(output_manager_default.error(cert.message),1):(output_manager_default.success(`Certificate entry for ${import_chalk73.default.bold(cert.cns.join(", "))} created ${addStamp()}`),0));if(args.length<1)return output_manager_default.error("Invalid number of arguments to create a custom certificate entry. Usage:"),output_manager_default.print(` ${import_chalk73.default.cyan(getCommandName("certs issue <cn>[, <cn>]"))}
|
|
@@ -348,19 +358,19 @@ ${actionUrl}`),(0,import_open4.default)(actionUrl).catch(err=>output_manager_def
|
|
|
348
358
|
|
|
349
359
|
`),output_manager_default.log("To issue the certificate once the records are added, run:"),output_manager_default.print(` ${import_chalk73.default.cyan(getCommandName(`certs issue ${cns.join(" ")}`))}
|
|
350
360
|
`),output_manager_default.print(` Read more: https://err.sh/vercel/solve-challenges-manually
|
|
351
|
-
`),0}var import_chalk74=__toESM(require_source(),1),import_ms11=__toESM(require_ms(),1);async function getCerts(client,next,limit=20){let certsUrl=`/v4/certs?limit=${limit}`;return next&&(certsUrl+=`&until=${next}`),await client.fetch(certsUrl)}var CertsLsTelemetryClient=class extends TelemetryClient{trackCliOptionLimit(limit){limit&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliOptionNext(next){next&&this.trackCliOption({option:"next",value:this.redactedValue})}};async function ls3(client,argv){let{telemetryEventStore}=client,telemetry2=new CertsLsTelemetryClient({opts:{store:telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(
|
|
352
|
-
`}function formatCertsTableHead(){return[import_chalk74.default.dim("id"),import_chalk74.default.dim("cns"),import_chalk74.default.dim("expiration"),import_chalk74.default.dim("renew"),import_chalk74.default.dim("age")]}function formatCertsTableBody(certsList){let now=new Date;return certsList.reduce((result,cert)=>result.concat(formatCert(now,cert)),[])}function formatCert(time,cert){return cert.cns.map((cn,idx)=>idx===0?formatCertFirstCn(time,cert,cn,cert.cns.length>1):formatCertNonFirstCn(cn,cert.cns.length>1))}function formatCertNonFirstCn(cn,multiple){return["",formatCertCn(cn,multiple),"","",""]}function formatCertCn(cn,multiple){return multiple?`${import_chalk74.default.gray("-")} ${import_chalk74.default.bold(cn)}`:import_chalk74.default.bold(cn)}function formatCertFirstCn(time,cert,cn,multiple){return[cert.uid,formatCertCn(cn,multiple),formatExpirationDate(new Date(cert.expiration)),cert.autoRenew?"yes":"no",import_chalk74.default.gray((0,import_ms11.default)(time.getTime()-new Date(cert.created).getTime()))]}function formatExpirationDate(date){let diff2=date.getTime()-Date.now();return diff2<0?import_chalk74.default.gray(`${(0,import_ms11.default)(-diff2)} ago`):import_chalk74.default.gray(`in ${(0,import_ms11.default)(diff2)}`)}var ls_default=ls3;var import_chalk75=__toESM(require_source(),1),import_ms12=__toESM(require_ms(),1),import_pluralize7=__toESM(require_pluralize(),1);async function deleteCertById(client,id2){return client.fetch(`/v5/certs/${id2}`,{method:"DELETE"})}async function getCertById(client,id2){try{return await client.fetch(`/v6/certs/${id2}`)}catch(err){if(isAPIError(err)&&err.code==="cert_not_found")return new CertNotFound(id2);throw err}}import{stringify}from"querystring";async function getCustomCertsForDomain(client,context,domain2){try{let{certs}=await client.fetch(`/v5/certs?${stringify({domain:domain2,custom:!0})}`);return certs}catch(err){if(isAPIError(err)&&err.code==="forbidden")return new CertsPermissionDenied(context,domain2);throw err}}var CertsRemoveTelemetryClient=class extends TelemetryClient{trackCliArgumentId(v){v&&this.trackCliArgument({arg:"id",value:this.redactedValue})}};async function rm2(client,argv){let rmStamp=stamp_default(),{telemetryEventStore}=client,telemetry2=new CertsRemoveTelemetryClient({opts:{store:telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(
|
|
353
|
-
`),output_manager_default.print(`${import_chalk75.default.bold.red("> Are you sure?")} ${import_chalk75.default.gray("(y/N) ")}`),client.stdin.on("data",d=>{process.stdin.pause(),resolve14(d.toString().trim().toLowerCase()==="y")}).resume()})}function formatCertRow(cert){return[cert.uid,import_chalk75.default.bold(cert.cns?cert.cns.join(", "):"\u2013"),...cert.created?[import_chalk75.default.gray(`${(0,import_ms12.default)(Date.now()-new Date(cert.created).getTime())} ago`)]:[]]}var rm_default=rm2;var CertsTelemetryClient=class extends TelemetryClient{trackCliSubcommandIssue(actual){this.trackCliSubcommand({subcommand:"issue",value:actual})}trackCliSubcommandAdd(actual){this.trackCliSubcommand({subcommand:"add",value:actual})}trackCliSubcommandRemove(actual){this.trackCliSubcommand({subcommand:"remove",value:actual})}trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}};var COMMAND_CONFIG24={add:getCommandAliases(
|
|
354
|
-
`,"utf-8")}catch(err){return output_manager_default.error(`Failed to write ${import_chalk76.default.cyan("vercel.json")}: ${err instanceof Error?err.message:String(err)}`),1}return output_manager_default.log(`Added cron job ${import_chalk76.default.bold(cronPath)} with schedule ${import_chalk76.default.bold(schedule)} to ${import_chalk76.default.cyan("vercel.json")}`),output_manager_default.warn(`This cron job won't be active until the project is deployed to production. Run ${getCommandName("deploy --prod")} to deploy.`),0}var import_chalk77=__toESM(require_source(),1);var CronsLsTelemetryClient=class extends TelemetryClient{trackCliOptionFormat(format3){format3&&this.trackCliOption({option:"format",value:format3})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function ls4(client,argv){let telemetry2=new CronsLsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(
|
|
361
|
+
`),0}var import_chalk74=__toESM(require_source(),1),import_ms11=__toESM(require_ms(),1);async function getCerts(client,next,limit=20){let certsUrl=`/v4/certs?limit=${limit}`;return next&&(certsUrl+=`&until=${next}`),await client.fetch(certsUrl)}var CertsLsTelemetryClient=class extends TelemetryClient{trackCliOptionLimit(limit){limit&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliOptionNext(next){next&&this.trackCliOption({option:"next",value:this.redactedValue})}};async function ls3(client,argv){let{telemetryEventStore}=client,telemetry2=new CertsLsTelemetryClient({opts:{store:telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(listSubcommand6.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(err){return printError(err),2}let{args,flags:opts}=parsedArgs,validationResult=validateLsArgs({commandName:"certs ls",args});if(validationResult!==0)return validationResult;telemetry2.trackCliOptionLimit(opts["--limit"]),telemetry2.trackCliOptionNext(opts["--next"]);let paginationOptions;try{paginationOptions=getPaginationOpts(opts)}catch(err){return output_manager_default.prettyError(err),1}let lsStamp=stamp_default(),{certs,pagination}=await getCerts(client,...paginationOptions),contextName=await getContextName(client);if(output_manager_default.log(`${certs.length>0?"Certificates":"No certificates"} found under ${import_chalk74.default.bold(contextName)} ${lsStamp()}`),certs.length>0&&client.stdout.write(formatCertsTable(certs)),pagination?.next){let flags=getCommandFlags(opts,["_","--next"]);output_manager_default.log(`To display the next page run ${getCommandName(`certs ls${flags} --next ${pagination.next}`)}`)}return 0}function formatCertsTable(certsList){return`${table([formatCertsTableHead(),...formatCertsTableBody(certsList)],{align:["l","l","r","c","r"],hsep:2}).replace(/^(.*)/gm," $1")}
|
|
362
|
+
`}function formatCertsTableHead(){return[import_chalk74.default.dim("id"),import_chalk74.default.dim("cns"),import_chalk74.default.dim("expiration"),import_chalk74.default.dim("renew"),import_chalk74.default.dim("age")]}function formatCertsTableBody(certsList){let now=new Date;return certsList.reduce((result,cert)=>result.concat(formatCert(now,cert)),[])}function formatCert(time,cert){return cert.cns.map((cn,idx)=>idx===0?formatCertFirstCn(time,cert,cn,cert.cns.length>1):formatCertNonFirstCn(cn,cert.cns.length>1))}function formatCertNonFirstCn(cn,multiple){return["",formatCertCn(cn,multiple),"","",""]}function formatCertCn(cn,multiple){return multiple?`${import_chalk74.default.gray("-")} ${import_chalk74.default.bold(cn)}`:import_chalk74.default.bold(cn)}function formatCertFirstCn(time,cert,cn,multiple){return[cert.uid,formatCertCn(cn,multiple),formatExpirationDate(new Date(cert.expiration)),cert.autoRenew?"yes":"no",import_chalk74.default.gray((0,import_ms11.default)(time.getTime()-new Date(cert.created).getTime()))]}function formatExpirationDate(date){let diff2=date.getTime()-Date.now();return diff2<0?import_chalk74.default.gray(`${(0,import_ms11.default)(-diff2)} ago`):import_chalk74.default.gray(`in ${(0,import_ms11.default)(diff2)}`)}var ls_default=ls3;var import_chalk75=__toESM(require_source(),1),import_ms12=__toESM(require_ms(),1),import_pluralize7=__toESM(require_pluralize(),1);async function deleteCertById(client,id2){return client.fetch(`/v5/certs/${id2}`,{method:"DELETE"})}async function getCertById(client,id2){try{return await client.fetch(`/v6/certs/${id2}`)}catch(err){if(isAPIError(err)&&err.code==="cert_not_found")return new CertNotFound(id2);throw err}}import{stringify}from"querystring";async function getCustomCertsForDomain(client,context,domain2){try{let{certs}=await client.fetch(`/v5/certs?${stringify({domain:domain2,custom:!0})}`);return certs}catch(err){if(isAPIError(err)&&err.code==="forbidden")return new CertsPermissionDenied(context,domain2);throw err}}var CertsRemoveTelemetryClient=class extends TelemetryClient{trackCliArgumentId(v){v&&this.trackCliArgument({arg:"id",value:this.redactedValue})}};async function rm2(client,argv){let rmStamp=stamp_default(),{telemetryEventStore}=client,telemetry2=new CertsRemoveTelemetryClient({opts:{store:telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(removeSubcommand4.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(err){return printError(err),2}let{args}=parsedArgs,id2=args[0];if(telemetry2.trackCliArgumentId(id2),args.length!==1)return output_manager_default.error(`Invalid number of arguments. Usage: ${import_chalk75.default.cyan(`${getCommandName("certs rm <id or cn>")}`)}`),2;let contextName=await getContextName(client),certs=await getCertsToDelete(client,contextName,id2);return certs instanceof CertsPermissionDenied?(output_manager_default.error(`You don't have access to ${param(id2)}'s certs under ${contextName}.`),1):certs.length===0?(id2.includes(".")?output_manager_default.error(`No custom certificates found for "${id2}" under ${import_chalk75.default.bold(contextName)}`):output_manager_default.error(`No certificates found by id "${id2}" under ${import_chalk75.default.bold(contextName)}`),1):(await readConfirmation(client,"The following certificates will be removed permanently",certs)&&(await Promise.all(certs.map(cert=>deleteCertById(client,cert.uid))),output_manager_default.success(`${import_chalk75.default.bold((0,import_pluralize7.default)("Certificate",certs.length,!0))} removed ${rmStamp()}`)),0)}async function getCertsToDelete(client,contextName,id2){let cert=await getCertById(client,id2);if(cert instanceof CertNotFound){let certs=await getCustomCertsForDomain(client,contextName,id2);return certs instanceof CertsPermissionDenied,certs}return[cert]}function readConfirmation(client,msg,certs){return new Promise(resolve14=>{output_manager_default.log(msg),output_manager_default.print(`${table(certs.map(formatCertRow),{align:["l","r","l"],hsep:6}).replace(/^(.*)/gm," $1")}
|
|
363
|
+
`),output_manager_default.print(`${import_chalk75.default.bold.red("> Are you sure?")} ${import_chalk75.default.gray("(y/N) ")}`),client.stdin.on("data",d=>{process.stdin.pause(),resolve14(d.toString().trim().toLowerCase()==="y")}).resume()})}function formatCertRow(cert){return[cert.uid,import_chalk75.default.bold(cert.cns?cert.cns.join(", "):"\u2013"),...cert.created?[import_chalk75.default.gray(`${(0,import_ms12.default)(Date.now()-new Date(cert.created).getTime())} ago`)]:[]]}var rm_default=rm2;var CertsTelemetryClient=class extends TelemetryClient{trackCliSubcommandIssue(actual){this.trackCliSubcommand({subcommand:"issue",value:actual})}trackCliSubcommandAdd(actual){this.trackCliSubcommand({subcommand:"add",value:actual})}trackCliSubcommandRemove(actual){this.trackCliSubcommand({subcommand:"remove",value:actual})}trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}};var COMMAND_CONFIG24={add:getCommandAliases(addSubcommand2),issue:getCommandAliases(issueSubcommand),ls:getCommandAliases(listSubcommand6),rm:getCommandAliases(removeSubcommand4)};async function main7(client){let{telemetryEventStore}=client,telemetry2=new CertsTelemetryClient({opts:{store:telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(certsCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),2}let{subcommand,subcommandOriginal,args}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG24),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("certs",subcommand),output_manager_default.print(help(certsCommand,{columns:client.stderr.columns})),0;function printHelp(command2){output_manager_default.print(help(command2,{parent:certsCommand,columns:client.stderr.columns}))}switch(subcommand){case"issue":return needHelp?(telemetry2.trackCliFlagHelp("certs",subcommandOriginal),printHelp(issueSubcommand),0):(telemetry2.trackCliSubcommandIssue(subcommandOriginal),issue(client,args));case"ls":return needHelp?(telemetry2.trackCliFlagHelp("certs",subcommandOriginal),printHelp(listSubcommand6),0):(telemetry2.trackCliSubcommandList(subcommandOriginal),ls_default(client,args));case"rm":return needHelp?(telemetry2.trackCliFlagHelp("certs",subcommandOriginal),printHelp(removeSubcommand4),0):(telemetry2.trackCliSubcommandRemove(subcommandOriginal),rm_default(client,args));case"add":return needHelp?(telemetry2.trackCliFlagHelp("certs",subcommandOriginal),printHelp(addSubcommand2),0):(telemetry2.trackCliSubcommandAdd(subcommandOriginal),add_default(client,args));default:return output_manager_default.error("Please specify a valid subcommand: ls | issue | rm"),output_manager_default.print(help(certsCommand,{columns:client.stderr.columns})),2}}var import_chalk76=__toESM(require_source(),1);import{resolve as resolve8}from"path";import{access,readFile as readFile4,writeFile as writeFile4}from"fs/promises";var CronsAddTelemetryClient=class extends TelemetryClient{trackCliOptionPath(path3){path3&&this.trackCliOption({option:"path",value:this.redactedValue})}trackCliOptionSchedule(schedule){schedule&&this.trackCliOption({option:"schedule",value:this.redactedValue})}};var CRON_FIELD_RANGES=[["minute",0,59],["hour",0,23],["day of month",1,31],["month",1,12],["day of week",0,7]];function validateCronSchedule(expression){if(expression.length>256)return"Schedule expression must be 256 characters or less";let fields=expression.trim().split(/\s+/);if(fields.length!==5)return`Schedule must have exactly 5 fields (minute hour day-of-month month day-of-week), got ${fields.length}`;for(let i=0;i<fields.length;i++){let[name,min,max]=CRON_FIELD_RANGES[i],error=validateCronField(fields[i],name,min,max);if(error)return error}return!0}function validateCronField(field,name,min,max){let parts=field.split(",");for(let part of parts){let[range,stepStr]=part.split("/");if(stepStr!==void 0){let step=Number(stepStr);if(!Number.isInteger(step)||step<1)return`Invalid step value "${stepStr}" in ${name} field`}if(range==="*")continue;if(range.includes("-")){let rangeParts=range.split("-");if(rangeParts.length!==2||rangeParts[0]===""||rangeParts[1]==="")return`Invalid range "${range}" in ${name} field`;let[startStr,endStr]=rangeParts,start=Number(startStr),end=Number(endStr);if(!Number.isInteger(start)||!Number.isInteger(end))return`Invalid range "${range}" in ${name} field`;if(start<min||start>max||end<min||end>max)return`Value out of range in ${name} field (${min}-${max})`;if(start>end)return`Invalid range "${range}" in ${name} field: start is greater than end`;continue}let value=Number(range);if(!Number.isInteger(value))return`Invalid value "${range}" in ${name} field`;if(value<min||value>max)return`Value ${value} out of range in ${name} field (${min}-${max})`}return null}async function add4(client,argv){let telemetry2=new CronsAddTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(addSubcommand3.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{flags}=parsedArgs,cronPath=flags["--path"],schedule=flags["--schedule"];if(telemetry2.trackCliOptionPath(cronPath),telemetry2.trackCliOptionSchedule(schedule),!cronPath||!schedule){if(!client.stdin.isTTY)return output_manager_default.error(`Missing required flags. Use ${getCommandName('crons add --path /api/cron --schedule "0 10 * * *"')} in non-interactive mode.`),2;cronPath||(cronPath=await client.input.text({message:"What is the API route path for the cron job?",validate:value=>value.startsWith("/")?value.length>512?"Path must be 512 characters or less":!0:"Path must start with /"})),schedule||(schedule=await client.input.text({message:"What is the cron schedule expression?",validate:validateCronSchedule}))}if(!cronPath.startsWith("/"))return output_manager_default.error("Path must start with /"),1;if(cronPath.length>512)return output_manager_default.error("Path must be 512 characters or less"),1;let scheduleValidation=validateCronSchedule(schedule);if(scheduleValidation!==!0)return output_manager_default.error(scheduleValidation),1;let nonJsonConfigs=[...VERCEL_CONFIG_EXTENSIONS.map(ext=>`vercel.${ext}`),"vercel.toml"];for(let configName of nonJsonConfigs){let altPath=resolve8(client.cwd,configName);try{return await access(altPath),output_manager_default.error(`Found ${import_chalk76.default.cyan(configName)} \u2014 ${getCommandName("crons add")} only supports ${import_chalk76.default.cyan("vercel.json")}. Add cron jobs directly to your ${import_chalk76.default.cyan(configName)} file instead.`),1}catch{}}let configPath=resolve8(client.cwd,"vercel.json"),config;try{let content=await readFile4(configPath,"utf-8");config=JSON.parse(content)}catch(err){if(err instanceof SyntaxError)return output_manager_default.error(`Failed to parse ${import_chalk76.default.cyan("vercel.json")}: ${err.message}`),1;if(err instanceof Error&&"code"in err&&err.code==="ENOENT")config={};else return output_manager_default.error(`Failed to read ${import_chalk76.default.cyan("vercel.json")}: ${err instanceof Error?err.message:String(err)}`),1}let existingCrons=Array.isArray(config.crons)?config.crons:[];if(existingCrons.some(c=>c.path===cronPath))return output_manager_default.error(`A cron job with path ${import_chalk76.default.bold(cronPath)} already exists in vercel.json`),1;existingCrons.push({path:cronPath,schedule}),config.crons=existingCrons;try{await writeFile4(configPath,JSON.stringify(config,null,2)+`
|
|
364
|
+
`,"utf-8")}catch(err){return output_manager_default.error(`Failed to write ${import_chalk76.default.cyan("vercel.json")}: ${err instanceof Error?err.message:String(err)}`),1}return output_manager_default.log(`Added cron job ${import_chalk76.default.bold(cronPath)} with schedule ${import_chalk76.default.bold(schedule)} to ${import_chalk76.default.cyan("vercel.json")}`),output_manager_default.warn(`This cron job won't be active until the project is deployed to production. Run ${getCommandName("deploy --prod")} to deploy.`),0}var import_chalk77=__toESM(require_source(),1);var CronsLsTelemetryClient=class extends TelemetryClient{trackCliOptionFormat(format3){format3&&this.trackCliOption({option:"format",value:format3})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function ls4(client,argv){let telemetry2=new CronsLsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(listSubcommand10.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs,validationResult=validateLsArgs({commandName:"crons ls",args,maxArgs:0,exitCode:2});if(validationResult!==0)return validationResult;telemetry2.trackCliOptionFormat(opts["--format"]);let projectName=opts["--project"];telemetry2.trackCliOptionProject(projectName);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput,link=await resolveProjectContext({client,projectNameOrId:projectName});if(link.status==="error")return link.exitCode;if(link.status==="not_linked")return output_manager_default.error(`Your codebase isn't linked to a project on Vercel. Pass --project <name>, or ${client.nonInteractive?`run ${getCommandName("link --yes --team <team-id> --project <project-id>")} to link non-interactively.`:`run ${getCommandName("link")} to begin.`}`),1;client.config.currentTeam=link.org.type==="team"?link.org.id:void 0;let{project,org}=link,lsStamp=stamp_default();output_manager_default.spinner(`Fetching cron jobs for ${import_chalk77.default.bold(`${org.slug}/${project.name}`)}`);let projectData=await client.fetch(`/v9/projects/${encodeURIComponent(project.id)}`),definitions=projectData.crons?.definitions??[],isDisabled=projectData.crons?.disabledAt!=null,localConfig=readLocalConfig(client.cwd),localCrons=Array.isArray(localConfig?.crons)?localConfig.crons:[],deployedByPath=new Map(definitions.map(d=>[d.path,d])),undeployedCrons=[],modifiedCrons=[];for(let local of localCrons){let deployed=deployedByPath.get(local.path);deployed?deployed.schedule!==local.schedule&&modifiedCrons.push({local,deployed}):undeployedCrons.push(local)}if(asJson){output_manager_default.stopSpinner();let jsonOutput={crons:definitions.map(cron=>({path:cron.path,schedule:cron.schedule,host:cron.host})),undeployed:undeployedCrons.map(cron=>({path:cron.path,schedule:cron.schedule})),modified:modifiedCrons.map(({local,deployed})=>({path:local.path,localSchedule:local.schedule,deployedSchedule:deployed.schedule})),enabled:!isDisabled};client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
|
|
355
365
|
`)}else if(definitions.length===0&&undeployedCrons.length===0&&modifiedCrons.length===0)output_manager_default.log(`No cron jobs found for ${import_chalk77.default.bold(`${org.slug}/${project.name}`)} ${import_chalk77.default.gray(lsStamp())}`);else{let totalDeployed=definitions.length;if(totalDeployed>0&&(output_manager_default.log(`${totalDeployed} cron ${totalDeployed===1?"job":"jobs"} found for ${import_chalk77.default.bold(`${org.slug}/${project.name}`)}${isDisabled?import_chalk77.default.yellow(" (disabled)"):""} ${import_chalk77.default.gray(lsStamp())}`),output_manager_default.print(formatCronsTable(definitions).replace(/^(.*)/gm,`${" ".repeat(1)}$1`)),output_manager_default.print(`
|
|
356
366
|
|
|
357
367
|
`)),undeployedCrons.length>0||modifiedCrons.length>0){let pendingCount=undeployedCrons.length+modifiedCrons.length;output_manager_default.log(`${pendingCount} local ${pendingCount===1?"change":"changes"} pending deploy`),output_manager_default.print(formatPendingCronsTable(undeployedCrons,modifiedCrons).replace(/^(.*)/gm,`${" ".repeat(1)}$1`)),output_manager_default.print(`
|
|
358
368
|
|
|
359
|
-
`),output_manager_default.warn(`Run ${getCommandName("deploy --prod")} to apply local changes.`)}}return 0}function formatCronsTable(definitions){let rows=definitions.map(cron=>[import_chalk77.default.bold(cron.path),cron.schedule]);return formatTable(["Path","Schedule"],["l","l"],[{rows}])}function formatPendingCronsTable(undeployed,modified){let rows=[...modified.map(({local,deployed})=>[import_chalk77.default.bold(local.path),`${import_chalk77.default.dim(deployed.schedule)} \u2192 ${local.schedule}`,import_chalk77.default.yellow("modified")]),...undeployed.map(cron=>[import_chalk77.default.dim(cron.path),import_chalk77.default.dim(cron.schedule),import_chalk77.default.yellow("not deployed")])];return formatTable(["Path","Schedule","Status"],["l","l","l"],[{rows}])}var import_chalk78=__toESM(require_source(),1);var CronsRunTelemetryClient=class extends TelemetryClient{trackCliArgumentPath(path3){path3&&this.trackCliArgument({arg:"path",value:this.redactedValue})}};async function run(client,argv){let telemetry2=new CronsRunTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(runSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs,[cronPath]=args,projectName=opts["--project"];telemetry2.trackCliOptionProject(projectName),telemetry2.trackCliArgumentPath(cronPath);let link=await resolveProjectContext({client,projectNameOrId:projectName});if(link.status==="error")return link.exitCode;if(link.status==="not_linked")return output_manager_default.error(`Your codebase isn't linked to a project on Vercel. Pass --project <name>, or ${client.nonInteractive?`run ${getCommandName("link --yes --team <team-id> --project <project-id>")} to link non-interactively.`:`run ${getCommandName("link")} to begin.`}`),1;client.config.currentTeam=link.org.type==="team"?link.org.id:void 0;let{project,org}=link,runStamp=stamp_default();output_manager_default.spinner(`Fetching cron jobs for ${import_chalk78.default.bold(`${org.slug}/${project.name}`)}`);let projectData=await client.fetch(`/v9/projects/${encodeURIComponent(project.id)}`),definitions=projectData.crons?.definitions??[];if(definitions.length===0)return output_manager_default.error(`No cron jobs found for ${import_chalk78.default.bold(`${org.slug}/${project.name}`)}. Define cron jobs in your vercel.json file.`),1;if(projectData.crons?.disabledAt!=null)return output_manager_default.error(`Cron jobs are disabled for ${import_chalk78.default.bold(`${org.slug}/${project.name}`)}. Enable them in the project settings.`),1;if(!cronPath){if(client.nonInteractive)return output_manager_default.error(`A cron path argument is required in non-interactive mode. Usage: ${getCommandName("crons run <path>")}`),2;output_manager_default.stopSpinner(),definitions.length===1?(cronPath=definitions[0].path,output_manager_default.log(`Auto-selected ${import_chalk78.default.bold(cronPath)} (only cron job)`)):cronPath=await client.input.select({message:"Which cron job would you like to run?",choices:definitions.map(cron=>({name:`${cron.path} (${cron.schedule})`,value:cron.path}))})}let cronDef=definitions.find(d=>d.path===cronPath);if(!cronDef)return output_manager_default.error(`Cron job with path ${import_chalk78.default.bold(cronPath)} not found. Run ${getCommandName("crons ls")} to see available cron jobs.`),1;output_manager_default.spinner(`Triggering cron job ${import_chalk78.default.bold(cronPath)}`);let teamId=link.org.type==="team"?link.org.id:void 0,qs=teamId?`?teamId=${encodeURIComponent(teamId)}`:"",result;try{result=await client.fetch(`/v1/projects/${encodeURIComponent(project.id)}/crons/run${qs}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:cronDef.path,schedule:cronDef.schedule})})}catch(err){if(isAPIError(err))return output_manager_default.error(`Failed to trigger cron job ${import_chalk78.default.bold(cronPath)}: ${err.message}`),1;throw err}return output_manager_default.log(`Cron job ${import_chalk78.default.bold(cronPath)} triggered ${import_chalk78.default.gray(runStamp())}`),output_manager_default.log(` Invocation time: ${import_chalk78.default.cyan(new Date(result.invocationAt).toISOString())}`),0}var CronsTelemetryClient=class extends TelemetryClient{trackCliSubcommandAdd(actual){this.trackCliSubcommand({subcommand:"add",value:actual})}trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandRun(actual){this.trackCliSubcommand({subcommand:"run",value:actual})}};var COMMAND_CONFIG25={add:["add"],ls:["ls","list"],run:["run"]};async function main8(client){let parsedArgs,flagsSpecification=getFlagsSpecification(cronsCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(error){return printError(error),2}let telemetry2=new CronsTelemetryClient({opts:{store:client.telemetryEventStore}}),{subcommand,args,subcommandOriginal}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG25),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("crons"),output_manager_default.print(help(cronsCommand,{columns:client.stderr.columns})),0;function printHelp(command2){return output_manager_default.print(help(command2,{parent:cronsCommand,columns:client.stderr.columns})),0}switch(subcommand){case"add":return needHelp?(telemetry2.trackCliFlagHelp("crons",subcommandOriginal),printHelp(
|
|
369
|
+
`),output_manager_default.warn(`Run ${getCommandName("deploy --prod")} to apply local changes.`)}}return 0}function formatCronsTable(definitions){let rows=definitions.map(cron=>[import_chalk77.default.bold(cron.path),cron.schedule]);return formatTable(["Path","Schedule"],["l","l"],[{rows}])}function formatPendingCronsTable(undeployed,modified){let rows=[...modified.map(({local,deployed})=>[import_chalk77.default.bold(local.path),`${import_chalk77.default.dim(deployed.schedule)} \u2192 ${local.schedule}`,import_chalk77.default.yellow("modified")]),...undeployed.map(cron=>[import_chalk77.default.dim(cron.path),import_chalk77.default.dim(cron.schedule),import_chalk77.default.yellow("not deployed")])];return formatTable(["Path","Schedule","Status"],["l","l","l"],[{rows}])}var import_chalk78=__toESM(require_source(),1);var CronsRunTelemetryClient=class extends TelemetryClient{trackCliArgumentPath(path3){path3&&this.trackCliArgument({arg:"path",value:this.redactedValue})}};async function run(client,argv){let telemetry2=new CronsRunTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(runSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs,[cronPath]=args,projectName=opts["--project"];telemetry2.trackCliOptionProject(projectName),telemetry2.trackCliArgumentPath(cronPath);let link=await resolveProjectContext({client,projectNameOrId:projectName});if(link.status==="error")return link.exitCode;if(link.status==="not_linked")return output_manager_default.error(`Your codebase isn't linked to a project on Vercel. Pass --project <name>, or ${client.nonInteractive?`run ${getCommandName("link --yes --team <team-id> --project <project-id>")} to link non-interactively.`:`run ${getCommandName("link")} to begin.`}`),1;client.config.currentTeam=link.org.type==="team"?link.org.id:void 0;let{project,org}=link,runStamp=stamp_default();output_manager_default.spinner(`Fetching cron jobs for ${import_chalk78.default.bold(`${org.slug}/${project.name}`)}`);let projectData=await client.fetch(`/v9/projects/${encodeURIComponent(project.id)}`),definitions=projectData.crons?.definitions??[];if(definitions.length===0)return output_manager_default.error(`No cron jobs found for ${import_chalk78.default.bold(`${org.slug}/${project.name}`)}. Define cron jobs in your vercel.json file.`),1;if(projectData.crons?.disabledAt!=null)return output_manager_default.error(`Cron jobs are disabled for ${import_chalk78.default.bold(`${org.slug}/${project.name}`)}. Enable them in the project settings.`),1;if(!cronPath){if(client.nonInteractive)return output_manager_default.error(`A cron path argument is required in non-interactive mode. Usage: ${getCommandName("crons run <path>")}`),2;output_manager_default.stopSpinner(),definitions.length===1?(cronPath=definitions[0].path,output_manager_default.log(`Auto-selected ${import_chalk78.default.bold(cronPath)} (only cron job)`)):cronPath=await client.input.select({message:"Which cron job would you like to run?",choices:definitions.map(cron=>({name:`${cron.path} (${cron.schedule})`,value:cron.path}))})}let cronDef=definitions.find(d=>d.path===cronPath);if(!cronDef)return output_manager_default.error(`Cron job with path ${import_chalk78.default.bold(cronPath)} not found. Run ${getCommandName("crons ls")} to see available cron jobs.`),1;output_manager_default.spinner(`Triggering cron job ${import_chalk78.default.bold(cronPath)}`);let teamId=link.org.type==="team"?link.org.id:void 0,qs=teamId?`?teamId=${encodeURIComponent(teamId)}`:"",result;try{result=await client.fetch(`/v1/projects/${encodeURIComponent(project.id)}/crons/run${qs}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:cronDef.path,schedule:cronDef.schedule})})}catch(err){if(isAPIError(err))return output_manager_default.error(`Failed to trigger cron job ${import_chalk78.default.bold(cronPath)}: ${err.message}`),1;throw err}return output_manager_default.log(`Cron job ${import_chalk78.default.bold(cronPath)} triggered ${import_chalk78.default.gray(runStamp())}`),output_manager_default.log(` Invocation time: ${import_chalk78.default.cyan(new Date(result.invocationAt).toISOString())}`),0}var CronsTelemetryClient=class extends TelemetryClient{trackCliSubcommandAdd(actual){this.trackCliSubcommand({subcommand:"add",value:actual})}trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandRun(actual){this.trackCliSubcommand({subcommand:"run",value:actual})}};var COMMAND_CONFIG25={add:["add"],ls:["ls","list"],run:["run"]};async function main8(client){let parsedArgs,flagsSpecification=getFlagsSpecification(cronsCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(error){return printError(error),2}let telemetry2=new CronsTelemetryClient({opts:{store:client.telemetryEventStore}}),{subcommand,args,subcommandOriginal}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG25),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("crons"),output_manager_default.print(help(cronsCommand,{columns:client.stderr.columns})),0;function printHelp(command2){return output_manager_default.print(help(command2,{parent:cronsCommand,columns:client.stderr.columns})),0}switch(subcommand){case"add":return needHelp?(telemetry2.trackCliFlagHelp("crons",subcommandOriginal),printHelp(addSubcommand3)):(telemetry2.trackCliSubcommandAdd(subcommandOriginal),add4(client,args));case"run":return needHelp?(telemetry2.trackCliFlagHelp("crons",subcommandOriginal),printHelp(runSubcommand)):(telemetry2.trackCliSubcommandRun(subcommandOriginal),run(client,args));default:return needHelp?(telemetry2.trackCliFlagHelp("crons",subcommandOriginal),printHelp(listSubcommand10)):(telemetry2.trackCliSubcommandList(subcommandOriginal),ls4(client,args))}}import{spawn as spawn2}from"child_process";var requoteArgs=arg2=>arg2.includes(" ")?arg2.includes('"')?`'${arg2}'`:`"${arg2}"`:arg2;var CurlTelemetryClient=class extends TelemetryClient{trackCliArgumentPath(path3){if(path3){let value=path3.startsWith("/")?"slash":"no-slash";this.trackCliArgument({arg:"path",value})}}trackCliOptionDeployment(deploymentId){if(deploymentId){let value=deploymentId.startsWith("http://")||deploymentId.startsWith("https://")?"url":deploymentId.startsWith("dpl_")?"dpl_":"no-prefix";this.trackCliOption({option:"deployment",value})}}trackCliOptionProtectionBypass(secret){secret&&this.trackCliOption({option:"protection-bypass",value:this.redactedValue})}trackCliFlagYes(yes){yes&&this.trackCliFlag("yes")}trackCliFlagTrace(trace3){trace3&&this.trackCliFlag("trace")}trackCliFlagJson(json){json&&this.trackCliFlag("json")}trackCliFlagYesOnProduction(value){value&&this.trackCliFlag("yes-on-production")}};var import_chalk80=__toESM(require_source(),1),import_error_utils9=__toESM(require_dist(),1);var import_chalk79=__toESM(require_source(),1);async function createDeploymentProtectionToken(client,projectId,orgId){if(!client.authConfig.token)throw output_manager_default.debug("No auth token available, skipping deployment protection token"),new Error("Authentication required to create protection bypass token");try{let response=await client.fetch(`/v1/projects/${projectId}/protection-bypass`,{method:"PATCH",body:"{}",headers:{"Content-Type":"application/json"},accountId:orgId}),{protectionBypass}=response;return output_manager_default.log("You require a deployment protection bypass token to access this deployment... Generating one now..."),output_manager_default.log(`Successfully generated deployment protection bypass token for project ${import_chalk79.default.bold(projectId)}
|
|
360
370
|
`),output_manager_default.debug(`Protection Bypass Response: ${protectionBypass}`),await sleep(1e3),getAutomationBypassToken(protectionBypass)}catch(error){throw output_manager_default.debug(`Failed to generate deployment protection bypass token: ${error}`),output_manager_default.note('To bypass deployment protection, create a "Protection Bypass for Automation" secret in your project settings:'),output_manager_default.log(` 1. Visit ${import_chalk79.default.cyan("https://vercel.com/dashboard")}`),output_manager_default.log(" 2. Go to your project settings \u2192 Deployment Protection"),output_manager_default.log(' 3. Generate a "Protection Bypass for Automation" secret'),output_manager_default.log(` 4. Use it with ${import_chalk79.default.cyan("--protection-bypass")} flag or set ${import_chalk79.default.cyan("VERCEL_AUTOMATION_BYPASS_SECRET")} env var`),output_manager_default.log(""),new Error("Failed to create deployment protection bypass token")}}function getAutomationBypassToken(protectionBypass){if(!protectionBypass)throw new Error("No protection bypass tokens found");let token2=Object.keys(protectionBypass).find(key=>protectionBypass[key].scope==="automation-bypass");if(!token2)throw new Error("No automation bypass token found in protection bypass settings");return token2}async function getOrCreateDeploymentProtectionToken(client,{project,org},{createIfMissing=!0}={}){if(process.env.VERCEL_AUTOMATION_BYPASS_SECRET)return output_manager_default.debug("Using protection bypass secret from environment variable"),process.env.VERCEL_AUTOMATION_BYPASS_SECRET;if(project.protectionBypass&&Object.values(project.protectionBypass).length){let protectionBypass;try{protectionBypass=getAutomationBypassToken(project.protectionBypass)}catch(error){if(!createIfMissing)return output_manager_default.debug(`No existing automation bypass token found for project ${project.id}`),null;throw error}if(protectionBypass)return output_manager_default.debug(`Using existing protection bypass token from project settings: ${protectionBypass}`),protectionBypass}return createIfMissing?await createDeploymentProtectionToken(client,project.id,org.id):(output_manager_default.debug(`Not creating an automation bypass token for project ${project.id}`),null)}async function getDeploymentAccounts(client){if(detectExplicitScope(client))return client.config.currentTeam?[client.config.currentTeam]:[];if(isAppPrincipalEnabled())try{await getUser(client)}catch(err){if(!(err instanceof InvalidToken))throw err;let token2=await introspectToken(client).catch(()=>null);if(!token2||!resolveAppFromToken(token2))throw err;return token2.team?[token2.team.id]:[]}let currentTeam=client.config.currentTeam;try{return(await getTeams(client)).filter(team=>!team.limited).map(team=>team.id).sort((a,b)=>+(b===currentTeam)-+(a===currentTeam))}catch(err){if(err instanceof InvalidToken&¤tTeam)return[currentTeam];throw err}}async function resolveDeployment(client,selector,accountId){let hostOrId=selector.includes(".")?toHost(selector):selector,endpoint=`/v13/deployments/${encodeURIComponent(hostOrId)}`,lookup=async accountId2=>{try{let deployment2=await client.fetch(endpoint,{useCurrentTeam:!1,...accountId2?{accountId:accountId2}:{},bailOn429:!0});return deployment2?{...deployment2,ownerId:deployment2.ownerId??deployment2.team?.id}:null}catch(err){if(!isAPIError(err)||err.status!==403&&err.status!==404)throw err;return output_manager_default.debug(`Deployment lookup failed for ${hostOrId}: ${err}`),null}};if(accountId||detectExplicitScope(client))return lookup(accountId??client.config.currentTeam);let deployment=await lookup();if(deployment?.projectId&&deployment.ownerId)return deployment;let accounts;try{accounts=await getDeploymentAccounts(client)}catch(err){if(deployment?.url)return deployment;throw err}for(let account of accounts){let scoped=await lookup(account);if(scoped?.projectId&&scoped.ownerId)return scoped;deployment??=scoped}return deployment}async function getDeploymentUrlById(client,deploymentIdOrUrl,accountId){try{if(deploymentIdOrUrl.startsWith("http://")||deploymentIdOrUrl.startsWith("https://"))try{return new URL(deploymentIdOrUrl).origin}catch{return output_manager_default.debug(`Invalid deployment URL provided: ${deploymentIdOrUrl}`),null}if(deploymentIdOrUrl.includes("vercel.app"))return`https://${deploymentIdOrUrl}`;let fullDeploymentId=deploymentIdOrUrl;fullDeploymentId.startsWith("dpl_")||(fullDeploymentId=`dpl_${deploymentIdOrUrl}`);let deployment=await resolveDeployment(client,fullDeploymentId,accountId);return!deployment||!deployment.url?null:`https://${deployment.url}`}catch(error){return output_manager_default.debug(`Failed to fetch deployment by ID: ${error}`),null}}function looksLikeHostname(path3){let firstSegment=path3.split("/")[0];return firstSegment.includes(".")&&!firstSegment.startsWith(".")}function orgFromOwner(id2,slug=id2){return{type:id2.startsWith("team_")?"team":"user",id:id2,slug}}var VC_STRING_FLAGS=new Set(["--deployment","--protection-bypass"]),VC_IGNORED_STRING_FLAGS=new Set(["--scope","--team"]),VC_BOOLEAN_FLAGS=new Set(["--yes","--help","--trace","--json"]);function flagName(arg2){let eqIdx=arg2.indexOf("=");return eqIdx===-1?arg2:arg2.slice(0,eqIdx)}function flagValue(args,index){let arg2=args[index],eqIdx=arg2.indexOf("=");if(eqIdx!==-1)return arg2.slice(eqIdx+1);let next=args[index+1];return next&&!next.startsWith("-")?next:void 0}function getCurlLikeArgs(rawArgs,commandName){if(rawArgs[0]===commandName)return rawArgs.slice(1);let commandIndex=0;for(;commandIndex<rawArgs.length;){let arg2=rawArgs[commandIndex];if(!VC_IGNORED_STRING_FLAGS.has(flagName(arg2)))break;commandIndex++,!arg2.includes("=")&&commandIndex<rawArgs.length&&commandIndex++}return rawArgs[commandIndex]===commandName?rawArgs.slice(commandIndex+1):[...rawArgs]}function parseCurlLikeArgs(rawArgs,commandName){let result={target:void 0,deployment:void 0,protectionBypass:void 0,yes:!1,help:!1,trace:!1,json:!1,toolFlags:[]},args=getCurlLikeArgs(rawArgs,commandName),separatorIndex=args.indexOf("--"),beforeSeparator=separatorIndex===-1?args:args.slice(0,separatorIndex),afterSeparator=separatorIndex===-1?[]:args.slice(separatorIndex+1);for(let i=0;i<beforeSeparator.length;i++){let arg2=beforeSeparator[i],name=flagName(arg2);if(VC_STRING_FLAGS.has(name)){let value=flagValue(beforeSeparator,i);!arg2.includes("=")&&value!==void 0&&i++,name==="--deployment"?result.deployment=value:result.protectionBypass=value;continue}if(VC_IGNORED_STRING_FLAGS.has(name)){let value=flagValue(beforeSeparator,i);!arg2.includes("=")&&value!==void 0&&i++;continue}if(VC_BOOLEAN_FLAGS.has(name)){name==="--yes"?result.yes=!0:name==="--trace"?result.trace=!0:name==="--json"?result.json=!0:result.help=!0;continue}if(!result.target&&name==="--url"){let value=flagValue(beforeSeparator,i);!arg2.includes("=")&&value!==void 0&&i++,result.target=value;continue}!result.target&&!arg2.startsWith("-")?result.target=arg2:result.toolFlags.push(arg2)}return result.toolFlags.push(...afterSeparator),result}function setupCurlLikeCommand(client,command2,telemetryClient,options={}){let{print}=output_manager_default;if(options.allowFullUrl){let parsed=parseCurlLikeArgs(options.args??client.argv.slice(2),command2.name);if(parsed.help)return print(help(command2,{columns:client.stderr.columns})),0;let path4=parsed.target;if(telemetryClient.trackCliArgumentPath(path4),parsed.deployment&&telemetryClient.trackCliOptionDeployment(parsed.deployment),parsed.protectionBypass&&telemetryClient.trackCliOptionProtectionBypass(parsed.protectionBypass),!path4)return output_manager_default.error(`${getCommandName(`${command2.name} <url|path>`)} requires a URL or API path (e.g., 'https://example.vercel.app/api/hello' or '/api/hello')`),print(help(command2,{columns:client.stderr.columns})),2;let isFullUrl2=path4.startsWith("http://")||path4.startsWith("https://");return!isFullUrl2&&looksLikeHostname(path4)&&(isFullUrl2=!0),output_manager_default.debug(`${command2.name} flags (${parsed.toolFlags.length} args): ${JSON.stringify(parsed.toolFlags)}`),{path:isFullUrl2&&!path4.startsWith("http")?`https://${path4}`:path4,isFullUrl:isFullUrl2,deploymentFlag:parsed.deployment,protectionBypassFlag:parsed.protectionBypass,toolFlags:parsed.toolFlags,yes:parsed.yes,trace:parsed.trace,json:parsed.json}}let parsedArgs=null,flagsSpecification=getFlagsSpecification(command2.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(err){return printError(err),2}let{flags}=parsedArgs;if(parsedArgs.flags["--help"])return print(help(command2,{columns:client.stderr.columns})),0;parsedArgs.args[0]===command2.name&&parsedArgs.args.shift();let separatorIndex=process.argv.indexOf("--"),path3=parsedArgs.args[0];telemetryClient.trackCliArgumentPath(path3);let deploymentFlag=flags["--deployment"];deploymentFlag&&telemetryClient.trackCliOptionDeployment(deploymentFlag);let protectionBypassFlag=flags["--protection-bypass"];if(protectionBypassFlag&&telemetryClient.trackCliOptionProtectionBypass(protectionBypassFlag),!path3||path3==="--"||path3.startsWith("-"))return options.allowFullUrl?output_manager_default.error(`${getCommandName(`${command2.name} <url|path>`)} requires a URL or API path (e.g., 'https://example.vercel.app/api/hello' or '/api/hello')`):output_manager_default.error(`${getCommandName(`${command2.name} <path>`)} requires an API path (e.g., '/' or '/api/hello' or 'api/hello')`),print(help(command2,{columns:client.stderr.columns})),1;let isFullUrl=path3.startsWith("http://")||path3.startsWith("https://");if(!isFullUrl&&looksLikeHostname(path3)&&(isFullUrl=!0),isFullUrl&&!options.allowFullUrl)return output_manager_default.error("The <path> argument must be a relative API path (e.g., '/' or '/api/hello'), not a full URL."),output_manager_default.print("To target a specific deployment within the currently linked project, use the --deployment <id|url> flag."),print(help(command2,{columns:client.stderr.columns})),1;let toolFlags=separatorIndex!==-1?process.argv.slice(separatorIndex+1):[];return output_manager_default.debug(`${command2.name} flags (${toolFlags.length} args): ${JSON.stringify(toolFlags)}`),{path:isFullUrl&&!path3.startsWith("http")?`https://${path3}`:path3,isFullUrl,deploymentFlag,protectionBypassFlag,toolFlags,yes:!!flags["--yes"],trace:!!flags["--trace"],json:!!flags["--json"]}}async function resolveProjectFromUrl(client,url){let host=toHost(url);try{let deployment=await resolveDeployment(client,host);if(deployment){let link=await linkFromDeployment(client,deployment);if(link)return link}}catch(err){if(output_manager_default.debug(`Deployment lookup failed for ${host}: ${err}`),isAPIError(err)&&err.status===429)return null}try{let aliasUrl=`/now/aliases/${encodeURIComponent(host)}`;try{let alias2=await client.fetch(aliasUrl,{useCurrentTeam:!1,...detectExplicitScope(client)?{accountId:client.config.currentTeam}:{}});if(alias2.projectId&&alias2.ownerId)return{status:"linked",project:await client.fetch(`/v9/projects/${encodeURIComponent(alias2.projectId)}`,{accountId:alias2.ownerId}),org:orgFromOwner(alias2.ownerId)}}catch(err){output_manager_default.debug(`User alias lookup failed for ${host}: ${err}`)}for(let accountId of await getDeploymentAccounts(client))try{let alias2=await client.fetch(aliasUrl,{accountId}),projectId=alias2.projectId,ownerId=alias2.ownerId||accountId;if(projectId)return{status:"linked",project:await client.fetch(`/v9/projects/${encodeURIComponent(projectId)}`,{accountId:ownerId}),org:orgFromOwner(ownerId)}}catch(err){output_manager_default.debug(`Alias lookup failed for ${host} in ${accountId}: ${err}`)}}catch(err){output_manager_default.debug(`Team lookup failed for ${host}: ${err}`)}return null}async function getFullUrlAndToken(client,fullUrl,protectionBypassFlag){if(protectionBypassFlag)return{fullUrl,deploymentProtectionToken:protectionBypassFlag,link:null};if(process.env.VERCEL_AUTOMATION_BYPASS_SECRET)return output_manager_default.debug("Using protection bypass secret from environment variable"),{fullUrl,deploymentProtectionToken:process.env.VERCEL_AUTOMATION_BYPASS_SECRET,link:null};let link=await resolveProjectFromUrl(client,fullUrl),deploymentProtectionToken=null;if(link)try{deploymentProtectionToken=await getOrCreateDeploymentProtectionToken(client,link)}catch(err){output_manager_default.debug(`Failed to get deployment protection bypass token: ${err}`)}return{fullUrl,deploymentProtectionToken,link}}async function linkFromDeployment(client,deployment){return!deployment.projectId||!deployment.ownerId?null:{status:"linked",project:await client.fetch(`/v9/projects/${encodeURIComponent(deployment.projectId)}`,{accountId:deployment.ownerId}),org:orgFromOwner(deployment.ownerId)}}async function resolveTargetProject(client,deployment,deploymentFlag){try{let link=await linkFromDeployment(client,deployment);return link||output_manager_default.warn(`Deployment "${deploymentFlag}" is missing project metadata; proceeding without an automatic protection bypass token.`),link}catch(err){return output_manager_default.debug(`Failed to resolve deployment project: ${err}`),output_manager_default.warn(`Failed to load project for deployment "${deploymentFlag}"; proceeding without an automatic protection bypass token.`),null}}async function tryGetDeployment(client,selector){try{return await resolveDeployment(client,selector)}catch(err){return output_manager_default.debug(`Failed to resolve deployment: ${err}`),null}}async function tryLinkFromSelector(client,selector){try{let deployment=await resolveDeployment(client,selector);return deployment?await linkFromDeployment(client,deployment):null}catch(err){return output_manager_default.debug(`Failed to resolve trace project context: ${err}`),null}}async function getLinkedProjectOrNull(client){try{let linked=await getLinkedProject(client,{cwd:client.cwd});return linked.status==="linked"?linked:null}catch(err){return output_manager_default.debug(`Failed to load linked project: ${err}`),null}}function hasAutomationBypassToken(project){return Object.values(project.protectionBypass??{}).some(token2=>token2.scope==="automation-bypass")}async function getDeploymentUrlAndToken(client,commandName,path3,options){let{deploymentFlag,protectionBypassFlag,autoConfirm,resolveProjectForTrace}=options,suppliedProtectionBypass=deploymentFlag?protectionBypassFlag??(process.env.VERCEL_AUTOMATION_BYPASS_SECRET||void 0):protectionBypassFlag,link=null,createProtectionBypassIfMissing=!deploymentFlag,baseUrl;if(deploymentFlag){let requestedBaseUrl=deploymentFlag.startsWith("http://")||deploymentFlag.startsWith("https://")||deploymentFlag.includes("vercel.app")?await getDeploymentUrlById(client,deploymentFlag):null,deploymentSelector=deploymentFlag.includes(".")||deploymentFlag.startsWith("dpl_")?deploymentFlag:`dpl_${deploymentFlag}`;if(suppliedProtectionBypass!==void 0){if(baseUrl=requestedBaseUrl??await getDeploymentUrlById(client,deploymentFlag)??"",!baseUrl)return output_manager_default.error(`No deployment found for ID "${deploymentFlag}"`),1;resolveProjectForTrace&&(link=await tryLinkFromSelector(client,deploymentSelector)??await getLinkedProjectOrNull(client))}else{let deployment=await tryGetDeployment(client,deploymentSelector);if(baseUrl=requestedBaseUrl??(deployment?.url?`https://${deployment.url}`:""),!baseUrl)return output_manager_default.error(`No deployment found for ID "${deploymentFlag}"`),1;deployment?(link=await resolveTargetProject(client,deployment,deploymentFlag),link&&!hasAutomationBypassToken(link.project)&&(createProtectionBypassIfMissing=(await getLinkedProjectOrNull(client))?.project.id===link.project.id)):output_manager_default.warn(`Could not resolve project information for deployment "${deploymentFlag}"; proceeding without an automatic protection bypass token.`)}}else{try{await getScope(client)}catch(err){if((0,import_error_utils9.isErrnoException)(err)&&(err.code==="NOT_AUTHORIZED"||err.code==="TEAM_DELETED"))return output_manager_default.error(err.message),1;throw err}let ensuredLink;try{ensuredLink=await ensureLink(commandName,client,client.cwd,{autoConfirm})}catch(err){if((0,import_error_utils9.isErrnoException)(err)&&err.code==="NOT_AUTHORIZED")return output_manager_default.error(err.message),1;throw err}if(typeof ensuredLink=="number")return ensuredLink;let linkedProject=await getLinkedProject(client,{cwd:client.cwd});if(linkedProject.status!=="linked")return output_manager_default.error("This command requires a linked project. Please run:"),output_manager_default.print(" vercel link"),1;if(!linkedProject.project||!linkedProject.org)return output_manager_default.error("Failed to get project information"),1;link=ensuredLink;let preferredAlias=linkedProject.project.targets?.production?.alias?.[0],backupAlias=linkedProject.project.latestDeployments?.[0]?.url,target=preferredAlias||backupAlias;if(!target)throw new Error("No deployment URL found for the project");baseUrl=`https://${target}`}let fullUrl=`${baseUrl}${path3.startsWith("/")?path3:`/${path3}`}`;output_manager_default.debug(`${import_chalk80.default.cyan("Target URL:")} ${import_chalk80.default.bold(fullUrl)}`);let deploymentProtectionToken=suppliedProtectionBypass??null;if(suppliedProtectionBypass===void 0&&link?.project.id)try{deploymentProtectionToken=await getOrCreateDeploymentProtectionToken(client,link,{createIfMissing:createProtectionBypassIfMissing})}catch(err){return output_manager_default.error(`Failed to get deployment protection bypass token: ${err instanceof Error?err.message:String(err)}`),1}return{fullUrl,deploymentProtectionToken,link}}var import_error_utils10=__toESM(require_dist(),1);import{spawn}from"child_process";import{tmpdir}from"os";import{join as join33}from"path";import{mkdtemp,readFile as readFile6,rm as rm3}from"fs/promises";async function confirmProduction(client,{deploymentTarget,yes,isTTY}){return deploymentTarget!=="production"||yes?"proceed":isTTY?await client.input.confirm("You are about to capture a trace against a production deployment. Continue?",!1)?"proceed":"declined":(output_manager_default.error("Use --yes to capture traces on production from non-interactive contexts."),"non-tty-no-yes")}import{createHash as createHash4}from"crypto";import{chmod as chmod2,mkdir,readFile as readFile5,unlink as unlink2,writeFile as writeFile5}from"fs/promises";import{dirname as dirname7,join as join32}from"path";var FALLBACK_TTL_MS=5*60*1e3,EXPIRY_BUFFER_MS=30*1e3,CACHE_SCHEMA_VERSION=1;function resolveCacheDir(override2){return override2||join32(getGlobalPathConfig(),"cache","traces")}function cacheFilename(teamId,host){let key=`${teamId??""}:${host}`;return`${createHash4("sha256").update(key).digest("hex")}.json`}function cachePath(cacheDir,teamId,host){return join32(cacheDir,cacheFilename(teamId,host))}async function readCache(path3){let raw;try{raw=await readFile5(path3,"utf8")}catch{return null}try{let parsed=JSON.parse(raw);return!parsed||typeof parsed.token!="string"||typeof parsed.expiresAt!="number"||parsed.schemaVersion!==CACHE_SCHEMA_VERSION?null:parsed}catch{return output_manager_default.debug(`Trace cookie cache file is corrupt at ${path3}; re-issuing.`),null}}async function writeCache(path3,entry2){await mkdir(dirname7(path3),{recursive:!0}),await writeFile5(path3,JSON.stringify(entry2),{mode:384}),await chmod2(path3,384)}async function issueToken(client,{teamId,projectId,hostname:hostname2}){let body=JSON.stringify({projectId,hostname:hostname2}),response=await client.fetch("/v1/projects/traces/session",{method:"POST",body,headers:{"Content-Type":"application/json"},accountId:teamId});if(!response?.token)throw new Error("Trace session response is missing a token");let expiresAt=typeof response.expiresAt=="number"?response.expiresAt:Date.now()+FALLBACK_TTL_MS;return{token:response.token,expiresAt}}async function getTraceSessionToken({client,teamId,projectId,host,evictedToken,cacheDir}){let dir=resolveCacheDir(cacheDir),hostname2=toHost(host),path3=cachePath(dir,teamId,hostname2),cached=await readCache(path3);if(cached&&evictedToken&&cached.token===evictedToken)await unlink2(path3).catch(()=>{});else if(cached&&Date.now()<cached.expiresAt-EXPIRY_BUFFER_MS)return{token:cached.token,expiresAt:cached.expiresAt,fromCache:!0};let issued=await issueToken(client,{teamId,projectId,hostname:hostname2});try{await writeCache(path3,{token:issued.token,expiresAt:issued.expiresAt,schemaVersion:CACHE_SCHEMA_VERSION})}catch(err){output_manager_default.debug(`Failed to write trace cookie cache: ${err}`)}return{token:issued.token,expiresAt:issued.expiresAt,fromCache:!1}}var TRACE_COOKIE_NAME="_vercel_tracing",SESSION_COOKIE_NAME="_vercel_session";async function lookupDeployment(client,fullUrl,accountId){let deployment=await resolveDeployment(client,fullUrl,accountId);if(!deployment)throw new Error("Deployment not found");return deployment}function resolveTeamId(link,deployment){if(link?.org.type==="team")return link.org.id;if(deployment.ownerId?.startsWith("team_"))return deployment.ownerId}function extractVercelId(headerDump){let lines=headerDump.split(/\r?\n/),lastValue;for(let line2 of lines){let idx=line2.indexOf(":");if(idx===-1)continue;line2.slice(0,idx).trim().toLowerCase()==="x-vercel-id"&&(lastValue=line2.slice(idx+1).trim())}if(!lastValue)return;let sepIdx=lastValue.lastIndexOf("::");return sepIdx===-1?lastValue:lastValue.slice(sepIdx+2)}function extractFinalStatus(headerDump){let lines=headerDump.split(/\r?\n/),lastStatus;for(let line2 of lines){let match=line2.match(/^HTTP\/[\d.]+\s+(\d{3})/);match&&(lastStatus=Number(match[1]))}return lastStatus}async function runCurlAndCaptureHeaders(curlFlags,json){let tmpDir=await mkdtemp(join33(tmpdir(),"vc-curl-trace-")),headerFile=join33(tmpDir,"headers"),flags=["--dump-header",headerFile,...curlFlags];try{let{exitCode:exitCode2,capturedBody}=await new Promise(resolve14=>{let child=spawn("curl",flags,{stdio:json?["inherit","pipe","inherit"]:"inherit",shell:!1}),buf="";json&&child.stdout&&(child.stdout.setEncoding("utf8"),child.stdout.on("data",chunk=>{buf+=chunk})),child.on("error",err=>{err.code==="ENOENT"?output_manager_default.error("curl command not found. Please install curl."):output_manager_default.error(`Failed to execute curl: ${err.message}`),resolve14({exitCode:1,capturedBody:buf})}),child.on("close",code2=>{resolve14({exitCode:code2??1,capturedBody:buf})})}),headerDump="";try{headerDump=await readFile6(headerFile,"utf8")}catch(err){output_manager_default.debug(`Failed to read curl header dump: ${err}`)}return{exitCode:exitCode2,headerDump,capturedBody}}finally{await rm3(tmpDir,{recursive:!0,force:!0}).catch(()=>{})}}async function trace2(client,{fullUrl,link,curlFlags,json,yes,telemetry:telemetry2}){telemetry2.trackCliFlagTrace(!0),json&&telemetry2.trackCliFlagJson(!0);let accountId=link?.org.id,deployment;try{deployment=await lookupDeployment(client,fullUrl,accountId)}catch(err){return output_manager_default.error(`Failed to look up deployment for tracing: ${err instanceof Error?err.message:String(err)}`),1}let projectId=link?.project.id??deployment.projectId;if(!projectId)return output_manager_default.error("Could not resolve project for trace session. Run `vercel link` and retry."),1;let teamId=resolveTeamId(link,deployment),userId;try{userId=client.authConfig.userId??(await getUser(client)).id}catch(err){return output_manager_default.error(`Failed to resolve user for trace session: ${(0,import_error_utils10.errorToString)(err)}`),1}let deploymentTarget=deployment.target==="production"?"production":"preview",confirmation=await confirmProduction(client,{deploymentTarget,yes,isTTY:!!client.stdin.isTTY});if(confirmation==="non-tty-no-yes")return 1;if(confirmation==="declined")return output_manager_default.log("Trace cancelled."),0;deploymentTarget==="production"&&yes&&telemetry2.trackCliFlagYesOnProduction(!0);let session;try{session=await getTraceSessionToken({client,teamId,projectId,host:fullUrl})}catch(err){return output_manager_default.error(`Failed to acquire trace session: ${err instanceof Error?err.message:String(err)}`),1}let{exitCode:exitCode2,headerDump,capturedBody}=await runCurlWithCookie(session.token,userId,curlFlags,json);if(session.fromCache&&extractFinalStatus(headerDump)===401&&exitCode2===0){output_manager_default.debug("Trace cookie returned 401; evicting cache and retrying.");let refreshed;try{refreshed=await getTraceSessionToken({client,teamId,projectId,host:fullUrl,evictedToken:session.token})}catch(err){return output_manager_default.error(`Failed to refresh trace session after 401: ${err instanceof Error?err.message:String(err)}`),1}({exitCode:exitCode2,headerDump,capturedBody}=await runCurlWithCookie(refreshed.token,userId,curlFlags,json))}let requestId=extractVercelId(headerDump);return json?(client.stdout.write(`${JSON.stringify({response:capturedBody,requestId:requestId??null},null,2)}
|
|
361
371
|
`),requestId?exitCode2:exitCode2===0?1:exitCode2):requestId?(client.stderr.write(`
|
|
362
372
|
Run \`vercel traces inspect ${requestId}\` to fetch the trace.
|
|
363
|
-
`),exitCode2):(output_manager_default.error("Trace cookie was set but the response did not include an x-vercel-id header."),exitCode2===0?1:exitCode2)}async function runCurlWithCookie(token2,userId,curlFlags,json){let flagsWithCookie=["--header",`Cookie: ${TRACE_COOKIE_NAME}=${token2}; ${SESSION_COOKIE_NAME}=${userId}`,...curlFlags];return output_manager_default.debug(`Executing: curl ${flagsWithCookie.map(requoteArgs).join(" ")}`),runCurlAndCaptureHeaders(flagsWithCookie,json)}async function curl(client){return runCurl(client,{})}async function runCurl(client,{forceTrace=!1,args}){let telemetryClient=new CurlTelemetryClient({opts:{store:client.telemetryEventStore}}),setup2=setupCurlLikeCommand(client,curlCommand,telemetryClient,{allowFullUrl:!0,args});if(typeof setup2=="number")return setup2;let{path:path3,isFullUrl,deploymentFlag,protectionBypassFlag,toolFlags,json:jsonFlag}=setup2,traceFlag=forceTrace||setup2.trace,result=isFullUrl?await getFullUrlAndToken(client,path3,protectionBypassFlag):await getDeploymentUrlAndToken(client,"curl",path3,{deploymentFlag,protectionBypassFlag,autoConfirm:setup2.yes,resolveProjectForTrace:traceFlag});if(typeof result=="number")return result;let{fullUrl,deploymentProtectionToken}=result,curlFlags=[...toolFlags];return deploymentProtectionToken&&curlFlags.unshift("--header",`x-vercel-protection-bypass: ${deploymentProtectionToken}`),curlFlags.unshift("--url",fullUrl),traceFlag?trace2(client,{fullUrl,link:result.link??null,curlFlags,json:jsonFlag,yes:setup2.yes,telemetry:telemetryClient}):(output_manager_default.debug(`Executing: curl ${curlFlags.map(requoteArgs).join(" ")}`),new Promise(resolve14=>{let curlProcess=spawn2("curl",curlFlags,{stdio:"inherit",shell:!1});curlProcess.on("error",err=>{"code"in err&&err.code==="ENOENT"?(output_manager_default.error("curl command not found. Please install curl."),resolve14(1)):(output_manager_default.error(`Failed to execute curl: ${err.message}`),resolve14(1))}),curlProcess.on("close",code2=>{resolve14(code2??1)})}))}var import_chalk81=__toESM(require_source(),1);async function getProjectByCwdOrLink({autoConfirm,nonInteractive,client,commandName,cwd,projectNameOrId,forReadOnlyCommand}){if(projectNameOrId){let project=await getProjectByNameOrId(client,projectNameOrId);if(project instanceof ProjectNotFound)throw project;return project}let effectiveNonInteractive=nonInteractive??client.nonInteractive??argvHasNonInteractive(client.argv);if(forReadOnlyCommand&&effectiveNonInteractive){let resolvedCwd=await resolveProjectCwd(cwd??client.cwd),link=await getLinkedProject(client,{cwd:resolvedCwd});if(link.status==="linked"&&link.project)return link.project;if(link.status==="error"){let err=new Error("Link project error");throw err.code="ERR_LINK_PROJECT",err}throw new LinkRequiredError}let linkedProject=await ensureLink(commandName,client,cwd??client.cwd,{autoConfirm,nonInteractive});if(typeof linkedProject=="number"){let err=new Error("Link project error");throw err.code="ERR_LINK_PROJECT",err}return linkedProject.project}var DeployHooksLsTelemetryClient=class extends TelemetryClient{trackCliOptionFormat(format3){format3&&this.trackCliOption({option:"format",value:format3})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function ls5(client,argv){let telemetry2=new DeployHooksLsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(
|
|
373
|
+
`),exitCode2):(output_manager_default.error("Trace cookie was set but the response did not include an x-vercel-id header."),exitCode2===0?1:exitCode2)}async function runCurlWithCookie(token2,userId,curlFlags,json){let flagsWithCookie=["--header",`Cookie: ${TRACE_COOKIE_NAME}=${token2}; ${SESSION_COOKIE_NAME}=${userId}`,...curlFlags];return output_manager_default.debug(`Executing: curl ${flagsWithCookie.map(requoteArgs).join(" ")}`),runCurlAndCaptureHeaders(flagsWithCookie,json)}async function curl(client){return runCurl(client,{})}async function runCurl(client,{forceTrace=!1,args}){let telemetryClient=new CurlTelemetryClient({opts:{store:client.telemetryEventStore}}),setup2=setupCurlLikeCommand(client,curlCommand,telemetryClient,{allowFullUrl:!0,args});if(typeof setup2=="number")return setup2;let{path:path3,isFullUrl,deploymentFlag,protectionBypassFlag,toolFlags,json:jsonFlag}=setup2,traceFlag=forceTrace||setup2.trace,result=isFullUrl?await getFullUrlAndToken(client,path3,protectionBypassFlag):await getDeploymentUrlAndToken(client,"curl",path3,{deploymentFlag,protectionBypassFlag,autoConfirm:setup2.yes,resolveProjectForTrace:traceFlag});if(typeof result=="number")return result;let{fullUrl,deploymentProtectionToken}=result,curlFlags=[...toolFlags];return deploymentProtectionToken&&curlFlags.unshift("--header",`x-vercel-protection-bypass: ${deploymentProtectionToken}`),curlFlags.unshift("--url",fullUrl),traceFlag?trace2(client,{fullUrl,link:result.link??null,curlFlags,json:jsonFlag,yes:setup2.yes,telemetry:telemetryClient}):(output_manager_default.debug(`Executing: curl ${curlFlags.map(requoteArgs).join(" ")}`),new Promise(resolve14=>{let curlProcess=spawn2("curl",curlFlags,{stdio:"inherit",shell:!1});curlProcess.on("error",err=>{"code"in err&&err.code==="ENOENT"?(output_manager_default.error("curl command not found. Please install curl."),resolve14(1)):(output_manager_default.error(`Failed to execute curl: ${err.message}`),resolve14(1))}),curlProcess.on("close",code2=>{resolve14(code2??1)})}))}var import_chalk81=__toESM(require_source(),1);async function getProjectByCwdOrLink({autoConfirm,nonInteractive,client,commandName,cwd,projectNameOrId,forReadOnlyCommand}){if(projectNameOrId){let project=await getProjectByNameOrId(client,projectNameOrId);if(project instanceof ProjectNotFound)throw project;return project}let effectiveNonInteractive=nonInteractive??client.nonInteractive??argvHasNonInteractive(client.argv);if(forReadOnlyCommand&&effectiveNonInteractive){let resolvedCwd=await resolveProjectCwd(cwd??client.cwd),link=await getLinkedProject(client,{cwd:resolvedCwd});if(link.status==="linked"&&link.project)return link.project;if(link.status==="error"){let err=new Error("Link project error");throw err.code="ERR_LINK_PROJECT",err}throw new LinkRequiredError}let linkedProject=await ensureLink(commandName,client,cwd??client.cwd,{autoConfirm,nonInteractive});if(typeof linkedProject=="number"){let err=new Error("Link project error");throw err.code="ERR_LINK_PROJECT",err}return linkedProject.project}var DeployHooksLsTelemetryClient=class extends TelemetryClient{trackCliOptionFormat(format3){format3&&this.trackCliOption({option:"format",value:format3})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function ls5(client,argv){let telemetry2=new DeployHooksLsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(listSubcommand11.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs,validationResult=validateLsArgs({commandName:"deploy-hooks ls",args,maxArgs:0,exitCode:2});if(validationResult!==0)return validationResult;telemetry2.trackCliOptionFormat(opts["--format"]),telemetry2.trackCliOptionProject(opts["--project"]);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput||client.nonInteractive,contextName=await getContextName(client),lsStamp=stamp_default();client.nonInteractive||output_manager_default.spinner(`Fetching deploy hooks under ${import_chalk81.default.bold(contextName)}`);try{let project=await getProjectByCwdOrLink({client,commandName:"deploy-hooks ls",projectNameOrId:opts["--project"],forReadOnlyCommand:!0}),hooks=project.link?.deployHooks??[];if(asJson){output_manager_default.stopSpinner();let rows2=hooks.map(h=>({id:h.id,name:h.name,ref:h.ref,url:h.url,createdAt:h.createdAt}));return client.nonInteractive?client.stdout.write(`${JSON.stringify({status:AGENT_STATUS.OK,projectId:project.id,projectName:project.name,hooks:rows2,message:hooks.length===0?"No deploy hooks for this project.":`Listed ${hooks.length} deploy hook${hooks.length===1?"":"s"}.`,next:[{command:getCommandNamePlain("deploy-hooks create <name> --ref <branch>"),when:"Create a deploy hook"}]},null,2)}
|
|
364
374
|
`):client.stdout.write(`${JSON.stringify(rows2,null,2)}
|
|
365
375
|
`),0}if(output_manager_default.stopSpinner(),hooks.length===0)return output_manager_default.log(`No deploy hooks configured for ${import_chalk81.default.bold(project.name)} ${lsStamp()}`),0;output_manager_default.log(`Deploy hooks for ${import_chalk81.default.bold(project.name)} ${import_chalk81.default.gray(lsStamp())}
|
|
366
376
|
`);let rows=hooks.map(h=>[h.name,h.id,h.ref,h.url]);return output_manager_default.print(`${formatTable(["name","id","ref","url"],["l","l","l","l"],[{rows}])}
|
|
@@ -372,12 +382,12 @@ Run \`vercel traces inspect ${requestId}\` to fetch the trace.
|
|
|
372
382
|
`),output_manager_default.print(` ${import_chalk82.default.cyan("URL".padEnd(12))}${created.url}
|
|
373
383
|
`),output_manager_default.print(`
|
|
374
384
|
${import_chalk82.default.dim("Anyone with the URL can trigger a deployment. Store it securely.")}
|
|
375
|
-
`)),0)}catch(err){return output_manager_default.stopSpinner(),isAPIError(err)?client.nonInteractive?(outputAgentError(client,{status:"error",reason:AGENT_REASON.API_ERROR,message:err.message},1),1):(output_manager_default.error(err.message),1):(exitWithNonInteractiveError(client,err,1,{variant:"checks"}),printError(err),1)}}var import_chalk83=__toESM(require_source(),1);var DeployHooksRmTelemetryClient=class extends TelemetryClient{trackCliArgumentId(id2){id2&&this.trackCliArgument({arg:"id",value:id2})}trackCliFlagYes(yes){yes&&this.trackCliFlag("yes")}};function deployHooksCommandWithGlobalFlags(baseSubcommand,argv){let globalFlags=getGlobalFlagsFromArgs(argv.slice(2)),full=globalFlags.length?`${baseSubcommand} ${globalFlags.join(" ")}`:baseSubcommand;return getCommandNamePlain(full)}async function rm4(client,argv){let telemetry2=new DeployHooksRmTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(removeSubcommand5.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs,[hookId]=args;if(telemetry2.trackCliArgumentId(hookId),telemetry2.trackCliOptionProject(opts["--project"]),telemetry2.trackCliFlagYes(opts["--yes"]),!hookId)return client.nonInteractive&&outputAgentError(client,{status:"error",reason:"missing_id",message:"Deploy hook id is required. Pass it as the first argument.",next:[{command:deployHooksCommandWithGlobalFlags("deploy-hooks ls",client.argv)},{command:deployHooksCommandWithGlobalFlags("deploy-hooks rm <id> --yes",client.argv)}]},2),output_manager_default.error(`${getCommandName("deploy-hooks rm <id>")} expects one argument`),2;let skipConfirmation=opts["--yes"]||!1;if(client.nonInteractive&&!skipConfirmation&&outputAgentError(client,{status:"error",reason:"confirmation_required",message:"Removing a deploy hook requires confirmation. Re-run with --yes.",next:[{command:buildCommandWithYes(client.argv)}]},1),args.length!==1)return output_manager_default.error(`Invalid number of arguments. Usage: ${import_chalk83.default.cyan(getCommandName("deploy-hooks rm <id>"))}`),2;let contextName=await getContextName(client),project;try{project=await getProjectByCwdOrLink({client,commandName:"deploy-hooks rm",projectNameOrId:opts["--project"],forReadOnlyCommand:!0})}catch(err){return printError(err),1}let existing=project.link?.deployHooks?.find(h=>h.id===hookId);if(!existing)return client.nonInteractive&&outputAgentError(client,{status:"error",reason:"not_found",message:`No deploy hook ${param(hookId)} on project ${project.name}.`,next:[{command:deployHooksCommandWithGlobalFlags("deploy-hooks ls",client.argv)}]},1),output_manager_default.error(`No deploy hook ${param(hookId)} on project ${param(project.name)}`),1;if(!client.nonInteractive&&!await client.input.confirm(`Remove deploy hook ${import_chalk83.default.bold(existing.name)} (${hookId}) from ${import_chalk83.default.bold(project.name)}?`,!1))return output_manager_default.log("Canceled."),0;let rmStamp=stamp_default();client.nonInteractive||output_manager_default.spinner(`Removing deploy hook under ${import_chalk83.default.bold(contextName)} ${import_chalk83.default.gray(rmStamp)}`);try{return await client.fetch(`/v2/projects/${encodeURIComponent(project.id)}/deploy-hooks/${encodeURIComponent(hookId)}`,{method:"DELETE"}),output_manager_default.stopSpinner(),output_manager_default.success(`Removed deploy hook ${import_chalk83.default.bold(hookId)} from ${import_chalk83.default.bold(project.name)} ${rmStamp()}`),0}catch(err){return output_manager_default.stopSpinner(),isAPIError(err)&&err.status===404?(output_manager_default.error(`No deploy hook ${param(hookId)} on project ${param(project.name)}`),1):isAPIError(err)?(output_manager_default.error(err.message),1):(printError(err),1)}}var DeployHooksTelemetryClient=class extends TelemetryClient{trackCliSubcommandCreate(actual){this.trackCliSubcommand({subcommand:"create",value:actual})}trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandRemove(actual){this.trackCliSubcommand({subcommand:"remove",value:actual})}};var COMMAND_CONFIG26={create:["create","add"],ls:["ls","list"],rm:["rm","remove","delete"]};async function main9(client){let parsedArgs,flagsSpecification=getFlagsSpecification(deployHooksCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(error){return printError(error),2}let telemetry2=new DeployHooksTelemetryClient({opts:{store:client.telemetryEventStore}}),{subcommand,args,subcommandOriginal}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG26),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("deploy-hooks"),output_manager_default.print(help(deployHooksCommand,{columns:client.stderr.columns})),0;function printHelp(command2){return output_manager_default.print(help(command2,{parent:deployHooksCommand,columns:client.stderr.columns})),0}switch(subcommand){case"create":return needHelp?(telemetry2.trackCliFlagHelp("deploy-hooks",subcommandOriginal),printHelp(createSubcommand3)):(telemetry2.trackCliSubcommandCreate(subcommandOriginal),create4(client,args));case"rm":return needHelp?(telemetry2.trackCliFlagHelp("deploy-hooks",subcommandOriginal),printHelp(removeSubcommand5)):(telemetry2.trackCliSubcommandRemove(subcommandOriginal),rm4(client,args));default:return needHelp?(telemetry2.trackCliFlagHelp("deploy-hooks",subcommandOriginal),printHelp(listSubcommand10)):(telemetry2.trackCliSubcommandList(subcommandOriginal),ls5(client,args))}}var import_chalk85=__toESM(require_source(),1);async function addDNSRecord(client,domain2,recordData){try{return await client.fetch(`/v3/domains/${encodeURIComponent(domain2)}/records`,{body:recordData,method:"POST"})}catch(err){if(isAPIError(err)){if(err.status===400&&err.code==="invalid_type")return new DNSInvalidType(recordData.type);if(err.status===400&&err.message.includes("port"))return new DNSInvalidPort;if(err.status===400)return err;if(err.status===403)return new DNSPermissionDenied(domain2);if(err.status===404)return new DomainNotFound(domain2);if(err.status===409){let{oldId=""}=err;return new DNSConflictingRecord(oldId)}}throw err}}function parseAddArgs(args){if(!args||args.length<1)return null;let[domain2,...rest]=args;if(domain2&&rest.length===0)return{domain:domain2,data:null};let name=args[1]==="@"?"":args[1].toString(),type=args[2],value=args[3];return domain2&&typeof name=="string"&&type?type==="MX"&&args.length===5?{domain:domain2,data:{name,type,value,mxPriority:Number(args[4])}}:type==="SRV"&&args.length===7?{domain:domain2,data:{name,type,srv:{priority:Number(value),weight:Number(args[4]),port:Number(args[5]),target:args[6]}}}:args.length===4?{domain:domain2,data:{name,type,value}}:null:null}var import_chalk84=__toESM(require_source(),1);var RECORD_TYPES=["A","AAAA","ALIAS","CAA","CNAME","MX","SRV","TXT"];async function getDNSData(client,data){if(data)return data;try{let possibleTypes=new Set(RECORD_TYPES),type=(await client.input.text({message:`- Record type (${RECORD_TYPES.join(", ")}): `,validate:v=>!!(v&&possibleTypes.has(v.trim().toUpperCase()))})).trim().toUpperCase(),name=await getRecordName(client,type);if(type==="SRV"){let priority2=await getNumber(client,`- ${type} priority: `),weight=await getNumber(client,`- ${type} weight: `),port=await getNumber(client,`- ${type} port: `),target=await getTrimmedString(client,`- ${type} target: `);return output_manager_default.log(`${import_chalk84.default.cyan(name)} ${import_chalk84.default.bold(type)} ${import_chalk84.default.cyan(`${priority2}`)} ${import_chalk84.default.cyan(`${weight}`)} ${import_chalk84.default.cyan(`${port}`)} ${import_chalk84.default.cyan(target)}.`),await verifyData(client)?{name,type,srv:{priority:priority2,weight,port,target}}:null}if(type==="MX"){let mxPriority=await getNumber(client,`- ${type} priority: `),value2=await getTrimmedString(client,`- ${type} host: `);return output_manager_default.log(`${import_chalk84.default.cyan(name)} ${import_chalk84.default.bold(type)} ${import_chalk84.default.cyan(`${mxPriority}`)} ${import_chalk84.default.cyan(value2)}`),await verifyData(client)?{name,type,value:value2,mxPriority}:null}let value=await getTrimmedString(client,`- ${type} value: `);return output_manager_default.log(`${import_chalk84.default.cyan(name)} ${import_chalk84.default.bold(type)} ${import_chalk84.default.cyan(value)}`),await verifyData(client)?{name,type,value}:null}catch{return null}}async function verifyData(client){return client.input.confirm("Is this correct?",!1)}async function getRecordName(client,type){let input=await client.input.text({message:`- ${type} name: `});return input==="@"?"":input}async function getNumber(client,label){return Number(await client.input.text({message:label,validate:v=>!!(v&&Number(v))}))}async function getTrimmedString(client,label){return(await client.input.text({message:label,validate:v=>!!(v&&v.trim().length>0)})).trim()}var ALLOWED_RECORD_TYPES=["A","AAAA","ALIAS","CNAME","TXT","MX","SRV"],DnsAddTelemetryClient=class extends TelemetryClient{trackCliArgumentDomain(domain2){domain2&&this.trackCliArgument({arg:"domain",value:this.redactedValue})}trackCliArgumentName(name){name&&this.trackCliArgument({arg:"name",value:this.redactedValue})}trackCliArgumentType(type){if(type){let allowedType=ALLOWED_RECORD_TYPES.includes(type)?type:this.redactedValue;this.trackCliArgument({arg:"type",value:allowedType})}}trackCliArgumentValues(values){values?.length&&this.trackCliArgument({arg:"values",value:this.redactedValue})}};async function add5(client,argv){let parsedArgs,flagsSpecification=getFlagsSpecification(addSubcommand3.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(err){return client.nonInteractive&&outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message:err instanceof Error?err.message:String(err)},2),printError(err),2}let{args}=parsedArgs,parsedParams=parseAddArgs(args);if(!parsedParams){if(client.nonInteractive){let cmd2=withGlobalFlags(client,"dns add <domain> <name> <type> <value>");outputActionRequired(client,{status:AGENT_STATUS.ACTION_REQUIRED,reason:AGENT_REASON.MISSING_ARGUMENTS,action:AGENT_ACTION.MISSING_ARGUMENTS,message:`Invalid number of arguments. Run: ${cmd2}`,next:[{command:cmd2,when:"to add a DNS record (see dns --help for MX/SRV forms)"}]},2)}return output_manager_default.error(`Invalid number of arguments. See: ${import_chalk85.default.cyan(`${getCommandName("dns --help")}`)} for usage.`),2}let addStamp=stamp_default(),{domain:domain2,data:argData}=parsedParams,valueArgs=args.slice(3);if(client.nonInteractive&&!argData){let cmd2=withGlobalFlags(client,"dns add <domain> <name> <type> <value>");return outputActionRequired(client,{status:AGENT_STATUS.ACTION_REQUIRED,reason:AGENT_REASON.MISSING_ARGUMENTS,action:AGENT_ACTION.MISSING_ARGUMENTS,message:"In non-interactive mode full record details are required. Run: "+cmd2,next:[{command:cmd2,when:"to add a DNS record (replace placeholders)"},{command:withGlobalFlags(client,"dns --help"),when:"for usage and examples"}]},2),2}let telemetryClient=new DnsAddTelemetryClient({opts:{store:client.telemetryEventStore}});telemetryClient.trackCliArgumentDomain(domain2),telemetryClient.trackCliArgumentName(parsedParams.data?.name),telemetryClient.trackCliArgumentType(parsedParams.data?.type),telemetryClient.trackCliArgumentValues(valueArgs);let data=await getDNSData(client,argData);if(!data)return client.nonInteractive&&outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INCOMPLETE_RECORD,message:"Record details could not be determined non-interactively. Provide full arguments for dns add.",next:[{command:withGlobalFlags(client,"dns --help")}]},1),output_manager_default.log("Canceled"),1;let contextName=await getContextName(client),record=await addDNSRecord(client,domain2,data);return record instanceof DomainNotFound?(client.nonInteractive&&outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.DOMAIN_NOT_FOUND,message:`The domain ${domain2} can't be found under ${contextName}.`,next:[{command:withGlobalFlags(client,"dns ls"),when:"to list DNS records for your scope"}]},1),output_manager_default.error(`The domain ${domain2} can't be found under ${import_chalk85.default.bold(contextName)} ${import_chalk85.default.gray(addStamp())}`),1):record instanceof DNSPermissionDenied?(client.nonInteractive&&outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.PERMISSION_DENIED,message:`You don't have permissions to add records to domain ${domain2} under ${contextName}.`},1),output_manager_default.error(`You don't have permissions to add records to domain ${domain2} under ${import_chalk85.default.bold(contextName)} ${import_chalk85.default.gray(addStamp())}`),1):record instanceof DNSInvalidPort?(client.nonInteractive&&outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_PORT,message:"Invalid <port> parameter. A number was expected."},2),output_manager_default.error(`Invalid <port> parameter. A number was expected ${import_chalk85.default.gray(addStamp())}`),2):record instanceof DNSInvalidType?(client.nonInteractive&&outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_DNS_TYPE,message:`Invalid <type> parameter "${record.meta.type}". Expected one of A, AAAA, ALIAS, CAA, CNAME, MX, SRV, TXT.`},2),output_manager_default.error(`Invalid <type> parameter "${record.meta.type}". Expected one of A, AAAA, ALIAS, CAA, CNAME, MX, SRV, TXT ${import_chalk85.default.gray(addStamp())}`),2):record instanceof Error?(client.nonInteractive&&outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.DNS_ADD_FAILED,message:record.message},1),output_manager_default.error(record.message),1):(output_manager_default.success(`DNS record for domain ${import_chalk85.default.bold(domain2)} ${import_chalk85.default.gray(`(${record.uid})`)} created under ${import_chalk85.default.bold(contextName)} ${import_chalk85.default.gray(addStamp())}`),0)}var import_chalk87=__toESM(require_source(),1);var import_chalk86=__toESM(require_source(),1);import{readFileSync as readFileSync2}from"fs";import{resolve as resolve9}from"path";async function importZonefile(client,contextName,domain2,zonefilePath){output_manager_default.spinner(`Importing Zone file for domain ${domain2} under ${import_chalk86.default.bold(contextName)}`);let zonefile=readFileSync2(resolve9(zonefilePath),"utf8");try{let res=await client.fetch(`/v3/domains/${encodeURIComponent(domain2)}/records`,{headers:{"Content-Type":"text/dns"},body:zonefile,method:"PUT",json:!1}),{recordIds}=await res.json();return recordIds}catch(err){if(isAPIError(err)){if(err.code==="not_found")return new DomainNotFound(domain2,contextName);if(err.code==="invalid_domain")return new InvalidDomain(domain2)}throw err}}var DnsImportTelemetryClient=class extends TelemetryClient{trackCliArgumentDomain(domain2){domain2&&this.trackCliArgument({arg:"domain",value:this.redactedValue})}trackCliArgumentZonefile(path3){path3&&this.trackCliArgument({arg:"zoneFilePath",value:this.redactedValue})}};async function importZone(client,argv){let parsedArgs,flagsSpecification=getFlagsSpecification(importSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(err){return client.nonInteractive&&outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message:err instanceof Error?err.message:String(err)},2),printError(err),2}let{args}=parsedArgs,{telemetryEventStore}=client,contextName=await getContextName(client),telemetry2=new DnsImportTelemetryClient({opts:{store:telemetryEventStore}});if(args.length!==2){if(client.nonInteractive){let cmd2=withGlobalFlags(client,"dns import <domain> <zonefile>");outputActionRequired(client,{status:AGENT_STATUS.ACTION_REQUIRED,reason:AGENT_REASON.MISSING_ARGUMENTS,action:AGENT_ACTION.MISSING_ARGUMENTS,message:`Invalid number of arguments. Run: ${cmd2}`,next:[{command:cmd2,when:"to import a zone file"}]},2)}return output_manager_default.error(`Invalid number of arguments. Usage: ${import_chalk87.default.cyan(`${getCommandName("dns import <domain> <zonefile>")}`)}`),2}let addStamp=stamp_default(),[domain2,zonefilePath]=args;telemetry2.trackCliArgumentDomain(domain2),telemetry2.trackCliArgumentZonefile(zonefilePath);let recordIds=await importZonefile(client,contextName,domain2,zonefilePath);return recordIds instanceof DomainNotFound?(client.nonInteractive&&outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.DOMAIN_NOT_FOUND,message:`The domain ${domain2} can't be found under ${contextName}.`,next:[{command:withGlobalFlags(client,"dns ls"),when:"to list DNS records for your scope"}]},1),output_manager_default.error(`The domain ${domain2} can't be found under ${import_chalk87.default.bold(contextName)} ${import_chalk87.default.gray(addStamp())}`),1):recordIds instanceof InvalidDomain?(client.nonInteractive&&outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_DOMAIN,message:`The domain ${domain2} doesn't match the one found in the zone file.`},1),output_manager_default.error(`The domain ${domain2} doesn't match with the one found in the Zone file ${import_chalk87.default.gray(addStamp())}`),1):(output_manager_default.success(`${recordIds.length} DNS records for domain ${import_chalk87.default.bold(domain2)} created under ${import_chalk87.default.bold(contextName)} ${import_chalk87.default.gray(addStamp())}`),0)}var import_chalk88=__toESM(require_source(),1);async function getDNSRecordById(client,id2){return client.fetch(`/v5/domains/records/${id2}`)}function handleDNSRecordError(err){if(isAPIError(err))switch(err.status){case 404:return output_manager_default.error("DNS record not found"),1;case 403:return output_manager_default.error("You don't have permission to access this DNS record."),1;case 400:return output_manager_default.error(err.serverMessage||"The request was invalid."),1}return printError(err),1}var DnsInspectTelemetryClient=class extends TelemetryClient{trackCliArgumentId(recordId){recordId&&this.trackCliArgument({arg:"id",value:this.redactedValue})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function inspect7(client,argv){let telemetry2=new DnsInspectTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(inspectSubcommand6.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(err){return printError(err),2}let{args,flags}=parsedArgs;if(telemetry2.trackCliOptionFormat(flags["--format"]),telemetry2.trackCliFlagJson(flags["--json"]),args.length!==1)return output_manager_default.error(`Invalid number of arguments. Usage: ${import_chalk88.default.cyan(`${getCommandName("dns inspect <id>")}`)}`),2;let[recordId]=args;telemetry2.trackCliArgumentId(recordId);let formatResult=validateJsonOutput(flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput,contextName=await getContextName(client),record;try{record=await getDNSRecordById(client,recordId)}catch(err){return handleDNSRecordError(err)}return record?asJson?(client.stdout.write(`${JSON.stringify(record,null,2)}
|
|
385
|
+
`)),0)}catch(err){return output_manager_default.stopSpinner(),isAPIError(err)?client.nonInteractive?(outputAgentError(client,{status:"error",reason:AGENT_REASON.API_ERROR,message:err.message},1),1):(output_manager_default.error(err.message),1):(exitWithNonInteractiveError(client,err,1,{variant:"checks"}),printError(err),1)}}var import_chalk83=__toESM(require_source(),1);var DeployHooksRmTelemetryClient=class extends TelemetryClient{trackCliArgumentId(id2){id2&&this.trackCliArgument({arg:"id",value:id2})}trackCliFlagYes(yes){yes&&this.trackCliFlag("yes")}};function deployHooksCommandWithGlobalFlags(baseSubcommand,argv){let globalFlags=getGlobalFlagsFromArgs(argv.slice(2)),full=globalFlags.length?`${baseSubcommand} ${globalFlags.join(" ")}`:baseSubcommand;return getCommandNamePlain(full)}async function rm4(client,argv){let telemetry2=new DeployHooksRmTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(removeSubcommand6.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs,[hookId]=args;if(telemetry2.trackCliArgumentId(hookId),telemetry2.trackCliOptionProject(opts["--project"]),telemetry2.trackCliFlagYes(opts["--yes"]),!hookId)return client.nonInteractive&&outputAgentError(client,{status:"error",reason:"missing_id",message:"Deploy hook id is required. Pass it as the first argument.",next:[{command:deployHooksCommandWithGlobalFlags("deploy-hooks ls",client.argv)},{command:deployHooksCommandWithGlobalFlags("deploy-hooks rm <id> --yes",client.argv)}]},2),output_manager_default.error(`${getCommandName("deploy-hooks rm <id>")} expects one argument`),2;let skipConfirmation=opts["--yes"]||!1;if(client.nonInteractive&&!skipConfirmation&&outputAgentError(client,{status:"error",reason:"confirmation_required",message:"Removing a deploy hook requires confirmation. Re-run with --yes.",next:[{command:buildCommandWithYes(client.argv)}]},1),args.length!==1)return output_manager_default.error(`Invalid number of arguments. Usage: ${import_chalk83.default.cyan(getCommandName("deploy-hooks rm <id>"))}`),2;let contextName=await getContextName(client),project;try{project=await getProjectByCwdOrLink({client,commandName:"deploy-hooks rm",projectNameOrId:opts["--project"],forReadOnlyCommand:!0})}catch(err){return printError(err),1}let existing=project.link?.deployHooks?.find(h=>h.id===hookId);if(!existing)return client.nonInteractive&&outputAgentError(client,{status:"error",reason:"not_found",message:`No deploy hook ${param(hookId)} on project ${project.name}.`,next:[{command:deployHooksCommandWithGlobalFlags("deploy-hooks ls",client.argv)}]},1),output_manager_default.error(`No deploy hook ${param(hookId)} on project ${param(project.name)}`),1;if(!client.nonInteractive&&!await client.input.confirm(`Remove deploy hook ${import_chalk83.default.bold(existing.name)} (${hookId}) from ${import_chalk83.default.bold(project.name)}?`,!1))return output_manager_default.log("Canceled."),0;let rmStamp=stamp_default();client.nonInteractive||output_manager_default.spinner(`Removing deploy hook under ${import_chalk83.default.bold(contextName)} ${import_chalk83.default.gray(rmStamp)}`);try{return await client.fetch(`/v2/projects/${encodeURIComponent(project.id)}/deploy-hooks/${encodeURIComponent(hookId)}`,{method:"DELETE"}),output_manager_default.stopSpinner(),output_manager_default.success(`Removed deploy hook ${import_chalk83.default.bold(hookId)} from ${import_chalk83.default.bold(project.name)} ${rmStamp()}`),0}catch(err){return output_manager_default.stopSpinner(),isAPIError(err)&&err.status===404?(output_manager_default.error(`No deploy hook ${param(hookId)} on project ${param(project.name)}`),1):isAPIError(err)?(output_manager_default.error(err.message),1):(printError(err),1)}}var DeployHooksTelemetryClient=class extends TelemetryClient{trackCliSubcommandCreate(actual){this.trackCliSubcommand({subcommand:"create",value:actual})}trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandRemove(actual){this.trackCliSubcommand({subcommand:"remove",value:actual})}};var COMMAND_CONFIG26={create:["create","add"],ls:["ls","list"],rm:["rm","remove","delete"]};async function main9(client){let parsedArgs,flagsSpecification=getFlagsSpecification(deployHooksCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(error){return printError(error),2}let telemetry2=new DeployHooksTelemetryClient({opts:{store:client.telemetryEventStore}}),{subcommand,args,subcommandOriginal}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG26),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("deploy-hooks"),output_manager_default.print(help(deployHooksCommand,{columns:client.stderr.columns})),0;function printHelp(command2){return output_manager_default.print(help(command2,{parent:deployHooksCommand,columns:client.stderr.columns})),0}switch(subcommand){case"create":return needHelp?(telemetry2.trackCliFlagHelp("deploy-hooks",subcommandOriginal),printHelp(createSubcommand3)):(telemetry2.trackCliSubcommandCreate(subcommandOriginal),create4(client,args));case"rm":return needHelp?(telemetry2.trackCliFlagHelp("deploy-hooks",subcommandOriginal),printHelp(removeSubcommand6)):(telemetry2.trackCliSubcommandRemove(subcommandOriginal),rm4(client,args));default:return needHelp?(telemetry2.trackCliFlagHelp("deploy-hooks",subcommandOriginal),printHelp(listSubcommand11)):(telemetry2.trackCliSubcommandList(subcommandOriginal),ls5(client,args))}}var import_chalk85=__toESM(require_source(),1);async function addDNSRecord(client,domain2,recordData){try{return await client.fetch(`/v3/domains/${encodeURIComponent(domain2)}/records`,{body:recordData,method:"POST"})}catch(err){if(isAPIError(err)){if(err.status===400&&err.code==="invalid_type")return new DNSInvalidType(recordData.type);if(err.status===400&&err.message.includes("port"))return new DNSInvalidPort;if(err.status===400)return err;if(err.status===403)return new DNSPermissionDenied(domain2);if(err.status===404)return new DomainNotFound(domain2);if(err.status===409){let{oldId=""}=err;return new DNSConflictingRecord(oldId)}}throw err}}function parseAddArgs(args){if(!args||args.length<1)return null;let[domain2,...rest]=args;if(domain2&&rest.length===0)return{domain:domain2,data:null};let name=args[1]==="@"?"":args[1].toString(),type=args[2],value=args[3];return domain2&&typeof name=="string"&&type?type==="MX"&&args.length===5?{domain:domain2,data:{name,type,value,mxPriority:Number(args[4])}}:type==="SRV"&&args.length===7?{domain:domain2,data:{name,type,srv:{priority:Number(value),weight:Number(args[4]),port:Number(args[5]),target:args[6]}}}:args.length===4?{domain:domain2,data:{name,type,value}}:null:null}var import_chalk84=__toESM(require_source(),1);var RECORD_TYPES=["A","AAAA","ALIAS","CAA","CNAME","MX","SRV","TXT"];async function getDNSData(client,data){if(data)return data;try{let possibleTypes=new Set(RECORD_TYPES),type=(await client.input.text({message:`- Record type (${RECORD_TYPES.join(", ")}): `,validate:v=>!!(v&&possibleTypes.has(v.trim().toUpperCase()))})).trim().toUpperCase(),name=await getRecordName(client,type);if(type==="SRV"){let priority2=await getNumber(client,`- ${type} priority: `),weight=await getNumber(client,`- ${type} weight: `),port=await getNumber(client,`- ${type} port: `),target=await getTrimmedString(client,`- ${type} target: `);return output_manager_default.log(`${import_chalk84.default.cyan(name)} ${import_chalk84.default.bold(type)} ${import_chalk84.default.cyan(`${priority2}`)} ${import_chalk84.default.cyan(`${weight}`)} ${import_chalk84.default.cyan(`${port}`)} ${import_chalk84.default.cyan(target)}.`),await verifyData(client)?{name,type,srv:{priority:priority2,weight,port,target}}:null}if(type==="MX"){let mxPriority=await getNumber(client,`- ${type} priority: `),value2=await getTrimmedString(client,`- ${type} host: `);return output_manager_default.log(`${import_chalk84.default.cyan(name)} ${import_chalk84.default.bold(type)} ${import_chalk84.default.cyan(`${mxPriority}`)} ${import_chalk84.default.cyan(value2)}`),await verifyData(client)?{name,type,value:value2,mxPriority}:null}let value=await getTrimmedString(client,`- ${type} value: `);return output_manager_default.log(`${import_chalk84.default.cyan(name)} ${import_chalk84.default.bold(type)} ${import_chalk84.default.cyan(value)}`),await verifyData(client)?{name,type,value}:null}catch{return null}}async function verifyData(client){return client.input.confirm("Is this correct?",!1)}async function getRecordName(client,type){let input=await client.input.text({message:`- ${type} name: `});return input==="@"?"":input}async function getNumber(client,label){return Number(await client.input.text({message:label,validate:v=>!!(v&&Number(v))}))}async function getTrimmedString(client,label){return(await client.input.text({message:label,validate:v=>!!(v&&v.trim().length>0)})).trim()}var ALLOWED_RECORD_TYPES=["A","AAAA","ALIAS","CNAME","TXT","MX","SRV"],DnsAddTelemetryClient=class extends TelemetryClient{trackCliArgumentDomain(domain2){domain2&&this.trackCliArgument({arg:"domain",value:this.redactedValue})}trackCliArgumentName(name){name&&this.trackCliArgument({arg:"name",value:this.redactedValue})}trackCliArgumentType(type){if(type){let allowedType=ALLOWED_RECORD_TYPES.includes(type)?type:this.redactedValue;this.trackCliArgument({arg:"type",value:allowedType})}}trackCliArgumentValues(values){values?.length&&this.trackCliArgument({arg:"values",value:this.redactedValue})}};async function add5(client,argv){let parsedArgs,flagsSpecification=getFlagsSpecification(addSubcommand4.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(err){return client.nonInteractive&&outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message:err instanceof Error?err.message:String(err)},2),printError(err),2}let{args}=parsedArgs,parsedParams=parseAddArgs(args);if(!parsedParams){if(client.nonInteractive){let cmd2=withGlobalFlags(client,"dns add <domain> <name> <type> <value>");outputActionRequired(client,{status:AGENT_STATUS.ACTION_REQUIRED,reason:AGENT_REASON.MISSING_ARGUMENTS,action:AGENT_ACTION.MISSING_ARGUMENTS,message:`Invalid number of arguments. Run: ${cmd2}`,next:[{command:cmd2,when:"to add a DNS record (see dns --help for MX/SRV forms)"}]},2)}return output_manager_default.error(`Invalid number of arguments. See: ${import_chalk85.default.cyan(`${getCommandName("dns --help")}`)} for usage.`),2}let addStamp=stamp_default(),{domain:domain2,data:argData}=parsedParams,valueArgs=args.slice(3);if(client.nonInteractive&&!argData){let cmd2=withGlobalFlags(client,"dns add <domain> <name> <type> <value>");return outputActionRequired(client,{status:AGENT_STATUS.ACTION_REQUIRED,reason:AGENT_REASON.MISSING_ARGUMENTS,action:AGENT_ACTION.MISSING_ARGUMENTS,message:"In non-interactive mode full record details are required. Run: "+cmd2,next:[{command:cmd2,when:"to add a DNS record (replace placeholders)"},{command:withGlobalFlags(client,"dns --help"),when:"for usage and examples"}]},2),2}let telemetryClient=new DnsAddTelemetryClient({opts:{store:client.telemetryEventStore}});telemetryClient.trackCliArgumentDomain(domain2),telemetryClient.trackCliArgumentName(parsedParams.data?.name),telemetryClient.trackCliArgumentType(parsedParams.data?.type),telemetryClient.trackCliArgumentValues(valueArgs);let data=await getDNSData(client,argData);if(!data)return client.nonInteractive&&outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INCOMPLETE_RECORD,message:"Record details could not be determined non-interactively. Provide full arguments for dns add.",next:[{command:withGlobalFlags(client,"dns --help")}]},1),output_manager_default.log("Canceled"),1;let contextName=await getContextName(client),record=await addDNSRecord(client,domain2,data);return record instanceof DomainNotFound?(client.nonInteractive&&outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.DOMAIN_NOT_FOUND,message:`The domain ${domain2} can't be found under ${contextName}.`,next:[{command:withGlobalFlags(client,"dns ls"),when:"to list DNS records for your scope"}]},1),output_manager_default.error(`The domain ${domain2} can't be found under ${import_chalk85.default.bold(contextName)} ${import_chalk85.default.gray(addStamp())}`),1):record instanceof DNSPermissionDenied?(client.nonInteractive&&outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.PERMISSION_DENIED,message:`You don't have permissions to add records to domain ${domain2} under ${contextName}.`},1),output_manager_default.error(`You don't have permissions to add records to domain ${domain2} under ${import_chalk85.default.bold(contextName)} ${import_chalk85.default.gray(addStamp())}`),1):record instanceof DNSInvalidPort?(client.nonInteractive&&outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_PORT,message:"Invalid <port> parameter. A number was expected."},2),output_manager_default.error(`Invalid <port> parameter. A number was expected ${import_chalk85.default.gray(addStamp())}`),2):record instanceof DNSInvalidType?(client.nonInteractive&&outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_DNS_TYPE,message:`Invalid <type> parameter "${record.meta.type}". Expected one of A, AAAA, ALIAS, CAA, CNAME, MX, SRV, TXT.`},2),output_manager_default.error(`Invalid <type> parameter "${record.meta.type}". Expected one of A, AAAA, ALIAS, CAA, CNAME, MX, SRV, TXT ${import_chalk85.default.gray(addStamp())}`),2):record instanceof Error?(client.nonInteractive&&outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.DNS_ADD_FAILED,message:record.message},1),output_manager_default.error(record.message),1):(output_manager_default.success(`DNS record for domain ${import_chalk85.default.bold(domain2)} ${import_chalk85.default.gray(`(${record.uid})`)} created under ${import_chalk85.default.bold(contextName)} ${import_chalk85.default.gray(addStamp())}`),0)}var import_chalk87=__toESM(require_source(),1);var import_chalk86=__toESM(require_source(),1);import{readFileSync as readFileSync2}from"fs";import{resolve as resolve9}from"path";async function importZonefile(client,contextName,domain2,zonefilePath){output_manager_default.spinner(`Importing Zone file for domain ${domain2} under ${import_chalk86.default.bold(contextName)}`);let zonefile=readFileSync2(resolve9(zonefilePath),"utf8");try{let res=await client.fetch(`/v3/domains/${encodeURIComponent(domain2)}/records`,{headers:{"Content-Type":"text/dns"},body:zonefile,method:"PUT",json:!1}),{recordIds}=await res.json();return recordIds}catch(err){if(isAPIError(err)){if(err.code==="not_found")return new DomainNotFound(domain2,contextName);if(err.code==="invalid_domain")return new InvalidDomain(domain2)}throw err}}var DnsImportTelemetryClient=class extends TelemetryClient{trackCliArgumentDomain(domain2){domain2&&this.trackCliArgument({arg:"domain",value:this.redactedValue})}trackCliArgumentZonefile(path3){path3&&this.trackCliArgument({arg:"zoneFilePath",value:this.redactedValue})}};async function importZone(client,argv){let parsedArgs,flagsSpecification=getFlagsSpecification(importSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(err){return client.nonInteractive&&outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message:err instanceof Error?err.message:String(err)},2),printError(err),2}let{args}=parsedArgs,{telemetryEventStore}=client,contextName=await getContextName(client),telemetry2=new DnsImportTelemetryClient({opts:{store:telemetryEventStore}});if(args.length!==2){if(client.nonInteractive){let cmd2=withGlobalFlags(client,"dns import <domain> <zonefile>");outputActionRequired(client,{status:AGENT_STATUS.ACTION_REQUIRED,reason:AGENT_REASON.MISSING_ARGUMENTS,action:AGENT_ACTION.MISSING_ARGUMENTS,message:`Invalid number of arguments. Run: ${cmd2}`,next:[{command:cmd2,when:"to import a zone file"}]},2)}return output_manager_default.error(`Invalid number of arguments. Usage: ${import_chalk87.default.cyan(`${getCommandName("dns import <domain> <zonefile>")}`)}`),2}let addStamp=stamp_default(),[domain2,zonefilePath]=args;telemetry2.trackCliArgumentDomain(domain2),telemetry2.trackCliArgumentZonefile(zonefilePath);let recordIds=await importZonefile(client,contextName,domain2,zonefilePath);return recordIds instanceof DomainNotFound?(client.nonInteractive&&outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.DOMAIN_NOT_FOUND,message:`The domain ${domain2} can't be found under ${contextName}.`,next:[{command:withGlobalFlags(client,"dns ls"),when:"to list DNS records for your scope"}]},1),output_manager_default.error(`The domain ${domain2} can't be found under ${import_chalk87.default.bold(contextName)} ${import_chalk87.default.gray(addStamp())}`),1):recordIds instanceof InvalidDomain?(client.nonInteractive&&outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_DOMAIN,message:`The domain ${domain2} doesn't match the one found in the zone file.`},1),output_manager_default.error(`The domain ${domain2} doesn't match with the one found in the Zone file ${import_chalk87.default.gray(addStamp())}`),1):(output_manager_default.success(`${recordIds.length} DNS records for domain ${import_chalk87.default.bold(domain2)} created under ${import_chalk87.default.bold(contextName)} ${import_chalk87.default.gray(addStamp())}`),0)}var import_chalk88=__toESM(require_source(),1);async function getDNSRecordById(client,id2){return client.fetch(`/v5/domains/records/${id2}`)}function handleDNSRecordError(err){if(isAPIError(err))switch(err.status){case 404:return output_manager_default.error("DNS record not found"),1;case 403:return output_manager_default.error("You don't have permission to access this DNS record."),1;case 400:return output_manager_default.error(err.serverMessage||"The request was invalid."),1}return printError(err),1}var DnsInspectTelemetryClient=class extends TelemetryClient{trackCliArgumentId(recordId){recordId&&this.trackCliArgument({arg:"id",value:this.redactedValue})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function inspect7(client,argv){let telemetry2=new DnsInspectTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(inspectSubcommand7.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(err){return printError(err),2}let{args,flags}=parsedArgs;if(telemetry2.trackCliOptionFormat(flags["--format"]),telemetry2.trackCliFlagJson(flags["--json"]),args.length!==1)return output_manager_default.error(`Invalid number of arguments. Usage: ${import_chalk88.default.cyan(`${getCommandName("dns inspect <id>")}`)}`),2;let[recordId]=args;telemetry2.trackCliArgumentId(recordId);let formatResult=validateJsonOutput(flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput,contextName=await getContextName(client),record;try{record=await getDNSRecordById(client,recordId)}catch(err){return handleDNSRecordError(err)}return record?asJson?(client.stdout.write(`${JSON.stringify(record,null,2)}
|
|
376
386
|
`),0):(output_manager_default.log(`DNS record ${import_chalk88.default.bold(record.id)} of domain ${import_chalk88.default.bold(record.domain)} under ${import_chalk88.default.bold(contextName)}`),client.stdout.write(formatRecordDetails(record)),0):(output_manager_default.error("DNS record not found"),1)}function formatRecordDetails(record){let rows=[["ID",record.id],["Name",record.name||"@"],["Domain",record.domain],["Type",record.type],["Value",record.value]],priority2=record.priority??record.mxPriority;return priority2!==void 0&&rows.push(["Priority",`${priority2}`]),record.ttl!==void 0&&rows.push(["TTL",`${record.ttl}`]),record.comment&&rows.push(["Comment",record.comment]),rows.push(["Creator",record.creator]),rows.push(["Created",formatDate(record.createdAt)]),record.updatedAt&&rows.push(["Updated",formatDate(record.updatedAt)]),`${table(rows,{align:["l","l"],hsep:2}).replace(/^(.*)/gm," $1")}
|
|
377
|
-
`}var import_chalk90=__toESM(require_source(),1),import_ms13=__toESM(require_ms(),1);async function getDomainDNSRecords(client,domain2,apiVersion=3,nextTimestamp,limit=20){output_manager_default.debug(`Fetching for DNS records of domain ${domain2}`);try{let url=`/v${apiVersion}/domains/${encodeURIComponent(domain2)}/records?limit=${limit}`;return nextTimestamp&&(url+=`&until=${nextTimestamp}`),await client.fetch(url)}catch(err){if(isAPIError(err)&&err.code==="not_found")return new DomainNotFound(domain2);throw err}}async function getDomains(client,next,limit=20){let domainUrl=`/v5/domains?limit=${limit}`;return next&&(domainUrl+=`&until=${next}`),await client.fetch(domainUrl)}var import_chalk89=__toESM(require_source(),1);async function getDNSRecords(client,contextName,next){let{domainNames,pagination}=await getDomainNames(client,contextName,next);return{records:(await Promise.all(domainNames.map(createGetDomainRecords(client)))).map(item=>item instanceof DomainNotFound?[]:item).reduce(getAddDomainName(domainNames),[]),pagination}}function createGetDomainRecords(client){return async domainName=>{let data=await getDomainDNSRecords(client,domainName);return data instanceof DomainNotFound?[]:data.records}}function getAddDomainName(domainNames){return(prev,item,idx)=>[...prev,{domainName:domainNames[idx],records:item}]}async function getDomainNames(client,contextName,next){output_manager_default.spinner(`Fetching domains under ${import_chalk89.default.bold(contextName)}`);let{domains:domains2,pagination}=await getDomains(client,next);return{domainNames:domains2.map(domain2=>domain2.name),pagination}}var DnsLsTelemetryClient=class extends TelemetryClient{trackCliArgumentDomain(domainName){domainName&&this.trackCliArgument({arg:"domain",value:this.redactedValue})}trackCliOptionLimit(limit){limit&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliOptionNext(next){next&&this.trackCliOption({option:"next",value:this.redactedValue})}trackCliOptionFormat(format3){format3&&this.trackCliOption({option:"format",value:this.redactedValue})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function ls6(client,argv){let parsedArgs,flagsSpecification=getFlagsSpecification(
|
|
378
|
-
`)}var import_chalk91=__toESM(require_source(),1),import_ms14=__toESM(require_ms(),1);async function deleteDNSRecordById(client,domain2,recordId){return client.fetch(`/v3/domains/${encodeURIComponent(domain2)}/records/${recordId}`,{method:"DELETE"})}var DnsRmTelemetryClient=class extends TelemetryClient{trackCliArgumentId(recordId){recordId&&this.trackCliArgument({arg:"recordId",value:this.redactedValue})}trackCliFlagYes(yes){yes&&this.trackCliFlag("yes")}};async function rm5(client,argv){let parsedArgs,flagsSpecification=getFlagsSpecification(
|
|
387
|
+
`}var import_chalk90=__toESM(require_source(),1),import_ms13=__toESM(require_ms(),1);async function getDomainDNSRecords(client,domain2,apiVersion=3,nextTimestamp,limit=20){output_manager_default.debug(`Fetching for DNS records of domain ${domain2}`);try{let url=`/v${apiVersion}/domains/${encodeURIComponent(domain2)}/records?limit=${limit}`;return nextTimestamp&&(url+=`&until=${nextTimestamp}`),await client.fetch(url)}catch(err){if(isAPIError(err)&&err.code==="not_found")return new DomainNotFound(domain2);throw err}}async function getDomains(client,next,limit=20){let domainUrl=`/v5/domains?limit=${limit}`;return next&&(domainUrl+=`&until=${next}`),await client.fetch(domainUrl)}var import_chalk89=__toESM(require_source(),1);async function getDNSRecords(client,contextName,next){let{domainNames,pagination}=await getDomainNames(client,contextName,next);return{records:(await Promise.all(domainNames.map(createGetDomainRecords(client)))).map(item=>item instanceof DomainNotFound?[]:item).reduce(getAddDomainName(domainNames),[]),pagination}}function createGetDomainRecords(client){return async domainName=>{let data=await getDomainDNSRecords(client,domainName);return data instanceof DomainNotFound?[]:data.records}}function getAddDomainName(domainNames){return(prev,item,idx)=>[...prev,{domainName:domainNames[idx],records:item}]}async function getDomainNames(client,contextName,next){output_manager_default.spinner(`Fetching domains under ${import_chalk89.default.bold(contextName)}`);let{domains:domains2,pagination}=await getDomains(client,next);return{domainNames:domains2.map(domain2=>domain2.name),pagination}}var DnsLsTelemetryClient=class extends TelemetryClient{trackCliArgumentDomain(domainName){domainName&&this.trackCliArgument({arg:"domain",value:this.redactedValue})}trackCliOptionLimit(limit){limit&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliOptionNext(next){next&&this.trackCliOption({option:"next",value:this.redactedValue})}trackCliOptionFormat(format3){format3&&this.trackCliOption({option:"format",value:this.redactedValue})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function ls6(client,argv){let parsedArgs,flagsSpecification=getFlagsSpecification(listSubcommand12.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(err){return client.nonInteractive&&outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message:err instanceof Error?err.message:String(err)},2),printError(err),2}let{args,flags:opts}=parsedArgs;if(client.nonInteractive&&args.length>1){let flags=getGlobalFlagsFromArgs(client.argv.slice(2)),cmd2=getCommandNamePlain(`dns ls <domain> ${flags.join(" ")}`.trim());return outputActionRequired(client,{status:AGENT_STATUS.ACTION_REQUIRED,reason:AGENT_REASON.MISSING_ARGUMENTS,action:AGENT_ACTION.MISSING_ARGUMENTS,message:`Invalid number of arguments. Run: ${cmd2}`,next:[{command:cmd2,when:"to list DNS records (optional single domain)"}]},2),2}let validationResult=validateLsArgs({commandName:"dns ls <domain>",args,maxArgs:1,exitCode:1});if(validationResult!==0)return validationResult;let{telemetryEventStore}=client,telemetry2=new DnsLsTelemetryClient({opts:{store:telemetryEventStore}}),[domainName]=args;telemetry2.trackCliArgumentDomain(domainName),telemetry2.trackCliOptionLimit(opts["--limit"]),telemetry2.trackCliOptionNext(opts["--next"]),telemetry2.trackCliOptionFormat(opts["--format"]),telemetry2.trackCliFlagJson(opts["--json"]);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput,contextName=await getContextName(client),lsStamp=stamp_default(),paginationOptions;try{paginationOptions=getPaginationOpts(opts)}catch(err){return output_manager_default.prettyError(err),1}if(domainName){let data=await getDomainDNSRecords(client,domainName,5,...paginationOptions);if(data instanceof DomainNotFound){if(client.nonInteractive){let flags=getGlobalFlagsFromArgs(client.argv.slice(2)),cmd2=getCommandNamePlain(`dns ls ${flags.join(" ")}`.trim());outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.DOMAIN_NOT_FOUND,message:`The domain ${domainName} can't be found under ${contextName}.`,next:[{command:cmd2,when:"to list available DNS records"}]},1)}return output_manager_default.error(`The domain ${domainName} can't be found under ${import_chalk90.default.bold(contextName)} ${import_chalk90.default.gray(lsStamp())}`),1}let{records,pagination:pagination2}=data,dnsRecords2=[{domainName,records}];if(asJson)return outputDnsRecordsJson(client,dnsRecords2,pagination2),0;if(output_manager_default.log(`${records.length>0?"Records":"No records"} found under ${import_chalk90.default.bold(contextName)} ${import_chalk90.default.gray(lsStamp())}`),client.stdout.write(getDNSRecordsTable(dnsRecords2)),pagination2?.next){let flags=getCommandFlags(opts,["_","--next"]);output_manager_default.log(`To display the next page run ${getCommandName(`dns ls ${domainName}${flags} --next ${pagination2.next}`)}`)}return 0}let{records:dnsRecords,pagination}=await getDNSRecords(client,contextName,...paginationOptions);if(asJson)return outputDnsRecordsJson(client,dnsRecords,pagination),0;let nRecords=dnsRecords.reduce((p,r)=>r.records.length+p,0);if(output_manager_default.log(`${nRecords>0?"Records":"No records"} found under ${import_chalk90.default.bold(contextName)} ${import_chalk90.default.gray(lsStamp())}`),output_manager_default.log(getDNSRecordsTable(dnsRecords)),pagination?.next){let flags=getCommandFlags(opts,["_","--next"]);output_manager_default.log(`To display the next page run ${getCommandName(`dns ls${flags} --next ${pagination.next}`)}`)}return 0}function getDNSRecordsTable(dnsRecords){return formatTable(["","id","name","type","value","created"],["l","r","l","l","l","l"],dnsRecords.map(({domainName,records})=>({name:import_chalk90.default.bold(domainName),rows:records.map(getDNSRecordRow)})))}function getDNSRecordRow(record){let isSystemRecord=record.creator==="system",createdAt=`${(0,import_ms13.default)(Date.now()-new Date(Number(record.createdAt)).getTime())} ago`,priority2=record.mxPriority||record.priority||null;return["",isSystemRecord?"":record.id,record.name,record.type,priority2?`${priority2} ${record.value}`:record.value,import_chalk90.default.gray(isSystemRecord?"default":createdAt)]}function outputDnsRecordsJson(client,records,pagination){output_manager_default.stopSpinner(),client.stdout.write(`${JSON.stringify({records,pagination},null,2)}
|
|
388
|
+
`)}var import_chalk91=__toESM(require_source(),1),import_ms14=__toESM(require_ms(),1);async function deleteDNSRecordById(client,domain2,recordId){return client.fetch(`/v3/domains/${encodeURIComponent(domain2)}/records/${recordId}`,{method:"DELETE"})}var DnsRmTelemetryClient=class extends TelemetryClient{trackCliArgumentId(recordId){recordId&&this.trackCliArgument({arg:"recordId",value:this.redactedValue})}trackCliFlagYes(yes){yes&&this.trackCliFlag("yes")}};async function rm5(client,argv){let parsedArgs,flagsSpecification=getFlagsSpecification(removeSubcommand7.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(err){return client.nonInteractive&&outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message:err instanceof Error?err.message:String(err)},2),printError(err),2}let{args,flags}=parsedArgs,{telemetryEventStore}=client,telemetry2=new DnsRmTelemetryClient({opts:{store:telemetryEventStore}});await getScope(client);let[recordId]=args;if(args.length!==1){if(client.nonInteractive){let cmd2=withGlobalFlags(client,"dns rm <id> --yes");outputActionRequired(client,{status:AGENT_STATUS.ACTION_REQUIRED,reason:AGENT_REASON.MISSING_ARGUMENTS,action:AGENT_ACTION.MISSING_ARGUMENTS,message:`Invalid number of arguments. Run: ${cmd2}`,next:[{command:cmd2,when:"to remove a DNS record by id (use dns ls to find ids)"}]},2)}return output_manager_default.error(`Invalid number of arguments. Usage: ${import_chalk91.default.cyan(`${getCommandName("dns rm <id>")}`)}`),2}telemetry2.trackCliArgumentId(recordId),telemetry2.trackCliFlagYes(flags["--yes"]);let record=await getDNSRecordById(client,recordId);if(!record)return client.nonInteractive&&outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.DNS_RECORD_NOT_FOUND,message:"DNS record not found.",next:[{command:withGlobalFlags(client,"dns ls"),when:"to list DNS records and ids"}]},1),output_manager_default.error("DNS record not found"),1;let{domain:domainName}=record,skipConfirmation=flags["--yes"];if(client.nonInteractive&&!skipConfirmation)return outputActionRequired(client,{status:AGENT_STATUS.ACTION_REQUIRED,reason:AGENT_REASON.CONFIRMATION_REQUIRED,action:AGENT_ACTION.CONFIRMATION_REQUIRED,message:"In non-interactive mode --yes is required to remove a DNS record.",next:[{command:buildCommandWithYes(client.argv),when:"to confirm removal"}]},1),1;if(!(skipConfirmation||await readConfirmation2(client,"The following record will be removed permanently",domainName,record)))return output_manager_default.error("User canceled."),0;let rmStamp=stamp_default();return await deleteDNSRecordById(client,domainName,record.id),output_manager_default.success(`Record ${import_chalk91.default.gray(`${record.id}`)} removed ${import_chalk91.default.gray(rmStamp())}`),0}function readConfirmation2(client,msg,domainName,record){return new Promise(resolve14=>{output_manager_default.log(msg),output_manager_default.print(`${table([getDeleteTableRow(domainName,record)],{align:["l","r","l"],hsep:6}).replace(/^(.*)/gm," $1")}
|
|
379
389
|
`),output_manager_default.print(`${import_chalk91.default.bold.red("> Are you sure?")} ${import_chalk91.default.gray("(y/N) ")}`),client.stdin.on("data",d=>{process.stdin.pause(),resolve14(d.toString().trim().toLowerCase()==="y")}).resume()})}function getDeleteTableRow(domainName,record){let recordName=`${record.name.length>0?`${record.name}.`:""}${domainName}`;return[record.id,import_chalk91.default.bold(`${recordName} ${record.type} ${record.value} ${record.mxPriority||""}`),import_chalk91.default.gray(`${(0,import_ms14.default)(Date.now()-new Date(Number(record.createdAt)).getTime())} ago`)]}var import_chalk92=__toESM(require_source(),1);async function updateDNSRecord(client,recordId,data){return client.fetch(`/v1/domains/records/${encodeURIComponent(recordId)}`,{method:"PATCH",body:data})}var ALLOWED_RECORD_TYPES2=["A","AAAA","ALIAS","CAA","CNAME","MX","SRV","TXT"],DnsUpdateTelemetryClient=class extends TelemetryClient{trackCliArgumentId(recordId){recordId&&this.trackCliArgument({arg:"id",value:this.redactedValue})}trackCliOptionName(name){name!==void 0&&this.trackCliOption({option:"name",value:this.redactedValue})}trackCliOptionType(type){if(type){let allowedType=ALLOWED_RECORD_TYPES2.includes(type)?type:this.redactedValue;this.trackCliOption({option:"type",value:allowedType})}}trackCliOptionValue(value){value&&this.trackCliOption({option:"value",value:this.redactedValue})}trackCliOptionTtl(ttl){ttl!==void 0&&this.trackCliOption({option:"ttl",value:this.redactedValue})}trackCliOptionMxPriority(mxPriority){mxPriority!==void 0&&this.trackCliOption({option:"mx-priority",value:this.redactedValue})}trackCliOptionSrvPriority(srvPriority){srvPriority!==void 0&&this.trackCliOption({option:"srv-priority",value:this.redactedValue})}trackCliOptionSrvWeight(srvWeight){srvWeight!==void 0&&this.trackCliOption({option:"srv-weight",value:this.redactedValue})}trackCliOptionSrvPort(srvPort){srvPort!==void 0&&this.trackCliOption({option:"srv-port",value:this.redactedValue})}trackCliOptionSrvTarget(srvTarget){srvTarget&&this.trackCliOption({option:"srv-target",value:this.redactedValue})}trackCliOptionComment(comment){comment!==void 0&&this.trackCliOption({option:"comment",value:this.redactedValue})}};var SRV_FLAGS=["--srv-priority","--srv-weight","--srv-port","--srv-target"];async function update2(client,argv){let telemetry2=new DnsUpdateTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(updateSubcommand2.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(err){return client.nonInteractive&&outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message:err instanceof Error?err.message:String(err)},2),printError(err),2}let{args,flags}=parsedArgs;if(args.length!==1){if(client.nonInteractive){let cmd2=withGlobalFlags(client,"dns update <id> [options]");outputActionRequired(client,{status:AGENT_STATUS.ACTION_REQUIRED,reason:AGENT_REASON.MISSING_ARGUMENTS,action:AGENT_ACTION.MISSING_ARGUMENTS,message:`Invalid number of arguments. Run: ${cmd2}`,next:[{command:cmd2,when:"to update a DNS record by id (use dns ls to find ids)"}]},2)}return output_manager_default.error(`Invalid number of arguments. Usage: ${import_chalk92.default.cyan(`${getCommandName("dns update <id> [options]")}`)}`),2}let[recordId]=args;telemetry2.trackCliArgumentId(recordId),telemetry2.trackCliOptionName(flags["--name"]),telemetry2.trackCliOptionType(flags["--type"]),telemetry2.trackCliOptionValue(flags["--value"]),telemetry2.trackCliOptionTtl(flags["--ttl"]),telemetry2.trackCliOptionMxPriority(flags["--mx-priority"]),telemetry2.trackCliOptionSrvPriority(flags["--srv-priority"]),telemetry2.trackCliOptionSrvWeight(flags["--srv-weight"]),telemetry2.trackCliOptionSrvPort(flags["--srv-port"]),telemetry2.trackCliOptionSrvTarget(flags["--srv-target"]),telemetry2.trackCliOptionComment(flags["--comment"]);let numericFlags=["--ttl","--mx-priority","--srv-priority","--srv-weight","--srv-port"];for(let flagName2 of numericFlags){let value=flags[flagName2];if(value!==void 0&&Number.isNaN(value))return client.nonInteractive&&outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message:`The ${flagName2} option must be a number.`},2),output_manager_default.error(`The ${flagName2} option must be a number.`),2}let data={},name=flags["--name"];name!==void 0&&(data.name=name==="@"?"":name),flags["--type"]!==void 0&&(data.type=flags["--type"]),flags["--value"]!==void 0&&(data.value=flags["--value"]),flags["--ttl"]!==void 0&&(data.ttl=flags["--ttl"]),flags["--mx-priority"]!==void 0&&(data.mxPriority=flags["--mx-priority"]),flags["--comment"]!==void 0&&(data.comment=flags["--comment"]);let srvFlagsProvided=SRV_FLAGS.filter(flagName2=>flags[flagName2]!==void 0);if(srvFlagsProvided.length>0){if(srvFlagsProvided.length!==SRV_FLAGS.length)return client.nonInteractive&&outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message:`Updating an SRV record requires all of ${SRV_FLAGS.join(", ")}.`},2),output_manager_default.error(`Updating an SRV record requires all of ${SRV_FLAGS.join(", ")}.`),2;data.srv={priority:flags["--srv-priority"],weight:flags["--srv-weight"],port:flags["--srv-port"],target:flags["--srv-target"]}}if(Object.keys(data).length===0){if(client.nonInteractive){let cmd2=withGlobalFlags(client,"dns update <id> [options]");outputActionRequired(client,{status:AGENT_STATUS.ACTION_REQUIRED,reason:AGENT_REASON.NO_CHANGES_REQUESTED,action:AGENT_ACTION.MISSING_ARGUMENTS,message:`Provide at least one field to update. Run: ${cmd2}`,next:[{command:cmd2,when:"to update a DNS record (e.g. --value, --ttl, --comment)"},{command:withGlobalFlags(client,"dns update --help"),when:"for available options"}]},1)}return output_manager_default.error(`Provide at least one field to update. See ${import_chalk92.default.cyan(`${getCommandName("dns update --help")}`)} for available options.`),2}let changeSummary=Object.entries(data).map(([field,value])=>`${field}=${value===""?"@":value}`).join(", ");if(!canPrompt(client)){let rerun2=getCommandNamePlain(stripSensitiveAuthArgs(client.argv.slice(2)).filter(arg2=>arg2!=="--non-interactive"&&!arg2.startsWith("--non-interactive=")).join(" "));return outputActionRequired(client,{status:AGENT_STATUS.ACTION_REQUIRED,reason:AGENT_REASON.INTERACTIVE_CONFIRMATION_REQUIRED,action:AGENT_ACTION.CONFIRMATION_REQUIRED,message:`Updating DNS record ${recordId} (${changeSummary}) overwrites a live record. This cannot be confirmed non-interactively: the user must run this command in a terminal and confirm.`,userActionRequired:!0,hint:"Surface this to the user; the confirmation cannot be automated.",next:[{command:rerun2,when:"user runs this command in an interactive terminal to confirm"}]},1),output_manager_default.error("This command must be run interactively to confirm overwriting the DNS record."),1}if(output_manager_default.print(prependEmoji(`Updating DNS record ${import_chalk92.default.gray(recordId)} will overwrite: ${import_chalk92.default.bold(changeSummary)}
|
|
380
|
-
`,emoji("warning"))),!await client.input.confirm(`Update DNS record ${recordId}?`,!1))return output_manager_default.log("Canceled"),0;let updateStamp=stamp_default(),record;try{record=await updateDNSRecord(client,recordId,data)}catch(err){if(isAPIError(err)){if(err.status===404)return output_manager_default.error("DNS record not found"),1;if(err.status===403)return output_manager_default.error("You don't have permission to access this DNS record."),1;if(err.status===400)return output_manager_default.error(err.serverMessage||"The request was invalid."),1}return printError(err),1}let contextName=await getContextName(client);return output_manager_default.success(`DNS record ${import_chalk92.default.gray(`${record.id}`)} of domain ${import_chalk92.default.bold(record.domain)} updated under ${import_chalk92.default.bold(contextName)} ${import_chalk92.default.gray(updateStamp())}`),0}var DnsTelemetryClient=class extends TelemetryClient{trackCliSubcommandAdd(actual){this.trackCliSubcommand({subcommand:"add",value:actual})}trackCliSubcommandRemove(actual){this.trackCliSubcommand({subcommand:"remove",value:actual})}trackCliSubcommandImport(actual){this.trackCliSubcommand({subcommand:"import",value:actual})}trackCliSubcommandInspect(actual){this.trackCliSubcommand({subcommand:"inspect",value:actual})}trackCliSubcommandUpdate(actual){this.trackCliSubcommand({subcommand:"update",value:actual})}trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}};var COMMAND_CONFIG27={add:getCommandAliases(addSubcommand3),import:getCommandAliases(importSubcommand),inspect:getCommandAliases(inspectSubcommand6),ls:getCommandAliases(listSubcommand11),rm:getCommandAliases(removeSubcommand6),update:getCommandAliases(updateSubcommand2)};async function dns(client){let{telemetryEventStore}=client,parsedArgs,flagsSpecification=getFlagsSpecification(dnsCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),2}let telemetry2=new DnsTelemetryClient({opts:{store:telemetryEventStore}}),{subcommand,subcommandOriginal,args}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG27),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("dns",subcommand),output_manager_default.print(help(dnsCommand,{columns:client.stderr.columns})),0;function printHelp(command2){output_manager_default.print(help(command2,{parent:dnsCommand,columns:client.stderr.columns}))}switch(subcommand){case"add":return needHelp?(telemetry2.trackCliFlagHelp("dns",subcommandOriginal),printHelp(addSubcommand3),0):(telemetry2.trackCliSubcommandAdd(subcommandOriginal),add5(client,args));case"import":return needHelp?(telemetry2.trackCliFlagHelp("dns",subcommandOriginal),printHelp(importSubcommand),0):(telemetry2.trackCliSubcommandImport(subcommandOriginal),importZone(client,args));case"inspect":return needHelp?(telemetry2.trackCliFlagHelp("dns",subcommandOriginal),printHelp(inspectSubcommand6),0):(telemetry2.trackCliSubcommandInspect(subcommandOriginal),inspect7(client,args));case"rm":return needHelp?(telemetry2.trackCliFlagHelp("dns",subcommandOriginal),printHelp(removeSubcommand6),0):(telemetry2.trackCliSubcommandRemove(subcommandOriginal),rm5(client,args));case"update":return needHelp?(telemetry2.trackCliFlagHelp("dns",subcommandOriginal),printHelp(updateSubcommand2),0):(telemetry2.trackCliSubcommandUpdate(subcommandOriginal),update2(client,args));default:return needHelp?(telemetry2.trackCliFlagHelp("dns",subcommandOriginal),printHelp(listSubcommand11),0):(telemetry2.trackCliSubcommandList(subcommandOriginal),ls6(client,args))}}var import_chalk95=__toESM(require_source(),1);function isPublicSuffix(domainName){return domainName.endsWith(".vercel.app")||domainName.endsWith(".now.sh")}var import_tldts5=__toESM(require_cjs(),1);function isRootDomain(domainName){let parsedDomain=(0,import_tldts5.parse)(domainName),{domain:rootDomain,subdomain}=parsedDomain;return!!(!subdomain&&rootDomain)}async function getDomainConfig(client,domainName){try{return await client.fetch(`/v6/domains/${domainName}/config`)}catch(err){if(isAPIError(err)&&err.status<500)return err;throw err}}var import_chalk93=__toESM(require_source(),1);async function addDomainToProject(client,projectNameOrId,domain2){output_manager_default.spinner(`Adding domain ${domain2} to project ${import_chalk93.default.bold(projectNameOrId)}`);try{let aliasTarget=(await client.fetch(`/projects/${encodeURIComponent(projectNameOrId)}/alias`,{method:"POST",body:JSON.stringify({target:"PRODUCTION",domain:domain2})})).find(aliasTarget2=>aliasTarget2.domain===domain2);return aliasTarget||new Error(`Adding domain '${domain2}' to project '${projectNameOrId}' did not return a matching alias in the API response. The domain may already be on another project\u2014try 'vercel domains add ${domain2} ${projectNameOrId} --force' after removing it there, or run 'vercel domains inspect ${domain2}'.`)}catch(err){if(isAPIError(err)&&err.status<500)return err;throw err}}function getProjectDomain(client,projectIdOrName,domainName,options={}){return fetchProjectDomain(client,`/v9/projects/${encodeURIComponent(projectIdOrName)}/domains/${encodeURIComponent(domainName)}`,options)}function getProjectDomainByName(client,domainName,options={}){return fetchProjectDomain(client,`/project-domains/${encodeURIComponent(domainName)}`,options)}function verifyProjectDomain(client,projectIdOrName,domainName,options={}){return fetchProjectDomain(client,`/v9/projects/${encodeURIComponent(projectIdOrName)}/domains/${encodeURIComponent(domainName)}/verify`,{...options,method:"POST"})}async function fetchProjectDomain(client,url,init2){try{return await client.fetch(url,init2)}catch(err){if(isAPIError(err)&&err.status<500)return err;throw err}}var import_chalk94=__toESM(require_source(),1);async function removeDomainFromProject(client,projectNameOrId,domain2){output_manager_default.spinner(`Removing domain ${domain2} from project ${import_chalk94.default.bold(projectNameOrId)}`);try{return await client.fetch(`/projects/${encodeURIComponent(projectNameOrId)}/alias?domain=${encodeURIComponent(domain2)}`,{method:"DELETE"})}catch(err){if(isAPIError(err)&&err.status<500)return err;throw err}}var DomainsAddTelemetryClient=class extends TelemetryClient{trackCliFlagForce(force){force&&this.trackCliFlag("force")}trackCliArgumentDomain(domainName){domainName&&this.trackCliArgument({arg:"domain",value:this.redactedValue})}trackCliArgumentProject(projectName){projectName&&this.trackCliArgument({arg:"project",value:this.redactedValue})}};var import_error_utils11=__toESM(require_dist(),1);var VERCEL_DOMAINS_DASHBOARD="https://vercel.com/dashboard/domains";function nextCommandsForDomainsAddFailure(client,domainName,projectName,err){let next=[{command:withGlobalFlags(client,`domains inspect ${domainName}`),when:"to inspect domain configuration and ownership"}],apiErr=err,code2=typeof apiErr.code=="string"?apiErr.code:"",msg=err.message.toLowerCase(),status6=isAPIError(err)?err.status:void 0,looksLikeOwnershipOrPurchaseIssue=code2==="not_domain_owner"||code2==="invalid_domain"||code2==="domain_not_found"||status6===403&&(msg.includes("not authorized")||msg.includes("forbidden"))||msg.includes("not verified")||msg.includes("do not own")||msg.includes("not the owner"),aliasConflict=code2==="ALIAS_DOMAIN_EXIST"||status6===409||msg.includes("already assigned")||msg.includes("already in use");return(looksLikeOwnershipOrPurchaseIssue||aliasConflict)&&(next.push({command:withGlobalFlags(client,`domains buy ${domainName}`),when:"user must run interactively in a terminal\u2014agents must not purchase; purchase also available in dashboard"}),next.push({command:withGlobalFlags(client,"domains transfer-in"),when:"to transfer a domain you already own from another registrar into Vercel"}),next.push({command:openUrlInBrowserCommand(VERCEL_DOMAINS_DASHBOARD),when:"to open the Domains dashboard in your browser"})),aliasConflict&&!looksLikeOwnershipOrPurchaseIssue&&projectName&&next.push({command:withGlobalFlags(client,`domains add ${domainName} ${projectName} --force`),when:"to force move from another project (only if API returns project id\u2014otherwise remove domain from the other project first)"}),next}function nextCommandsForDomainsAddSuccess(client,domainName,projectName){return projectName?[{command:withGlobalFlags(client,`domains verify ${domainName}`),when:"to check DNS configuration and see the records you need to set"},{command:withGlobalFlags(client,`domains inspect ${domainName}`),when:"to inspect domain configuration and ownership"}]:[{command:withGlobalFlags(client,`domains add ${domainName} <project>`),when:"to attach this domain to a project"},{command:withGlobalFlags(client,`domains inspect ${domainName}`),when:"to inspect domain configuration and ownership"}]}async function printDomainConfiguration(client,domainName){if(isPublicSuffix(domainName))return output_manager_default.log("The domain will automatically get assigned to your latest production deployment."),0;let domainConfig=await getDomainConfig(client,domainName);return!(domainConfig instanceof Error)&&domainConfig.misconfigured?output_manager_default.warn(`This domain is not configured properly. Run ${getCommandName(`domains verify ${domainName}`)} to see how to configure it.`):output_manager_default.log("The domain will automatically get assigned to your latest production deployment."),0}async function add6(client,argv){let telemetry2=new DomainsAddTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(addSubcommand4.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return client.nonInteractive&&outputAgentError(client,{status:"error",reason:"invalid_arguments",message:error instanceof Error?error.message:String(error)},2),printError(error),2}let{args,flags:opts}=parsedArgs,force=opts["--force"];telemetry2.trackCliFlagForce(force);let contextName=await getContextName(client,{resolveLocalScope:!0});if(args.length<1||args.length>2){if(client.nonInteractive){let cmd2=withGlobalFlags(client,"domains add <domain> [project]");outputActionRequired(client,{status:"action_required",reason:"missing_arguments",action:"missing_arguments",message:`Run: ${cmd2}`,next:[{command:cmd2,when:"to add a domain to your team, or pass a project name to assign it to a project"}]},2)}return output_manager_default.error(`${getCommandName("domains add <domain> [project]")} expects one or two arguments.`),2}let domainName=String(args[0]),projectName=args.length===2?String(args[1]):void 0;if(telemetry2.trackCliArgumentDomain(domainName),telemetry2.trackCliArgumentProject(args[1]),!projectName){if(!isPublicSuffix(domainName)&&!isRootDomain(domainName)){let cmd2=withGlobalFlags(client,`domains add ${domainName} <project>`),message=`Only apex domains can be added without a project. To add the subdomain ${domainName}, pass a project: ${cmd2}`;return client.nonInteractive&&outputActionRequired(client,{status:"action_required",reason:"project_required_for_subdomain",action:"add_with_project",message,next:[{command:cmd2,when:"to add this subdomain to a specific project"}]},1),output_manager_default.error(message),1}let addStamp2=stamp_default(),addResult;try{addResult=await addDomain(client,domainName,contextName)}catch(err){let error=err instanceof Error?err:new Error(String(err));if(client.nonInteractive){let status6=isAPIError(error)?error.status:void 0,apiErr=error,code2=typeof apiErr.code=="string"?apiErr.code:"",msg=error.message.toLowerCase(),reason=status6===403?"forbidden":status6===404?"not_found":status6===409||msg.includes("already")?"alias_conflict":"domain_add_failed";(code2==="not_domain_owner"||status6===403&&msg.includes("not authorized"))&&(reason="domain_not_owned");let message=(0,import_error_utils11.errorToString)(error);(reason==="domain_not_owned"||code2==="invalid_domain"||msg.includes("not authorized to use"))&&(message+=" domains add is for domains you already own or control via DNS. If you have not purchased the domain yet, the user must run 'domains buy' interactively (agents must not purchase) or buy in the dashboard; use 'domains transfer-in' to move an existing registration to Vercel."),outputAgentError(client,{status:"error",reason,message,next:nextCommandsForDomainsAddFailure(client,domainName,"",error)},1)}return output_manager_default.prettyError(error),1}return addResult instanceof InvalidDomain?(client.nonInteractive&&outputAgentError(client,{status:"error",reason:"invalid_domain",message:(0,import_error_utils11.errorToString)(addResult)},1),output_manager_default.prettyError(addResult),1):addResult instanceof DomainAlreadyExists?(client.nonInteractive&&outputAgentError(client,{status:"error",reason:"domain_already_exists",message:(0,import_error_utils11.errorToString)(addResult)},1),output_manager_default.prettyError(addResult),1):(client.nonInteractive&&outputAgentSuccess(client,{status:"success",reason:"domain_added",message:`Domain ${domainName} added to ${contextName}.`,next:nextCommandsForDomainsAddSuccess(client,domainName)},0),output_manager_default.success(`Domain ${import_chalk95.default.bold(domainName)} added to ${import_chalk95.default.bold(contextName)}. ${addStamp2()}`),0)}let addStamp=stamp_default(),removedPreviousAssignment=!1,aliasTarget=await addDomainToProject(client,projectName,domainName);if(aliasTarget instanceof Error){if(aliasTarget instanceof APIError&&aliasTarget.code==="ALIAS_DOMAIN_EXIST"){let conflictProject=aliasTarget.project,alreadyOnRequestedProject=!!(conflictProject&&(conflictProject.id===projectName||conflictProject.name===projectName));if(alreadyOnRequestedProject||(alreadyOnRequestedProject=!(await getProjectDomain(client,projectName,domainName)instanceof Error)),alreadyOnRequestedProject)return client.nonInteractive&&outputAgentSuccess(client,{status:"success",reason:"domain_already_assigned",message:`Domain ${domainName} is already assigned to project ${projectName}.`,next:nextCommandsForDomainsAddSuccess(client,domainName,projectName)},0),output_manager_default.log(`Domain ${import_chalk95.default.bold(domainName)} is already assigned to project ${import_chalk95.default.bold(projectName)}. ${addStamp()}`),printDomainConfiguration(client,domainName);if(force){let currentProjectId=conflictProject?.id;if(!currentProjectId){let currentProjectDomain=await getProjectDomainByName(client,domainName);currentProjectDomain instanceof Error||(currentProjectId=currentProjectDomain.projectId)}if(currentProjectId){let removeResponse=await removeDomainFromProject(client,currentProjectId,domainName);if(removeResponse instanceof Error)return client.nonInteractive&&outputAgentError(client,{status:"error",reason:"domain_remove_failed",message:(0,import_error_utils11.errorToString)(removeResponse)},1),output_manager_default.prettyError(removeResponse),1;removedPreviousAssignment=!0;try{aliasTarget=await addDomainToProject(client,projectName,domainName)}catch(error){aliasTarget=error instanceof Error?error:new Error((0,import_error_utils11.errorToString)(error))}}}}if(aliasTarget instanceof Error){let partialReassignmentHint=removedPreviousAssignment?"Removed the previous project assignment, but could not confirm the destination assignment. Inspect the current assignment before retrying.":void 0;if(client.nonInteractive){let status6=isAPIError(aliasTarget)?aliasTarget.status:void 0,apiErr=aliasTarget,code2=typeof apiErr.code=="string"?apiErr.code:"",msg=aliasTarget.message.toLowerCase(),reason=status6===403?"forbidden":status6===404?"not_found":status6===409||msg.includes("already")?"alias_conflict":"domain_add_failed";(code2==="not_domain_owner"||status6===403&&msg.includes("not authorized"))&&(reason="domain_not_owned");let message=(0,import_error_utils11.errorToString)(aliasTarget);(reason==="domain_not_owned"||code2==="invalid_domain"||msg.includes("not authorized to use"))&&(message+=" domains add is for domains you already own or control via DNS. If you have not purchased the domain yet, the user must run 'domains buy' interactively (agents must not purchase) or buy in the dashboard; use 'domains transfer-in' to move an existing registration to Vercel."),outputAgentError(client,{status:"error",reason,message,...partialReassignmentHint?{hint:partialReassignmentHint}:{},next:removedPreviousAssignment?[{command:withGlobalFlags(client,`domains inspect ${quoteArg(domainName)}`),when:"inspect the current assignment before retrying"}]:nextCommandsForDomainsAddFailure(client,domainName,projectName,aliasTarget)},1)}return output_manager_default.prettyError(aliasTarget),partialReassignmentHint&&output_manager_default.log(partialReassignmentHint),1}}return client.nonInteractive&&outputAgentSuccess(client,{status:"success",reason:"domain_added",message:`Domain ${domainName} added to project ${projectName}.`,next:nextCommandsForDomainsAddSuccess(client,domainName,projectName)},0),output_manager_default.success(`Domain ${import_chalk95.default.bold(domainName)} added to project ${import_chalk95.default.bold(projectName)}. ${addStamp()}`),printDomainConfiguration(client,domainName)}var import_chalk96=__toESM(require_source(),1);async function check(client,argv){let parsedArgs,flagsSpecification=getFlagsSpecification(checkSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags}=parsedArgs,domains2=args,hasMultipleInputDomains=domains2.length>1,formatResult=validateJsonOutput(flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;if(domains2.length===0)return output_manager_default.error("Missing domain name. Usage: `vercel domains check <domain>`"),2;if(domains2.length>50)return output_manager_default.error("Too many domains. You can check up to 50 domains per request."),1;let invalidDomains=domains2.filter(domain2=>!isRootDomain(domain2));if(invalidDomains.length>0)return output_manager_default.error(`Invalid domain name(s): ${invalidDomains.map(domain2=>param(domain2)).join(", ")}. Run ${getCommandName("domains --help")}`),1;try{let results=domains2.length===1?[{domain:domains2[0],available:(await getDomainStatus(client,domains2[0])).available}]:(await client.fetch("/v1/registrar/domains/availability",{method:"POST",body:{domains:domains2}})).results;if(formatResult.jsonOutput)return!hasMultipleInputDomains&&results.length===1?client.stdout.write(`${JSON.stringify({domain:results[0].domain,available:!!results[0].available},null,2)}
|
|
390
|
+
`,emoji("warning"))),!await client.input.confirm(`Update DNS record ${recordId}?`,!1))return output_manager_default.log("Canceled"),0;let updateStamp=stamp_default(),record;try{record=await updateDNSRecord(client,recordId,data)}catch(err){if(isAPIError(err)){if(err.status===404)return output_manager_default.error("DNS record not found"),1;if(err.status===403)return output_manager_default.error("You don't have permission to access this DNS record."),1;if(err.status===400)return output_manager_default.error(err.serverMessage||"The request was invalid."),1}return printError(err),1}let contextName=await getContextName(client);return output_manager_default.success(`DNS record ${import_chalk92.default.gray(`${record.id}`)} of domain ${import_chalk92.default.bold(record.domain)} updated under ${import_chalk92.default.bold(contextName)} ${import_chalk92.default.gray(updateStamp())}`),0}var DnsTelemetryClient=class extends TelemetryClient{trackCliSubcommandAdd(actual){this.trackCliSubcommand({subcommand:"add",value:actual})}trackCliSubcommandRemove(actual){this.trackCliSubcommand({subcommand:"remove",value:actual})}trackCliSubcommandImport(actual){this.trackCliSubcommand({subcommand:"import",value:actual})}trackCliSubcommandInspect(actual){this.trackCliSubcommand({subcommand:"inspect",value:actual})}trackCliSubcommandUpdate(actual){this.trackCliSubcommand({subcommand:"update",value:actual})}trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}};var COMMAND_CONFIG27={add:getCommandAliases(addSubcommand4),import:getCommandAliases(importSubcommand),inspect:getCommandAliases(inspectSubcommand7),ls:getCommandAliases(listSubcommand12),rm:getCommandAliases(removeSubcommand7),update:getCommandAliases(updateSubcommand2)};async function dns(client){let{telemetryEventStore}=client,parsedArgs,flagsSpecification=getFlagsSpecification(dnsCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),2}let telemetry2=new DnsTelemetryClient({opts:{store:telemetryEventStore}}),{subcommand,subcommandOriginal,args}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG27),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("dns",subcommand),output_manager_default.print(help(dnsCommand,{columns:client.stderr.columns})),0;function printHelp(command2){output_manager_default.print(help(command2,{parent:dnsCommand,columns:client.stderr.columns}))}switch(subcommand){case"add":return needHelp?(telemetry2.trackCliFlagHelp("dns",subcommandOriginal),printHelp(addSubcommand4),0):(telemetry2.trackCliSubcommandAdd(subcommandOriginal),add5(client,args));case"import":return needHelp?(telemetry2.trackCliFlagHelp("dns",subcommandOriginal),printHelp(importSubcommand),0):(telemetry2.trackCliSubcommandImport(subcommandOriginal),importZone(client,args));case"inspect":return needHelp?(telemetry2.trackCliFlagHelp("dns",subcommandOriginal),printHelp(inspectSubcommand7),0):(telemetry2.trackCliSubcommandInspect(subcommandOriginal),inspect7(client,args));case"rm":return needHelp?(telemetry2.trackCliFlagHelp("dns",subcommandOriginal),printHelp(removeSubcommand7),0):(telemetry2.trackCliSubcommandRemove(subcommandOriginal),rm5(client,args));case"update":return needHelp?(telemetry2.trackCliFlagHelp("dns",subcommandOriginal),printHelp(updateSubcommand2),0):(telemetry2.trackCliSubcommandUpdate(subcommandOriginal),update2(client,args));default:return needHelp?(telemetry2.trackCliFlagHelp("dns",subcommandOriginal),printHelp(listSubcommand12),0):(telemetry2.trackCliSubcommandList(subcommandOriginal),ls6(client,args))}}var import_chalk95=__toESM(require_source(),1);function isPublicSuffix(domainName){return domainName.endsWith(".vercel.app")||domainName.endsWith(".now.sh")}var import_tldts5=__toESM(require_cjs(),1);function isRootDomain(domainName){let parsedDomain=(0,import_tldts5.parse)(domainName),{domain:rootDomain,subdomain}=parsedDomain;return!!(!subdomain&&rootDomain)}async function getDomainConfig(client,domainName){try{return await client.fetch(`/v6/domains/${domainName}/config`)}catch(err){if(isAPIError(err)&&err.status<500)return err;throw err}}var import_chalk93=__toESM(require_source(),1);async function addDomainToProject(client,projectNameOrId,domain2){output_manager_default.spinner(`Adding domain ${domain2} to project ${import_chalk93.default.bold(projectNameOrId)}`);try{let aliasTarget=(await client.fetch(`/projects/${encodeURIComponent(projectNameOrId)}/alias`,{method:"POST",body:JSON.stringify({target:"PRODUCTION",domain:domain2})})).find(aliasTarget2=>aliasTarget2.domain===domain2);return aliasTarget||new Error(`Adding domain '${domain2}' to project '${projectNameOrId}' did not return a matching alias in the API response. The domain may already be on another project\u2014try 'vercel domains add ${domain2} ${projectNameOrId} --force' after removing it there, or run 'vercel domains inspect ${domain2}'.`)}catch(err){if(isAPIError(err)&&err.status<500)return err;throw err}}function getProjectDomain(client,projectIdOrName,domainName,options={}){return fetchProjectDomain(client,`/v9/projects/${encodeURIComponent(projectIdOrName)}/domains/${encodeURIComponent(domainName)}`,options)}function getProjectDomainByName(client,domainName,options={}){return fetchProjectDomain(client,`/project-domains/${encodeURIComponent(domainName)}`,options)}function verifyProjectDomain(client,projectIdOrName,domainName,options={}){return fetchProjectDomain(client,`/v9/projects/${encodeURIComponent(projectIdOrName)}/domains/${encodeURIComponent(domainName)}/verify`,{...options,method:"POST"})}async function fetchProjectDomain(client,url,init2){try{return await client.fetch(url,init2)}catch(err){if(isAPIError(err)&&err.status<500)return err;throw err}}var import_chalk94=__toESM(require_source(),1);async function removeDomainFromProject(client,projectNameOrId,domain2){output_manager_default.spinner(`Removing domain ${domain2} from project ${import_chalk94.default.bold(projectNameOrId)}`);try{return await client.fetch(`/projects/${encodeURIComponent(projectNameOrId)}/alias?domain=${encodeURIComponent(domain2)}`,{method:"DELETE"})}catch(err){if(isAPIError(err)&&err.status<500)return err;throw err}}var DomainsAddTelemetryClient=class extends TelemetryClient{trackCliFlagForce(force){force&&this.trackCliFlag("force")}trackCliArgumentDomain(domainName){domainName&&this.trackCliArgument({arg:"domain",value:this.redactedValue})}trackCliArgumentProject(projectName){projectName&&this.trackCliArgument({arg:"project",value:this.redactedValue})}};var import_error_utils11=__toESM(require_dist(),1);var VERCEL_DOMAINS_DASHBOARD="https://vercel.com/dashboard/domains";function nextCommandsForDomainsAddFailure(client,domainName,projectName,err){let next=[{command:withGlobalFlags(client,`domains inspect ${domainName}`),when:"to inspect domain configuration and ownership"}],apiErr=err,code2=typeof apiErr.code=="string"?apiErr.code:"",msg=err.message.toLowerCase(),status6=isAPIError(err)?err.status:void 0,looksLikeOwnershipOrPurchaseIssue=code2==="not_domain_owner"||code2==="invalid_domain"||code2==="domain_not_found"||status6===403&&(msg.includes("not authorized")||msg.includes("forbidden"))||msg.includes("not verified")||msg.includes("do not own")||msg.includes("not the owner"),aliasConflict=code2==="ALIAS_DOMAIN_EXIST"||status6===409||msg.includes("already assigned")||msg.includes("already in use");return(looksLikeOwnershipOrPurchaseIssue||aliasConflict)&&(next.push({command:withGlobalFlags(client,`domains buy ${domainName}`),when:"to buy the domain; it returns the price and needed details, and charges nothing until a person approves the price"}),next.push({command:withGlobalFlags(client,"domains transfer-in"),when:"to transfer a domain you already own from another registrar into Vercel"}),next.push({command:openUrlInBrowserCommand(VERCEL_DOMAINS_DASHBOARD),when:"to open the Domains dashboard in your browser"})),aliasConflict&&!looksLikeOwnershipOrPurchaseIssue&&projectName&&next.push({command:withGlobalFlags(client,`domains add ${domainName} ${projectName} --force`),when:"to force move from another project (only if API returns project id\u2014otherwise remove domain from the other project first)"}),next}function nextCommandsForDomainsAddSuccess(client,domainName,projectName){return projectName?[{command:withGlobalFlags(client,`domains verify ${domainName}`),when:"to check DNS configuration and see the records you need to set"},{command:withGlobalFlags(client,`domains inspect ${domainName}`),when:"to inspect domain configuration and ownership"}]:[{command:withGlobalFlags(client,`domains add ${domainName} <project>`),when:"to attach this domain to a project"},{command:withGlobalFlags(client,`domains inspect ${domainName}`),when:"to inspect domain configuration and ownership"}]}async function printDomainConfiguration(client,domainName){if(isPublicSuffix(domainName))return output_manager_default.log("The domain will automatically get assigned to your latest production deployment."),0;let domainConfig=await getDomainConfig(client,domainName);return!(domainConfig instanceof Error)&&domainConfig.misconfigured?output_manager_default.warn(`This domain is not configured properly. Run ${getCommandName(`domains verify ${domainName}`)} to see how to configure it.`):output_manager_default.log("The domain will automatically get assigned to your latest production deployment."),0}async function add6(client,argv){let telemetry2=new DomainsAddTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(addSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return client.nonInteractive&&outputAgentError(client,{status:"error",reason:"invalid_arguments",message:error instanceof Error?error.message:String(error)},2),printError(error),2}let{args,flags:opts}=parsedArgs,force=opts["--force"];telemetry2.trackCliFlagForce(force);let contextName=await getContextName(client,{resolveLocalScope:!0});if(args.length<1||args.length>2){if(client.nonInteractive){let cmd2=withGlobalFlags(client,"domains add <domain> [project]");outputActionRequired(client,{status:"action_required",reason:"missing_arguments",action:"missing_arguments",message:`Run: ${cmd2}`,next:[{command:cmd2,when:"to add a domain to your team, or pass a project name to assign it to a project"}]},2)}return output_manager_default.error(`${getCommandName("domains add <domain> [project]")} expects one or two arguments.`),2}let domainName=String(args[0]),projectName=args.length===2?String(args[1]):void 0;if(telemetry2.trackCliArgumentDomain(domainName),telemetry2.trackCliArgumentProject(args[1]),!projectName){if(!isPublicSuffix(domainName)&&!isRootDomain(domainName)){let cmd2=withGlobalFlags(client,`domains add ${domainName} <project>`),message=`Only apex domains can be added without a project. To add the subdomain ${domainName}, pass a project: ${cmd2}`;return client.nonInteractive&&outputActionRequired(client,{status:"action_required",reason:"project_required_for_subdomain",action:"add_with_project",message,next:[{command:cmd2,when:"to add this subdomain to a specific project"}]},1),output_manager_default.error(message),1}let addStamp2=stamp_default(),addResult;try{addResult=await addDomain(client,domainName,contextName)}catch(err){let error=err instanceof Error?err:new Error(String(err));if(client.nonInteractive){let status6=isAPIError(error)?error.status:void 0,apiErr=error,code2=typeof apiErr.code=="string"?apiErr.code:"",msg=error.message.toLowerCase(),reason=status6===403?"forbidden":status6===404?"not_found":status6===409||msg.includes("already")?"alias_conflict":"domain_add_failed";(code2==="not_domain_owner"||status6===403&&msg.includes("not authorized"))&&(reason="domain_not_owned");let message=(0,import_error_utils11.errorToString)(error);(reason==="domain_not_owned"||code2==="invalid_domain"||msg.includes("not authorized to use"))&&(message+=" domains add is for domains you already own or control via DNS. If you have not purchased the domain yet, run 'domains buy' to get its price, and buy it only after the user approves that price; use 'domains transfer-in' to move an existing registration to Vercel."),outputAgentError(client,{status:"error",reason,message,next:nextCommandsForDomainsAddFailure(client,domainName,"",error)},1)}return output_manager_default.prettyError(error),1}return addResult instanceof InvalidDomain?(client.nonInteractive&&outputAgentError(client,{status:"error",reason:"invalid_domain",message:(0,import_error_utils11.errorToString)(addResult)},1),output_manager_default.prettyError(addResult),1):addResult instanceof DomainAlreadyExists?(client.nonInteractive&&outputAgentError(client,{status:"error",reason:"domain_already_exists",message:(0,import_error_utils11.errorToString)(addResult)},1),output_manager_default.prettyError(addResult),1):(client.nonInteractive&&outputAgentSuccess(client,{status:"success",reason:"domain_added",message:`Domain ${domainName} added to ${contextName}.`,next:nextCommandsForDomainsAddSuccess(client,domainName)},0),output_manager_default.success(`Domain ${import_chalk95.default.bold(domainName)} added to ${import_chalk95.default.bold(contextName)}. ${addStamp2()}`),0)}let addStamp=stamp_default(),removedPreviousAssignment=!1,aliasTarget=await addDomainToProject(client,projectName,domainName);if(aliasTarget instanceof Error){if(aliasTarget instanceof APIError&&aliasTarget.code==="ALIAS_DOMAIN_EXIST"){let conflictProject=aliasTarget.project,alreadyOnRequestedProject=!!(conflictProject&&(conflictProject.id===projectName||conflictProject.name===projectName));if(alreadyOnRequestedProject||(alreadyOnRequestedProject=!(await getProjectDomain(client,projectName,domainName)instanceof Error)),alreadyOnRequestedProject)return client.nonInteractive&&outputAgentSuccess(client,{status:"success",reason:"domain_already_assigned",message:`Domain ${domainName} is already assigned to project ${projectName}.`,next:nextCommandsForDomainsAddSuccess(client,domainName,projectName)},0),output_manager_default.log(`Domain ${import_chalk95.default.bold(domainName)} is already assigned to project ${import_chalk95.default.bold(projectName)}. ${addStamp()}`),printDomainConfiguration(client,domainName);if(force){let currentProjectId=conflictProject?.id;if(!currentProjectId){let currentProjectDomain=await getProjectDomainByName(client,domainName);currentProjectDomain instanceof Error||(currentProjectId=currentProjectDomain.projectId)}if(currentProjectId){let removeResponse=await removeDomainFromProject(client,currentProjectId,domainName);if(removeResponse instanceof Error)return client.nonInteractive&&outputAgentError(client,{status:"error",reason:"domain_remove_failed",message:(0,import_error_utils11.errorToString)(removeResponse)},1),output_manager_default.prettyError(removeResponse),1;removedPreviousAssignment=!0;try{aliasTarget=await addDomainToProject(client,projectName,domainName)}catch(error){aliasTarget=error instanceof Error?error:new Error((0,import_error_utils11.errorToString)(error))}}}}if(aliasTarget instanceof Error){let partialReassignmentHint=removedPreviousAssignment?"Removed the previous project assignment, but could not confirm the destination assignment. Inspect the current assignment before retrying.":void 0;if(client.nonInteractive){let status6=isAPIError(aliasTarget)?aliasTarget.status:void 0,apiErr=aliasTarget,code2=typeof apiErr.code=="string"?apiErr.code:"",msg=aliasTarget.message.toLowerCase(),reason=status6===403?"forbidden":status6===404?"not_found":status6===409||msg.includes("already")?"alias_conflict":"domain_add_failed";(code2==="not_domain_owner"||status6===403&&msg.includes("not authorized"))&&(reason="domain_not_owned");let message=(0,import_error_utils11.errorToString)(aliasTarget);(reason==="domain_not_owned"||code2==="invalid_domain"||msg.includes("not authorized to use"))&&(message+=" domains add is for domains you already own or control via DNS. If you have not purchased the domain yet, run 'domains buy' to get its price, and buy it only after the user approves that price; use 'domains transfer-in' to move an existing registration to Vercel."),outputAgentError(client,{status:"error",reason,message,...partialReassignmentHint?{hint:partialReassignmentHint}:{},next:removedPreviousAssignment?[{command:withGlobalFlags(client,`domains inspect ${quoteArg(domainName)}`),when:"inspect the current assignment before retrying"}]:nextCommandsForDomainsAddFailure(client,domainName,projectName,aliasTarget)},1)}return output_manager_default.prettyError(aliasTarget),partialReassignmentHint&&output_manager_default.log(partialReassignmentHint),1}}return client.nonInteractive&&outputAgentSuccess(client,{status:"success",reason:"domain_added",message:`Domain ${domainName} added to project ${projectName}.`,next:nextCommandsForDomainsAddSuccess(client,domainName,projectName)},0),output_manager_default.success(`Domain ${import_chalk95.default.bold(domainName)} added to project ${import_chalk95.default.bold(projectName)}. ${addStamp()}`),printDomainConfiguration(client,domainName)}var import_chalk96=__toESM(require_source(),1);async function check(client,argv){let parsedArgs,flagsSpecification=getFlagsSpecification(checkSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags}=parsedArgs,domains2=args,hasMultipleInputDomains=domains2.length>1,formatResult=validateJsonOutput(flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;if(domains2.length===0)return output_manager_default.error("Missing domain name. Usage: `vercel domains check <domain>`"),2;if(domains2.length>50)return output_manager_default.error("Too many domains. You can check up to 50 domains per request."),1;let invalidDomains=domains2.filter(domain2=>!isRootDomain(domain2));if(invalidDomains.length>0)return output_manager_default.error(`Invalid domain name(s): ${invalidDomains.map(domain2=>param(domain2)).join(", ")}. Run ${getCommandName("domains --help")}`),1;try{let results=domains2.length===1?[{domain:domains2[0],available:(await getDomainStatus(client,domains2[0])).available}]:(await client.fetch("/v1/registrar/domains/availability",{method:"POST",body:{domains:domains2}})).results;if(formatResult.jsonOutput)return!hasMultipleInputDomains&&results.length===1?client.stdout.write(`${JSON.stringify({domain:results[0].domain,available:!!results[0].available},null,2)}
|
|
381
391
|
`):client.stdout.write(`${JSON.stringify({results:results.map(result=>({domain:result.domain,available:!!result.available}))},null,2)}
|
|
382
392
|
`),0;for(let result of results)output_manager_default.log(`The domain ${param(result.domain)} is ${import_chalk96.default.underline(result.available?"available":"unavailable")}.`);return 0}catch(error){if(isAPIError(error)){let message=error.serverMessage||`API error (${error.status})`;return formatResult.jsonOutput?client.stdout.write(`${JSON.stringify({error:error.code||"api_error",message},null,2)}
|
|
383
393
|
`):output_manager_default.error(message),1}return printError(error),1}}var import_chalk97=__toESM(require_source(),1);async function transferInDomain(client,name,authCode,expectedPrice,years){let{team}=await getScope(client),teamParam=team?`?teamId=${team.slug}`:"";try{let{orderId}=await client.fetch(`/v1/registrar/domains/${name}/transfer${teamParam}`,{body:{authCode,autoRenew:!0,years,expectedPrice,contactInformation:{firstName:"Vercel",lastName:"Whois",email:"domains@registrar.vercel.com",phone:"+14153985463",address1:"100 First Street, Suite 2400",city:"San Fransisco",state:"CA",zip:"94105",country:"US",companyName:"Vercel Inc."}},method:"POST"}),order=await pollForOrder(client,orderId);return order===null?new UnexpectedDomainTransferError(name):order.status==="completed"&&order.domains.find(domain3=>domain3.domainName===name)?.status==="completed"?{ok:!0}:order.error?.code==="payment-failed"?new DomainPaymentError:new UnexpectedDomainTransferError(name)}catch(err){if(isAPIError(err)){if(err.code==="invalid_name")return new InvalidDomain(name);if(err.code==="tld_not_supported")return new UnsupportedTLD(name);if(err.code==="domain_not_available")return new DomainNotAvailable(name)}throw err}}async function getAuthCode(client,code2){return isValidAuthCode(code2)?code2:client.input.text({message:"- Transfer auth code: ",validate:isValidAuthCode})}function isValidAuthCode(code2){return!!(code2&&code2.length>0)}var DomainsTransferInTelemetryClient=class extends TelemetryClient{trackCliOptionCode(code2){code2&&this.trackCliOption({option:"code",value:this.redactedValue})}trackCliArgumentDomain(domainName){domainName&&this.trackCliArgument({arg:"domain",value:this.redactedValue})}};async function transferIn(client,argv){let telemetry2=new DomainsTransferInTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(transferInSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs;telemetry2.trackCliOptionCode(opts["--code"]);let[domainName]=args;if(!domainName)return output_manager_default.error(`Missing domain name. Run ${getCommandName("domains --help")}`),2;if(telemetry2.trackCliArgumentDomain(domainName),!isRootDomain(domainName))return output_manager_default.error(`Invalid domain name ${param(domainName)}. Run ${getCommandName("domains --help")}`),1;let availableStamp=stamp_default(),domainPrice=await getDomainPrice(client,domainName);if(domainPrice instanceof Error)return output_manager_default.prettyError(domainPrice),1;let{transferPrice,years}=domainPrice;if(transferPrice===null)return output_manager_default.error(`The domain ${param(domainName)} is not transferable.`),1;let contextName=await getContextName(client);output_manager_default.log(`The domain ${param(domainName)} is ${import_chalk97.default.underline("available")} to transfer under ${import_chalk97.default.bold(contextName)}! ${availableStamp()}`);let authCode=await getAuthCode(client,opts["--code"]);if(!await client.input.confirm(`Transfer now with 1yr renewal for ${import_chalk97.default.bold(`$${transferPrice}`)}?`,!1))return 0;let transferStamp=stamp_default();output_manager_default.spinner(`Initiating transfer for domain ${domainName}`);let transferInResult=await transferInDomain(client,domainName,authCode,transferPrice,years);return transferInResult instanceof InvalidDomain?(output_manager_default.error(`The domain ${transferInResult.meta.domain} is not valid.`),1):transferInResult instanceof DomainNotAvailable?(output_manager_default.error(`The domain "${transferInResult.meta.domain}" is not transferable.`),1):transferInResult instanceof UnsupportedTLD?(output_manager_default.error(`The TLD for domain name ${transferInResult.meta.domain} is not supported.`),1):transferInResult instanceof DomainPaymentError?(output_manager_default.error("Your card was declined."),1):transferInResult instanceof UnexpectedDomainTransferError?(output_manager_default.error("An unexpected error happened while initiating the transfer."),1):(output_manager_default.success(`Domain ${param(domainName)} transfer started ${transferStamp()}`),output_manager_default.print(` To finalize the transfer, we are waiting for approval from your current registrar.
|
|
@@ -387,7 +397,7 @@ ${import_chalk82.default.dim("Anyone with the URL can trigger a deployment. Stor
|
|
|
387
397
|
`),output_manager_default.print(` Then import it to Vercel DNS by using:
|
|
388
398
|
`),output_manager_default.print(` ${getCommandName(`dns import ${domainName} <zonefile>`)}
|
|
389
399
|
|
|
390
|
-
`),0)}var import_chalk99=__toESM(require_source(),1);var import_chalk98=__toESM(require_source(),1);function formatNSTable(intendedNameservers,currentNameservers,{extraSpace=""}={}){let sortedIntended=intendedNameservers.sort(),sortedCurrent=currentNameservers.sort(),maxLength=Math.max(intendedNameservers.length,currentNameservers.length),rows=[];for(let i=0;i<maxLength;i++)rows.push([sortedIntended[i]||import_chalk98.default.gray("-"),sortedCurrent[i]||import_chalk98.default.gray("-"),sortedIntended[i]===sortedCurrent[i]?import_chalk98.default.green(chars_default.tick):import_chalk98.default.red(chars_default.cross)]);return table([[import_chalk98.default.gray("Intended Nameservers"),import_chalk98.default.gray("Current Nameservers"),""],...rows],{hsep:4}).replace(/^(.*)/gm,`${extraSpace}$1`)}var PROJECT_FETCH_BATCH_SIZE=10;async function getDomainAssignmentsByProject(client,domainName){let domainsByProjectId=new Map;for await(let chunk of client.fetchPaginated(`/v1/domains/${encodeURIComponent(domainName)}/project-domains`))for(let projectDomain of chunk.projectDomains){let domains2=domainsByProjectId.get(projectDomain.projectId)??[];domains2.push(projectDomain.name),domainsByProjectId.set(projectDomain.projectId,domains2)}return domainsByProjectId}async function countProjectsForDomain(client,domainName){try{return(await getDomainAssignmentsByProject(client,domainName)).size}catch(err){if(isAPIError(err)&&err.status<500)return err;throw err}}async function findProjectsForDomain(client,domainName){try{let assignments=Array.from(await getDomainAssignmentsByProject(client,domainName)),result=[];for(let i=0;i<assignments.length;i+=PROJECT_FETCH_BATCH_SIZE){let batch=await Promise.all(assignments.slice(i,i+PROJECT_FETCH_BATCH_SIZE).map(async([projectId,domains2])=>{try{return{project:await client.fetch(`/v9/projects/${encodeURIComponent(projectId)}`),domains:domains2}}catch(err){if(isAPIError(err)&&err.status<500)return null;throw err}}));for(let entry2 of batch)entry2&&result.push(entry2)}return result}catch(err){if(isAPIError(err)&&err.status<500)return err;throw err}}function getDomainRegistrar(domain2){return domain2.boughtAt?"Vercel":typeof domain2.orderedAt=="number"&&!domain2.boughtAt?"Purchase in Process":"Third Party"}var DomainsInspectTelemetryClient=class extends TelemetryClient{trackCliArgumentDomain(name){name&&this.trackCliArgument({arg:"domain",value:this.redactedValue})}trackCliOptionFormat(format3){format3&&this.trackCliOption({option:"format",value:this.redactedValue})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function inspect8(client,argv){let telemetry2=new DomainsInspectTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(
|
|
400
|
+
`),0)}var import_chalk99=__toESM(require_source(),1);var import_chalk98=__toESM(require_source(),1);function formatNSTable(intendedNameservers,currentNameservers,{extraSpace=""}={}){let sortedIntended=intendedNameservers.sort(),sortedCurrent=currentNameservers.sort(),maxLength=Math.max(intendedNameservers.length,currentNameservers.length),rows=[];for(let i=0;i<maxLength;i++)rows.push([sortedIntended[i]||import_chalk98.default.gray("-"),sortedCurrent[i]||import_chalk98.default.gray("-"),sortedIntended[i]===sortedCurrent[i]?import_chalk98.default.green(chars_default.tick):import_chalk98.default.red(chars_default.cross)]);return table([[import_chalk98.default.gray("Intended Nameservers"),import_chalk98.default.gray("Current Nameservers"),""],...rows],{hsep:4}).replace(/^(.*)/gm,`${extraSpace}$1`)}var PROJECT_FETCH_BATCH_SIZE=10;async function getDomainAssignmentsByProject(client,domainName){let domainsByProjectId=new Map;for await(let chunk of client.fetchPaginated(`/v1/domains/${encodeURIComponent(domainName)}/project-domains`))for(let projectDomain of chunk.projectDomains){let domains2=domainsByProjectId.get(projectDomain.projectId)??[];domains2.push(projectDomain.name),domainsByProjectId.set(projectDomain.projectId,domains2)}return domainsByProjectId}async function countProjectsForDomain(client,domainName){try{return(await getDomainAssignmentsByProject(client,domainName)).size}catch(err){if(isAPIError(err)&&err.status<500)return err;throw err}}async function findProjectsForDomain(client,domainName){try{let assignments=Array.from(await getDomainAssignmentsByProject(client,domainName)),result=[];for(let i=0;i<assignments.length;i+=PROJECT_FETCH_BATCH_SIZE){let batch=await Promise.all(assignments.slice(i,i+PROJECT_FETCH_BATCH_SIZE).map(async([projectId,domains2])=>{try{return{project:await client.fetch(`/v9/projects/${encodeURIComponent(projectId)}`),domains:domains2}}catch(err){if(isAPIError(err)&&err.status<500)return null;throw err}}));for(let entry2 of batch)entry2&&result.push(entry2)}return result}catch(err){if(isAPIError(err)&&err.status<500)return err;throw err}}function getDomainRegistrar(domain2){return domain2.boughtAt?"Vercel":typeof domain2.orderedAt=="number"&&!domain2.boughtAt?"Purchase in Process":"Third Party"}var DomainsInspectTelemetryClient=class extends TelemetryClient{trackCliArgumentDomain(name){name&&this.trackCliArgument({arg:"domain",value:this.redactedValue})}trackCliOptionFormat(format3){format3&&this.trackCliOption({option:"format",value:this.redactedValue})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function inspect8(client,argv){let telemetry2=new DomainsInspectTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(inspectSubcommand4.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error,client),2}let{args,flags}=parsedArgs,[domainName]=args;telemetry2.trackCliOptionFormat(flags["--format"]),telemetry2.trackCliFlagJson(flags["--json"]);let formatResult=validateJsonOutput(flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput,inspectStamp=stamp_default();if(!domainName)return output_manager_default.error(`${getCommandName("domains inspect <domain>")} expects one argument`),2;if(telemetry2.trackCliArgumentDomain(domainName),args.length!==1)return output_manager_default.error(`Invalid number of arguments. Usage: ${import_chalk99.default.cyan(`${getCommandName("domains inspect <domain>")}`)}`),2;output_manager_default.debug("Fetching domain info");let contextName=await getContextName(client);output_manager_default.spinner(`Fetching Domain ${domainName} under ${import_chalk99.default.bold(contextName)}`);let information=await fetchInformation({client,contextName,domainName});if(typeof information=="number")return information;let{domain:domain2,projects:projects2,renewalPrice,domainConfig}=information;if(asJson)return output_manager_default.stopSpinner(),client.stdout.write(`${JSON.stringify({domain:{name:domain2.name,registrar:getDomainRegistrar(domain2),expiresAt:domain2.expiresAt,creator:domain2.creator.username,createdAt:domain2.createdAt,edgeNetwork:!0,renewalPrice:domain2.boughtAt&&renewalPrice?renewalPrice:null},nameservers:{intended:domain2.intendedNameservers,current:domain2.nameservers},projects:projects2.map(({project,domains:domains2})=>({name:project.name,domains:domains2})),configuration:{misconfigured:domainConfig.misconfigured??null}},null,2)}
|
|
391
401
|
`),0;if(output_manager_default.log(`Domain ${domainName} found under ${import_chalk99.default.bold(contextName)} ${import_chalk99.default.gray(inspectStamp())}`),output_manager_default.print(`
|
|
392
402
|
`),output_manager_default.print(import_chalk99.default.bold(` General
|
|
393
403
|
|
|
@@ -410,18 +420,20 @@ ${import_chalk82.default.dim("Anyone with the URL can trigger a deployment. Stor
|
|
|
410
420
|
`)}if(domainConfig.misconfigured){let contextNameConst=contextName,projectNames=Array.from(new Set(projects2.map(({project})=>project.name))),recordsSource=projectNames.length?"Check the project's Domains settings for the required DNS records":"Assign it to a project to see the required DNS records";output_manager_default.warn(`This domain is not configured properly. ${recordsSource}, or run ${getCommandName("domains verify --help")} for CLI verification options.`,null,null,null),projectNames.length?projectNames.forEach((name,index)=>{let prefix=index===0?" Read more:":" ".repeat(12);output_manager_default.print(`${prefix} https://vercel.com/${contextNameConst}/${name}/settings/domains
|
|
411
421
|
`)}):output_manager_default.print(` Read more: https://vercel.link/domain-configuration
|
|
412
422
|
`),output_manager_default.print(`
|
|
413
|
-
`)}return null}async function fetchInformation({client,contextName,domainName}){let[domain2,renewalPrice]=await Promise.all([getDomainByName(client,contextName,domainName,{ignoreWait:!0}),getDomainPrice(client,domainName).then(res=>res instanceof Error?null:res.renewalPrice).catch(()=>null)]);if(domain2 instanceof DomainNotFound)return output_manager_default.prettyError(domain2),1;if(domain2 instanceof DomainPermissionDenied)return output_manager_default.prettyError(domain2),output_manager_default.log(`Run ${getCommandName("domains ls")} to see your domains.`),1;let projects2=await findProjectsForDomain(client,domainName);if(projects2 instanceof Error)return output_manager_default.prettyError(projects2),1;let domainConfig=await getDomainConfig(client,domainName);return{domain:domain2,projects:projects2,renewalPrice,domainConfig}}var import_ms15=__toESM(require_ms(),1),import_chalk100=__toESM(require_source(),1),import_pluralize8=__toESM(require_pluralize(),1);var DomainsLsTelemetryClient=class extends TelemetryClient{trackCliOptionLimit(limit){limit&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliOptionNext(next){next&&this.trackCliOption({option:"next",value:this.redactedValue})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function ls7(client,argv){let telemetry2=new DomainsLsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(
|
|
423
|
+
`)}return null}async function fetchInformation({client,contextName,domainName}){let[domain2,renewalPrice]=await Promise.all([getDomainByName(client,contextName,domainName,{ignoreWait:!0}),getDomainPrice(client,domainName).then(res=>res instanceof Error?null:res.renewalPrice).catch(()=>null)]);if(domain2 instanceof DomainNotFound)return output_manager_default.prettyError(domain2),1;if(domain2 instanceof DomainPermissionDenied)return output_manager_default.prettyError(domain2),output_manager_default.log(`Run ${getCommandName("domains ls")} to see your domains.`),1;let projects2=await findProjectsForDomain(client,domainName);if(projects2 instanceof Error)return output_manager_default.prettyError(projects2),1;let domainConfig=await getDomainConfig(client,domainName);return{domain:domain2,projects:projects2,renewalPrice,domainConfig}}var import_ms15=__toESM(require_ms(),1),import_chalk100=__toESM(require_source(),1),import_pluralize8=__toESM(require_pluralize(),1);var DomainsLsTelemetryClient=class extends TelemetryClient{trackCliOptionLimit(limit){limit&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliOptionNext(next){next&&this.trackCliOption({option:"next",value:this.redactedValue})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function ls7(client,argv){let telemetry2=new DomainsLsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(listSubcommand5.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs,validationResult=validateLsArgs({commandName:"domains ls",args,maxArgs:0,exitCode:2});if(validationResult!==0)return validationResult;telemetry2.trackCliOptionLimit(opts["--limit"]),telemetry2.trackCliOptionNext(opts["--next"]),telemetry2.trackCliOptionFormat(opts["--format"]);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput,paginationOptions;try{paginationOptions=getPaginationOpts(opts)}catch(err){return output_manager_default.prettyError(err),1}let contextName=await getContextName(client,{resolveLocalScope:!0}),lsStamp=stamp_default();output_manager_default.spinner(`Fetching Domains under ${import_chalk100.default.bold(contextName)}`);let{domains:domains2,pagination}=await getDomains(client,...paginationOptions);if(asJson){output_manager_default.stopSpinner();let jsonOutput={domains:domains2.map(domain2=>({name:domain2.name,registrar:getDomainRegistrar(domain2),nameservers:isDomainExternal(domain2)?"external":"vercel",expiresAt:domain2.expiresAt,createdAt:domain2.createdAt,creator:domain2.creator.username})),pagination};client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
|
|
414
424
|
`)}else if(output_manager_default.log(`${(0,import_pluralize8.default)("Domain",domains2.length,!0)} found under ${import_chalk100.default.bold(contextName)} ${import_chalk100.default.gray(lsStamp())}`),domains2.length>0&&(output_manager_default.print(formatDomainsTable(domains2).replace(/^(.*)/gm,`${" ".repeat(1)}$1`)),output_manager_default.print(`
|
|
415
425
|
|
|
416
|
-
`)),pagination?.next){let flags=getCommandFlags(opts,["_","--next","--format"]);output_manager_default.log(`To display the next page, run ${getCommandName(`domains ls${flags} --next ${pagination.next}`)}`)}return 0}function formatDomainsTable(domains2){let current=Date.now(),rows=domains2.map(domain2=>{let expiration=formatDateWithoutTime(domain2.expiresAt),age=domain2.createdAt?(0,import_ms15.default)(current-domain2.createdAt):"-";return[domain2.name,getDomainRegistrar(domain2),isDomainExternal(domain2)?"Third Party":"Vercel",expiration,domain2.creator.username,import_chalk100.default.gray(age)]});return formatTable(["Domain","Registrar","Nameservers","Expiration Date","Creator","Age"],["l","l","l","l","l","l"],[{rows}])}var import_chalk101=__toESM(require_source(),1),import_pluralize9=__toESM(require_pluralize(),1);async function removeDomainByName(now,contextName,domain2){try{return await now.fetch(`/v3/domains/${encodeURIComponent(domain2)}`,{method:"DELETE"})}catch(err){if(isAPIError(err)){if(err.code==="not_found")return new DomainNotFound(domain2);if(err.code==="forbidden")return new DomainPermissionDenied(domain2,contextName);if(err.code==="domain_removal_conflict")return new DomainRemovalConflict({aliases:err.aliases,certs:err.certs,message:err.message,pendingAsyncPurchase:err.pendingAsyncPurchase,resolvable:err.resolvable,suffix:err.suffix,transferring:err.transferring})}throw err}}async function setCustomSuffix(client,contextName,domain2,suffix){try{return await client.fetch("/v1/custom-suffix",{method:"PATCH",body:{suffix}})}catch(err){if(isAPIError(err)){if(err.code==="forbidden")return new DomainPermissionDenied(domain2,contextName);if(err.code==="domain_external")return new DomainExternal(domain2);if(err.code==="domain_invalid")return new InvalidDomain(domain2);if(err.code==="domain_not_found")return new DomainNotFound(domain2);if(err.code==="domain_not_verified")return new DomainNotVerified(domain2);if(err.code==="domain_permission_denied")return new DomainPermissionDenied(domain2,contextName)}throw err}}var DomainsRmTelemetryClient=class extends TelemetryClient{trackCliArgumentDomain(v){v&&this.trackCliArgument({arg:"domain",value:this.redactedValue})}trackCliFlagYes(v){v&&this.trackCliFlag("yes")}};async function rm6(client,argv){let telemetry2=new DomainsRmTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(removeSubcommand7.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs,[domainName]=args;if(telemetry2.trackCliArgumentDomain(domainName),telemetry2.trackCliFlagYes(opts["--yes"]),!domainName)return output_manager_default.error(`${getCommandName("domains rm <domain>")} expects one argument`),2;let contextName=await getContextName(client);if(args.length!==1)return output_manager_default.error(`Invalid number of arguments. Usage: ${import_chalk101.default.cyan(`${getCommandName("domains rm <domain>")}`)}`),2;let domain2=await getDomainByName(client,contextName,domainName);if(domain2 instanceof DomainNotFound||domain2.name!==domainName)return output_manager_default.error(`Domain not found by "${domainName}" under ${import_chalk101.default.bold(contextName)}`),output_manager_default.log(`Run ${getCommandName("domains ls")} to see your domains.`),1;if(domain2 instanceof DomainPermissionDenied)return output_manager_default.error(`You don't have access to the domain ${domainName} under ${import_chalk101.default.bold(contextName)}`),output_manager_default.log(`Run ${getCommandName("domains ls")} to see your domains.`),1;let projectCount=await countProjectsForDomain(client,domain2.name);typeof projectCount=="number"&&projectCount>0&&output_manager_default.warn(`The domain is currently used by ${(0,import_pluralize9.default)("project",projectCount,!0)}.`);let skipConfirmation=opts["--yes"]||!1;return!skipConfirmation&&!await client.input.confirm(`Are you sure you want to remove ${param(domainName)}?`,!1)?(output_manager_default.log("Canceled"),0):removeDomain(client,contextName,skipConfirmation,domain2)}async function removeDomain(client,contextName,skipConfirmation,domain2,aliasIds=[],certIds=[],suffix=!1,attempt=1){let removeStamp=stamp_default();output_manager_default.debug("Removing domain");for(let id2 of aliasIds){output_manager_default.debug(`Removing alias ${id2}`);try{await removeAliasById(client,id2)}catch(err){if(!isAPIError(err)||err.status!==404)throw err}}for(let id2 of certIds){output_manager_default.debug(`Removing cert ${id2}`);try{await deleteCertById(client,id2)}catch(err){if(!isAPIError(err)||err.status!==404)throw err}}suffix&&(output_manager_default.debug("Removing custom suffix"),await setCustomSuffix(client,contextName,domain2.name,null));let removeResult=await removeDomainByName(client,contextName,domain2.name);if(removeResult instanceof DomainNotFound)return output_manager_default.error(`Domain not found under ${import_chalk101.default.bold(contextName)}`),output_manager_default.log(`Run ${getCommandName("domains ls")} to see your domains.`),1;if(removeResult instanceof DomainPermissionDenied)return output_manager_default.error(`You don't have permissions over domain ${import_chalk101.default.underline(removeResult.meta.domain)} under ${import_chalk101.default.bold(removeResult.meta.context)}.`),1;if(removeResult instanceof DomainRemovalConflict){if(attempt>=2)return output_manager_default.error(removeResult.message),1;let{aliases:aliases2,certs,suffix:suffix2,transferring,pendingAsyncPurchase,resolvable}=removeResult.meta;return transferring?(output_manager_default.error(`${param(domain2.name)} transfer should be declined or approved before removing.`),1):pendingAsyncPurchase?(output_manager_default.error(`Cannot remove ${param(domain2.name)} because it is still in the process of being purchased.`),1):resolvable?(output_manager_default.log(`We found conflicts when attempting to remove ${param(domain2.name)}.`),aliases2.length>0&&output_manager_default.warn(`This domain's ${import_chalk101.default.bold((0,import_pluralize9.default)("alias",aliases2.length,!0))} will be removed. Run ${getCommandName("alias ls")} to list them.`),certs.length>0&&output_manager_default.warn(`This domain's ${import_chalk101.default.bold((0,import_pluralize9.default)("certificate",certs.length,!0))} will be removed. Run ${getCommandName("cert ls")} to list them.`),suffix2&&output_manager_default.warn(`The ${import_chalk101.default.bold("custom suffix")} associated with this domain.`),!skipConfirmation&&!await client.input.confirm("Remove conflicts associated with domain?",!1)?(output_manager_default.log("Canceled"),0):removeDomain(client,contextName,skipConfirmation,domain2,aliases2,certs,suffix2,attempt+1)):(output_manager_default.error(removeResult.message),1)}return output_manager_default.success(`Domain ${import_chalk101.default.bold(domain2.name)} removed ${removeStamp()}`),0}var import_chalk102=__toESM(require_source(),1),import_pluralize10=__toESM(require_pluralize(),1);async function moveOutDomain(client,contextName,name,destination){try{return await client.fetch(`/v4/domains/${encodeURIComponent(name)}`,{body:{op:"move-out",destination},method:"PATCH"})}catch(err){if(isAPIError(err)){if(err.code==="forbidden")return new DomainPermissionDenied(name,contextName);if(err.code==="not_found")return new DomainNotFound(name);if(err.code==="invalid_move_destination")return new InvalidMoveDestination(destination);if(err.code==="domain_move_conflict"){let{pendingAsyncPurchase,resolvable,suffix,message}=err;return new DomainMoveConflict({message,pendingAsyncPurchase,resolvable,suffix})}}throw err}}async function getDomainAliases(client,domain2){let{aliases:aliases2}=await getAliases(client);return aliases2.filter(alias2=>alias2.alias.endsWith(domain2))}var DomainsMoveTelemetryClient=class extends TelemetryClient{trackCliFlagYes(yes){yes&&this.trackCliFlag("yes")}trackCliArgumentDomain(domainName){domainName&&this.trackCliArgument({arg:"domain",value:this.redactedValue})}trackCliArgumentDestination(destination){destination&&this.trackCliArgument({arg:"destination",value:this.redactedValue})}};async function move(client,argv){let telemetry2=new DomainsMoveTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(moveSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs;telemetry2.trackCliFlagYes(opts["--yes"]),telemetry2.trackCliArgumentDomain(args[0]),telemetry2.trackCliArgumentDestination(args[1]);let{contextName,user}=await getScope(client),{domainName,destination}=await getArgs(client,args);if(!isRootDomain(domainName))return output_manager_default.error(`Invalid domain name "${domainName}". Run ${getCommandName("domains --help")}`),1;let domain2=await getDomainByName(client,contextName,domainName);if(domain2 instanceof DomainNotFound)return output_manager_default.error(`Domain not found under ${import_chalk102.default.bold(contextName)}`),output_manager_default.log(`Run ${getCommandName("domains ls")} to see your domains.`),1;if(domain2 instanceof DomainPermissionDenied)return output_manager_default.error(`You don't have permissions over domain ${import_chalk102.default.underline(domain2.meta.domain)} under ${import_chalk102.default.bold(domain2.meta.context)}.`),1;let teams2=await getTeams(client),matchId=await findDestinationMatch(destination,user,teams2);if(matchId&&user&&matchId===user.id&&user.version==="northstar")return output_manager_default.error("You may not move your domain to your user account."),1;if(!matchId&&!opts["--yes"]&&(output_manager_default.warn(`You're not a member of ${param(destination)}. ${param(destination)} will have 24 hours to accept your move request before it expires.`),!await client.input.confirm(`Are you sure you want to move ${param(domainName)} to ${param(destination)}?`,!1)))return output_manager_default.log("Canceled"),0;if(!opts["--yes"]){let aliases2=await getDomainAliases(client,domainName);if(aliases2.length>0&&(output_manager_default.warn(`This domain's ${import_chalk102.default.bold((0,import_pluralize10.default)("alias",aliases2.length,!0))} will be removed. Run ${getCommandName("alias ls")} to list them.`),!await client.input.confirm(`Are you sure you want to move ${param(domainName)}?`,!1)))return output_manager_default.log("Canceled"),0}let context=contextName;output_manager_default.spinner("Moving");let moveTokenResult=await moveOutDomain(client,context,domainName,matchId||destination);if(moveTokenResult instanceof DomainMoveConflict){let{suffix,pendingAsyncPurchase}=moveTokenResult.meta;return suffix?(output_manager_default.error(`Please remove custom suffix for ${param(domainName)} before moving out`),1):pendingAsyncPurchase?(output_manager_default.error(`Cannot remove ${param(domain2.name)} because it is still in the process of being purchased.`),1):(output_manager_default.error(moveTokenResult.message),1)}if(moveTokenResult instanceof DomainNotFound)return output_manager_default.error(`Domain not found under ${import_chalk102.default.bold(contextName)}`),output_manager_default.log(`Run ${getCommandName("domains ls")} to see your domains.`),1;if(moveTokenResult instanceof DomainPermissionDenied)return output_manager_default.error(`You don't have permissions over domain ${import_chalk102.default.underline(moveTokenResult.meta.domain)} under ${import_chalk102.default.bold(moveTokenResult.meta.context)}.`),1;if(moveTokenResult instanceof InvalidMoveDestination)return output_manager_default.error(`Destination ${import_chalk102.default.bold(destination)} is invalid. Please supply a valid username, email, team slug, user id, or team id.`),1;let{moved}=moveTokenResult;return moved?output_manager_default.success(`${param(domainName)} was moved to ${param(destination)}.`):output_manager_default.success(`Sent ${param(destination)} an email to approve the ${param(domainName)} move request.`),0}async function getArgs(client,args){let[domainName,destination]=args;return domainName||(domainName=await client.input.text({message:"- Domain name: ",validate:isRootDomain})),destination||(destination=await client.input.text({message:"- Destination: ",validate:v=>!!(v&&v.length>0)})),{domainName,destination}}async function findDestinationMatch(destination,user,teams2){if(user&&(user.id===destination||user.username===destination))return user.id;for(let team of teams2)if(team.id===destination||team.slug===destination)return team.id;return null}var import_chalk103=__toESM(require_source(),1);async function price(client,argv){let parsedArgs,flagsSpecification=getFlagsSpecification(priceSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let domains2=parsedArgs.args,hasMultipleInputDomains=domains2.length>1,formatResult=validateJsonOutput(parsedArgs.flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;if(domains2.length===0)return output_manager_default.error("Missing domain name. Usage: `vercel domains price <domain>`"),2;try{let quotes=domains2.length===1?await getSingleDomainQuote(client,domains2[0]):await getBulkDomainQuotes(client,domains2);if(formatResult.jsonOutput)return!hasMultipleInputDomains&"es.length===1?client.stdout.write(`${JSON.stringify(quotes[0],null,2)}
|
|
426
|
+
`)),pagination?.next){let flags=getCommandFlags(opts,["_","--next","--format"]);output_manager_default.log(`To display the next page, run ${getCommandName(`domains ls${flags} --next ${pagination.next}`)}`)}return 0}function formatDomainsTable(domains2){let current=Date.now(),rows=domains2.map(domain2=>{let expiration=formatDateWithoutTime(domain2.expiresAt),age=domain2.createdAt?(0,import_ms15.default)(current-domain2.createdAt):"-";return[domain2.name,getDomainRegistrar(domain2),isDomainExternal(domain2)?"Third Party":"Vercel",expiration,domain2.creator.username,import_chalk100.default.gray(age)]});return formatTable(["Domain","Registrar","Nameservers","Expiration Date","Creator","Age"],["l","l","l","l","l","l"],[{rows}])}var import_chalk101=__toESM(require_source(),1),import_pluralize9=__toESM(require_pluralize(),1);async function removeDomainByName(now,contextName,domain2){try{return await now.fetch(`/v3/domains/${encodeURIComponent(domain2)}`,{method:"DELETE"})}catch(err){if(isAPIError(err)){if(err.code==="not_found")return new DomainNotFound(domain2);if(err.code==="forbidden")return new DomainPermissionDenied(domain2,contextName);if(err.code==="domain_removal_conflict")return new DomainRemovalConflict({aliases:err.aliases,certs:err.certs,message:err.message,pendingAsyncPurchase:err.pendingAsyncPurchase,resolvable:err.resolvable,suffix:err.suffix,transferring:err.transferring})}throw err}}async function setCustomSuffix(client,contextName,domain2,suffix){try{return await client.fetch("/v1/custom-suffix",{method:"PATCH",body:{suffix}})}catch(err){if(isAPIError(err)){if(err.code==="forbidden")return new DomainPermissionDenied(domain2,contextName);if(err.code==="domain_external")return new DomainExternal(domain2);if(err.code==="domain_invalid")return new InvalidDomain(domain2);if(err.code==="domain_not_found")return new DomainNotFound(domain2);if(err.code==="domain_not_verified")return new DomainNotVerified(domain2);if(err.code==="domain_permission_denied")return new DomainPermissionDenied(domain2,contextName)}throw err}}var DomainsRmTelemetryClient=class extends TelemetryClient{trackCliArgumentDomain(v){v&&this.trackCliArgument({arg:"domain",value:this.redactedValue})}trackCliFlagYes(v){v&&this.trackCliFlag("yes")}};async function rm6(client,argv){let telemetry2=new DomainsRmTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(removeSubcommand3.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs,[domainName]=args;if(telemetry2.trackCliArgumentDomain(domainName),telemetry2.trackCliFlagYes(opts["--yes"]),!domainName)return output_manager_default.error(`${getCommandName("domains rm <domain>")} expects one argument`),2;let contextName=await getContextName(client);if(args.length!==1)return output_manager_default.error(`Invalid number of arguments. Usage: ${import_chalk101.default.cyan(`${getCommandName("domains rm <domain>")}`)}`),2;let domain2=await getDomainByName(client,contextName,domainName);if(domain2 instanceof DomainNotFound||domain2.name!==domainName)return output_manager_default.error(`Domain not found by "${domainName}" under ${import_chalk101.default.bold(contextName)}`),output_manager_default.log(`Run ${getCommandName("domains ls")} to see your domains.`),1;if(domain2 instanceof DomainPermissionDenied)return output_manager_default.error(`You don't have access to the domain ${domainName} under ${import_chalk101.default.bold(contextName)}`),output_manager_default.log(`Run ${getCommandName("domains ls")} to see your domains.`),1;let projectCount=await countProjectsForDomain(client,domain2.name);typeof projectCount=="number"&&projectCount>0&&output_manager_default.warn(`The domain is currently used by ${(0,import_pluralize9.default)("project",projectCount,!0)}.`);let skipConfirmation=opts["--yes"]||!1;return!skipConfirmation&&!await client.input.confirm(`Are you sure you want to remove ${param(domainName)}?`,!1)?(output_manager_default.log("Canceled"),0):removeDomain(client,contextName,skipConfirmation,domain2)}async function removeDomain(client,contextName,skipConfirmation,domain2,aliasIds=[],certIds=[],suffix=!1,attempt=1){let removeStamp=stamp_default();output_manager_default.debug("Removing domain");for(let id2 of aliasIds){output_manager_default.debug(`Removing alias ${id2}`);try{await removeAliasById(client,id2)}catch(err){if(!isAPIError(err)||err.status!==404)throw err}}for(let id2 of certIds){output_manager_default.debug(`Removing cert ${id2}`);try{await deleteCertById(client,id2)}catch(err){if(!isAPIError(err)||err.status!==404)throw err}}suffix&&(output_manager_default.debug("Removing custom suffix"),await setCustomSuffix(client,contextName,domain2.name,null));let removeResult=await removeDomainByName(client,contextName,domain2.name);if(removeResult instanceof DomainNotFound)return output_manager_default.error(`Domain not found under ${import_chalk101.default.bold(contextName)}`),output_manager_default.log(`Run ${getCommandName("domains ls")} to see your domains.`),1;if(removeResult instanceof DomainPermissionDenied)return output_manager_default.error(`You don't have permissions over domain ${import_chalk101.default.underline(removeResult.meta.domain)} under ${import_chalk101.default.bold(removeResult.meta.context)}.`),1;if(removeResult instanceof DomainRemovalConflict){if(attempt>=2)return output_manager_default.error(removeResult.message),1;let{aliases:aliases2,certs,suffix:suffix2,transferring,pendingAsyncPurchase,resolvable}=removeResult.meta;return transferring?(output_manager_default.error(`${param(domain2.name)} transfer should be declined or approved before removing.`),1):pendingAsyncPurchase?(output_manager_default.error(`Cannot remove ${param(domain2.name)} because it is still in the process of being purchased.`),1):resolvable?(output_manager_default.log(`We found conflicts when attempting to remove ${param(domain2.name)}.`),aliases2.length>0&&output_manager_default.warn(`This domain's ${import_chalk101.default.bold((0,import_pluralize9.default)("alias",aliases2.length,!0))} will be removed. Run ${getCommandName("alias ls")} to list them.`),certs.length>0&&output_manager_default.warn(`This domain's ${import_chalk101.default.bold((0,import_pluralize9.default)("certificate",certs.length,!0))} will be removed. Run ${getCommandName("cert ls")} to list them.`),suffix2&&output_manager_default.warn(`The ${import_chalk101.default.bold("custom suffix")} associated with this domain.`),!skipConfirmation&&!await client.input.confirm("Remove conflicts associated with domain?",!1)?(output_manager_default.log("Canceled"),0):removeDomain(client,contextName,skipConfirmation,domain2,aliases2,certs,suffix2,attempt+1)):(output_manager_default.error(removeResult.message),1)}return output_manager_default.success(`Domain ${import_chalk101.default.bold(domain2.name)} removed ${removeStamp()}`),0}var import_chalk102=__toESM(require_source(),1),import_pluralize10=__toESM(require_pluralize(),1);async function moveOutDomain(client,contextName,name,destination){try{return await client.fetch(`/v4/domains/${encodeURIComponent(name)}`,{body:{op:"move-out",destination},method:"PATCH"})}catch(err){if(isAPIError(err)){if(err.code==="forbidden")return new DomainPermissionDenied(name,contextName);if(err.code==="not_found")return new DomainNotFound(name);if(err.code==="invalid_move_destination")return new InvalidMoveDestination(destination);if(err.code==="domain_move_conflict"){let{pendingAsyncPurchase,resolvable,suffix,message}=err;return new DomainMoveConflict({message,pendingAsyncPurchase,resolvable,suffix})}}throw err}}async function getDomainAliases(client,domain2){let{aliases:aliases2}=await getAliases(client);return aliases2.filter(alias2=>alias2.alias.endsWith(domain2))}var DomainsMoveTelemetryClient=class extends TelemetryClient{trackCliFlagYes(yes){yes&&this.trackCliFlag("yes")}trackCliArgumentDomain(domainName){domainName&&this.trackCliArgument({arg:"domain",value:this.redactedValue})}trackCliArgumentDestination(destination){destination&&this.trackCliArgument({arg:"destination",value:this.redactedValue})}};async function move(client,argv){let telemetry2=new DomainsMoveTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(moveSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs;telemetry2.trackCliFlagYes(opts["--yes"]),telemetry2.trackCliArgumentDomain(args[0]),telemetry2.trackCliArgumentDestination(args[1]);let{contextName,user}=await getScope(client),{domainName,destination}=await getArgs(client,args);if(!isRootDomain(domainName))return output_manager_default.error(`Invalid domain name "${domainName}". Run ${getCommandName("domains --help")}`),1;let domain2=await getDomainByName(client,contextName,domainName);if(domain2 instanceof DomainNotFound)return output_manager_default.error(`Domain not found under ${import_chalk102.default.bold(contextName)}`),output_manager_default.log(`Run ${getCommandName("domains ls")} to see your domains.`),1;if(domain2 instanceof DomainPermissionDenied)return output_manager_default.error(`You don't have permissions over domain ${import_chalk102.default.underline(domain2.meta.domain)} under ${import_chalk102.default.bold(domain2.meta.context)}.`),1;let teams2=await getTeams(client),matchId=await findDestinationMatch(destination,user,teams2);if(matchId&&user&&matchId===user.id&&user.version==="northstar")return output_manager_default.error("You may not move your domain to your user account."),1;if(!matchId&&!opts["--yes"]&&(output_manager_default.warn(`You're not a member of ${param(destination)}. ${param(destination)} will have 24 hours to accept your move request before it expires.`),!await client.input.confirm(`Are you sure you want to move ${param(domainName)} to ${param(destination)}?`,!1)))return output_manager_default.log("Canceled"),0;if(!opts["--yes"]){let aliases2=await getDomainAliases(client,domainName);if(aliases2.length>0&&(output_manager_default.warn(`This domain's ${import_chalk102.default.bold((0,import_pluralize10.default)("alias",aliases2.length,!0))} will be removed. Run ${getCommandName("alias ls")} to list them.`),!await client.input.confirm(`Are you sure you want to move ${param(domainName)}?`,!1)))return output_manager_default.log("Canceled"),0}let context=contextName;output_manager_default.spinner("Moving");let moveTokenResult=await moveOutDomain(client,context,domainName,matchId||destination);if(moveTokenResult instanceof DomainMoveConflict){let{suffix,pendingAsyncPurchase}=moveTokenResult.meta;return suffix?(output_manager_default.error(`Please remove custom suffix for ${param(domainName)} before moving out`),1):pendingAsyncPurchase?(output_manager_default.error(`Cannot remove ${param(domain2.name)} because it is still in the process of being purchased.`),1):(output_manager_default.error(moveTokenResult.message),1)}if(moveTokenResult instanceof DomainNotFound)return output_manager_default.error(`Domain not found under ${import_chalk102.default.bold(contextName)}`),output_manager_default.log(`Run ${getCommandName("domains ls")} to see your domains.`),1;if(moveTokenResult instanceof DomainPermissionDenied)return output_manager_default.error(`You don't have permissions over domain ${import_chalk102.default.underline(moveTokenResult.meta.domain)} under ${import_chalk102.default.bold(moveTokenResult.meta.context)}.`),1;if(moveTokenResult instanceof InvalidMoveDestination)return output_manager_default.error(`Destination ${import_chalk102.default.bold(destination)} is invalid. Please supply a valid username, email, team slug, user id, or team id.`),1;let{moved}=moveTokenResult;return moved?output_manager_default.success(`${param(domainName)} was moved to ${param(destination)}.`):output_manager_default.success(`Sent ${param(destination)} an email to approve the ${param(domainName)} move request.`),0}async function getArgs(client,args){let[domainName,destination]=args;return domainName||(domainName=await client.input.text({message:"- Domain name: ",validate:isRootDomain})),destination||(destination=await client.input.text({message:"- Destination: ",validate:v=>!!(v&&v.length>0)})),{domainName,destination}}async function findDestinationMatch(destination,user,teams2){if(user&&(user.id===destination||user.username===destination))return user.id;for(let team of teams2)if(team.id===destination||team.slug===destination)return team.id;return null}var import_chalk103=__toESM(require_source(),1);async function price(client,argv){let parsedArgs,flagsSpecification=getFlagsSpecification(priceSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let domains2=parsedArgs.args,hasMultipleInputDomains=domains2.length>1,formatResult=validateJsonOutput(parsedArgs.flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;if(domains2.length===0)return output_manager_default.error("Missing domain name. Usage: `vercel domains price <domain>`"),2;try{let quotes=domains2.length===1?await getSingleDomainQuote(client,domains2[0]):await getBulkDomainQuotes(client,domains2);if(formatResult.jsonOutput)return!hasMultipleInputDomains&"es.length===1?client.stdout.write(`${JSON.stringify(quotes[0],null,2)}
|
|
417
427
|
`):client.stdout.write(`${JSON.stringify({results:quotes},null,2)}
|
|
418
428
|
`),0;for(let i=0;i<quotes.length;i++){let quote=quotes[i];output_manager_default.log(`${import_chalk103.default.bold("Registrar pricing")} for ${import_chalk103.default.cyan(quote.domain)}`),output_manager_default.log(` Purchase: ${quote.purchasePrice!=null?`$${quote.purchasePrice}`:"n/a"}`),output_manager_default.log(` Renewal: ${quote.renewalPrice!=null?`$${quote.renewalPrice}`:"n/a"}`),output_manager_default.log(` Transfer: ${quote.transferPrice!=null?`$${quote.transferPrice}`:"n/a"}`),output_manager_default.log(` Term: ${quote.years} year(s)`),i<quotes.length-1&&output_manager_default.log("")}return 0}catch(error){if(isAPIError(error)){let msg=error.serverMessage||`API error (${error.status})`;return formatResult.jsonOutput?client.stdout.write(`${JSON.stringify({error:error.code||"api_error",message:msg},null,2)}
|
|
419
|
-
`):output_manager_default.error(msg),1}return printError(error),1}}async function getSingleDomainQuote(client,domain2){let result=await getDomainPrice(client,domain2);if(result instanceof UnsupportedTLD)throw createApiLikeError("unsupported_tld",`TLD not supported for price lookup: ${result.meta.domain}`);if(result instanceof InvalidDomain)throw createApiLikeError("invalid_domain",`Invalid domain: ${result.meta.domain}`);if(isAPIError(result))throw result;return[{domain:domain2,purchasePrice:result.purchasePrice,renewalPrice:result.renewalPrice,transferPrice:result.transferPrice,years:result.years}]}async function getBulkDomainQuotes(client,domains2){let response=await client.fetch("/v1/registrar/domains/price",{method:"POST",body:{domains:domains2}});return Array.isArray(response)?response:response.results}function createApiLikeError(code2,serverMessage){let error=new Error(serverMessage);return error.code=code2,error.status=400,error.serverMessage=serverMessage,error}import{URLSearchParams as URLSearchParams3}from"url";import{z as z2}from"zod";var DEFAULT_LIMIT2=20,MAX_LIMIT3=200,DEFAULT_ORDER="relevance",ORDERS=["relevance","alphabetical","length"],SUPPORTED_TLDS_CACHE_FILE="cache/domains-search-supported-tlds.json",SUPPORTED_TLDS_CACHE_TTL_MS=30*60*1e3,supportedTldsSchema=z2.array(z2.string()),supportedTldsCacheSchema=z2.object({entries:z2.record(z2.string(),z2.object({fetchedAt:z2.number(),tlds:supportedTldsSchema}))}),domainSearchResultSchema=z2.discriminatedUnion("available",[z2.object({domain:z2.string(),available:z2.literal(!1)}),z2.object({domain:z2.string(),available:z2.literal(!0),years:z2.number(),price:z2.number(),renewalPrice:z2.number(),premium:z2.boolean()})]),domainsSearchResponseSchema=z2.object({results:z2.array(domainSearchResultSchema)});async function search(client,argv){let parsedArgs,flagsSpecification=getFlagsSpecification(
|
|
429
|
+
`):output_manager_default.error(msg),1}return printError(error),1}}async function getSingleDomainQuote(client,domain2){let result=await getDomainPrice(client,domain2);if(result instanceof UnsupportedTLD)throw createApiLikeError("unsupported_tld",`TLD not supported for price lookup: ${result.meta.domain}`);if(result instanceof InvalidDomain)throw createApiLikeError("invalid_domain",`Invalid domain: ${result.meta.domain}`);if(isAPIError(result))throw result;return[{domain:domain2,purchasePrice:result.purchasePrice,renewalPrice:result.renewalPrice,transferPrice:result.transferPrice,years:result.years}]}async function getBulkDomainQuotes(client,domains2){let response=await client.fetch("/v1/registrar/domains/price",{method:"POST",body:{domains:domains2}});return Array.isArray(response)?response:response.results}function createApiLikeError(code2,serverMessage){let error=new Error(serverMessage);return error.code=code2,error.status=400,error.serverMessage=serverMessage,error}import{URLSearchParams as URLSearchParams3}from"url";import{z as z2}from"zod";var DEFAULT_LIMIT2=20,MAX_LIMIT3=200,DEFAULT_ORDER="relevance",ORDERS=["relevance","alphabetical","length"],SUPPORTED_TLDS_CACHE_FILE="cache/domains-search-supported-tlds.json",SUPPORTED_TLDS_CACHE_TTL_MS=30*60*1e3,supportedTldsSchema=z2.array(z2.string()),supportedTldsCacheSchema=z2.object({entries:z2.record(z2.string(),z2.object({fetchedAt:z2.number(),tlds:supportedTldsSchema}))}),domainSearchResultSchema=z2.discriminatedUnion("available",[z2.object({domain:z2.string(),available:z2.literal(!1)}),z2.object({domain:z2.string(),available:z2.literal(!0),years:z2.number(),price:z2.number(),renewalPrice:z2.number(),premium:z2.boolean()})]),domainsSearchResponseSchema=z2.object({results:z2.array(domainSearchResultSchema)});async function search(client,argv){let parsedArgs,flagsSpecification=getFlagsSpecification(searchSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let formatResult=validateJsonOutput(parsedArgs.flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let queryResult=normalizeQuery(parsedArgs.args);if(!queryResult.valid)return output_manager_default.error(queryResult.error),2;let orderResult=getOrder(parsedArgs.flags["--order"]);if(!orderResult.valid)return output_manager_default.error(orderResult.error),2;let limitResult=getLimit(parsedArgs.flags["--limit"]);if(!limitResult.valid)return output_manager_default.error(limitResult.error),2;let tldsResult=normalizeTldFilters(parsedArgs.flags["--tld"]);if(!tldsResult.valid)return output_manager_default.error(tldsResult.error),2;let{query,keyword,fragment}=queryResult,order=orderResult.order,limit=limitResult.limit,tlds=tldsResult.tlds,availableOnly=parsedArgs.flags["--available"]??!1,cursorResult=decodeCursor(parsedArgs.flags["--next"]);if(!cursorResult.valid)return output_manager_default.error(cursorResult.error),1;let cursor2=cursorResult.cursor;if(cursor2&&(cursor2.query!==query||cursor2.fragment!==fragment||cursor2.order!==order||!areStringArraysEqual(cursor2.tlds,tlds)||cursor2.availableOnly!==availableOnly))return output_manager_default.error("The continuation cursor does not match the current query, order, or filters."),1;try{let supportedTlds=await getSupportedTlds(client,order),matchingTlds=filterTlds(supportedTlds,fragment,tlds,order),offsetResult=getOffset(matchingTlds,cursor2);if(!offsetResult.valid)return output_manager_default.error(offsetResult.error),1;let page=await getCandidatePage(client,keyword,matchingTlds,offsetResult.offset,limit,availableOnly),next=page.lastTld!==null&&page.hasMore?encodeCursor({query,fragment,order,tlds,availableOnly,lastTld:page.lastTld}):null;return formatResult.jsonOutput?(client.stdout.write(`${JSON.stringify({query,order,results:page.results,pagination:{next,limit}},null,2)}
|
|
420
430
|
`),0):(output_manager_default.log(renderTable(page.results)),next&&(output_manager_default.log(""),output_manager_default.log(`To continue, run ${getCommandName(getContinuationCommand(query,order,tlds,availableOnly,next))}`)),0)}catch(error){if(isAPIError(error)){let message=error.serverMessage||`API error (${error.status})`;return formatResult.jsonOutput?client.stdout.write(`${JSON.stringify({error:error.code||"api_error",message},null,2)}
|
|
421
431
|
`):output_manager_default.error(message),1}return printError(error),1}}async function getSupportedTlds(client,order){let cache=await client.maybeReadConfig(SUPPORTED_TLDS_CACHE_FILE,supportedTldsCacheSchema),cacheKey=JSON.stringify([client.config.currentTeam??null,order]),cachedEntry=cache?.entries[cacheKey];if(cachedEntry&&isSupportedTldsCacheEntryFresh(cachedEntry.fetchedAt))return output_manager_default.debug("Using cached supported TLD catalog"),cachedEntry.tlds;let params=new URLSearchParams3({order}),supportedTlds=supportedTldsSchema.parse(await client.fetch(`/v1/registrar/tlds/supported?${params}`));try{let fetchedAt=Date.now(),freshEntries=Object.fromEntries(Object.entries(cache?.entries??{}).filter(([,entry2])=>isSupportedTldsCacheEntryFresh(entry2.fetchedAt,fetchedAt)));await client.writeConfig(SUPPORTED_TLDS_CACHE_FILE,supportedTldsCacheSchema,{entries:{...freshEntries,[cacheKey]:{fetchedAt,tlds:supportedTlds}}})}catch(error){output_manager_default.debug(`Failed to cache supported TLD catalog: ${error}`)}return supportedTlds}function isSupportedTldsCacheEntryFresh(fetchedAt,now=Date.now()){let age=now-fetchedAt;return age>=0&&age<=SUPPORTED_TLDS_CACHE_TTL_MS}function encodeCursor(cursor2){return Buffer.from(JSON.stringify(cursor2),"utf8").toString("base64url")}function decodeCursor(value){if(value===void 0)return{valid:!0,cursor:null};try{if(!value||!/^[A-Za-z0-9_-]+$/.test(value))throw new Error("Invalid base64url value");let cursor2=JSON.parse(Buffer.from(value,"base64url").toString("utf8"));if(!isContinuationCursor(cursor2))throw new Error("Invalid cursor shape");return{valid:!0,cursor:cursor2}}catch{return{valid:!1,error:"Invalid continuation cursor. Run Domain Discovery again without `--next`."}}}function isContinuationCursor(value){if(!value||typeof value!="object"||Array.isArray(value))return!1;let cursor2=value,keys=Object.keys(cursor2).sort();return keys.length!==6||keys.join(",")!=="availableOnly,fragment,lastTld,order,query,tlds"?!1:typeof cursor2.query=="string"&&(typeof cursor2.fragment=="string"||cursor2.fragment===null)&&typeof cursor2.order=="string"&&ORDERS.includes(cursor2.order)&&Array.isArray(cursor2.tlds)&&cursor2.tlds.every(tld=>typeof tld=="string")&&typeof cursor2.availableOnly=="boolean"&&typeof cursor2.lastTld=="string"&&cursor2.lastTld.length>0}function getOffset(tlds,cursor2){if(!cursor2)return{valid:!0,offset:0};let lastTldIndex=tlds.indexOf(cursor2.lastTld);return lastTldIndex===-1?{valid:!1,error:"The continuation cursor is stale. Run Domain Discovery again without `--next`."}:{valid:!0,offset:lastTldIndex+1}}function normalizeQuery(args){if(args.length===0)return{valid:!1,error:"Missing query. Usage: `vercel domains search <query>`"};if(args.length>1)return{valid:!1,error:"Please provide one keyword or domain fragment."};let query=args[0].trim().toLowerCase();if(query.length===0)return{valid:!1,error:"Query cannot be empty."};if(!/^[\x00-\x7F]+$/.test(query))return{valid:!1,error:"Only ASCII queries are supported in Domain Discovery."};if(query.includes("://")||/[/?#]/.test(query))return{valid:!1,error:"URLs are not supported. Provide one keyword or domain fragment."};if(/\s/.test(query))return{valid:!1,error:"Queries cannot contain whitespace. Provide one keyword or domain fragment."};let[keyword,...fragmentParts]=query.split("."),fragment=fragmentParts.length>0?fragmentParts.join("."):null;return isValidLabel(keyword)?fragment!==null&&!fragment.split(".").every(isValidLabel)?{valid:!1,error:`Invalid TLD fragment: "${fragment}".`}:{valid:!0,query,keyword,fragment}:{valid:!1,error:`Invalid keyword: "${keyword}".`}}function isValidLabel(value){return value.length<=63&&/^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/.test(value)}function getOrder(value){let order=value??DEFAULT_ORDER;return ORDERS.includes(order)?{valid:!0,order}:{valid:!1,error:`Invalid order: "${order}". Valid orders: ${ORDERS.join(", ")}`}}function getContinuationCommand(query,order,tlds,availableOnly,cursor2){let flags=[];return order!==DEFAULT_ORDER&&flags.push(`--order=${order}`),flags.push(...tlds.map(tld=>`--tld=${tld}`)),availableOnly&&flags.push("--available"),flags.push(`--next ${cursor2}`),`domains search ${query} ${flags.join(" ")}`}function normalizeTldFilters(values){if(values===void 0)return{valid:!0,tlds:[]};let tlds=Array.from(new Set(values.map(value=>value.trim().toLowerCase().replace(/^\./,"")))).sort(),invalidTld=tlds.find(tld=>tld.length===0||!tld.split(".").every(isValidLabel));return invalidTld!==void 0?{valid:!1,error:`Invalid TLD filter: "${invalidTld}".`}:{valid:!0,tlds}}function areStringArraysEqual(left,right){return left.length===right.length&&left.every((value,index)=>value===right[index])}function getLimit(value){let limit=value??DEFAULT_LIMIT2;return!Number.isInteger(limit)||limit<1||limit>MAX_LIMIT3?{valid:!1,error:`Invalid limit: "${limit}". Provide a number from 1 to ${MAX_LIMIT3}.`}:{valid:!0,limit}}function filterTlds(tlds,fragment,filters,order){let filterSet=new Set(filters),matchingTlds=tlds.filter(tld=>(fragment===null||tld.startsWith(fragment))&&(filterSet.size===0||filterSet.has(tld)));return order==="relevance"?matchingTlds.sort((a,b)=>a===fragment?-1:b===fragment?1:0):matchingTlds}async function getCandidatePage(client,keyword,tlds,offset,limit,availableOnly){let pageTlds=tlds.slice(offset,offset+limit),candidates=await quoteCandidates(client,pageTlds.map(tld=>`${keyword}.${tld}`));return{results:availableOnly?candidates.filter(candidate=>candidate.available):candidates,lastTld:pageTlds.at(-1)??null,hasMore:offset+pageTlds.length<tlds.length}}async function quoteCandidates(client,domains2){if(domains2.length===0)return[];let response=domainsSearchResponseSchema.parse(await client.fetch("/v1/registrar/domains/search",{method:"POST",body:{domains:domains2}})),resultsByDomain=new Map(response.results.map(result=>[result.domain,result]));return domains2.map(domain2=>{let result=resultsByDomain.get(domain2);if(!result)throw new Error(`Missing registrar search result for ${domain2}.`);return result.available?{domain:result.domain,available:!0,purchasePrice:result.price,renewalPrice:result.renewalPrice,years:result.years}:{domain:result.domain,available:!1,purchasePrice:null,renewalPrice:null,years:null}})}function renderTable(results){return table([["Domain","Availability","Purchase","Renewal"],...results.map(result=>[result.domain,result.available?"Available":"Unavailable",result.available?formatPrice(result.purchasePrice,result.years):"-",result.available?formatPrice(result.renewalPrice,result.years):"-"])])}function formatPrice(price2,years){return price2===null||years===null?"-":`$${price2} / ${years} ${years===1?"year":"years"}`}var import_chalk104=__toESM(require_source(),1),import_error_utils12=__toESM(require_dist(),1);async function updateAutoRenew(client,name,autoRenew2){let{team}=await getScope(client),teamParam=team?`?teamId=${team.slug}`:"";return client.fetch(`/v1/registrar/domains/${encodeURIComponent(name)}/auto-renew${teamParam}`,{method:"PATCH",body:{autoRenew:autoRenew2}})}var DomainsAutoRenewTelemetryClient=class extends TelemetryClient{trackCliArgumentDomain(domainName){domainName&&this.trackCliArgument({arg:"domain",value:this.redactedValue})}trackCliArgumentState(state){(state==="on"||state==="off")&&this.trackCliArgument({arg:"state",value:state})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var ON="on",OFF="off";async function autoRenew(client,argv){let telemetry2=new DomainsAutoRenewTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(autoRenewSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message:error instanceof Error?error.message:String(error)}),printError(error),2}let{args}=parsedArgs,[domainName,state]=args;telemetry2.trackCliArgumentDomain(domainName),telemetry2.trackCliArgumentState(state),telemetry2.trackCliOptionFormat(parsedArgs.flags["--format"]),telemetry2.trackCliFlagJson(parsedArgs.flags["--json"]);let formatResult=validateJsonOutput(parsedArgs.flags);if(!formatResult.valid)return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message:formatResult.error}),output_manager_default.error(formatResult.error),2;let{jsonOutput}=formatResult,asJson=jsonOutput||!canPrompt(client);function fail2(reason,message2,humanMessage=message2){return shouldEmitNonInteractiveCommandError(client)?(outputAgentError(client,{status:AGENT_STATUS.ERROR,reason,message:message2}),getExitCodeForReason(reason)):jsonOutput||!canPrompt(client)?(client.stdout.write(`${JSON.stringify({status:AGENT_STATUS.ERROR,reason,domain:domainName,message:message2},null,2)}
|
|
422
432
|
`),getExitCodeForReason(reason)):(output_manager_default.error(humanMessage),getExitCodeForReason(reason))}if(args.length!==2||!domainName||!state)return fail2(AGENT_REASON.MISSING_ARGUMENTS,`Invalid number of arguments. Usage: ${getCommandName("domains auto-renew <domain> <on|off>")}`,`Invalid number of arguments. Usage: ${import_chalk104.default.cyan(`${getCommandName("domains auto-renew <domain> <on|off>")}`)}`);if(!isRootDomain(domainName))return fail2(AGENT_REASON.INVALID_DOMAIN,`Invalid domain name "${domainName}".`,`Invalid domain name "${domainName}". Run ${getCommandName("domains --help")}`);if(state!==ON&&state!==OFF)return fail2(AGENT_REASON.INVALID_ARGUMENTS,`Invalid state "${state}". Expected ${ON} or ${OFF}.`,`Invalid state "${state}". Expected ${import_chalk104.default.bold(ON)} or ${import_chalk104.default.bold(OFF)}.`);let enabled=state===ON,contextName=await getContextName(client);asJson||output_manager_default.spinner(`Turning automatic renewal ${state} for ${domainName}`);try{await updateAutoRenew(client,domainName,enabled)}catch(err){if(output_manager_default.stopSpinner(),isAPIError(err))switch(err.code){case"domain_not_registered":return fail2("domain_not_registered",`The domain ${domainName} is not registered with Vercel.`,`The domain ${param(domainName)} is not registered with Vercel.`);case"domain_not_found":return fail2(AGENT_REASON.DOMAIN_NOT_FOUND,`Domain ${domainName} not found under ${contextName}.`,`Domain ${param(domainName)} not found under ${import_chalk104.default.bold(contextName)}.`);case"domain_not_renewable":return fail2("domain_not_renewable",`The domain ${domainName} cannot be renewed, so automatic renewal can't be changed.`);case"domain_already_renewing":return fail2("domain_already_renewing",`The domain ${domainName} is already renewing, so automatic renewal can't be changed right now.`);case"forbidden":return fail2("forbidden",`You don't have permission to update ${domainName} under ${contextName}.`,`You don't have permission to update ${param(domainName)} under ${import_chalk104.default.bold(contextName)}.`);default:return fail2(AGENT_REASON.API_ERROR,err.serverMessage||err.message)}return output_manager_default.debug(`Server response: ${(0,import_error_utils12.errorToString)(err)}`),fail2(AGENT_REASON.API_ERROR,"An unexpected error occurred while updating automatic renewal. Please try again later.")}output_manager_default.stopSpinner();let message=enabled?`Automatic renewal turned on for ${domainName}`:`Automatic renewal turned off for ${domainName}`;return asJson?(client.stdout.write(`${JSON.stringify({status:AGENT_STATUS.OK,domain:domainName,autoRenew:enabled,message},null,2)}
|
|
423
|
-
`),0):(output_manager_default.success(enabled?`Automatic renewal turned on for ${param(domainName)}`:`Automatic renewal turned off for ${param(domainName)}`),0)}var import_chalk105=__toESM(require_source(),1),import_error_utils13=__toESM(require_dist(),1);async function renewDomain(client,name,expectedPrice,years){let{team}=await getScope(client),teamParam=team?`?teamId=${team.slug}`:"",{orderId}=await client.fetch(`/v1/registrar/domains/${encodeURIComponent(name)}/renew${teamParam}`,{method:"POST",body:{expectedPrice,years}});return pollForOrder(client,orderId)}var DomainsRenewTelemetryClient=class extends TelemetryClient{trackCliArgumentDomain(domainName){domainName&&this.trackCliArgument({arg:"domain",value:this.redactedValue})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};
|
|
424
|
-
`),0):(output_manager_default.success(`Domain ${param(domainName)} renewed ${renewStamp()}`),0)}var DomainsVerifyTelemetryClient=class extends TelemetryClient{trackCliArgumentDomain(name){name&&this.trackCliArgument({arg:"domain",value:this.redactedValue})}trackCliFlagStrict(strict){strict&&this.trackCliFlag("strict")}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function getDomainConfigV6(client,domainName,options={}){let query=new URLSearchParams;options.projectIdOrName&&query.set("projectIdOrName",options.projectIdOrName),options.strict&&query.set("strict","true");let queryString=query.toString();try{return await client.fetch(`/v6/domains/${encodeURIComponent(domainName)}/config${queryString?`?${queryString}`:""}`,{bailOn429:options.bailOn429})}catch(err){if(isAPIError(err)&&err.status<500)return err;throw err}}async function acquireVerificationFacts(client,options){let{domainName}=options,{contextName,team}=await getScope(client);client.config.currentTeam=team?.id;let requests=[getDomainConfigV6(client,domainName,{projectIdOrName:options.project,strict:options.strict,bailOn429:!0}),resolveProject(client,domainName,options.project),lookupOwnership(client,contextName,domainName)],[config,resolvedProject,owned]=await Promise.all(requests);if(isAPIError(config))return{ok:!1,error:{kind:errorKind(config.code),code:config.code||"api_error",message:configErrorMessage(config,domainName)}};if(resolvedProject.kind==="forbidden")return{ok:!1,error:{kind:"permission-denied",code:"forbidden",message:`You don't have access to the project ${resolvedProject.idOrName} under ${contextName}.`}};if(resolvedProject.kind==="error")return{ok:!1,error:{kind:errorKind(resolvedProject.error.code),code:resolvedProject.error.code||"api_error",message:projectErrorMessage(resolvedProject.error,resolvedProject.idOrName)}};let project=await triggerVerification(client,resolvedProject,domainName);return{ok:!0,facts:{domainName,contextName,teamId:team?.id,config,ownership:owned.ownership,intendedNameservers:owned.intendedNameservers,project}}}async function resolveProject(client,domainName,requestedProject){return requestedProject?resolveRequestedProject(client,domainName,requestedProject):await findLinkedProjectDomain(client,domainName)??await findProjectDomainByName(client,domainName)}async function resolveRequestedProject(client,domainName,idOrName){let result=await getProjectDomain(client,idOrName,domainName,{bailOn429:!0});return isAPIError(result)?result.status===403?{kind:"forbidden",idOrName}:result.status===404?{kind:"missing",idOrName}:{kind:"error",idOrName,error:result}:attachedProject(idOrName,idOrName,result)}async function findLinkedProjectDomain(client,domainName){let link=await getLinkedProject(client);if(link.status!=="linked")return null;let result=await getProjectDomain(client,link.project.id,domainName,{bailOn429:!0});return isAPIError(result)?result.status===403||result.status===404?null:{kind:"error",idOrName:link.project.id,error:result}:attachedProject(link.project.id,link.project.name,result)}async function findProjectDomainByName(client,domainName){let result=await getProjectDomainByName(client,domainName,{bailOn429:!0});if(isAPIError(result))return result.status===403||result.status===404?{kind:"none"}:{kind:"error",idOrName:domainName,error:result};let label=await getProjectLabel(client,result.projectId);return attachedProject(result.projectId,label,result)}function attachedProject(idOrName,label,domain2){return{kind:"attached",idOrName,label,domain:domain2,verificationError:null}}async function getProjectLabel(client,projectId){try{let project=await getProjectByNameOrId(client,projectId);return project instanceof Error?projectId:project.name}catch{return projectId}}async function lookupOwnership(client,contextName,domainName){if(isPublicSuffix(domainName))return{ownership:"platform-managed",intendedNameservers:[]};try{let domain2=await getDomainByName(client,contextName,domainName,{ignoreWait:!0,bailOn429:!0});return domain2 instanceof DomainPermissionDenied?{ownership:"other-scope",intendedNameservers:[]}:domain2 instanceof DomainNotFound?{ownership:"not-found",intendedNameservers:[]}:{ownership:"current-scope",intendedNameservers:domain2.intendedNameservers}}catch{return{ownership:null,intendedNameservers:[]}}}async function triggerVerification(client,project,domainName){if(project.kind!=="attached"||project.domain.verified)return project;let result=await verifyProjectDomain(client,project.idOrName,domainName,{bailOn429:!0});return isAPIError(result)?{...project,verificationError:result}:{...project,domain:result}}function errorKind(errorCode){return errorCode==="invalid_name"?"invalid-domain":errorCode==="forbidden"?"permission-denied":errorCode==="timeout"?"timeout":errorCode==="unexpected_dns_response"?"unexpected-dns-response":"api-error"}function configErrorMessage(err,domainName){return err.code==="invalid_name"?`${domainName} is not a valid domain name.`:err.code==="timeout"?`Resolving the DNS configuration for ${domainName} timed out. This is usually transient \u2014 try again in a few seconds.`:err.code==="unexpected_dns_response"?`The nameservers for ${domainName} returned an unexpected response while checking its DNS configuration.`:err.serverMessage||`API error (${err.status})`}function projectErrorMessage(err,projectIdOrName){return err.serverMessage||err.message||`Could not check project ${projectIdOrName} (${err.status}).`}var import_tldts6=__toESM(require_cjs(),1);function diagnoseDomain(facts,commands2){let configurationStatus=getConfigurationStatus(facts),status6=getDomainStatus2(configurationStatus,facts.project),recommendedDnsRecords=configurationStatus==="scope-resolution-required"||isPlatformManagedDomain(facts)||shouldRecommendProjectAttachment(facts)?[]:getRecommendedDnsRecords(facts),domainConnect=configurationStatus==="scope-resolution-required"||isPlatformManagedDomain(facts)||shouldRecommendProjectAttachment(facts)?null:getDomainConnectConfiguration(facts),steps=buildSteps(facts,commands2,recommendedDnsRecords,domainConnect),details=statusDetails(facts,status6,steps),issues=getDomainIssues(facts,status6,configurationStatus,steps),next=buildNextSteps(steps,commands2,status6),ok=isOkStatus(status6);return{facts,status:status6,configurationStatus,ok,exitCode:ok?0:1,details,issues,recommendedDnsRecords,steps,next}}function getConfigurationStatus(facts){let{config}=facts;return requiresScopeResolution(facts)?"scope-resolution-required":isPlatformManagedDomain(facts)?config.misconfigured?"invalid-configuration":"configured-correctly":shouldRecommendProjectAttachment(facts)?"project-attachment-recommended":config.serviceType==="zeit.world"&&config.dnssecEnabled?"dnssec-needs-to-be-disabled":config.misconfigured?"invalid-configuration":config.ipStatus==="required-change"&&hasRecommendedDnsUpdate(config)?isOwnedUnattachedHostname(facts)?"dns-change-recommended":"dns-change-required":config.ipStatus==="optional-change"&&hasRecommendedDnsUpdate(config)?"dns-change-recommended":"configured-correctly"}function getDomainStatus2(configurationStatus,project){return configurationStatus==="scope-resolution-required"?configurationStatus:project.kind==="missing"?"project-domain-missing":configurationStatus!=="configured-correctly"&&configurationStatus!=="dns-change-recommended"?configurationStatus:project.kind==="attached"&&!project.domain.verified?"verification-needed":configurationStatus}function getDomainIssues(facts,status6,configurationStatus,steps){let statuses=[],addStatus=candidate=>{candidate!=="configured-correctly"&&!statuses.includes(candidate)&&statuses.push(candidate)};return addStatus(status6),status6!=="scope-resolution-required"&&(addStatus(configurationStatus),facts.project.kind==="missing"?addStatus("project-domain-missing"):facts.project.kind==="attached"&&!facts.project.domain.verified&&addStatus("verification-needed")),statuses.map(domainStatus=>({domainStatus,...statusDetails(facts,domainStatus,steps)}))}function statusDetails(facts,status6,steps){let{domainName,project}=facts,domainConnect=getDomainConnect(steps),attachProject=steps.find(step=>step.kind==="attach-project");if(status6==="configured-correctly")return{reason:AGENT_REASON.CONFIGURED_CORRECTLY,message:project.kind==="attached"?`${domainName} has a valid configuration and is verified for project ${project.label}.`:`${domainName} has a valid configuration.`};if(status6==="verification-needed")return{reason:AGENT_REASON.VERIFICATION_NEEDED,message:project.kind==="attached"?`${domainName} needs ownership verification for project ${project.label}.`:`${domainName} needs ownership verification.`,userActionRequired:!0,hint:dnsActionHint(facts,domainConnect,"Add one of the project verification records at the DNS provider, then run the suggested verify command.")};if(status6==="invalid-configuration"){if(isPlatformManagedDomain(facts))return{reason:AGENT_REASON.INVALID_CONFIGURATION,message:`${domainName} has an invalid Vercel-managed DNS configuration.`,userActionRequired:!0,hint:"No DNS changes are required from you. Retry the check, then contact Vercel Support if the configuration remains invalid."};if(attachProject?.kind==="attach-project"){let target=attachProject.project==="<project>"?"a project":`project ${attachProject.project}`,attachInstruction=attachProject.project==="<project>"?"Attach it to a project":"Attach it";return{reason:AGENT_REASON.INVALID_CONFIGURATION,message:`${domainName} is not attached to ${target} and has an invalid DNS configuration. ${attachInstruction} and apply the recommended DNS changes, then retry verification.`,userActionRequired:!0,hint:attachProject.project==="<project>"?"Replace <project> in next[] with the project that should serve the domain, attach it, apply the recommended records or nameservers at the DNS provider, then run the suggested verify command.":"Run the domains add command in next[], apply the recommended records or nameservers at the DNS provider, then run the suggested verify command."}}else return{reason:AGENT_REASON.INVALID_CONFIGURATION,message:`${domainName} has an invalid DNS configuration. Apply the recommended DNS changes, then retry verification.`,userActionRequired:!0,hint:dnsActionHint(facts,domainConnect,"Apply the recommended records or nameservers at the DNS provider, then run the suggested verify command.")}}else return status6==="dnssec-needs-to-be-disabled"?{reason:AGENT_REASON.DNSSEC_NEEDS_TO_BE_DISABLED,message:`${domainName} uses Vercel nameservers, but DNSSEC must be disabled with the domain registrar so the nameservers can resolve globally.`,userActionRequired:!0,hint:"Disable DNSSEC with the domain registrar, then run the suggested verify command."}:status6==="dns-change-required"?{reason:AGENT_REASON.DNS_CHANGE_REQUIRED,message:`${domainName} requires a DNS change to avoid downtime.`,userActionRequired:!0,hint:dnsActionHint(facts,domainConnect,"Apply the recommended records or nameservers at the DNS provider, then run the suggested verify command.")}:status6==="dns-change-recommended"?{reason:AGENT_REASON.DNS_CHANGE_RECOMMENDED,message:`${domainName} has a valid configuration, but Vercel recommends updating its DNS records.`,hint:dnsActionHint(facts,domainConnect,"The domain is working. Apply the recommended DNS update when convenient, then re-check.")}:status6==="project-attachment-recommended"?{reason:AGENT_REASON.PROJECT_ATTACHMENT_RECOMMENDED,message:`${domainName} is owned by ${facts.contextName} but is not attached to a project.`,hint:"To use the domain, replace <project> in next[] with the project that should serve it."}:status6==="scope-resolution-required"?{reason:AGENT_REASON.SCOPE_NOT_ACCESSIBLE,message:`${domainName} exists on Vercel but is not accessible under ${facts.contextName}. Retry under the owning team before evaluating its DNS or project status.`,userActionRequired:!0,hint:"Use next[] to find the team that owns the domain, then retry in that scope."}:{reason:AGENT_REASON.PROJECT_DOMAIN_MISSING,message:project.kind==="missing"?`${domainName} is not attached to project ${project.idOrName}.`:`${domainName} is not attached to the requested project.`,hint:facts.ownership==="other-scope"?"Find the team that owns the domain using next[], then retry in that scope before changing project attachments.":"Run the domains add command in next[], then retry verification."}}function dnsActionHint(facts,domainConnect,manualHint){return facts.ownership==="other-scope"&&facts.project.kind!=="attached"?`Resolve the team that owns the domain using next[] before making DNS or project changes. ${manualHint}`:domainConnect?`Open the Cloudflare Domain Connect URL in next[] to apply the DNS changes automatically. ${manualHint}`:manualHint}function buildSteps(facts,commands2,recommendedDnsRecords,domainConnect){let scope=requiresScopeResolution(facts)?{kind:"resolve-scope",contextName:facts.contextName,teamsCommand:commands2.teamsList,verifyCommand:commands2.verify("<team>")}:null;if(scope)return[scope];let attachProject=buildAttachProjectStep(facts,commands2);if(shouldRecommendProjectAttachment(facts))return attachProject?[attachProject]:[];let steps=[];attachProject&&steps.push(attachProject);let configureDns=buildConfigureDnsStep(facts,recommendedDnsRecords,domainConnect);if(configureDns&&steps.push(configureDns),!isPlatformManagedDomain(facts)&&facts.config.serviceType==="zeit.world"&&facts.config.dnssecEnabled&&steps.push({kind:"disable-dnssec"}),!isPlatformManagedDomain(facts))for(let conflict of facts.config.conflicts??[])steps.push({kind:"remove-conflict",conflict});let verification=facts.project.kind==="attached"&&!facts.project.domain.verified?{kind:"verify-ownership",challenges:facts.project.domain.verification??[],errorMessage:facts.project.verificationError?facts.project.verificationError.serverMessage||facts.project.verificationError.message:null}:null;return verification&&steps.push(verification),steps}function buildAttachProjectStep(facts,commands2){return needsProjectAttachment(facts)?{kind:"attach-project",mode:facts.config.misconfigured?"required":"recommended",project:"<project>",command:commands2.attachProject("<project>")}:facts.project.kind==="missing"?{kind:"attach-project",mode:"required",project:facts.project.idOrName,command:commands2.attachProject(facts.project.idOrName)}:null}function buildConfigureDnsStep(facts,recommendedDnsRecords,domainConnect){if(requiresScopeResolution(facts)||isPlatformManagedDomain(facts)||shouldRecommendProjectAttachment(facts)||!needsDnsRecordChange(facts.config))return null;let methods=[];domainConnect&&methods.push({kind:"domain-connect",configuration:domainConnect});let aRecords=recommendedDnsRecords.filter(record=>record.type==="A"),cnameRecords=recommendedDnsRecords.filter(record=>record.type==="CNAME");return aRecords.length&&methods.push({kind:"a-records",records:aRecords}),cnameRecords.length&&methods.push({kind:"cname-records",records:cnameRecords}),facts.intendedNameservers.length&&!nameserversMatch(facts.config.nameservers,facts.intendedNameservers)&&methods.push({kind:"nameservers",nameservers:[...facts.intendedNameservers]}),{kind:"configure-dns",change:facts.config.misconfigured&&facts.config.configuredBy===null?"point-domain":facts.config.ipStatus==="optional-change"||isOwnedUnattachedHostname(facts)?"recommended-change":"required-change",methods}}function buildNextSteps(steps,commands2,status6){let next=[];for(let step of steps)if(step.kind==="resolve-scope")next.push({command:step.teamsCommand,when:"List teams to find the scope that owns the domain"},{command:step.verifyCommand,when:"Replace <team> with the owning team and retry"});else if(step.kind==="attach-project")next.push({command:step.command,when:step.project==="<project>"?"Replace <project> with the project that should serve the domain":"Attach the domain to the requested project"});else if(step.kind==="configure-dns"){let domainConnectMethod=step.methods.find(method=>method.kind==="domain-connect");domainConnectMethod?.kind==="domain-connect"&&next.push({command:commands2.openUrl(domainConnectMethod.configuration.applyUrl),when:"Open Cloudflare to review and apply the DNS changes automatically with Domain Connect"})}return!steps.some(step=>step.kind==="resolve-scope")&&status6!=="configured-correctly"&&status6!=="project-attachment-recommended"&&next.push({command:commands2.verify(),when:status6==="dns-change-recommended"?"Re-check after applying the recommended DNS change":"Re-check after completing the required changes"}),next}function getDomainConnect(steps){for(let step of steps){if(step.kind!=="configure-dns")continue;let method=step.methods.find(candidate=>candidate.kind==="domain-connect");if(method?.kind==="domain-connect")return method.configuration}return null}function getRecommendedDnsRecords(facts){let recommendedA=facts.config.recommendedIPv4?.find(record=>record.rank===1)?.value??[],recommendedCNAME=facts.config.recommendedCNAME?.find(record=>record.rank===1)?.value,apexName=facts.project.kind==="attached"?facts.project.domain.apexName:(0,import_tldts6.parse)(facts.domainName.replace(/^\*\./,"")).domain,name=getDnsRecordName(facts.domainName,apexName),disableProxy=isCloudflareDns(facts.config),aRecords=recommendedA.map(value=>({type:"A",name,value,...disableProxy?{disableProxy:!0}:{}})),cnameRecords=recommendedCNAME?[{type:"CNAME",name,value:recommendedCNAME,...disableProxy?{disableProxy:!0}:{}}]:[],isApex=apexName?facts.domainName.toLowerCase()===apexName.toLowerCase():null,preferred=isApex===null?[]:isApex&&!disableProxy?aRecords:cnameRecords;return preferred.length?preferred:[...aRecords,...cnameRecords]}function getDomainConnectConfiguration(facts){if(isPlatformManagedDomain(facts)||facts.project.kind!=="attached"||isWildcardDomain(facts.domainName)||!needsDnsRecordChange(facts.config)||!isCloudflareDns(facts.config))return null;let params=new URLSearchParams;facts.teamId&¶ms.set("teamId",facts.teamId);let query=params.toString(),projectId=encodeURIComponent(facts.project.domain.projectId),domain2=encodeURIComponent(facts.project.domain.name);return{protocol:"domain-connect",providerId:"cloudflare.com",providerName:"Cloudflare",applyUrl:`https://vercel.com/api/v9/projects/${projectId}/domains/${domain2}/domain-connect/apply`+(query?`?${query}`:"")}}function hasRecommendedDnsUpdate(config){return!!(config.recommendedIPv4?.some(record=>record.rank===1&&record.value.length>0)||config.recommendedCNAME?.some(record=>record.rank===1&&!!record.value))}function needsDnsRecordChange(config){return hasRecommendedDnsUpdate(config)&&(config.ipStatus==="required-change"||config.ipStatus==="optional-change"||config.misconfigured&&config.configuredBy===null)}function isOkStatus(status6){return status6==="configured-correctly"||status6==="dns-change-recommended"||status6==="project-attachment-recommended"}function isCloudflareDns(config){return config.nameservers.length>0&&config.nameservers.every(nameserver=>nameserver.toLowerCase().replace(/\.$/,"").endsWith(".ns.cloudflare.com"))}function isWildcardDomain(domainName){return domainName.startsWith("*.")}function isOwnedUnattachedHostname(facts){return facts.ownership==="current-scope"&&facts.project.kind==="none"}function needsProjectAttachment(facts){return facts.project.kind==="none"&&(facts.ownership==="current-scope"||facts.ownership==="not-found")}function shouldRecommendProjectAttachment(facts){return isOwnedUnattachedHostname(facts)&&!facts.config.misconfigured&&!(facts.config.serviceType==="zeit.world"&&facts.config.dnssecEnabled)}function requiresScopeResolution(facts){return facts.ownership==="other-scope"&&facts.project.kind!=="attached"}function isPlatformManagedDomain(facts){return facts.ownership==="platform-managed"}function nameserversMatch(current,intended){let normalize=nameservers=>[...new Set(nameservers.map(normalizeNameserver))].sort(),normalizedCurrent=normalize(current),normalizedIntended=normalize(intended);return normalizedCurrent.length===normalizedIntended.length&&normalizedCurrent.every((nameserver,index)=>nameserver===normalizedIntended[index])}function normalizeNameserver(nameserver){return nameserver.toLowerCase().replace(/\.$/,"")}function getDnsRecordName(domain2,apex){let domainName=domain2.toLowerCase(),apexName=apex?.toLowerCase();if(!apexName)return domain2;if(domainName===apexName)return"@";let suffix=`.${apexName}`;return domainName.endsWith(suffix)?domain2.slice(0,-suffix.length):domain2}var import_chalk106=__toESM(require_source(),1);function renderHumanOutput(diagnosis,elapsed2){return diagnosis.status==="configured-correctly"&&diagnosis.steps.length===0?{lead:{kind:"success",message:`${successMessage(diagnosis)} ${import_chalk106.default.gray(elapsed2)}`},sections:[]}:{lead:{kind:"log",message:`Checked ${diagnosis.facts.domainName} under ${import_chalk106.default.bold(diagnosis.facts.contextName)} ${import_chalk106.default.gray(elapsed2)}`},sections:[renderStatus(diagnosis),renderFixes(diagnosis),renderResolvedValues(diagnosis),renderNameservers(diagnosis)].filter(section=>section!==null)}}function successMessage(diagnosis){let{facts}=diagnosis,configuredBy=describeConfiguredBy(facts.config.configuredBy),suffix=facts.project.kind==="attached"?` and verified for project ${import_chalk106.default.bold(facts.project.label)}`:"";return`Valid Configuration: ${facts.domainName} is configured${configuredBy?` (${configuredBy})`:""}${suffix}`}function describeConfiguredBy(configuredBy){return configuredBy==="A"?"A record":configuredBy==="CNAME"?"CNAME record":configuredBy==="http"?"HTTP resolution, possibly behind a proxy":configuredBy==="dns-01"?"DNS-01 challenge only, not yet resolving to Vercel":null}var good=text3=>`${import_chalk106.default.green(chars_default.tick)} ${text3}`,bad=text3=>`${import_chalk106.default.red(chars_default.cross)} ${text3}`,warning=text3=>`${import_chalk106.default.yellow("!")} ${text3}`;function renderStatus(diagnosis){let{facts}=diagnosis,rows=[[import_chalk106.default.cyan("DNS Configuration"),dnsStatus(diagnosis)],[import_chalk106.default.cyan("Project"),projectStatus(diagnosis)]];return facts.ownership==="other-scope"?rows.push([import_chalk106.default.cyan("Ownership"),bad(`Not accessible under ${import_chalk106.default.bold(facts.contextName)}`)]):facts.ownership==="platform-managed"&&rows.push([import_chalk106.default.cyan("Ownership"),good("Managed by Vercel")]),facts.config.dnssecEnabled&&diagnosis.configurationStatus!=="scope-resolution-required"&&rows.push([import_chalk106.default.cyan("DNSSEC"),import_chalk106.default.yellow("Enabled")]),`
|
|
433
|
+
`),0):(output_manager_default.success(enabled?`Automatic renewal turned on for ${param(domainName)}`:`Automatic renewal turned off for ${param(domainName)}`),0)}var import_chalk105=__toESM(require_source(),1),import_error_utils13=__toESM(require_dist(),1);async function renewDomain(client,name,expectedPrice,years){let{team}=await getScope(client),teamParam=team?`?teamId=${team.slug}`:"",orderId;try{({orderId}=await client.fetch(`/v1/registrar/domains/${encodeURIComponent(name)}/renew${teamParam}`,{method:"POST",body:{expectedPrice,years},retry:{retries:0},bailOn429:!0}))}catch(err){if(isAPIError(err)&&err.status<500)throw err;return new DomainChargeOutcomeUnknown(name,"renew")}let order;try{order=await pollForOrder(client,orderId)}catch{order=null}return order??new DomainChargeOutcomeUnknown(name,"renew")}var DomainsRenewTelemetryClient=class extends TelemetryClient{trackCliArgumentDomain(domainName){domainName&&this.trackCliArgument({arg:"domain",value:this.redactedValue})}trackCliOptionAmount(amount){this.trackRedactedCliOption("amount",amount)}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function renew(client,argv){let telemetry2=new DomainsRenewTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(renewSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs,[domainName]=args;if(telemetry2.trackCliArgumentDomain(domainName),telemetry2.trackCliOptionAmount(opts["--amount"]),telemetry2.trackCliFlagJson(opts["--json"]),telemetry2.trackCliOptionFormat(opts["--format"]),args.length!==1||!domainName)return reportUsageError(client,AGENT_REASON.MISSING_ARGUMENTS,`Invalid number of arguments. Usage: ${getCommandNamePlain("domains renew <domain>")}`);if(!isRootDomain(domainName))return reportUsageError(client,AGENT_REASON.INVALID_DOMAIN,`Invalid domain name "${domainName}". Use a registrable root domain (no subdomain).`);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return reportUsageError(client,AGENT_REASON.INVALID_ARGUMENTS,formatResult.error);let asJson=formatResult.jsonOutput,amount=parseAmount(opts["--amount"]);if(amount instanceof Error)return reportUsageError(client,AGENT_REASON.INVALID_ARGUMENTS,amount.message);let{contextName,team}=await getScope(client),teamSlug=team?.slug,domainPrice=await getDomainPrice(client,domainName);if(domainPrice instanceof Error)return reportChargeFailure(client,asJson,{reason:chargeFailureReason(domainPrice),message:domainPrice.message});let{years,renewalPrice}=domainPrice;if(renewalPrice===null)return reportChargeFailure(client,asJson,{reason:AGENT_REASON.API_ERROR,message:`The renewal price for ${domainName} is not available. This domain may not be renewable.`});let term=`${years}yr${years>1?"s":""}`,renewCommand=price2=>buildCommandWithGlobalFlags(client.argv,`domains renew ${domainName}${teamSlug?` --scope ${teamSlug}`:""}${price2===void 0?"":` --amount ${formatAmountArg(price2)}`}${asJson?" --json":""}`),inspectCommand2=buildCommandWithGlobalFlags(client.argv,`domains inspect ${domainName}`);if(amount!==void 0&&!amountMatchesPrice(amount,renewalPrice))return reportPriceChanged(client,{verb:"renew",domain:domainName,amount,price:renewalPrice,nextCommand:renewCommand(renewalPrice),json:asJson});if(amount===void 0){if(!canPromptForCharge(client,asJson)){let headline=`Can't renew ${domainName} without an approved price (--amount) in non-interactive mode.`,priceLine=`Price: ${formatUsd(renewalPrice)} for ${formatTerm(years)}, charged to ${contextName}.`,command2=renewCommand(renewalPrice);return writeChargeAction(client,asJson,{status:AGENT_STATUS.ACTION_REQUIRED,reason:AGENT_REASON.CONFIRMATION_REQUIRED,action:AGENT_ACTION.CONFIRMATION_REQUIRED,message:`${headline} ${priceLine}`,userActionRequired:!0,hint:"Show the user the renewal price and get their approval before running next[].",data:{domain:domainName,...teamSlug&&{team:teamSlug},amount:renewalPrice,currency:"USD",years},missing:["--amount"],next:[{command:command2,when:`Only after a human approves: charges ${formatUsd(renewalPrice)} now`}]}),printChargeRecovery(`${headline}
|
|
434
|
+
${priceLine}`,"Once a person approves the price, run",command2),1}if(output_manager_default.log("An email with the invoice and transaction details will be sent to you after renewal."),!await client.input.confirm(`Renew ${param(domainName)} now for ${import_chalk105.default.bold(formatUsd(renewalPrice))} (${formatTerm(years)})?`,!1))return output_manager_default.log("Canceled"),0}if(!canPromptForCharge(client,asJson)&&team){let refused=refuseUnnamedTeam(client,asJson,{verb:"renew",domain:domainName,team,nextCommand:renewCommand(renewalPrice)});if(refused!==void 0)return refused}let renewStamp=stamp_default();output_manager_default.spinner(`Renewing ${domainName}`);let order;try{order=await renewDomain(client,domainName,renewalPrice,years)}catch(err){if(output_manager_default.stopSpinner(),output_manager_default.debug(`Server response: ${(0,import_error_utils13.errorToString)(err)}`),isAPIError(err)){if(err.code==="expected_price_mismatch")return reportPriceChanged(client,{verb:"renew",domain:domainName,amount:renewalPrice,nextCommand:renewCommand(),json:asJson});let known={domain_not_registered:[AGENT_REASON.DOMAIN_NOT_FOUND,`The domain ${domainName} is not registered with Vercel.`],domain_not_found:[AGENT_REASON.DOMAIN_NOT_FOUND,`Domain ${domainName} not found under ${contextName}.`],tld_not_supported:[AGENT_REASON.TLD_NOT_SUPPORTED,`The TLD for domain name ${domainName} is not supported.`],forbidden:[AGENT_REASON.PERMISSION_DENIED,`You don't have permission to renew ${domainName} under ${contextName}.`]},[reason,message]=known[err.code]??[];return reason&&message?reportChargeFailure(client,asJson,{reason,message}):reportChargeFailure(client,asJson,{reason:AGENT_REASON.API_ERROR,message:`Couldn't renew ${domainName}. The API returned an error (${err.code}). Nothing was charged.`},{apiMessage:err.serverMessage})}return reportChargeFailure(client,asJson,{reason:AGENT_REASON.API_ERROR,message:`Couldn't renew ${domainName}. The request wasn't sent, so nothing was charged.`})}if(output_manager_default.stopSpinner(),order instanceof DomainChargeOutcomeUnknown)return reportUnknownOutcome(client,asJson,{verb:"renew",domain:domainName,inspectCommand:inspectCommand2});let outcome=getOrderOutcome(order,domainName);return outcome==="unknown"?reportUnknownOutcome(client,asJson,{verb:"renew",domain:domainName,inspectCommand:inspectCommand2}):outcome!=="completed"?reportChargeFailure(client,asJson,{reason:outcome==="payment_failed"?AGENT_REASON.PAYMENT_FAILED:AGENT_REASON.API_ERROR,message:{payment_failed:"Your card was declined. Nothing was charged.",refunded:`Renewal for ${domainName} failed, and the charge was refunded.`,refund_failed:`Renewal for ${domainName} failed, and refunding the charge also failed. Contact Vercel support about the charge.`,failed:`Renewal for ${domainName} failed.`}[outcome]}):asJson?(client.stdout.write(`${JSON.stringify({status:AGENT_STATUS.OK,domain:domainName,term,years,price:renewalPrice,charge:{amount:renewalPrice,currency:"USD"},orderId:order.orderId,message:`Domain ${domainName} renewed.`},null,2)}
|
|
435
|
+
`),0):(client.stdout.write(`${domainName}
|
|
436
|
+
`),output_manager_default.success(`Domain ${param(domainName)} renewed ${renewStamp()}`),output_manager_default.log(`Charged ${formatUsd(renewalPrice)} for ${formatTerm(years)}.`),0)}var DomainsVerifyTelemetryClient=class extends TelemetryClient{trackCliArgumentDomain(name){name&&this.trackCliArgument({arg:"domain",value:this.redactedValue})}trackCliFlagStrict(strict){strict&&this.trackCliFlag("strict")}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function getDomainConfigV6(client,domainName,options={}){let query=new URLSearchParams;options.projectIdOrName&&query.set("projectIdOrName",options.projectIdOrName),options.strict&&query.set("strict","true");let queryString=query.toString();try{return await client.fetch(`/v6/domains/${encodeURIComponent(domainName)}/config${queryString?`?${queryString}`:""}`,{bailOn429:options.bailOn429})}catch(err){if(isAPIError(err)&&err.status<500)return err;throw err}}async function acquireVerificationFacts(client,options){let{domainName}=options,{contextName,team}=await getScope(client);client.config.currentTeam=team?.id;let requests=[getDomainConfigV6(client,domainName,{projectIdOrName:options.project,strict:options.strict,bailOn429:!0}),resolveProject(client,domainName,options.project),lookupOwnership(client,contextName,domainName)],[config,resolvedProject,owned]=await Promise.all(requests);if(isAPIError(config))return{ok:!1,error:{kind:errorKind(config.code),code:config.code||"api_error",message:configErrorMessage(config,domainName)}};if(resolvedProject.kind==="forbidden")return{ok:!1,error:{kind:"permission-denied",code:"forbidden",message:`You don't have access to the project ${resolvedProject.idOrName} under ${contextName}.`}};if(resolvedProject.kind==="error")return{ok:!1,error:{kind:errorKind(resolvedProject.error.code),code:resolvedProject.error.code||"api_error",message:projectErrorMessage(resolvedProject.error,resolvedProject.idOrName)}};let project=await triggerVerification(client,resolvedProject,domainName);return{ok:!0,facts:{domainName,contextName,teamId:team?.id,config,ownership:owned.ownership,intendedNameservers:owned.intendedNameservers,project}}}async function resolveProject(client,domainName,requestedProject){return requestedProject?resolveRequestedProject(client,domainName,requestedProject):await findLinkedProjectDomain(client,domainName)??await findProjectDomainByName(client,domainName)}async function resolveRequestedProject(client,domainName,idOrName){let result=await getProjectDomain(client,idOrName,domainName,{bailOn429:!0});return isAPIError(result)?result.status===403?{kind:"forbidden",idOrName}:result.status===404?{kind:"missing",idOrName}:{kind:"error",idOrName,error:result}:attachedProject(idOrName,idOrName,result)}async function findLinkedProjectDomain(client,domainName){let link=await getLinkedProject(client);if(link.status!=="linked")return null;let result=await getProjectDomain(client,link.project.id,domainName,{bailOn429:!0});return isAPIError(result)?result.status===403||result.status===404?null:{kind:"error",idOrName:link.project.id,error:result}:attachedProject(link.project.id,link.project.name,result)}async function findProjectDomainByName(client,domainName){let result=await getProjectDomainByName(client,domainName,{bailOn429:!0});if(isAPIError(result))return result.status===403||result.status===404?{kind:"none"}:{kind:"error",idOrName:domainName,error:result};let label=await getProjectLabel(client,result.projectId);return attachedProject(result.projectId,label,result)}function attachedProject(idOrName,label,domain2){return{kind:"attached",idOrName,label,domain:domain2,verificationError:null}}async function getProjectLabel(client,projectId){try{let project=await getProjectByNameOrId(client,projectId);return project instanceof Error?projectId:project.name}catch{return projectId}}async function lookupOwnership(client,contextName,domainName){if(isPublicSuffix(domainName))return{ownership:"platform-managed",intendedNameservers:[]};try{let domain2=await getDomainByName(client,contextName,domainName,{ignoreWait:!0,bailOn429:!0});return domain2 instanceof DomainPermissionDenied?{ownership:"other-scope",intendedNameservers:[]}:domain2 instanceof DomainNotFound?{ownership:"not-found",intendedNameservers:[]}:{ownership:"current-scope",intendedNameservers:domain2.intendedNameservers}}catch{return{ownership:null,intendedNameservers:[]}}}async function triggerVerification(client,project,domainName){if(project.kind!=="attached"||project.domain.verified)return project;let result=await verifyProjectDomain(client,project.idOrName,domainName,{bailOn429:!0});return isAPIError(result)?{...project,verificationError:result}:{...project,domain:result}}function errorKind(errorCode){return errorCode==="invalid_name"?"invalid-domain":errorCode==="forbidden"?"permission-denied":errorCode==="timeout"?"timeout":errorCode==="unexpected_dns_response"?"unexpected-dns-response":"api-error"}function configErrorMessage(err,domainName){return err.code==="invalid_name"?`${domainName} is not a valid domain name.`:err.code==="timeout"?`Resolving the DNS configuration for ${domainName} timed out. This is usually transient \u2014 try again in a few seconds.`:err.code==="unexpected_dns_response"?`The nameservers for ${domainName} returned an unexpected response while checking its DNS configuration.`:err.serverMessage||`API error (${err.status})`}function projectErrorMessage(err,projectIdOrName){return err.serverMessage||err.message||`Could not check project ${projectIdOrName} (${err.status}).`}var import_tldts6=__toESM(require_cjs(),1);function diagnoseDomain(facts,commands2){let configurationStatus=getConfigurationStatus(facts),status6=getDomainStatus2(configurationStatus,facts.project),recommendedDnsRecords=configurationStatus==="scope-resolution-required"||isPlatformManagedDomain(facts)||shouldRecommendProjectAttachment(facts)?[]:getRecommendedDnsRecords(facts),domainConnect=configurationStatus==="scope-resolution-required"||isPlatformManagedDomain(facts)||shouldRecommendProjectAttachment(facts)?null:getDomainConnectConfiguration(facts),steps=buildSteps(facts,commands2,recommendedDnsRecords,domainConnect),details=statusDetails(facts,status6,steps),issues=getDomainIssues(facts,status6,configurationStatus,steps),next=buildNextSteps(steps,commands2,status6),ok=isOkStatus(status6);return{facts,status:status6,configurationStatus,ok,exitCode:ok?0:1,details,issues,recommendedDnsRecords,steps,next}}function getConfigurationStatus(facts){let{config}=facts;return requiresScopeResolution(facts)?"scope-resolution-required":isPlatformManagedDomain(facts)?config.misconfigured?"invalid-configuration":"configured-correctly":shouldRecommendProjectAttachment(facts)?"project-attachment-recommended":config.serviceType==="zeit.world"&&config.dnssecEnabled?"dnssec-needs-to-be-disabled":config.misconfigured?"invalid-configuration":config.ipStatus==="required-change"&&hasRecommendedDnsUpdate(config)?isOwnedUnattachedHostname(facts)?"dns-change-recommended":"dns-change-required":config.ipStatus==="optional-change"&&hasRecommendedDnsUpdate(config)?"dns-change-recommended":"configured-correctly"}function getDomainStatus2(configurationStatus,project){return configurationStatus==="scope-resolution-required"?configurationStatus:project.kind==="missing"?"project-domain-missing":configurationStatus!=="configured-correctly"&&configurationStatus!=="dns-change-recommended"?configurationStatus:project.kind==="attached"&&!project.domain.verified?"verification-needed":configurationStatus}function getDomainIssues(facts,status6,configurationStatus,steps){let statuses=[],addStatus=candidate=>{candidate!=="configured-correctly"&&!statuses.includes(candidate)&&statuses.push(candidate)};return addStatus(status6),status6!=="scope-resolution-required"&&(addStatus(configurationStatus),facts.project.kind==="missing"?addStatus("project-domain-missing"):facts.project.kind==="attached"&&!facts.project.domain.verified&&addStatus("verification-needed")),statuses.map(domainStatus=>({domainStatus,...statusDetails(facts,domainStatus,steps)}))}function statusDetails(facts,status6,steps){let{domainName,project}=facts,domainConnect=getDomainConnect(steps),attachProject=steps.find(step=>step.kind==="attach-project");if(status6==="configured-correctly")return{reason:AGENT_REASON.CONFIGURED_CORRECTLY,message:project.kind==="attached"?`${domainName} has a valid configuration and is verified for project ${project.label}.`:`${domainName} has a valid configuration.`};if(status6==="verification-needed")return{reason:AGENT_REASON.VERIFICATION_NEEDED,message:project.kind==="attached"?`${domainName} needs ownership verification for project ${project.label}.`:`${domainName} needs ownership verification.`,userActionRequired:!0,hint:dnsActionHint(facts,domainConnect,"Add one of the project verification records at the DNS provider, then run the suggested verify command.")};if(status6==="invalid-configuration"){if(isPlatformManagedDomain(facts))return{reason:AGENT_REASON.INVALID_CONFIGURATION,message:`${domainName} has an invalid Vercel-managed DNS configuration.`,userActionRequired:!0,hint:"No DNS changes are required from you. Retry the check, then contact Vercel Support if the configuration remains invalid."};if(attachProject?.kind==="attach-project"){let target=attachProject.project==="<project>"?"a project":`project ${attachProject.project}`,attachInstruction=attachProject.project==="<project>"?"Attach it to a project":"Attach it";return{reason:AGENT_REASON.INVALID_CONFIGURATION,message:`${domainName} is not attached to ${target} and has an invalid DNS configuration. ${attachInstruction} and apply the recommended DNS changes, then retry verification.`,userActionRequired:!0,hint:attachProject.project==="<project>"?"Replace <project> in next[] with the project that should serve the domain, attach it, apply the recommended records or nameservers at the DNS provider, then run the suggested verify command.":"Run the domains add command in next[], apply the recommended records or nameservers at the DNS provider, then run the suggested verify command."}}else return{reason:AGENT_REASON.INVALID_CONFIGURATION,message:`${domainName} has an invalid DNS configuration. Apply the recommended DNS changes, then retry verification.`,userActionRequired:!0,hint:dnsActionHint(facts,domainConnect,"Apply the recommended records or nameservers at the DNS provider, then run the suggested verify command.")}}else return status6==="dnssec-needs-to-be-disabled"?{reason:AGENT_REASON.DNSSEC_NEEDS_TO_BE_DISABLED,message:`${domainName} uses Vercel nameservers, but DNSSEC must be disabled with the domain registrar so the nameservers can resolve globally.`,userActionRequired:!0,hint:"Disable DNSSEC with the domain registrar, then run the suggested verify command."}:status6==="dns-change-required"?{reason:AGENT_REASON.DNS_CHANGE_REQUIRED,message:`${domainName} requires a DNS change to avoid downtime.`,userActionRequired:!0,hint:dnsActionHint(facts,domainConnect,"Apply the recommended records or nameservers at the DNS provider, then run the suggested verify command.")}:status6==="dns-change-recommended"?{reason:AGENT_REASON.DNS_CHANGE_RECOMMENDED,message:`${domainName} has a valid configuration, but Vercel recommends updating its DNS records.`,hint:dnsActionHint(facts,domainConnect,"The domain is working. Apply the recommended DNS update when convenient, then re-check.")}:status6==="project-attachment-recommended"?{reason:AGENT_REASON.PROJECT_ATTACHMENT_RECOMMENDED,message:`${domainName} is owned by ${facts.contextName} but is not attached to a project.`,hint:"To use the domain, replace <project> in next[] with the project that should serve it."}:status6==="scope-resolution-required"?{reason:AGENT_REASON.SCOPE_NOT_ACCESSIBLE,message:`${domainName} exists on Vercel but is not accessible under ${facts.contextName}. Retry under the owning team before evaluating its DNS or project status.`,userActionRequired:!0,hint:"Use next[] to find the team that owns the domain, then retry in that scope."}:{reason:AGENT_REASON.PROJECT_DOMAIN_MISSING,message:project.kind==="missing"?`${domainName} is not attached to project ${project.idOrName}.`:`${domainName} is not attached to the requested project.`,hint:facts.ownership==="other-scope"?"Find the team that owns the domain using next[], then retry in that scope before changing project attachments.":"Run the domains add command in next[], then retry verification."}}function dnsActionHint(facts,domainConnect,manualHint){return facts.ownership==="other-scope"&&facts.project.kind!=="attached"?`Resolve the team that owns the domain using next[] before making DNS or project changes. ${manualHint}`:domainConnect?`Open the Cloudflare Domain Connect URL in next[] to apply the DNS changes automatically. ${manualHint}`:manualHint}function buildSteps(facts,commands2,recommendedDnsRecords,domainConnect){let scope=requiresScopeResolution(facts)?{kind:"resolve-scope",contextName:facts.contextName,teamsCommand:commands2.teamsList,verifyCommand:commands2.verify("<team>")}:null;if(scope)return[scope];let attachProject=buildAttachProjectStep(facts,commands2);if(shouldRecommendProjectAttachment(facts))return attachProject?[attachProject]:[];let steps=[];attachProject&&steps.push(attachProject);let configureDns=buildConfigureDnsStep(facts,recommendedDnsRecords,domainConnect);if(configureDns&&steps.push(configureDns),!isPlatformManagedDomain(facts)&&facts.config.serviceType==="zeit.world"&&facts.config.dnssecEnabled&&steps.push({kind:"disable-dnssec"}),!isPlatformManagedDomain(facts))for(let conflict of facts.config.conflicts??[])steps.push({kind:"remove-conflict",conflict});let verification=facts.project.kind==="attached"&&!facts.project.domain.verified?{kind:"verify-ownership",challenges:facts.project.domain.verification??[],errorMessage:facts.project.verificationError?facts.project.verificationError.serverMessage||facts.project.verificationError.message:null}:null;return verification&&steps.push(verification),steps}function buildAttachProjectStep(facts,commands2){return needsProjectAttachment(facts)?{kind:"attach-project",mode:facts.config.misconfigured?"required":"recommended",project:"<project>",command:commands2.attachProject("<project>")}:facts.project.kind==="missing"?{kind:"attach-project",mode:"required",project:facts.project.idOrName,command:commands2.attachProject(facts.project.idOrName)}:null}function buildConfigureDnsStep(facts,recommendedDnsRecords,domainConnect){if(requiresScopeResolution(facts)||isPlatformManagedDomain(facts)||shouldRecommendProjectAttachment(facts)||!needsDnsRecordChange(facts.config))return null;let methods=[];domainConnect&&methods.push({kind:"domain-connect",configuration:domainConnect});let aRecords=recommendedDnsRecords.filter(record=>record.type==="A"),cnameRecords=recommendedDnsRecords.filter(record=>record.type==="CNAME");return aRecords.length&&methods.push({kind:"a-records",records:aRecords}),cnameRecords.length&&methods.push({kind:"cname-records",records:cnameRecords}),facts.intendedNameservers.length&&!nameserversMatch(facts.config.nameservers,facts.intendedNameservers)&&methods.push({kind:"nameservers",nameservers:[...facts.intendedNameservers]}),{kind:"configure-dns",change:facts.config.misconfigured&&facts.config.configuredBy===null?"point-domain":facts.config.ipStatus==="optional-change"||isOwnedUnattachedHostname(facts)?"recommended-change":"required-change",methods}}function buildNextSteps(steps,commands2,status6){let next=[];for(let step of steps)if(step.kind==="resolve-scope")next.push({command:step.teamsCommand,when:"List teams to find the scope that owns the domain"},{command:step.verifyCommand,when:"Replace <team> with the owning team and retry"});else if(step.kind==="attach-project")next.push({command:step.command,when:step.project==="<project>"?"Replace <project> with the project that should serve the domain":"Attach the domain to the requested project"});else if(step.kind==="configure-dns"){let domainConnectMethod=step.methods.find(method=>method.kind==="domain-connect");domainConnectMethod?.kind==="domain-connect"&&next.push({command:commands2.openUrl(domainConnectMethod.configuration.applyUrl),when:"Open Cloudflare to review and apply the DNS changes automatically with Domain Connect"})}return!steps.some(step=>step.kind==="resolve-scope")&&status6!=="configured-correctly"&&status6!=="project-attachment-recommended"&&next.push({command:commands2.verify(),when:status6==="dns-change-recommended"?"Re-check after applying the recommended DNS change":"Re-check after completing the required changes"}),next}function getDomainConnect(steps){for(let step of steps){if(step.kind!=="configure-dns")continue;let method=step.methods.find(candidate=>candidate.kind==="domain-connect");if(method?.kind==="domain-connect")return method.configuration}return null}function getRecommendedDnsRecords(facts){let recommendedA=facts.config.recommendedIPv4?.find(record=>record.rank===1)?.value??[],recommendedCNAME=facts.config.recommendedCNAME?.find(record=>record.rank===1)?.value,apexName=facts.project.kind==="attached"?facts.project.domain.apexName:(0,import_tldts6.parse)(facts.domainName.replace(/^\*\./,"")).domain,name=getDnsRecordName(facts.domainName,apexName),disableProxy=isCloudflareDns(facts.config),aRecords=recommendedA.map(value=>({type:"A",name,value,...disableProxy?{disableProxy:!0}:{}})),cnameRecords=recommendedCNAME?[{type:"CNAME",name,value:recommendedCNAME,...disableProxy?{disableProxy:!0}:{}}]:[],isApex=apexName?facts.domainName.toLowerCase()===apexName.toLowerCase():null,preferred=isApex===null?[]:isApex&&!disableProxy?aRecords:cnameRecords;return preferred.length?preferred:[...aRecords,...cnameRecords]}function getDomainConnectConfiguration(facts){if(isPlatformManagedDomain(facts)||facts.project.kind!=="attached"||isWildcardDomain(facts.domainName)||!needsDnsRecordChange(facts.config)||!isCloudflareDns(facts.config))return null;let params=new URLSearchParams;facts.teamId&¶ms.set("teamId",facts.teamId);let query=params.toString(),projectId=encodeURIComponent(facts.project.domain.projectId),domain2=encodeURIComponent(facts.project.domain.name);return{protocol:"domain-connect",providerId:"cloudflare.com",providerName:"Cloudflare",applyUrl:`https://vercel.com/api/v9/projects/${projectId}/domains/${domain2}/domain-connect/apply`+(query?`?${query}`:"")}}function hasRecommendedDnsUpdate(config){return!!(config.recommendedIPv4?.some(record=>record.rank===1&&record.value.length>0)||config.recommendedCNAME?.some(record=>record.rank===1&&!!record.value))}function needsDnsRecordChange(config){return hasRecommendedDnsUpdate(config)&&(config.ipStatus==="required-change"||config.ipStatus==="optional-change"||config.misconfigured&&config.configuredBy===null)}function isOkStatus(status6){return status6==="configured-correctly"||status6==="dns-change-recommended"||status6==="project-attachment-recommended"}function isCloudflareDns(config){return config.nameservers.length>0&&config.nameservers.every(nameserver=>nameserver.toLowerCase().replace(/\.$/,"").endsWith(".ns.cloudflare.com"))}function isWildcardDomain(domainName){return domainName.startsWith("*.")}function isOwnedUnattachedHostname(facts){return facts.ownership==="current-scope"&&facts.project.kind==="none"}function needsProjectAttachment(facts){return facts.project.kind==="none"&&(facts.ownership==="current-scope"||facts.ownership==="not-found")}function shouldRecommendProjectAttachment(facts){return isOwnedUnattachedHostname(facts)&&!facts.config.misconfigured&&!(facts.config.serviceType==="zeit.world"&&facts.config.dnssecEnabled)}function requiresScopeResolution(facts){return facts.ownership==="other-scope"&&facts.project.kind!=="attached"}function isPlatformManagedDomain(facts){return facts.ownership==="platform-managed"}function nameserversMatch(current,intended){let normalize=nameservers=>[...new Set(nameservers.map(normalizeNameserver))].sort(),normalizedCurrent=normalize(current),normalizedIntended=normalize(intended);return normalizedCurrent.length===normalizedIntended.length&&normalizedCurrent.every((nameserver,index)=>nameserver===normalizedIntended[index])}function normalizeNameserver(nameserver){return nameserver.toLowerCase().replace(/\.$/,"")}function getDnsRecordName(domain2,apex){let domainName=domain2.toLowerCase(),apexName=apex?.toLowerCase();if(!apexName)return domain2;if(domainName===apexName)return"@";let suffix=`.${apexName}`;return domainName.endsWith(suffix)?domain2.slice(0,-suffix.length):domain2}var import_chalk106=__toESM(require_source(),1);function renderHumanOutput(diagnosis,elapsed2){return diagnosis.status==="configured-correctly"&&diagnosis.steps.length===0?{lead:{kind:"success",message:`${successMessage(diagnosis)} ${import_chalk106.default.gray(elapsed2)}`},sections:[]}:{lead:{kind:"log",message:`Checked ${diagnosis.facts.domainName} under ${import_chalk106.default.bold(diagnosis.facts.contextName)} ${import_chalk106.default.gray(elapsed2)}`},sections:[renderStatus(diagnosis),renderFixes(diagnosis),renderResolvedValues(diagnosis),renderNameservers(diagnosis)].filter(section=>section!==null)}}function successMessage(diagnosis){let{facts}=diagnosis,configuredBy=describeConfiguredBy(facts.config.configuredBy),suffix=facts.project.kind==="attached"?` and verified for project ${import_chalk106.default.bold(facts.project.label)}`:"";return`Valid Configuration: ${facts.domainName} is configured${configuredBy?` (${configuredBy})`:""}${suffix}`}function describeConfiguredBy(configuredBy){return configuredBy==="A"?"A record":configuredBy==="CNAME"?"CNAME record":configuredBy==="http"?"HTTP resolution, possibly behind a proxy":configuredBy==="dns-01"?"DNS-01 challenge only, not yet resolving to Vercel":null}var good=text3=>`${import_chalk106.default.green(chars_default.tick)} ${text3}`,bad=text3=>`${import_chalk106.default.red(chars_default.cross)} ${text3}`,warning=text3=>`${import_chalk106.default.yellow("!")} ${text3}`;function renderStatus(diagnosis){let{facts}=diagnosis,rows=[[import_chalk106.default.cyan("DNS Configuration"),dnsStatus(diagnosis)],[import_chalk106.default.cyan("Project"),projectStatus(diagnosis)]];return facts.ownership==="other-scope"?rows.push([import_chalk106.default.cyan("Ownership"),bad(`Not accessible under ${import_chalk106.default.bold(facts.contextName)}`)]):facts.ownership==="platform-managed"&&rows.push([import_chalk106.default.cyan("Ownership"),good("Managed by Vercel")]),facts.config.dnssecEnabled&&diagnosis.configurationStatus!=="scope-resolution-required"&&rows.push([import_chalk106.default.cyan("DNSSEC"),import_chalk106.default.yellow("Enabled")]),`
|
|
425
437
|
${import_chalk106.default.bold(" Status")}
|
|
426
438
|
|
|
427
439
|
${indent(table(rows,{hsep:4}))}
|
|
@@ -446,7 +458,7 @@ ${indent(nameservers.join(`
|
|
|
446
458
|
`).map(line2=>` ${line2}`).join(`
|
|
447
459
|
`)}function renderStructuredOutput(diagnosis){let{facts}=diagnosis,{config}=facts,dnsMethods=getDnsMethods(diagnosis),domainConnectMethod=dnsMethods.find(method=>method.kind==="domain-connect"),domainConnect=domainConnectMethod?.kind==="domain-connect"?domainConnectMethod.configuration:null,canRecommendDns=diagnosis.configurationStatus!=="scope-resolution-required"&&diagnosis.configurationStatus!=="project-attachment-recommended"&&facts.ownership!=="platform-managed",payload={status:diagnosis.ok?AGENT_STATUS.OK:AGENT_STATUS.ACTION_REQUIRED,...diagnosis.details,...diagnosis.next.length?{next:diagnosis.next}:{},...domainConnect?{domainConnect}:{},domain:facts.domainName,domainStatus:diagnosis.status,configurationStatus:diagnosis.configurationStatus,ok:diagnosis.ok,issues:diagnosis.issues,misconfigured:config.misconfigured,configuredBy:config.configuredBy,serviceType:config.serviceType,ipStatus:config.ipStatus??null,dnssecEnabled:config.dnssecEnabled??null,acceptedChallenges:config.acceptedChallenges??[],current:{nameservers:config.nameservers??[],cnames:config.cnames??[],aValues:config.aValues??[]},recommended:{ipv4:canRecommendDns?config.recommendedIPv4??[]:[],cname:canRecommendDns?config.recommendedCNAME??[]:[],records:diagnosis.recommendedDnsRecords,nameservers:getRecommendedNameservers(dnsMethods)},conflicts:diagnosis.steps.flatMap(step=>step.kind==="remove-conflict"?[step.conflict]:[]),domainOwnership:facts.ownership,project:serializeProject(facts.project)};return`${JSON.stringify(payload,null,2)}
|
|
448
460
|
`}function renderStructuredError(error){return`${JSON.stringify({status:AGENT_STATUS.ERROR,reason:error.reason,error:error.code,message:error.message,...error.next?.length?{next:error.next}:{}},null,2)}
|
|
449
|
-
`}function getDnsMethods(diagnosis){let step=diagnosis.steps.find(candidate=>candidate.kind==="configure-dns");return step?.kind==="configure-dns"?step.methods:[]}function getRecommendedNameservers(methods){let method=methods.find(candidate=>candidate.kind==="nameservers");return method?.kind==="nameservers"?method.nameservers:[]}function serializeProject(project){return project.kind==="none"?null:project.kind==="attached"?{idOrName:project.label,attached:!0,verified:project.domain.verified,verification:project.domain.verification??[],verificationError:project.verificationError?{code:project.verificationError.code||"verification_failed",message:project.verificationError.serverMessage||project.verificationError.message}:null}:{idOrName:project.idOrName,attached:!1}}async function verify(client,argv){let telemetry2=new DomainsVerifyTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(verifySubcommand.options),parsedArgs;try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return writeCommandError(client,getOutputMode(client,!1),{reason:AGENT_REASON.INVALID_ARGUMENTS,code:"invalid_arguments",message:errorMessage(error),next:[{command:buildCommandWithGlobalFlags(client.argv,"domains verify --help"),when:"See valid arguments and flags"}]})}let{args,flags}=parsedArgs,[domainName]=args;if(!domainName||args.length!==1)return writeCommandError(client,getOutputMode(client,!1),{reason:AGENT_REASON.MISSING_ARGUMENTS,code:"missing_arguments",message:"A single domain is required.",next:[{command:buildCommandWithGlobalFlags(client.argv,"domains verify <domain>"),when:"Replace <domain> with the domain to check"}],humanMessage:`${getCommandName("domains verify <domain>")} expects one argument`});let formatResult=validateJsonOutput(flags);if(!formatResult.valid)return writeCommandError(client,getOutputMode(client,!1),{reason:AGENT_REASON.INVALID_ARGUMENTS,code:"invalid_arguments",message:formatResult.error,next:[{command:buildCommandWithGlobalFlags(client.argv,`domains verify ${shellQuoteCommandArg(domainName)} --json`),when:"Retry with the supported JSON format"}]});telemetry2.trackCliArgumentDomain(domainName),telemetry2.trackCliOptionProject(flags["--project"]),telemetry2.trackCliFlagStrict(flags["--strict"]),telemetry2.trackCliOptionFormat(flags["--format"]);let options={domainName,project:flags["--project"],strict:!!flags["--strict"],outputMode:getOutputMode(client,formatResult.jsonOutput)};try{return await run2(client,options)}catch(error){return output_manager_default.stopSpinner(),isStructuredOutput(options.outputMode)?writeCommandError(client,options.outputMode,{reason:AGENT_REASON.API_ERROR,code:"api_error",message:errorMessage(error),next:[{command:buildVerifyCommand(client,options),when:"Retry the domain check"}]}):(output_manager_default.prettyError(error),1)}}async function run2(client,options){let elapsed2=stamp_default();options.outputMode==="human"&&output_manager_default.spinner(`Checking DNS configuration for ${options.domainName}`);let acquisition=await acquireVerificationFacts(client,options);if(output_manager_default.stopSpinner(),!acquisition.ok)return writeCommandError(client,options.outputMode,commandErrorForAcquisition(client,options,acquisition.error));let diagnosis=diagnoseDomain(acquisition.facts,buildDiagnosisCommands(client,options));return isStructuredOutput(options.outputMode)?client.stdout.write(renderStructuredOutput(diagnosis)):writeHumanOutput(renderHumanOutput(diagnosis,elapsed2())),diagnosis.exitCode}function getOutputMode(client,jsonOutput){return jsonOutput?"json":shouldEmitNonInteractiveCommandError(client)?"non-interactive":"human"}function isStructuredOutput(mode){return mode!=="human"}function buildDiagnosisCommands(client,options){return{teamsList:buildTeamsListCommand(client),verify:scopeOverride=>buildVerifyCommand(client,options,scopeOverride),attachProject:projectIdOrName=>{let projectArgument=projectIdOrName==="<project>"?projectIdOrName:shellQuoteCommandArg(projectIdOrName);return buildCommandWithGlobalFlags(client.argv,`domains add ${shellQuoteCommandArg(options.domainName)} ${projectArgument}`)},openUrl:openUrlInBrowserCommand}}function commandErrorForAcquisition(client,options,error){let next=error.kind==="permission-denied"?[{command:buildTeamsListCommand(client),when:"List teams to find the scope that owns the project"},{command:buildVerifyCommand(client,options,"<team>"),when:"Replace <team> with the owning team and retry"}]:[{command:error.kind==="invalid-domain"?buildCommandWithGlobalFlags(client.argv,"domains verify <domain>"):buildVerifyCommand(client,options),when:error.kind==="invalid-domain"?"Replace <domain> with a valid domain name":"Retry the domain check"}];return{reason:reasonForAcquisitionError(error),code:error.code,message:error.message,next}}function reasonForAcquisitionError(error){return error.kind==="invalid-domain"?AGENT_REASON.INVALID_DOMAIN:error.kind==="permission-denied"?AGENT_REASON.PERMISSION_DENIED:error.kind==="timeout"?"timeout":error.kind==="unexpected-dns-response"?"unexpected_dns_response":AGENT_REASON.API_ERROR}function buildVerifyCommand(client,options,scopeOverride){let parts=["domains","verify",shellQuoteCommandArg(options.domainName)];return options.project&&parts.push("--project",shellQuoteCommandArg(options.project)),options.strict&&parts.push("--strict"),options.outputMode==="json"&&parts.push("--json"),scopeOverride&&parts.push("--scope",scopeOverride),buildCommandWithGlobalFlags(client.argv,parts.join(" "),packageName,scopeOverride?{excludeFlags:["--scope","--team","-S","-T"]}:void 0)}function buildTeamsListCommand(client){return buildCommandWithGlobalFlags(client.argv,"teams ls",packageName,{excludeFlags:["--scope","--team","-S","-T"]})}function shellQuoteCommandArg(value){return/^[a-zA-Z0-9_./:@%+,=-]+$/.test(value)?value:`"${value.replace(/(["\\$`])/g,"\\$1")}"`}function writeCommandError(client,outputMode,error){return output_manager_default.stopSpinner(),isStructuredOutput(outputMode)?client.stdout.write(renderStructuredError(error)):output_manager_default.error(error.humanMessage??error.message),getExitCodeForReason(error.reason)}function writeHumanOutput(result){result.lead.kind==="success"?output_manager_default.success(result.lead.message):output_manager_default.log(result.lead.message);for(let section of result.sections)output_manager_default.print(section)}function errorMessage(error){return error instanceof Error?error.message:String(error)}var DomainsTelemetryClient=class extends TelemetryClient{trackCliSubcommandAdd(actual){this.trackCliSubcommand({subcommand:"add",value:actual})}trackCliSubcommandInspect(actual){this.trackCliSubcommand({subcommand:"inspect",value:actual})}trackCliSubcommandMove(actual){this.trackCliSubcommand({subcommand:"move",value:actual})}trackCliSubcommandBuy(actual){this.trackCliSubcommand({subcommand:"buy",value:actual})}trackCliSubcommandCheck(actual){this.trackCliSubcommand({subcommand:"check",value:actual})}trackCliSubcommandPrice(actual){this.trackCliSubcommand({subcommand:"price",value:actual})}trackCliSubcommandSearch(actual){this.trackCliSubcommand({subcommand:"search",value:actual})}trackCliSubcommandRemove(actual){this.trackCliSubcommand({subcommand:"remove",value:actual})}trackCliSubcommandTransferIn(actual){this.trackCliSubcommand({subcommand:"transfer-in",value:actual})}trackCliSubcommandRenew(actual){this.trackCliSubcommand({subcommand:"renew",value:actual})}trackCliSubcommandAutoRenew(actual){this.trackCliSubcommand({subcommand:"auto-renew",value:actual})}trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandVerify(actual){this.trackCliSubcommand({subcommand:"verify",value:actual})}};var COMMAND_CONFIG28={add:["add"],buy:["buy"],check:["check"],inspect:["inspect"],ls:["ls","list"],move:["move"],price:["price"],search:["search"],rm:["rm","remove"],transferIn:["transfer-in"],renew:["renew"],autoRenew:["auto-renew"],verify:["verify"]};async function main10(client){let parsedArgs,flagsSpecification=getFlagsSpecification(domainsCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(error){return printError(error,client),2}let telemetry2=new DomainsTelemetryClient({opts:{store:client.telemetryEventStore}}),{subcommand,args,subcommandOriginal}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG28),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("domains"),output_manager_default.print(help(domainsCommand,{columns:client.stderr.columns})),0;function printHelp(command2){return output_manager_default.print(help(command2,{parent:domainsCommand,columns:client.stderr.columns})),0}switch(subcommand){case"add":return needHelp?(telemetry2.trackCliFlagHelp("domains",subcommandOriginal),printHelp(addSubcommand4)):(telemetry2.trackCliSubcommandAdd(subcommandOriginal),add6(client,args));case"inspect":return needHelp?(telemetry2.trackCliFlagHelp("domains",subcommandOriginal),printHelp(inspectSubcommand7)):(telemetry2.trackCliSubcommandInspect(subcommandOriginal),inspect8(client,args));case"move":return needHelp?(telemetry2.trackCliFlagHelp("domains",subcommandOriginal),printHelp(moveSubcommand)):(telemetry2.trackCliSubcommandMove(subcommandOriginal),move(client,args));case"buy":return needHelp?(telemetry2.trackCliFlagHelp("domains",subcommandOriginal),printHelp(buySubcommand)):(telemetry2.trackCliSubcommandBuy(subcommandOriginal),buy(client,args));case"check":return needHelp?(telemetry2.trackCliFlagHelp("domains",subcommandOriginal),printHelp(checkSubcommand)):(telemetry2.trackCliSubcommandCheck(subcommandOriginal),check(client,args));case"price":return needHelp?(telemetry2.trackCliFlagHelp("domains",subcommandOriginal),printHelp(priceSubcommand)):(telemetry2.trackCliSubcommandPrice(subcommandOriginal),price(client,args));case"search":return needHelp?(telemetry2.trackCliFlagHelp("domains",subcommandOriginal),printHelp(searchSubcommand2)):(telemetry2.trackCliSubcommandSearch(subcommandOriginal),search(client,args));case"rm":return needHelp?(telemetry2.trackCliFlagHelp("domains",subcommandOriginal),printHelp(removeSubcommand7)):(telemetry2.trackCliSubcommandRemove(subcommandOriginal),rm6(client,args));case"transferIn":return needHelp?(telemetry2.trackCliFlagHelp("domains",subcommandOriginal),printHelp(transferInSubcommand)):(telemetry2.trackCliSubcommandTransferIn(subcommandOriginal),transferIn(client,args));case"renew":return needHelp?(telemetry2.trackCliFlagHelp("domains",subcommandOriginal),printHelp(renewSubcommand)):(telemetry2.trackCliSubcommandRenew(subcommandOriginal),renew(client,args));case"autoRenew":return needHelp?(telemetry2.trackCliFlagHelp("domains",subcommandOriginal),printHelp(autoRenewSubcommand)):(telemetry2.trackCliSubcommandAutoRenew(subcommandOriginal),autoRenew(client,args));case"verify":return needHelp?(telemetry2.trackCliFlagHelp("domains",subcommandOriginal),printHelp(verifySubcommand)):(telemetry2.trackCliSubcommandVerify(subcommandOriginal),verify(client,args));default:return needHelp?(telemetry2.trackCliFlagHelp("domains",subcommandOriginal),printHelp(listSubcommand12)):(telemetry2.trackCliSubcommandList(subcommandOriginal),ls7(client,args))}}var ExperimentsTelemetryClient=class extends TelemetryClient{trackSubcommand(subcommand,actual){this.trackCliSubcommand({subcommand,value:actual})}};function experimentsUrl(projectId){return`/v1/projects/${encodeURIComponent(projectId)}/feature-flags/experiments`}function experimentUrl(projectId,experimentIdOrSlug){return`${experimentsUrl(projectId)}/${encodeURIComponent(experimentIdOrSlug)}`}async function listExperiments(client,projectId){return(await client.fetch(experimentsUrl(projectId))).data}function getExperiment(client,projectId,experimentIdOrSlug){return client.fetch(experimentUrl(projectId,experimentIdOrSlug))}function createExperiment(client,projectId,body){return client.fetch(experimentsUrl(projectId),{method:"PUT",body})}function updateExperiment(client,projectId,experimentIdOrSlug,body){return client.fetch(experimentUrl(projectId,experimentIdOrSlug),{method:"PATCH",body})}function applyExperimentAction(client,projectId,experimentIdOrSlug,action){return client.fetch(`${experimentUrl(projectId,experimentIdOrSlug)}/actions`,{method:"POST",body:action})}async function deleteExperiment(client,projectId,experimentIdOrSlug){await client.fetch(experimentUrl(projectId,experimentIdOrSlug),{method:"DELETE"})}function getExperimentAnalysis(client,projectId,experimentId,body){return client.fetch(`/v3/projects/${encodeURIComponent(projectId)}/experiments/${encodeURIComponent(experimentId)}/results`,{method:"POST",body})}var OBSERVABILITY_EVENTS_PATH="/v1/observability/events";function observabilityEventsUrl(){let override2=process.env.VERCEL_OBSERVABILITY_EVENTS_URL;return override2||OBSERVABILITY_EVENTS_PATH}async function resolveAnalyticsProjectId(client,ownerId,projectId){let groups;try{({groups=[]}=await client.fetch("/v1/microfrontends/groups",{accountId:ownerId}))}catch{return projectId}for(let group of groups){let entry2=group.projects?.find(project=>project.id===projectId);if(!entry2)continue;let settings=entry2.microfrontends;return!settings?.enabled||settings.isDefaultApp||settings.routeObservabilityToThisProject||settings.routeObservabilityToDefaultApp===!1?projectId:group.projects?.find(project=>project.microfrontends?.isDefaultApp)?.id??projectId}return projectId}function queryAnalyticsEvents(client,ownerId,projectId,{filter,select:select2,start,end,limit,order="desc"}){return client.fetch(observabilityEventsUrl(),{method:"POST",body:{event:"vercel.analytics",scope:{ownerId,projectIds:[projectId]},timeRange:{start,end},select:select2,filter,order,limit},accountId:ownerId})}var import_chalk107=__toESM(require_source(),1),import_ms16=__toESM(require_ms(),1);var CONTAMINATION_WARNING_RATIO=.01;function safeResourceToken(value){return value&&/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(value)?value:void 0}function getExperimentIdentifier(experiment){return experiment.slug||experiment.id}function experimentToken(experiment){return safeResourceToken(experiment.slug)??safeResourceToken(experiment.id)}function command(client,template){return withGlobalFlags(client,template,{preserveProject:!0})}function buildExperimentNextCommands(client,experiment){let id2=experimentToken(experiment),flag=safeResourceToken(experiment.flagSlug);if(!id2)return[];let inspectFlag=flag?{label:"Inspect flag",command:command(client,`flags inspect ${flag}`)}:void 0;return experiment.state==="draft"?[{label:"Start experiment",command:command(client,`experiments start ${id2} --ramp <percentage>`)},{label:"Edit settings",command:command(client,`experiments update ${id2} --file <file>`)},...inspectFlag?[inspectFlag]:[],{label:"Delete experiment",command:command(client,`experiments delete ${id2} --confirm ${id2}`)}]:experiment.state==="running"?[{label:"Analyze results",command:command(client,`experiments analyze ${id2}`)},{label:"Ramp exposures",command:command(client,`experiments set-ramp ${id2} --ramp <percentage>`)},{label:"Make decision",command:command(client,`experiments decide ${id2} --winner <variant-id> --rationale <text>`)},...inspectFlag?[inspectFlag]:[]]:[{label:"Analyze results",command:command(client,`experiments analyze ${id2}`)},{label:"Return to draft",command:command(client,`experiments return-to-draft ${id2}`)},...inspectFlag?[inspectFlag]:[],{label:"Delete experiment",command:command(client,`experiments delete ${id2} --confirm ${id2}`)}]}function buildListNextCommands(client){return[{label:"Inspect experiment",command:command(client,"experiments inspect <experiment>")},{label:"Open experiments",command:command(client,"experiments open")},{label:"Create experiment",command:command(client,"experiments create --file <file>")}]}function buildDeletedNextCommands(client,experiment){let flag=safeResourceToken(experiment.flagSlug);return[...flag?[{label:"Inspect flag",command:command(client,`flags inspect ${flag}`)},{label:"Edit flag",command:command(client,`flags open ${flag}`)}]:[],{label:"List experiments",command:command(client,"experiments ls")}]}function printNextCommands(next){if(next.length===0)return;let labelWidth=Math.max(ALIGNED_LABEL_WIDTH,...next.map(item=>item.label.length+1));output_manager_default.print(`
|
|
461
|
+
`}function getDnsMethods(diagnosis){let step=diagnosis.steps.find(candidate=>candidate.kind==="configure-dns");return step?.kind==="configure-dns"?step.methods:[]}function getRecommendedNameservers(methods){let method=methods.find(candidate=>candidate.kind==="nameservers");return method?.kind==="nameservers"?method.nameservers:[]}function serializeProject(project){return project.kind==="none"?null:project.kind==="attached"?{idOrName:project.label,attached:!0,verified:project.domain.verified,verification:project.domain.verification??[],verificationError:project.verificationError?{code:project.verificationError.code||"verification_failed",message:project.verificationError.serverMessage||project.verificationError.message}:null}:{idOrName:project.idOrName,attached:!1}}async function verify(client,argv){let telemetry2=new DomainsVerifyTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(verifySubcommand.options),parsedArgs;try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return writeCommandError(client,getOutputMode(client,!1),{reason:AGENT_REASON.INVALID_ARGUMENTS,code:"invalid_arguments",message:errorMessage(error),next:[{command:buildCommandWithGlobalFlags(client.argv,"domains verify --help"),when:"See valid arguments and flags"}]})}let{args,flags}=parsedArgs,[domainName]=args;if(!domainName||args.length!==1)return writeCommandError(client,getOutputMode(client,!1),{reason:AGENT_REASON.MISSING_ARGUMENTS,code:"missing_arguments",message:"A single domain is required.",next:[{command:buildCommandWithGlobalFlags(client.argv,"domains verify <domain>"),when:"Replace <domain> with the domain to check"}],humanMessage:`${getCommandName("domains verify <domain>")} expects one argument`});let formatResult=validateJsonOutput(flags);if(!formatResult.valid)return writeCommandError(client,getOutputMode(client,!1),{reason:AGENT_REASON.INVALID_ARGUMENTS,code:"invalid_arguments",message:formatResult.error,next:[{command:buildCommandWithGlobalFlags(client.argv,`domains verify ${shellQuoteCommandArg(domainName)} --json`),when:"Retry with the supported JSON format"}]});telemetry2.trackCliArgumentDomain(domainName),telemetry2.trackCliOptionProject(flags["--project"]),telemetry2.trackCliFlagStrict(flags["--strict"]),telemetry2.trackCliOptionFormat(flags["--format"]);let options={domainName,project:flags["--project"],strict:!!flags["--strict"],outputMode:getOutputMode(client,formatResult.jsonOutput)};try{return await run2(client,options)}catch(error){return output_manager_default.stopSpinner(),isStructuredOutput(options.outputMode)?writeCommandError(client,options.outputMode,{reason:AGENT_REASON.API_ERROR,code:"api_error",message:errorMessage(error),next:[{command:buildVerifyCommand(client,options),when:"Retry the domain check"}]}):(output_manager_default.prettyError(error),1)}}async function run2(client,options){let elapsed2=stamp_default();options.outputMode==="human"&&output_manager_default.spinner(`Checking DNS configuration for ${options.domainName}`);let acquisition=await acquireVerificationFacts(client,options);if(output_manager_default.stopSpinner(),!acquisition.ok)return writeCommandError(client,options.outputMode,commandErrorForAcquisition(client,options,acquisition.error));let diagnosis=diagnoseDomain(acquisition.facts,buildDiagnosisCommands(client,options));return isStructuredOutput(options.outputMode)?client.stdout.write(renderStructuredOutput(diagnosis)):writeHumanOutput(renderHumanOutput(diagnosis,elapsed2())),diagnosis.exitCode}function getOutputMode(client,jsonOutput){return jsonOutput?"json":shouldEmitNonInteractiveCommandError(client)?"non-interactive":"human"}function isStructuredOutput(mode){return mode!=="human"}function buildDiagnosisCommands(client,options){return{teamsList:buildTeamsListCommand(client),verify:scopeOverride=>buildVerifyCommand(client,options,scopeOverride),attachProject:projectIdOrName=>{let projectArgument=projectIdOrName==="<project>"?projectIdOrName:shellQuoteCommandArg(projectIdOrName);return buildCommandWithGlobalFlags(client.argv,`domains add ${shellQuoteCommandArg(options.domainName)} ${projectArgument}`)},openUrl:openUrlInBrowserCommand}}function commandErrorForAcquisition(client,options,error){let next=error.kind==="permission-denied"?[{command:buildTeamsListCommand(client),when:"List teams to find the scope that owns the project"},{command:buildVerifyCommand(client,options,"<team>"),when:"Replace <team> with the owning team and retry"}]:[{command:error.kind==="invalid-domain"?buildCommandWithGlobalFlags(client.argv,"domains verify <domain>"):buildVerifyCommand(client,options),when:error.kind==="invalid-domain"?"Replace <domain> with a valid domain name":"Retry the domain check"}];return{reason:reasonForAcquisitionError(error),code:error.code,message:error.message,next}}function reasonForAcquisitionError(error){return error.kind==="invalid-domain"?AGENT_REASON.INVALID_DOMAIN:error.kind==="permission-denied"?AGENT_REASON.PERMISSION_DENIED:error.kind==="timeout"?"timeout":error.kind==="unexpected-dns-response"?"unexpected_dns_response":AGENT_REASON.API_ERROR}function buildVerifyCommand(client,options,scopeOverride){let parts=["domains","verify",shellQuoteCommandArg(options.domainName)];return options.project&&parts.push("--project",shellQuoteCommandArg(options.project)),options.strict&&parts.push("--strict"),options.outputMode==="json"&&parts.push("--json"),scopeOverride&&parts.push("--scope",scopeOverride),buildCommandWithGlobalFlags(client.argv,parts.join(" "),packageName,scopeOverride?{excludeFlags:["--scope","--team","-S","-T"]}:void 0)}function buildTeamsListCommand(client){return buildCommandWithGlobalFlags(client.argv,"teams ls",packageName,{excludeFlags:["--scope","--team","-S","-T"]})}function shellQuoteCommandArg(value){return/^[a-zA-Z0-9_./:@%+,=-]+$/.test(value)?value:`"${value.replace(/(["\\$`])/g,"\\$1")}"`}function writeCommandError(client,outputMode,error){return output_manager_default.stopSpinner(),isStructuredOutput(outputMode)?client.stdout.write(renderStructuredError(error)):output_manager_default.error(error.humanMessage??error.message),getExitCodeForReason(error.reason)}function writeHumanOutput(result){result.lead.kind==="success"?output_manager_default.success(result.lead.message):output_manager_default.log(result.lead.message);for(let section of result.sections)output_manager_default.print(section)}function errorMessage(error){return error instanceof Error?error.message:String(error)}var DomainsTelemetryClient=class extends TelemetryClient{trackCliSubcommandAdd(actual){this.trackCliSubcommand({subcommand:"add",value:actual})}trackCliSubcommandInspect(actual){this.trackCliSubcommand({subcommand:"inspect",value:actual})}trackCliSubcommandMove(actual){this.trackCliSubcommand({subcommand:"move",value:actual})}trackCliSubcommandBuy(actual){this.trackCliSubcommand({subcommand:"buy",value:actual})}trackCliSubcommandCheck(actual){this.trackCliSubcommand({subcommand:"check",value:actual})}trackCliSubcommandPrice(actual){this.trackCliSubcommand({subcommand:"price",value:actual})}trackCliSubcommandSearch(actual){this.trackCliSubcommand({subcommand:"search",value:actual})}trackCliSubcommandRemove(actual){this.trackCliSubcommand({subcommand:"remove",value:actual})}trackCliSubcommandTransferIn(actual){this.trackCliSubcommand({subcommand:"transfer-in",value:actual})}trackCliSubcommandRenew(actual){this.trackCliSubcommand({subcommand:"renew",value:actual})}trackCliSubcommandAutoRenew(actual){this.trackCliSubcommand({subcommand:"auto-renew",value:actual})}trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandVerify(actual){this.trackCliSubcommand({subcommand:"verify",value:actual})}};var COMMAND_CONFIG28={add:["add"],buy:["buy"],check:["check"],inspect:["inspect"],ls:["ls","list"],move:["move"],price:["price"],search:["search"],rm:["rm","remove"],transferIn:["transfer-in"],renew:["renew"],autoRenew:["auto-renew"],verify:["verify"]};async function main10(client){let parsedArgs,flagsSpecification=getFlagsSpecification(domainsCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(error){return printError(error,client),2}let telemetry2=new DomainsTelemetryClient({opts:{store:client.telemetryEventStore}}),{subcommand,args,subcommandOriginal}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG28),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("domains"),output_manager_default.print(help(domainsCommand,{columns:client.stderr.columns})),0;function printHelp(command2){return output_manager_default.print(help(command2,{parent:domainsCommand,columns:client.stderr.columns})),0}switch(subcommand){case"add":return needHelp?(telemetry2.trackCliFlagHelp("domains",subcommandOriginal),printHelp(addSubcommand)):(telemetry2.trackCliSubcommandAdd(subcommandOriginal),add6(client,args));case"inspect":return needHelp?(telemetry2.trackCliFlagHelp("domains",subcommandOriginal),printHelp(inspectSubcommand4)):(telemetry2.trackCliSubcommandInspect(subcommandOriginal),inspect8(client,args));case"move":return needHelp?(telemetry2.trackCliFlagHelp("domains",subcommandOriginal),printHelp(moveSubcommand)):(telemetry2.trackCliSubcommandMove(subcommandOriginal),move(client,args));case"buy":return needHelp?(telemetry2.trackCliFlagHelp("domains",subcommandOriginal),printHelp(buySubcommand)):(telemetry2.trackCliSubcommandBuy(subcommandOriginal),buy(client,args));case"check":return needHelp?(telemetry2.trackCliFlagHelp("domains",subcommandOriginal),printHelp(checkSubcommand)):(telemetry2.trackCliSubcommandCheck(subcommandOriginal),check(client,args));case"price":return needHelp?(telemetry2.trackCliFlagHelp("domains",subcommandOriginal),printHelp(priceSubcommand)):(telemetry2.trackCliSubcommandPrice(subcommandOriginal),price(client,args));case"search":return needHelp?(telemetry2.trackCliFlagHelp("domains",subcommandOriginal),printHelp(searchSubcommand)):(telemetry2.trackCliSubcommandSearch(subcommandOriginal),search(client,args));case"rm":return needHelp?(telemetry2.trackCliFlagHelp("domains",subcommandOriginal),printHelp(removeSubcommand3)):(telemetry2.trackCliSubcommandRemove(subcommandOriginal),rm6(client,args));case"transferIn":return needHelp?(telemetry2.trackCliFlagHelp("domains",subcommandOriginal),printHelp(transferInSubcommand)):(telemetry2.trackCliSubcommandTransferIn(subcommandOriginal),transferIn(client,args));case"renew":return needHelp?(telemetry2.trackCliFlagHelp("domains",subcommandOriginal),printHelp(renewSubcommand)):(telemetry2.trackCliSubcommandRenew(subcommandOriginal),renew(client,args));case"autoRenew":return needHelp?(telemetry2.trackCliFlagHelp("domains",subcommandOriginal),printHelp(autoRenewSubcommand)):(telemetry2.trackCliSubcommandAutoRenew(subcommandOriginal),autoRenew(client,args));case"verify":return needHelp?(telemetry2.trackCliFlagHelp("domains",subcommandOriginal),printHelp(verifySubcommand)):(telemetry2.trackCliSubcommandVerify(subcommandOriginal),verify(client,args));default:return needHelp?(telemetry2.trackCliFlagHelp("domains",subcommandOriginal),printHelp(listSubcommand5)):(telemetry2.trackCliSubcommandList(subcommandOriginal),ls7(client,args))}}var ExperimentsTelemetryClient=class extends TelemetryClient{trackSubcommand(subcommand,actual){this.trackCliSubcommand({subcommand,value:actual})}};function experimentsUrl(projectId){return`/v1/projects/${encodeURIComponent(projectId)}/feature-flags/experiments`}function experimentUrl(projectId,experimentIdOrSlug){return`${experimentsUrl(projectId)}/${encodeURIComponent(experimentIdOrSlug)}`}async function listExperiments(client,projectId){return(await client.fetch(experimentsUrl(projectId))).data}function getExperiment(client,projectId,experimentIdOrSlug){return client.fetch(experimentUrl(projectId,experimentIdOrSlug))}function createExperiment(client,projectId,body){return client.fetch(experimentsUrl(projectId),{method:"PUT",body})}function updateExperiment(client,projectId,experimentIdOrSlug,body){return client.fetch(experimentUrl(projectId,experimentIdOrSlug),{method:"PATCH",body})}function applyExperimentAction(client,projectId,experimentIdOrSlug,action){return client.fetch(`${experimentUrl(projectId,experimentIdOrSlug)}/actions`,{method:"POST",body:action})}async function deleteExperiment(client,projectId,experimentIdOrSlug){await client.fetch(experimentUrl(projectId,experimentIdOrSlug),{method:"DELETE"})}function getExperimentAnalysis(client,projectId,experimentId,body){return client.fetch(`/v3/projects/${encodeURIComponent(projectId)}/experiments/${encodeURIComponent(experimentId)}/results`,{method:"POST",body})}var OBSERVABILITY_EVENTS_PATH="/v1/observability/events";function observabilityEventsUrl(){let override2=process.env.VERCEL_OBSERVABILITY_EVENTS_URL;return override2||OBSERVABILITY_EVENTS_PATH}async function resolveAnalyticsProjectId(client,ownerId,projectId){let groups;try{({groups=[]}=await client.fetch("/v1/microfrontends/groups",{accountId:ownerId}))}catch{return projectId}for(let group of groups){let entry2=group.projects?.find(project=>project.id===projectId);if(!entry2)continue;let settings=entry2.microfrontends;return!settings?.enabled||settings.isDefaultApp||settings.routeObservabilityToThisProject||settings.routeObservabilityToDefaultApp===!1?projectId:group.projects?.find(project=>project.microfrontends?.isDefaultApp)?.id??projectId}return projectId}function queryAnalyticsEvents(client,ownerId,projectId,{filter,select:select2,start,end,limit,order="desc"}){return client.fetch(observabilityEventsUrl(),{method:"POST",body:{event:"vercel.analytics",scope:{ownerId,projectIds:[projectId]},timeRange:{start,end},select:select2,filter,order,limit},accountId:ownerId})}var import_chalk107=__toESM(require_source(),1),import_ms16=__toESM(require_ms(),1);var CONTAMINATION_WARNING_RATIO=.01;function safeResourceToken(value){return value&&/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(value)?value:void 0}function getExperimentIdentifier(experiment){return experiment.slug||experiment.id}function experimentToken(experiment){return safeResourceToken(experiment.slug)??safeResourceToken(experiment.id)}function command(client,template){return withGlobalFlags(client,template,{preserveProject:!0})}function buildExperimentNextCommands(client,experiment){let id2=experimentToken(experiment),flag=safeResourceToken(experiment.flagSlug);if(!id2)return[];let inspectFlag=flag?{label:"Inspect flag",command:command(client,`flags inspect ${flag}`)}:void 0;return experiment.state==="draft"?[{label:"Start experiment",command:command(client,`experiments start ${id2} --ramp <percentage>`)},{label:"Edit settings",command:command(client,`experiments update ${id2} --file <file>`)},...inspectFlag?[inspectFlag]:[],{label:"Delete experiment",command:command(client,`experiments delete ${id2} --confirm ${id2}`)}]:experiment.state==="running"?[{label:"Analyze results",command:command(client,`experiments analyze ${id2}`)},{label:"Ramp exposures",command:command(client,`experiments set-ramp ${id2} --ramp <percentage>`)},{label:"Make decision",command:command(client,`experiments decide ${id2} --winner <variant-id> --rationale <text>`)},...inspectFlag?[inspectFlag]:[]]:[{label:"Analyze results",command:command(client,`experiments analyze ${id2}`)},{label:"Return to draft",command:command(client,`experiments return-to-draft ${id2}`)},...inspectFlag?[inspectFlag]:[],{label:"Delete experiment",command:command(client,`experiments delete ${id2} --confirm ${id2}`)}]}function buildListNextCommands(client){return[{label:"Inspect experiment",command:command(client,"experiments inspect <experiment>")},{label:"Open experiments",command:command(client,"experiments open")},{label:"Create experiment",command:command(client,"experiments create --file <file>")}]}function buildDeletedNextCommands(client,experiment){let flag=safeResourceToken(experiment.flagSlug);return[...flag?[{label:"Inspect flag",command:command(client,`flags inspect ${flag}`)},{label:"Edit flag",command:command(client,`flags open ${flag}`)}]:[],{label:"List experiments",command:command(client,"experiments ls")}]}function printNextCommands(next){if(next.length===0)return;let labelWidth=Math.max(ALIGNED_LABEL_WIDTH,...next.map(item=>item.label.length+1));output_manager_default.print(`
|
|
450
462
|
`);for(let item of next)printAlignedLabel(item.label,`\`${item.command}\``,{labelWidth,emphasis:"subtle"})}function printExperimentsTable(experiments2){let now=Date.now(),rows=experiments2.map(experiment=>[import_chalk107.default.bold(getExperimentIdentifier(experiment)),experiment.state,experiment.decision?.outcome??"\u2014",experiment.flagSlug,experiment.rampPercentage===void 0?"\u2014":`${experiment.rampPercentage}%`,`${(0,import_ms16.default)(now-experiment.updatedAt)} ago`]);output_manager_default.print(`
|
|
451
463
|
${formatTable(["Experiment","State","Decision","Flag","Ramp","Updated"],["l","l","l","l","r","l"],[{name:"",rows}])}
|
|
452
464
|
`)}function formatTimestamp2(timestamp2){return timestamp2===void 0?"\u2014":new Date(timestamp2).toISOString()}function printExperimentDetails(experiment){let metricCount=Object.keys(experiment.metrics??{}).length,decision=experiment.decision?experiment.decision.outcome==="winner"?`Winner: ${experiment.decision.winnerVariantId??"unknown"}`:"Abandoned":"\u2014";printAlignedLabel("Experiment",experiment.name),printAlignedLabel("ID",experiment.id),printAlignedLabel("Slug",experiment.slug??"\u2014"),printAlignedLabel("State",experiment.state),printAlignedLabel("Feature Flag",experiment.flagSlug),printAlignedLabel("Unit",experimentUnitLabel(experiment)),printAlignedLabel("Target",`${experiment.targetPercentage}%`),printAlignedLabel("Ramp",experiment.rampPercentage===void 0?"\u2014":`${experiment.rampPercentage}%`),printAlignedLabel("Control",experiment.controlVariantId),printAlignedLabel("Variants",String(experiment.variants.length)),printAlignedLabel("Metrics",String(metricCount)),printAlignedLabel("Decision",decision),printAlignedLabel("Ramp ID",experiment.rampId??"\u2014"),printAlignedLabel("Created",formatTimestamp2(experiment.createdAt)),printAlignedLabel("Updated",formatTimestamp2(experiment.updatedAt))}function metricRole(experiment,alias2){return experiment.primaryMetric===alias2?"Primary":experiment.guardrailMetrics?.includes(alias2)?"Guardrail":experiment.secondaryMetrics?.includes(alias2)?"Secondary":"Other"}function formatPercentage(value){return value==null?"\u2014":`${(value*100).toFixed(2)}%`}function metricValue(type,variant){switch(type){case"conversion":return formatPercentage(variant.conversionRate);case"funnel":return formatPercentage(variant.overallRate);case"retention":return formatPercentage(variant.retentionRate);case"mean":return variant.mean?.toFixed(3)??"\u2014";case"ratio":return variant.ratio?.toFixed(3)??"\u2014";default:return"\u2014"}}function assessExperimentAnalysis(experiment,analysis){let issues=[],hasSampleSizeEstimate=!1;for(let[alias2,metric]of Object.entries(analysis.metrics)){let control=metric.variants.find(variant=>variant.isBaseline);if(control)for(let variant of metric.variants){if(variant.isBaseline||variant.requiredSampleSize==null)continue;hasSampleSizeEstimate=!0;let smallerArm=Math.min(control.exposedUnits,variant.exposedUnits);smallerArm>=variant.requiredSampleSize||issues.push({metric:alias2,role:metricRole(experiment,alias2),variantId:variant.variantId,controlUnits:control.exposedUnits,variantUnits:variant.exposedUnits,requiredUnitsPerArm:variant.requiredSampleSize,remainingUnitsInSmallerArm:variant.requiredSampleSize-smallerArm})}}let reasons=[],hasExposureInvariantFailure=analysis.warnings.some(warning2=>warning2.startsWith("Exposure invariant failed")),includesMaterialContamination=(analysis.contamination.totalUnits>0?analysis.contamination.contaminatedUnits/analysis.contamination.totalUnits:0)>=CONTAMINATION_WARNING_RATIO&&!analysis.excludeContaminated;analysis.srm.isValid||reasons.push("sample_ratio_mismatch"),hasExposureInvariantFailure&&reasons.push("exposure_invariant_failed"),includesMaterialContamination&&reasons.push("contamination_included"),issues.length>0&&reasons.push("insufficient_sample_size");let trust;return!analysis.srm.isValid||hasExposureInvariantFailure?trust={status:"failed",summary:!analysis.srm.isValid&&hasExposureInvariantFailure?"Do not trust \u2014 data quality checks failed":analysis.srm.isValid?"Do not trust \u2014 exposure counts disagree":"Do not trust \u2014 sample ratio mismatch",reasons}:includesMaterialContamination?trust={status:"caution",summary:"Use caution \u2014 contaminated units are included",reasons}:issues.length>0?trust={status:"directional",summary:"Directional only \u2014 insufficient sample size",reasons}:trust={status:"passed",summary:"Health checks passed",reasons},{trust,sampleSize:{status:issues.length>0?"insufficient":hasSampleSizeEstimate?"no_insufficiency_detected":"unavailable",issues}}}function printAnalysisWarning(message){output_manager_default.print(`${import_chalk107.default.yellow("!")} ${message}
|
|
@@ -1097,11 +1109,11 @@ Starting setup...
|
|
|
1097
1109
|
`),output_manager_default.print("\u2500".repeat(50)+`
|
|
1098
1110
|
`),summary.forEach(line2=>output_manager_default.print(`${line2}
|
|
1099
1111
|
`)),output_manager_default.print(`Complete any required setup and authentication in the selected MCP clients. Restart configured clients if needed.
|
|
1100
|
-
`),0}var MCP_CLIENTS=[{slug:"claude-code",display:"Claude Code"},{slug:"claude-desktop",display:"Claude.ai and Claude for desktop"},{slug:"cursor",display:"Cursor"},{slug:"vscode-copilot",display:"VS Code with Copilot"}],MCP_CLIENT_DISPLAY_NAMES=MCP_CLIENTS.map(c=>c.display);function buildSuggestedMcpCommand(client,clientsValue){let args=client.argv.slice(2),preserved=[],hasNonInteractive=!1;for(let i=1;i<args.length;i++){let arg2=args[i];if(arg2==="--non-interactive"){hasNonInteractive=!0;continue}if(arg2==="--clients"){for(i++;i<args.length&&!args[i].startsWith("-");)i++;i--;continue}arg2.startsWith("--clients=")||preserved.push(arg2)}let singleQuotedClients=`'${clientsValue}'`;preserved.push("--clients",singleQuotedClients),hasNonInteractive&&preserved.push("--non-interactive");let suffix=preserved.join(" ");return suffix?`${packageName} mcp ${suffix}`:`${packageName} mcp`}function parseAndValidateClients(clientsFlag){if(!clientsFlag||!clientsFlag.trim())return[];let normalized=clientsFlag.split(",").map(s=>s.trim()).filter(Boolean).map(name=>{let lower=name.toLowerCase();return MCP_CLIENT_DISPLAY_NAMES.find(c=>c.toLowerCase()===lower)??name});return[...new Set(normalized)]}async function main27(client){let parsedArgs,flagsSpecification=getFlagsSpecification(mcpCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return printError(error),2}if(parsedArgs.flags["--help"])return output_manager_default.print(help(mcpCommand,{columns:client.stderr.columns})),0;let project=!!parsedArgs.flags["--project"],clientsFlag=parsedArgs.flags["--clients"],clients=parseAndValidateClients(clientsFlag);if(client.nonInteractive){if(clients.length===0)return outputAgentError(client,{status:"error",reason:"missing_clients",message:"In non-interactive mode --clients is required. Specify a comma-separated list of MCP clients to set up.",next:[{command:buildSuggestedMcpCommand(client,"Cursor,VS Code with Copilot")}]},2),2;let invalid=clients.filter(c=>!MCP_CLIENT_DISPLAY_NAMES.some(v=>v===c));if(invalid.length>0)return outputAgentError(client,{status:"error",reason:"invalid_clients",message:`Invalid client(s): ${invalid.join(", ")}. Valid options: ${MCP_CLIENT_DISPLAY_NAMES.join(", ")}.`,next:[{command:buildSuggestedMcpCommand(client,"Cursor,VS Code with Copilot")}]},2),2}project&&client.argv.push("--project");try{return await mcp(client,{project,clients})}catch(err){return output_manager_default.prettyError(err),1}}var MetricsTelemetryClient=class extends TelemetryClient{trackCliSubcommandQuery(v){v&&this.trackCliSubcommand({subcommand:"query",value:v})}trackCliSubcommandSchema(v){v&&this.trackCliSubcommand({subcommand:"schema",value:v})}trackCliArgumentMetricId(v){v&&this.trackCliArgument({arg:"metric-id",value:v})}trackCliOptionAggregation(v){v&&this.trackCliOption({option:"aggregation",value:v})}trackCliOptionGroupBy(v){v&&v.length>0&&this.trackCliOption({option:"group-by",value:v.join(",")})}trackCliOptionLimit(v){typeof v=="number"&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliOptionOrderBy(v){v&&this.trackCliOption({option:"order-by",value:v})}trackCliOptionOrder(v){v&&this.trackCliOption({option:"order",value:v})}trackCliOptionFilter(v){v&&v.length>0&&this.trackCliOption({option:"filter",value:this.redactedValue})}trackCliFlagProd(v){v&&this.trackCliFlag("prod")}trackCliOptionSince(v){v&&this.trackCliOption({option:"since",value:this.redactedValue})}trackCliOptionUntil(v){v&&this.trackCliOption({option:"until",value:this.redactedValue})}trackCliOptionGranularity(v){v&&this.trackCliOption({option:"granularity",value:v})}trackCliOptionBucketTimezone(v){v&&this.trackCliOption({option:"bucket-timezone",value:v})}trackCliOptionProject(v){v&&this.trackCliOption({option:"project",value:this.redactedValue})}trackCliFlagAll(v){v&&this.trackCliFlag("all")}trackCliFlagJson(json){json&&this.trackCliFlag("json")}trackCliError(code2,status6){this.trackErrorCode(code2),this.trackErrorStatus(status6)}};var COMMAND_CONFIG53={schema:getCommandAliases(schemaSubcommand)};async function metrics(client){let telemetry2=new MetricsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(metricsCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err,client),2}let subArgs=parsedArgs.args.slice(1),{subcommand,subcommandOriginal}=getSubcommand7(subArgs,COMMAND_CONFIG53),positionalMetric=subArgs[0]==="query"?subArgs[1]:subArgs[0],needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("metrics",subcommand),output_manager_default.print(help(metricsCommand,{columns:client.stderr.columns})),0;function printSubHelp(command2){output_manager_default.print(help(command2,{parent:metricsCommand,columns:client.stderr.columns}))}switch(subcommand){case"schema":{if(needHelp)return telemetry2.trackCliFlagHelp("metrics",subcommandOriginal),printSubHelp(schemaSubcommand),0;telemetry2.trackCliSubcommandSchema(subcommandOriginal);let schemaFn=(await import("./chunks/schema-
|
|
1112
|
+
`),0}var MCP_CLIENTS=[{slug:"claude-code",display:"Claude Code"},{slug:"claude-desktop",display:"Claude.ai and Claude for desktop"},{slug:"cursor",display:"Cursor"},{slug:"vscode-copilot",display:"VS Code with Copilot"}],MCP_CLIENT_DISPLAY_NAMES=MCP_CLIENTS.map(c=>c.display);function buildSuggestedMcpCommand(client,clientsValue){let args=client.argv.slice(2),preserved=[],hasNonInteractive=!1;for(let i=1;i<args.length;i++){let arg2=args[i];if(arg2==="--non-interactive"){hasNonInteractive=!0;continue}if(arg2==="--clients"){for(i++;i<args.length&&!args[i].startsWith("-");)i++;i--;continue}arg2.startsWith("--clients=")||preserved.push(arg2)}let singleQuotedClients=`'${clientsValue}'`;preserved.push("--clients",singleQuotedClients),hasNonInteractive&&preserved.push("--non-interactive");let suffix=preserved.join(" ");return suffix?`${packageName} mcp ${suffix}`:`${packageName} mcp`}function parseAndValidateClients(clientsFlag){if(!clientsFlag||!clientsFlag.trim())return[];let normalized=clientsFlag.split(",").map(s=>s.trim()).filter(Boolean).map(name=>{let lower=name.toLowerCase();return MCP_CLIENT_DISPLAY_NAMES.find(c=>c.toLowerCase()===lower)??name});return[...new Set(normalized)]}async function main27(client){let parsedArgs,flagsSpecification=getFlagsSpecification(mcpCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return printError(error),2}if(parsedArgs.flags["--help"])return output_manager_default.print(help(mcpCommand,{columns:client.stderr.columns})),0;let project=!!parsedArgs.flags["--project"],clientsFlag=parsedArgs.flags["--clients"],clients=parseAndValidateClients(clientsFlag);if(client.nonInteractive){if(clients.length===0)return outputAgentError(client,{status:"error",reason:"missing_clients",message:"In non-interactive mode --clients is required. Specify a comma-separated list of MCP clients to set up.",next:[{command:buildSuggestedMcpCommand(client,"Cursor,VS Code with Copilot")}]},2),2;let invalid=clients.filter(c=>!MCP_CLIENT_DISPLAY_NAMES.some(v=>v===c));if(invalid.length>0)return outputAgentError(client,{status:"error",reason:"invalid_clients",message:`Invalid client(s): ${invalid.join(", ")}. Valid options: ${MCP_CLIENT_DISPLAY_NAMES.join(", ")}.`,next:[{command:buildSuggestedMcpCommand(client,"Cursor,VS Code with Copilot")}]},2),2}project&&client.argv.push("--project");try{return await mcp(client,{project,clients})}catch(err){return output_manager_default.prettyError(err),1}}var MetricsTelemetryClient=class extends TelemetryClient{trackCliSubcommandQuery(v){v&&this.trackCliSubcommand({subcommand:"query",value:v})}trackCliSubcommandSchema(v){v&&this.trackCliSubcommand({subcommand:"schema",value:v})}trackCliArgumentMetricId(v){v&&this.trackCliArgument({arg:"metric-id",value:v})}trackCliOptionAggregation(v){v&&this.trackCliOption({option:"aggregation",value:v})}trackCliOptionGroupBy(v){v&&v.length>0&&this.trackCliOption({option:"group-by",value:v.join(",")})}trackCliOptionLimit(v){typeof v=="number"&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliOptionOrderBy(v){v&&this.trackCliOption({option:"order-by",value:v})}trackCliOptionOrder(v){v&&this.trackCliOption({option:"order",value:v})}trackCliOptionFilter(v){v&&v.length>0&&this.trackCliOption({option:"filter",value:this.redactedValue})}trackCliFlagProd(v){v&&this.trackCliFlag("prod")}trackCliOptionSince(v){v&&this.trackCliOption({option:"since",value:this.redactedValue})}trackCliOptionUntil(v){v&&this.trackCliOption({option:"until",value:this.redactedValue})}trackCliOptionGranularity(v){v&&this.trackCliOption({option:"granularity",value:v})}trackCliOptionBucketTimezone(v){v&&this.trackCliOption({option:"bucket-timezone",value:v})}trackCliOptionProject(v){v&&this.trackCliOption({option:"project",value:this.redactedValue})}trackCliFlagAll(v){v&&this.trackCliFlag("all")}trackCliFlagJson(json){json&&this.trackCliFlag("json")}trackCliError(code2,status6){this.trackErrorCode(code2),this.trackErrorStatus(status6)}};var COMMAND_CONFIG53={schema:getCommandAliases(schemaSubcommand)};async function metrics(client){let telemetry2=new MetricsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(metricsCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err,client),2}let subArgs=parsedArgs.args.slice(1),{subcommand,subcommandOriginal}=getSubcommand7(subArgs,COMMAND_CONFIG53),positionalMetric=subArgs[0]==="query"?subArgs[1]:subArgs[0],needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("metrics",subcommand),output_manager_default.print(help(metricsCommand,{columns:client.stderr.columns})),0;function printSubHelp(command2){output_manager_default.print(help(command2,{parent:metricsCommand,columns:client.stderr.columns}))}switch(subcommand){case"schema":{if(needHelp)return telemetry2.trackCliFlagHelp("metrics",subcommandOriginal),printSubHelp(schemaSubcommand),0;telemetry2.trackCliSubcommandSchema(subcommandOriginal);let schemaFn=(await import("./chunks/schema-OGGOD3HX.js")).default;return schemaFn(client,telemetry2)}default:{if(needHelp)return telemetry2.trackCliFlagHelp("metrics",subcommandOriginal),output_manager_default.print(help(metricsCommand,{columns:client.stderr.columns})),0;if(!positionalMetric)return output_manager_default.print(help(metricsCommand,{columns:client.stderr.columns})),2;let queryFn=(await import("./chunks/query-IEBWCCMJ.js")).default;return queryFn(client,telemetry2)}}}var import_chalk250=__toESM(require_source(),1);import{join as join35}from"node:path";var import_fs_extra=__toESM(require_lib(),1);var VERCEL_DIR=".vercel",VERCEL_DIR_MICROFRONTENDS="microfrontends.json";async function pull2(client){let parsedArgs,flagsSpecification=getFlagsSpecification(pullSubcommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return printError(error),2}let autoConfirm=!!parsedArgs.flags["--yes"],link=await ensureLink("microfrontends",client,client.cwd,{autoConfirm});if(typeof link=="number")return link;let{project,org,repoRoot}=link,currentDirectory;repoRoot?currentDirectory=join35(repoRoot,project.rootDirectory||""):currentDirectory=client.cwd,client.config.currentTeam=org.type==="team"?org.id:void 0;let contextName=await getContextName(client);output_manager_default.spinner(`Fetching microfrontends configuration in ${import_chalk250.default.bold(contextName)}`);let rawConfig,dpl=parsedArgs.flags["--dpl"];try{if(dpl){let{config}=await client.fetch(`/v1/microfrontends/${dpl}/config`,{method:"GET"});rawConfig=config}else{let projectId=project.id,{config}=await client.fetch(`/v1/microfrontends/projects/${projectId}/production-mfe-config`,{method:"GET"});rawConfig=config}let sanitizedConfig={...rawConfig,applications:Object.fromEntries(Object.entries(rawConfig.applications).map(([name,app])=>[name,{...app,projectId:void 0}]))};output_manager_default.stopSpinner();let path3=join35(currentDirectory,VERCEL_DIR,VERCEL_DIR_MICROFRONTENDS);await(0,import_fs_extra.outputJSON)(path3,sanitizedConfig,{spaces:2});let microfrontendsStamp=stamp_default();return output_manager_default.print(`${prependEmoji(`Downloaded microfrontends configuration to ${import_chalk250.default.bold(humanizePath(join35(currentDirectory,VERCEL_DIR,VERCEL_DIR_MICROFRONTENDS)))} ${import_chalk250.default.gray(microfrontendsStamp())}`,emoji("success"))}
|
|
1101
1113
|
`),0}catch(error){return output_manager_default.stopSpinner(),printError(error),1}}var import_chalk251=__toESM(require_source(),1);import{writeFile as writeFile6}from"fs/promises";import{existsSync as existsSync3}from"fs";import{join as join36}from"path";async function ensureMicrofrontendsContext(client,options){let link=await ensureLink("microfrontends",client,client.cwd,{autoConfirm:options?.autoConfirm});if(typeof link=="number")return link;let{project,org,repoRoot}=link;if(org.type!=="team")return output_manager_default.error("Microfrontends are only available for teams."),1;client.config.currentTeam=org.id;let{team}=await getScope(client);return team?{project,org,team,repoRoot}:(output_manager_default.error("Microfrontends are only available for teams."),1)}async function fetchMicrofrontendsGroups(client,teamId){output_manager_default.spinner("Fetching microfrontends groups\u2026");let response=await client.fetch(`/v1/microfrontends/groups?teamId=${teamId}`,{method:"GET"});return output_manager_default.stopSpinner(),response}function validateDefaultRoute(path3){if(!path3||!path3.startsWith("/"))return"Route must start with /";if(/\s/.test(path3))return"Route must not contain spaces";if(path3.includes("?")||path3.includes("#"))return"Route must not contain query strings or fragments";try{new URL(path3,"http://n")}catch{return"Route is not a valid URL path"}return!0}function validateRoutingPath(path3){return!path3||!path3.startsWith("/")?"Path must start with /. See https://vercel.com/docs/microfrontends/path-routing for supported syntax.":/\s/.test(path3)?"Path must not contain spaces. See https://vercel.com/docs/microfrontends/path-routing for supported syntax.":!0}var MAX_GROUP_NAME_LENGTH=48;async function createGroup(client){let parsedArgs,flagsSpecification=getFlagsSpecification(createGroupSubcommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return printError(error),2}let{team}=await getScope(client);if(!team)return output_manager_default.error("Microfrontends are only available for teams."),1;let teamSlug=team.slug;output_manager_default.log("A microfrontends group allows multiple projects to be composed into one application with a seamless user experience."),output_manager_default.log(`Creating a new microfrontends group for team ${import_chalk251.default.bold(teamSlug)}.`),output_manager_default.log("");let groupsResponse=await fetchMicrofrontendsGroups(client,team.id),{groups,maxMicrofrontendsGroupsPerTeam,maxMicrofrontendsPerGroup}=groupsResponse,plan=team.billing.plan,isProTrialPlan=team.billing.plan==="pro"&&team.billing.status==="trialing",isLimitedPlan=isProTrialPlan||plan==="hobby";if(groups.length>=maxMicrofrontendsGroupsPerTeam){if(isLimitedPlan){let planName=isProTrialPlan?"Pro Trial":"Hobby",url=getTeamBillingUrl(teamSlug);return output_manager_default.log(`You've reached the microfrontends group limit for ${planName}. Upgrade to Pro to create more groups.`),output_manager_default.log(`Upgrade: ${output_manager_default.link(url,url,{fallback:!1})}`),1}return output_manager_default.error(`Maximum number of microfrontends groups (${maxMicrofrontendsGroupsPerTeam}) reached.`),1}let existingMfeProjectCount=groups.reduce((count2,g)=>count2+g.projects.length,0),freeProjects=2;if(isLimitedPlan&&existingMfeProjectCount+1>freeProjects){let planName=isProTrialPlan?"Pro Trial":"Hobby",url=`https://vercel.com/${teamSlug}/~/settings/billing`;return output_manager_default.log(`You've reached the microfrontends project limit for ${planName}. Upgrade to Pro to add more projects.`),output_manager_default.log(`Upgrade: ${output_manager_default.link(url,url,{fallback:!1})}`),1}let nameFlag=parsedArgs.flags["--name"],projectFlags=parsedArgs.flags["--project"],defaultAppFlag=parsedArgs.flags["--default-app"],defaultRouteFlag=parsedArgs.flags["--default-route"],projectDefaultRouteFlags=parsedArgs.flags["--project-default-route"],autoConfirm=!!parsedArgs.flags["--yes"],isNonInteractive=client.nonInteractive||client.argv.includes("--non-interactive");if(isNonInteractive){if(!nameFlag)return output_manager_default.error("Missing required flag --name. Use --name in non-interactive mode."),2;if(!projectFlags||projectFlags.length===0)return output_manager_default.error("Missing required flag --project. Use --project in non-interactive mode."),2;if(projectFlags.length>1&&!defaultAppFlag)return output_manager_default.error("Missing required flag --default-app when using multiple --project values in non-interactive mode."),2}let projectsToAddCount=projectFlags?.length??1;if(existingMfeProjectCount+projectsToAddCount>freeProjects){if(isNonInteractive){let flags=getGlobalFlagsFromArgs(client.argv.slice(2)),interactiveCmd=getCommandNamePlain(`microfrontends create-group ${flags.filter(f=>f!=="--non-interactive").join(" ")}`.trim());return outputAgentError(client,{status:"error",reason:"purchase_requires_user",message:"Creating a microfrontends group affects billing and cannot be performed non-interactively. Agents must not make billing changes on behalf of a user. The user must run this command interactively in a terminal to review billing details and confirm, or complete the action in the Vercel dashboard.",next:[{command:interactiveCmd,when:"user runs this command interactively (remove --non-interactive)"}]},1),1}if(!client.stdin.isTTY)return output_manager_default.error("This command must be run interactively because it affects billing."),1}let groupName;if(nameFlag){let validation=validateGroupName(nameFlag,groups);if(validation!==!0)return output_manager_default.error(validation),1;groupName=nameFlag}else groupName=await client.input.text({message:"Group name:",validate:val=>validateGroupName(val,groups)});let selectedProjects;if(projectFlags){selectedProjects=[];for(let name of projectFlags)try{let project=await getProjectByNameOrId(client,name,team.id);if(project instanceof ProjectNotFound)return output_manager_default.error(`Project "${name}" not found.`),1;selectedProjects.push(project)}catch{return output_manager_default.error(`Project "${name}" not found.`),1}}else{output_manager_default.spinner("Fetching projects\u2026");let firstPage=await client.fetch(`/v9/projects?limit=100&teamId=${team.id}`,{method:"GET"});output_manager_default.stopSpinner();let allProjects=firstPage.projects,hasMoreProjects=firstPage.pagination.next!==null,availableProjects=allProjects.filter(p=>!isProjectInMicrofrontendsGroup(p,groups));selectedProjects=[];let addMore=!0;for(;addMore;){let project;if(hasMoreProjects)await client.input.text({message:selectedProjects.length===0?"Type a project name to add:":"Type another project name to add:",validate:async val=>{if(!val)return"Project name cannot be empty";let result=await getProjectByNameOrId(client,val,team.id);return result instanceof ProjectNotFound?"Project not found":isProjectInMicrofrontendsGroup(result,groups)?`Project "${val}" is already in a microfrontends group`:selectedProjects.some(s=>s.id===result.id)?`Project "${val}" is already selected`:(project=result,!0)}});else{if(availableProjects.length===0){if(selectedProjects.length===0)return output_manager_default.error("No available projects. All projects are already in a microfrontends group."),1;break}let remaining=availableProjects.filter(p=>!selectedProjects.some(s=>s.id===p.id));if(remaining.length===0)break;let projectId=await client.input.select({message:selectedProjects.length===0?"Select a project to add:":"Select another project to add:",choices:remaining.map(p=>({name:p.name,value:p.id}))});project=availableProjects.find(p=>p.id===projectId)}project&&selectedProjects.push(project),addMore=await client.input.confirm("Add another project?",!1)}if(selectedProjects.length===0)return output_manager_default.error("At least one project must be selected."),1}if(selectedProjects.length>maxMicrofrontendsPerGroup)return output_manager_default.error(`Cannot add more than ${maxMicrofrontendsPerGroup} projects to a group.`),1;let defaultApp;if(defaultAppFlag){let found=selectedProjects.find(p=>p.name===defaultAppFlag);if(!found)return output_manager_default.error(`Default app "${defaultAppFlag}" must be one of the selected projects.`),2;defaultApp=found}else if(selectedProjects.length===1)defaultApp=selectedProjects[0];else{let defaultAppId=await client.input.select({message:"Select the default application:",choices:selectedProjects.map(p=>({name:p.name,value:p.id}))});defaultApp=selectedProjects.find(p=>p.id===defaultAppId)}let defaultRoute;if(defaultRouteFlag){let validation=validateDefaultRoute(defaultRouteFlag);if(validation!==!0)return output_manager_default.error(validation),1;defaultRoute=defaultRouteFlag}else defaultRoute="/";let otherProjects=selectedProjects.filter(p=>p.id!==defaultApp.id),parsedProjectDefaultRoutes=parseProjectDefaultRouteFlags(projectDefaultRouteFlags,selectedProjects,defaultApp);if(typeof parsedProjectDefaultRoutes=="string")return output_manager_default.error(parsedProjectDefaultRoutes),1;let otherApplications=[];for(let project of otherProjects){let routeFromFlag=parsedProjectDefaultRoutes.get(project.id),route;if(routeFromFlag)route=routeFromFlag;else{if(isNonInteractive)return output_manager_default.error(`Missing required flag --project-default-route for "${project.name}". Use --project-default-route=${project.name}=/<path> in non-interactive mode.`),2;route=await client.input.text({message:`Default route for "${project.name}":`,validate:validateDefaultRoute})}otherApplications.push({projectId:project.id,defaultRoute:route})}let newProjectCount=selectedProjects.length,totalAfter=existingMfeProjectCount+newProjectCount;output_manager_default.log(""),output_manager_default.log(import_chalk251.default.bold("Billing")),output_manager_default.log(` ${import_chalk251.default.bold("Team:")} ${teamSlug}`),output_manager_default.log(` ${import_chalk251.default.bold("Adding:")} ${newProjectCount} microfrontends project${newProjectCount>1?"s":""}`);let projectFee;if(totalAfter<=freeProjects)projectFee=import_chalk251.default.green("Free")+` (first ${freeProjects} included)`;else if(existingMfeProjectCount>=freeProjects)projectFee=import_chalk251.default.yellow(`$250.00/month x ${newProjectCount}`)+` project${newProjectCount>1?"s":""}`;else{let freeRemaining=freeProjects-existingMfeProjectCount,paidProjects=newProjectCount-freeRemaining;projectFee=import_chalk251.default.green(`${freeRemaining} free`)+", "+import_chalk251.default.yellow(`$250.00/month x ${paidProjects}`)}if(output_manager_default.log(` ${import_chalk251.default.bold("Project fee:")} ${projectFee}`),output_manager_default.log(` ${import_chalk251.default.bold("Request fee:")} ${import_chalk251.default.yellow("$2.00")} per million microfrontends routed requests`),output_manager_default.log(""),totalAfter<=freeProjects)output_manager_default.log(`This group is within the free tier, so no project fee will be charged to ${import_chalk251.default.bold(teamSlug)}'s bill. Request fees still apply for microfrontends routed requests.`);else{let newPaidProjects=Math.min(newProjectCount,totalAfter-freeProjects);output_manager_default.log(`By proceeding, ${import_chalk251.default.bold(teamSlug)} will be charged for ${newPaidProjects} additional paid project${newPaidProjects>1?"s":""} on the team's monthly bill.`)}if(output_manager_default.log(""),!autoConfirm&&!client.stdin.isTTY)return output_manager_default.error("Confirmation required. Use --yes to confirm group creation in non-interactive mode."),1;if(!(autoConfirm||await client.input.confirm("Create microfrontends group?",!0)))return output_manager_default.log("Aborted."),0;let createStamp=stamp_default();output_manager_default.spinner("Creating microfrontends group\u2026");try{await client.fetch(`/v1/microfrontends/group?teamId=${team.id}`,{method:"POST",body:{groupName,defaultApp:{projectId:defaultApp.id,defaultRoute},otherApplications}})}catch(error){return output_manager_default.stopSpinner(),isAPIError(error)&&error.status===403?(output_manager_default.error("You must be an Owner to create or modify microfrontends groups."),1):(printError(error),1)}output_manager_default.stopSpinner();let settingsUrl=`https://vercel.com/${teamSlug}/${defaultApp.name}/settings/microfrontends`;output_manager_default.success(`Microfrontends group "${groupName}" created ${import_chalk251.default.gray(createStamp())}`),output_manager_default.log(`View microfrontends group: ${output_manager_default.link(settingsUrl,settingsUrl,{fallback:!1})}`);let link=await getLinkedProject(client,{cwd:client.cwd}),linkedProject=link.status==="linked"?link.project:void 0;if(linkedProject&&linkedProject.id===defaultApp.id){let repoRoot=link.status==="linked"?link.repoRoot:void 0,projectDir=repoRoot?join36(repoRoot,linkedProject.rootDirectory||""):client.cwd,configPath=join36(projectDir,"microfrontends.json");if(!existsSync3(configPath)&&(output_manager_default.log(""),output_manager_default.log(`No changes to production traffic will take effect until a ${import_chalk251.default.bold("microfrontends.json")} is added to the default app. This configuration file specifies the path routing for the microfrontends group.`),client.stdin.isTTY&&!isNonInteractive&&await client.input.confirm("Create a microfrontends.json now?",!0))){let routingPaths={};for(let project of otherProjects){output_manager_default.log(`Enter routing paths for ${import_chalk251.default.bold(project.name)} (comma-separated, e.g. /docs, /docs/*)`);let pathsInput=await client.input.text({message:`Paths for ${project.name}:`,validate:val=>{if(!val.trim())return"At least one path is required";let paths=val.split(",").map(p=>p.trim());for(let p of paths){let result=validateRoutingPath(p);if(result!==!0)return`Invalid path "${p}": ${result}`}return!0}});routingPaths[project.name]=pathsInput.split(",").map(p=>p.trim())}let productionAlias=defaultApp.targets?.production?.alias?.[0],config=generateMicrofrontendsConfig(defaultApp.name,routingPaths,productionAlias);await writeFile6(configPath,config+`
|
|
1102
1114
|
`,"utf-8"),output_manager_default.success(`Created ${import_chalk251.default.bold("microfrontends.json")}`),output_manager_default.log("Create a preview deployment to test microfrontends before deploying to production.")}}else output_manager_default.log(`Next step: Add a ${import_chalk251.default.bold("microfrontends.json")} to your default app. See ${output_manager_default.link("https://vercel.com/docs/microfrontends/path-routing","https://vercel.com/docs/microfrontends/path-routing",{fallback:!1})}`);return 0}function generateMicrofrontendsConfig(defaultAppName,routingPaths,productionAlias){let fallback=productionAlias||"...your-production-domain.vercel.app",applications={[defaultAppName]:{development:{fallback}}};for(let[name,paths]of Object.entries(routingPaths))applications[name]={routing:[{paths}]};return JSON.stringify({$schema:"https://openapi.vercel.sh/microfrontends.json",applications},null,2)}function validateGroupName(name,existingGroups){return!name||name.trim().length===0?"Group name cannot be empty.":name.length>MAX_GROUP_NAME_LENGTH?`Group name must be ${MAX_GROUP_NAME_LENGTH} characters or less.`:existingGroups.some(g=>g.group.name===name)?`A group named "${name}" already exists.`:!0}function isProjectInMicrofrontendsGroup(project,groups){return groups.some(g=>g.projects.some(p=>p.id===project.id))}function parseProjectDefaultRouteFlags(projectDefaultRouteFlags,selectedProjects,defaultApp){let routeByProjectId=new Map;if(!projectDefaultRouteFlags||projectDefaultRouteFlags.length===0)return routeByProjectId;for(let entry2 of projectDefaultRouteFlags){let separatorIndex=entry2.indexOf("=");if(separatorIndex<=0||separatorIndex===entry2.length-1)return`Invalid --project-default-route value "${entry2}". Use "<project>=<route>", for example "docs=/docs".`;let projectIdentifier=entry2.slice(0,separatorIndex).trim(),route=entry2.slice(separatorIndex+1).trim();if(!projectIdentifier||!route)return`Invalid --project-default-route value "${entry2}". Use "<project>=<route>", for example "docs=/docs".`;let project=selectedProjects.find(p=>p.name===projectIdentifier||p.id===projectIdentifier);if(!project)return`Invalid --project-default-route value "${entry2}". Project "${projectIdentifier}" is not one of the selected projects.`;if(project.id===defaultApp.id)return`Invalid --project-default-route value "${entry2}". Use --default-route for the default app "${defaultApp.name}".`;let routeValidation=validateDefaultRoute(route);if(routeValidation!==!0)return`Invalid --project-default-route value "${entry2}": ${routeValidation}`;if(routeByProjectId.has(project.id))return`Duplicate --project-default-route for project "${project.name}".`;routeByProjectId.set(project.id,route)}return routeByProjectId}var import_chalk252=__toESM(require_source(),1);async function addToGroup(client){let parsedArgs,flagsSpecification=getFlagsSpecification(addToGroupSubcommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return printError(error),2}let context=await ensureMicrofrontendsContext(client);if(typeof context=="number")return context;let{project,team}=context,teamSlug=team.slug,groupsResponse=await fetchMicrofrontendsGroups(client,team.id),{groups,maxMicrofrontendsPerGroup}=groupsResponse,existingGroup=groups.find(g=>g.projects.some(p=>p.id===project.id));if(existingGroup)return output_manager_default.error(`Project "${project.name}" is already part of the microfrontends group "${existingGroup.group.name}". A project cannot be in more than one microfrontends group.`),1;if(groups.length===0)return output_manager_default.error("No microfrontends groups exist. Create one first with `vercel microfrontends create-group`."),1;let existingMfeProjectCount=groups.reduce((count2,g)=>count2+g.projects.length,0),freeProjects=2,totalAfter=existingMfeProjectCount+1,plan=team.billing.plan,isProTrialPlan=team.billing.plan==="pro"&&team.billing.status==="trialing",isLimitedPlan=isProTrialPlan||plan==="hobby";if(isLimitedPlan&&totalAfter>freeProjects){let planName=isProTrialPlan?"Pro Trial":"Hobby",url=getTeamBillingUrl(teamSlug);return output_manager_default.log(`You've reached the microfrontends project limit for ${planName}. Upgrade to Pro to add more projects.`),output_manager_default.log(`Upgrade: ${output_manager_default.link(url,url,{fallback:!1})}`),1}output_manager_default.log(`Adding project ${import_chalk252.default.bold(project.name)} to a microfrontends group on ${import_chalk252.default.bold(teamSlug)}.`),output_manager_default.log("");let groupFlag=parsedArgs.flags["--group"],defaultRouteFlag=parsedArgs.flags["--default-route"];if(totalAfter>freeProjects){if(client.nonInteractive){let settingsUrl2=`https://vercel.com/${teamSlug}/${project.name}/settings/microfrontends`,flags=getGlobalFlagsFromArgs(client.argv.slice(2)),interactiveCmd=getCommandNamePlain(`microfrontends add-to-group ${flags.filter(f=>f!=="--non-interactive").join(" ")}`.trim());outputAgentError(client,{status:"error",reason:"purchase_requires_user",message:"Adding a project to a microfrontends group affects billing and cannot be performed non-interactively. Agents must not make billing changes on behalf of a user. The user must run this command interactively in a terminal to review billing details and confirm, or complete the action in the Vercel dashboard.",next:[{command:openUrlInBrowserCommand(settingsUrl2),when:"user opens Microfrontends settings in the browser"},{command:interactiveCmd,when:"user runs this command interactively (remove --non-interactive)"}]},1)}if(!client.stdin.isTTY)return output_manager_default.error("This command must be run interactively because it affects billing."),1}let selectedGroup;if(groupFlag){let found=groups.find(g=>g.group.name===groupFlag||g.group.id===groupFlag);if(!found)return output_manager_default.error(`Microfrontends group "${groupFlag}" not found.`),1;selectedGroup=found}else{let groupId=await client.input.select({message:"Select a microfrontends group:",choices:groups.map(g=>({name:g.group.name,value:g.group.id}))});selectedGroup=groups.find(g=>g.group.id===groupId)}if(selectedGroup.projects.length>=maxMicrofrontendsPerGroup){if(isLimitedPlan){let planName=isProTrialPlan?"Pro Trial":"Hobby",url=getTeamBillingUrl(teamSlug);return output_manager_default.log(`You've reached the microfrontends project limit for ${planName}. Upgrade to Pro to add more projects.`),output_manager_default.log(`Upgrade: ${output_manager_default.link(url,url,{fallback:!1})}`),1}return output_manager_default.error(`Group "${selectedGroup.group.name}" has reached the maximum number of projects (${maxMicrofrontendsPerGroup}).`),1}let defaultRoute;if(defaultRouteFlag){let validation=validateDefaultRoute(defaultRouteFlag);if(validation!==!0)return output_manager_default.error(validation),1;defaultRoute=defaultRouteFlag}else client.stdin.isTTY&&(output_manager_default.log("Specify a default route for the project. This path will be used for deployment screenshots and the default link to the project."),defaultRoute=await client.input.text({message:"Default route (e.g. /docs):",validate:validateDefaultRoute}));output_manager_default.log(""),output_manager_default.log(import_chalk252.default.bold("Billing")),output_manager_default.log(` ${import_chalk252.default.bold("Team:")} ${teamSlug}`);let projectFee;if(totalAfter<=freeProjects?projectFee=import_chalk252.default.green("Free")+` (first ${freeProjects} included)`:existingMfeProjectCount>=freeProjects?projectFee=import_chalk252.default.yellow("$250.00/month"):projectFee=import_chalk252.default.yellow("$250.00/month")+` (${freeProjects} free projects used)`,output_manager_default.log(` ${import_chalk252.default.bold("Project fee:")} ${projectFee}`),output_manager_default.log(` ${import_chalk252.default.bold("Request fee:")} ${import_chalk252.default.yellow("$2.00")} per million microfrontends routed requests`),output_manager_default.log(""),totalAfter<=freeProjects?output_manager_default.log(`Adding "${project.name}" is within the free tier, so no project fee will be charged to ${import_chalk252.default.bold(teamSlug)}'s bill. Request fees still apply for microfrontends routed requests.`):output_manager_default.log(`By proceeding, ${import_chalk252.default.bold(teamSlug)} will be charged for this project on the team's monthly bill.`),output_manager_default.log(""),!await client.input.confirm(`Add "${project.name}" to "${selectedGroup.group.name}"?`,!0))return output_manager_default.log("Aborted."),0;let addStamp=stamp_default();output_manager_default.spinner("Adding project to microfrontends group\u2026");try{await client.fetch(`/v10/projects/${project.id}/microfrontends?teamId=${teamSlug}`,{method:"PATCH",body:{microfrontendsGroupId:selectedGroup.group.id,isDefaultApp:!1,defaultRoute,enabled:!0}})}catch(error){return output_manager_default.stopSpinner(),isAPIError(error)&&error.status===403?(output_manager_default.error("You must be an Owner to create or modify microfrontends groups."),1):(printError(error),1)}output_manager_default.stopSpinner();let settingsUrl=`https://vercel.com/${teamSlug}/${project.name}/settings/microfrontends`;return output_manager_default.success(`Project "${project.name}" added to group "${selectedGroup.group.name}" ${import_chalk252.default.gray(addStamp())}`),output_manager_default.log(`View microfrontends group: ${output_manager_default.link(settingsUrl,settingsUrl,{fallback:!1})}`),output_manager_default.log(`Next step: Add routing paths for this project in your microfrontends.json configuration. See ${output_manager_default.link("https://vercel.com/docs/microfrontends/path-routing","https://vercel.com/docs/microfrontends/path-routing",{fallback:!1})}`),0}var import_chalk253=__toESM(require_source(),1);async function removeFromGroup(client){let parsedArgs,flagsSpecification=getFlagsSpecification(removeFromGroupSubcommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return printError(error),2}let autoConfirm=!!parsedArgs.flags["--yes"],context=await ensureMicrofrontendsContext(client,{autoConfirm});if(typeof context=="number")return context;let{project,team}=context,teamSlug=team.slug,groupsResponse=await fetchMicrofrontendsGroups(client,team.id),{groups}=groupsResponse,projectGroup=groups.find(g=>g.projects.some(p=>p.id===project.id));if(!projectGroup)return output_manager_default.error(`Project "${project.name}" is not part of any microfrontends group.`),1;if(projectGroup.projects.find(p=>p.id===project.id)?.microfrontends?.isDefaultApp)return output_manager_default.error(`Project "${project.name}" is the default app for group "${projectGroup.group.name}" and cannot be removed. To remove it, first change the default app in the dashboard.`),1;if(client.nonInteractive&&!autoConfirm)return outputActionRequired(client,{status:AGENT_STATUS.ACTION_REQUIRED,reason:AGENT_REASON.CONFIRMATION_REQUIRED,action:AGENT_ACTION.CONFIRMATION_REQUIRED,message:`Removing "${project.name}" from microfrontends group "${projectGroup.group.name}" requires confirmation. Use --yes to confirm.`,next:[{command:buildCommandWithYes(client.argv),when:"to confirm removal"}]},1),1;output_manager_default.log(`Removing project ${import_chalk253.default.bold(project.name)} from microfrontends group ${import_chalk253.default.bold(projectGroup.group.name)} on ${import_chalk253.default.bold(teamSlug)}.`),output_manager_default.log(`After removal, "${project.name}" will no longer be a child app in the group and will not be part of the composed application.`);let isReferencedInConfig=!!projectGroup.config?.applications?.[project.name];if(isReferencedInConfig&&(output_manager_default.log(""),output_manager_default.warn(`The microfrontends.json configuration still contains an entry for "${project.name}".`),output_manager_default.warn("Removing this project will cause other microfrontends projects in the group to fail deploying until the configuration is updated."),!autoConfirm)){if(!client.stdin.isTTY)return output_manager_default.error("Cannot remove a project that is still referenced in microfrontends.json in non-interactive mode."),1;if(output_manager_default.log(""),!await client.input.confirm(`Remove "${project.name}" even though it is still referenced in microfrontends.json?`,!1))return output_manager_default.log("Aborted."),0}if(output_manager_default.log(""),!autoConfirm){if(!client.stdin.isTTY)return output_manager_default.error("This command must be run interactively to confirm removal."),1;if(!await client.input.confirm(`Remove "${project.name}" from "${projectGroup.group.name}"?`,!1))return output_manager_default.log("Aborted."),0}let removeStamp=stamp_default();output_manager_default.spinner("Removing project from microfrontends group\u2026");try{await client.fetch(`/v10/projects/${project.id}/microfrontends?teamId=${teamSlug}`,{method:"PATCH",body:{enabled:!1}})}catch(error){return output_manager_default.stopSpinner(),isAPIError(error)&&error.status===403?(output_manager_default.error("You must be an Owner to create or modify microfrontends groups."),1):(printError(error),1)}return output_manager_default.stopSpinner(),output_manager_default.success(`Project "${project.name}" removed from group "${projectGroup.group.name}" ${import_chalk253.default.gray(removeStamp())}`),isReferencedInConfig&&output_manager_default.log(`Remember to remove "${project.name}" from your microfrontends.json configuration.`),0}var import_chalk254=__toESM(require_source(),1);async function deleteGroup(client){let parsedArgs,flagsSpecification=getFlagsSpecification(deleteGroupSubcommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return printError(error),2}let autoConfirm=!!parsedArgs.flags["--yes"],groupFlag=parsedArgs.flags["--group"];if(client.nonInteractive&&!autoConfirm)return outputActionRequired(client,{status:AGENT_STATUS.ACTION_REQUIRED,reason:AGENT_REASON.CONFIRMATION_REQUIRED,action:AGENT_ACTION.CONFIRMATION_REQUIRED,message:"Deleting a microfrontends group requires confirmation. Use --yes and --group to confirm.",next:[{command:buildCommandWithYes(client.argv),when:"to confirm deletion"}]},1),1;let{team}=await getScope(client);if(!team)return output_manager_default.error("Microfrontends are only available for teams."),1;let groupsResponse=await fetchMicrofrontendsGroups(client,team.id),{groups}=groupsResponse;if(groups.length===0)return output_manager_default.error("No microfrontends groups exist. There is nothing to delete."),1;if(!client.stdin.isTTY&&!groupFlag)return output_manager_default.error("Missing required flag --group. Use --group to specify the microfrontends group, or run interactively."),2;let selectedGroup;if(groupFlag){let found=groups.find(g=>g.group.name===groupFlag||g.group.id===groupFlag);if(!found)return output_manager_default.error(`Microfrontends group "${groupFlag}" not found.`),1;selectedGroup=found}else{let link=await getLinkedProject(client,{cwd:client.cwd}),linkedProject=link.status==="linked"?link.project:void 0,linkedGroup=linkedProject?groups.find(g=>g.projects.some(p=>p.id===linkedProject.id&&p.microfrontends?.isDefaultApp)):void 0;if(linkedGroup&&client.stdin.isTTY)if(await client.input.confirm(`Delete microfrontends group "${linkedGroup.group.name}" (linked to ${import_chalk254.default.bold(linkedProject.name)})?`,!0))selectedGroup=linkedGroup;else{if(groups.length===1)return output_manager_default.log("Aborted."),0;{let remaining=groups.filter(g=>g.group.id!==linkedGroup.group.id),groupId=await client.input.select({message:"Select a microfrontends group to delete:",choices:remaining.map(g=>({name:g.group.name,value:g.group.id}))});selectedGroup=groups.find(g=>g.group.id===groupId)}}else{let groupId=await client.input.select({message:"Select a microfrontends group to delete:",choices:groups.map(g=>({name:g.group.name,value:g.group.id}))});selectedGroup=groups.find(g=>g.group.id===groupId)}}let groupName=selectedGroup.group.name,projectCount=selectedGroup.projects.length;if(output_manager_default.log(""),output_manager_default.log(`This will delete the microfrontends group ${import_chalk254.default.bold(groupName)} and all of its settings.`),projectCount>0&&output_manager_default.log(`${projectCount} project${projectCount>1?"s":""} will be removed from the group.`),output_manager_default.log(import_chalk254.default.red("This action is not reversible.")),output_manager_default.log(""),!autoConfirm){if(!client.stdin.isTTY)return output_manager_default.error("This command must be run interactively to confirm deletion."),1;if(await client.input.text({message:`Type ${import_chalk254.default.bold(groupName)} to confirm deletion:`,validate:val=>val!==groupName?`You must type "${groupName}" to confirm.`:!0})!==groupName)return output_manager_default.log("Aborted."),0}let deleteStamp=stamp_default();output_manager_default.spinner("Deleting microfrontends group\u2026");try{await client.fetch(`/v2/teams/${team.id}/microfrontends/${selectedGroup.group.id}?teamId=${team.id}`,{method:"DELETE"})}catch(error){return output_manager_default.stopSpinner(),isAPIError(error)&&error.status===403?(output_manager_default.error("You must be an Owner to create or modify microfrontends groups."),1):(printError(error),1)}return output_manager_default.stopSpinner(),output_manager_default.success(`Microfrontends group "${groupName}" deleted ${import_chalk254.default.gray(deleteStamp())}`),0}import{existsSync as existsSync4}from"fs";import{join as join37}from"path";var import_chalk255=__toESM(require_source(),1);async function inspectGroup(client){let parsedArgs,flagsSpecification=getFlagsSpecification(inspectGroupSubcommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return printError(error),2}let formatResult=validateJsonOutput(parsedArgs.flags);if(!formatResult.valid)return output_manager_default.error("error"in formatResult?formatResult.error:"Invalid output format"),2;let asJson=formatResult.jsonOutput,groupFlag=parsedArgs.flags["--group"],configFileNameFlag=parsedArgs.flags["--config-file-name"],{team}=await getScope(client);if(!team)return output_manager_default.error("Microfrontends are only available for teams."),1;let groupsResponse=await fetchMicrofrontendsGroups(client,team.id),{groups}=groupsResponse;if(groups.length===0)return output_manager_default.error("No microfrontends groups exist."),1;if(!groupFlag&&client.nonInteractive)return outputActionRequired(client,{status:AGENT_STATUS.ACTION_REQUIRED,reason:AGENT_REASON.MISSING_ARGUMENTS,action:AGENT_ACTION.MISSING_ARGUMENTS,message:"Missing required flag --group. Use --group and --json in non-interactive mode.",next:[{command:'vercel microfrontends inspect-group --group="<group-name-or-id>" --json',when:"to inspect a specific microfrontends group non-interactively"}]},2),2;if(!client.stdin.isTTY&&!groupFlag)return output_manager_default.error("Missing required flag --group. Use --group to specify the microfrontends group, or run interactively."),2;let selectedGroup;if(groupFlag){let found=groups.find(g=>g.group.name===groupFlag||g.group.id===groupFlag||g.group.slug===groupFlag);if(!found)return output_manager_default.error(`Microfrontends group "${groupFlag}" not found.`),1;selectedGroup=found}else{let groupId=await client.input.select({message:"Select a microfrontends group to inspect:",choices:groups.map(g=>({name:g.group.name,value:g.group.id}))});selectedGroup=groups.find(g=>g.group.id===groupId)}let localRepoContext=await getLocalRepoContext(client);output_manager_default.spinner("Fetching project metadata\u2026");let projects2=await Promise.all(selectedGroup.projects.map(project=>enrichGroupProject(client,team.id,selectedGroup,project,localRepoContext)));output_manager_default.stopSpinner();let defaultProject=projects2.find(p=>p.isDefaultApp),configuredConfigFileName=resolveConfiguredMicrofrontendsConfigFileName(configFileNameFlag);if(configFileNameFlag&&!configuredConfigFileName)return output_manager_default.error("Invalid --config-file-name. Value must end with .json or .jsonc."),2;let configFile=resolveLocalConfigFilePath(projects2,localRepoContext,configuredConfigFileName),json={group:{id:selectedGroup.group.id,slug:selectedGroup.group.slug,name:selectedGroup.group.name,fallbackEnvironment:selectedGroup.group.fallbackEnvironment??null},projectCount:projects2.length,defaultApp:defaultProject?.name??defaultProject?.id??null,configFile,config:{exists:!!selectedGroup.config,applications:Object.keys(selectedGroup.config?.applications??{})},projects:projects2};if(asJson)return client.stdout.write(`${JSON.stringify(json,null,2)}
|
|
1103
1115
|
`),0;let groupTable=table([["Group",json.group.name],["ID",json.group.id],["Slug",json.group.slug],["Projects",String(json.projectCount)],["Default app",json.defaultApp??"(none)"],["Fallback environment",json.group.fallbackEnvironment??"(none)"],["Local config file",json.configFile??"(not found)"],["Config applications",json.config.applications.length>0?json.config.applications.join(", "):"(none)"]]);output_manager_default.log(""),output_manager_default.log(groupTable),output_manager_default.log(""),output_manager_default.log("Projects"),output_manager_default.log("");for(let project of projects2){let rows=[["Project",project.isDefaultApp?`${project.name} (default app)`:project.name],["Default route",project.defaultRoute??"(none)"],["Production domain",project.productionDomain??"(none)"],["Framework",project.framework??"(unknown)"],["Git org/repo",`${project.git.org??"(unknown)"}/${project.git.repo??"(unknown)"}`],["Root directory",project.git.rootDirectory??"(unknown)"]];project.packageName&&rows.push(["Package name",project.packageName]),project.inGroupConfig||rows.push(["In config",(0,import_chalk255.red)("no")]);let projectTable=table(rows);output_manager_default.log(projectTable),output_manager_default.log("")}for(let project of projects2)project.projectFetchStatus!=="ok"&&output_manager_default.warn(`Project metadata for "${project.id}" is incomplete (status: ${project.projectFetchStatus}).`);return 0}async function enrichGroupProject(client,teamId,group,groupProject,localRepoContext){let fullProject,projectFetchStatus="ok";try{let maybeProject=await getProjectByNameOrId(client,groupProject.id,teamId);maybeProject instanceof ProjectNotFound?projectFetchStatus="not_found":fullProject=maybeProject}catch{projectFetchStatus="error"}let name=groupProject.name??fullProject?.name??groupProject.id,inGroupConfig=Object.prototype.hasOwnProperty.call(group.config?.applications??{},name),rootDirectory=fullProject?.rootDirectory??null,gitRepo=fullProject?.link?.repo??null,gitOrg=fullProject?.link?.org??null,productionDomain=fullProject?.targets?.production?.alias?.[0]??fullProject?.targets?.production?.url??null,framework=fullProject?.framework??null,packageName2=await resolvePackageNameFromLocalRepo(localRepoContext,gitOrg,gitRepo,rootDirectory);return{id:groupProject.id,name,isDefaultApp:!!groupProject.microfrontends?.isDefaultApp,enabled:!!groupProject.microfrontends?.enabled,defaultRoute:groupProject.microfrontends?.defaultRoute??null,productionDomain,framework,git:{org:gitOrg,repo:gitRepo,rootDirectory},packageName:packageName2,inGroupConfig,projectFetchStatus}}async function getLocalRepoContext(client){try{let link=await getLinkedProject(client,{cwd:client.cwd});return link.status!=="linked"?{repoRoot:null,linkedProjectId:null,linkedRepoOrg:null,linkedRepoName:null}:{repoRoot:link.repoRoot??null,linkedProjectId:link.project.id,linkedRepoOrg:link.project.link?.org??null,linkedRepoName:link.project.link?.repo??null}}catch{return{repoRoot:null,linkedProjectId:null,linkedRepoOrg:null,linkedRepoName:null}}}function isProjectInLocalRepo(localRepoContext,gitOrg,gitRepo){return!localRepoContext.repoRoot||!localRepoContext.linkedRepoOrg||!localRepoContext.linkedRepoName?!1:localRepoContext.linkedRepoOrg===gitOrg&&localRepoContext.linkedRepoName===gitRepo}async function resolvePackageNameFromLocalRepo(localRepoContext,gitOrg,gitRepo,rootDirectory){if(!isProjectInLocalRepo(localRepoContext,gitOrg,gitRepo))return null;let projectDir=join37(localRepoContext.repoRoot,rootDirectory||""),packageJsonPath=join37(projectDir,"package.json"),pkg=await readJSONFile(packageJsonPath);return!pkg||pkg instanceof Error?null:typeof pkg.name=="string"?pkg.name:null}function resolveLocalConfigFilePath(projects2,localRepoContext,configuredConfigFileName){let defaultProject=projects2.find(project=>project.isDefaultApp);if(!defaultProject||!isProjectInLocalRepo(localRepoContext,defaultProject.git.org,defaultProject.git.repo))return null;let projectDir=join37(localRepoContext.repoRoot,defaultProject.git.rootDirectory||""),configuredName=configuredConfigFileName??null;if(configuredName){let configuredPath=join37(projectDir,configuredName);if(existsSync4(configuredPath))return configuredPath}let jsonPath=join37(projectDir,"microfrontends.json"),jsoncPath=join37(projectDir,"microfrontends.jsonc");return existsSync4(jsonPath)?jsonPath:existsSync4(jsoncPath)?jsoncPath:null}function resolveConfiguredMicrofrontendsConfigFileName(configured){if(!configured)return null;let normalized=configured.trim();return!normalized.endsWith(".json")&&!normalized.endsWith(".jsonc")?null:normalized.replace(/^\/+/,"")}var MicrofrontendsTelemetryClient=class extends TelemetryClient{trackCliSubcommandPull(actual){this.trackCliSubcommand({subcommand:"pull",value:actual})}trackCliSubcommandCreateGroup(actual){this.trackCliSubcommand({subcommand:"create-group",value:actual})}trackCliSubcommandAddToGroup(actual){this.trackCliSubcommand({subcommand:"add-to-group",value:actual})}trackCliSubcommandRemoveFromGroup(actual){this.trackCliSubcommand({subcommand:"remove-from-group",value:actual})}trackCliSubcommandDeleteGroup(actual){this.trackCliSubcommand({subcommand:"delete-group",value:actual})}trackCliSubcommandInspectGroup(actual){this.trackCliSubcommand({subcommand:"inspect-group",value:actual})}};var COMMAND_CONFIG54={"create-group":getCommandAliases(createGroupSubcommand),"add-to-group":getCommandAliases(addToGroupSubcommand),"remove-from-group":getCommandAliases(removeFromGroupSubcommand),"delete-group":getCommandAliases(deleteGroupSubcommand),"inspect-group":getCommandAliases(inspectGroupSubcommand),pull:getCommandAliases(pullSubcommand)};async function main28(client){let telemetry2=new MicrofrontendsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(microfrontendsCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(error){return printError(error),2}let{subcommand,subcommandOriginal}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG54),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("microfrontends"),output_manager_default.print(help(microfrontendsCommand,{columns:client.stderr.columns})),0;function printHelp(command2){return output_manager_default.print(help(command2,{parent:microfrontendsCommand,columns:client.stderr.columns})),0}switch(subcommand){case"create-group":return needHelp?(telemetry2.trackCliFlagHelp("microfrontends",subcommandOriginal),printHelp(createGroupSubcommand)):(telemetry2.trackCliSubcommandCreateGroup(subcommandOriginal),createGroup(client));case"add-to-group":return needHelp?(telemetry2.trackCliFlagHelp("microfrontends",subcommandOriginal),printHelp(addToGroupSubcommand)):(telemetry2.trackCliSubcommandAddToGroup(subcommandOriginal),addToGroup(client));case"remove-from-group":return needHelp?(telemetry2.trackCliFlagHelp("microfrontends",subcommandOriginal),printHelp(removeFromGroupSubcommand)):(telemetry2.trackCliSubcommandRemoveFromGroup(subcommandOriginal),removeFromGroup(client));case"delete-group":return needHelp?(telemetry2.trackCliFlagHelp("microfrontends",subcommandOriginal),printHelp(deleteGroupSubcommand)):(telemetry2.trackCliSubcommandDeleteGroup(subcommandOriginal),deleteGroup(client));case"inspect-group":return needHelp?(telemetry2.trackCliFlagHelp("microfrontends",subcommandOriginal),printHelp(inspectGroupSubcommand)):(telemetry2.trackCliSubcommandInspectGroup(subcommandOriginal),inspectGroup(client));case"pull":return needHelp?(telemetry2.trackCliFlagHelp("microfrontends",subcommandOriginal),printHelp(pullSubcommand)):(telemetry2.trackCliSubcommandPull(subcommandOriginal),pull2(client));default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG54)),output_manager_default.print(help(microfrontendsCommand,{columns:client.stderr.columns})),2}}var import_open17=__toESM(require_open(),1);var OpenTelemetryClient=class extends TelemetryClient{trackCliFlagYes(yes){yes&&this.trackCliFlag("yes")}trackCliCommandOpen(value){this.trackCliCommand({command:"open",value})}};async function openCommandHandler(client){let parsedArgs=null,flagsSpecification=getFlagsSpecification(openCommand.options),telemetry2=new OpenTelemetryClient({opts:{store:client.telemetryEventStore}});try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return printError(error),2}if(parsedArgs.flags["--help"])return telemetry2.trackCliFlagHelp("open"),output_manager_default.print(help(openCommand,{columns:client.stderr.columns})),0;let autoConfirm=!!parsedArgs.flags["--yes"],link=await ensureLink("open",client,client.cwd,{autoConfirm});if(typeof link=="number")return link;if(link.status!=="linked"||!link.org||!link.project)return client.nonInteractive||(output_manager_default.error("This command requires a linked project. Please run:"),output_manager_default.print(` vercel link
|
|
1104
|
-
`)),1;let{org,project}=link,projectUrl=`https://vercel.com/${org.slug}/${project.name}`;return output_manager_default.log(`Opening ${projectUrl} in your browser...`),await(0,import_open17.default)(projectUrl),0}var import_error_utils20=__toESM(require_dist(),1);var PricingTelemetryClient=class extends TelemetryClient{trackCliOptionFormat(format3){format3&&this.trackCliOption({option:"format",value:format3})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}trackCliArgumentQuery(query){query&&query.length>0&&this.trackCliArgument({arg:"query",value:this.redactedValue})}};var
|
|
1116
|
+
`)),1;let{org,project}=link,projectUrl=`https://vercel.com/${org.slug}/${project.name}`;return output_manager_default.log(`Opening ${projectUrl} in your browser...`),await(0,import_open17.default)(projectUrl),0}var import_error_utils20=__toESM(require_dist(),1);var PricingTelemetryClient=class extends TelemetryClient{trackCliOptionFormat(format3){format3&&this.trackCliOption({option:"format",value:format3})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}trackCliArgumentQuery(query){query&&query.length>0&&this.trackCliArgument({arg:"query",value:this.redactedValue})}};var import_strip_ansi5=__toESM(require_strip_ansi(),1);var PLANS=["hobby","pro","enterprise"];var MIN_PRICING_FEATURES=8,PLAN_HEADER=new Set(PLANS),UNAVAILABLE_VALUES=new Set(["","-","\u2014","\u2013","n/a","na","not available"]);function slugify(value){return value.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")}function isFeatureAvailable(value){let normalized=value.trim().toLowerCase().replace(/[—–]/g,"-");return!UNAVAILABLE_VALUES.has(normalized)}function normalizePlan(plan){if(!plan)return null;let normalized=plan.trim().toLowerCase();return normalized==="plus"?"pro":PLANS.find(item=>item===normalized)??null}function minPlanForFeature(available){for(let plan of PLANS)if(available[plan])return plan;return"enterprise"}function splitFeaturesByMinPlan(features){let grouped={hobby:[],pro:[],enterprise:[]};for(let feature of features)grouped[feature.minPlan].push(feature);return grouped}function withCurrentPlanAvailability(features,currentPlan){return features.map(feature=>({...feature,availableOnCurrentPlan:currentPlan?feature.available[currentPlan]:null}))}function featureMatchesQuery(feature,query){let needle=query.trim().toLowerCase();return needle?[feature.name,feature.slug,feature.section,feature.category,feature.description??"",...PLANS.map(plan=>feature.values[plan])].join(" ").toLowerCase().includes(needle):!0}function sanitizeRemoteText(value){let withoutHyperlinks=value.replace(/\u001b\]8;;.*?(?:\u0007|\u001b\\)/gs,"");return(0,import_strip_ansi5.default)(withoutHyperlinks).replace(/\[([^\]]*)\]\([^)]*\)/g,"$1").replace(/\*\*/g,"").replace(/[\u0000-\u0008\u000B\u000C\u000E-\u001F\u007F]/g,"").replace(/\s+/g," ").trim()}function isValidPricingTable(features){if(features.length<MIN_PRICING_FEATURES)return!1;let minPlans=new Set(features.map(feature=>feature.minPlan));return minPlans.has("hobby")&&minPlans.has("pro")&&minPlans.has("enterprise")}function parsePricingMarkdown(markdown){let lines=markdown.split(/\r?\n/),features=[],descriptions=new Map,section="",category="",pendingDescription=[];for(let i=0;i<lines.length;i++){let line2=lines[i],heading=parseHeading(line2);if(heading){heading.level===2?(section=heading.text,category=""):category=heading.text,pendingDescription=[];continue}if(isTableStart(line2,lines[i+1])){let parsed=parseTable(lines,i);if(parsed){let contextName=category||section,contextDescription=sanitizeRemoteText(pendingDescription.join(" "))||null;for(let row of parsed.rows){let name=sanitizeRemoteText(row.feature??contextName);if(!name)continue;let hobby=sanitizeRemoteText(row.hobby),pro2=sanitizeRemoteText(row.pro),enterprise=sanitizeRemoteText(row.enterprise),available={hobby:isFeatureAvailable(hobby),pro:isFeatureAvailable(pro2),enterprise:isFeatureAvailable(enterprise)};features.push({name,slug:slugify(name),section,category:category||section,standalone:row.feature===void 0,description:row.feature?null:contextDescription,values:{hobby,pro:pro2,enterprise},available,minPlan:minPlanForFeature(available)})}i=parsed.endIndex,pendingDescription=[];continue}}let description=parseDescriptionLine(line2);if(description){descriptions.set(description.name,description.text);continue}let trimmed=sanitizeRemoteText(line2);trimmed&&!trimmed.startsWith("<")&&!trimmed.startsWith("[")&&pendingDescription.push(trimmed)}for(let feature of features){let description=descriptions.get(feature.name);description&&!feature.description&&(feature.description=description)}return features}function parseHeading(line2){let match=/^(#{2,3})\s+(.+)$/.exec(line2.trim());if(!match)return;let level=match[1].length===2?2:3,text3=sanitizeRemoteText(match[2]);if(text3)return{level,text:text3}}function isTableStart(line2,nextLine){return!!(line2.trim().startsWith("|")&&nextLine&&isSeparatorRow(nextLine))}function isSeparatorRow(line2){return/^\|[\s:|-]+\|$/.test(line2.trim())}function parseTable(lines,startIndex){let headerCells=splitRow(lines[startIndex]);if(!headerCells)return;let headerMap=mapHeaders(headerCells);if(headerMap.hobby===void 0||headerMap.pro===void 0||headerMap.enterprise===void 0)return;let rows=[],index=startIndex+2;for(;index<lines.length&&lines[index].trim().startsWith("|");){if(isSeparatorRow(lines[index])){index+=1;continue}let cells=splitRow(lines[index]);if(index+=1,!cells)continue;let hobby=cells[headerMap.hobby]??"",pro2=cells[headerMap.pro]??"",enterprise=cells[headerMap.enterprise]??"",feature=headerMap.feature===void 0?void 0:cells[headerMap.feature];!hobby&&!pro2&&!enterprise&&!feature||rows.push({feature:feature?.trim()||void 0,hobby,pro:pro2,enterprise})}return{rows,endIndex:index-1}}function mapHeaders(cells){let mapped={};return cells.forEach((cell2,index)=>{let header=sanitizeRemoteText(cell2).toLowerCase();if(PLAN_HEADER.has(header)){mapped[header]=index;return}(header==="feature"||mapped.feature===void 0)&&(mapped.feature=index)}),mapped}function splitRow(line2){let trimmed=line2.trim();return trimmed.startsWith("|")?trimmed.split("|").slice(1,-1).map(cell2=>cell2.trim()):void 0}function parseDescriptionLine(line2){let match=/^- (?:\*\*)?(.+?):(?:\*\*)?\s+(.+)$/.exec(line2.trim());if(!match)return;let name=sanitizeRemoteText(match[1]),text3=sanitizeRemoteText(match[2]);if(!(!name||!text3))return{name,text:text3}}var import_chalk256=__toESM(require_source(),1);var PLAN_LABEL={hobby:"Hobby",pro:"Pro",enterprise:"Enterprise"},PLAN_COLOR=import_chalk256.default.magenta,PLAN_SCOPE={hobby:"available on Hobby, Pro, and Enterprise",pro:"available on Pro and Enterprise",enterprise:"available on Enterprise"};function formatPlanLabel(plan){return plan?plan.charAt(0).toUpperCase()+plan.slice(1):"Unknown"}function formatPricing(result){let lines=[];if(result.team?(lines.push(`Current team: ${import_chalk256.default.bold(result.team.slug)}${result.team.name&&result.team.name!==result.team.slug?` (${result.team.name})`:""}`),lines.push(`Current plan: ${formatCurrentPlan(result.team.plan)}`)):lines.push("Current team: not logged in"),lines.push(`Source: ${result.source}`),result.query&&lines.push(`Query: ${result.query}`),lines.push(""),result.summary.matched===0)return lines.push(result.query?`No features matching "${result.query}". Try a broader query, or run without a query to list all features.`:"No features found in the pricing table."),`${lines.join(`
|
|
1105
1117
|
`)}
|
|
1106
1118
|
`;if(result.query)return lines.push(...formatQueryMatches(result)),`${lines.join(`
|
|
1107
1119
|
`)}
|
|
@@ -1330,7 +1342,7 @@ ${import_chalk288.default.gray("No changes detected from current production vers
|
|
|
1330
1342
|
`),output_manager_default.print(` ${import_chalk295.default.gray("ID:")} ${route.id}
|
|
1331
1343
|
`),output_manager_default.print(`
|
|
1332
1344
|
${import_chalk295.default.bold("Staging version:")} ${version2.id}
|
|
1333
|
-
`),await offerAutoPromote(client,projectId,version2,!!existingStagingVersion,{teamId,skipPrompts}),0}catch(e2){let error=e2;return client.nonInteractive&&outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.ROUTE_CREATE_FAILED,message:"Route creation failed for this project. See hint for next steps.",hint:error.message||"Use `vercel routes list --diff` to inspect staged routes, then adjust flags and retry.",next:[{command:withGlobalFlags2(client,"routes list --diff"),when:"to inspect staged state"}]},1),output_manager_default.error(error.message||"Failed to create route"),1}}var COMMAND_CONFIG58={list:getCommandAliases(listSubcommand20),"list-versions":getCommandAliases(listVersionsSubcommand2),inspect:getCommandAliases(inspectSubcommand13),add:getCommandAliases(addSubcommand10),edit:getCommandAliases(editSubcommand2),delete:getCommandAliases(deleteSubcommand3),enable:getCommandAliases(enableSubcommand3),disable:getCommandAliases(disableSubcommand3),reorder:getCommandAliases(reorderSubcommand),export:getCommandAliases(exportSubcommand),publish:getCommandAliases(publishSubcommand2),restore:getCommandAliases(restoreSubcommand2),"discard-staging":getCommandAliases(discardSubcommand2)};async function main31(client){let telemetry2=new RoutesTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(routesCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),2}let subArgs=parsedArgs.args.slice(1),{subcommand,args,subcommandOriginal}=getSubcommand7(subArgs,COMMAND_CONFIG58),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("routes"),output_manager_default.print(help(routesCommand,{columns:client.stderr.columns})),0;function printHelp(command2){output_manager_default.print(help(command2,{parent:routesCommand,columns:client.stderr.columns}))}switch(subcommand&&!needHelp&&telemetry2.trackCliOptionProject(getProjectOptionFromArgs(args)),subcommand){case"list":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(listSubcommand20),0):(telemetry2.trackCliSubcommandList(subcommandOriginal),list23(client,args));case"list-versions":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(listVersionsSubcommand2),0):(telemetry2.trackCliSubcommandListVersions(subcommandOriginal),listVersions3(client,args));case"inspect":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(inspectSubcommand13),0):(telemetry2.trackCliSubcommandInspect(subcommandOriginal),inspect18(client,args));case"add":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(addSubcommand10),0):(telemetry2.trackCliSubcommandAdd(subcommandOriginal),add13(client,args));case"edit":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(editSubcommand2),0):(telemetry2.trackCliSubcommandEdit(subcommandOriginal),(await import("./chunks/edit-ZPNWEZWU.js")).default(client,args));case"delete":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(deleteSubcommand3),0):(telemetry2.trackCliSubcommandDelete(subcommandOriginal),(await import("./chunks/delete-ZISJ7HIW.js")).default(client,args));case"enable":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(enableSubcommand3),0):(telemetry2.trackCliSubcommandEnable(subcommandOriginal),(await import("./chunks/enable-USQVAN4K.js")).default(client,args));case"disable":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(disableSubcommand3),0):(telemetry2.trackCliSubcommandDisable(subcommandOriginal),(await import("./chunks/disable-ZCEEK2BD.js")).default(client,args));case"reorder":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(reorderSubcommand),0):(telemetry2.trackCliSubcommandReorder(subcommandOriginal),(await import("./chunks/reorder-S2ZJML5K.js")).default(client,args));case"export":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(exportSubcommand),0):(telemetry2.trackCliSubcommandExport(subcommandOriginal),(await import("./chunks/export-H7YV6NVF.js")).default(client,args));case"publish":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(publishSubcommand2),0):(telemetry2.trackCliSubcommandPublish(subcommandOriginal),(await import("./chunks/publish-WWI5HOAL.js")).default(client,args));case"restore":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(restoreSubcommand2),0):(telemetry2.trackCliSubcommandRestore(subcommandOriginal),(await import("./chunks/restore-JD7IGDTY.js")).default(client,args));case"discard-staging":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(discardSubcommand2),0):(telemetry2.trackCliSubcommandDiscardStaging(subcommandOriginal),(await import("./chunks/discard-VHO5BXYN.js")).default(client,args));default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG58)),output_manager_default.print(help(routesCommand,{columns:client.stderr.columns})),2}}function getFlagValue(args,names){let value;for(let i=0;i<args.length;i++){let arg2=args[i],[option,inlineValue]=arg2.split("=",2);if(names.includes(option)){if(inlineValue!==void 0){value=inlineValue;continue}i+1<args.length&&(value=args[i+1],i++)}}return value}async function sandbox(client){let argv=client.argv.slice(2),commandIndex=argv.indexOf("sandbox"),rootArgs=commandIndex===-1?argv:argv.slice(0,commandIndex),sandboxArgs=commandIndex===-1?[]:argv.slice(commandIndex+1),scope=getFlagValue(rootArgs,["--scope","-S"]),team=getFlagValue(rootArgs,["--team","-T"]),token2=getFlagValue(rootArgs,["--token","-t"]),forwardedArgs=[...scope?["--scope",scope]:team?["--team",team]:[],...sandboxArgs],originalCwd=process.cwd(),originalAuthToken=process.env.VERCEL_AUTH_TOKEN;try{token2?process.env.VERCEL_AUTH_TOKEN=token2:!process.env.VERCEL_AUTH_TOKEN&&process.env.VERCEL_TOKEN?process.env.VERCEL_AUTH_TOKEN=process.env.VERCEL_TOKEN:!process.env.VERCEL_AUTH_TOKEN&&client.authConfig.token&&(process.env.VERCEL_AUTH_TOKEN=client.authConfig.token),process.env.VERCEL_CLI_INVOCATION_ID=client.telemetryEventStore.currentInvocationId,process.chdir(client.cwd);let{createApp}=await import("sandbox");return await createApp({appName:"vercel sandbox",withoutAuth:!1}).run(forwardedArgs),0}catch(error){return printError(error),1}finally{process.chdir(originalCwd),typeof originalAuthToken=="string"?process.env.VERCEL_AUTH_TOKEN=originalAuthToken:delete process.env.VERCEL_AUTH_TOKEN}}var SchedulesTelemetryClient=class extends TelemetryClient{trackCliFlagLocal(local){local&&this.trackCliFlag("local")}trackCliSubcommandInspect(actual){this.trackCliSubcommand({subcommand:"inspect",value:actual})}trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandCreate(actual){this.trackCliSubcommand({subcommand:"create",value:actual})}trackCliSubcommandUpdate(actual){this.trackCliSubcommand({subcommand:"update",value:actual})}trackCliSubcommandEnable(actual){this.trackCliSubcommand({subcommand:"enable",value:actual})}trackCliSubcommandDisable(actual){this.trackCliSubcommand({subcommand:"disable",value:actual})}trackCliSubcommandInvoke(actual){this.trackCliSubcommand({subcommand:"invoke",value:actual})}trackCliSubcommandDelete(actual){this.trackCliSubcommand({subcommand:"delete",value:actual})}trackCliSubcommandExecutions(actual){this.trackCliSubcommand({subcommand:"executions",value:actual})}trackCliSubcommandExecutionsList(actual){this.trackCliSubcommand({subcommand:"executions:list",value:actual})}};var SchedulesActionTelemetryClient=class extends TelemetryClient{trackCliArgumentName(name){name&&this.trackCliArgument({arg:"name",value:this.redactedValue})}trackCliOptionNamespace(namespace){namespace&&this.trackCliOption({option:"namespace",value:this.redactedValue})}trackCliOptionFormat(format3){format3&&this.trackCliOption({option:"format",value:format3})}trackCliFlagLocal(local){local&&this.trackCliFlag("local")}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};function asSentence(value){let trimmed=value.trim();return/[.!?]$/.test(trimmed)?trimmed:`${trimmed}.`}function apiErrorDetail(error){let message=error.serverMessage?.trim();return message&&message!=="Response Error"?asSentence(message):void 0}function requestDescription(context){return context.action==="list"?`list schedules in namespace ${context.namespace}`:context.action==="list-executions"?`list executions for schedule ${context.namespace}/${context.name}`:`${context.action} schedule ${context.namespace}/${context.name}`}function ambiguousInvokeError(local){return{reason:AGENT_REASON.API_ERROR,message:"The schedule invocation may have been accepted, but the CLI did not receive confirmation. Check whether the schedule ran before invoking it again."+(local?` Inspect the ${getCommandName("dev")} output for local executions.`:""),retryable:!1,userActionRequired:!0}}function getSchedulesError(client,error,context){if(!isAPIError(error))return context.action==="invoke"?ambiguousInvokeError(context.local):context.local?{reason:AGENT_REASON.API_ERROR,message:`${error instanceof Error?asSentence(error.message):"Failed to connect to local Schedules."} Check the local session and restart ${getCommandName("dev")} in this project if needed.`,retryable:!1,userActionRequired:!0}:{reason:AGENT_REASON.API_ERROR,message:"Failed to connect to the Schedules API. Check your connection and try again.",retryable:!0};let serverMessage=error.serverMessage?.trim().toLowerCase();if(context.local&&context.action==="invoke"&&error.status>=500)return ambiguousInvokeError(!0);if(context.local&&(error.status===401||error.status===402||error.status===403||/(?:project|session)_(?:mismatch|not_found|expired)/.test(error.code??"")||/^(?:local )?(?:project|session)\b/.test(serverMessage??"")))return{reason:AGENT_REASON.API_ERROR,message:`${apiErrorDetail(error)??"The local Schedules session is unavailable."} Restart ${getCommandName("dev")} in this project and use its local session.`,retryable:!1,userActionRequired:!0};if(error.code==="schedule_already_exists")return{reason:AGENT_REASON.SCHEDULE_ALREADY_EXISTS,message:context.name?`Schedule ${context.namespace}/${context.name} already exists. Choose a different name or update the existing schedule.`:"The schedule already exists. Choose a different name or update the existing schedule.",retryable:!1};if(error.code==="schedule_completed")return{reason:AGENT_REASON.SCHEDULE_COMPLETED,message:context.name?`Schedule ${context.namespace}/${context.name} has completed and can't be modified. Delete it or create a new schedule.`:"The schedule has completed and can't be modified. Delete it or create a new schedule.",retryable:!1};if(error.code==="static_schedule"){let schedule=context.name?`${quoteArg(context.name)} --namespace ${quoteArg(context.namespace)}`:void 0;return{reason:AGENT_REASON.STATIC_SCHEDULE,message:context.name?`Static schedule ${context.namespace}/${context.name} can't be updated or deleted. Enable or disable it instead.`:"Static schedules can't be updated or deleted. Enable or disable them instead.",retryable:!1,...schedule&&{next:[{command:buildCommandWithGlobalFlags(client.argv,`schedules enable ${schedule}`,void 0,{excludeFlags:["--yes"]}),when:"Enable the static schedule"},{command:buildCommandWithGlobalFlags(client.argv,`schedules disable ${schedule}`,void 0,{excludeFlags:["--yes"]}),when:"Disable the static schedule"}]}}}if(error.code==="invalid_cron_expression")return{reason:AGENT_REASON.INVALID_CRON_EXPRESSION,message:`${apiErrorDetail(error)??"The cron expression is invalid."} Check \`--cron\` and try again.`,retryable:!1};if(error.code==="invalid_jitter")return{reason:AGENT_REASON.INVALID_JITTER,message:apiErrorDetail(error)??"The schedule jitter setting is invalid.",retryable:!1};if(error.code==="jitter_exceeds_cadence")return{reason:AGENT_REASON.JITTER_EXCEEDS_CADENCE,message:`${apiErrorDetail(error)??"The schedule jitter exceeds the interval between runs."} Increase the interval between runs.`,retryable:!1};if(error.code==="single_at_too_soon")return{reason:AGENT_REASON.SINGLE_AT_TOO_SOON,message:`${apiErrorDetail(error)??"The one-time schedule is too soon."} Choose a later value for \`--at\`.`,retryable:!1};if(error.code==="payload_too_large")return{reason:AGENT_REASON.SCHEDULE_PAYLOAD_TOO_LARGE,message:`${apiErrorDetail(error)??"The schedule payload is too large."} Reduce the value passed to \`--payload\` and try again.`,retryable:!1};if(error.code==="payload_store_failed")return{reason:AGENT_REASON.SCHEDULE_PAYLOAD_STORE_FAILED,message:"Failed to store the schedule payload. Try again later.",retryable:!0};if(error.code==="service_unavailable")return{reason:AGENT_REASON.SCHEDULE_SERVICE_UNAVAILABLE,message:"Schedule execution history is temporarily unavailable. Try again later.",retryable:!0};if(error.code==="service_error")return{reason:AGENT_REASON.SCHEDULE_SERVICE_ERROR,message:error.status>=500?"Failed to load schedule execution history. Try again later.":"Failed to load schedule execution history. Choose a shorter time range and try again.",retryable:error.status>=500};if(error.status===400){let detail2=apiErrorDetail(error);return{reason:AGENT_REASON.INVALID_ARGUMENTS,message:`The Schedules API rejected the request.${detail2?` ${detail2}`:""}`,retryable:!1}}if(error.status===401&&error.code==="missing_team_param")return{reason:AGENT_REASON.MISSING_SCOPE,message:"Schedules requires a team project. Run `vercel link` to link a project owned by a team.",retryable:!1,userActionRequired:!0};if(error.status===401){let tokenSource=client.authConfig.tokenSource;return{reason:AGENT_REASON.LOGIN_REQUIRED,message:tokenSource==="env"?"Schedules API authentication failed. Replace VERCEL_TOKEN, or unset it to use your saved login.":tokenSource==="flag"?"Schedules API authentication failed. Replace the token passed to `--token`.":`Schedules API authentication failed. Run ${getCommandName("login")} and try again.`,retryable:!1,userActionRequired:!0}}if(error.status===402){let detail2=apiErrorDetail(error);return{reason:AGENT_REASON.PLAN_UPGRADE_REQUIRED,message:`Schedules isn't available for this team.${detail2?` ${detail2}`:""} Ask a team owner to review the requirement.`,retryable:!1,userActionRequired:!0}}if(error.status===403&&error.code==="not_enabled"||!context.local&&error.status===404&&(serverMessage==="not found"||serverMessage==="not found."))return{reason:AGENT_REASON.SCHEDULES_NOT_ENABLED,message:"Vercel Schedules is not enabled for this team.",retryable:!1,userActionRequired:!0};if(error.status===403)return{reason:AGENT_REASON.PERMISSION_DENIED,message:"Can't access Schedules with the current credentials and team. Check the token and selected team. If both are correct, ask a team owner for access.",retryable:!1,userActionRequired:!0};if(error.status===404&&(serverMessage==="project not found"||serverMessage==="project not found."))return{reason:AGENT_REASON.PROJECT_NOT_FOUND,message:"The linked project isn't available to this team. Run `vercel link` to update the project link.",retryable:!1,userActionRequired:!0};if(error.status===404&&context.action!=="create"&&context.action!=="list"&&context.name)return{reason:AGENT_REASON.NOT_FOUND,message:`Schedule not found: ${context.namespace}/${context.name}.`,retryable:!1};if(error.status===429){let retryAfterMs=typeof error.retryAfterMs=="number"&&error.retryAfterMs>0?error.retryAfterMs:void 0;return{reason:AGENT_REASON.RATE_LIMITED,message:retryAfterMs===void 0?"The Schedules API request limit was reached. Wait and try again.":`The Schedules API request limit was reached. Try again in ${Math.ceil(retryAfterMs/1e3)} second${retryAfterMs>1e3?"s":""}.`,retryable:!0,...retryAfterMs&&{retryAfterMs}}}if(error.status>=500)return context.action==="invoke"?ambiguousInvokeError(context.local):{reason:AGENT_REASON.API_ERROR,message:context.local?`Local Schedules is unavailable. Check the ${getCommandName("dev")} output and restart the local session if needed.`:"The Schedules API is temporarily unavailable. Try again later.",retryable:!0};let detail=apiErrorDetail(error);return{reason:AGENT_REASON.API_ERROR,message:`Failed to ${requestDescription(context)}.${detail?` ${detail}`:""}`,retryable:!1}}function handleSchedulesApiError(client,error,context){let details=getSchedulesError(client,error,context);return client.nonInteractive?(outputAgentError(client,{status:AGENT_STATUS.ERROR,...details},1),1):(output_manager_default.fatal(details.message),1)}var import_arg=__toESM(require_arg(),1);var DEFAULT_SCHEDULES_BASE_URL="https://vercel-schedules.com",DEFAULT_SCHEDULE_NAMESPACE="default",DEFAULT_SCHEDULES_LIMIT=20,LocalSchedulesError=class extends Error{constructor(message){super(message),this.name="LocalSchedulesError"}};function sanitizeSchedule(schedule){let{trackId:_trackId,...publicSchedule}=schedule;return publicSchedule}var SchedulesClient=class{constructor(client,options){this.client=client;this.options=options;if("local"in options){if(!isLocalSchedulesOrigin(options.local.origin))throw new LocalSchedulesError("Local Schedules requires an HTTP 127.0.0.1 endpoint with a valid port.");this.baseUrl=new URL(options.local.origin);return}this.baseUrl=new URL(options.baseUrl??process.env.VERCEL_SCHEDULE_BASE_URL??DEFAULT_SCHEDULES_BASE_URL)}get localOrigin(){return"local"in this.options?this.baseUrl.origin:void 0}async request(path3,options={}){let url=new URL(path3,this.baseUrl);if("local"in this.options){let session=this.options.local;url.searchParams.set("projectId",session.projectId);let response;try{response=await directFetch(url.href,{method:options.method??"GET",headers:{authorization:`Bearer ${DEV_RESOURCE_TOKEN}`,[LOCAL_SCHEDULES_SESSION_HEADER]:session.id,...options.body===void 0?{}:{"content-type":"application/json"}},body:options.body===void 0?void 0:JSON.stringify(options.body),redirect:"manual",signal:AbortSignal.timeout(3e4)})}catch{throw new LocalSchedulesError(`Could not reach local Schedules at ${session.origin}. No cloud request was made.`)}if(response.status>=300&&response.status<400||response.headers.get(LOCAL_SCHEDULES_SESSION_HEADER)!==session.id)throw await response.body?.cancel(),new LocalSchedulesError("The local Schedules session changed or returned an unexpected response. Restart vercel dev and try again.");if(!response.ok)throw await responseError(response);if(response.status===204)return;try{return await response.json()}catch{throw new LocalSchedulesError("The local Schedules session returned an invalid JSON response.")}}return url.searchParams.set("projectId",this.options.projectId),this.client.fetch(url.href,{...options,accountId:this.options.ownerId,useCurrentTeam:!1})}schedulePath(name,namespace,suffix=""){return`${`/v1/schedules/${encodeURIComponent(name)}${suffix}`}?${new URLSearchParams({namespace})}`}async create({target,...params}){let schedule=await this.request("/v1/schedules",{method:"POST",bailOn429:!0,body:{...params,target:{type:"queue",topic:target.topic}}});return sanitizeSchedule(schedule)}async get({name,namespace=DEFAULT_SCHEDULE_NAMESPACE}){let schedule=await this.request(this.schedulePath(name,namespace),{bailOn429:!0});return sanitizeSchedule(schedule)}async list({namespace=DEFAULT_SCHEDULE_NAMESPACE,cursor:cursor2,limit=DEFAULT_SCHEDULES_LIMIT}={}){let searchParams=new URLSearchParams({namespace,limit:String(limit)});cursor2!==void 0&&searchParams.set("cursor",cursor2);let response=await this.request(`/v1/schedules?${searchParams}`,{bailOn429:!0});return{data:response.data.map(sanitizeSchedule),cursor:response.cursor}}async update({name,namespace=DEFAULT_SCHEDULE_NAMESPACE,target,...params}){let schedule=await this.request(this.schedulePath(name,namespace),{method:"PATCH",bailOn429:!0,body:{...params,...target?{target:{type:"queue",topic:target.topic}}:{}}});return sanitizeSchedule(schedule)}async delete({name,namespace=DEFAULT_SCHEDULE_NAMESPACE}){return this.request(this.schedulePath(name,namespace),{method:"DELETE",bailOn429:!0})}async enable({name,namespace=DEFAULT_SCHEDULE_NAMESPACE}){return this.changeState(name,namespace,"enable")}async disable({name,namespace=DEFAULT_SCHEDULE_NAMESPACE}){return this.changeState(name,namespace,"disable")}async changeState(name,namespace,action){let schedule=await this.request(this.schedulePath(name,namespace,`/${action}`),{method:"POST",bailOn429:!0});return sanitizeSchedule(schedule)}async invoke({name,namespace=DEFAULT_SCHEDULE_NAMESPACE}){await this.request(this.schedulePath(name,namespace,"/invoke"),{method:"POST",bailOn429:!0,retry:{retries:0}})}async listExecutions({name,namespace=DEFAULT_SCHEDULE_NAMESPACE,cursor:cursor2,limit=DEFAULT_SCHEDULES_LIMIT,sort,from,to,executionId}){if("local"in this.options)throw new LocalSchedulesError("Execution history is not supported for local Schedules. Inspect the vercel dev output for local executions.");let searchParams=new URLSearchParams({limit:String(limit)});return cursor2!==void 0&&searchParams.set("cursor",cursor2),sort!==void 0&&searchParams.set("sort",sort),from!==void 0&&searchParams.set("from",String(from)),to!==void 0&&searchParams.set("to",String(to)),executionId!==void 0&&searchParams.set("executionId",executionId),this.request(`${this.schedulePath(name,namespace,"/executions")}&${searchParams}`,{bailOn429:!0})}};async function createLocalSchedulesClient(client){let sessions=await readLocalSchedulesSessions(client.cwd);if(sessions.length===0)throw new LocalSchedulesError("No running local Schedules session was found in this directory. Start vercel dev here, or use --cwd to select its project directory.");if(sessions.length>1)throw new LocalSchedulesError("Multiple vercel dev sessions are running in this directory. Stop the extra instances before using schedules --local.");let[session]=sessions,response;try{response=await directFetch(`${session.origin}/v1/info`,{headers:{authorization:`Bearer ${DEV_RESOURCE_TOKEN}`,[LOCAL_SCHEDULES_SESSION_HEADER]:session.id},redirect:"manual",signal:AbortSignal.timeout(2e3)})}catch{throw new LocalSchedulesError(`The local Schedules session at ${session.origin} is unavailable. Restart vercel dev in this directory. No cloud request was made.`)}if(!response.ok||response.headers.get(LOCAL_SCHEDULES_SESSION_HEADER)!==session.id)throw await response.body?.cancel(),new LocalSchedulesError("The local Schedules session is stale, not ready, or incompatible. Restart vercel dev in this directory.");let info;try{info=await response.json()}catch{throw new LocalSchedulesError("The local Schedules session returned invalid metadata. Restart vercel dev in this directory.")}if(!info||info.version!==session.version||info.id!==session.id||info.pid!==session.pid||info.cwd!==session.cwd||info.origin!==session.origin||info.projectId!==session.projectId)throw new LocalSchedulesError("The local Schedules session does not match this project instance. Restart vercel dev in this directory.");return new SchedulesClient(client,{local:session})}var IDENTIFIER_PATTERN2=/^[0-9A-Za-z][0-9A-Za-z._-]*$/;var QUEUE_TOPIC_PATTERN=/^[A-Za-z0-9_-]+$/;var LOCAL_MINUTE_DATETIME_PATTERN=/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2})$/,LOCAL_SECOND_DATETIME_PATTERN=/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})$/,TIMEZONE_PATTERN=/^[A-Za-z][A-Za-z0-9_+/-]*$/;function validateScheduleIdentifier(value,label){if(value.length>256)return`${label} must be at most 256 characters.`;if(!IDENTIFIER_PATTERN2.test(value))return`${label} must start with a letter or number and can contain only letters, numbers, periods, underscores, and hyphens.`}function validateScheduleTimezone(value){if(value!==void 0){if(value.length===0||value.length>50||!TIMEZONE_PATTERN.test(value))return"`--timezone` must be a valid IANA timezone.";try{new Intl.DateTimeFormat("en-US",{timeZone:value})}catch{return"`--timezone` must be a valid IANA timezone."}}}function validateScheduleQueueTopic(value){if(value.length>256||!QUEUE_TOPIC_PATTERN.test(value))return"`--topic` must be 1\u2013256 characters and contain only letters, numbers, underscores, and hyphens."}function normalizeLocalDatetime(value){let secondMatch=LOCAL_SECOND_DATETIME_PATTERN.exec(value);if(secondMatch){if(secondMatch[6]!=="00")return}else LOCAL_MINUTE_DATETIME_PATTERN.test(value)&&(value=`${value}:00`);let match=LOCAL_SECOND_DATETIME_PATTERN.exec(value);if(!match)return;let[,yearValue,monthValue,dayValue,hourValue,minuteValue]=match,year=Number(yearValue),month=Number(monthValue),day=Number(dayValue),hour=Number(hourValue),minute=Number(minuteValue),daysInMonth=[31,year%4===0&&(year%100!==0||year%400===0)?29:28,31,30,31,30,31,31,30,31,30,31];if(!(month<1||month>12||day<1||day>daysInMonth[month-1]||hour<0||hour>23||minute<0||minute>59))return value}function parseScheduleExpression(cron,at,required){if(cron!==void 0&&at!==void 0)return{valid:!1,error:"Use either `--cron` or `--at`, not both."};if(cron!==void 0)return cron.trim()?{valid:!0,value:{type:"cron",cron}}:{valid:!1,error:"`--cron` cannot be empty."};if(at!==void 0){let normalized=normalizeLocalDatetime(at);return normalized===void 0?{valid:!1,error:"`--at` must use YYYY-MM-DDTHH:mm or YYYY-MM-DDTHH:mm:00 without a timezone suffix. Use `--timezone` to select the timezone."}:{valid:!0,value:{type:"single",at:normalized}}}return required?{valid:!1,error:"A schedule expression is required. Use `--cron` or `--at`."}:{valid:!0,value:void 0}}function validateJitter(value){return!Number.isInteger(value)||value<1||value>15?{valid:!1,error:"`--jitter` must be an integer between 1 and 15."}:{valid:!0,value}}function parseCreateJitter(value){return value===void 0?{valid:!0,value:void 0}:validateJitter(value)}function parseUpdateJitter(value){return value===void 0?{valid:!0,value:void 0}:value==="none"?{valid:!0,value:null}:validateJitter(Number(value))}function parseSchedulePayload(value){if(value===void 0)return{valid:!0,value:void 0};try{return{valid:!0,value:JSON.parse(value)}}catch{return{valid:!1,error:"`--payload` must be valid JSON."}}}var routingFlags=getFlagsSpecification([...schedulesCommand.subcommands.flatMap(command2=>[...command2.options]),...executionsListSubcommand.options]);function takeScheduleCommand(argv){let positional;try{positional=(0,import_arg.default)({...arg_common_default(),...routingFlags},{argv,stopAtPositional:!0})._}catch(error){throw parseArguments(argv,routingFlags),error}let index=argv.length-positional.length;return{command:positional[0],args:[...argv.slice(0,index),...argv.slice(index+1)]}}function scheduleCommandWithGlobalFlags(client,usage2){let local=!1;try{local=!!parseArguments(client.argv.slice(2),routingFlags,{permissive:!0}).flags["--local"]}catch{}return buildCommandWithGlobalFlags(client.argv,`${usage2}${local?" --local":""}`,void 0,{excludeFlags:local?["--scope","--team"]:[]})}function validateLocalScheduleFlags(client,flags,usage2){if(!flags["--local"])return;let originalFlags;try{originalFlags=parseArguments(client.argv.slice(2),routingFlags,{permissive:!0}).flags}catch(error){return invalidScheduleArguments(client,usage2,error instanceof Error?error.message:String(error))}for(let flag of["--scope","--team","--token"])if(flags[flag]!==void 0||originalFlags[flag]!==void 0)return invalidScheduleArguments(client,usage2,`Cannot combine --local with ${flag}. Local Schedules uses the current vercel dev session.`)}function unsupportedLocalExecutions(client){let message="Execution history is not supported for local Schedules. Inspect the vercel dev output for local executions.";return client.nonInteractive?outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.API_ERROR,message,retryable:!1}):output_manager_default.fatal(message),1}async function resolveSchedulesClient(client,local){if(local)try{let schedules=await createLocalSchedulesClient(client);return output_manager_default.log(`Using local Schedules at ${schedules.localOrigin}`),schedules}catch(error){let message=error instanceof Error?error.message:String(error);return client.nonInteractive?outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.API_ERROR,message,retryable:!1}):output_manager_default.fatal(message),1}let link=await requireProjectContext(client,"schedules");return typeof link=="number"?link:new SchedulesClient(client,{ownerId:link.org.id,projectId:link.project.id})}function invalidScheduleArguments(client,usage2,message){return client.nonInteractive?(outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message,next:[{command:scheduleCommandWithGlobalFlags(client,usage2),when:"Provide valid schedule arguments"}]}),2):(output_manager_default.fatal(message),2)}function validateScheduleNameAndNamespace(client,args,namespaceFlag,usage2){let[name]=args;if(!name)return{valid:!1,exitCode:invalidScheduleArguments(client,usage2,"A schedule name is required")};if(args.length!==1)return{valid:!1,exitCode:invalidScheduleArguments(client,usage2,`Expected one schedule name. Usage: ${getCommandName(usage2)}`)};let namespace=namespaceFlag??DEFAULT_SCHEDULE_NAMESPACE,nameError=validateScheduleIdentifier(name,"Schedule name"),namespaceError=validateScheduleIdentifier(namespace,"Namespace"),error=nameError??namespaceError;return error?{valid:!1,exitCode:invalidScheduleArguments(client,usage2,error)}:{valid:!0,name,namespace}}function parseScheduleOutput(client,usage2,flags){let result=validateJsonOutput(flags);return result.valid?{valid:!0,json:result.jsonOutput||client.nonInteractive}:{valid:!1,exitCode:invalidScheduleArguments(client,usage2,result.error)}}function writeScheduleMutationResult(client,schedule,message,json){if(json){let value=client.nonInteractive?{status:AGENT_STATUS.OK,schedule,message}:schedule;client.stdout.write(`${JSON.stringify(value,null,2)}
|
|
1345
|
+
`),await offerAutoPromote(client,projectId,version2,!!existingStagingVersion,{teamId,skipPrompts}),0}catch(e2){let error=e2;return client.nonInteractive&&outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.ROUTE_CREATE_FAILED,message:"Route creation failed for this project. See hint for next steps.",hint:error.message||"Use `vercel routes list --diff` to inspect staged routes, then adjust flags and retry.",next:[{command:withGlobalFlags2(client,"routes list --diff"),when:"to inspect staged state"}]},1),output_manager_default.error(error.message||"Failed to create route"),1}}var COMMAND_CONFIG58={list:getCommandAliases(listSubcommand20),"list-versions":getCommandAliases(listVersionsSubcommand2),inspect:getCommandAliases(inspectSubcommand13),add:getCommandAliases(addSubcommand10),edit:getCommandAliases(editSubcommand2),delete:getCommandAliases(deleteSubcommand3),enable:getCommandAliases(enableSubcommand3),disable:getCommandAliases(disableSubcommand3),reorder:getCommandAliases(reorderSubcommand),export:getCommandAliases(exportSubcommand),publish:getCommandAliases(publishSubcommand2),restore:getCommandAliases(restoreSubcommand2),"discard-staging":getCommandAliases(discardSubcommand2)};async function main31(client){let telemetry2=new RoutesTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(routesCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),2}let subArgs=parsedArgs.args.slice(1),{subcommand,args,subcommandOriginal}=getSubcommand7(subArgs,COMMAND_CONFIG58),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("routes"),output_manager_default.print(help(routesCommand,{columns:client.stderr.columns})),0;function printHelp(command2){output_manager_default.print(help(command2,{parent:routesCommand,columns:client.stderr.columns}))}switch(subcommand&&!needHelp&&telemetry2.trackCliOptionProject(getProjectOptionFromArgs(args)),subcommand){case"list":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(listSubcommand20),0):(telemetry2.trackCliSubcommandList(subcommandOriginal),list23(client,args));case"list-versions":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(listVersionsSubcommand2),0):(telemetry2.trackCliSubcommandListVersions(subcommandOriginal),listVersions3(client,args));case"inspect":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(inspectSubcommand13),0):(telemetry2.trackCliSubcommandInspect(subcommandOriginal),inspect18(client,args));case"add":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(addSubcommand10),0):(telemetry2.trackCliSubcommandAdd(subcommandOriginal),add13(client,args));case"edit":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(editSubcommand2),0):(telemetry2.trackCliSubcommandEdit(subcommandOriginal),(await import("./chunks/edit-3PKYF5FY.js")).default(client,args));case"delete":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(deleteSubcommand3),0):(telemetry2.trackCliSubcommandDelete(subcommandOriginal),(await import("./chunks/delete-MZ4LAS3L.js")).default(client,args));case"enable":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(enableSubcommand3),0):(telemetry2.trackCliSubcommandEnable(subcommandOriginal),(await import("./chunks/enable-AKGADEKU.js")).default(client,args));case"disable":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(disableSubcommand3),0):(telemetry2.trackCliSubcommandDisable(subcommandOriginal),(await import("./chunks/disable-YZATFLNR.js")).default(client,args));case"reorder":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(reorderSubcommand),0):(telemetry2.trackCliSubcommandReorder(subcommandOriginal),(await import("./chunks/reorder-TPLZXSRB.js")).default(client,args));case"export":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(exportSubcommand),0):(telemetry2.trackCliSubcommandExport(subcommandOriginal),(await import("./chunks/export-NKCN63SF.js")).default(client,args));case"publish":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(publishSubcommand2),0):(telemetry2.trackCliSubcommandPublish(subcommandOriginal),(await import("./chunks/publish-5TK3IVYM.js")).default(client,args));case"restore":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(restoreSubcommand2),0):(telemetry2.trackCliSubcommandRestore(subcommandOriginal),(await import("./chunks/restore-TZAXCNLL.js")).default(client,args));case"discard-staging":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(discardSubcommand2),0):(telemetry2.trackCliSubcommandDiscardStaging(subcommandOriginal),(await import("./chunks/discard-B5IFVCDR.js")).default(client,args));default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG58)),output_manager_default.print(help(routesCommand,{columns:client.stderr.columns})),2}}function getFlagValue(args,names){let value;for(let i=0;i<args.length;i++){let arg2=args[i],[option,inlineValue]=arg2.split("=",2);if(names.includes(option)){if(inlineValue!==void 0){value=inlineValue;continue}i+1<args.length&&(value=args[i+1],i++)}}return value}async function sandbox(client){let argv=client.argv.slice(2),commandIndex=argv.indexOf("sandbox"),rootArgs=commandIndex===-1?argv:argv.slice(0,commandIndex),sandboxArgs=commandIndex===-1?[]:argv.slice(commandIndex+1),scope=getFlagValue(rootArgs,["--scope","-S"]),team=getFlagValue(rootArgs,["--team","-T"]),token2=getFlagValue(rootArgs,["--token","-t"]),forwardedArgs=[...scope?["--scope",scope]:team?["--team",team]:[],...sandboxArgs],originalCwd=process.cwd(),originalAuthToken=process.env.VERCEL_AUTH_TOKEN;try{token2?process.env.VERCEL_AUTH_TOKEN=token2:!process.env.VERCEL_AUTH_TOKEN&&process.env.VERCEL_TOKEN?process.env.VERCEL_AUTH_TOKEN=process.env.VERCEL_TOKEN:!process.env.VERCEL_AUTH_TOKEN&&client.authConfig.token&&(process.env.VERCEL_AUTH_TOKEN=client.authConfig.token),process.env.VERCEL_CLI_INVOCATION_ID=client.telemetryEventStore.currentInvocationId,process.chdir(client.cwd);let{createApp}=await import("sandbox");return await createApp({appName:"vercel sandbox",withoutAuth:!1}).run(forwardedArgs),0}catch(error){return printError(error),1}finally{process.chdir(originalCwd),typeof originalAuthToken=="string"?process.env.VERCEL_AUTH_TOKEN=originalAuthToken:delete process.env.VERCEL_AUTH_TOKEN}}var SchedulesTelemetryClient=class extends TelemetryClient{trackCliFlagLocal(local){local&&this.trackCliFlag("local")}trackCliSubcommandInspect(actual){this.trackCliSubcommand({subcommand:"inspect",value:actual})}trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandCreate(actual){this.trackCliSubcommand({subcommand:"create",value:actual})}trackCliSubcommandUpdate(actual){this.trackCliSubcommand({subcommand:"update",value:actual})}trackCliSubcommandEnable(actual){this.trackCliSubcommand({subcommand:"enable",value:actual})}trackCliSubcommandDisable(actual){this.trackCliSubcommand({subcommand:"disable",value:actual})}trackCliSubcommandInvoke(actual){this.trackCliSubcommand({subcommand:"invoke",value:actual})}trackCliSubcommandDelete(actual){this.trackCliSubcommand({subcommand:"delete",value:actual})}trackCliSubcommandExecutions(actual){this.trackCliSubcommand({subcommand:"executions",value:actual})}trackCliSubcommandExecutionsList(actual){this.trackCliSubcommand({subcommand:"executions:list",value:actual})}};var SchedulesActionTelemetryClient=class extends TelemetryClient{trackCliArgumentName(name){name&&this.trackCliArgument({arg:"name",value:this.redactedValue})}trackCliOptionNamespace(namespace){namespace&&this.trackCliOption({option:"namespace",value:this.redactedValue})}trackCliOptionFormat(format3){format3&&this.trackCliOption({option:"format",value:format3})}trackCliFlagLocal(local){local&&this.trackCliFlag("local")}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};function asSentence(value){let trimmed=value.trim();return/[.!?]$/.test(trimmed)?trimmed:`${trimmed}.`}function apiErrorDetail(error){let message=error.serverMessage?.trim();return message&&message!=="Response Error"?asSentence(message):void 0}function requestDescription(context){return context.action==="list"?`list schedules in namespace ${context.namespace}`:context.action==="list-executions"?`list executions for schedule ${context.namespace}/${context.name}`:`${context.action} schedule ${context.namespace}/${context.name}`}function ambiguousInvokeError(local){return{reason:AGENT_REASON.API_ERROR,message:"The schedule invocation may have been accepted, but the CLI did not receive confirmation. Check whether the schedule ran before invoking it again."+(local?` Inspect the ${getCommandName("dev")} output for local executions.`:""),retryable:!1,userActionRequired:!0}}function getSchedulesError(client,error,context){if(!isAPIError(error))return context.action==="invoke"?ambiguousInvokeError(context.local):context.local?{reason:AGENT_REASON.API_ERROR,message:`${error instanceof Error?asSentence(error.message):"Failed to connect to local Schedules."} Check the local session and restart ${getCommandName("dev")} in this project if needed.`,retryable:!1,userActionRequired:!0}:{reason:AGENT_REASON.API_ERROR,message:"Failed to connect to the Schedules API. Check your connection and try again.",retryable:!0};let serverMessage=error.serverMessage?.trim().toLowerCase();if(context.local&&context.action==="invoke"&&error.status>=500)return ambiguousInvokeError(!0);if(context.local&&(error.status===401||error.status===402||error.status===403||/(?:project|session)_(?:mismatch|not_found|expired)/.test(error.code??"")||/^(?:local )?(?:project|session)\b/.test(serverMessage??"")))return{reason:AGENT_REASON.API_ERROR,message:`${apiErrorDetail(error)??"The local Schedules session is unavailable."} Restart ${getCommandName("dev")} in this project and use its local session.`,retryable:!1,userActionRequired:!0};if(error.code==="schedule_already_exists")return{reason:AGENT_REASON.SCHEDULE_ALREADY_EXISTS,message:context.name?`Schedule ${context.namespace}/${context.name} already exists. Choose a different name or update the existing schedule.`:"The schedule already exists. Choose a different name or update the existing schedule.",retryable:!1};if(error.code==="schedule_completed")return{reason:AGENT_REASON.SCHEDULE_COMPLETED,message:context.name?`Schedule ${context.namespace}/${context.name} has completed and can't be modified. Delete it or create a new schedule.`:"The schedule has completed and can't be modified. Delete it or create a new schedule.",retryable:!1};if(error.code==="static_schedule"){let schedule=context.name?`${quoteArg(context.name)} --namespace ${quoteArg(context.namespace)}`:void 0;return{reason:AGENT_REASON.STATIC_SCHEDULE,message:context.name?`Static schedule ${context.namespace}/${context.name} can't be updated or deleted. Enable or disable it instead.`:"Static schedules can't be updated or deleted. Enable or disable them instead.",retryable:!1,...schedule&&{next:[{command:buildCommandWithGlobalFlags(client.argv,`schedules enable ${schedule}`,void 0,{excludeFlags:["--yes"]}),when:"Enable the static schedule"},{command:buildCommandWithGlobalFlags(client.argv,`schedules disable ${schedule}`,void 0,{excludeFlags:["--yes"]}),when:"Disable the static schedule"}]}}}if(error.code==="invalid_cron_expression")return{reason:AGENT_REASON.INVALID_CRON_EXPRESSION,message:`${apiErrorDetail(error)??"The cron expression is invalid."} Check \`--cron\` and try again.`,retryable:!1};if(error.code==="invalid_jitter")return{reason:AGENT_REASON.INVALID_JITTER,message:apiErrorDetail(error)??"The schedule jitter setting is invalid.",retryable:!1};if(error.code==="jitter_exceeds_cadence")return{reason:AGENT_REASON.JITTER_EXCEEDS_CADENCE,message:`${apiErrorDetail(error)??"The schedule jitter exceeds the interval between runs."} Increase the interval between runs.`,retryable:!1};if(error.code==="single_at_too_soon")return{reason:AGENT_REASON.SINGLE_AT_TOO_SOON,message:`${apiErrorDetail(error)??"The one-time schedule is too soon."} Choose a later value for \`--at\`.`,retryable:!1};if(error.code==="payload_too_large")return{reason:AGENT_REASON.SCHEDULE_PAYLOAD_TOO_LARGE,message:`${apiErrorDetail(error)??"The schedule payload is too large."} Reduce the value passed to \`--payload\` and try again.`,retryable:!1};if(error.code==="payload_store_failed")return{reason:AGENT_REASON.SCHEDULE_PAYLOAD_STORE_FAILED,message:"Failed to store the schedule payload. Try again later.",retryable:!0};if(error.code==="service_unavailable")return{reason:AGENT_REASON.SCHEDULE_SERVICE_UNAVAILABLE,message:"Schedule execution history is temporarily unavailable. Try again later.",retryable:!0};if(error.code==="service_error")return{reason:AGENT_REASON.SCHEDULE_SERVICE_ERROR,message:error.status>=500?"Failed to load schedule execution history. Try again later.":"Failed to load schedule execution history. Choose a shorter time range and try again.",retryable:error.status>=500};if(error.status===400){let detail2=apiErrorDetail(error);return{reason:AGENT_REASON.INVALID_ARGUMENTS,message:`The Schedules API rejected the request.${detail2?` ${detail2}`:""}`,retryable:!1}}if(error.status===401&&error.code==="missing_team_param")return{reason:AGENT_REASON.MISSING_SCOPE,message:"Schedules requires a team project. Run `vercel link` to link a project owned by a team.",retryable:!1,userActionRequired:!0};if(error.status===401){let tokenSource=client.authConfig.tokenSource;return{reason:AGENT_REASON.LOGIN_REQUIRED,message:tokenSource==="env"?"Schedules API authentication failed. Replace VERCEL_TOKEN, or unset it to use your saved login.":tokenSource==="flag"?"Schedules API authentication failed. Replace the token passed to `--token`.":`Schedules API authentication failed. Run ${getCommandName("login")} and try again.`,retryable:!1,userActionRequired:!0}}if(error.status===402){let detail2=apiErrorDetail(error);return{reason:AGENT_REASON.PLAN_UPGRADE_REQUIRED,message:`Schedules isn't available for this team.${detail2?` ${detail2}`:""} Ask a team owner to review the requirement.`,retryable:!1,userActionRequired:!0}}if(error.status===403&&error.code==="not_enabled"||!context.local&&error.status===404&&(serverMessage==="not found"||serverMessage==="not found."))return{reason:AGENT_REASON.SCHEDULES_NOT_ENABLED,message:"Vercel Schedules is not enabled for this team.",retryable:!1,userActionRequired:!0};if(error.status===403)return{reason:AGENT_REASON.PERMISSION_DENIED,message:"Can't access Schedules with the current credentials and team. Check the token and selected team. If both are correct, ask a team owner for access.",retryable:!1,userActionRequired:!0};if(error.status===404&&(serverMessage==="project not found"||serverMessage==="project not found."))return{reason:AGENT_REASON.PROJECT_NOT_FOUND,message:"The linked project isn't available to this team. Run `vercel link` to update the project link.",retryable:!1,userActionRequired:!0};if(error.status===404&&context.action!=="create"&&context.action!=="list"&&context.name)return{reason:AGENT_REASON.NOT_FOUND,message:`Schedule not found: ${context.namespace}/${context.name}.`,retryable:!1};if(error.status===429){let retryAfterMs=typeof error.retryAfterMs=="number"&&error.retryAfterMs>0?error.retryAfterMs:void 0;return{reason:AGENT_REASON.RATE_LIMITED,message:retryAfterMs===void 0?"The Schedules API request limit was reached. Wait and try again.":`The Schedules API request limit was reached. Try again in ${Math.ceil(retryAfterMs/1e3)} second${retryAfterMs>1e3?"s":""}.`,retryable:!0,...retryAfterMs&&{retryAfterMs}}}if(error.status>=500)return context.action==="invoke"?ambiguousInvokeError(context.local):{reason:AGENT_REASON.API_ERROR,message:context.local?`Local Schedules is unavailable. Check the ${getCommandName("dev")} output and restart the local session if needed.`:"The Schedules API is temporarily unavailable. Try again later.",retryable:!0};let detail=apiErrorDetail(error);return{reason:AGENT_REASON.API_ERROR,message:`Failed to ${requestDescription(context)}.${detail?` ${detail}`:""}`,retryable:!1}}function handleSchedulesApiError(client,error,context){let details=getSchedulesError(client,error,context);return client.nonInteractive?(outputAgentError(client,{status:AGENT_STATUS.ERROR,...details},1),1):(output_manager_default.fatal(details.message),1)}var import_arg=__toESM(require_arg(),1);var DEFAULT_SCHEDULES_BASE_URL="https://vercel-schedules.com",DEFAULT_SCHEDULE_NAMESPACE="default",DEFAULT_SCHEDULES_LIMIT=20,LocalSchedulesError=class extends Error{constructor(message){super(message),this.name="LocalSchedulesError"}};function sanitizeSchedule(schedule){let{trackId:_trackId,...publicSchedule}=schedule;return publicSchedule}var SchedulesClient=class{constructor(client,options){this.client=client;this.options=options;if("local"in options){if(!isLocalSchedulesOrigin(options.local.origin))throw new LocalSchedulesError("Local Schedules requires an HTTP 127.0.0.1 endpoint with a valid port.");this.baseUrl=new URL(options.local.origin);return}this.baseUrl=new URL(options.baseUrl??process.env.VERCEL_SCHEDULE_BASE_URL??DEFAULT_SCHEDULES_BASE_URL)}get localOrigin(){return"local"in this.options?this.baseUrl.origin:void 0}async request(path3,options={}){let url=new URL(path3,this.baseUrl);if("local"in this.options){let session=this.options.local;url.searchParams.set("projectId",session.projectId);let response;try{response=await directFetch(url.href,{method:options.method??"GET",headers:{authorization:`Bearer ${DEV_RESOURCE_TOKEN}`,[LOCAL_SCHEDULES_SESSION_HEADER]:session.id,...options.body===void 0?{}:{"content-type":"application/json"}},body:options.body===void 0?void 0:JSON.stringify(options.body),redirect:"manual",signal:AbortSignal.timeout(3e4)})}catch{throw new LocalSchedulesError(`Could not reach local Schedules at ${session.origin}. No cloud request was made.`)}if(response.status>=300&&response.status<400||response.headers.get(LOCAL_SCHEDULES_SESSION_HEADER)!==session.id)throw await response.body?.cancel(),new LocalSchedulesError("The local Schedules session changed or returned an unexpected response. Restart vercel dev and try again.");if(!response.ok)throw await responseError(response);if(response.status===204)return;try{return await response.json()}catch{throw new LocalSchedulesError("The local Schedules session returned an invalid JSON response.")}}return url.searchParams.set("projectId",this.options.projectId),this.client.fetch(url.href,{...options,accountId:this.options.ownerId,useCurrentTeam:!1})}schedulePath(name,namespace,suffix=""){return`${`/v1/schedules/${encodeURIComponent(name)}${suffix}`}?${new URLSearchParams({namespace})}`}async create({target,...params}){let schedule=await this.request("/v1/schedules",{method:"POST",bailOn429:!0,body:{...params,target:{type:"queue",topic:target.topic}}});return sanitizeSchedule(schedule)}async get({name,namespace=DEFAULT_SCHEDULE_NAMESPACE}){let schedule=await this.request(this.schedulePath(name,namespace),{bailOn429:!0});return sanitizeSchedule(schedule)}async list({namespace=DEFAULT_SCHEDULE_NAMESPACE,cursor:cursor2,limit=DEFAULT_SCHEDULES_LIMIT}={}){let searchParams=new URLSearchParams({namespace,limit:String(limit)});cursor2!==void 0&&searchParams.set("cursor",cursor2);let response=await this.request(`/v1/schedules?${searchParams}`,{bailOn429:!0});return{data:response.data.map(sanitizeSchedule),cursor:response.cursor}}async update({name,namespace=DEFAULT_SCHEDULE_NAMESPACE,target,...params}){let schedule=await this.request(this.schedulePath(name,namespace),{method:"PATCH",bailOn429:!0,body:{...params,...target?{target:{type:"queue",topic:target.topic}}:{}}});return sanitizeSchedule(schedule)}async delete({name,namespace=DEFAULT_SCHEDULE_NAMESPACE}){return this.request(this.schedulePath(name,namespace),{method:"DELETE",bailOn429:!0})}async enable({name,namespace=DEFAULT_SCHEDULE_NAMESPACE}){return this.changeState(name,namespace,"enable")}async disable({name,namespace=DEFAULT_SCHEDULE_NAMESPACE}){return this.changeState(name,namespace,"disable")}async changeState(name,namespace,action){let schedule=await this.request(this.schedulePath(name,namespace,`/${action}`),{method:"POST",bailOn429:!0});return sanitizeSchedule(schedule)}async invoke({name,namespace=DEFAULT_SCHEDULE_NAMESPACE}){await this.request(this.schedulePath(name,namespace,"/invoke"),{method:"POST",bailOn429:!0,retry:{retries:0}})}async listExecutions({name,namespace=DEFAULT_SCHEDULE_NAMESPACE,cursor:cursor2,limit=DEFAULT_SCHEDULES_LIMIT,sort,from,to,executionId}){if("local"in this.options)throw new LocalSchedulesError("Execution history is not supported for local Schedules. Inspect the vercel dev output for local executions.");let searchParams=new URLSearchParams({limit:String(limit)});return cursor2!==void 0&&searchParams.set("cursor",cursor2),sort!==void 0&&searchParams.set("sort",sort),from!==void 0&&searchParams.set("from",String(from)),to!==void 0&&searchParams.set("to",String(to)),executionId!==void 0&&searchParams.set("executionId",executionId),this.request(`${this.schedulePath(name,namespace,"/executions")}&${searchParams}`,{bailOn429:!0})}};async function createLocalSchedulesClient(client){let sessions=await readLocalSchedulesSessions(client.cwd);if(sessions.length===0)throw new LocalSchedulesError("No running local Schedules session was found in this directory. Start vercel dev here, or use --cwd to select its project directory.");if(sessions.length>1)throw new LocalSchedulesError("Multiple vercel dev sessions are running in this directory. Stop the extra instances before using schedules --local.");let[session]=sessions,response;try{response=await directFetch(`${session.origin}/v1/info`,{headers:{authorization:`Bearer ${DEV_RESOURCE_TOKEN}`,[LOCAL_SCHEDULES_SESSION_HEADER]:session.id},redirect:"manual",signal:AbortSignal.timeout(2e3)})}catch{throw new LocalSchedulesError(`The local Schedules session at ${session.origin} is unavailable. Restart vercel dev in this directory. No cloud request was made.`)}if(!response.ok||response.headers.get(LOCAL_SCHEDULES_SESSION_HEADER)!==session.id)throw await response.body?.cancel(),new LocalSchedulesError("The local Schedules session is stale, not ready, or incompatible. Restart vercel dev in this directory.");let info;try{info=await response.json()}catch{throw new LocalSchedulesError("The local Schedules session returned invalid metadata. Restart vercel dev in this directory.")}if(!info||info.version!==session.version||info.id!==session.id||info.pid!==session.pid||info.cwd!==session.cwd||info.origin!==session.origin||info.projectId!==session.projectId)throw new LocalSchedulesError("The local Schedules session does not match this project instance. Restart vercel dev in this directory.");return new SchedulesClient(client,{local:session})}var IDENTIFIER_PATTERN2=/^[0-9A-Za-z][0-9A-Za-z._-]*$/;var QUEUE_TOPIC_PATTERN=/^[A-Za-z0-9_-]+$/;var LOCAL_MINUTE_DATETIME_PATTERN=/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2})$/,LOCAL_SECOND_DATETIME_PATTERN=/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})$/,TIMEZONE_PATTERN=/^[A-Za-z][A-Za-z0-9_+/-]*$/;function validateScheduleIdentifier(value,label){if(value.length>256)return`${label} must be at most 256 characters.`;if(!IDENTIFIER_PATTERN2.test(value))return`${label} must start with a letter or number and can contain only letters, numbers, periods, underscores, and hyphens.`}function validateScheduleTimezone(value){if(value!==void 0){if(value.length===0||value.length>50||!TIMEZONE_PATTERN.test(value))return"`--timezone` must be a valid IANA timezone.";try{new Intl.DateTimeFormat("en-US",{timeZone:value})}catch{return"`--timezone` must be a valid IANA timezone."}}}function validateScheduleQueueTopic(value){if(value.length>256||!QUEUE_TOPIC_PATTERN.test(value))return"`--topic` must be 1\u2013256 characters and contain only letters, numbers, underscores, and hyphens."}function normalizeLocalDatetime(value){let secondMatch=LOCAL_SECOND_DATETIME_PATTERN.exec(value);if(secondMatch){if(secondMatch[6]!=="00")return}else LOCAL_MINUTE_DATETIME_PATTERN.test(value)&&(value=`${value}:00`);let match=LOCAL_SECOND_DATETIME_PATTERN.exec(value);if(!match)return;let[,yearValue,monthValue,dayValue,hourValue,minuteValue]=match,year=Number(yearValue),month=Number(monthValue),day=Number(dayValue),hour=Number(hourValue),minute=Number(minuteValue),daysInMonth=[31,year%4===0&&(year%100!==0||year%400===0)?29:28,31,30,31,30,31,31,30,31,30,31];if(!(month<1||month>12||day<1||day>daysInMonth[month-1]||hour<0||hour>23||minute<0||minute>59))return value}function parseScheduleExpression(cron,at,required){if(cron!==void 0&&at!==void 0)return{valid:!1,error:"Use either `--cron` or `--at`, not both."};if(cron!==void 0)return cron.trim()?{valid:!0,value:{type:"cron",cron}}:{valid:!1,error:"`--cron` cannot be empty."};if(at!==void 0){let normalized=normalizeLocalDatetime(at);return normalized===void 0?{valid:!1,error:"`--at` must use YYYY-MM-DDTHH:mm or YYYY-MM-DDTHH:mm:00 without a timezone suffix. Use `--timezone` to select the timezone."}:{valid:!0,value:{type:"single",at:normalized}}}return required?{valid:!1,error:"A schedule expression is required. Use `--cron` or `--at`."}:{valid:!0,value:void 0}}function validateJitter(value){return!Number.isInteger(value)||value<1||value>15?{valid:!1,error:"`--jitter` must be an integer between 1 and 15."}:{valid:!0,value}}function parseCreateJitter(value){return value===void 0?{valid:!0,value:void 0}:validateJitter(value)}function parseUpdateJitter(value){return value===void 0?{valid:!0,value:void 0}:value==="none"?{valid:!0,value:null}:validateJitter(Number(value))}function parseSchedulePayload(value){if(value===void 0)return{valid:!0,value:void 0};try{return{valid:!0,value:JSON.parse(value)}}catch{return{valid:!1,error:"`--payload` must be valid JSON."}}}var routingFlags=getFlagsSpecification([...schedulesCommand.subcommands.flatMap(command2=>[...command2.options]),...executionsListSubcommand.options]);function takeScheduleCommand(argv){let positional;try{positional=(0,import_arg.default)({...arg_common_default(),...routingFlags},{argv,stopAtPositional:!0})._}catch(error){throw parseArguments(argv,routingFlags),error}let index=argv.length-positional.length;return{command:positional[0],args:[...argv.slice(0,index),...argv.slice(index+1)]}}function scheduleCommandWithGlobalFlags(client,usage2){let local=!1;try{local=!!parseArguments(client.argv.slice(2),routingFlags,{permissive:!0}).flags["--local"]}catch{}return buildCommandWithGlobalFlags(client.argv,`${usage2}${local?" --local":""}`,void 0,{excludeFlags:local?["--scope","--team"]:[]})}function validateLocalScheduleFlags(client,flags,usage2){if(!flags["--local"])return;let originalFlags;try{originalFlags=parseArguments(client.argv.slice(2),routingFlags,{permissive:!0}).flags}catch(error){return invalidScheduleArguments(client,usage2,error instanceof Error?error.message:String(error))}for(let flag of["--scope","--team","--token"])if(flags[flag]!==void 0||originalFlags[flag]!==void 0)return invalidScheduleArguments(client,usage2,`Cannot combine --local with ${flag}. Local Schedules uses the current vercel dev session.`)}function unsupportedLocalExecutions(client){let message="Execution history is not supported for local Schedules. Inspect the vercel dev output for local executions.";return client.nonInteractive?outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.API_ERROR,message,retryable:!1}):output_manager_default.fatal(message),1}async function resolveSchedulesClient(client,local){if(local)try{let schedules=await createLocalSchedulesClient(client);return output_manager_default.log(`Using local Schedules at ${schedules.localOrigin}`),schedules}catch(error){let message=error instanceof Error?error.message:String(error);return client.nonInteractive?outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.API_ERROR,message,retryable:!1}):output_manager_default.fatal(message),1}let link=await requireProjectContext(client,"schedules");return typeof link=="number"?link:new SchedulesClient(client,{ownerId:link.org.id,projectId:link.project.id})}function invalidScheduleArguments(client,usage2,message){return client.nonInteractive?(outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message,next:[{command:scheduleCommandWithGlobalFlags(client,usage2),when:"Provide valid schedule arguments"}]}),2):(output_manager_default.fatal(message),2)}function validateScheduleNameAndNamespace(client,args,namespaceFlag,usage2){let[name]=args;if(!name)return{valid:!1,exitCode:invalidScheduleArguments(client,usage2,"A schedule name is required")};if(args.length!==1)return{valid:!1,exitCode:invalidScheduleArguments(client,usage2,`Expected one schedule name. Usage: ${getCommandName(usage2)}`)};let namespace=namespaceFlag??DEFAULT_SCHEDULE_NAMESPACE,nameError=validateScheduleIdentifier(name,"Schedule name"),namespaceError=validateScheduleIdentifier(namespace,"Namespace"),error=nameError??namespaceError;return error?{valid:!1,exitCode:invalidScheduleArguments(client,usage2,error)}:{valid:!0,name,namespace}}function parseScheduleOutput(client,usage2,flags){let result=validateJsonOutput(flags);return result.valid?{valid:!0,json:result.jsonOutput||client.nonInteractive}:{valid:!1,exitCode:invalidScheduleArguments(client,usage2,result.error)}}function writeScheduleMutationResult(client,schedule,message,json){if(json){let value=client.nonInteractive?{status:AGENT_STATUS.OK,schedule,message}:schedule;client.stdout.write(`${JSON.stringify(value,null,2)}
|
|
1334
1346
|
`)}else output_manager_default.success(message);return 0}async function runScheduleAction(client,argv,action){let subcommand=action==="enable"?enableSubcommand4:action==="disable"?disableSubcommand4:invokeSubcommand,usage2=`schedules ${action} <name>`,telemetry2=new SchedulesActionTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs;try{parsedArgs=parseArguments(argv,getFlagsSpecification(subcommand.options))}catch(error){return invalidScheduleArguments(client,usage2,error instanceof Error?error.message:String(error))}let{args,flags}=parsedArgs;telemetry2.trackCliFlagLocal(flags["--local"]);let conflict=validateLocalScheduleFlags(client,flags,usage2);if(conflict!==void 0)return conflict;telemetry2.trackCliArgumentName(args[0]),telemetry2.trackCliOptionNamespace(flags["--namespace"]),telemetry2.trackCliOptionFormat(flags["--format"]),telemetry2.trackCliFlagJson(flags["--json"]);let identifier=validateScheduleNameAndNamespace(client,args,flags["--namespace"],usage2);if(!identifier.valid)return identifier.exitCode;let outputMode=parseScheduleOutput(client,usage2,flags);if(!outputMode.valid)return outputMode.exitCode;let schedulesClient=await resolveSchedulesClient(client,flags["--local"]);if(typeof schedulesClient=="number")return schedulesClient;let presentParticiple=action==="enable"?"Enabling":action==="disable"?"Disabling":"Invoking";outputMode.json||output_manager_default.spinner(`${presentParticiple} schedule\u2026`);let schedule;try{action==="enable"?schedule=await schedulesClient.enable(identifier):action==="disable"?schedule=await schedulesClient.disable(identifier):await schedulesClient.invoke(identifier)}catch(error){return output_manager_default.stopSpinner(),handleSchedulesApiError(client,error,{action,local:flags["--local"],name:identifier.name,namespace:identifier.namespace})}output_manager_default.stopSpinner();let message=`${action==="enable"?"Enabled":action==="disable"?"Disabled":"Invoked"} schedule ${identifier.namespace}/${identifier.name}.`;if(schedule)return writeScheduleMutationResult(client,schedule,message,outputMode.json);if(outputMode.json){let result=client.nonInteractive?{status:AGENT_STATUS.OK,message}:{invoked:!0,name:identifier.name,namespace:identifier.namespace};client.stdout.write(`${JSON.stringify(result,null,2)}
|
|
1335
1347
|
`)}else output_manager_default.success(message);return 0}var SchedulesCreateTelemetryClient=class extends TelemetryClient{trackCliArgumentName(name){name&&this.trackCliArgument({arg:"name",value:this.redactedValue})}trackCliOptionNamespace(namespace){namespace&&this.trackCliOption({option:"namespace",value:this.redactedValue})}trackCliOptionCron(cron){cron&&this.trackCliOption({option:"cron",value:this.redactedValue})}trackCliOptionAt(at){at&&this.trackCliOption({option:"at",value:this.redactedValue})}trackCliOptionTimezone(timezone){timezone&&this.trackCliOption({option:"timezone",value:timezone})}trackCliOptionJitter(jitter){jitter!==void 0&&this.trackCliOption({option:"jitter",value:String(jitter)})}trackCliOptionTopic(topic){topic&&this.trackCliOption({option:"topic",value:this.redactedValue})}trackCliOptionPayload(payload){payload!==void 0&&this.trackCliOption({option:"payload",value:this.redactedValue})}trackCliOptionFormat(format3){format3&&this.trackCliOption({option:"format",value:format3})}trackCliFlagLocal(local){local&&this.trackCliFlag("local")}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var USAGE13="schedules create <name> --cron <expression> --topic <topic>";async function create6(client,argv){let telemetry2=new SchedulesCreateTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs;try{parsedArgs=parseArguments(argv,getFlagsSpecification(createSubcommand6.options))}catch(error){return invalidScheduleArguments(client,USAGE13,error instanceof Error?error.message:String(error))}let{args,flags}=parsedArgs;telemetry2.trackCliFlagLocal(flags["--local"]);let conflict=validateLocalScheduleFlags(client,flags,USAGE13);if(conflict!==void 0)return conflict;telemetry2.trackCliArgumentName(args[0]),telemetry2.trackCliOptionNamespace(flags["--namespace"]),telemetry2.trackCliOptionCron(flags["--cron"]),telemetry2.trackCliOptionAt(flags["--at"]),telemetry2.trackCliOptionTimezone(flags["--timezone"]),telemetry2.trackCliOptionJitter(flags["--jitter"]),telemetry2.trackCliOptionTopic(flags["--topic"]),telemetry2.trackCliOptionPayload(flags["--payload"]),telemetry2.trackCliOptionFormat(flags["--format"]),telemetry2.trackCliFlagJson(flags["--json"]);let identifier=validateScheduleNameAndNamespace(client,args,flags["--namespace"],USAGE13);if(!identifier.valid)return identifier.exitCode;let expression=parseScheduleExpression(flags["--cron"],flags["--at"],!0);if(!expression.valid)return invalidScheduleArguments(client,USAGE13,expression.error);let topic=flags["--topic"];if(!topic?.trim())return invalidScheduleArguments(client,USAGE13,"A target queue topic is required. Use `--topic`.");let topicError=validateScheduleQueueTopic(topic);if(topicError)return invalidScheduleArguments(client,USAGE13,topicError);let jitter=parseCreateJitter(flags["--jitter"]);if(!jitter.valid)return invalidScheduleArguments(client,USAGE13,jitter.error);let timezoneError=validateScheduleTimezone(flags["--timezone"]);if(timezoneError)return invalidScheduleArguments(client,USAGE13,timezoneError);let payload=parseSchedulePayload(flags["--payload"]);if(!payload.valid)return invalidScheduleArguments(client,USAGE13,payload.error);let outputMode=parseScheduleOutput(client,USAGE13,flags);if(!outputMode.valid)return outputMode.exitCode;let schedules=await resolveSchedulesClient(client,flags["--local"]);if(typeof schedules=="number")return schedules;outputMode.json||output_manager_default.spinner("Creating schedule\u2026");let schedule;try{schedule=await schedules.create({name:identifier.name,namespace:identifier.namespace,expression:expression.value,target:{topic},...flags["--timezone"]!==void 0&&{timezone:flags["--timezone"]},...jitter.value!==void 0&&{jitter:jitter.value},...flags["--payload"]!==void 0&&{payload:payload.value}})}catch(error){return output_manager_default.stopSpinner(),handleSchedulesApiError(client,error,{action:"create",local:flags["--local"],name:identifier.name,namespace:identifier.namespace})}return output_manager_default.stopSpinner(),writeScheduleMutationResult(client,schedule,`Created schedule ${identifier.namespace}/${identifier.name}.`,outputMode.json)}var SchedulesDeleteTelemetryClient=class extends TelemetryClient{trackCliArgumentName(name){name&&this.trackCliArgument({arg:"name",value:this.redactedValue})}trackCliOptionNamespace(namespace){namespace&&this.trackCliOption({option:"namespace",value:this.redactedValue})}trackCliFlagYes(yes){yes&&this.trackCliFlag("yes")}trackCliOptionFormat(format3){format3&&this.trackCliOption({option:"format",value:format3})}trackCliFlagLocal(local){local&&this.trackCliFlag("local")}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var USAGE14="schedules delete <name> --yes";async function deleteSchedule(client,argv){let telemetry2=new SchedulesDeleteTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs;try{parsedArgs=parseArguments(argv,getFlagsSpecification(deleteSubcommand4.options))}catch(error){return invalidScheduleArguments(client,USAGE14,error instanceof Error?error.message:String(error))}let{args,flags}=parsedArgs;telemetry2.trackCliFlagLocal(flags["--local"]);let conflict=validateLocalScheduleFlags(client,flags,USAGE14);if(conflict!==void 0)return conflict;telemetry2.trackCliArgumentName(args[0]),telemetry2.trackCliOptionNamespace(flags["--namespace"]),telemetry2.trackCliFlagYes(flags["--yes"]),telemetry2.trackCliOptionFormat(flags["--format"]),telemetry2.trackCliFlagJson(flags["--json"]);let identifier=validateScheduleNameAndNamespace(client,args,flags["--namespace"],USAGE14);if(!identifier.valid)return identifier.exitCode;let outputMode=parseScheduleOutput(client,USAGE14,flags);if(!outputMode.valid)return outputMode.exitCode;let skipConfirmation=flags["--yes"]??!1;if(client.nonInteractive&&!skipConfirmation)return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.CONFIRMATION_REQUIRED,message:flags["--local"]?"Deleting a local schedule requires confirmation. Re-run with `--yes`.":"Deleting a schedule requires confirmation. Re-run with `--yes`.",next:[{command:flags["--local"]?scheduleCommandWithGlobalFlags(client,`schedules delete ${quoteArg(identifier.name)} --namespace ${quoteArg(identifier.namespace)} --yes`):buildCommandWithYes(client.argv)}]},1),1;let schedules=await resolveSchedulesClient(client,flags["--local"]);if(typeof schedules=="number")return schedules;let target=flags["--local"]?"local schedule":"schedule";if(!skipConfirmation&&!await client.input.confirm(`Delete ${target} ${identifier.namespace}/${identifier.name}? This cannot be undone.`,!1))return output_manager_default.log("Canceled"),0;outputMode.json||output_manager_default.spinner("Deleting schedule\u2026");let deletedScheduleId;try{deletedScheduleId=(await schedules.delete(identifier)).scheduleId}catch(error){return output_manager_default.stopSpinner(),handleSchedulesApiError(client,error,{action:"delete",local:flags["--local"],name:identifier.name,namespace:identifier.namespace})}output_manager_default.stopSpinner();let message=`Deleted ${target} ${identifier.namespace}/${identifier.name}.`;if(outputMode.json){let deleted={name:identifier.name,namespace:identifier.namespace,scheduleId:deletedScheduleId},result=client.nonInteractive?{status:AGENT_STATUS.OK,deleted,message}:{deleted:!0,...deleted};client.stdout.write(`${JSON.stringify(result,null,2)}
|
|
1336
1348
|
`)}else output_manager_default.success(message);return 0}var import_chalk296=__toESM(require_source(),1);var SchedulesListExecutionsTelemetryClient=class extends TelemetryClient{trackCliArgumentName(name){name&&this.trackCliArgument({arg:"name",value:this.redactedValue})}trackCliOptionNamespace(namespace){namespace&&this.trackCliOption({option:"namespace",value:this.redactedValue})}trackCliOptionLimit(limit){limit!==void 0&&this.trackCliOption({option:"limit",value:String(limit)})}trackCliOptionNext(next){next&&this.trackCliOption({option:"next",value:this.redactedValue})}trackCliOptionSort(sort){sort&&this.trackCliOption({option:"sort",value:sort})}trackCliOptionSince(since){since&&this.trackCliOption({option:"since",value:this.redactedValue})}trackCliOptionUntil(until){until&&this.trackCliOption({option:"until",value:this.redactedValue})}trackCliOptionFrom(from){from!==void 0&&this.trackCliOption({option:"from",value:String(from)})}trackCliOptionTo(to){to!==void 0&&this.trackCliOption({option:"to",value:String(to)})}trackCliOptionExecutionId(executionId){executionId&&this.trackCliOption({option:"execution-id",value:this.redactedValue})}trackCliOptionFormat(format3){format3&&this.trackCliOption({option:"format",value:format3})}trackCliFlagLocal(local){local&&this.trackCliFlag("local")}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var USAGE15="schedules executions list <name>",MAX_EXECUTION_RANGE_MS=30*864e5;function invalidArguments3(client,message){return client.nonInteractive?(outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message,next:[{command:buildCommandWithGlobalFlags(client.argv,USAGE15),when:"List schedule executions with valid options"}]}),2):(output_manager_default.fatal(message),2)}function capitalize2(value){return`${value.charAt(0).toUpperCase()}${value.slice(1)}`}function formatExecutionStatus(status6){return status6==="succeeded"?import_chalk296.default.green("Succeeded"):status6==="failed"?import_chalk296.default.red("Failed"):import_chalk296.default.gray("Unavailable")}function formatPercentage3(value){return value===null?import_chalk296.default.gray("-"):`${Number((value*100).toFixed(2))}%`}function formatDuration3(value){return value===null?import_chalk296.default.gray("-"):value<1e3?`${Math.round(value)}ms`:value<6e4?`${Number((value/1e3).toFixed(1))}s`:`${Number((value/6e4).toFixed(1))}m`}function formatInvocationCount(value){return`${value} invocation${value===1?"":"s"}`}function executionMetrics(metrics2){return[formatAlignedLabel("Range",`${formatDate(metrics2.from)} \u2013 ${formatDate(metrics2.to)}`),formatAlignedLabel("Recorded",formatInvocationCount(metrics2.recordedInvocations)),formatAlignedLabel("Failed",formatInvocationCount(metrics2.failedInvocations)),formatAlignedLabel("Error Rate",formatPercentage3(metrics2.errorRate)),formatAlignedLabel("Avg Duration",formatDuration3(metrics2.averageDurationMs))].join(`
|
|
@@ -1460,7 +1472,7 @@ Learn more: ${import_chalk321.default.cyan("https://vercel.com/docs/cli/about-te
|
|
|
1460
1472
|
`),output_manager_default.debug(String(err))}return output_manager_default.log("Run with --json for full trace data."),0}var import_chalk324=__toESM(require_source(),1);import{z as z5}from"zod";var import_ms42=__toESM(require_ms(),1);import{z as z4}from"zod";var DEFAULT_LIMIT3=100,MAX_LIMIT4=1e3,SPAN_KINDS=["UNSPECIFIED","INTERNAL","SERVER","CLIENT","PRODUCER","CONSUMER"],MAX_RANGE_MS=30*24*60*60*1e3,isoDateTimeSchema=z4.iso.datetime({offset:!0}),timeInputSchema=z4.union([isoDateTimeSchema,z4.iso.date()]),TIME_FORMAT_HINT="Use a duration with units such as 100ms or 30m, an ISO timestamp, or YYYY-MM-DD at midnight UTC.";async function resolveSpanSearchScope(client,project){if(project!==void 0){let scope2=await resolveConfigScope(client,{project});return"exitCode"in scope2?scope2:{ownerId:scope2.teamId,projectIds:[scope2.projectId]}}let scope;try{scope=await getScope(client,{resolveLocalScope:!0})}catch(error){return{exitCode:handleTracingApiError(client,error)}}return scope.isCrossTeamRepo&&!scope.localOrgId&&!scope.explicitScopeProvided&&(!scope.app||scope.user)?{exitCode:invalidArguments(client,"This repository has projects across multiple teams. Pass `--scope <team>` or run from a linked project directory.")}:scope.team?{ownerId:scope.team.id}:{exitCode:invalidArguments(client,"A team scope is required. Pass `--scope <team>` or run `vercel switch <team>`.")}}function parseTime(input,now){let value=input.trim();if(!value)return null;try{let duration=(0,import_ms42.default)(value);if(duration!==void 0&&(duration<=0||!/[a-z]/i.test(value))||duration===void 0&&!timeInputSchema.safeParse(value).success)return null;let date=new Date(duration===void 0?value:now-duration);return Number.isFinite(date.getTime())?date:null}catch{return null}}function buildFilter(flags,spanKind){let clauses=["NOT (service.name:vercel.* AND span.kind:1)"],query=flags["--query"];typeof query=="string"&&clauses.push(`(${query.trim()})`),spanKind!==void 0&&clauses.push(`span.kind:${spanKind}`),flags["--root"]&&clauses.push("span.isRoot:1");let filters=[["--environment","environment"],["--service","service.name"],["--name","span.name"],["--status","span.status.code"],["--deployment-id","deployment.id"],["--request-id","request.id"],["--trace-id","trace.id"],["--span-id","span.id"]];for(let[flag,dimension]of filters){let rawValue=flags[flag];if(typeof rawValue!="string")continue;let value=flag==="--status"?{error:"Error",ok:"Ok",unset:"Unset"}[rawValue]:rawValue.trim();clauses.push(`${dimension}:${JSON.stringify(value)}`)}return clauses.join(" AND ")}function trackSpanQueryOptions(flags,telemetry2){telemetry2.trackCliFlagJson(flags["--json"]),telemetry2.trackCliOptionProject(flags["--project"]),telemetry2.trackCliOptionEnvironment(flags["--environment"]),telemetry2.trackCliOptionService(flags["--service"]),telemetry2.trackCliOptionName(flags["--name"]),telemetry2.trackCliOptionKind(flags["--kind"]),telemetry2.trackCliOptionStatus(flags["--status"]),telemetry2.trackCliOptionDeploymentId(flags["--deployment-id"]),telemetry2.trackCliOptionRequestId(flags["--request-id"]),telemetry2.trackCliOptionTraceId(flags["--trace-id"]),telemetry2.trackCliOptionSpanId(flags["--span-id"]),telemetry2.trackCliFlagRoot(flags["--root"]),telemetry2.trackCliOptionSince(flags["--since"]),telemetry2.trackCliOptionUntil(flags["--until"]),telemetry2.trackCliOptionLimit(flags["--limit"]),telemetry2.trackCliOptionQuery(flags["--query"])}async function resolveSpanQuery(client,flags,telemetry2){let project=flags["--project"],environment=flags["--environment"]?.trim().toLowerCase(),status6=flags["--status"]?.trim().toLowerCase(),query=flags["--query"];if(trackSpanQueryOptions(flags,telemetry2),environment!==void 0&&!["production","preview"].includes(environment))return{exitCode:invalidArguments(client,"`--environment` must be one of: production, preview.")};if(status6!==void 0&&!["error","ok","unset"].includes(status6))return{exitCode:invalidArguments(client,"`--status` must be one of: error, ok, unset.")};for(let flag of["--service","--name","--deployment-id","--request-id","--trace-id","--span-id"])if(flags[flag]!==void 0&&flags[flag]?.trim()==="")return{exitCode:invalidArguments(client,`\`${flag}\` must not be empty.`)};if(query!==void 0&&query.trim()==="")return{exitCode:invalidArguments(client,"`--query` must not be empty.")};let spanKind;if(flags["--kind"]!==void 0){let value=flags["--kind"].trim().toUpperCase();if(spanKind=/^[0-5]$/.test(value)?Number(value):SPAN_KINDS.indexOf(value.replace(/^SPAN_KIND_/,"")),spanKind===-1)return{exitCode:invalidArguments(client,"`--kind` must be one of: UNSPECIFIED (0), INTERNAL (1), SERVER (2), CLIENT (3), PRODUCER (4), CONSUMER (5).")}}let limitResult=validateIntegerRangeWithDefault(flags["--limit"],{flag:"--limit",min:1,max:MAX_LIMIT4,defaultValue:DEFAULT_LIMIT3});if(!limitResult.valid)return{exitCode:invalidArguments(client,limitResult.message)};let now=Date.now(),start=parseTime(flags["--since"]??"1h",now),end=flags["--until"]!==void 0?parseTime(flags["--until"],now):new Date(now);if(!start)return{exitCode:invalidArguments(client,`Invalid time format for \`--since\`. ${TIME_FORMAT_HINT}`)};if(!end)return{exitCode:invalidArguments(client,`Invalid time format for \`--until\`. ${TIME_FORMAT_HINT}`)};if(start.getTime()>=end.getTime())return{exitCode:invalidArguments(client,"`--since` must be earlier than `--until`.")};if(end.getTime()-start.getTime()>MAX_RANGE_MS)return{exitCode:invalidArguments(client,"The requested time range must not exceed 30 days.")};if(now-start.getTime()>MAX_RANGE_MS)return{exitCode:invalidArguments(client,"`--since` must be within the last 30 days.")};let scope=await resolveSpanSearchScope(client,project);return"exitCode"in scope?scope:{scope,timeRange:{start:start.toISOString(),end:end.toISOString()},filter:buildFilter({...flags,"--environment":environment,"--status":status6},spanKind),limit:limitResult.value}}function fetchSpanQuery(client,teamId,request2){let query=new URLSearchParams({teamId});return client.fetch(`/v1/observability/events?${query}`,{method:"POST",headers:{"x-vercel-observability-query-reason":"cli/traces-search"},body:request2,bailOn429:!0})}function handleSpanQueryError(client,err){if(isAPIError(err)){let issues=z4.array(z4.object({path:z4.string(),message:z4.string()})).safeParse(err.issues);if(issues.success&&issues.data.length>0){let details=issues.data.map(issue2=>`${issue2.path}: ${issue2.message}`).join(", ");err.serverMessage=`${err.serverMessage}: ${details}`,(err.status===400||err.status===422)&&issues.data.some(issue2=>issue2.path==="filter")&&(err.serverMessage+=". Filter error positions refer to the generated filter, including CLI-added clauses."),err.message=`${err.serverMessage} (${err.status})`}}return handleTracingApiError(client,err)}var select=["span","resource"],spanSchema=z5.object({span:z5.object({startTime:isoDateTimeSchema,traceId:z5.string(),id:z5.string(),parentSpanId:z5.string().nullable(),isRoot:z5.number(),traceState:z5.string(),name:z5.string(),kind:z5.string(),status:z5.object({code:z5.string(),message:z5.string()}),duration:z5.number(),attributes:z5.record(z5.string(),z5.unknown()),events:z5.array(z5.object({name:z5.string(),timestamp:isoDateTimeSchema,attributes:z5.record(z5.string(),z5.unknown())})).optional(),links:z5.array(z5.object({traceId:z5.string(),spanId:z5.string(),traceState:z5.string(),attributes:z5.record(z5.string(),z5.unknown())})).optional()}).passthrough(),resource:z5.object({attributes:z5.record(z5.string(),z5.unknown())})}),responseSchema=z5.object({events:z5.array(spanSchema),pagination:z5.object({hasMore:z5.boolean(),nextCursor:z5.string().nullable()}),meta:z5.record(z5.string(),z5.unknown())});function formatDuration4(durationMs){if(durationMs===0)return"0ms";if(durationMs<1e-6)return"<1ns";let units=[[1e-6,"ns"],[.001,"\u03BCs"],[1,"ms"],[1e3,"s"],[6e4,"m"],[36e5,"h"],[864e5,"d"]],index=units.length-1;for(;durationMs<units[index][0];)index--;let value=Number((durationMs/units[index][0]).toFixed(1));return index<units.length-1&&value>=Math.round(units[index+1][0]/units[index][0])&&(index++,value=Number((durationMs/units[index][0]).toFixed(1))),`${value}${units[index][1]}`}function cell(value){return value||"-"}function stringAttribute(attributes,key){let value=attributes[key];return typeof value=="string"?value:null}var spanColumns={"span.startTime":{header:"TIME",format:event=>new Date(event.span.startTime).toISOString()},"span.duration":{header:"DURATION",format:event=>formatDuration4(event.span.duration)},"span.name":{header:"SPAN NAME",format:event=>ellipsis(cell(event.span.name),60)},"span.status.code":{header:"STATUS",format:event=>event.span.status.code.toUpperCase()==="ERROR"?import_chalk324.default.red("ERROR"):cell(event.span.status.code.toUpperCase())},"service.name":{header:"SERVICE NAME",format:event=>{let serviceName=stringAttribute(event.resource.attributes,"service.name");return serviceName?.startsWith("vercel.")?`\u25B2 ${serviceName}`:cell(serviceName)}},environment:{header:"ENVIRONMENT",format:event=>cell(stringAttribute(event.resource.attributes,"deployment.environment.name"))},"request.id":{header:"REQUEST ID",format:event=>stringAttribute(event.span.attributes,"vercel.request_id")?.split("::").at(-1)||"-"},"trace.id":{header:"TRACE ID",format:event=>cell(event.span.traceId)},"span.id":{header:"SPAN ID",format:event=>cell(event.span.id)},"parent.id":{header:"PARENT ID",format:event=>cell(event.span.parentSpanId)},"span.kind":{header:"SPAN KIND",format:event=>SPAN_KINDS.find((kind,index)=>event.span.kind===String(index)||event.span.kind.toUpperCase()===kind)??cell(event.span.kind)}};function printSpans(client,spans,columns){if(spans.length===0){client.stdout.write(`No spans found for this period.
|
|
1461
1473
|
`);return}client.stdout.write(`${table([columns.map(column=>column.header),...spans.map(span=>columns.map(column=>column.format(span)))])}
|
|
1462
1474
|
`)}async function search2(client,telemetry2){let parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(2),getFlagsSpecification(searchSubcommand3.options))}catch(err){return invalidArguments(client,err instanceof Error?err.message:String(err))}let{flags}=parsedArgs,json=!!(flags["--json"]||client.nonInteractive),columnsOption=flags["--columns"];if(telemetry2.trackCliOptionColumns(columnsOption),parsedArgs.args.slice(2).length>0)return trackSpanQueryOptions(flags,telemetry2),invalidArguments(client,`Unexpected argument: ${parsedArgs.args.slice(2)[0]}.`);let columns=Object.values(spanColumns).filter(column=>column!==spanColumns["span.kind"]&&column!==spanColumns["request.id"]&&column!==spanColumns.environment);if(columnsOption!==void 0){if(json)return invalidArguments(client,"`--columns` cannot be combined with `--json` or `--non-interactive`.");let names=columnsOption.split(",").map(name=>name.trim());if(names.some(name=>!Object.hasOwn(spanColumns,name)))return invalidArguments(client,`Invalid column selection. Available columns: ${Object.keys(spanColumns).join(", ")}.`);if(new Set(names).size!==names.length)return invalidArguments(client,"Columns cannot repeat. List each column once.");columns=names.map(name=>spanColumns[name])}let query=await resolveSpanQuery(client,flags,telemetry2);if("exitCode"in query)return query.exitCode;let request2={...query,event:"vercel.span",select,order:"desc"};json||output_manager_default.spinner("Searching spans\u2026");let rawResponse;try{rawResponse=await fetchSpanQuery(client,query.scope.ownerId,request2)}catch(err){return handleSpanQueryError(client,err)}finally{json||output_manager_default.stopSpinner()}let result=responseSchema.safeParse(rawResponse);if(!result.success)return handleTracingApiError(client,new Error("The Observability API returned an invalid span search response."));if(json)for(let span of result.data.events)client.stdout.write(`${JSON.stringify(span)}
|
|
1463
|
-
`);else printSpans(client,result.data.events,columns);return result.data.pagination.hasMore&&output_manager_default.log("More spans matched. Narrow the query or increase --limit."),0}var COMMAND_CONFIG67={inspect:getCommandAliases(getSubcommand4),create:getCommandAliases(createSubcommand8),search:getCommandAliases(searchSubcommand3),config:getCommandAliases(tracesConfigCommand)},SUBCOMMAND_METADATA={[getSubcommand4.name]:getSubcommand4,[createSubcommand8.name]:createSubcommand8,[searchSubcommand3.name]:searchSubcommand3};async function traces(client){let telemetry2=new TracesTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(tracesCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return invalidArguments(client,err instanceof Error?err.message:String(err))}let{subcommand,subcommandOriginal,args}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG67),needHelp=!!parsedArgs.flags["--help"];if(subcommand===tracesConfigCommand.name)return(await import("./chunks/config-
|
|
1475
|
+
`);else printSpans(client,result.data.events,columns);return result.data.pagination.hasMore&&output_manager_default.log("More spans matched. Narrow the query or increase --limit."),0}var COMMAND_CONFIG67={inspect:getCommandAliases(getSubcommand4),create:getCommandAliases(createSubcommand8),search:getCommandAliases(searchSubcommand3),config:getCommandAliases(tracesConfigCommand)},SUBCOMMAND_METADATA={[getSubcommand4.name]:getSubcommand4,[createSubcommand8.name]:createSubcommand8,[searchSubcommand3.name]:searchSubcommand3};async function traces(client){let telemetry2=new TracesTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(tracesCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return invalidArguments(client,err instanceof Error?err.message:String(err))}let{subcommand,subcommandOriginal,args}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG67),needHelp=!!parsedArgs.flags["--help"];if(subcommand===tracesConfigCommand.name)return(await import("./chunks/config-NWNQSZNZ.js")).default(client,{args,needHelp,subcommandOriginal,telemetry:telemetry2});if(needHelp){telemetry2.trackCliFlagHelp("traces",subcommandOriginal);let subMetadata=typeof subcommand=="string"?SUBCOMMAND_METADATA[subcommand]:void 0;return output_manager_default.print(help(subMetadata??tracesCommand,{parent:subMetadata?tracesCommand:void 0,columns:client.stderr.columns})),0}if(subcommand===createSubcommand8.name){let args2=client.argv.slice(4);return runCurl(client,{forceTrace:!0,args:args2})}return subcommand===searchSubcommand3.name?(telemetry2.trackCliSubcommandSearch(subcommandOriginal||subcommand),search2(client,telemetry2)):(subcommandOriginal==="get"&&warnDeprecatedSubcommand(client,"traces get","traces inspect"),get5(client,telemetry2))}var UpgradeTelemetryClient=class extends TelemetryClient{trackCliArgumentVersion(value){value&&this.trackCliArgument({arg:"version",value})}trackCliFlagDryRun(dryRun){dryRun&&this.trackCliFlag("dry-run")}trackCliFlagJson(json){json&&this.trackCliFlag("json")}trackCliFlagEnableAuto(enableAuto){enableAuto&&this.trackCliFlag("enable-auto")}trackCliFlagDisableAuto(disableAuto){disableAuto&&this.trackCliFlag("disable-auto")}trackCliFlagBypassMinReleaseAge(bypass){bypass&&this.trackCliFlag("bypass-min-release-age")}trackCliFlagDisableMinReleaseAgeBypass(disable6){disable6&&this.trackCliFlag("disable-min-release-age-bypass")}trackCliFlagEnableBinary(enableBinary){enableBinary&&this.trackCliFlag("enable-binary")}trackCliFlagDisableBinary(disableBinary){disableBinary&&this.trackCliFlag("disable-binary")}};function setUseNativeBinary(client,enabled){let config={...client.config,useNativeBinary:enabled};delete config.nativeBinaryAutoOptIn,writeToConfigFile(config),client.config=config}var import_semver=__toESM(require_semver(),1);async function installProductionRelease({version:requested,skipIfCurrent=!1,currentVersion=pkg_default.version,track}={}){let pinned=requested&&requested!=="latest"?requested:void 0,version2=pinned;try{if(output_manager_default.spinner("Checking for updates\u2026",0),pinned){let available=await listAvailableVersions(packageName).catch(()=>{});if(available&&!available.includes(pinned))return output_manager_default.stopSpinner(),output_manager_default.error(`Version ${pinned} does not exist.`),output_manager_default.log(`Run ${getCommandName("version list")} to see available versions.`),1}else version2=await resolveLatestNativeVersion();let target=version2,current=!((track??(await readActivePointer(getInstallRoot()).catch(()=>{}))?.track)==="pr")&&import_semver.default.valid(currentVersion)?currentVersion:void 0;return skipIfCurrent&¤t&&import_semver.default.gte(current,target)?(output_manager_default.stopSpinner(),output_manager_default.log(`No upgrade available. Vercel CLI is already up to date (v${current}).`),0):(await installAndActivateProductionVersion(target),output_manager_default.stopSpinner(),!current||import_semver.default.gt(target,current)?output_manager_default.success(`Upgraded Vercel CLI to v${target}.`):(output_manager_default.success(`Vercel CLI v${target} is active.`),import_semver.default.lt(target,current)&&output_manager_default.warn(`Older CLI versions can replace the installer-managed links when running version commands. If that happens, restore the bounded slot layout with:
|
|
1464
1476
|
${CURL_INSTALL_COMMAND}`)),0)}catch(error){output_manager_default.stopSpinner();let reason=error instanceof Error?error.message:String(error);return output_manager_default.fatal(version2?`Failed to install Vercel CLI v${version2}: ${reason}`:`Failed to resolve the latest Vercel CLI version: ${reason}`),output_manager_default.log(`To reinstall the CLI manually, run:
|
|
1465
1477
|
${CURL_INSTALL_COMMAND}`),1}}var import_semver2=__toESM(require_semver(),1);async function upgrade(client){try{return await runUpgrade(client)}catch(error){return printError(error),1}}async function runUpgrade(client){let parsedArgs=null,flagsSpecification=getFlagsSpecification(upgradeCommand.options),telemetry2=new UpgradeTelemetryClient({opts:{store:client.telemetryEventStore}});try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return printError(error),2}if(parsedArgs.flags["--help"])return telemetry2.trackCliFlagHelp("upgrade"),output_manager_default.print(help(upgradeCommand,{columns:client.stderr.columns})),0;let targetArg=parsedArgs.args[1],target=targetArg==="latest"?targetArg:targetArg?import_semver2.default.valid(targetArg)??void 0:void 0;if(telemetry2.trackCliArgumentVersion(targetArg?targetArg==="latest"?"latest":target?"version":"invalid":void 0),parsedArgs.args.length>2)return output_manager_default.error(`Unexpected argument: "${parsedArgs.args[2]}".`),1;if(targetArg&&!target)return output_manager_default.error(`Invalid version: "${targetArg}". Use a major.minor.patch version or "latest".`),1;let dryRun=parsedArgs.flags["--dry-run"],enableAuto=parsedArgs.flags["--enable-auto"],disableAuto=parsedArgs.flags["--disable-auto"],bypassMinReleaseAge=parsedArgs.flags["--bypass-min-release-age"],disableMinReleaseAgeBypass=parsedArgs.flags["--disable-min-release-age-bypass"],enableBinary=parsedArgs.flags["--enable-binary"],disableBinary=parsedArgs.flags["--disable-binary"],formatResult=validateJsonOutput(parsedArgs.flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput;if(telemetry2.trackCliFlagDryRun(dryRun),telemetry2.trackCliFlagEnableAuto(enableAuto),telemetry2.trackCliFlagDisableAuto(disableAuto),telemetry2.trackCliFlagBypassMinReleaseAge(bypassMinReleaseAge),telemetry2.trackCliFlagDisableMinReleaseAgeBypass(disableMinReleaseAgeBypass),telemetry2.trackCliFlagEnableBinary(enableBinary),telemetry2.trackCliFlagDisableBinary(disableBinary),telemetry2.trackCliOptionFormat(parsedArgs.flags["--format"]),telemetry2.trackCliFlagJson(parsedArgs.flags["--json"]),enableAuto&&disableAuto)return output_manager_default.error("Cannot use --enable-auto and --disable-auto together"),2;if(enableBinary&&disableBinary)return output_manager_default.error("Cannot use --enable-binary and --disable-binary together"),2;if(bypassMinReleaseAge&&disableMinReleaseAgeBypass)return output_manager_default.error("Can't use --bypass-min-release-age and --disable-min-release-age-bypass together"),2;let hasSettingsOnlyFlag=!!(disableMinReleaseAgeBypass||enableBinary||disableBinary||enableAuto||disableAuto);if(target&&hasSettingsOnlyFlag)return output_manager_default.error("Can't use a version with settings-only upgrade flags."),2;let installerManaged=await isCurlInstall();if(installerManaged&&bypassMinReleaseAge&&!hasSettingsOnlyFlag)return output_manager_default.fatal("Can't use `--bypass-min-release-age` with a CLI installed by the Vercel installer. The installer downloads releases directly from the registry and has no minimum release-age setting.\nRun `vc upgrade` without the flag."),1;if(dryRun||asJson){let requestedPreference;disableMinReleaseAgeBypass?requestedPreference={name:"bypassMinReleaseAge",label:"minimum release-age bypass",enabled:!1}:enableBinary||disableBinary?requestedPreference={name:"useNativeBinary",label:"native Vercel CLI binary",enabled:!!enableBinary}:enableAuto||disableAuto?requestedPreference={name:"autoUpdatesEnabled",label:"automatic CLI updates",enabled:!!enableAuto}:bypassMinReleaseAge&&(requestedPreference={name:"bypassMinReleaseAge",label:"minimum release-age bypass",enabled:!0});let detectedUpdateCommand=hasSettingsOnlyFlag||installerManaged?void 0:await getUpdateCommand(),updateCommand=detectedUpdateCommand&&target&&target!=="latest"?pinPackageVersion(detectedUpdateCommand.split(" "),target).join(" "):detectedUpdateCommand,installationType=installerManaged?"installer":await isGlobal()?"global":"local";if(asJson){let jsonOutput={currentVersion:pkg_default.version,installationType,...updateCommand&&{upgradeCommand:updateCommand},autoUpdatesEnabled:isAutoUpdateEnabled(client.config),...requestedPreference&&{requestedSettings:{[requestedPreference.name]:requestedPreference.enabled}}};client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
|
|
1466
1478
|
`)}else output_manager_default.print(`Current version: ${pkg_default.version}
|
|
@@ -1495,7 +1507,7 @@ ${tablePrint}
|
|
|
1495
1507
|
`)}var import_chalk330=__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_chalk330.default.bold(import_chalk330.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_chalk330.default.bold(import_chalk330.default.gray(header))),...rows],{hsep:4,align:["l","l","r"]}).replace(/^/gm," ");print(`${tablePrint}
|
|
1496
1508
|
`)}outputHiddenServicesHint(hiddenCount)}var import_chalk331=__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_chalk331.default.bold(import_chalk331.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_chalk331.default.bold(import_chalk331.default.gray(header))),...rows],{hsep:4,align:["l","l","r"]}).replace(/^/gm," ");print(`${tablePrint}
|
|
1497
1509
|
`)}log(""),log(`${import_chalk331.default.gray("Estimated total:")} ${import_chalk331.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 outputJson9(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)}
|
|
1498
|
-
`)}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 telemetry2=new UsageTelemetryClient({opts:{store:client.telemetryEventStore}});if(parsedArgs.flags["--help"])return telemetry2.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}telemetry2.trackCliOptionSince(parsedArgs.flags["--since"]),telemetry2.trackCliOptionUntil(parsedArgs.flags["--until"]),telemetry2.trackCliOptionFrom(fromFlag),telemetry2.trackCliOptionTo(toFlag),telemetry2.trackCliOptionFormat(parsedArgs.flags["--format"]),telemetry2.trackCliFlagJson(parsedArgs.flags["--json"]),telemetry2.trackCliOptionBreakdown(breakdownFlag),telemetry2.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_utils26.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_chalk332.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?(outputJson9(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??{},projects2=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"),id2=result.dimensionValues[groupByDimension],groupName=id2?(groupByDimension==="project"?projects2:regions)[id2]?.title??id2: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,metrics2,sampleIndex,isSubscription=!1){let grossCostIndex=result.metrics.indexOf(GROSS_COST_METRIC),quantityIndex=result.metrics.findIndex(metric=>metric!==GROSS_COST_METRIC),quantityMetric=metrics2.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}}var VcrTelemetryClient=class extends TelemetryClient{trackCliSubcommandLs(actual){this.trackCliSubcommand({subcommand:"ls",value:actual})}trackCliSubcommandInspect(actual){this.trackCliSubcommand({subcommand:"inspect",value:actual})}trackCliSubcommandCreate(actual){this.trackCliSubcommand({subcommand:"create",value:actual})}trackCliSubcommandConfig(actual){this.trackCliSubcommand({subcommand:"config",value:actual})}trackCliSubcommandRm(actual){this.trackCliSubcommand({subcommand:"rm",value:actual})}trackCliSubcommandLogin(actual){this.trackCliSubcommand({subcommand:"login",value:actual})}trackCliSubcommandBuild(actual){this.trackCliSubcommand({subcommand:"build",value:actual})}trackCliSubcommandPush(actual){this.trackCliSubcommand({subcommand:"push",value:actual})}trackCliArgumentEngine(value){value&&this.trackCliArgument({arg:"engine",value})}trackCliArgumentPath(value){value&&this.trackCliArgument({arg:"path",value:this.redactedValue})}trackCliArgumentName(value){value&&this.trackCliArgument({arg:"name",value:this.redactedValue})}trackCliOptionPlatform(value){if(value){let known=value==="linux/amd64"||value==="linux/arm64";this.trackCliOption({option:"platform",value:known?value:this.redactedValue})}}trackCliSubcommandTag(actual){this.trackCliSubcommand({subcommand:"tag",value:actual})}trackCliSubcommandImage(actual){this.trackCliSubcommand({subcommand:"image",value:actual})}trackCliSubcommandPermissions(actual){this.trackCliSubcommand({subcommand:"permissions",value:actual})}trackCliOptionLimit(value){typeof value=="number"&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliOptionNext(value){value&&this.trackCliOption({option:"next",value:this.redactedValue})}trackCliOptionCursor(value){value&&this.trackCliOption({option:"cursor",value:this.redactedValue})}trackCliOptionSortBy(value){value&&this.trackCliOption({option:"sort-by",value})}trackCliOptionSortOrder(value){value&&this.trackCliOption({option:"sort-order",value})}trackCliOptionPublic(value){(value==="true"||value==="false")&&this.trackCliOption({option:"public",value})}trackCliFlagUntagged(value){value&&this.trackCliFlag("untagged")}trackCliFlagYes(value){value&&this.trackCliFlag("yes")}trackCliFlagPush(value){value&&this.trackCliFlag("push")}};var COMMAND_CONFIG69={ls:getCommandAliases(listSubcommand26),inspect:getCommandAliases(inspectSubcommand14),add:getCommandAliases(addSubcommand13),config:getCommandAliases(configSubcommand),rm:getCommandAliases(removeSubcommand16),login:getCommandAliases(loginSubcommand),build:getCommandAliases(buildSubcommand),push:getCommandAliases(pushSubcommand),tag:getCommandAliases(tagsAggregateCommand),image:getCommandAliases(imageAggregateCommand),permissions:getCommandAliases(permissionsAggregateCommand)};async function vcr(client){let telemetry2=new VcrTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(vcrCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),2}let{subcommand,args,subcommandOriginal}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG69),needHelp=parsedArgs.flags["--help"];function printHelp(command2){output_manager_default.print(help(command2,{parent:vcrCommand,columns:client.stderr.columns}))}if(needHelp)switch(subcommand){case"ls":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(listSubcommand26),0;case"inspect":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(inspectSubcommand14),0;case"add":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(addSubcommand13),0;case"config":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(configSubcommand),0;case"rm":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(removeSubcommand16),0;case"login":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(loginSubcommand),0;case"build":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(buildSubcommand),0;case"push":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(pushSubcommand),0;case"tag":{telemetry2.trackCliFlagHelp("vcr",subcommandOriginal);let nested=args[0];return nested==="ls"||nested==="list"?(printHelp(tagsLsSubcommand),0):nested==="inspect"||nested==="get"?(printHelp(tagsInspectSubcommand),0):(printHelp(tagsAggregateCommand),0)}case"image":{telemetry2.trackCliFlagHelp("vcr",subcommandOriginal);let nested=args[0];return nested==="ls"||nested==="list"?(printHelp(imageLsSubcommand),0):nested==="inspect"||nested==="get"?(printHelp(imageInspectSubcommand),0):nested==="rm"||nested==="remove"||nested==="delete"?(printHelp(imageRmSubcommand),0):(printHelp(imageAggregateCommand),0)}case"permissions":{let printPermissionsActionHelp2=function(command2){output_manager_default.print(help(command2,{parent:{...vcrCommand,name:"vcr permissions repository"},columns:client.stderr.columns}))};var printPermissionsActionHelp=printPermissionsActionHelp2;telemetry2.trackCliFlagHelp("vcr",subcommandOriginal);let nested=args.slice(0,2),hasAction=aliases2=>nested.some(arg2=>arg2!==void 0&&aliases2.includes(arg2));return hasAction(PERMISSIONS_ACTIONS.ls)?(printPermissionsActionHelp2(permissionsLsSubcommand),0):hasAction(PERMISSIONS_ACTIONS.add)?(printPermissionsActionHelp2(permissionsAddSubcommand),0):hasAction(PERMISSIONS_ACTIONS.rm)?(printPermissionsActionHelp2(permissionsRmSubcommand),0):hasAction(PERMISSIONS_ACTIONS.clear)?(printPermissionsActionHelp2(permissionsClearSubcommand),0):(printHelp(permissionsAggregateCommand),0)}default:return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),output_manager_default.print(help(vcrCommand,{columns:client.stderr.columns})),0}switch(subcommand){case"ls":return telemetry2.trackCliSubcommandLs(subcommandOriginal),(await import("./chunks/ls-TE7BAMHR.js")).default(client,args,telemetry2);case"inspect":return telemetry2.trackCliSubcommandInspect(subcommandOriginal),(await import("./chunks/inspect-SEGNEPGI.js")).default(client,args,telemetry2);case"add":return telemetry2.trackCliSubcommandCreate(subcommandOriginal),(await import("./chunks/add-QKGWNVQS.js")).default(client,args,telemetry2);case"config":return telemetry2.trackCliSubcommandConfig(subcommandOriginal),(await import("./chunks/config-Y3JEZPVK.js")).default(client,args,telemetry2);case"rm":return telemetry2.trackCliSubcommandRm(subcommandOriginal),(await import("./chunks/rm-BYOBKSWY.js")).default(client,args,telemetry2);case"login":return telemetry2.trackCliSubcommandLogin(subcommandOriginal),(await import("./chunks/login-K6VYVJPS.js")).default(client,args,telemetry2);case"build":return telemetry2.trackCliSubcommandBuild(subcommandOriginal),(await import("./chunks/build-SD6SLRK7.js")).default(client,telemetry2);case"push":return telemetry2.trackCliSubcommandPush(subcommandOriginal),(await import("./chunks/push-PBKUSKXQ.js")).default(client,telemetry2);case"tag":return telemetry2.trackCliSubcommandTag(subcommandOriginal),(await import("./chunks/tags-P5GB7HTF.js")).default(client,args,telemetry2);case"image":return telemetry2.trackCliSubcommandImage(subcommandOriginal),(await import("./chunks/image-6KIQRC65.js")).default(client,args,telemetry2);case"permissions":return telemetry2.trackCliSubcommandPermissions(subcommandOriginal),(await import("./chunks/permissions-2WMWMXFP.js")).default(client,args,telemetry2);default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG69)),output_manager_default.print(help(vcrCommand,{columns:client.stderr.columns})),2}}var import_ms44=__toESM(require_ms(),1),import_chalk333=__toESM(require_source(),1),import_pluralize28=__toESM(require_pluralize(),1);async function getWebhooks(client){let response=await client.fetch("/v1/webhooks");return Array.isArray(response)?{webhooks:response}:response}var WebhooksLsTelemetryClient=class extends TelemetryClient{trackCliOptionFormat(format3){format3&&this.trackCliOption({option:"format",value:format3})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function ls11(client,argv){let telemetry2=new WebhooksLsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(listSubcommand30.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs,validationResult=validateLsArgs({commandName:"webhooks ls",args,maxArgs:0,exitCode:2});if(validationResult!==0)return validationResult;telemetry2.trackCliOptionFormat(opts["--format"]);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput||client.nonInteractive,contextName=await getContextName(client),lsStamp=stamp_default();client.nonInteractive||output_manager_default.spinner(`Fetching Webhooks under ${import_chalk333.default.bold(contextName)}`);let{webhooks}=await getWebhooks(client);if(asJson){output_manager_default.stopSpinner();let webhooksList=webhooks.map(webhook=>({id:webhook.id,url:webhook.url,events:webhook.events,projectIds:webhook.projectIds,createdAt:webhook.createdAt,updatedAt:webhook.updatedAt})),jsonOutput=client.nonInteractive?{status:AGENT_STATUS.OK,webhooks:webhooksList,message:`${webhooks.length} webhook(s) found.`,next:[{command:getCommandNamePlain("webhooks inspect <id>"),when:"Inspect a webhook"}]}:{webhooks:webhooksList};client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
|
|
1510
|
+
`)}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 telemetry2=new UsageTelemetryClient({opts:{store:client.telemetryEventStore}});if(parsedArgs.flags["--help"])return telemetry2.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}telemetry2.trackCliOptionSince(parsedArgs.flags["--since"]),telemetry2.trackCliOptionUntil(parsedArgs.flags["--until"]),telemetry2.trackCliOptionFrom(fromFlag),telemetry2.trackCliOptionTo(toFlag),telemetry2.trackCliOptionFormat(parsedArgs.flags["--format"]),telemetry2.trackCliFlagJson(parsedArgs.flags["--json"]),telemetry2.trackCliOptionBreakdown(breakdownFlag),telemetry2.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_utils26.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_chalk332.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?(outputJson9(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??{},projects2=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"),id2=result.dimensionValues[groupByDimension],groupName=id2?(groupByDimension==="project"?projects2:regions)[id2]?.title??id2: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,metrics2,sampleIndex,isSubscription=!1){let grossCostIndex=result.metrics.indexOf(GROSS_COST_METRIC),quantityIndex=result.metrics.findIndex(metric=>metric!==GROSS_COST_METRIC),quantityMetric=metrics2.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}}var VcrTelemetryClient=class extends TelemetryClient{trackCliSubcommandLs(actual){this.trackCliSubcommand({subcommand:"ls",value:actual})}trackCliSubcommandInspect(actual){this.trackCliSubcommand({subcommand:"inspect",value:actual})}trackCliSubcommandCreate(actual){this.trackCliSubcommand({subcommand:"create",value:actual})}trackCliSubcommandConfig(actual){this.trackCliSubcommand({subcommand:"config",value:actual})}trackCliSubcommandRm(actual){this.trackCliSubcommand({subcommand:"rm",value:actual})}trackCliSubcommandLogin(actual){this.trackCliSubcommand({subcommand:"login",value:actual})}trackCliSubcommandBuild(actual){this.trackCliSubcommand({subcommand:"build",value:actual})}trackCliSubcommandPush(actual){this.trackCliSubcommand({subcommand:"push",value:actual})}trackCliArgumentEngine(value){value&&this.trackCliArgument({arg:"engine",value})}trackCliArgumentPath(value){value&&this.trackCliArgument({arg:"path",value:this.redactedValue})}trackCliArgumentName(value){value&&this.trackCliArgument({arg:"name",value:this.redactedValue})}trackCliOptionPlatform(value){if(value){let known=value==="linux/amd64"||value==="linux/arm64";this.trackCliOption({option:"platform",value:known?value:this.redactedValue})}}trackCliSubcommandTag(actual){this.trackCliSubcommand({subcommand:"tag",value:actual})}trackCliSubcommandImage(actual){this.trackCliSubcommand({subcommand:"image",value:actual})}trackCliSubcommandPermissions(actual){this.trackCliSubcommand({subcommand:"permissions",value:actual})}trackCliOptionLimit(value){typeof value=="number"&&this.trackCliOption({option:"limit",value:this.redactedValue})}trackCliOptionNext(value){value&&this.trackCliOption({option:"next",value:this.redactedValue})}trackCliOptionCursor(value){value&&this.trackCliOption({option:"cursor",value:this.redactedValue})}trackCliOptionSortBy(value){value&&this.trackCliOption({option:"sort-by",value})}trackCliOptionSortOrder(value){value&&this.trackCliOption({option:"sort-order",value})}trackCliOptionPublic(value){(value==="true"||value==="false")&&this.trackCliOption({option:"public",value})}trackCliFlagUntagged(value){value&&this.trackCliFlag("untagged")}trackCliFlagYes(value){value&&this.trackCliFlag("yes")}trackCliFlagPush(value){value&&this.trackCliFlag("push")}};var COMMAND_CONFIG69={ls:getCommandAliases(listSubcommand26),inspect:getCommandAliases(inspectSubcommand14),add:getCommandAliases(addSubcommand13),config:getCommandAliases(configSubcommand),rm:getCommandAliases(removeSubcommand16),login:getCommandAliases(loginSubcommand),build:getCommandAliases(buildSubcommand),push:getCommandAliases(pushSubcommand),tag:getCommandAliases(tagsAggregateCommand),image:getCommandAliases(imageAggregateCommand),permissions:getCommandAliases(permissionsAggregateCommand)};async function vcr(client){let telemetry2=new VcrTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(vcrCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(err){return printError(err),2}let{subcommand,args,subcommandOriginal}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG69),needHelp=parsedArgs.flags["--help"];function printHelp(command2){output_manager_default.print(help(command2,{parent:vcrCommand,columns:client.stderr.columns}))}if(needHelp)switch(subcommand){case"ls":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(listSubcommand26),0;case"inspect":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(inspectSubcommand14),0;case"add":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(addSubcommand13),0;case"config":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(configSubcommand),0;case"rm":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(removeSubcommand16),0;case"login":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(loginSubcommand),0;case"build":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(buildSubcommand),0;case"push":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(pushSubcommand),0;case"tag":{telemetry2.trackCliFlagHelp("vcr",subcommandOriginal);let nested=args[0];return nested==="ls"||nested==="list"?(printHelp(tagsLsSubcommand),0):nested==="inspect"||nested==="get"?(printHelp(tagsInspectSubcommand),0):(printHelp(tagsAggregateCommand),0)}case"image":{telemetry2.trackCliFlagHelp("vcr",subcommandOriginal);let nested=args[0];return nested==="ls"||nested==="list"?(printHelp(imageLsSubcommand),0):nested==="inspect"||nested==="get"?(printHelp(imageInspectSubcommand),0):nested==="rm"||nested==="remove"||nested==="delete"?(printHelp(imageRmSubcommand),0):(printHelp(imageAggregateCommand),0)}case"permissions":{let printPermissionsActionHelp2=function(command2){output_manager_default.print(help(command2,{parent:{...vcrCommand,name:"vcr permissions repository"},columns:client.stderr.columns}))};var printPermissionsActionHelp=printPermissionsActionHelp2;telemetry2.trackCliFlagHelp("vcr",subcommandOriginal);let nested=args.slice(0,2),hasAction=aliases2=>nested.some(arg2=>arg2!==void 0&&aliases2.includes(arg2));return hasAction(PERMISSIONS_ACTIONS.ls)?(printPermissionsActionHelp2(permissionsLsSubcommand),0):hasAction(PERMISSIONS_ACTIONS.add)?(printPermissionsActionHelp2(permissionsAddSubcommand),0):hasAction(PERMISSIONS_ACTIONS.rm)?(printPermissionsActionHelp2(permissionsRmSubcommand),0):hasAction(PERMISSIONS_ACTIONS.clear)?(printPermissionsActionHelp2(permissionsClearSubcommand),0):(printHelp(permissionsAggregateCommand),0)}default:return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),output_manager_default.print(help(vcrCommand,{columns:client.stderr.columns})),0}switch(subcommand){case"ls":return telemetry2.trackCliSubcommandLs(subcommandOriginal),(await import("./chunks/ls-SXE2THDP.js")).default(client,args,telemetry2);case"inspect":return telemetry2.trackCliSubcommandInspect(subcommandOriginal),(await import("./chunks/inspect-GKZFZINR.js")).default(client,args,telemetry2);case"add":return telemetry2.trackCliSubcommandCreate(subcommandOriginal),(await import("./chunks/add-CCFBYKZH.js")).default(client,args,telemetry2);case"config":return telemetry2.trackCliSubcommandConfig(subcommandOriginal),(await import("./chunks/config-MTH57FUD.js")).default(client,args,telemetry2);case"rm":return telemetry2.trackCliSubcommandRm(subcommandOriginal),(await import("./chunks/rm-DPVWWH4Q.js")).default(client,args,telemetry2);case"login":return telemetry2.trackCliSubcommandLogin(subcommandOriginal),(await import("./chunks/login-UWL7N6ZS.js")).default(client,args,telemetry2);case"build":return telemetry2.trackCliSubcommandBuild(subcommandOriginal),(await import("./chunks/build-PUIFBQKZ.js")).default(client,telemetry2);case"push":return telemetry2.trackCliSubcommandPush(subcommandOriginal),(await import("./chunks/push-SIR5XTJN.js")).default(client,telemetry2);case"tag":return telemetry2.trackCliSubcommandTag(subcommandOriginal),(await import("./chunks/tags-77REB4BF.js")).default(client,args,telemetry2);case"image":return telemetry2.trackCliSubcommandImage(subcommandOriginal),(await import("./chunks/image-IQJVHHAW.js")).default(client,args,telemetry2);case"permissions":return telemetry2.trackCliSubcommandPermissions(subcommandOriginal),(await import("./chunks/permissions-CP57O3II.js")).default(client,args,telemetry2);default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG69)),output_manager_default.print(help(vcrCommand,{columns:client.stderr.columns})),2}}var import_ms44=__toESM(require_ms(),1),import_chalk333=__toESM(require_source(),1),import_pluralize28=__toESM(require_pluralize(),1);async function getWebhooks(client){let response=await client.fetch("/v1/webhooks");return Array.isArray(response)?{webhooks:response}:response}var WebhooksLsTelemetryClient=class extends TelemetryClient{trackCliOptionFormat(format3){format3&&this.trackCliOption({option:"format",value:format3})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function ls11(client,argv){let telemetry2=new WebhooksLsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(listSubcommand30.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs,validationResult=validateLsArgs({commandName:"webhooks ls",args,maxArgs:0,exitCode:2});if(validationResult!==0)return validationResult;telemetry2.trackCliOptionFormat(opts["--format"]);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput||client.nonInteractive,contextName=await getContextName(client),lsStamp=stamp_default();client.nonInteractive||output_manager_default.spinner(`Fetching Webhooks under ${import_chalk333.default.bold(contextName)}`);let{webhooks}=await getWebhooks(client);if(asJson){output_manager_default.stopSpinner();let webhooksList=webhooks.map(webhook=>({id:webhook.id,url:webhook.url,events:webhook.events,projectIds:webhook.projectIds,createdAt:webhook.createdAt,updatedAt:webhook.updatedAt})),jsonOutput=client.nonInteractive?{status:AGENT_STATUS.OK,webhooks:webhooksList,message:`${webhooks.length} webhook(s) found.`,next:[{command:getCommandNamePlain("webhooks inspect <id>"),when:"Inspect a webhook"}]}:{webhooks:webhooksList};client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
|
|
1499
1511
|
`)}else output_manager_default.log(`${(0,import_pluralize28.default)("Webhook",webhooks.length,!0)} found under ${import_chalk333.default.bold(contextName)} ${import_chalk333.default.gray(lsStamp())}`),webhooks.length>0&&(output_manager_default.print(formatWebhooksTable(webhooks).replace(/^(.*)/gm,`${" ".repeat(1)}$1`)),output_manager_default.print(`
|
|
1500
1512
|
|
|
1501
1513
|
`));return 0}function formatWebhooksTable(webhooks){let current=Date.now(),rows=webhooks.map(webhook=>{let age=webhook.createdAt?(0,import_ms44.default)(current-webhook.createdAt):"-",eventsDisplay=webhook.events.length>2?`${webhook.events.slice(0,2).join(", ")} +${webhook.events.length-2}`:webhook.events.join(", ");return[webhook.id,webhook.url,eventsDisplay,import_chalk333.default.gray(age)]});return formatTable(["ID","URL","Events","Age"],["l","l","l","l"],[{rows}])}var import_chalk334=__toESM(require_source(),1);var WebhooksGetTelemetryClient=class extends TelemetryClient{trackCliArgumentId(id2){id2&&this.trackCliArgument({arg:"id",value:this.redactedValue})}trackCliOptionFormat(format3){format3&&this.trackCliOption({option:"format",value:format3})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function get6(client,argv){let telemetry2=new WebhooksGetTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(getSubcommand6.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),2}let{args,flags:opts}=parsedArgs,[webhookId]=args,getStamp=stamp_default();if(!webhookId)return client.nonInteractive&&outputAgentError(client,{status:"error",reason:"missing_id",message:"Webhook ID is required. Provide ID as the first argument.",next:[{command:getCommandNamePlain("webhooks ls")},{command:getCommandNamePlain("webhooks inspect <id>")}]},2),output_manager_default.error(`${getCommandName("webhooks inspect <id>")} expects one argument`),2;telemetry2.trackCliArgumentId(webhookId),telemetry2.trackCliOptionFormat(opts["--format"]);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),2;let asJson=formatResult.jsonOutput||client.nonInteractive;if(args.length!==1)return output_manager_default.error(`Invalid number of arguments. Usage: ${import_chalk334.default.cyan(`${getCommandName("webhooks inspect <id>")}`)}`),2;output_manager_default.debug("Fetching webhook info");let contextName=await getContextName(client);client.nonInteractive||output_manager_default.spinner(`Fetching Webhook ${webhookId} under ${import_chalk334.default.bold(contextName)}`);let webhook;try{webhook=await getWebhook(client,webhookId)}catch(err){if(output_manager_default.stopSpinner(),isAPIError(err)&&err.status===404)return client.nonInteractive&&outputAgentError(client,{status:"error",reason:"webhook_not_found",message:`Webhook not found: ${webhookId}.`,next:[{command:getCommandNamePlain("webhooks ls")}]},1),output_manager_default.error(`Webhook not found: ${webhookId}`),output_manager_default.log(`Run ${getCommandName("webhooks ls")} to see your webhooks.`),1;throw err}if(asJson){output_manager_default.stopSpinner();let jsonOutput=client.nonInteractive?{status:"ok",webhook,message:`Webhook ${webhookId} found.`,next:[{command:getCommandNamePlain(`webhooks rm ${webhookId} --yes`),when:"Remove this webhook"}]}:webhook;client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
|