vercel 59.25.4 → 60.0.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-B6SKHP6R.js → add-7OUJAZIH.js} +1 -1
- package/dist/chunks/{add-6MVD3GYU.js → add-D4E2N3HU.js} +1 -1
- package/dist/chunks/{add-Y34MSA3T.js → add-UG57LDJR.js} +1 -1
- package/dist/chunks/{build-PC5EQP2P.js → build-VSV5LVJK.js} +1 -1
- package/dist/chunks/{chunk-GJZRIDFC.js → chunk-3YOA3ODU.js} +1 -1
- package/dist/chunks/chunk-4JFQYK65.js +9 -0
- package/dist/chunks/{chunk-F7UV4YLV.js → chunk-4VFDQB4H.js} +2 -2
- package/dist/chunks/{chunk-P6C5L7KC.js → chunk-4XAIK5CI.js} +3 -3
- package/dist/chunks/{chunk-Q6O7GA7P.js → chunk-5B3BHCFE.js} +1 -1
- package/dist/chunks/{chunk-NBVY237X.js → chunk-5ENY7DSN.js} +1 -1
- package/dist/chunks/{chunk-CDK22NA2.js → chunk-5JFBDZTI.js} +1 -1
- package/dist/chunks/{chunk-Q22JZSWD.js → chunk-5LH3CZMJ.js} +1 -1
- package/dist/chunks/chunk-5UOVEMYX.js +7 -0
- package/dist/chunks/{chunk-OICV3NTQ.js → chunk-5WW7LFI6.js} +1 -1
- package/dist/chunks/{chunk-4M7CX4YK.js → chunk-AH3A52IK.js} +1 -1
- package/dist/chunks/{chunk-JUUECT2E.js → chunk-ECJKSW62.js} +1 -1
- package/dist/chunks/{chunk-VTQUMQ2P.js → chunk-EWSS6LUE.js} +1 -1
- package/dist/chunks/{chunk-3YEWE5MO.js → chunk-FFQ2SDHN.js} +1 -1
- package/dist/chunks/{chunk-DUZUOQVB.js → chunk-I7PARON4.js} +1 -1
- package/dist/chunks/{chunk-XJUAWZU2.js → chunk-IAS5LONF.js} +1 -1
- package/dist/chunks/{chunk-M3HTK4NR.js → chunk-JC4FG6EW.js} +1 -1
- package/dist/chunks/{chunk-TOHAMRDX.js → chunk-JMNAVONO.js} +1 -1
- package/dist/chunks/{chunk-QMO7LJLU.js → chunk-JSVZKMZO.js} +1 -1
- package/dist/chunks/{chunk-TFG7RTGQ.js → chunk-KDKSYHTU.js} +1 -1
- package/dist/chunks/{chunk-47BI2WLV.js → chunk-LTFVLQEF.js} +1 -1
- package/dist/chunks/{chunk-TGR6YHGO.js → chunk-MCZNQE4G.js} +1 -1
- package/dist/chunks/{chunk-ZY3FVURC.js → chunk-MNR5YQDP.js} +1 -1
- package/dist/chunks/{chunk-Q7UVAEN3.js → chunk-MRSU4C5C.js} +1 -1
- package/dist/chunks/{chunk-UOHEF2JZ.js → chunk-MWU4ZPZ4.js} +4 -4
- package/dist/chunks/{chunk-4NAYJHLI.js → chunk-PGHEHRSM.js} +1 -1
- package/dist/chunks/{chunk-643SKD3D.js → chunk-PNY65NDD.js} +1 -1
- package/dist/chunks/chunk-QFPCR4NL.js +7 -0
- package/dist/chunks/{chunk-FVIQMWYR.js → chunk-QXC2G7JY.js} +1 -1
- package/dist/chunks/{chunk-UWLDK7LJ.js → chunk-REONGB6P.js} +1 -1
- package/dist/chunks/chunk-SW7MNF4H.js +7 -0
- package/dist/chunks/{chunk-MAWP4YIY.js → chunk-TH2WHOUV.js} +1 -1
- package/dist/chunks/{chunk-WKZ6JSGZ.js → chunk-TKBORMUF.js} +1 -1
- package/dist/chunks/{chunk-T6A5HA5U.js → chunk-TQLNWAJY.js} +1 -1
- package/dist/chunks/{chunk-26LYRNMQ.js → chunk-TUVMXISG.js} +2 -2
- package/dist/chunks/{chunk-PSPKPQRS.js → chunk-TZN45RBM.js} +1 -1
- package/dist/chunks/{chunk-EIXOJUNN.js → chunk-UTVDFSQS.js} +1 -1
- package/dist/chunks/chunk-VHTNAYWA.js +7 -0
- package/dist/chunks/{chunk-GA65WALP.js → chunk-VVWALKUM.js} +1 -1
- package/dist/chunks/chunk-WSZHNPA6.js +7 -0
- package/dist/chunks/{chunk-MXCU7XDC.js → chunk-WTAM6QXM.js} +1 -1
- package/dist/chunks/{chunk-TF6R2AK2.js → chunk-XU4ETL7O.js} +1 -1
- package/dist/chunks/{chunk-UFFYFZAM.js → chunk-Y4GI6BXT.js} +1 -1
- package/dist/chunks/{chunk-6LE3FU2P.js → chunk-Y7PHTVZ6.js} +1 -1
- package/dist/chunks/{chunk-AKZOYEBP.js → chunk-YJZFFNUB.js} +4 -6
- package/dist/chunks/{clear-HVRCYR7Y.js → clear-NUMBAODD.js} +1 -1
- package/dist/chunks/{compile-vercel-config-C6HK4CET.js → compile-vercel-config-75XN6ZKP.js} +1 -1
- package/dist/chunks/{config-IGE3P5DW.js → config-26RISHPB.js} +1 -1
- package/dist/chunks/{config-OWBQ7UMH.js → config-Q6V74NTU.js} +1 -1
- package/dist/chunks/config-validator.mjs +1 -1
- package/dist/chunks/{constants-G4UYVLOF.js → constants-NCE2LWSS.js} +1 -1
- package/dist/chunks/{delete-7TLDNY3R.js → delete-LGIPH2II.js} +1 -1
- package/dist/chunks/{delete-44OXGSMJ.js → delete-PWVNXN4N.js} +1 -1
- package/dist/chunks/{detect-projects-MUTN7PJG.js → detect-projects-3AFQ2AC5.js} +1 -1
- package/dist/chunks/{detect-services-YFGQZSKL.js → detect-services-EX5ZTO5D.js} +1 -1
- package/dist/chunks/{disable-CAXQ5K7P.js → disable-62HLGVJG.js} +1 -1
- package/dist/chunks/{discard-VK4JVVUI.js → discard-LYY4AMIA.js} +1 -1
- package/dist/chunks/{edit-QQYOUSYT.js → edit-E6AMU6OJ.js} +1 -1
- package/dist/chunks/{edit-OUEGHFNI.js → edit-FEZFLAIJ.js} +1 -1
- package/dist/chunks/{enable-J3JXIEXT.js → enable-QDIH43E3.js} +1 -1
- package/dist/chunks/{export-V6BO2IPM.js → export-FO5JCAB4.js} +1 -1
- package/dist/chunks/{generate-cert-for-deploy-MICLCYMH.js → generate-cert-for-deploy-FG57HLGC.js} +1 -1
- package/dist/chunks/{image-2XS5KWHL.js → image-LZ32HAQV.js} +1 -1
- package/dist/chunks/{import-builders-P5BVQ6XV.js → import-builders-SELE5VYE.js} +1 -1
- package/dist/chunks/{inspect-XASVKP45.js → inspect-22LMAKCS.js} +1 -1
- package/dist/chunks/{inspect-NGKRKYFJ.js → inspect-BUNQSUCN.js} +1 -1
- package/dist/chunks/{inspect-WEURPPD2.js → inspect-D2S5CEPW.js} +1 -1
- package/dist/chunks/{inspect-4BJNJTCC.js → inspect-LGQ44GYB.js} +1 -1
- package/dist/chunks/{inspect-FFSXZNJX.js → inspect-XWT4QQRM.js} +1 -1
- package/dist/chunks/{list-DMNKMHHX.js → list-TXJQFAGW.js} +1 -1
- package/dist/chunks/{list-P35Q5I52.js → list-WRQRFVUL.js} +1 -1
- package/dist/chunks/{list-WZZJBBRG.js → list-XL4GMICP.js} +1 -1
- package/dist/chunks/{login-5OBK5VD6.js → login-QIPGRGDE.js} +1 -1
- package/dist/chunks/{logs-VRRUJRHE.js → logs-P4NGHB4I.js} +1 -1
- package/dist/chunks/{ls-YLEQL3HD.js → ls-COWL5TXJ.js} +1 -1
- package/dist/chunks/{ls-PFPQ4FVQ.js → ls-HTSBFV7C.js} +1 -1
- package/dist/chunks/{ls-ZQ7XIDOR.js → ls-JGBNPJEW.js} +1 -1
- package/dist/chunks/{ls-KDS7XXBR.js → ls-LOXX7YQ2.js} +1 -1
- package/dist/chunks/{ls-URHGCRIJ.js → ls-OCTMGB6C.js} +1 -1
- package/dist/chunks/{ls-J6HN2ZV6.js → ls-TXXVAVMF.js} +1 -1
- package/dist/chunks/{ls-6RY2JL5Y.js → ls-YTZOJEBT.js} +1 -1
- package/dist/chunks/mutate-BZHBI2PK.js +9 -0
- package/dist/chunks/notifications-CTNZYZZ2.js +7 -0
- package/dist/chunks/{open-A6XQS4I6.js → open-D53RMFUT.js} +1 -1
- package/dist/chunks/{permissions-C4UXCLJM.js → permissions-XHGXTFEU.js} +1 -1
- package/dist/chunks/{publish-TEH23DH4.js → publish-WTIW7W3Z.js} +1 -1
- package/dist/chunks/{pull-75Z4DDJE.js → pull-N5VAKGFJ.js} +1 -1
- package/dist/chunks/{purchase-domain-if-available-MMZA2NKN.js → purchase-domain-if-available-ZBXG4E7J.js} +1 -1
- package/dist/chunks/{push-MVETL2WL.js → push-ZQWVBEAJ.js} +1 -1
- package/dist/chunks/{query-SZHNXTY4.js → query-NNJNXQZG.js} +1 -1
- package/dist/chunks/{reorder-QLBFRK7S.js → reorder-64FNHY6J.js} +1 -1
- package/dist/chunks/{reply-YAQS5FVC.js → reply-MIJ6C3KT.js} +1 -1
- package/dist/chunks/{resolve-HANE4JO2.js → resolve-5HPYDKB4.js} +1 -1
- package/dist/chunks/{restore-4JNAT7IE.js → restore-KQ5T3MWQ.js} +1 -1
- package/dist/chunks/{rm-JWNSB3XZ.js → rm-C5GXOG3I.js} +1 -1
- package/dist/chunks/{rm-CVCPQXJI.js → rm-HZRLQ2FR.js} +1 -1
- package/dist/chunks/{rm-ZSFTT5HX.js → rm-S3TN7REH.js} +1 -1
- package/dist/chunks/{rm-LYOMGU2M.js → rm-WTUTQK3R.js} +1 -1
- package/dist/chunks/{rm-ARC7WDLH.js → rm-ZLKEDKBI.js} +1 -1
- package/dist/chunks/{rule-inspect-3RVLM4SD.js → rule-inspect-G4RGKBOI.js} +1 -1
- package/dist/chunks/{rules-NYBEYE3C.js → rules-5ECWTZPP.js} +1 -1
- package/dist/chunks/{schema-Y7A5YQQX.js → schema-EQCAQVSE.js} +1 -1
- package/dist/chunks/{schema-XAUOL37J.js → schema-NERSRSCG.js} +1 -1
- package/dist/chunks/{set-CTR3K32H.js → set-7HZRIJ6K.js} +1 -1
- package/dist/chunks/{setup-and-link-DHQEQNHY.js → setup-and-link-G4G4JJ6W.js} +1 -1
- package/dist/chunks/{tags-Y6NFCY2R.js → tags-JSRGITRJ.js} +1 -1
- package/dist/chunks/{update-SPG6HQBN.js → update-4B5AEB2C.js} +1 -1
- package/dist/commands/build/index.js +1 -1
- package/dist/commands/deploy/index.js +3 -3
- package/dist/commands/dev/index.js +20 -17
- 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 +46 -44
- package/dist/index.js +1 -1
- package/dist/version.mjs +1 -1
- package/package.json +54 -53
- package/dist/chunks/chunk-3QHJYVCY.js +0 -7
- package/dist/chunks/chunk-67ADLWX4.js +0 -7
- package/dist/chunks/chunk-AZ6NRDHG.js +0 -7
- package/dist/chunks/chunk-GTDDB5H3.js +0 -9
- package/dist/chunks/chunk-KUVMCIR4.js +0 -7
- package/dist/chunks/chunk-OAKO6LVS.js +0 -7
- package/dist/chunks/mutate-YBYD3KNW.js +0 -9
- package/dist/chunks/notifications-SB5JHLTX.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{resolveScope}from"./chunks/chunk-ZY3FVURC.js";import{FILTER_DEPRECATION_WARNING,computeGranularity,formatText,generateSparkline,toGranularityMsFromDuration,usesODataSyntax}from"./chunks/chunk-3RV2B7D3.js";import{OBSERVABILITY_METRICS_PATH,getRollupColumnName,handleApiError}from"./chunks/chunk-2R6NQXTQ.js";import{RoutesAddTelemetryClient,RoutesTelemetryClient}from"./chunks/chunk-6OI6SRHZ.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-DUZUOQVB.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-M3HTK4NR.js";import{canPrompt}from"./chunks/chunk-XD2LZRBS.js";import"./chunks/chunk-IVSSTHB6.js";import{formatDate,formatDateWithoutTime}from"./chunks/chunk-6PFC3KWQ.js";import{indent_default}from"./chunks/chunk-GZNDA6SV.js";import{collectBuildLogs,displayBuildLogs,displayRuntimeLogs}from"./chunks/chunk-MXCU7XDC.js";import{require_format}from"./chunks/chunk-WRILLB46.js";import{addDomain,createCertForCns,extractDomain,getDomainByName,isWildcardAlias,require_cjs,setupDomain}from"./chunks/chunk-PSPKPQRS.js";import{collectContactInformation,getDomainPrice,getDomainStatus,pollForOrder,purchaseDomain}from"./chunks/chunk-VTQUMQ2P.js";import{handleValidationError,normalizeRepeatableStringFilters,outputError,parseTimeFlag,resolveTimeRange,validateIntegerRangeWithDefault,validateTimeBound,validateTimeOrder}from"./chunks/chunk-FA6O7FPC.js";import{api,tryOpenApiFallback}from"./chunks/chunk-2HZGNTI4.js";import"./chunks/chunk-GHAY4PSD.js";import{login}from"./chunks/chunk-25MLFUQD.js";import{dump,load,main}from"./chunks/chunk-MAWP4YIY.js";import{createProject}from"./chunks/chunk-QHJLRTVY.js";import{require_fast_deep_equal}from"./chunks/chunk-4MZK6JT6.js";import{selectOrg}from"./chunks/chunk-3B4P7YHO.js";import{CURL_INSTALL_COMMAND,NATIVE_UPDATE_SELECT_PRODUCTION_ENV,NATIVE_UPDATE_VERSION_ENV,box,cacheNativeUpdateDiscoveryAttempt,cacheNativeUpdateVersion,did_you_mean_default,executeNativeSelfUpdate,executeUpgrade,handleCommandTypo,installAndActivatePrBinary,installAndActivateProductionVersion,isAutoUpdateEnabled,isCurlInstall,isNativeAutoUpdateEnabled,isNativeUpdateChild,listAvailableVersions,listNativeTrackSlots,markNativeUpdateStaged,parsePrTarget,pinPackageVersion,readNativeInstallState,require_tar_fs,resolveLatestNativeVersion,restoreNativeUpdateAfterDiscoveryFailure,setAutoUpdate,setMinReleaseAgeBypass,spawnNativeUpdateChild,stageProductionUpdate,withDirectoryLock}from"./chunks/chunk-UOHEF2JZ.js";import{OpenApiCache,resolveOpenApiTagForProjectsCli,resolveOpenApiTagForTeamsCli}from"./chunks/chunk-AP36GAOG.js";import{getUpdateCommand,getUpdateCommandInfo,isGlobal}from"./chunks/chunk-Q7UVAEN3.js";import{require_semver}from"./chunks/chunk-KKS7XWEX.js";import{readJSONFile}from"./chunks/chunk-Q6O7GA7P.js";import{Now,getBuildMachineResourceConfig,isDeploying,printDeploymentStatus}from"./chunks/chunk-F7UV4YLV.js";import{require_jsonlines}from"./chunks/chunk-QMO7LJLU.js";import{checkExistsAndConnect,disconnectGitProvider,list,parseRepoUrl,printRemoteUrls,selectAndParseRemoteUrl}from"./chunks/chunk-XQQGQ55A.js";import"./chunks/chunk-2H77IRPI.js";import{require_dist as require_dist3}from"./chunks/chunk-26LYRNMQ.js";import"./chunks/chunk-OHDEHZLX.js";import"./chunks/chunk-M2W3HKV3.js";import"./chunks/chunk-PHW54NU5.js";import"./chunks/chunk-U56NHYAH.js";import"./chunks/chunk-GJZRIDFC.js";import"./chunks/chunk-TRTEXGVN.js";import{sleep}from"./chunks/chunk-T3GQAMBJ.js";import"./chunks/chunk-T52FMXWC.js";import"./chunks/chunk-V6MR45PD.js";import{CHECKBOX_INSTRUCTIONS,getCustomEnvironments,pickCustomEnvironment,readStandardInput,require_dist as require_dist4}from"./chunks/chunk-COQGD2EI.js";import{getInvalidSubcommand}from"./chunks/chunk-TG2RCYTH.js";import{ellipsis}from"./chunks/chunk-ZDX75YNZ.js";import{formatTable,strlen}from"./chunks/chunk-UED2PPFP.js";import{ellipsizeMiddle,truncateEnd}from"./chunks/chunk-MBL6TXEJ.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-MKY5IBKK.js";import{require_execa}from"./chunks/chunk-HWWHR7H3.js";import{isGuidanceEnabled}from"./chunks/chunk-DQ2KI6FO.js";import{stamp_default}from"./chunks/chunk-XPXOV5UO.js";import"./chunks/chunk-2I64AYHG.js";import{getPaginationOpts,isValidName}from"./chunks/chunk-ZXE4XYIV.js";import{getCommandFlags}from"./chunks/chunk-OUHPDA7Q.js";import{formatEnvironment}from"./chunks/chunk-LQBC5QPO.js";import{validateLsArgs}from"./chunks/chunk-Z4VR6CQ2.js";import{elapsed}from"./chunks/chunk-JZRMH5UA.js";import{require_ms}from"./chunks/chunk-QTKJC2O5.js";import{validateJsonOutput,wantsMachineReadableOutput}from"./chunks/chunk-D4MW3RDW.js";import{require_dist2}from"./chunks/chunk-TOHAMRDX.js";import"./chunks/chunk-47BI2WLV.js";import"./chunks/chunk-P2O5DOYE.js";import"./chunks/chunk-L3JDEHCQ.js";import{createEnvObject,envPullCommandLogic,pull}from"./chunks/chunk-JUUECT2E.js";import{resolveProjectContext}from"./chunks/chunk-FVIQMWYR.js";import{performDeviceCodeFlow,saveDeviceCodeTokens}from"./chunks/chunk-H4FTGLWV.js";import{require_open}from"./chunks/chunk-ULLWCOYC.js";import"./chunks/chunk-N6CNMMSZ.js";import{getTeams}from"./chunks/chunk-I46LFJJG.js";import{getSubcommand as getSubcommand7}from"./chunks/chunk-ETV3C2CV.js";import{init_main,parse}from"./chunks/chunk-OI263FBO.js";import{ensureLink}from"./chunks/chunk-UFFYFZAM.js";import"./chunks/chunk-643SKD3D.js";import{AGENT_ACTION,AGENT_REASON,AGENT_STATUS}from"./chunks/chunk-T4LZS75P.js";import{require_frameworks}from"./chunks/chunk-KK4AJES5.js";import{CREDIT_TYPE_LABELS,FLAG_ATTRIBUTE_TYPES,FLAG_CONDITION_LIST_COMPARATORS,FLAG_CONDITION_RHS_OPTIONAL_COMPARATORS,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,claimSubcommand,codingAgentsSubcommand,completeSubcommand,configureSubcommand,connectSubcommand,connectSubcommand2,connectSubcommand3,connexCommand,contactsAddSubcommand,contactsSubcommand,contractCommand,copySubcommand,createGroupSubcommand,createStoreSubcommand,createSubcommand,createSubcommand2,createSubcommand3,createSubcommand4,createSubcommand5,createSubcommand6,createSubcommand7,createSubcommand8 as createSubcommand9,createThresholdSubcommand,creditsSubcommand,cronsCommand,curlCommand,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,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,guidanceCommand,guideSubcommand,httpstatCommand,importKeySubcommand,importSubcommand,importSubcommand2,initCommand,inspectCommand,inspectGroupSubcommand,inspectSubcommand,inspectSubcommand10 as inspectSubcommand14,inspectSubcommand2,inspectSubcommand3 as inspectSubcommand5,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,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 listSubcommand20,listSubcommand18 as listSubcommand21,listSubcommand19 as listSubcommand22,listSubcommand2,listSubcommand20 as listSubcommand23,listSubcommand21 as listSubcommand24,listSubcommand22 as listSubcommand26,listSubcommand23 as listSubcommand27,listSubcommand24 as listSubcommand28,listSubcommand25 as listSubcommand29,listSubcommand3 as listSubcommand4,listSubcommand4 as listSubcommand5,listSubcommand5 as listSubcommand7,listSubcommand6 as listSubcommand8,listSubcommand7 as listSubcommand9,listSubcommand8 as listSubcommand10,listSubcommand9 as listSubcommand11,listVersionsSubcommand,loadStoreDetails,logoutCommand,mcpCommand,membersAddFlags,membersRemoveFlags,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,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,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,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-GTDDB5H3.js";import{createSubcommand as createSubcommand8,getSubcommand as getSubcommand4,tracesCommand}from"./chunks/chunk-M5AV545M.js";import{tracesConfigCommand}from"./chunks/chunk-IVWPQYIH.js";import{addSubcommand as addSubcommand13,buildSubcommand,configSubcommand,inspectSubcommand as inspectSubcommand13,listSubcommand as listSubcommand25,loginSubcommand,pushSubcommand,removeSubcommand as removeSubcommand16,vcrCommand}from"./chunks/chunk-65JYSI26.js";import{PERMISSIONS_ACTIONS,permissionsAddSubcommand,permissionsAggregateCommand,permissionsClearSubcommand,permissionsLsSubcommand,permissionsRmSubcommand}from"./chunks/chunk-YMVDWVMO.js";import{tagsAggregateCommand,tagsInspectSubcommand,tagsLsSubcommand}from"./chunks/chunk-O7G3CZ42.js";import{imageAggregateCommand,imageInspectSubcommand,imageLsSubcommand,imageRmSubcommand}from"./chunks/chunk-N3N5UHIL.js";import{metricsCommand,schemaSubcommand}from"./chunks/chunk-WUZD4KBL.js";import{addSubcommand as addSubcommand10,deleteSubcommand as deleteSubcommand3,disableSubcommand as disableSubcommand3,discardSubcommand as discardSubcommand2,editSubcommand as editSubcommand2,enableSubcommand as enableSubcommand3,exportSubcommand,inspectSubcommand as inspectSubcommand12,listSubcommand as listSubcommand19,listVersionsSubcommand as listVersionsSubcommand2,publishSubcommand as publishSubcommand2,reorderSubcommand,restoreSubcommand as restoreSubcommand2,routesCommand}from"./chunks/chunk-3QHJYVCY.js";import{commentsCommand,deleteSubcommand,editSubcommand,inspectSubcommand as inspectSubcommand4,listSubcommand as listSubcommand6,openSubcommand,reopenSubcommand,replySubcommand,resolveSubcommand}from"./chunks/chunk-NBVY237X.js";import{alertsCommand,inspectSubcommand as inspectSubcommand3,listSubcommand as listSubcommand3}from"./chunks/chunk-EIXOJUNN.js";import{rulesAddSubcommand as rulesAddSubcommand2,rulesAggregateCommand,rulesInspectSubcommand,rulesLsSubcommand,rulesNotificationsAggregateCommand,rulesNotificationsLinkSubcommand,rulesNotificationsLsSubcommand,rulesNotificationsUnlinkSubcommand,rulesRmSubcommand,rulesSchemaSubcommand,rulesUpdateSubcommand}from"./chunks/chunk-OAKO6LVS.js";import{logsCommand}from"./chunks/chunk-MEAY2K5Z.js";import{activityCommand,typesSubcommand}from"./chunks/chunk-EQ52F4LH.js";import"./chunks/chunk-CVKB54WW.js";import"./chunks/chunk-JKTQV2QJ.js";import"./chunks/chunk-6LE3FU2P.js";import"./chunks/chunk-AZ6NRDHG.js";import"./chunks/chunk-FAW6NBLQ.js";import{envTargetChoices,isValidEnvTarget}from"./chunks/chunk-KUVMCIR4.js";import"./chunks/chunk-SOJCELXH.js";import{param}from"./chunks/chunk-SXUEGVWB.js";import{STANDARD_ENVIRONMENTS,formatProject}from"./chunks/chunk-6BZCSVH6.js";import{buildCommandDocumentationLines,help}from"./chunks/chunk-V6IKQCOT.js";import{table}from"./chunks/chunk-6TAQ6OWD.js";import"./chunks/chunk-R3B67TKQ.js";import{getDeployment,toHost}from"./chunks/chunk-C5KVTG2O.js";import{mapCertError}from"./chunks/chunk-6NPXWN5F.js";import"./chunks/chunk-WPS6JZF6.js";import"./chunks/chunk-ZKYS7EAB.js";import{detectExplicitScope,getScope,persistAuthConfig,readLocalConfig,writeToConfigFile}from"./chunks/chunk-4M7CX4YK.js";import{getGlobalPathConfig}from"./chunks/chunk-JSKGZLE4.js";import{TelemetryClient}from"./chunks/chunk-A5VLP25I.js";import"./chunks/chunk-RCTYVKM5.js";import{getInstallRoot,isNativeBinaryInstall}from"./chunks/chunk-7T6TL3GQ.js";import"./chunks/chunk-GHM7V3GG.js";import{processRevocationResponse,revocationRequest,ua_default}from"./chunks/chunk-5XJNPXQK.js";import{printError}from"./chunks/chunk-N5AIKGEO.js";import{parseArguments}from"./chunks/chunk-WWB66KP5.js";import{fetch as fetch2,getFetchDispatcher,toNodeReadable}from"./chunks/chunk-MY4MONOH.js";import{VERCEL_CONFIG_EXTENSIONS,getGitConfigPath,getLinkFromDir,getLinkedProject,getProjectByNameOrId,getProjectLink,getVercelDirectory,parseGitConfig,pluckRemoteUrls,require_lib,require_pluralize,resolveProjectCwd}from"./chunks/chunk-P6C5L7KC.js";import"./chunks/chunk-F2ZWW2IO.js";import"./chunks/chunk-B4ATVYZW.js";import{humanizePath}from"./chunks/chunk-PPCFQQSU.js";import"./chunks/chunk-BRK4OB4B.js";import{require_strip_ansi}from"./chunks/chunk-OSCCYU74.js";import{argvHasNonInteractive,buildCommandWithGlobalFlags,buildCommandWithYes,buildIntegrationCommandTailFromArgv,exitWithNonInteractiveError,mentionsObservabilityPlus,observabilityPlusPurchaseFix,openUrlInBrowserCommand,outputActionRequired,outputAgentError,outputAgentSuccess,shouldEmitNonInteractiveCommandError,withGlobalFlags,writeAgentError}from"./chunks/chunk-KCARCOP5.js";import{quoteArg}from"./chunks/chunk-BKV35LVB.js";import{arg_common_default,getFlagsSpecification,getGlobalFlagsFromArgs,getProjectOptionFromArgs,getSameSubcommandSuggestionFlags,globalCommandOptions,stripSensitiveAuthArgs}from"./chunks/chunk-JAJW3P42.js";import{ALIGNED_LABEL_WIDTH,formatAlignedLabel,printAlignedLabel}from"./chunks/chunk-YMM3VY3J.js";import{getUser}from"./chunks/chunk-SM5JI6QM.js";import{getTeamByIdOrSlug}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,LinkRequiredError,NoAliasInConfig,NowError,ProjectNotFound,SourceNotFound,TLDNotSupportedViaCLI,TooManyRequests,UnexpectedDomainPurchaseError,UnexpectedDomainTransferError,UnsupportedTLD,UserAborted,code,isAPIError,require_bytes}from"./chunks/chunk-RINZXCDJ.js";import{cmd,getCommandName,getCommandNamePlain,packageName,require_lib as require_lib2}from"./chunks/chunk-FI772UVH.js";import{chars_default,emoji,eraseLines,link_default,output_manager_default,prependEmoji}from"./chunks/chunk-EWWFNMPZ.js";import{require_dist}from"./chunks/chunk-QGIQK47P.js";import{pkg_default}from"./chunks/chunk-AVSPFBLM.js";import"./chunks/chunk-XCJDGQO7.js";import"./chunks/chunk-YPTLSODC.js";import"./chunks/chunk-7HL2RPUO.js";import{require_source}from"./chunks/chunk-U7KCDTCH.js";import"./chunks/chunk-N3ZZ7FHQ.js";import"./chunks/chunk-GU6VIFR5.js";import{__require,__toESM}from"./chunks/chunk-6L236MNA.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{resolveScope}from"./chunks/chunk-MNR5YQDP.js";import{FILTER_DEPRECATION_WARNING,computeGranularity,formatText,generateSparkline,toGranularityMsFromDuration,usesODataSyntax}from"./chunks/chunk-3RV2B7D3.js";import{OBSERVABILITY_METRICS_PATH,getRollupColumnName,handleApiError}from"./chunks/chunk-2R6NQXTQ.js";import{RoutesAddTelemetryClient,RoutesTelemetryClient}from"./chunks/chunk-6OI6SRHZ.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-I7PARON4.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-JC4FG6EW.js";import{canPrompt}from"./chunks/chunk-XD2LZRBS.js";import"./chunks/chunk-IVSSTHB6.js";import{formatDate,formatDateWithoutTime}from"./chunks/chunk-6PFC3KWQ.js";import{indent_default}from"./chunks/chunk-GZNDA6SV.js";import{collectBuildLogs,displayBuildLogs,displayRuntimeLogs}from"./chunks/chunk-WTAM6QXM.js";import{require_format}from"./chunks/chunk-WRILLB46.js";import{addDomain,createCertForCns,extractDomain,getDomainByName,isWildcardAlias,require_cjs,setupDomain}from"./chunks/chunk-TZN45RBM.js";import{collectContactInformation,getDomainPrice,getDomainStatus,pollForOrder,purchaseDomain}from"./chunks/chunk-EWSS6LUE.js";import{handleValidationError,normalizeRepeatableStringFilters,outputError,parseTimeFlag,resolveTimeRange,validateIntegerRangeWithDefault,validateTimeBound,validateTimeOrder}from"./chunks/chunk-FA6O7FPC.js";import{api,tryOpenApiFallback}from"./chunks/chunk-2HZGNTI4.js";import"./chunks/chunk-GHAY4PSD.js";import{login}from"./chunks/chunk-25MLFUQD.js";import{dump,load,main}from"./chunks/chunk-TH2WHOUV.js";import{createProject}from"./chunks/chunk-QHJLRTVY.js";import{require_fast_deep_equal}from"./chunks/chunk-4MZK6JT6.js";import{selectOrg}from"./chunks/chunk-3B4P7YHO.js";import{CURL_INSTALL_COMMAND,NATIVE_UPDATE_SELECT_PRODUCTION_ENV,NATIVE_UPDATE_VERSION_ENV,box,cacheNativeUpdateDiscoveryAttempt,cacheNativeUpdateVersion,did_you_mean_default,executeNativeSelfUpdate,executeUpgrade,handleCommandTypo,installAndActivatePrBinary,installAndActivateProductionVersion,isAutoUpdateEnabled,isCurlInstall,isNativeAutoUpdateEnabled,isNativeUpdateChild,listAvailableVersions,listNativeTrackSlots,markNativeUpdateStaged,parsePrTarget,pinPackageVersion,readNativeInstallState,require_tar_fs,resolveLatestNativeVersion,restoreNativeUpdateAfterDiscoveryFailure,setAutoUpdate,setMinReleaseAgeBypass,spawnNativeUpdateChild,stageProductionUpdate,withDirectoryLock}from"./chunks/chunk-MWU4ZPZ4.js";import{OpenApiCache,resolveOpenApiTagForProjectsCli,resolveOpenApiTagForTeamsCli}from"./chunks/chunk-AP36GAOG.js";import{getUpdateCommand,getUpdateCommandInfo,isGlobal}from"./chunks/chunk-MRSU4C5C.js";import{require_semver}from"./chunks/chunk-KKS7XWEX.js";import{readJSONFile}from"./chunks/chunk-5B3BHCFE.js";import{Now,getBuildMachineResourceConfig,isDeploying,printDeploymentStatus}from"./chunks/chunk-4VFDQB4H.js";import"./chunks/chunk-JSVZKMZO.js";import{checkExistsAndConnect,disconnectGitProvider,list,parseRepoUrl,printRemoteUrls,selectAndParseRemoteUrl}from"./chunks/chunk-XQQGQ55A.js";import"./chunks/chunk-2H77IRPI.js";import{require_dist as require_dist3}from"./chunks/chunk-TUVMXISG.js";import"./chunks/chunk-OHDEHZLX.js";import"./chunks/chunk-M2W3HKV3.js";import"./chunks/chunk-PHW54NU5.js";import"./chunks/chunk-U56NHYAH.js";import"./chunks/chunk-3YOA3ODU.js";import"./chunks/chunk-TRTEXGVN.js";import{sleep}from"./chunks/chunk-T3GQAMBJ.js";import"./chunks/chunk-T52FMXWC.js";import"./chunks/chunk-V6MR45PD.js";import{CHECKBOX_INSTRUCTIONS,getCustomEnvironments,pickCustomEnvironment,readStandardInput,require_dist as require_dist4}from"./chunks/chunk-COQGD2EI.js";import{getInvalidSubcommand}from"./chunks/chunk-TG2RCYTH.js";import{ellipsis}from"./chunks/chunk-ZDX75YNZ.js";import{formatTable,strlen}from"./chunks/chunk-UED2PPFP.js";import{ellipsizeMiddle,truncateEnd}from"./chunks/chunk-MBL6TXEJ.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-MKY5IBKK.js";import{require_execa}from"./chunks/chunk-HWWHR7H3.js";import{isGuidanceEnabled}from"./chunks/chunk-DQ2KI6FO.js";import{stamp_default}from"./chunks/chunk-XPXOV5UO.js";import"./chunks/chunk-2I64AYHG.js";import{getPaginationOpts,isValidName}from"./chunks/chunk-ZXE4XYIV.js";import{getCommandFlags}from"./chunks/chunk-OUHPDA7Q.js";import{formatEnvironment}from"./chunks/chunk-LQBC5QPO.js";import{validateLsArgs}from"./chunks/chunk-Z4VR6CQ2.js";import{elapsed}from"./chunks/chunk-JZRMH5UA.js";import{require_ms}from"./chunks/chunk-QTKJC2O5.js";import{validateJsonOutput,wantsMachineReadableOutput}from"./chunks/chunk-D4MW3RDW.js";import{require_dist2}from"./chunks/chunk-JMNAVONO.js";import"./chunks/chunk-LTFVLQEF.js";import"./chunks/chunk-P2O5DOYE.js";import"./chunks/chunk-L3JDEHCQ.js";import{createEnvObject,envPullCommandLogic,pull}from"./chunks/chunk-ECJKSW62.js";import{resolveProjectContext}from"./chunks/chunk-QXC2G7JY.js";import{performDeviceCodeFlow,saveDeviceCodeTokens}from"./chunks/chunk-H4FTGLWV.js";import{require_open}from"./chunks/chunk-ULLWCOYC.js";import"./chunks/chunk-N6CNMMSZ.js";import{getTeams}from"./chunks/chunk-I46LFJJG.js";import{getSubcommand as getSubcommand7}from"./chunks/chunk-ETV3C2CV.js";import{init_main,parse}from"./chunks/chunk-OI263FBO.js";import{ensureLink}from"./chunks/chunk-Y4GI6BXT.js";import"./chunks/chunk-PNY65NDD.js";import{AGENT_ACTION,AGENT_REASON,AGENT_STATUS}from"./chunks/chunk-T4LZS75P.js";import{require_frameworks}from"./chunks/chunk-KK4AJES5.js";import{CREDIT_TYPE_LABELS,FLAG_ATTRIBUTE_TYPES,FLAG_CONDITION_LIST_COMPARATORS,FLAG_CONDITION_RHS_OPTIONAL_COMPARATORS,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,claimSubcommand,codingAgentsSubcommand,completeSubcommand,configureSubcommand,connectSubcommand,connectSubcommand2,connectSubcommand3,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,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,guidanceCommand,guideSubcommand,httpstatCommand,importKeySubcommand,importSubcommand,importSubcommand2,initCommand,inspectCommand,inspectGroupSubcommand,inspectSubcommand,inspectSubcommand10 as inspectSubcommand14,inspectSubcommand2,inspectSubcommand3 as inspectSubcommand5,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,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 listSubcommand20,listSubcommand18 as listSubcommand21,listSubcommand19 as listSubcommand22,listSubcommand2,listSubcommand20 as listSubcommand23,listSubcommand21 as listSubcommand24,listSubcommand22 as listSubcommand26,listSubcommand23 as listSubcommand27,listSubcommand24 as listSubcommand28,listSubcommand25 as listSubcommand29,listSubcommand3 as listSubcommand4,listSubcommand4 as listSubcommand5,listSubcommand5 as listSubcommand7,listSubcommand6 as listSubcommand8,listSubcommand7 as listSubcommand9,listSubcommand8 as listSubcommand10,listSubcommand9 as listSubcommand11,listVersionsSubcommand,loadStoreDetails,logoutCommand,mcpCommand,membersAddFlags,membersRemoveFlags,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,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,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,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-4JFQYK65.js";import{createSubcommand as createSubcommand8,getSubcommand as getSubcommand4,tracesCommand}from"./chunks/chunk-M5AV545M.js";import{tracesConfigCommand}from"./chunks/chunk-IVWPQYIH.js";import{addSubcommand as addSubcommand13,buildSubcommand,configSubcommand,inspectSubcommand as inspectSubcommand13,listSubcommand as listSubcommand25,loginSubcommand,pushSubcommand,removeSubcommand as removeSubcommand16,vcrCommand}from"./chunks/chunk-65JYSI26.js";import{PERMISSIONS_ACTIONS,permissionsAddSubcommand,permissionsAggregateCommand,permissionsClearSubcommand,permissionsLsSubcommand,permissionsRmSubcommand}from"./chunks/chunk-YMVDWVMO.js";import{tagsAggregateCommand,tagsInspectSubcommand,tagsLsSubcommand}from"./chunks/chunk-O7G3CZ42.js";import{imageAggregateCommand,imageInspectSubcommand,imageLsSubcommand,imageRmSubcommand}from"./chunks/chunk-N3N5UHIL.js";import{metricsCommand,schemaSubcommand}from"./chunks/chunk-WUZD4KBL.js";import{addSubcommand as addSubcommand10,deleteSubcommand as deleteSubcommand3,disableSubcommand as disableSubcommand3,discardSubcommand as discardSubcommand2,editSubcommand as editSubcommand2,enableSubcommand as enableSubcommand3,exportSubcommand,inspectSubcommand as inspectSubcommand12,listSubcommand as listSubcommand19,listVersionsSubcommand as listVersionsSubcommand2,publishSubcommand as publishSubcommand2,reorderSubcommand,restoreSubcommand as restoreSubcommand2,routesCommand}from"./chunks/chunk-QFPCR4NL.js";import{commentsCommand,deleteSubcommand,editSubcommand,inspectSubcommand as inspectSubcommand4,listSubcommand as listSubcommand6,openSubcommand,reopenSubcommand,replySubcommand,resolveSubcommand}from"./chunks/chunk-5ENY7DSN.js";import{alertsCommand,inspectSubcommand as inspectSubcommand3,listSubcommand as listSubcommand3}from"./chunks/chunk-UTVDFSQS.js";import{rulesAddSubcommand as rulesAddSubcommand2,rulesAggregateCommand,rulesInspectSubcommand,rulesLsSubcommand,rulesNotificationsAggregateCommand,rulesNotificationsLinkSubcommand,rulesNotificationsLsSubcommand,rulesNotificationsUnlinkSubcommand,rulesNotificationsUpdateSubcommand,rulesRmSubcommand,rulesSchemaSubcommand,rulesUpdateSubcommand}from"./chunks/chunk-SW7MNF4H.js";import{logsCommand}from"./chunks/chunk-MEAY2K5Z.js";import{activityCommand,typesSubcommand}from"./chunks/chunk-EQ52F4LH.js";import"./chunks/chunk-CVKB54WW.js";import"./chunks/chunk-JKTQV2QJ.js";import"./chunks/chunk-Y7PHTVZ6.js";import"./chunks/chunk-WSZHNPA6.js";import"./chunks/chunk-FAW6NBLQ.js";import{envTargetChoices,isValidEnvTarget}from"./chunks/chunk-5UOVEMYX.js";import"./chunks/chunk-SOJCELXH.js";import{param}from"./chunks/chunk-SXUEGVWB.js";import{STANDARD_ENVIRONMENTS,formatProject}from"./chunks/chunk-6BZCSVH6.js";import{buildCommandDocumentationLines,help}from"./chunks/chunk-V6IKQCOT.js";import{table}from"./chunks/chunk-6TAQ6OWD.js";import"./chunks/chunk-R3B67TKQ.js";import{getDeployment,toHost}from"./chunks/chunk-C5KVTG2O.js";import{mapCertError}from"./chunks/chunk-6NPXWN5F.js";import"./chunks/chunk-WPS6JZF6.js";import"./chunks/chunk-ZKYS7EAB.js";import{detectExplicitScope,getScope,persistAuthConfig,readLocalConfig,writeToConfigFile}from"./chunks/chunk-AH3A52IK.js";import{getGlobalPathConfig}from"./chunks/chunk-JSKGZLE4.js";import{TelemetryClient}from"./chunks/chunk-A5VLP25I.js";import"./chunks/chunk-RCTYVKM5.js";import{getInstallRoot,isNativeBinaryInstall}from"./chunks/chunk-7T6TL3GQ.js";import"./chunks/chunk-GHM7V3GG.js";import{processRevocationResponse,revocationRequest,ua_default}from"./chunks/chunk-5XJNPXQK.js";import{printError}from"./chunks/chunk-N5AIKGEO.js";import{parseArguments}from"./chunks/chunk-WWB66KP5.js";import{fetch as fetch2,getFetchDispatcher,toNodeReadable}from"./chunks/chunk-MY4MONOH.js";import{VERCEL_CONFIG_EXTENSIONS,getGitConfigPath,getLinkFromDir,getLinkedProject,getProjectByNameOrId,getProjectLink,getVercelDirectory,parseGitConfig,pluckRemoteUrls,require_lib,require_pluralize,resolveProjectCwd}from"./chunks/chunk-4XAIK5CI.js";import"./chunks/chunk-F2ZWW2IO.js";import"./chunks/chunk-B4ATVYZW.js";import{humanizePath}from"./chunks/chunk-PPCFQQSU.js";import"./chunks/chunk-BRK4OB4B.js";import{require_strip_ansi}from"./chunks/chunk-OSCCYU74.js";import{argvHasNonInteractive,buildCommandWithGlobalFlags,buildCommandWithYes,buildIntegrationCommandTailFromArgv,exitWithNonInteractiveError,mentionsObservabilityPlus,observabilityPlusPurchaseFix,openUrlInBrowserCommand,outputActionRequired,outputAgentError,outputAgentSuccess,shouldEmitNonInteractiveCommandError,withGlobalFlags,writeAgentError}from"./chunks/chunk-KCARCOP5.js";import{quoteArg}from"./chunks/chunk-BKV35LVB.js";import{arg_common_default,getFlagsSpecification,getGlobalFlagsFromArgs,getProjectOptionFromArgs,getSameSubcommandSuggestionFlags,globalCommandOptions,stripSensitiveAuthArgs}from"./chunks/chunk-JAJW3P42.js";import{ALIGNED_LABEL_WIDTH,formatAlignedLabel,printAlignedLabel}from"./chunks/chunk-YMM3VY3J.js";import{getUser}from"./chunks/chunk-SM5JI6QM.js";import{getTeamByIdOrSlug}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,LinkRequiredError,NoAliasInConfig,NowError,ProjectNotFound,SourceNotFound,TLDNotSupportedViaCLI,TooManyRequests,UnexpectedDomainPurchaseError,UnexpectedDomainTransferError,UnsupportedTLD,UserAborted,code,isAPIError,require_bytes}from"./chunks/chunk-RINZXCDJ.js";import{cmd,getCommandName,getCommandNamePlain,packageName,require_lib as require_lib2}from"./chunks/chunk-FI772UVH.js";import{chars_default,emoji,eraseLines,link_default,output_manager_default,prependEmoji}from"./chunks/chunk-EWWFNMPZ.js";import{require_dist}from"./chunks/chunk-QGIQK47P.js";import{pkg_default}from"./chunks/chunk-AVSPFBLM.js";import"./chunks/chunk-XCJDGQO7.js";import"./chunks/chunk-YPTLSODC.js";import"./chunks/chunk-7HL2RPUO.js";import{require_source}from"./chunks/chunk-U7KCDTCH.js";import"./chunks/chunk-N3ZZ7FHQ.js";import"./chunks/chunk-GU6VIFR5.js";import{__require,__toESM}from"./chunks/chunk-6L236MNA.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),1}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(arg=>!arg.startsWith("-"));return unknown?(output_manager_default.error(`Unknown subcommand: ${unknown}`),output_manager_default.print(help(agentRunsCommand,{columns:client.stderr.columns})),1):(needHelp&&telemetry2.trackCliFlagHelp("agent-runs"),output_manager_default.print(help(agentRunsCommand,{columns:client.stderr.columns})),2)}switch(subcommand){case"list":return needHelp?(telemetry2.trackCliFlagHelp("agent-runs",subcommandOriginal),printHelp(listSubcommand),2):(telemetry2.trackCliSubcommandList(subcommandOriginal),await list2(client));case"inspect":return needHelp?(telemetry2.trackCliFlagHelp("agent-runs",subcommandOriginal),printHelp(inspectSubcommand),2):(telemetry2.trackCliSubcommandInspect(subcommandOriginal),await inspect(client));case"trace":return needHelp?(telemetry2.trackCliFlagHelp("agent-runs",subcommandOriginal),printHelp(traceSubcommand),2):(telemetry2.trackCliSubcommandTrace(subcommandOriginal),await trace(client));case"projects":return needHelp?(telemetry2.trackCliFlagHelp("agent-runs",subcommandOriginal),printHelp(projectsSubcommand),2):(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})),1}}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),1}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-UYIFBCCL.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-P35Q5I52.js")).default;return listFn(client,telemetry2)}}}var import_chalk6=__toESM(require_source(),1);async function listApiKeys(client){let{apiKeys:apiKeys2}=await client.fetch("/v1/api-keys?purpose=ai-gateway",{method:"GET"});return apiKeys2??[]}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})}async function findApiKeyByIdOrName(client,identifier){try{let apiKey=await getApiKey(client,identifier);if(apiKey&&apiKey.purpose==="ai-gateway")return{apiKey}}catch{}let matches=(await listApiKeys(client)).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),1}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")}]},1),output_manager_default.error(message),1}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")}]},1),output_manager_default.error(message),1}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")}]},1),output_manager_default.error(message),1}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")}]},1),output_manager_default.error(message),1}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")}]},1),output_manager_default.error(message),1}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),1}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(arg=>!arg.startsWith("-"));return unknown?(output_manager_default.error(`Unknown subcommand: ${unknown}`),output_manager_default.print(help(agentRunsCommand,{columns:client.stderr.columns})),1):(needHelp&&telemetry2.trackCliFlagHelp("agent-runs"),output_manager_default.print(help(agentRunsCommand,{columns:client.stderr.columns})),2)}switch(subcommand){case"list":return needHelp?(telemetry2.trackCliFlagHelp("agent-runs",subcommandOriginal),printHelp(listSubcommand),2):(telemetry2.trackCliSubcommandList(subcommandOriginal),await list2(client));case"inspect":return needHelp?(telemetry2.trackCliFlagHelp("agent-runs",subcommandOriginal),printHelp(inspectSubcommand),2):(telemetry2.trackCliSubcommandInspect(subcommandOriginal),await inspect(client));case"trace":return needHelp?(telemetry2.trackCliFlagHelp("agent-runs",subcommandOriginal),printHelp(traceSubcommand),2):(telemetry2.trackCliSubcommandTrace(subcommandOriginal),await trace(client));case"projects":return needHelp?(telemetry2.trackCliFlagHelp("agent-runs",subcommandOriginal),printHelp(projectsSubcommand),2):(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})),1}}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),1}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-UYIFBCCL.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-WRQRFVUL.js")).default;return listFn(client,telemetry2)}}}var import_chalk6=__toESM(require_source(),1);async function listApiKeys(client){let{apiKeys:apiKeys2}=await client.fetch("/v1/api-keys?purpose=ai-gateway",{method:"GET"});return apiKeys2??[]}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})}async function findApiKeyByIdOrName(client,identifier){try{let apiKey=await getApiKey(client,identifier);if(apiKey&&apiKey.purpose==="ai-gateway")return{apiKey}}catch{}let matches=(await listApiKeys(client)).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),1}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")}]},1),output_manager_default.error(message),1}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")}]},1),output_manager_default.error(message),1}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")}]},1),output_manager_default.error(message),1}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")}]},1),output_manager_default.error(message),1}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")}]},1),output_manager_default.error(message),1}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{trackCliOptionFormat(format3){format3&&this.trackCliOption({option:"format",value:format3})}};async function renderResource(client,{asJson,spinnerText,fetch:fetch3,toJSON,isEmpty,emptyMessage,header,renderTable:renderTable2,notFoundMessage}){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)),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),1}let{flags:opts}=parsedArgs;telemetry2.trackCliOptionFormat(opts["--format"]);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),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:()=>listApiKeys(client),toJSON:apiKeys2=>({apiKeys:apiKeys2}),isEmpty:apiKeys2=>apiKeys2.length===0,emptyMessage:`No API keys found. Create one with ${getCommandName("ai-gateway api-keys create")}.`,header:()=>"API keys",renderTable:apiKeys2=>printApiKeysTable(apiKeys2,keyDefault)})}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
|
|
|
@@ -169,7 +169,7 @@ ${preserved.join(`
|
|
|
169
169
|
`),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),1}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),1}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})),2;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),2):(telemetry2.trackCliSubcommandModels(subcommandOriginal),models2(client,args));case"labs":return needHelp?(telemetry2.trackCliFlagHelp("ai-gateway leaderboard",subcommandOriginal),printHelp(leaderboardLabsSubcommand),2):(telemetry2.trackCliSubcommandLabs(subcommandOriginal),labs(client,args));case"apps":return needHelp?(telemetry2.trackCliFlagHelp("ai-gateway leaderboard",subcommandOriginal),printHelp(leaderboardAppsSubcommand),2):(telemetry2.trackCliSubcommandApps(subcommandOriginal),apps(client,args));case"providers":return needHelp?(telemetry2.trackCliFlagHelp("ai-gateway leaderboard",subcommandOriginal),printHelp(leaderboardProvidersSubcommand),2):(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),1}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})),2;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})),2):(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})),2):(output_manager_default.error("Please specify a subcommand. Run `vercel ai-gateway --help` for usage information."),1)}}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 builtInBody={type:"built-in",name:"Production server errors",triggers:{mode:"selected",items:[{type:"error_anomaly",filter:"statusGroup:5xx AND route:/api/*"}]},matchMinimumSeverityLevel:"high"};function getRulesAddBodyExamplesHelp(){return["Scope",""," Provide ruleScope in the body or use a scope flag, not both."," --project maps to one included project."," --all maps to every project in the team.","","Built-in body (rule.json)","",indent_default(JSON.stringify(builtInBody,null,2),2),""," vercel alerts rules add --project my-app --body ./rule.json","","Authoring reference",""," vercel alerts rules schema --type built-in",""].join(`
|
|
170
170
|
`)}function getRulesUpdateBodyExamplesHelp(){return["Update body",""," Include only the fields to change. type is optional and inferred from the stored rule."," Use --project or --all to change scope with or without --body."," Do not combine a ruleScope field in the body with --project or --all."," --all moves the rule to team-wide scope.","","Partial body (patch.json)","",indent_default(JSON.stringify({name:"Critical production errors",matchMinimumSeverityLevel:"critical"},null,2),2),""," vercel alerts rules update ar_abc123 --body ./patch.json"," vercel alerts rules update ar_abc123 --project my-app","","Authoring reference",""," vercel alerts rules schema --type built-in",""].join(`
|
|
171
171
|
`)}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(arg=>arg==="-help"?"--help":arg)}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"}]},1),printError(err),1}let{subcommand,args,subcommandOriginal,rawSubcommandArgs}=getAlertsSubcommand(rawArgs,parsedArgs.args,{...arg_common_default(),...flagsSpecification}),needHelp=parsedArgs.flags["--help"],rulesHelpParent={...rulesAggregateCommand,name:`${alertsCommand.name} ${rulesAggregateCommand.name}`},notificationsHelpParent={...rulesNotificationsAggregateCommand,name:`${rulesHelpParent.name} ${rulesNotificationsAggregateCommand.name}`};function printHelp(command2,parent=alertsCommand,extra){let helpOutput=help(command2,{parent,columns:client.stderr.columns});output_manager_default.print(extra?`${helpOutput}
|
|
172
|
-
${extra}`:helpOutput)}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,rulesHelpParent),0;if(nested==="schema")return printHelp(rulesSchemaSubcommand,rulesHelpParent),0;if(nested==="add"||nested==="create")return printHelp(rulesAddSubcommand2,rulesHelpParent,getRulesAddBodyExamplesHelp()),0;if(nested==="inspect"||nested==="get")return printHelp(rulesInspectSubcommand,rulesHelpParent),0;if(nested==="rm"||nested==="remove"||nested==="delete")return printHelp(rulesRmSubcommand,rulesHelpParent),0;if(nested==="update"||nested==="patch")return printHelp(rulesUpdateSubcommand,rulesHelpParent,getRulesUpdateBodyExamplesHelp()),0;if(nested==="notifications"){let notificationAction=args[1];return notificationAction==="ls"||notificationAction==="list"||notificationAction?.startsWith("ar_")?(printHelp(rulesNotificationsLsSubcommand,notificationsHelpParent),0):notificationAction==="link"?(printHelp(rulesNotificationsLinkSubcommand,notificationsHelpParent),0):notificationAction==="unlink"?(printHelp(rulesNotificationsUnlinkSubcommand,notificationsHelpParent),0):(printHelp(rulesNotificationsAggregateCommand,rulesHelpParent),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-
|
|
172
|
+
${extra}`:helpOutput)}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,rulesHelpParent),0;if(nested==="schema")return printHelp(rulesSchemaSubcommand,rulesHelpParent),0;if(nested==="add"||nested==="create")return printHelp(rulesAddSubcommand2,rulesHelpParent,getRulesAddBodyExamplesHelp()),0;if(nested==="inspect"||nested==="get")return printHelp(rulesInspectSubcommand,rulesHelpParent),0;if(nested==="rm"||nested==="remove"||nested==="delete")return printHelp(rulesRmSubcommand,rulesHelpParent),0;if(nested==="update"||nested==="patch")return printHelp(rulesUpdateSubcommand,rulesHelpParent,getRulesUpdateBodyExamplesHelp()),0;if(nested==="notifications"){let notificationAction=args[1];return notificationAction==="ls"||notificationAction==="list"||notificationAction?.startsWith("ar_")?(printHelp(rulesNotificationsLsSubcommand,notificationsHelpParent),0):notificationAction==="link"?(printHelp(rulesNotificationsLinkSubcommand,notificationsHelpParent),0):notificationAction==="update"||notificationAction==="patch"?(printHelp(rulesNotificationsUpdateSubcommand,notificationsHelpParent),0):notificationAction==="unlink"?(printHelp(rulesNotificationsUnlinkSubcommand,notificationsHelpParent),0):(printHelp(rulesNotificationsAggregateCommand,rulesHelpParent),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-22LMAKCS.js")).default;return inspectFn(client,rawSubcommandArgs)}case"rules":{telemetry2.trackCliSubcommandRules(getRulesTelemetryAction(args));let rulesFn=(await import("./chunks/rules-5ECWTZPP.js")).default;return rulesFn(client,rawSubcommandArgs)}default:{telemetry2.trackCliSubcommandLs(subcommandOriginal);let listFn=(await import("./chunks/list-XL4GMICP.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),1}let{args,flags:opts}=parsedArguments,validationResult=validateLsArgs({commandName:"alias ls",args});if(validationResult!==0)return validationResult;let{contextName}=await getScope(client),telemetryClient=new AliasListTelemetryClient({opts:{store:client.telemetryEventStore}}),paginationOptions,formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),1;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)}
|
|
173
173
|
`)}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," ")}
|
|
174
174
|
|
|
175
175
|
`}var import_chalk33=__toESM(require_source(),1),import_ms3=__toESM(require_ms(),1);async function removeAliasById(client,id){return client.fetch(`/now/aliases/${id}`,{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),1}let{args,flags:opts}=parsedArguments,{contextName}=await getScope(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>")}`)}`),1;if(!aliasOrId)return output_manager_default.error(`${getCommandName("alias rm <alias>")} expects one argument`),1;if(!isValidName(aliasOrId))return output_manager_default.error(`The provided argument "${aliasOrId}" is not a valid alias`),1;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}
|
|
@@ -238,7 +238,7 @@ validUntil=${result.validUntil} (${new Date(result.validUntil).toISOString()})
|
|
|
238
238
|
|
|
239
239
|
`)}
|
|
240
240
|
`)}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(arg=>arg!=="--changelog"),parsedArgs;try{parsedArgs=parseArguments(rawArgs,flagsSpecification)}catch(err){return printError(err),1}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"?searchSubcommand:changelogCommand),0;if(!subcommand&&args.length>0)return output_manager_default.error(`Unknown changelog command: ${args[0]}`),printCommandHelp(client,changelogCommand),1;let limit=parsedArgs.flags["--limit"]??DEFAULT_LIMIT;if(!Number.isInteger(limit)||limit<1||limit>MAX_LIMIT)return output_manager_default.error(`--limit must be between 1 and ${MAX_LIMIT}.`),1;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),1;let jsonOutput=formatResult.jsonOutput,query;if(subcommand==="search"&&(telemetry2.trackCliSubcommandSearch(subcommandOriginal),query=args.join(" ").trim(),!query))return output_manager_default.error("Search query is required."),printCommandHelp(client,searchSubcommand),1;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)}
|
|
241
|
-
`),0):items.length===0?(output_manager_default.log(query?"No changelog entries match the query.":"No changelog entries found."),0):(printEntries(items),0):1}var CommentsTelemetryClient=class extends TelemetryClient{trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandInspect(actual){this.trackCliSubcommand({subcommand:"inspect",value:actual})}trackCliSubcommandOpen(actual){this.trackCliSubcommand({subcommand:"open",value:actual})}trackCliSubcommandReply(actual){this.trackCliSubcommand({subcommand:"reply",value:actual})}trackCliSubcommandResolve(actual){this.trackCliSubcommand({subcommand:"resolve",value:actual})}trackCliSubcommandReopen(actual){this.trackCliSubcommand({subcommand:"reopen",value:actual})}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_CONFIG20={list:getCommandAliases(listSubcommand6),inspect:getCommandAliases(inspectSubcommand4),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),1}let{subcommand,subcommandOriginal}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG20),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(inspectSubcommand4)?0:(telemetry2.trackCliSubcommandInspect(subcommandOriginal),(await import("./chunks/inspect-FFSXZNJX.js")).default(client,telemetry2));case"open":return handleHelp(openSubcommand)?0:(telemetry2.trackCliSubcommandOpen(subcommandOriginal),(await import("./chunks/open-A6XQS4I6.js")).default(client,telemetry2));case"reply":return handleHelp(replySubcommand)?0:(telemetry2.trackCliSubcommandReply(subcommandOriginal),(await import("./chunks/reply-YAQS5FVC.js")).default(client,telemetry2));case"resolve":return handleHelp(resolveSubcommand)?0:(telemetry2.trackCliSubcommandResolve(subcommandOriginal),(await import("./chunks/resolve-HANE4JO2.js")).default(client,telemetry2,!0));case"reopen":return handleHelp(reopenSubcommand)?0:(telemetry2.trackCliSubcommandReopen(subcommandOriginal),(await import("./chunks/resolve-HANE4JO2.js")).default(client,telemetry2,!1));case"edit":return handleHelp(editSubcommand)?0:(telemetry2.trackCliSubcommandEdit(subcommandOriginal),(await import("./chunks/edit-QQYOUSYT.js")).default(client,telemetry2));case"delete":return handleHelp(deleteSubcommand)?0:(telemetry2.trackCliSubcommandDelete(subcommandOriginal),(await import("./chunks/delete-7TLDNY3R.js")).default(client,telemetry2));default:{if(needHelp)return telemetry2.trackCliFlagHelp("comments",subcommandOriginal),subcommandOriginal!=="default"?printSubcommandHelp(listSubcommand6):output_manager_default.print(help(commentsCommand,{columns:client.stderr.columns})),0;telemetry2.trackCliSubcommandList(subcommandOriginal);let defaultInvocation=subcommandOriginal==="default";return(await import("./chunks/list-DMNKMHHX.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_chalk53=__toESM(require_source(),1);var CONNEX_REDIRECT_URI="https://connect.vercel.com/callback",ConnexMethodError=class extends Error{},ENDPOINT_IDENTITY_KEYS=new Set(["serverConfig","serverUrl","discoveryServerUrl"]),SECRET_KEY_PATTERN=/secret|password|passwd|token|api[-_]?key|private[-_]?key|credential/i,CHOICE_INDENT=" ";async function fetchConnexServiceInfo(client,service,opts={}){try{return await client.fetch(`/v1/connect/services/${encodeURIComponent(service)}?schemas=true`,opts)}catch(err){if(err.status===404)return;throw err}}function parseConnexParams(values){let params={},warnings=[];for(let raw of values??[]){let separator=raw.indexOf("=");if(separator<=0)throw new ConnexMethodError(`Invalid --param "${raw}". Use --param KEY=VALUE.`);let key=raw.slice(0,separator).trim(),value=raw.slice(separator+1);if(!key)throw new ConnexMethodError(`Invalid --param "${raw}". Use --param KEY=VALUE.`);key in params&&warnings.push(`--param ${key} was passed more than once. Using the last value.`),params[key]=value}return{params,warnings}}function formatMethodOptions(methods){return methods.map(method=>`${method.connectionMethod} (${method.label})`).join(", ")}function formatTargetOptions(targets){return targets.map(target=>`${target.target} (${target.label})`).join(", ")}function createPathBadge(method){if(method.create.managed===!0)return"automatic registration";if(method.create.manual)return"bring your own credentials"}function soleTargetOf(method){return method.targets?.length===1?method.targets[0]:void 0}function renderConnexMarkdown(markdown){return markdown.replace(/\[([^\]]+)\]\(([^)\s]+)\)/g,(_match,text3,url)=>linksToSameTarget(text3,url)?output_manager_default.link(text3,url,{fallback:()=>import_chalk53.default.cyan(url)}):output_manager_default.link(text3,url)).replace(/\*\*([^*]+)\*\*/g,(_match,text3)=>import_chalk53.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_chalk53.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_chalk53.default.cyan(CONNEX_REDIRECT_URI)} as a redirect URI in that app.`),method.docUrl&&method.docUrl!==registerUrl&&lines.push(`Docs: ${import_chalk53.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_chalk53.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?`
|
|
241
|
+
`),0):items.length===0?(output_manager_default.log(query?"No changelog entries match the query.":"No changelog entries found."),0):(printEntries(items),0):1}var CommentsTelemetryClient=class extends TelemetryClient{trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandInspect(actual){this.trackCliSubcommand({subcommand:"inspect",value:actual})}trackCliSubcommandOpen(actual){this.trackCliSubcommand({subcommand:"open",value:actual})}trackCliSubcommandReply(actual){this.trackCliSubcommand({subcommand:"reply",value:actual})}trackCliSubcommandResolve(actual){this.trackCliSubcommand({subcommand:"resolve",value:actual})}trackCliSubcommandReopen(actual){this.trackCliSubcommand({subcommand:"reopen",value:actual})}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_CONFIG20={list:getCommandAliases(listSubcommand6),inspect:getCommandAliases(inspectSubcommand4),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),1}let{subcommand,subcommandOriginal}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG20),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(inspectSubcommand4)?0:(telemetry2.trackCliSubcommandInspect(subcommandOriginal),(await import("./chunks/inspect-XWT4QQRM.js")).default(client,telemetry2));case"open":return handleHelp(openSubcommand)?0:(telemetry2.trackCliSubcommandOpen(subcommandOriginal),(await import("./chunks/open-D53RMFUT.js")).default(client,telemetry2));case"reply":return handleHelp(replySubcommand)?0:(telemetry2.trackCliSubcommandReply(subcommandOriginal),(await import("./chunks/reply-MIJ6C3KT.js")).default(client,telemetry2));case"resolve":return handleHelp(resolveSubcommand)?0:(telemetry2.trackCliSubcommandResolve(subcommandOriginal),(await import("./chunks/resolve-5HPYDKB4.js")).default(client,telemetry2,!0));case"reopen":return handleHelp(reopenSubcommand)?0:(telemetry2.trackCliSubcommandReopen(subcommandOriginal),(await import("./chunks/resolve-5HPYDKB4.js")).default(client,telemetry2,!1));case"edit":return handleHelp(editSubcommand)?0:(telemetry2.trackCliSubcommandEdit(subcommandOriginal),(await import("./chunks/edit-E6AMU6OJ.js")).default(client,telemetry2));case"delete":return handleHelp(deleteSubcommand)?0:(telemetry2.trackCliSubcommandDelete(subcommandOriginal),(await import("./chunks/delete-LGIPH2II.js")).default(client,telemetry2));default:{if(needHelp)return telemetry2.trackCliFlagHelp("comments",subcommandOriginal),subcommandOriginal!=="default"?printSubcommandHelp(listSubcommand6):output_manager_default.print(help(commentsCommand,{columns:client.stderr.columns})),0;telemetry2.trackCliSubcommandList(subcommandOriginal);let defaultInvocation=subcommandOriginal==="default";return(await import("./chunks/list-TXJQFAGW.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_chalk53=__toESM(require_source(),1);var CONNEX_REDIRECT_URI="https://connect.vercel.com/callback",ConnexMethodError=class extends Error{},ENDPOINT_IDENTITY_KEYS=new Set(["serverConfig","serverUrl","discoveryServerUrl"]),SECRET_KEY_PATTERN=/secret|password|passwd|token|api[-_]?key|private[-_]?key|credential/i,CHOICE_INDENT=" ";async function fetchConnexServiceInfo(client,service,opts={}){try{return await client.fetch(`/v1/connect/services/${encodeURIComponent(service)}?schemas=true`,opts)}catch(err){if(err.status===404)return;throw err}}function parseConnexParams(values){let params={},warnings=[];for(let raw of values??[]){let separator=raw.indexOf("=");if(separator<=0)throw new ConnexMethodError(`Invalid --param "${raw}". Use --param KEY=VALUE.`);let key=raw.slice(0,separator).trim(),value=raw.slice(separator+1);if(!key)throw new ConnexMethodError(`Invalid --param "${raw}". Use --param KEY=VALUE.`);key in params&&warnings.push(`--param ${key} was passed more than once. Using the last value.`),params[key]=value}return{params,warnings}}function formatMethodOptions(methods){return methods.map(method=>`${method.connectionMethod} (${method.label})`).join(", ")}function formatTargetOptions(targets){return targets.map(target=>`${target.target} (${target.label})`).join(", ")}function createPathBadge(method){if(method.create.managed===!0)return"automatic registration";if(method.create.manual)return"bring your own credentials"}function soleTargetOf(method){return method.targets?.length===1?method.targets[0]:void 0}function renderConnexMarkdown(markdown){return markdown.replace(/\[([^\]]+)\]\(([^)\s]+)\)/g,(_match,text3,url)=>linksToSameTarget(text3,url)?output_manager_default.link(text3,url,{fallback:()=>import_chalk53.default.cyan(url)}):output_manager_default.link(text3,url)).replace(/\*\*([^*]+)\*\*/g,(_match,text3)=>import_chalk53.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_chalk53.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_chalk53.default.cyan(CONNEX_REDIRECT_URI)} as a redirect URI in that app.`),method.docUrl&&method.docUrl!==registerUrl&&lines.push(`Docs: ${import_chalk53.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_chalk53.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?`
|
|
242
242
|
|
|
243
243
|
Expected --data schema for connection method "${method.connectionMethod}":
|
|
244
244
|
${JSON.stringify(schema,null,2)}`:"";throw new ConnexMethodError(`Connection method "${method.connectionMethod}" needs credentials passed with --data. Pass --data @<path> to read from a file.${hint}`)}return data}async function promptCredential(client,method,opts){let validate=opts.required?value=>value.trim().length>0||`${opts.key} is required.`:void 0;return(isSecretInputKey(method,opts.key)?await client.input.password({message:opts.message,mask:!0,validate}):await client.input.text({message:opts.message,validate})).trim()}function missingCredentialsError(method){let fields=describeCredentialFields(method),withFields=fields?` with: ${fields}`:"";return new ConnexMethodError(`Missing credentials. Provide --data${withFields}. Pass --data @<path> to read from a file.`)}async function resolveConnexConnectionMethod(client,opts){let{methods,targets,connectionMethodFlag,targetFlag}=opts;if(methods.length===0)throw new ConnexMethodError(`"${opts.service}" doesn't publish connection methods.`);let explicitTarget=targetFlag?validateTarget(targetFlag,targets,opts.service):void 0;if(connectionMethodFlag){let method2=methods.find(candidate=>candidate.connectionMethod===connectionMethodFlag);if(!method2)throw new ConnexMethodError(`Unknown connection method "${connectionMethodFlag}" for "${opts.service}". Available: ${formatMethodOptions(methods)}.`);if(explicitTarget&&!servesTarget(method2,explicitTarget))throw new ConnexMethodError(`Connection method "${method2.connectionMethod}" doesn't connect to target "${explicitTarget}".`);return{method:method2,target:explicitTarget??soleTargetOf(method2)}}if(opts.resolvedConnectionMethod){let method2=methods.find(candidate=>candidate.connectionMethod===opts.resolvedConnectionMethod);if(method2&&(!explicitTarget||servesTarget(method2,explicitTarget)))return opts.interactive&&!opts.skipConfirm&&await confirmMethodSelection(client,opts.serviceName,method2),{method:method2,target:explicitTarget??soleTargetOf(method2)}}let width=choiceWidth(client),chosenTarget=explicitTarget;!chosenTarget&&targets&&targets.length>1&&opts.interactive&&(printOptionCatalog(`${opts.serviceName} products:`,targets.map(target2=>({label:target2.label,description:target2.description,docsUrl:target2.docsUrl})),width),chosenTarget=await client.input.select({message:"What do you want to connect to?",choices:targets.map(target2=>({name:choiceLabel(target2.label,width),value:target2.target}))}));let candidates=chosenTarget?methods.filter(method2=>servesTarget(method2,chosenTarget)):methods;if(candidates.length===0)throw new ConnexMethodError(`No connection method for "${opts.service}" connects to target "${chosenTarget}".`);if(candidates.length>1){if(!opts.interactive)throw new ConnexMethodError(`Missing --connection-method. "${opts.service}" supports: ${formatMethodOptions(candidates)}. Re-run with --connection-method <value>.`);printOptionCatalog(`Connection methods for ${opts.serviceName}:`,candidates.map(method3=>({label:method3.label,badge:createPathBadge(method3),description:method3.description,docsUrl:method3.docUrl})),width);let slug=await client.input.select({message:`How do you want to connect to ${opts.serviceName}?`,choices:candidates.map(method3=>({name:choiceLabel(method3.label,width),value:method3.connectionMethod}))}),method2=candidates.find(candidate=>candidate.connectionMethod===slug);if(!method2)throw new ConnexMethodError(`Unknown connection method "${slug}".`);return{method:method2,target:chosenTarget??soleTargetOf(method2)}}let method=candidates[0],target=chosenTarget??soleTargetOf(method);return opts.interactive&&!opts.skipConfirm&&await confirmMethodSelection(client,opts.serviceName,method),{method,target}}async function confirmMethodSelection(client,serviceName,method){let badge=createPathBadge(method),suffix=badge?` (${badge})`:"";if(!await client.input.confirm(`Connect to ${serviceName} with ${method.label}${suffix}?`,!0))throw new ConnexMethodError("Canceled.")}async function collectTemplateParams(client,method,suppliedParams,interactive){let fields=method.templateFields??[];if(fields.length===0){if(Object.keys(suppliedParams).length>0)throw new ConnexMethodError(`Connection method "${method.connectionMethod}" takes no --param values.`);return{}}let known=new Set(fields.map(field=>field.key));for(let key of Object.keys(suppliedParams))if(!known.has(key))throw new ConnexMethodError(`Unknown --param "${key}" for connection method "${method.connectionMethod}". Valid keys: ${fields.map(field=>field.key).join(", ")}.`);let params={};for(let field of fields){let supplied=(suppliedParams[field.key]??"").trim();if(supplied){let problem=templateValueProblem(field,supplied);if(problem)throw new ConnexMethodError(`Invalid --param ${field.key}="${supplied}". ${problem}`);params[field.key]=supplied;continue}if(interactive){let answer=await client.input.text({message:promptMessage(field),default:field.default,validate:value=>{let trimmed=value.trim();return trimmed?templateValueProblem(field,trimmed)??!0:`${field.label} is required.`}});params[field.key]=answer.trim();continue}if(field.default!==void 0){params[field.key]=field.default;continue}throw new ConnexMethodError(`Missing --param ${field.key}=<value> (${describeField(field)}) for connection method "${method.connectionMethod}".`)}return params}function promptMessage(field){let hints=[];return field.placeholder&&hints.push(`e.g. ${field.placeholder}`),field.help&&hints.push(field.help),hints.length>0?`${field.label} ${import_chalk53.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(`
|
|
@@ -641,7 +641,7 @@ ${table3}
|
|
|
641
641
|
`)}function printStaleFlagsTable(flags){let headers=["Flag","Reason"],rows=flags.map(flag=>[import_chalk154.default.bold(flag.slug),formatStaleReason(flag.reason)]),table3=formatTable(headers,["l","l"],[{name:"",rows}]);output_manager_default.print(`
|
|
642
642
|
${table3}
|
|
643
643
|
${formatStaleReasonTypesTable()}
|
|
644
|
-
`)}function formatStaleReasonTypesTable(){return formatTable(["Type","Description"],["l","l"],[{name:"Types",rows:[["Unused","No production deployment references it, and it has no evaluations in the selected period."],["Redundant","All configured and evaluated variants return the production default value."]]}])}function formatStaleAfter(value){let match=/^([1-9][0-9]*)d$/.exec(value);return match?(0,import_pluralize9.default)("day",Number(match[1]),!0):value}function formatStaleReason(reason){switch(reason){case"unused":return"Unused";case"redundant":return"Redundant";default:return reason}}var FlagsInspectTelemetryClient=class extends TelemetryClient{trackCliFlagJson(json){json&&this.trackCliFlag("json")}trackCliArgumentFlag(flag){flag&&this.trackCliArgument({arg:"flag",value:this.redactedValue})}};var import_chalk158=__toESM(require_source(),1);function getFlagDashboardUrl(orgSlug,projectName,flagSlug){return`https://vercel.com/${orgSlug}/${projectName}/flag/${flagSlug}`}function getFlagsDashboardUrl(orgSlug,projectName){return`https://vercel.com/${orgSlug}/${projectName}/flags`}var import_chalk155=__toESM(require_source(),1);var EPOCH_MS_PATTERN=/^\d+$/,ISO_TIMESTAMP_PATTERN=/^(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})T(?<hour>\d{2}):(?<minute>\d{2})(?::(?<second>\d{2})(?:\.(?<fraction>\d{1,3}))?)?(?:Z|[+-]\d{2}:\d{2})?$/,MIN_EPOCH_MS=1e12,MAX_EPOCH_MS=864e13,TIMESTAMP_FORMAT_HELP="Use an ISO 8601 date and time (for example 2026-04-16T09:00:00Z) or epoch milliseconds.",TIMESTAMP_COMPARATOR_HELP="Use after,
|
|
644
|
+
`)}function formatStaleReasonTypesTable(){return formatTable(["Type","Description"],["l","l"],[{name:"Types",rows:[["Unused","No production deployment references it, and it has no evaluations in the selected period."],["Redundant","All configured and evaluated variants return the production default value."]]}])}function formatStaleAfter(value){let match=/^([1-9][0-9]*)d$/.exec(value);return match?(0,import_pluralize9.default)("day",Number(match[1]),!0):value}function formatStaleReason(reason){switch(reason){case"unused":return"Unused";case"redundant":return"Redundant";default:return reason}}var FlagsInspectTelemetryClient=class extends TelemetryClient{trackCliFlagJson(json){json&&this.trackCliFlag("json")}trackCliArgumentFlag(flag){flag&&this.trackCliArgument({arg:"flag",value:this.redactedValue})}};var import_chalk158=__toESM(require_source(),1);function getFlagDashboardUrl(orgSlug,projectName,flagSlug){return`https://vercel.com/${orgSlug}/${projectName}/flag/${flagSlug}`}function getFlagsDashboardUrl(orgSlug,projectName){return`https://vercel.com/${orgSlug}/${projectName}/flags`}var import_chalk155=__toESM(require_source(),1);var EPOCH_MS_PATTERN=/^\d+$/,ISO_TIMESTAMP_PATTERN=/^(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})T(?<hour>\d{2}):(?<minute>\d{2})(?::(?<second>\d{2})(?:\.(?<fraction>\d{1,3}))?)?(?:Z|[+-]\d{2}:\d{2})?$/,MIN_EPOCH_MS=1e12,MAX_EPOCH_MS=864e13,TIMESTAMP_FORMAT_HELP="Use an ISO 8601 date and time (for example 2026-04-16T09:00:00Z) or epoch milliseconds.",TIMESTAMP_COMPARATOR_HELP="Use gt (after), gte (at-or-after), lt (before), or lte (at-or-before). gt and lt are exclusive; use gte or lte for inclusive boundaries.",SUPPORTED_TIMESTAMP_COMPARATORS=new Set(["gt","gte","lt","lte"]);function parseTimestampInput(value){let trimmed=value.trim();if(EPOCH_MS_PATTERN.test(trimmed))return validateTimestampEpochMs(Number(trimmed));let isoMatch=ISO_TIMESTAMP_PATTERN.exec(trimmed);if(isoMatch?.groups){assertValidIsoTimestampParts(trimmed,isoMatch.groups);let parsed=Date.parse(trimmed);if(Number.isFinite(parsed))return acceptTimestampEpochMs(parsed)}throw new Error(`Invalid timestamp "${value}". ${TIMESTAMP_FORMAT_HELP}`)}function assertValidIsoTimestampParts(value,parts){let year=Number(parts.year),month=Number(parts.month),day=Number(parts.day),hour=Number(parts.hour),minute=Number(parts.minute),second=parts.second===void 0?0:Number(parts.second),utcProbe=new Date(Date.UTC(year,month-1,day,hour,minute,second));if(utcProbe.getUTCFullYear()!==year||utcProbe.getUTCMonth()!==month-1||utcProbe.getUTCDate()!==day||utcProbe.getUTCHours()!==hour||utcProbe.getUTCMinutes()!==minute||utcProbe.getUTCSeconds()!==second)throw new Error(`Invalid timestamp "${value}". ${TIMESTAMP_FORMAT_HELP}`)}function validateTimestampEpochMs(value){if(Number.isSafeInteger(value)&&value>=MIN_EPOCH_MS&&value<=MAX_EPOCH_MS)return value;throw new Error(`Invalid timestamp "${value}". Epoch values must be milliseconds, not seconds or years. ${TIMESTAMP_FORMAT_HELP}`)}function acceptTimestampEpochMs(value){if(Number.isSafeInteger(value)&&value>=-MAX_EPOCH_MS&&value<=MAX_EPOCH_MS&&!Number.isNaN(new Date(value).getTime()))return value;throw new Error(`Invalid timestamp "${value}". ${TIMESTAMP_FORMAT_HELP}`)}function formatTimestampValue(value){let date=new Date(value);return Number.isNaN(date.getTime())?String(value):date.toISOString()}function coerceTimestampSegmentData(data,settings,source="stored"){return{...data,rules:data.rules?.map(rule=>coerceTimestampRule(rule,settings,source))}}function coerceTimestampOperations(operations,settings,source="input"){return operations.map(operation=>operation.field!=="rule"||!operation.rule?operation:{...operation,rule:coerceTimestampRule(operation.rule,settings,source)})}function coerceTimestampRule(rule,settings,source){return{...rule,conditions:rule.conditions.map(condition=>coerceTimestampCondition(condition,settings,source))}}function coerceTimestampCondition(condition,settings,source="stored"){if(condition.lhs.type!=="entity")return condition;let attributeType=getFlagAttributeType(settings,condition.lhs.kind,condition.lhs.attribute);if(!isTimestampAttributeType(attributeType))return condition;if(!SUPPORTED_TIMESTAMP_COMPARATORS.has(condition.cmp))throw new Error(`Operator "${condition.cmp}" is not valid for Timestamp attribute ${condition.lhs.kind}.${condition.lhs.attribute}. ${TIMESTAMP_COMPARATOR_HELP}`);return typeof condition.rhs=="string"?{...condition,rhs:parseTimestampInput(condition.rhs)}:typeof condition.rhs=="number"?{...condition,rhs:coerceTimestampEpochNumber(condition.rhs,source)}:condition}function coerceTimestampEpochNumber(value,source){return source==="input"?validateTimestampEpochMs(value):acceptTimestampEpochMs(value)}function formatTimestampRhs(value,attributeType){if(!(typeof value!="number"||!isTimestampAttributeType(attributeType)))return formatTimestampValue(value)}function resolveTargetingLabel(settings,entityKind,attribute,value){if(!settings)return;let entity=settings.entities.find(e2=>e2.kind===entityKind);if(!entity)return;let attr=entity.attributes.find(a=>a.key===attribute);return attr?.labels?attr.labels.find(l=>l.value===value)?.label:void 0}function formatFlagCondition(condition,settings){let lhs;condition.lhs.type==="segment"?lhs="segment":lhs=`${condition.lhs.kind}.${condition.lhs.attribute}`;let attributeType=condition.lhs.type==="entity"?getFlagAttributeType(settings,condition.lhs.kind,condition.lhs.attribute):void 0,cmp=import_chalk155.default.dim(formatFlagConditionComparator(condition.cmp,{...condition.cmpOptions,attributeType}));if(condition.rhs===void 0||condition.rhs===null)return{text:`${lhs} ${cmp}`};if(typeof condition.rhs=="object"){if((condition.rhs.type==="list"||condition.rhs.type==="list/inline")&&Array.isArray(condition.rhs.items)){let items=condition.rhs.items.map(item=>{let itemValue=typeof item=="object"&&item!==null&&"value"in item?String(item.value):String(item);if(condition.lhs.type==="entity"){let label=resolveTargetingLabel(settings,condition.lhs.kind,condition.lhs.attribute,itemValue);return label?`${itemValue} ${import_chalk155.default.gray(label)}`:itemValue}return itemValue});return{text:`${lhs} ${cmp}`,listItems:items}}return{text:`${lhs} ${cmp} ${JSON.stringify(condition.rhs)}`}}let rhs;if(condition.lhs.type==="entity"){let timestampRhs=formatTimestampRhs(condition.rhs,attributeType),label=resolveTargetingLabel(settings,condition.lhs.kind,condition.lhs.attribute,String(condition.rhs)),displayValue2=timestampRhs??String(condition.rhs);rhs=label?`${displayValue2} ${import_chalk155.default.gray(label)}`:displayValue2}else rhs=String(condition.rhs);return{text:`${lhs} ${cmp} ${rhs}`}}var import_chalk157=__toESM(require_source(),1),import_ms15=__toESM(require_ms(),1);var import_chalk156=__toESM(require_source(),1),import_fast_deep_equal=__toESM(require_fast_deep_equal(),1);function formatVariantValue(value){return JSON.stringify(value)}function formatVariantForDisplay(variant){let value=formatVariantValue(variant.value);return variant.label?`${variant.label} (${import_chalk156.default.dim(value)})`:value}function formatVariantListSummary(variant){let value=formatVariantValue(variant.value);return variant.label?`${value}: ${import_chalk156.default.gray(variant.label)}`:value}function formatAvailableVariants(variants){return variants.map(v=>` - ${formatAvailableVariant(v)}`).join(`
|
|
645
645
|
`)}function resolveVariant(input,variants){let byId=variants.find(v=>v.id===input);if(byId)return{variant:byId,error:null};let parsedInput=parseVariantValue(input),byValue=variants.find(v=>valuesMatch(v.value,parsedInput));if(byValue)return{variant:byValue,error:null};let byExactStringValue=variants.find(v=>v.value===input);if(byExactStringValue)return{variant:byExactStringValue,error:null};let availableList=formatAvailableVariants(variants);return{variant:null,error:`Variant "${input}" not found.
|
|
646
646
|
|
|
647
647
|
Available variants:
|
|
@@ -741,7 +741,7 @@ Feature flag segment ${import_chalk181.default.bold(segment.slug)} for ${project
|
|
|
741
741
|
`);let entries=getMembershipEntries(map);if(entries.length===0){output_manager_default.print(` ${import_chalk181.default.dim("-")}
|
|
742
742
|
`);return}for(let entry2 of entries){let note=entry2.note?import_chalk181.default.gray(` (${entry2.note})`):"";output_manager_default.print(` ${import_chalk181.default.dim(`${entry2.entity}.${entry2.attribute}:`)} ${entry2.value}${note}
|
|
743
743
|
`)}}function getMembershipEntries(map){return Object.entries(map).flatMap(([entity,attributes])=>Object.entries(attributes).flatMap(([attribute,values])=>values.map(value=>({entity,attribute,value:value.value,note:value.note}))))}function formatOutcome2(outcome){return outcome.type==="all"?"match all conditions":`match ${outcome.passPromille/10}% by ${outcome.base.kind}.${outcome.base.attribute}`}function formatCondition2(condition,settings){let lhs=condition.lhs.type==="entity"?`${condition.lhs.kind}.${condition.lhs.attribute}`:"segment",attributeType=condition.lhs.type==="entity"?getFlagAttributeType(settings,condition.lhs.kind,condition.lhs.attribute):void 0,rhs=condition.rhs===void 0?"":` ${formatValue(condition.rhs,attributeType)}`;return`${lhs} ${formatFlagConditionComparator(condition.cmp,{attributeType})}${rhs}`}function formatValue(value,attributeType){let timestampRhs=formatTimestampRhs(value,attributeType);return timestampRhs||(typeof value!="object"||value===null?JSON.stringify(value):value.type==="list"||value.type==="list/inline"?value.items.map(item=>JSON.stringify(item.value)).join(", "):value.type==="regex"?`/${value.pattern}/${value.flags}`:JSON.stringify(value))}async function segmentsInspect(client,argv){let telemetryClient=new FlagsSegmentsInspectTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(segmentsInspectSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(err){return printError(err),1}let{args,flags}=parsedArgs,[segmentArg]=args,json=flags["--json"],projectName=getProjectNameFromFlags(flags);if(!segmentArg)return output_manager_default.error("Please provide a segment slug or ID to inspect"),output_manager_default.log(`Example: ${getCommandName("flags segments inspect beta-users")}`),1;telemetryClient.trackCliArgumentSegment(segmentArg),telemetryClient.trackCliOptionProject(projectName),telemetryClient.trackCliFlagJson(json);let link=await getLinkedFlagsProject(client,projectName);if(link.status==="error")return link.exitCode;if(link.status==="not_linked")return output_manager_default.error(`Your codebase isn't linked to a project on Vercel. Pass --project <name>, or run ${getCommandName("link")} to link it.`),1;client.config.currentTeam=link.org.type==="team"?link.org.id:void 0;let{project,org}=link,projectSlugLink=formatProject(org.slug,project.name);try{output_manager_default.spinner("Fetching segment...");let[segment,settings]=await Promise.all([getSegment(client,project.id,segmentArg,!0),getFlagSettings(client,project.id)]);output_manager_default.stopSpinner(),json?client.stdout.write(`${JSON.stringify({segment},null,2)}
|
|
744
|
-
`):printSegmentDetails({segment,projectSlugLink,settings})}catch(err){return output_manager_default.stopSpinner(),printError(err),1}return 0}var import_chalk182=__toESM(require_source(),1);var import_fast_deep_equal7=__toESM(require_fast_deep_equal(),1);import{randomBytes as randomBytes3}from"node:crypto";function parseEntityAttributeSelector(input){let trimmed=input.trim(),separatorIndex=trimmed.indexOf(".");if(separatorIndex<=0||separatorIndex===trimmed.length-1)throw new Error(`Invalid entity attribute "${input}". Use ENTITY.ATTRIBUTE, for example user.signupAt.`);return{kind:trimmed.slice(0,separatorIndex),attribute:trimmed.slice(separatorIndex+1)}}var OPERATOR_ALIASES={"=":"eq","==":"eq",eq:"eq",equals:"eq",equal:"eq","does-not-equal":"!eq","not-equals":"!eq","not-equal":"!eq","!=":"!eq","!eq":"!eq",in:"oneOf",oneof:"oneOf","one-of":"oneOf",oneOf:"oneOf","not-in":"!oneOf","not-one-of":"!oneOf","!oneof":"!oneOf","!oneOf":"!oneOf",containsallof:"containsAllOf","contains-all-of":"containsAllOf",containsAllOf:"containsAllOf",containsanyof:"containsAnyOf","contains-any-of":"containsAnyOf",containsAnyOf:"containsAnyOf",containsnoneof:"containsNoneOf","contains-none-of":"containsNoneOf",containsNoneOf:"containsNoneOf",startswith:"startsWith","starts-with":"startsWith",startsWith:"startsWith",endswith:"endsWith","ends-with":"endsWith",endsWith:"endsWith",contains:"contains","!contains":"!contains","does-not-contain":"!contains",notcontains:"!contains","not-contains":"!contains",notContains:"!contains",exists:"ex",ex:"ex","!exists":"!ex","not-exists":"!ex","!ex":"!ex",gt:"gt",">":"gt",after:"gt",gte:"gte",">=":"gte","on-or-after":"gte",lt:"lt","<":"lt",before:"lt",lte:"lte","<=":"lte","on-or-before":"lte"},LIST_OPERATORS=new Set(FLAG_CONDITION_LIST_COMPARATORS),RHS_OPTIONAL_OPERATORS=new Set(FLAG_CONDITION_RHS_OPTIONAL_COMPARATORS);function shortId(prefix){let alphabet="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",bytes5=randomBytes3(12),id=prefix;for(let i=0;i<bytes5.length;i++)id+=alphabet[bytes5[i]%alphabet.length];return id}function parseSegmentDataInput(input){let value=parseJson(input,"segment data");if(!isRecord2(value))throw new Error("Segment data must be a JSON object");return value}function parseSegmentRuleInput(input,outcome={type:"all"}){let trimmed=input.trim();if(!trimmed)throw new Error("Segment rule cannot be empty");if(trimmed.startsWith("{")){let value=parseJson(trimmed,"segment rule");if(!isRecord2(value))throw new Error("Segment rule JSON must be an object");return value}let conditions=trimmed.split(";").map(part=>part.trim()).filter(Boolean).map(parseSegmentConditionInput);if(conditions.length===0)throw new Error("Segment rule must include at least one condition");return{id:shortId("rule_"),conditions,outcome}}function parseSegmentConditionInput(input){let[field,operator,...valueParts]=input.split(":");if(!field||!operator)throw new Error(`Invalid segment rule "${input}". Use ENTITY.ATTRIBUTE:OPERATOR:VALUE, for example user.email:ends-with:@vercel.com.`);let lhs=parseEntityAttribute(field),cmp=parseComparator(operator),rawValue=valueParts.join(":");if(!rawValue&&!RHS_OPTIONAL_OPERATORS.has(cmp))throw new Error(`Segment rule "${input}" is missing a value`);return{lhs,cmp,...rawValue?{rhs:parseConditionValue(rawValue,cmp)}:{}}}function parseSegmentValueInput(input){let separatorIndex=input.indexOf("=");if(separatorIndex===-1)throw new Error(`Invalid segment value "${input}". Use ENTITY.ATTRIBUTE=VALUE.`);let lhs=input.slice(0,separatorIndex).trim(),rawValue=input.slice(separatorIndex+1).trim();if(!rawValue)throw new Error(`Invalid segment value "${input}". Value cannot be empty.`);let{kind:entity,attribute}=parseEntityAttribute(lhs),{value,note}=splitValueNote(rawValue);return{entity,attribute,value:note?{value,note}:{value}}}function addSegmentValue(data,field,input){let{entity,attribute,value}=parseSegmentValueInput(input),map=data[field]??{},entityValues=map[entity]??{},values=entityValues[attribute]??[];entityValues[attribute]=values.concat(value),map[entity]=entityValues,data[field]=map}function buildSegmentOperations(field,action,inputs){return inputs.map(input=>{let{entity,attribute,value}=parseSegmentValueInput(input);return{action,field,entity,attribute,value}})}function buildSegmentRuleOperations(action,inputs){return inputs.map(input=>buildSegmentRuleOperation(action,input))}function buildSegmentTargetOperations(action,inputs){return inputs.map(input=>parseSegmentTargetOperation(action,input))}function applySegmentOperations(data,operations){let next=normalizeSegmentData({rules:structuredClone(data.rules??[]),include:structuredClone(data.include??{}),exclude:structuredClone(data.exclude??{})});for(let operation of operations){if(operation.field==="rule"){if(operation.action==="add")next.rules=(next.rules??[]).concat(structuredClone(operation.rule));else if(operation.ruleId){let rules3=next.rules??[];if(!rules3.some(rule=>rule.id===operation.ruleId))throw new Error(`Segment rule "${operation.ruleId}" does not exist.`);next.rules=rules3.filter(rule=>rule.id!==operation.ruleId)}else if(operation.rule){let ruleToRemove=operation.rule,rules3=next.rules??[];if(!rules3.some(rule=>segmentRulesEqual(rule,ruleToRemove)))throw new Error("Segment rule does not exist.");next.rules=rules3.filter(rule=>!segmentRulesEqual(rule,ruleToRemove))}continue}if(operation.action==="add"){let map2=next[operation.field]??{},entityValues2=map2[operation.entity]??{},values2=entityValues2[operation.attribute]??[];entityValues2[operation.attribute]=values2.concat(operation.value),map2[operation.entity]=entityValues2,next[operation.field]=map2;continue}let entityValues=next[operation.field]?.[operation.entity],values=entityValues?.[operation.attribute],valueExists=values?.some(value=>value.value===operation.value.value);if(!values||!valueExists)throw new Error(`Segment ${operation.field} value "${operation.entity}.${operation.attribute}=${operation.value.value}" does not exist.`);entityValues[operation.attribute]=values.filter(value=>value.value!==operation.value.value)}return next}function parseSegmentTargetOperation(action,input){let separatorIndex=input.indexOf(":");if(separatorIndex===-1)throw new Error(`Invalid segment operation "${input}". Use include:ENTITY.ATTRIBUTE=VALUE, exclude:ENTITY.ATTRIBUTE=VALUE, or rule:ENTITY.ATTRIBUTE:OPERATOR:VALUE.`);let field=input.slice(0,separatorIndex).trim().toLowerCase(),valueInput=input.slice(separatorIndex+1).trim();if(!valueInput)throw new Error(`Invalid segment operation "${input}". Target is empty.`);if(field==="include"||field==="exclude"){let{entity,attribute,value}=parseSegmentValueInput(valueInput);return{action,field,entity,attribute,value}}if(field==="rule"||field==="rules")return buildSegmentRuleOperation(action,valueInput);throw new Error(`Invalid segment operation target "${field}". Use include, exclude, or rule.`)}function buildSegmentRuleOperation(action,input){if(action==="remove"&&isRuleIdInput(input))return{action,field:"rule",ruleId:input.trim()};let rule=parseSegmentRuleInput(input);return action==="add"?{action,field:"rule",rule}:{action,field:"rule",rule}}function normalizeSegmentData(data){return{rules:data.rules??[],include:data.include??{},exclude:data.exclude??{}}}function segmentRulesEqual(a,b){return(0,import_fast_deep_equal7.default)(getComparableRule(a),getComparableRule(b))}function getComparableRule(rule){return{conditions:rule.conditions,outcome:rule.outcome}}function isRuleIdInput(input){let trimmed=input.trim();return!trimmed.startsWith("{")&&!trimmed.includes(":")&&!trimmed.includes(".")}function parseComparator(input,ruleLabel="segment rule"){let normalized=input.trim(),lowercase=normalized.toLowerCase(),comparator=OPERATOR_ALIASES[normalized]??OPERATOR_ALIASES[lowercase];if(!comparator)throw new Error(`Invalid ${ruleLabel} operator "${input}". Valid operators: ${formatFlagConditionComparatorList()}.`);return comparator}function parseEntityAttribute(input){let{kind,attribute}=parseEntityAttributeSelector(input);return{type:"entity",kind,attribute}}function parseConditionValue(input,comparator){let trimmed=input.trim();return LIST_OPERATORS.has(comparator)?{type:"list",items:trimmed.split(",").map(value=>value.trim()).filter(Boolean).map(value=>({value:parseListItemValue(value)}))}:parseScalarValue(trimmed)}function parseScalarValue(value){return value==="true"?!0:value==="false"?!1:value!==""&&Number.isFinite(Number(value))?Number(value):value}function parseListItemValue(value){return value!==""&&Number.isFinite(Number(value))?Number(value):value}function splitValueNote(input){let separatorIndex=input.indexOf("|");if(separatorIndex===-1)return{value:input};let value=input.slice(0,separatorIndex).trim(),note=input.slice(separatorIndex+1).trim();return note?{value,note}:{value}}function parseJson(input,label){try{return JSON.parse(input)}catch{throw new Error(`Invalid JSON for ${label}`)}}function isRecord2(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)}async function segmentsCreate(client,argv){let telemetryClient=new FlagsSegmentsCreateTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(segmentsCreateSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(err){return printError(err),1}let{args,flags}=parsedArgs,[slug]=args,label=flags["--label"],description=flags["--description"],hint=flags["--hint"],dataInput=flags["--data"],addInputs=flags["--add"]??[],json=flags["--json"],projectName=getProjectNameFromFlags(flags);if(telemetryClient.trackCliArgumentSlug(slug),telemetryClient.trackCliOptionProject(projectName),telemetryClient.trackCliOptionLabel(label),telemetryClient.trackCliOptionDescription(description),telemetryClient.trackCliOptionHint(hint),telemetryClient.trackCliOptionData(dataInput),telemetryClient.trackCliOptionAdd(addInputs),telemetryClient.trackCliFlagJson(json),!slug)return client.nonInteractive?(outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.MISSING_ARGUMENTS,message:"Please provide a segment slug to create.",next:[{command:buildCommandWithGlobalFlags(client.argv,"flags segments create <slug> --label <label> --add include:user.id=<value>"),when:"create a segment with explicit values"}]},1),1):(output_manager_default.error("Please provide a slug for the segment"),output_manager_default.log(`Example: ${getCommandName('flags segments create beta-users --label "Beta users" --add include:user.id=user_123')}`),1);let link=await getLinkedFlagsProject(client,projectName);if(link.status==="error")return link.exitCode;if(link.status==="not_linked")return client.nonInteractive?(outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.NOT_LINKED,message:"Your codebase is not linked to a project. Run link first.",next:[{command:buildCommandWithGlobalFlags(client.argv,"link"),when:"link the project"}]},1),1):(output_manager_default.error(`Your codebase isn't linked to a project on Vercel. Pass --project <name>, or run ${getCommandName("link")} to link it.`),1);client.config.currentTeam=link.org.type==="team"?link.org.id:void 0;let{project,org}=link,projectSlugLink=formatProject(org.slug,project.name);label=await resolveSegmentLabel(client,label,slug),hint=await resolveSegmentHint(client,hint,description,label);let data,settings;try{settings=await getFlagSettings(client,project.id),data=coerceTimestampSegmentData(await collectSegmentData(client,{dataInput,addInputs}),settings,"input")}catch(err){return output_manager_default.error(err.message),1}let request2={slug,label,description,data,hint};try{output_manager_default.spinner("Creating segment...");let segment=await createSegment(client,project.id,request2);if(output_manager_default.stopSpinner(),json)return client.stdout.write(`${JSON.stringify({segment},null,2)}
|
|
744
|
+
`):printSegmentDetails({segment,projectSlugLink,settings})}catch(err){return output_manager_default.stopSpinner(),printError(err),1}return 0}var import_chalk182=__toESM(require_source(),1);var import_fast_deep_equal7=__toESM(require_fast_deep_equal(),1);import{randomBytes as randomBytes3}from"node:crypto";function parseEntityAttributeSelector(input){let trimmed=input.trim(),separatorIndex=trimmed.indexOf(".");if(separatorIndex<=0||separatorIndex===trimmed.length-1)throw new Error(`Invalid entity attribute "${input}". Use ENTITY.ATTRIBUTE, for example user.signupAt.`);return{kind:trimmed.slice(0,separatorIndex),attribute:trimmed.slice(separatorIndex+1)}}var OPERATOR_ALIASES={"=":"eq","==":"eq",eq:"eq",equals:"eq",equal:"eq","does-not-equal":"!eq","not-equals":"!eq","not-equal":"!eq","!=":"!eq","!eq":"!eq",in:"oneOf",oneof:"oneOf","one-of":"oneOf",oneOf:"oneOf","not-in":"!oneOf","not-one-of":"!oneOf","!oneof":"!oneOf","!oneOf":"!oneOf",containsallof:"containsAllOf","contains-all-of":"containsAllOf",containsAllOf:"containsAllOf",containsanyof:"containsAnyOf","contains-any-of":"containsAnyOf",containsAnyOf:"containsAnyOf",containsnoneof:"containsNoneOf","contains-none-of":"containsNoneOf",containsNoneOf:"containsNoneOf",startswith:"startsWith","starts-with":"startsWith",startsWith:"startsWith",endswith:"endsWith","ends-with":"endsWith",endsWith:"endsWith",contains:"contains","!contains":"!contains","does-not-contain":"!contains",notcontains:"!contains","not-contains":"!contains",notContains:"!contains",exists:"ex",ex:"ex","!exists":"!ex","not-exists":"!ex","!ex":"!ex",gt:"gt",">":"gt",after:"gt",gte:"gte",">=":"gte","at-or-after":"gte","on-or-after":"gte",lt:"lt","<":"lt",before:"lt",lte:"lte","<=":"lte","at-or-before":"lte","on-or-before":"lte"},LIST_OPERATORS=new Set(FLAG_CONDITION_LIST_COMPARATORS),RHS_OPTIONAL_OPERATORS=new Set(FLAG_CONDITION_RHS_OPTIONAL_COMPARATORS);function shortId(prefix){let alphabet="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",bytes5=randomBytes3(12),id=prefix;for(let i=0;i<bytes5.length;i++)id+=alphabet[bytes5[i]%alphabet.length];return id}function parseSegmentDataInput(input){let value=parseJson(input,"segment data");if(!isRecord2(value))throw new Error("Segment data must be a JSON object");return value}function parseSegmentRuleInput(input,outcome={type:"all"}){let trimmed=input.trim();if(!trimmed)throw new Error("Segment rule cannot be empty");if(trimmed.startsWith("{")){let value=parseJson(trimmed,"segment rule");if(!isRecord2(value))throw new Error("Segment rule JSON must be an object");return value}let conditions=trimmed.split(";").map(part=>part.trim()).filter(Boolean).map(parseSegmentConditionInput);if(conditions.length===0)throw new Error("Segment rule must include at least one condition");return{id:shortId("rule_"),conditions,outcome}}function parseSegmentConditionInput(input){let[field,operator,...valueParts]=input.split(":");if(!field||!operator)throw new Error(`Invalid segment rule "${input}". Use ENTITY.ATTRIBUTE:OPERATOR:VALUE, for example user.email:ends-with:@vercel.com.`);let lhs=parseEntityAttribute(field),cmp=parseComparator(operator),rawValue=valueParts.join(":");if(!rawValue&&!RHS_OPTIONAL_OPERATORS.has(cmp))throw new Error(`Segment rule "${input}" is missing a value`);return{lhs,cmp,...rawValue?{rhs:parseConditionValue(rawValue,cmp)}:{}}}function parseSegmentValueInput(input){let separatorIndex=input.indexOf("=");if(separatorIndex===-1)throw new Error(`Invalid segment value "${input}". Use ENTITY.ATTRIBUTE=VALUE.`);let lhs=input.slice(0,separatorIndex).trim(),rawValue=input.slice(separatorIndex+1).trim();if(!rawValue)throw new Error(`Invalid segment value "${input}". Value cannot be empty.`);let{kind:entity,attribute}=parseEntityAttribute(lhs),{value,note}=splitValueNote(rawValue);return{entity,attribute,value:note?{value,note}:{value}}}function addSegmentValue(data,field,input){let{entity,attribute,value}=parseSegmentValueInput(input),map=data[field]??{},entityValues=map[entity]??{},values=entityValues[attribute]??[];entityValues[attribute]=values.concat(value),map[entity]=entityValues,data[field]=map}function buildSegmentOperations(field,action,inputs){return inputs.map(input=>{let{entity,attribute,value}=parseSegmentValueInput(input);return{action,field,entity,attribute,value}})}function buildSegmentRuleOperations(action,inputs){return inputs.map(input=>buildSegmentRuleOperation(action,input))}function buildSegmentTargetOperations(action,inputs){return inputs.map(input=>parseSegmentTargetOperation(action,input))}function applySegmentOperations(data,operations){let next=normalizeSegmentData({rules:structuredClone(data.rules??[]),include:structuredClone(data.include??{}),exclude:structuredClone(data.exclude??{})});for(let operation of operations){if(operation.field==="rule"){if(operation.action==="add")next.rules=(next.rules??[]).concat(structuredClone(operation.rule));else if(operation.ruleId){let rules3=next.rules??[];if(!rules3.some(rule=>rule.id===operation.ruleId))throw new Error(`Segment rule "${operation.ruleId}" does not exist.`);next.rules=rules3.filter(rule=>rule.id!==operation.ruleId)}else if(operation.rule){let ruleToRemove=operation.rule,rules3=next.rules??[];if(!rules3.some(rule=>segmentRulesEqual(rule,ruleToRemove)))throw new Error("Segment rule does not exist.");next.rules=rules3.filter(rule=>!segmentRulesEqual(rule,ruleToRemove))}continue}if(operation.action==="add"){let map2=next[operation.field]??{},entityValues2=map2[operation.entity]??{},values2=entityValues2[operation.attribute]??[];entityValues2[operation.attribute]=values2.concat(operation.value),map2[operation.entity]=entityValues2,next[operation.field]=map2;continue}let entityValues=next[operation.field]?.[operation.entity],values=entityValues?.[operation.attribute],valueExists=values?.some(value=>value.value===operation.value.value);if(!values||!valueExists)throw new Error(`Segment ${operation.field} value "${operation.entity}.${operation.attribute}=${operation.value.value}" does not exist.`);entityValues[operation.attribute]=values.filter(value=>value.value!==operation.value.value)}return next}function parseSegmentTargetOperation(action,input){let separatorIndex=input.indexOf(":");if(separatorIndex===-1)throw new Error(`Invalid segment operation "${input}". Use include:ENTITY.ATTRIBUTE=VALUE, exclude:ENTITY.ATTRIBUTE=VALUE, or rule:ENTITY.ATTRIBUTE:OPERATOR:VALUE.`);let field=input.slice(0,separatorIndex).trim().toLowerCase(),valueInput=input.slice(separatorIndex+1).trim();if(!valueInput)throw new Error(`Invalid segment operation "${input}". Target is empty.`);if(field==="include"||field==="exclude"){let{entity,attribute,value}=parseSegmentValueInput(valueInput);return{action,field,entity,attribute,value}}if(field==="rule"||field==="rules")return buildSegmentRuleOperation(action,valueInput);throw new Error(`Invalid segment operation target "${field}". Use include, exclude, or rule.`)}function buildSegmentRuleOperation(action,input){if(action==="remove"&&isRuleIdInput(input))return{action,field:"rule",ruleId:input.trim()};let rule=parseSegmentRuleInput(input);return action==="add"?{action,field:"rule",rule}:{action,field:"rule",rule}}function normalizeSegmentData(data){return{rules:data.rules??[],include:data.include??{},exclude:data.exclude??{}}}function segmentRulesEqual(a,b){return(0,import_fast_deep_equal7.default)(getComparableRule(a),getComparableRule(b))}function getComparableRule(rule){return{conditions:rule.conditions,outcome:rule.outcome}}function isRuleIdInput(input){let trimmed=input.trim();return!trimmed.startsWith("{")&&!trimmed.includes(":")&&!trimmed.includes(".")}function parseComparator(input,ruleLabel="segment rule"){let normalized=input.trim(),lowercase=normalized.toLowerCase(),comparator=OPERATOR_ALIASES[normalized]??OPERATOR_ALIASES[lowercase];if(!comparator)throw new Error(`Invalid ${ruleLabel} operator "${input}". Valid operators: ${formatFlagConditionComparatorList()}.`);return comparator}function parseEntityAttribute(input){let{kind,attribute}=parseEntityAttributeSelector(input);return{type:"entity",kind,attribute}}function parseConditionValue(input,comparator){let trimmed=input.trim();return LIST_OPERATORS.has(comparator)?{type:"list",items:trimmed.split(",").map(value=>value.trim()).filter(Boolean).map(value=>({value:parseListItemValue(value)}))}:parseScalarValue(trimmed)}function parseScalarValue(value){return value==="true"?!0:value==="false"?!1:value!==""&&Number.isFinite(Number(value))?Number(value):value}function parseListItemValue(value){return value!==""&&Number.isFinite(Number(value))?Number(value):value}function splitValueNote(input){let separatorIndex=input.indexOf("|");if(separatorIndex===-1)return{value:input};let value=input.slice(0,separatorIndex).trim(),note=input.slice(separatorIndex+1).trim();return note?{value,note}:{value}}function parseJson(input,label){try{return JSON.parse(input)}catch{throw new Error(`Invalid JSON for ${label}`)}}function isRecord2(value){return typeof value=="object"&&value!==null&&!Array.isArray(value)}async function segmentsCreate(client,argv){let telemetryClient=new FlagsSegmentsCreateTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(segmentsCreateSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(err){return printError(err),1}let{args,flags}=parsedArgs,[slug]=args,label=flags["--label"],description=flags["--description"],hint=flags["--hint"],dataInput=flags["--data"],addInputs=flags["--add"]??[],json=flags["--json"],projectName=getProjectNameFromFlags(flags);if(telemetryClient.trackCliArgumentSlug(slug),telemetryClient.trackCliOptionProject(projectName),telemetryClient.trackCliOptionLabel(label),telemetryClient.trackCliOptionDescription(description),telemetryClient.trackCliOptionHint(hint),telemetryClient.trackCliOptionData(dataInput),telemetryClient.trackCliOptionAdd(addInputs),telemetryClient.trackCliFlagJson(json),!slug)return client.nonInteractive?(outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.MISSING_ARGUMENTS,message:"Please provide a segment slug to create.",next:[{command:buildCommandWithGlobalFlags(client.argv,"flags segments create <slug> --label <label> --add include:user.id=<value>"),when:"create a segment with explicit values"}]},1),1):(output_manager_default.error("Please provide a slug for the segment"),output_manager_default.log(`Example: ${getCommandName('flags segments create beta-users --label "Beta users" --add include:user.id=user_123')}`),1);let link=await getLinkedFlagsProject(client,projectName);if(link.status==="error")return link.exitCode;if(link.status==="not_linked")return client.nonInteractive?(outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.NOT_LINKED,message:"Your codebase is not linked to a project. Run link first.",next:[{command:buildCommandWithGlobalFlags(client.argv,"link"),when:"link the project"}]},1),1):(output_manager_default.error(`Your codebase isn't linked to a project on Vercel. Pass --project <name>, or run ${getCommandName("link")} to link it.`),1);client.config.currentTeam=link.org.type==="team"?link.org.id:void 0;let{project,org}=link,projectSlugLink=formatProject(org.slug,project.name);label=await resolveSegmentLabel(client,label,slug),hint=await resolveSegmentHint(client,hint,description,label);let data,settings;try{settings=await getFlagSettings(client,project.id),data=coerceTimestampSegmentData(await collectSegmentData(client,{dataInput,addInputs}),settings,"input")}catch(err){return output_manager_default.error(err.message),1}let request2={slug,label,description,data,hint};try{output_manager_default.spinner("Creating segment...");let segment=await createSegment(client,project.id,request2);if(output_manager_default.stopSpinner(),json)return client.stdout.write(`${JSON.stringify({segment},null,2)}
|
|
745
745
|
`),0;output_manager_default.success(`Feature flag segment ${import_chalk182.default.bold(segment.slug)} created`),printSegmentDetails({segment,projectSlugLink,showTimestamps:!1,settings})}catch(err){return output_manager_default.stopSpinner(),printError(err),1}return 0}async function resolveSegmentLabel(client,label,slug){let defaultLabel=humanizeSlug(slug);return label||client.stdin.isTTY&&!client.nonInteractive&&(await client.input.text({message:`Enter a label for this segment (press Enter for "${defaultLabel}"):`})).trim()||defaultLabel}async function resolveSegmentHint(client,hint,description,label){return hint||(client.stdin.isTTY&&!client.nonInteractive?(await client.input.text({message:`Enter a hint for who belongs in this segment (press Enter for "${description||label}"):`})).trim()||description||label:description||label)}async function collectSegmentData(client,input){let hasExplicitData=!!input.dataInput,data=hasExplicitData?parseSegmentDataInput(input.dataInput):normalizeSegmentData({}),operations=buildSegmentTargetOperations("add",input.addInputs),nextData=operations.length>0?applySegmentOperations(data,operations):data;return!hasExplicitData&&input.addInputs.length===0&&client.stdin.isTTY&&!client.nonInteractive&&await collectSegmentDataInteractively(client,nextData),normalizeSegmentData(nextData)}async function collectSegmentDataInteractively(client,data){let addAnother=await client.input.confirm("Add segment criteria now?",!0);for(;addAnother;){let kind=await client.input.select({message:"What do you want to add?",choices:[{name:"Include an exact entity value",value:"include"},{name:"Exclude an exact entity value",value:"exclude"},{name:"Add a rule",value:"rule"}]});if(kind==="rule"){let rule=await client.input.text({message:"Enter rule as ENTITY.ATTRIBUTE:OPERATOR:VALUE (for example user.email:ends-with:@vercel.com):"});data.rules=(data.rules??[]).concat(parseSegmentRuleInput(rule))}else{let value=await client.input.text({message:`Enter ${kind} value as ENTITY.ATTRIBUTE=VALUE:`});addSegmentValue(data,kind,value)}addAnother=await client.input.confirm("Add another criterion?",!1)}}function humanizeSlug(slug){return slug.split(/[-_\s]+/).filter(Boolean).map(word=>word.charAt(0).toUpperCase()+word.slice(1)).join(" ")}var import_chalk183=__toESM(require_source(),1);async function segmentsUpdate(client,argv){let telemetryClient=new FlagsSegmentsUpdateTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(segmentsUpdateSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(err){return printError(err),1}let{args,flags}=parsedArgs,segmentArg=args[0],label=flags["--label"],description=flags["--description"],hint=flags["--hint"],dataInput=flags["--data"],addInputs=flags["--add"]??[],removeInputs=flags["--remove"]??[],json=flags["--json"],projectName=getProjectNameFromFlags(flags);telemetryClient.trackCliArgumentSegment(segmentArg),telemetryClient.trackCliOptionProject(projectName),telemetryClient.trackCliOptionLabel(label),telemetryClient.trackCliOptionDescription(description),telemetryClient.trackCliOptionHint(hint),telemetryClient.trackCliOptionData(dataInput),telemetryClient.trackCliOptionAdd(addInputs),telemetryClient.trackCliOptionRemove(removeInputs),telemetryClient.trackCliFlagJson(json);let link=await getLinkedFlagsProject(client,projectName);if(link.status==="error")return link.exitCode;if(link.status==="not_linked")return client.nonInteractive?(outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.NOT_LINKED,message:"Your codebase is not linked to a project. Run link first.",next:[{command:buildCommandWithGlobalFlags(client.argv,"link"),when:"link the project"}]},1),1):(output_manager_default.error(`Your codebase isn't linked to a project on Vercel. Pass --project <name>, or run ${getCommandName("link")} to link it.`),1);client.config.currentTeam=link.org.type==="team"?link.org.id:void 0;let{project,org}=link,projectSlugLink=formatProject(org.slug,project.name);try{if(!segmentArg&&(segmentArg=await resolveSegmentArg(client,project.id),!segmentArg))return 1;let settings=await getFlagSettings(client,project.id),operations=coerceTimestampOperations(buildOperations({addInputs,removeInputs}),settings),hasChanges=label!==void 0||description!==void 0||hint!==void 0||!!dataInput||operations.length>0,request2;if(!hasChanges&&client.stdin.isTTY&&!client.nonInteractive){output_manager_default.spinner("Fetching segment...");let segment2=await getSegment(client,project.id,segmentArg,!0);output_manager_default.stopSpinner(),request2=await collectUpdateInteractively(client,segment2,settings)}else request2=await buildUpdateRequest(client,project.id,segmentArg,{label,description,hint,dataInput,operations,settings});if(request2=coerceTimestampUpdateRequest(request2,settings),!hasUpdateRequestChanges(request2))return client.nonInteractive?(outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.MISSING_ARGUMENTS,message:"Please provide at least one segment update option, such as --label, --data, --add, or --remove.",next:[{command:buildCommandWithGlobalFlags(client.argv,"flags segments update <segment> --add include:user.id=<value>"),when:"add a value to a segment"},{command:buildCommandWithGlobalFlags(client.argv,"flags segments update <segment> --remove include:user.id=<value>"),when:"remove a value from a segment"},{command:buildCommandWithGlobalFlags(client.argv,"flags segments inspect <segment> --json"),when:"inspect the current segment data first"}]},1),1):(output_manager_default.warn("No segment changes were provided"),0);output_manager_default.spinner("Updating segment...");let segment=await updateSegment(client,project.id,segmentArg,request2);if(output_manager_default.stopSpinner(),json)return client.stdout.write(`${JSON.stringify({segment},null,2)}
|
|
746
746
|
`),0;output_manager_default.success(`Feature flag segment ${import_chalk183.default.bold(segment.slug)} updated`),printSegmentDetails({segment,projectSlugLink,showTimestamps:!1,settings})}catch(err){return output_manager_default.stopSpinner(),printError(err),1}return 0}async function resolveSegmentArg(client,projectId){if(client.nonInteractive){outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.MISSING_ARGUMENTS,message:"Please provide a segment slug or ID. Run `vercel flags segments ls` to list segments.",next:[{command:buildCommandWithGlobalFlags(client.argv,"flags segments update <segment> --add include:user.id=<value>"),when:"update a segment by slug or ID"},{command:buildCommandWithGlobalFlags(client.argv,"flags segments ls"),when:"list segments to find the slug or ID"}]},1);return}if(!client.stdin.isTTY){output_manager_default.error("Please provide a segment slug or ID to update"),output_manager_default.log(`Example: ${getCommandName("flags segments update beta-users --add include:user.id=user_123")}`);return}output_manager_default.spinner("Fetching segments...");let segments2=await getSegments(client,projectId,!0);if(output_manager_default.stopSpinner(),segments2.length===0){output_manager_default.error("No feature flag segments found"),output_manager_default.log(`Create one with: ${getCommandName('flags segments create beta-users --label "Beta users" --add include:user.id=user_123')}`);return}return client.input.select({message:"Select a segment to update:",choices:segments2.map(segment=>({name:`${segment.label} (${segment.slug})`,value:segment.slug}))})}async function buildUpdateRequest(client,projectId,segmentArg,input){let request2={};if(input.label!==void 0&&(request2.label=input.label),input.description!==void 0&&(request2.description=input.description),input.hint!==void 0&&(request2.hint=input.hint),input.dataInput&&(request2.data=coerceTimestampSegmentData(parseSegmentDataInput(input.dataInput),input.settings,"input")),request2.data)request2.data=applySegmentOperations(request2.data,input.operations);else if(hasRuleOperations(input.operations)){output_manager_default.spinner("Fetching segment...");let segment=await getSegment(client,projectId,segmentArg,!0);output_manager_default.stopSpinner(),request2.data=applySegmentOperations(segment.data,input.operations)}else if(input.operations.length>0){if(hasRemoveOperations(input.operations)){output_manager_default.spinner("Fetching segment...");let segment=await getSegment(client,projectId,segmentArg,!0);output_manager_default.stopSpinner(),applySegmentOperations(segment.data,input.operations)}request2.operations=input.operations.filter(isMembershipOperation)}return request2}function buildOperations(input){return[...buildSegmentTargetOperations("add",input.addInputs),...buildSegmentTargetOperations("remove",input.removeInputs)]}function hasRuleOperations(operations){return operations.some(operation=>operation.field==="rule")}function hasRemoveOperations(operations){return operations.some(operation=>operation.action==="remove")}function isMembershipOperation(operation){return operation.field==="include"||operation.field==="exclude"}async function collectUpdateInteractively(client,segment,settings){let request2={},data,replacingRules=!1,operations=[],keepEditing=!0;for(;keepEditing;){let action=await client.input.select({message:"What do you want to update?",choices:[{name:"Label",value:"label"},{name:"Description",value:"description"},{name:"Hint",value:"hint"},{name:"Add rule",value:"add-rule"},{name:"Remove rule",value:"remove-rule"},{name:"Replace all rules",value:"replace-rules"},{name:"Add include value",value:"include"},{name:"Add exclude value",value:"exclude"},{name:"Remove include value",value:"remove-include"},{name:"Remove exclude value",value:"remove-exclude"},{name:"Replace full data JSON",value:"data"},{name:"Done",value:"done"}]});switch(action){case"label":request2.label=await client.input.text({message:`Enter a new label (current: ${segment.label}):`});break;case"description":request2.description=await client.input.text({message:"Enter a new description:"});break;case"hint":request2.hint=await client.input.text({message:`Enter a new hint (current: ${segment.hint}):`});break;case"add-rule":{let rule=await client.input.text({message:"Enter rule as ENTITY.ATTRIBUTE:OPERATOR:VALUE:"});operations.push(...buildSegmentRuleOperations("add",[rule]));break}case"remove-rule":{let rule=await client.input.text({message:"Enter rule as ENTITY.ATTRIBUTE:OPERATOR:VALUE or rule ID:"});operations.push(...buildSegmentRuleOperations("remove",[rule]));break}case"replace-rules":{let rule=await client.input.text({message:"Enter rule as ENTITY.ATTRIBUTE:OPERATOR:VALUE (repeat by choosing this again):"});replacingRules||(data=normalizeSegmentData({...segment.data,rules:[]}),replacingRules=!0),data=normalizeSegmentData(data??segment.data);let[coercedRule]=coerceTimestampSegmentData({rules:[parseSegmentRuleInput(rule)]},settings,"input").rules;data.rules=(data.rules??[]).concat(coercedRule);break}case"include":case"exclude":case"remove-include":case"remove-exclude":{let value=await client.input.text({message:"Enter value as ENTITY.ATTRIBUTE=VALUE:"});operations.push(...buildSegmentOperations(action.includes("include")?"include":"exclude",action.startsWith("remove")?"remove":"add",[value]));break}case"data":{let value=await client.input.text({message:"Enter full segment data JSON:"});data=coerceTimestampSegmentData(parseSegmentDataInput(value),settings,"input");break}case"done":keepEditing=!1;break}keepEditing&&(keepEditing=await client.input.confirm("Make another change?",!1))}let coercedOperations=coerceTimestampOperations(operations,settings,"input");return data?request2.data=applySegmentOperations(data,coercedOperations):hasRuleOperations(coercedOperations)?request2.data=applySegmentOperations(segment.data,coercedOperations):coercedOperations.length>0&&(request2.operations=coercedOperations.filter(isMembershipOperation)),request2}function hasUpdateRequestChanges(request2){return request2.label!==void 0||request2.description!==void 0||request2.hint!==void 0||request2.data!==void 0||!!request2.operations?.length}function coerceTimestampUpdateRequest(request2,settings){return request2.data?{...request2,data:coerceTimestampSegmentData(request2.data,settings)}:request2}var import_chalk184=__toESM(require_source(),1);async function segmentsRm(client,argv){let telemetryClient=new FlagsSegmentsRmTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(segmentsRemoveSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(err){return printError(err),1}let{args,flags}=parsedArgs,segmentArg=args[0],skipConfirmation=flags["--yes"],projectName=getProjectNameFromFlags(flags);telemetryClient.trackCliArgumentSegment(segmentArg),telemetryClient.trackCliOptionProject(projectName),telemetryClient.trackCliFlagYes(skipConfirmation);let link=await getLinkedFlagsProject(client,projectName);if(link.status==="error")return link.exitCode;if(link.status==="not_linked")return client.nonInteractive?(outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.NOT_LINKED,message:"Your codebase is not linked to a project. Run link first.",next:[{command:buildCommandWithGlobalFlags(client.argv,"link"),when:"link the project"}]},1),1):(output_manager_default.error(`Your codebase isn't linked to a project on Vercel. Pass --project <name>, or run ${getCommandName("link")} to link it.`),1);client.config.currentTeam=link.org.type==="team"?link.org.id:void 0;let{project}=link;try{if(!segmentArg&&(segmentArg=await resolveSegmentArg2(client,project.id),!segmentArg))return 1;output_manager_default.spinner("Fetching segment...");let segment=await getSegment(client,project.id,segmentArg,!1);if(output_manager_default.stopSpinner(),!skipConfirmation){if(!client.stdin.isTTY)return output_manager_default.error("Missing required flag --yes. Use --yes to skip the confirmation prompt in non-interactive mode."),1;if(client.nonInteractive)return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.CONFIRMATION_REQUIRED,message:`Confirm deletion of segment ${segment.slug} by adding --yes.`,next:[{command:buildCommandWithGlobalFlags(client.argv,`flags segments rm ${segmentArg} --yes`),when:"confirm and delete the segment"}]},1),1;if(!await client.input.confirm(`Are you sure you want to delete segment ${import_chalk184.default.bold(segment.slug)}?`,!1))return output_manager_default.log("Aborted"),0}output_manager_default.spinner("Deleting segment..."),await deleteSegment(client,project.id,segmentArg),output_manager_default.stopSpinner(),output_manager_default.success(`Feature flag segment ${import_chalk184.default.bold(segment.slug)} deleted`)}catch(err){return output_manager_default.stopSpinner(),handleSegmentInUseError(client,err,segmentArg)||printError(err),1}return 0}function handleSegmentInUseError(client,error,segmentArg){if(!isAPIError(error)||error.code!=="SEGMENT_IN_USE")return!1;let usedBy=error.usedBy,flags=usedBy?.flags??[],segments2=usedBy?.segments??[],segment=segmentArg??"<segment>",formatReferences=references=>references.map(reference=>{let primary=reference.name??reference.label??reference.slug??reference.id;return primary&&reference.slug&&reference.slug!==primary?`${primary} (${reference.slug})`:primary??"Unknown reference"}).join(", "),firstFlag=flags.find(reference=>reference.slug||reference.id),firstSegment=segments2.find(reference=>reference.slug||reference.id),inspectSubcommand15=firstFlag!==void 0?`flags inspect ${firstFlag.slug??firstFlag.id}`:firstSegment!==void 0?`flags segments inspect ${firstSegment.slug??firstSegment.id}`:void 0,lines=[`Segment ${segment} is still in use and can't be deleted.`];flags.length>0&&lines.push(`Used by feature flags: ${formatReferences(flags)}`),segments2.length>0&&lines.push(`Used by segments: ${formatReferences(segments2)}`);let message=lines.join(`
|
|
747
747
|
`);return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.SEGMENT_IN_USE,message,next:[...inspectSubcommand15?[{command:buildCommandWithGlobalFlags(client.argv,inspectSubcommand15),when:"inspect one reference that still uses the segment"}]:[],{command:buildCommandWithGlobalFlags(client.argv,`flags segments rm ${segment} --yes`),when:"retry after removing all references"}]},1),inspectSubcommand15?lines.push("",`Run ${getCommandName(inspectSubcommand15)} to inspect one reference, remove the segment from each rule, then try deleting the segment again.`):lines.push("","Remove every flag or segment rule that references it, then try deleting the segment again."),output_manager_default.error(lines.join(`
|
|
@@ -1031,7 +1031,7 @@ Starting setup...
|
|
|
1031
1031
|
`),output_manager_default.print("\u2500".repeat(50)+`
|
|
1032
1032
|
`),summary.forEach(line2=>output_manager_default.print(`${line2}
|
|
1033
1033
|
`)),output_manager_default.print(`\u2728 Setup complete! Restart your clients if needed.
|
|
1034
|
-
`),0}var MCP_CLIENTS=[{slug:"claude-code",display:"Claude Code"},{slug:"claude-desktop",display:"Claude.ai and Claude for desktop"},{slug:"cursor",display:"Cursor"},{slug:"vscode-copilot",display:"VS Code with Copilot"}],MCP_CLIENT_DISPLAY_NAMES=MCP_CLIENTS.map(c=>c.display);function buildSuggestedMcpCommand(client,clientsValue){let args=client.argv.slice(2),preserved=[],hasNonInteractive=!1;for(let i=1;i<args.length;i++){let arg=args[i];if(arg==="--non-interactive"){hasNonInteractive=!0;continue}if(arg==="--clients"){for(i++;i<args.length&&!args[i].startsWith("-");)i++;i--;continue}arg.startsWith("--clients=")||preserved.push(arg)}let singleQuotedClients=`'${clientsValue}'`;preserved.push("--clients",singleQuotedClients),hasNonInteractive&&preserved.push("--non-interactive");let suffix=preserved.join(" ");return suffix?`${packageName} mcp ${suffix}`:`${packageName} mcp`}function parseAndValidateClients(clientsFlag){if(!clientsFlag||!clientsFlag.trim())return[];let normalized=clientsFlag.split(",").map(s=>s.trim()).filter(Boolean).map(name=>{let lower=name.toLowerCase();return MCP_CLIENT_DISPLAY_NAMES.find(c=>c.toLowerCase()===lower)??name});return[...new Set(normalized)]}async function main26(client){let parsedArgs,flagsSpecification=getFlagsSpecification(mcpCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return printError(error),1}if(parsedArgs.flags["--help"])return output_manager_default.print(help(mcpCommand,{columns:client.stderr.columns})),2;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")}]},1),1;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")}]},1),1}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_CONFIG50={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),1}let subArgs=parsedArgs.args.slice(1),{subcommand,subcommandOriginal}=getSubcommand7(subArgs,COMMAND_CONFIG50),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-
|
|
1034
|
+
`),0}var MCP_CLIENTS=[{slug:"claude-code",display:"Claude Code"},{slug:"claude-desktop",display:"Claude.ai and Claude for desktop"},{slug:"cursor",display:"Cursor"},{slug:"vscode-copilot",display:"VS Code with Copilot"}],MCP_CLIENT_DISPLAY_NAMES=MCP_CLIENTS.map(c=>c.display);function buildSuggestedMcpCommand(client,clientsValue){let args=client.argv.slice(2),preserved=[],hasNonInteractive=!1;for(let i=1;i<args.length;i++){let arg=args[i];if(arg==="--non-interactive"){hasNonInteractive=!0;continue}if(arg==="--clients"){for(i++;i<args.length&&!args[i].startsWith("-");)i++;i--;continue}arg.startsWith("--clients=")||preserved.push(arg)}let singleQuotedClients=`'${clientsValue}'`;preserved.push("--clients",singleQuotedClients),hasNonInteractive&&preserved.push("--non-interactive");let suffix=preserved.join(" ");return suffix?`${packageName} mcp ${suffix}`:`${packageName} mcp`}function parseAndValidateClients(clientsFlag){if(!clientsFlag||!clientsFlag.trim())return[];let normalized=clientsFlag.split(",").map(s=>s.trim()).filter(Boolean).map(name=>{let lower=name.toLowerCase();return MCP_CLIENT_DISPLAY_NAMES.find(c=>c.toLowerCase()===lower)??name});return[...new Set(normalized)]}async function main26(client){let parsedArgs,flagsSpecification=getFlagsSpecification(mcpCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return printError(error),1}if(parsedArgs.flags["--help"])return output_manager_default.print(help(mcpCommand,{columns:client.stderr.columns})),2;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")}]},1),1;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")}]},1),1}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_CONFIG50={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),1}let subArgs=parsedArgs.args.slice(1),{subcommand,subcommandOriginal}=getSubcommand7(subArgs,COMMAND_CONFIG50),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-EQCAQVSE.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-NNJNXQZG.js")).default;return queryFn(client,telemetry2)}}}var import_chalk238=__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),1}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 getScope(client);output_manager_default.spinner(`Fetching microfrontends configuration in ${import_chalk238.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_chalk238.default.bold(humanizePath(join35(currentDirectory,VERCEL_DIR,VERCEL_DIR_MICROFRONTENDS)))} ${import_chalk238.default.gray(microfrontendsStamp())}`,emoji("success"))}
|
|
1035
1035
|
`),0}catch(error){return output_manager_default.stopSpinner(),printError(error),1}}var import_chalk239=__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),1}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_chalk239.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."),1;if(!projectFlags||projectFlags.length===0)return output_manager_default.error("Missing required flag --project. Use --project in non-interactive mode."),1;if(projectFlags.length>1&&!defaultAppFlag)return output_manager_default.error("Missing required flag --default-app when using multiple --project values in non-interactive mode."),1}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.`),1;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.`),1;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_chalk239.default.bold("Billing")),output_manager_default.log(` ${import_chalk239.default.bold("Team:")} ${teamSlug}`),output_manager_default.log(` ${import_chalk239.default.bold("Adding:")} ${newProjectCount} microfrontends project${newProjectCount>1?"s":""}`);let projectFee;if(totalAfter<=freeProjects)projectFee=import_chalk239.default.green("Free")+` (first ${freeProjects} included)`;else if(existingMfeProjectCount>=freeProjects)projectFee=import_chalk239.default.yellow(`$250.00/month x ${newProjectCount}`)+` project${newProjectCount>1?"s":""}`;else{let freeRemaining=freeProjects-existingMfeProjectCount,paidProjects=newProjectCount-freeRemaining;projectFee=import_chalk239.default.green(`${freeRemaining} free`)+", "+import_chalk239.default.yellow(`$250.00/month x ${paidProjects}`)}if(output_manager_default.log(` ${import_chalk239.default.bold("Project fee:")} ${projectFee}`),output_manager_default.log(` ${import_chalk239.default.bold("Request fee:")} ${import_chalk239.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_chalk239.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_chalk239.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_chalk239.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_chalk239.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_chalk239.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+`
|
|
1036
1036
|
`,"utf-8"),output_manager_default.success(`Created ${import_chalk239.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_chalk239.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_chalk240=__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),1}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_chalk240.default.bold(project.name)} to a microfrontends group on ${import_chalk240.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_chalk240.default.bold("Billing")),output_manager_default.log(` ${import_chalk240.default.bold("Team:")} ${teamSlug}`);let projectFee;if(totalAfter<=freeProjects?projectFee=import_chalk240.default.green("Free")+` (first ${freeProjects} included)`:existingMfeProjectCount>=freeProjects?projectFee=import_chalk240.default.yellow("$250.00/month"):projectFee=import_chalk240.default.yellow("$250.00/month")+` (${freeProjects} free projects used)`,output_manager_default.log(` ${import_chalk240.default.bold("Project fee:")} ${projectFee}`),output_manager_default.log(` ${import_chalk240.default.bold("Request fee:")} ${import_chalk240.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_chalk240.default.bold(teamSlug)}'s bill. Request fees still apply for microfrontends routed requests.`):output_manager_default.log(`By proceeding, ${import_chalk240.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_chalk240.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_chalk241=__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),1}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_chalk241.default.bold(project.name)} from microfrontends group ${import_chalk241.default.bold(projectGroup.group.name)} on ${import_chalk241.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_chalk241.default.gray(removeStamp())}`),isReferencedInConfig&&output_manager_default.log(`Remember to remove "${project.name}" from your microfrontends.json configuration.`),0}var import_chalk242=__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),1}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."),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 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_chalk242.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_chalk242.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_chalk242.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_chalk242.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_chalk242.default.gray(deleteStamp())}`),0}import{existsSync as existsSync4}from"fs";import{join as join37}from"path";var import_chalk243=__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),1}let formatResult=validateJsonOutput(parsedArgs.flags);if(!formatResult.valid)return output_manager_default.error("error"in formatResult?formatResult.error:"Invalid output format"),1;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"}]},1),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."),1;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."),1;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)}
|
|
1037
1037
|
`),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_chalk243.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_CONFIG51={"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 main27(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),1}let{subcommand,subcommandOriginal}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG51),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("microfrontends"),output_manager_default.print(help(microfrontendsCommand,{columns:client.stderr.columns})),2;function printHelp(command2){return output_manager_default.print(help(command2,{parent:microfrontendsCommand,columns:client.stderr.columns})),2}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_CONFIG51)),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),1}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
|
|
@@ -1072,7 +1072,7 @@ Starting setup...
|
|
|
1072
1072
|
`)}function outputTable(projectList,options){let{contextName,elapsed:elapsed2,deprecated,opts,pagination}=options;output_manager_default.log(`${projectList.length>0?"Projects":"No projects"} found under ${import_chalk248.default.bold(contextName)} ${deprecated?"that are using a deprecated Node.js version":"\b"} ${import_chalk248.default.gray(`[${elapsed2}]`)}`),projectList.length>0&&(printProjectsTable(projectList),printPaginationInstructions(opts,pagination))}function printProjectsTable(projectList){let tablePrint=table([TABLE_HEADERS.map(header=>import_chalk248.default.bold(import_chalk248.default.cyan(header))),...projectList.flatMap(project=>[[import_chalk248.default.bold(project.name),getLatestProdUrl(project),import_chalk248.default.gray((0,import_ms24.default)(Date.now()-project.updatedAt)),project.nodeVersion??""]])],{hsep:3}).replace(/^/gm," ");output_manager_default.print(`
|
|
1073
1073
|
${tablePrint}
|
|
1074
1074
|
|
|
1075
|
-
`)}function printPaginationInstructions(opts,pagination){if(pagination?.next){let nextCmd=`project ls${getCommandFlags(opts,PAGINATION_FLAGS_TO_EXCLUDE)} --next ${pagination.next}`;output_manager_default.log(`To display the next page, run ${getCommandName(nextCmd)}`)}}function getLatestProdUrl(project){let alias2=project.targets?.production?.alias?.[0];return alias2?`https://${alias2}`:"--"}var import_chalk250=__toESM(require_source(),1);var import_chalk249=__toESM(require_source(),1);var ProjectTelemetryClient=class extends TelemetryClient{trackCliSubcommandInspect(actual){this.trackCliSubcommand({subcommand:"inspect",value:actual})}trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandAdd(actual){this.trackCliSubcommand({subcommand:"add",value:actual})}trackCliSubcommandAccessSummary(actual){this.trackCliSubcommand({subcommand:"access-summary",value:actual})}trackCliSubcommandChecks(actual){this.trackCliSubcommand({subcommand:"checks",value:actual})}trackCliSubcommandRemove(actual){this.trackCliSubcommand({subcommand:"remove",value:actual})}trackCliSubcommandRename(actual){this.trackCliSubcommand({subcommand:"rename",value:actual})}trackCliSubcommandUpdate(actual){this.trackCliSubcommand({subcommand:"update",value:actual})}trackCliSubcommandToken(actual){this.trackCliSubcommand({subcommand:"token",value:actual})}trackCliSubcommandMembers(actual){this.trackCliSubcommand({subcommand:"members",value:actual})}trackCliArgumentProject(project){project&&this.trackCliArgument({arg:"project",value:this.redactedValue})}trackCliArgumentMember(member){member&&this.trackCliArgument({arg:"member",value:this.redactedValue})}trackCliOptionRole(role){role&&this.trackCliOption({option:"role",value:PROJECT_MEMBER_ROLES.includes(role)?role:this.redactedValue})}trackCliSubcommandAccessGroups(actual){this.trackCliSubcommand({subcommand:"access-groups",value:actual})}trackCliSubcommandProtection(actual){this.trackCliSubcommand({subcommand:"protection",value:actual})}trackCliSubcommandWebAnalytics(actual){this.trackCliSubcommand({subcommand:"web-analytics",value:actual})}trackCliSubcommandSpeedInsights(actual){this.trackCliSubcommand({subcommand:"speed-insights",value:actual})}trackCliSubcommandPause(actual){this.trackCliSubcommand({subcommand:"pause",value:actual})}trackCliSubcommandObservability(actual){this.trackCliSubcommand({subcommand:"observability",value:actual})}trackCliSubcommandResume(actual){this.trackCliSubcommand({subcommand:"resume",value:actual})}};function findMember(members3,identifier){let needle=identifier.toLowerCase();return members3.find(m=>m.uid===identifier||m.username?.toLowerCase()===needle||m.email?.toLowerCase()===needle)}async function findProjectMember(client,projectId,identifier){let until;for(let page=0;page<100;page++){let query=new URLSearchParams({limit:"100"});until&&query.set("until",String(until));let{members:members3,pagination}=await client.fetch(`/v1/projects/${encodeURIComponent(projectId)}/members?${query.toString()}`),match=findMember(members3??[],identifier);if(match)return match;let next=pagination?.next;if(!members3||members3.length===0||!next)return;until=next}}async function membersRemove(client,argv){let telemetry2=new ProjectTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification([...membersRemoveFlags]);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),1}let[projectNameOrId,member]=parsedArgs.args;telemetry2.trackCliArgumentProject(projectNameOrId),telemetry2.trackCliArgumentMember(member);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),1;let{jsonOutput}=formatResult,asJson=jsonOutput||!canPrompt(client);function fail(reason,message,humanMessage=message,extra){return shouldEmitNonInteractiveCommandError(client)?(outputAgentError(client,{status:AGENT_STATUS.ERROR,reason,message,...extra}),1):jsonOutput||!canPrompt(client)?(client.stdout.write(`${JSON.stringify({status:AGENT_STATUS.ERROR,reason,message},null,2)}
|
|
1075
|
+
`)}function printPaginationInstructions(opts,pagination){if(pagination?.next){let nextCmd=`project ls${getCommandFlags(opts,PAGINATION_FLAGS_TO_EXCLUDE)} --next ${pagination.next}`;output_manager_default.log(`To display the next page, run ${getCommandName(nextCmd)}`)}}function getLatestProdUrl(project){let alias2=project.targets?.production?.alias?.[0];return alias2?`https://${alias2}`:"--"}var import_chalk250=__toESM(require_source(),1);var import_chalk249=__toESM(require_source(),1);var ProjectTelemetryClient=class extends TelemetryClient{trackCliSubcommandInspect(actual){this.trackCliSubcommand({subcommand:"inspect",value:actual})}trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandAdd(actual){this.trackCliSubcommand({subcommand:"add",value:actual})}trackCliSubcommandAccessSummary(actual){this.trackCliSubcommand({subcommand:"access-summary",value:actual})}trackCliSubcommandChecks(actual){this.trackCliSubcommand({subcommand:"checks",value:actual})}trackCliSubcommandRemove(actual){this.trackCliSubcommand({subcommand:"remove",value:actual})}trackCliSubcommandRename(actual){this.trackCliSubcommand({subcommand:"rename",value:actual})}trackCliSubcommandUpdate(actual){this.trackCliSubcommand({subcommand:"update",value:actual})}trackCliSubcommandToken(actual){this.trackCliSubcommand({subcommand:"token",value:actual})}trackCliSubcommandMembers(actual){this.trackCliSubcommand({subcommand:"members",value:actual})}trackCliArgumentProject(project){project&&this.trackCliArgument({arg:"project",value:this.redactedValue})}trackCliArgumentMember(member){member&&this.trackCliArgument({arg:"member",value:this.redactedValue})}trackCliOptionRole(role){role&&this.trackCliOption({option:"role",value:PROJECT_MEMBER_ROLES.includes(role)?role:this.redactedValue})}trackCliSubcommandAccessGroups(actual){this.trackCliSubcommand({subcommand:"access-groups",value:actual})}trackCliSubcommandProtection(actual){this.trackCliSubcommand({subcommand:"protection",value:actual})}trackCliSubcommandWebAnalytics(actual){this.trackCliSubcommand({subcommand:"web-analytics",value:actual})}trackCliSubcommandSpeedInsights(actual){this.trackCliSubcommand({subcommand:"speed-insights",value:actual})}trackCliSubcommandPause(actual){this.trackCliSubcommand({subcommand:"pause",value:actual})}trackCliSubcommandDangerouslyDeleteImmutableStaticAsset(actual){this.trackCliSubcommand({subcommand:"dangerously-delete-immutable-static-asset",value:actual})}trackCliSubcommandObservability(actual){this.trackCliSubcommand({subcommand:"observability",value:actual})}trackCliSubcommandResume(actual){this.trackCliSubcommand({subcommand:"resume",value:actual})}};function findMember(members3,identifier){let needle=identifier.toLowerCase();return members3.find(m=>m.uid===identifier||m.username?.toLowerCase()===needle||m.email?.toLowerCase()===needle)}async function findProjectMember(client,projectId,identifier){let until;for(let page=0;page<100;page++){let query=new URLSearchParams({limit:"100"});until&&query.set("until",String(until));let{members:members3,pagination}=await client.fetch(`/v1/projects/${encodeURIComponent(projectId)}/members?${query.toString()}`),match=findMember(members3??[],identifier);if(match)return match;let next=pagination?.next;if(!members3||members3.length===0||!next)return;until=next}}async function membersRemove(client,argv){let telemetry2=new ProjectTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification([...membersRemoveFlags]);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),1}let[projectNameOrId,member]=parsedArgs.args;telemetry2.trackCliArgumentProject(projectNameOrId),telemetry2.trackCliArgumentMember(member);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),1;let{jsonOutput}=formatResult,asJson=jsonOutput||!canPrompt(client);function fail(reason,message,humanMessage=message,extra){return shouldEmitNonInteractiveCommandError(client)?(outputAgentError(client,{status:AGENT_STATUS.ERROR,reason,message,...extra}),1):jsonOutput||!canPrompt(client)?(client.stdout.write(`${JSON.stringify({status:AGENT_STATUS.ERROR,reason,message},null,2)}
|
|
1076
1076
|
`),1):(output_manager_default.error(humanMessage),1)}if(parsedArgs.args.length!==2){let cmd2=buildCommandWithGlobalFlags(client.argv,"project members remove <project> <member>");return fail(AGENT_REASON.INVALID_ARGUMENTS,"Invalid number of arguments. Usage: `vercel project members remove <project> <member>`","Invalid number of arguments. Usage: `vercel project members remove <project> <member>`",{next:[{command:cmd2,when:"Remove a member from a project (replace <project> and <member>)"}]})}let project,target;try{project=await getProjectByCwdOrLink({client,commandName:"project members remove",projectNameOrId,forReadOnlyCommand:!0}),target=await findProjectMember(client,project.id,member)}catch(err){return exitWithNonInteractiveError(client,err,1,{variant:"members"}),jsonOutput||!canPrompt(client)?(client.stdout.write(`${JSON.stringify({status:AGENT_STATUS.ERROR,reason:"unexpected_error",message:err instanceof Error?err.message:String(err)},null,2)}
|
|
1077
1077
|
`),1):(printError(err),1)}if(!target){let message=`${member} is not a member of ${project.name}.`;return fail(AGENT_REASON.NOT_FOUND,message,message,{next:[{command:buildCommandWithGlobalFlags(client.argv,`project members ${project.name}`),when:"List current members to find the right identifier"}]})}let memberLabel=target.username||target.email||target.uid;if(!canPrompt(client)){let actionRequired={status:AGENT_STATUS.ACTION_REQUIRED,reason:AGENT_REASON.CONFIRMATION_REQUIRED,action:AGENT_ACTION.CONFIRMATION_REQUIRED,userActionRequired:!0,message:`Removing ${memberLabel} from ${project.name} requires interactive confirmation and cannot be done non-interactively.`,next:[{command:buildCommandWithGlobalFlags(client.argv,"project members remove <project> <member>"),when:"user runs this command in an interactive terminal"}]};return outputActionRequired(client,actionRequired,1),client.stdout.write(`${JSON.stringify(actionRequired,null,2)}
|
|
1078
1078
|
`),1}if(!await client.input.confirm(`Remove ${import_chalk249.default.bold(memberLabel)} from ${import_chalk249.default.bold(project.name)}?`,!1))return output_manager_default.log("Canceled."),0;try{let result=await client.fetch(`/v1/projects/${encodeURIComponent(project.id)}/members/${encodeURIComponent(target.uid)}`,{method:"DELETE"});return asJson?(shouldEmitNonInteractiveCommandError(client)?client.stdout.write(`${JSON.stringify({status:AGENT_STATUS.OK,projectId:project.id,projectName:project.name,uid:target.uid,result,message:`Removed ${memberLabel} from ${project.name}.`,next:[{command:buildCommandWithGlobalFlags(client.argv,`project members ${project.name}`),when:"List remaining members"}]},null,2)}
|
|
@@ -1091,7 +1091,9 @@ ${tablePrint}
|
|
|
1091
1091
|
`),0}var import_chalk252=__toESM(require_source(),1),import_ms25=__toESM(require_ms(),1);var ProjectRenameTelemetryClient=class extends TelemetryClient{trackCliArgumentName(name){name&&this.trackCliArgument({arg:"name",value:this.redactedValue})}trackCliArgumentNewName(newName){newName&&this.trackCliArgument({arg:"new-name",value:this.redactedValue})}};async function rename(client,argv){let telemetryClient=new ProjectRenameTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(renameSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),1}let{args}=parsedArgs;if(args.length!==2)return output_manager_default.error(`Invalid number of arguments. Usage: ${import_chalk252.default.cyan(`${getCommandName("project rename <name> <new-name>")}`)}`),2;let[projectNameOrId,newName]=args;telemetryClient.trackCliArgumentName(projectNameOrId),telemetryClient.trackCliArgumentNewName(newName);let project=await getProjectByNameOrId(client,projectNameOrId);if(project instanceof ProjectNotFound)return output_manager_default.error("No such project exists"),1;let start=Date.now(),renamedProject;try{renamedProject=await client.fetch(`/v9/projects/${encodeURIComponent(project.id)}`,{method:"PATCH",body:{name:newName}})}catch(err){if(isAPIError(err)&&err.status===409)return output_manager_default.error(`A project named "${newName}" already exists`),1;if(isAPIError(err)&&err.status===403)return output_manager_default.error(err.message),1;throw err}let elapsed2=(0,import_ms25.default)(Date.now()-start);return output_manager_default.log(`${import_chalk252.default.cyan("Success!")} Project ${import_chalk252.default.bold(project.name)} renamed to ${import_chalk252.default.bold(renamedProject.name)} ${import_chalk252.default.gray(`[${elapsed2}]`)}`),0}var import_chalk253=__toESM(require_source(),1);var ProjectUpdateTelemetryClient=class extends TelemetryClient{trackCliArgumentName(name){name&&this.trackCliArgument({arg:"name",value:this.redactedValue})}trackCliOptionFramework(framework){framework&&this.trackCliOption({option:"framework",value:this.redactedValue})}trackCliOptionBuildCommand(value){this.trackSettingOption("build-command",value)}trackCliOptionDevCommand(value){this.trackSettingOption("dev-command",value)}trackCliOptionInstallCommand(value){this.trackSettingOption("install-command",value)}trackCliOptionOutputDirectory(value){this.trackSettingOption("output-directory",value)}trackCliOptionRootDirectory(value){this.trackSettingOption("root-directory",value)}trackCliOptionAutoDetect(value){value?.length&&this.trackCliOption({option:"auto-detect",value:this.redactedValue})}trackCliOptionSandboxRegion(value){this.trackSandboxRegionOption("sandbox-region",value)}trackCliOptionSandboxFailoverRegions(value){this.trackSandboxRegionOption("sandbox-failover-regions",value)}trackSandboxRegionOption(option,value){value!==void 0&&this.trackCliOption({option,value:this.redactedValue})}trackSettingOption(option,value){value!==void 0&&this.trackCliOption({option,value:this.redactedValue})}trackCliOptionFluidCompute(value){this.trackChoiceOption("fluid-compute",value,["on","off"])}trackCliOptionFunctionCpu(value){this.trackChoiceOption("function-cpu",value,["standard_legacy","standard","performance","performance_xl"])}trackCliOptionBuildMachine(value){this.trackChoiceOption("build-machine",value,["basic","standard","enhanced","turbo","elastic"])}trackCliOptionElasticConcurrency(value){this.trackChoiceOption("elastic-concurrency",value,["on","off"])}trackCliOptionNodeVersion(value){this.trackChoiceOption("node-version",value,["24.x","22.x","20.x","18.x","16.x","14.x","12.x","10.x"])}trackChoiceOption(option,value,allowed){value!==void 0&&this.trackCliOption({option,value:allowed.includes(value)?value:this.redactedValue})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}trackCliFlagYes(yes){yes&&this.trackCliFlag("yes")}};var import_frameworks2=__toESM(require_frameworks(),1);var OTHER_FRAMEWORK_SLUG="other",MAX_SETTING_LENGTH=256,CONTROL_CHARACTERS=/[\u0000-\u001f\u007f]/,frameworkSlugs=import_frameworks2.frameworkList.map(framework=>framework.slug??OTHER_FRAMEWORK_SLUG),buildSettingDefinitions=[{key:"buildCommand",flag:"--build-command",autoDetect:"build-command",label:"Build Command"},{key:"devCommand",flag:"--dev-command",autoDetect:"dev-command",label:"Dev Command"},{key:"installCommand",flag:"--install-command",autoDetect:"install-command",label:"Install Command"},{key:"outputDirectory",flag:"--output-directory",autoDetect:"output-directory",label:"Output Directory"},{key:"rootDirectory",flag:"--root-directory",autoDetect:"root-directory",label:"Root Directory"}],settingOrder=["framework",...buildSettingDefinitions.map(setting=>setting.key),"sandboxRegion","sandboxFailoverRegions"],autoDetectSettings=buildSettingDefinitions.map(setting=>setting.autoDetect),settingLabels={framework:"Framework",...Object.fromEntries(buildSettingDefinitions.map(setting=>[setting.key,setting.label])),sandboxRegion:"Sandbox Region",sandboxFailoverRegions:"Failover"};function isSandboxSettingKey(key){return key==="sandboxRegion"||key==="sandboxFailoverRegions"}function resolveFramework(input){let slug=input.trim().toLowerCase();return import_frameworks2.frameworkList.find(framework=>(framework.slug??OTHER_FRAMEWORK_SLUG)===slug)}function formatFramework(slug){let framework=import_frameworks2.frameworkList.find(item=>item.slug===slug);return framework?`${framework.name} (${framework.slug??OTHER_FRAMEWORK_SLUG})`:slug??OTHER_FRAMEWORK_SLUG}function formatSettingValue(key,value){return key==="sandboxRegion"?typeof value=="string"?value:"Auto":key==="sandboxFailoverRegions"?formatSandboxRegionList(Array.isArray(value)?value:[]):key==="framework"?formatFramework(typeof value=="string"?value:null):value===null?"Auto":value===""?'""':String(value)}function getCurrentSetting(project,key){return key==="sandboxRegion"?project.sandbox?.region??null:key==="sandboxFailoverRegions"?project.sandbox?.failoverRegions??null:project[key]??null}function isSameSettingValue(a,b){if(Array.isArray(a)||Array.isArray(b)){let left=Array.isArray(a)?a:[],right=Array.isArray(b)?b:[];return left.length===right.length&&left.every((value,index)=>value===right[index])}return a===b}function hasSetting(settings,key){return Object.prototype.hasOwnProperty.call(settings,key)}function validateSettingValue(definition,value){if(value.length>MAX_SETTING_LENGTH)return`${definition.label} must be ${MAX_SETTING_LENGTH} characters or fewer.`;if(CONTROL_CHARACTERS.test(value))return`${definition.label} can't contain control characters.`}function parseAutoDetectSettings(inputs){return inputs.flatMap(input=>input.split(",")).map(input=>input.trim())}var NODE_VERSIONS=["24.x","22.x","20.x","18.x","16.x","14.x","12.x","10.x"],FUNCTION_CPU_TIERS=["standard_legacy","standard","performance","performance_xl"],BUILD_MACHINE_TYPES=["basic","standard","enhanced","turbo","elastic"];function parseOnOff(flag,raw){return raw==="on"||raw==="off"?{ok:!0,value:raw==="on"}:{ok:!1,message:`${flag} must be "on" or "off".`}}function parseEnumValue(label,raw,allowed){return allowed.includes(raw)?{ok:!0,value:raw}:{ok:!1,message:`${label} must be one of: ${allowed.join(", ")}.`}}function displayOnOff(value){return value===!0?"on":value===!1?"off":"Auto"}function displayValue(value){return value==null?"Auto":String(value)}function parseAdvanced(definition,raw){return definition.kind==="toggle"?parseOnOff(definition.flag,raw):parseEnumValue(definition.label,raw,definition.values)}function readAdvanced(definition,project){let fields=project;switch(definition.target){case"resourceConfig":return definition.field==="buildMachineType"&&fields.resourceConfig?.buildMachineSelection==="elastic"?"elastic":fields.resourceConfig?.[definition.field];case"project":return project[definition.field]}}function displayAdvanced(definition,value){return definition.kind==="toggle"?displayOnOff(value):displayValue(value)}var advancedSettingDefinitions=[{key:"fluid",flag:"--fluid-compute",label:"Fluid Compute",kind:"toggle",target:"resourceConfig",field:"fluid"},{key:"functionDefaultMemoryType",flag:"--function-cpu",label:"Function CPU",kind:"enum",values:FUNCTION_CPU_TIERS,target:"resourceConfig",field:"functionDefaultMemoryType",requiresPaidPlan:()=>!0,hasCostImpact:()=>!0},{key:"buildMachineType",flag:"--build-machine",label:"Build Machine",kind:"enum",values:BUILD_MACHINE_TYPES,target:"resourceConfig",field:"buildMachineType",requiresPaidPlan:()=>!0,hasCostImpact:()=>!0},{key:"elasticConcurrencyEnabled",flag:"--elastic-concurrency",label:"Elastic Concurrency",kind:"toggle",target:"resourceConfig",field:"elasticConcurrencyEnabled",requiresPaidPlan:value=>value===!0,hasCostImpact:value=>value===!0},{key:"nodeVersion",flag:"--node-version",label:"Node.js Version",kind:"enum",values:NODE_VERSIONS,target:"project",field:"nodeVersion"}];function ensureResourceConfig(body){return body.resourceConfig??={},body.resourceConfig}function applyAdvanced(definition,body,value){switch(definition.target){case"resourceConfig":ensureResourceConfig(body)[definition.field]=value;break;case"project":body[definition.field]=value;break}}function computeSettingsChanges(project,requestedSettings,providedAdvanced){let previousSettings={},changedSettings=[],body={},mergedSandbox;if(hasSetting(requestedSettings,"sandboxRegion")||hasSetting(requestedSettings,"sandboxFailoverRegions")){if(mergedSandbox={...project.sandbox},hasSetting(requestedSettings,"sandboxRegion")){let region=requestedSettings.sandboxRegion;region==null?delete mergedSandbox.region:mergedSandbox.region=region}hasSetting(requestedSettings,"sandboxFailoverRegions")&&(mergedSandbox.failoverRegions=requestedSettings.sandboxFailoverRegions??[])}for(let key of settingOrder){if(!hasSetting(requestedSettings,key))continue;let previous=getCurrentSetting(project,key),next=requestedSettings[key]??null;Object.assign(previousSettings,{[key]:previous}),isSameSettingValue(previous,next)||(changedSettings.push(key),isSandboxSettingKey(key)||(body[key]=next))}mergedSandbox&&(changedSettings.includes("sandboxRegion")||changedSettings.includes("sandboxFailoverRegions"))&&(body.sandbox=mergedSandbox);let advancedRows=[];for(let{definition,value}of providedAdvanced){let previous=readAdvanced(definition,project),changed=previous!==value;advancedRows.push({key:definition.key,label:definition.label,previous:displayAdvanced(definition,previous),next:displayAdvanced(definition,value),changed}),changed&&(changedSettings.push(definition.key),applyAdvanced(definition,body,value))}return{previousSettings,changedSettings,body,advancedRows}}async function patchProjectSettings(client,project,body){return client.fetch(`/v9/projects/${encodeURIComponent(project.id)}`,{method:"PATCH",accountId:project.accountId,body})}function getAdvancedResultValue(project,row){let definition=advancedSettingDefinitions.find(candidate=>candidate.key===row.key);return definition?displayAdvanced(definition,readAdvanced(definition,project)):row.next}function printChangePreview({project,previousSettings,requestedSettings,changedSettings,advancedRows}){printAlignedLabel("Project",project.name);for(let key of settingOrder){if(!hasSetting(requestedSettings,key)||!changedSettings.includes(key))continue;let previous=formatSettingValue(key,previousSettings[key]??null),next=formatSettingValue(key,requestedSettings[key]??null);printAlignedLabel(settingLabels[key],`${previous} \u2192 ${next}`)}for(let row of advancedRows)row.changed&&printAlignedLabel(row.label,`${row.previous} \u2192 ${row.next}`)}function writeUpdateResult({changedSettings,project,previousSettings,requestedSettings,advancedRows,asJson,client}){let changed=changedSettings.length>0;if(asJson){let settings={};for(let key of settingOrder)hasSetting(requestedSettings,key)&&(settings[key]=getCurrentSetting(project,key));for(let row of advancedRows){let definition=advancedSettingDefinitions.find(candidate=>candidate.key===row.key);definition&&(settings[row.key]=readAdvanced(definition,project)??null)}client.stdout.write(`${JSON.stringify({changed,changedSettings,projectId:project.id,projectName:project.name,settings},null,2)}
|
|
1092
1092
|
`);return}printAlignedLabel(changed?"Updated":"Unchanged","Project Settings",{gutter:"\u2713"}),printAlignedLabel("Project",project.name);for(let key of settingOrder){if(!hasSetting(requestedSettings,key))continue;let previous=previousSettings[key]??null,next=getCurrentSetting(project,key),value=changedSettings.includes(key)?`${formatSettingValue(key,previous)} \u2192 ${formatSettingValue(key,next)}`:formatSettingValue(key,next);printAlignedLabel(settingLabels[key],value)}for(let row of advancedRows){let result=getAdvancedResultValue(project,row),value=row.changed?`${row.previous} \u2192 ${result}`:result;printAlignedLabel(row.label,value)}}function getUpdateCommand2(framework="<slug>"){return`project update <name> --framework ${framework}`}function buildUpdateRetryCommand(client,{interactive,withYes}){let args=stripSensitiveAuthArgs(client.argv.slice(2)),nextArgs=[];for(let index=0;index<args.length;index++){let arg=args[index];if(!(arg==="--yes"||arg==="-y")){if(interactive&&(arg==="--non-interactive"||arg.startsWith("--non-interactive="))){arg==="--non-interactive"&&(args[index+1]==="true"||args[index+1]==="false")&&index++;continue}nextArgs.push(arg)}}return withYes&&nextArgs.push("--yes"),getCommandNamePlain(nextArgs.map(quoteArg).join(" "))}function printUsageError(client,message,exitCode2,reason,suggestedCommand=getUpdateCommand2()){return outputAgentError(client,{status:"error",reason,message,next:[{command:buildCommandWithGlobalFlags(client.argv,suggestedCommand),when:"Update project settings"}]},exitCode2),output_manager_default.error(message),exitCode2}function printPlanError(client,message,teamOwned){let nextCommand=teamOwned?"buy pro":"teams switch";return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.PLAN_UPGRADE_REQUIRED,message,userActionRequired:!0,next:[{command:buildCommandWithGlobalFlags(client.argv,nextCommand,void 0,{excludeFlags:["--non-interactive","--yes"]}),when:teamOwned?"Upgrade this team interactively":"Switch to a Pro or Enterprise team"}]},1),output_manager_default.error(message),output_manager_default.log(teamOwned?`Upgrade with ${getCommandName("buy pro")}.`:`Switch teams with ${getCommandName("teams switch")}.`),1}function printConfirmationRequiredError(client,hasCostImpact){let nextCommand=buildUpdateRetryCommand(client,{interactive:hasCostImpact,withYes:!hasCostImpact});return outputActionRequired(client,{status:AGENT_STATUS.ACTION_REQUIRED,reason:hasCostImpact?AGENT_REASON.INTERACTIVE_CONFIRMATION_REQUIRED:AGENT_REASON.CONFIRMATION_REQUIRED,action:AGENT_ACTION.CONFIRMATION_REQUIRED,message:hasCostImpact?"These project settings may affect charges and require interactive confirmation.":"Updating project settings requires confirmation. Re-run with --yes to apply the changes.",userActionRequired:hasCostImpact,next:[{command:nextCommand,when:hasCostImpact?"Review and confirm the charge-sensitive settings in a terminal":"Apply the requested settings without prompting"}]},1),output_manager_default.error(hasCostImpact?"Confirmation required. These settings may affect charges and must be confirmed in an interactive terminal.":"Confirmation required. Re-run with --yes or in an interactive terminal."),1}function getSandboxValidationError(project,requestedSettings){if(!hasSetting(requestedSettings,"sandboxRegion")&&!hasSetting(requestedSettings,"sandboxFailoverRegions"))return;let mergedSandbox={...project.sandbox};if(hasSetting(requestedSettings,"sandboxRegion")){let region=requestedSettings.sandboxRegion;region==null?delete mergedSandbox.region:mergedSandbox.region=region}return hasSetting(requestedSettings,"sandboxFailoverRegions")&&(mergedSandbox.failoverRegions=requestedSettings.sandboxFailoverRegions??[]),validateSandboxConfig(mergedSandbox)}async function refreshProjectForNestedUpdate(client,project,body){return body.resourceConfig===void 0&&body.sandbox===void 0?project:client.fetch(`/v9/projects/${encodeURIComponent(project.id)}`,{accountId:project.accountId})}async function update6(client,argv){let telemetry2=new ProjectUpdateTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs;try{parsedArgs=parseArguments(argv,getFlagsSpecification(updateSubcommand8.options))}catch(error){return outputAgentError(client,{status:"error",reason:"invalid_arguments",message:error instanceof Error?error.message:String(error)},1),printError(error),1}let{args,flags}=parsedArgs,[projectNameOrId]=args,frameworkInput=flags["--framework"],autoDetectInputs=flags["--auto-detect"]??[];if(telemetry2.trackCliArgumentName(projectNameOrId),telemetry2.trackCliOptionFramework(frameworkInput),telemetry2.trackCliOptionBuildCommand(flags["--build-command"]),telemetry2.trackCliOptionDevCommand(flags["--dev-command"]),telemetry2.trackCliOptionInstallCommand(flags["--install-command"]),telemetry2.trackCliOptionOutputDirectory(flags["--output-directory"]),telemetry2.trackCliOptionRootDirectory(flags["--root-directory"]),telemetry2.trackCliOptionAutoDetect(flags["--auto-detect"]),telemetry2.trackCliOptionSandboxRegion(flags["--sandbox-region"]),telemetry2.trackCliOptionSandboxFailoverRegions(flags["--sandbox-failover-regions"]),telemetry2.trackCliOptionFormat(flags["--format"]),telemetry2.trackCliFlagJson(flags["--json"]),telemetry2.trackCliFlagYes(flags["--yes"]),telemetry2.trackCliOptionFluidCompute(flags["--fluid-compute"]),telemetry2.trackCliOptionFunctionCpu(flags["--function-cpu"]),telemetry2.trackCliOptionBuildMachine(flags["--build-machine"]),telemetry2.trackCliOptionElasticConcurrency(flags["--elastic-concurrency"]),telemetry2.trackCliOptionNodeVersion(flags["--node-version"]),args.length>1)return printUsageError(client,`Invalid number of arguments. Usage: ${getCommandNamePlain("project update [name] [options]")}`,2,"invalid_arguments");let formatResult=validateJsonOutput(flags);if(!formatResult.valid)return printUsageError(client,formatResult.error,1,"invalid_arguments");let requestedSettings={};if(frameworkInput!==void 0){let framework=resolveFramework(frameworkInput);if(!framework){let normalizedInput=frameworkInput.trim().toLowerCase(),suggestion=normalizedInput?did_you_mean_default(normalizedInput,frameworkSlugs,.7):void 0,message=suggestion?`Unsupported framework preset ${JSON.stringify(frameworkInput)}. Did you mean ${JSON.stringify(suggestion)}?`:`Unsupported framework preset ${JSON.stringify(frameworkInput)}. Use a framework slug such as "nextjs", or "other" to clear the preset.`;return printUsageError(client,message,1,"invalid_arguments",getUpdateCommand2(suggestion))}requestedSettings.framework=framework.slug}let requestedAutoDetect=parseAutoDetectSettings(autoDetectInputs),autoDetectSet=new Set;for(let setting of requestedAutoDetect){if(!autoDetectSettings.includes(setting)){let suggestion=setting?did_you_mean_default(setting,autoDetectSettings,.7):void 0,message=suggestion?`Unknown auto-detect setting ${JSON.stringify(setting)}. Did you mean ${JSON.stringify(suggestion)}?`:`Unknown auto-detect setting ${JSON.stringify(setting)}. Accepted settings: ${autoDetectSettings.join(", ")}.`;return printUsageError(client,message,1,"invalid_arguments",`project update <name> --auto-detect ${suggestion??"<setting>"}`)}autoDetectSet.add(setting)}for(let definition of buildSettingDefinitions){let value=flags[definition.flag];if(value!==void 0&&autoDetectSet.has(definition.autoDetect))return printUsageError(client,`Can't use "${definition.flag}" and "--auto-detect ${definition.autoDetect}" together. Choose one.`,2,"invalid_arguments",`project update <name> ${definition.flag} <value>`);if(value!==void 0){let validationError=validateSettingValue(definition,value);if(validationError)return printUsageError(client,validationError,1,"invalid_arguments",`project update <name> ${definition.flag} <value>`);requestedSettings[definition.key]=value}else autoDetectSet.has(definition.autoDetect)&&(requestedSettings[definition.key]=null)}let sandboxRegionInput=flags["--sandbox-region"];if(sandboxRegionInput!==void 0){let normalizedRegion=sandboxRegionInput.trim().toLowerCase();requestedSettings.sandboxRegion=normalizedRegion===""?null:normalizedRegion}let sandboxFailoverInput=flags["--sandbox-failover-regions"];sandboxFailoverInput!==void 0&&(requestedSettings.sandboxFailoverRegions=parseSandboxRegionList(sandboxFailoverInput));let providedAdvanced=[];for(let definition of advancedSettingDefinitions){let raw=flags[definition.flag];if(raw===void 0)continue;let result=parseAdvanced(definition,raw);if(!result.ok)return printUsageError(client,result.message,1,"invalid_arguments",`project update <name> ${definition.flag} <value>`);providedAdvanced.push({definition,value:result.value})}if(settingOrder.every(key=>!hasSetting(requestedSettings,key))&&providedAdvanced.length===0)return printUsageError(client,'Provide at least one setting option. Run "vercel project update --help" to see every available option.',2,"missing_arguments");let project;try{project=await getProjectByCwdOrLink({client,commandName:"project update",projectNameOrId,forReadOnlyCommand:!0})}catch(error){return exitWithNonInteractiveError(client,error,1,{variant:"update"}),printError(error),1}let sandboxError=getSandboxValidationError(project,requestedSettings);if(sandboxError)return printUsageError(client,sandboxError,1,"invalid_arguments");let changes=computeSettingsChanges(project,requestedSettings,providedAdvanced),changeCount=changes.changedSettings.length,gatedProvided=providedAdvanced.filter(({definition,value})=>changes.changedSettings.includes(definition.key)&&definition.requiresPaidPlan?.(value));if(gatedProvided.length>0){let team,user,teamOwned=project.accountId.startsWith("team_");try{projectNameOrId?{team,user}=await getScope(client):{team,user}=await getScope(client,{resolveLocalScope:!0}),teamOwned&&team?.id!==project.accountId&&(team=await getTeamByIdOrSlug(client,project.accountId))}catch(error){return exitWithNonInteractiveError(client,error,1,{variant:"update"}),printError(error),1}let plan=(teamOwned?team?.billing:user?.billing)?.plan;if(!(plan==="pro"||plan==="enterprise")){let phrases=gatedProvided.map(({definition,value})=>`${definition.label} "${displayAdvanced(definition,value)}"`),list29=phrases.length===1?phrases[0]:`${phrases.slice(0,-1).join(", ")} and ${phrases[phrases.length-1]}`,verb=phrases.length>1?"require":"requires";return printPlanError(client,`${list29} ${verb} a Pro or Enterprise plan.`,teamOwned)}}let hasCostImpact=providedAdvanced.some(({definition,value})=>changes.changedSettings.includes(definition.key)&&definition.hasCostImpact?.(value));if(changeCount>0&&!(!!flags["--yes"]&&!hasCostImpact)){if(!canPrompt(client))return printConfirmationRequiredError(client,hasCostImpact);if(printChangePreview({project,previousSettings:changes.previousSettings,requestedSettings,changedSettings:changes.changedSettings,advancedRows:changes.advancedRows}),hasCostImpact&&printAlignedLabel("Charges","These settings may affect your Vercel charges.",{gutter:"!"}),!await client.input.confirm(`Update ${changeCount} ${changeCount===1?"setting":"settings"} for ${import_chalk253.default.bold(project.name)}?`,!1))return output_manager_default.log("Canceled"),0}if(changeCount>0){try{project=await refreshProjectForNestedUpdate(client,project,changes.body)}catch(error){return exitWithNonInteractiveError(client,error,1,{variant:"update"}),printError(error),1}let refreshedSandboxError=getSandboxValidationError(project,requestedSettings);if(refreshedSandboxError)return printUsageError(client,refreshedSandboxError,1,"invalid_arguments");changes=computeSettingsChanges(project,requestedSettings,providedAdvanced)}let updatedProject=project;if(changes.changedSettings.length>0)try{updatedProject=await patchProjectSettings(client,project,changes.body)}catch(error){return exitWithNonInteractiveError(client,error,1,{variant:"update"}),printError(error),1}return writeUpdateResult({changedSettings:changes.changedSettings,project:updatedProject,previousSettings:changes.previousSettings,requestedSettings,advancedRows:changes.advancedRows,asJson:formatResult.jsonOutput||shouldEmitNonInteractiveCommandError(client),client}),0}var import_chalk254=__toESM(require_source(),1),import_ms26=__toESM(require_ms(),1);var ProjectRmTelemetryClient=class extends TelemetryClient{trackCliArgumentName(name){name&&this.trackCliArgument({arg:"name",value:this.redactedValue})}};var e=encodeURIComponent;async function rm9(client,argv){let telemetryClient=new ProjectRmTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(removeSubcommand13.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),1}let{args}=parsedArgs;if(args.length!==1)return output_manager_default.error(`Invalid number of arguments. Usage: ${import_chalk254.default.cyan(`${getCommandName("project rm <name>")}`)}`),1;let name=args[0];telemetryClient.trackCliArgumentName(name);let start=Date.now();if(!await readConfirmation3(client,name))return output_manager_default.log("User abort"),0;try{await client.fetch(`/v2/projects/${e(name)}`,{method:"DELETE"})}catch(err){if(isAPIError(err)&&err.status===404)return output_manager_default.error("No such project exists"),1;if(isAPIError(err)&&err.status===403)return output_manager_default.error(err.message),1}let elapsed2=(0,import_ms26.default)(Date.now()-start);return output_manager_default.log(`${import_chalk254.default.cyan("Success!")} Project ${import_chalk254.default.bold(name)} removed ${import_chalk254.default.gray(`[${elapsed2}]`)}`),0}async function readConfirmation3(client,projectName){return output_manager_default.print(prependEmoji(`The project ${import_chalk254.default.bold(projectName)} will be removed permanently.
|
|
1093
1093
|
It will also delete everything under the project including deployments.
|
|
1094
|
-
`,emoji("warning"))),await client.input.confirm(`${import_chalk254.default.bold.red("Are you sure?")}`,!1)}var
|
|
1094
|
+
`,emoji("warning"))),await client.input.confirm(`${import_chalk254.default.bold.red("Are you sure?")}`,!1)}var ProjectDangerouslyDeleteImmutableStaticAssetTelemetryClient=class extends TelemetryClient{trackCliArgumentPath(path3){path3&&this.trackCliArgument({arg:"path",value:this.redactedValue})}};async function dangerouslyDeleteImmutableStaticAsset(client,argv){let telemetry2=new ProjectDangerouslyDeleteImmutableStaticAssetTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(dangerouslyDeleteImmutableStaticAssetSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(err){return printError(err),1}let[path3]=parsedArgs.args;if(!path3)return output_manager_default.error(`Missing required argument. Usage: ${getCommandName("project dangerously-delete-immutable-static-asset <path>")}`),1;telemetry2.trackCliArgumentPath(path3);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;if(client.config.currentTeam=org.type==="team"?org.id:void 0,!canPrompt(client)){let globalFlags=getGlobalFlagsFromArgs(client.argv.slice(2)).filter(flag=>!flag.startsWith("--non-interactive")),interactiveCommand=getCommandNamePlain(`project dangerously-delete-immutable-static-asset ${quoteArg(path3)} --project ${quoteArg(project.id)} ${globalFlags.map(quoteArg).join(" ")}`.trim());return outputActionRequired(client,{status:AGENT_STATUS.ACTION_REQUIRED,reason:AGENT_REASON.INTERACTIVE_CONFIRMATION_REQUIRED,action:AGENT_ACTION.CONFIRMATION_REQUIRED,message:"Deleting an immutable static asset permanently removes it from storage and cannot be undone. This cannot be confirmed non-interactively. The user must run this command in a terminal and type the asset path to confirm.",userActionRequired:!0,hint:"This action can not be automated so it should be surfaced to the user.",next:[{command:interactiveCommand,when:"user runs this command in an interactive terminal"}]},1),output_manager_default.error("This command must be run interactively because it permanently deletes the asset from storage."),1}if(output_manager_default.print(prependEmoji(`Deleting immutable static asset ${path3} for project ${project.name} permanently removes it from storage for the production and preview environments. This cannot be undone. Requests to this URL will serve 410 for 7 days and then 404.
|
|
1095
|
+
`,emoji("warning"))),await client.input.text({message:`Type ${path3} to confirm the permanent deletion:`})!==path3)return output_manager_default.log("Canceled"),0;try{await client.fetch(`/v1/edge-cache/dangerously-delete-immutable-static?projectIdOrName=${project.id}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:path3}),retry:{retries:0}})}catch(err){if(isAPIError(err)){if(err.code==="challenge_required")return output_manager_default.error(`This action requires a recent authentication. Run ${getCommandName("login")} and retry.`),1;if(err.status===404)return output_manager_default.error(err.code==="asset_not_found"&&err.serverMessage?err.serverMessage:"Project or asset not found."),1;if(err.status===400)return output_manager_default.error(err.serverMessage||"Invalid request."),1;if(err.status===403)return output_manager_default.error(err.serverMessage||"You do not have permission to delete this asset."),1}return printError(err),output_manager_default.log("The deletion outcome is unknown. Re-run to verify: a not-found response on re-run means this attempt succeeded and the URL now serves 410."),1}return output_manager_default.print(prependEmoji(`Successfully deleted immutable static asset ${path3}; its URL now serves 410`,emoji("success"))+`
|
|
1096
|
+
`),0}var import_chalk255=__toESM(require_source(),1);var ProjectPauseTelemetryClient=class extends TelemetryClient{trackCliArgumentProject(value){value&&this.trackCliArgument({arg:"project",value:this.redactedValue})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function pause2(client,argv){let telemetry2=new ProjectPauseTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(pauseSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),1}let{args,flags}=parsedArgs;if(args.length>1)return output_manager_default.error(`Invalid number of arguments. Usage: ${import_chalk255.default.cyan(getCommandName("project pause [project]"))}`),2;let formatResult=validateJsonOutput(flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),1;let asJson=formatResult.jsonOutput;if(telemetry2.trackCliArgumentProject(args[0]),telemetry2.trackCliOptionFormat(flags["--format"]),telemetry2.trackCliFlagJson(flags["--json"]),!canPrompt(client)){let globalFlags=getGlobalFlagsFromArgs(client.argv.slice(2)).filter(flag=>flag!=="--non-interactive"),interactiveCommand=getCommandNamePlain(`project pause ${args[0]?`${args[0]} `:""}${globalFlags.join(" ")}`.trim());return outputActionRequired(client,{status:AGENT_STATUS.ACTION_REQUIRED,reason:AGENT_REASON.INTERACTIVE_CONFIRMATION_REQUIRED,action:AGENT_ACTION.CONFIRMATION_REQUIRED,message:"Pausing a project stops serving production traffic and visitors will see an error page. This cannot be confirmed non-interactively: the user must run this command in a terminal and type the project name to confirm.",userActionRequired:!0,hint:"Surface this to the user; the confirmation cannot be automated.",next:[{command:interactiveCommand,when:"user runs this command in an interactive terminal"}]},1),output_manager_default.error("This command must be run interactively because it pauses production traffic."),1}let project;try{project=await getProjectByCwdOrLink({client,commandName:"project pause",projectNameOrId:args[0],forReadOnlyCommand:!0})}catch(error){return printError(error),1}if(output_manager_default.print(prependEmoji(`Pausing ${import_chalk255.default.bold(project.name)} will stop serving production traffic and visitors will see an error page.
|
|
1095
1097
|
`,emoji("warning"))),await client.input.text({message:`Type ${project.name} to confirm pausing production traffic:`})!==project.name)return output_manager_default.log("Canceled"),0;let pauseStamp=stamp_default();try{await client.fetch(`/v1/projects/${encodeURIComponent(project.id)}/pause`,{method:"POST"})}catch(err){if(isAPIError(err)){if(err.status===404)return output_manager_default.error("Project not found."),1;if(err.status===403)return output_manager_default.error(err.serverMessage||"You do not have permission to pause this project."),1}return printError(err),1}return asJson?(client.stdout.write(`${JSON.stringify({id:project.id,name:project.name,paused:!0},null,2)}
|
|
1096
1098
|
`),0):(output_manager_default.success(`Production traffic for ${import_chalk255.default.bold(project.name)} paused ${import_chalk255.default.gray(pauseStamp())}`),0)}var import_chalk256=__toESM(require_source(),1);var ProjectResumeTelemetryClient=class extends TelemetryClient{trackCliArgumentProject(value){value&&this.trackCliArgument({arg:"project",value:this.redactedValue})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};async function resume2(client,argv){let telemetry2=new ProjectResumeTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(resumeSubcommand.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),1}let{args,flags}=parsedArgs,formatResult=validateJsonOutput(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),1;let{jsonOutput}=formatResult,asJson=jsonOutput||!canPrompt(client);function fail(reason,message,humanMessage=message,exitCode2=1){return shouldEmitNonInteractiveCommandError(client)?(outputAgentError(client,{status:AGENT_STATUS.ERROR,reason,message},exitCode2),exitCode2):jsonOutput||!canPrompt(client)?(client.stdout.write(`${JSON.stringify({status:AGENT_STATUS.ERROR,reason,message},null,2)}
|
|
1097
1099
|
`),exitCode2):(output_manager_default.error(humanMessage),exitCode2)}if(args.length>1)return fail(AGENT_REASON.MISSING_ARGUMENTS,`Invalid number of arguments. Usage: ${getCommandName("project resume [project]")}`,`Invalid number of arguments. Usage: ${import_chalk256.default.cyan(getCommandName("project resume [project]"))}`,2);if(telemetry2.trackCliArgumentProject(args[0]),telemetry2.trackCliOptionFormat(flags["--format"]),telemetry2.trackCliFlagJson(flags["--json"]),!canPrompt(client)){let globalFlags=getGlobalFlagsFromArgs(client.argv.slice(2)).filter(flag=>flag!=="--non-interactive"),interactiveCommand=getCommandNamePlain(`project resume ${args[0]?`${args[0]} `:""}${globalFlags.join(" ")}`.trim());return outputActionRequired(client,{status:AGENT_STATUS.ACTION_REQUIRED,reason:AGENT_REASON.CONFIRMATION_REQUIRED,action:AGENT_ACTION.CONFIRMATION_REQUIRED,message:"Resuming a project restores production traffic. 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:interactiveCommand,when:"user runs this command in an interactive terminal"}]},1),output_manager_default.error("This command must be run interactively because it resumes production traffic."),1}let project;try{project=await getProjectByCwdOrLink({client,commandName:"project resume",projectNameOrId:args[0],forReadOnlyCommand:!0})}catch(error){return fail(error instanceof ProjectNotFound?AGENT_REASON.PROJECT_NOT_FOUND:error instanceof LinkRequiredError?AGENT_REASON.NOT_LINKED:AGENT_REASON.API_ERROR,error instanceof Error?error.message:String(error))}if(!await client.input.confirm(`Resume production traffic for ${project.name}?`,!1))return output_manager_default.log("Canceled"),0;let resumeStamp=stamp_default();try{await client.fetch(`/v1/projects/${encodeURIComponent(project.id)}/unpause`,{method:"POST"})}catch(err){if(isAPIError(err)){if(err.status===404)return fail(AGENT_REASON.NOT_FOUND,"Project not found.");if(err.status===403)return fail("forbidden",err.serverMessage||"You do not have permission to resume this project.")}return fail(AGENT_REASON.API_ERROR,err instanceof Error?err.message:String(err))}return asJson?(client.stdout.write(`${JSON.stringify({id:project.id,name:project.name,paused:!1},null,2)}
|
|
@@ -1111,7 +1113,7 @@ ${err}`),1)}}var import_chalk258=__toESM(require_source(),1);async function setS
|
|
|
1111
1113
|
`,emoji("warning"))),await client.input.confirm(`Disable Observability Plus for ${project.name}?`,!1)?setObservability(client,project,!1,asJson):(output_manager_default.log("Canceled"),0);let{team}=await getScope(client);return team?team.billing?.plan==="hobby"?(output_manager_default.error("Observability Plus requires an active Pro or Enterprise plan."),output_manager_default.log(`Upgrade with ${getCommandName("buy pro")}.`),1):(output_manager_default.print(prependEmoji(`Enabling Observability Plus for ${import_chalk260.default.bold(project.name)} will incur charges on your account.
|
|
1112
1114
|
`,emoji("warning"))),await client.input.confirm(`Enable Observability Plus for ${project.name}?`,!1)?setObservability(client,project,!0,asJson):(output_manager_default.log("Canceled"),0)):(output_manager_default.error("Observability Plus requires a team. Use --scope to specify one."),1)}var import_chalk261=__toESM(require_source(),1),PROTECTION_ACTIONS=["enable","disable"],DEFAULT_SKEW_PROTECTION_MAX_AGE=2592e3,ENABLED_DEPLOYMENT_TYPE="prod_deployment_urls_and_all_previews",MAX_PROTECTION_PASSWORD_LENGTH=72;function validateProtectionPassword(value){let password=value.trim();return password===""?{ok:!1,message:"Invalid --protection-password: expected a non-empty password string."}:password.length>MAX_PROTECTION_PASSWORD_LENGTH?{ok:!1,message:`Invalid --protection-password: password must be at most ${MAX_PROTECTION_PASSWORD_LENGTH} characters.`}:{ok:!0,password}}function parseSkewMaxAgeSeconds(value){let trimmed=value.trim();if(trimmed===""||!/^\d+$/.test(trimmed))return{ok:!1,message:"Invalid --skew-max-age: expected a positive integer (seconds), e.g. 604800."};let n=Number(trimmed);return!Number.isSafeInteger(n)||n<=0?{ok:!1,message:"Invalid --skew-max-age: value must be a positive integer within safe range."}:{ok:!0,seconds:n}}var PROTECTION_KEYS=["passwordProtection","ssoProtection","skewProtectionMaxAge","customerSupportCodeVisibility","gitForkProtection","protectionBypass"];function isProtectionAction(v){return!!v&&PROTECTION_ACTIONS.includes(v)}async function protection(client,argv){let parsedArgs,flagsSpecification=getFlagsSpecification(protectionSubcommand.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return outputAgentError(client,{status:"error",reason:AGENT_REASON.INVALID_ARGUMENTS,message:error instanceof Error?error.message:String(error)},1),printError(error),1}let actionArg=parsedArgs.args[0],action=isProtectionAction(actionArg)?actionArg:void 0;if(!action&&parsedArgs.args.length>1)return outputAgentError(client,{status:"error",reason:AGENT_REASON.INVALID_ARGUMENTS,message:"Invalid arguments. Usage: `vercel project protection [name]`",next:[{command:buildCommandWithGlobalFlags(client.argv,"project protection"),when:"Show deployment protection for the linked project"}]},2),output_manager_default.error("Invalid arguments. Usage: `vercel project protection [name]`"),2;if(action&&parsedArgs.args.length>2)return outputAgentError(client,{status:"error",reason:AGENT_REASON.INVALID_ARGUMENTS,message:`Invalid arguments. Usage: \`vercel project protection ${action} [name]\``,next:[{command:buildCommandWithGlobalFlags(client.argv,`project protection ${action}`),when:"Retry with at most one project name"}]},2),output_manager_default.error(`Invalid arguments. Usage: \`vercel project protection ${action} [name]\``),2;let formatResult=validateJsonOutput(parsedArgs.flags);if(!formatResult.valid)return outputAgentError(client,{status:"error",reason:AGENT_REASON.INVALID_ARGUMENTS,message:formatResult.error},1),output_manager_default.error(formatResult.error),1;let preferJson=formatResult.jsonOutput||!!client.nonInteractive,skewMaxAgeFlag=parsedArgs.flags["--skew-max-age"];if(action==="disable"&&skewMaxAgeFlag!==void 0){let msg="`--skew-max-age` can only be used with `project protection enable`.";return outputAgentError(client,{status:"error",reason:AGENT_REASON.INVALID_ARGUMENTS,message:msg,hint:"Use `project protection disable ... --skew` to turn skew protection off."},2),output_manager_default.error(msg),2}let enableSkewMaxAgeSeconds;if(action==="enable"&&skewMaxAgeFlag!==void 0){let parsed=parseSkewMaxAgeSeconds(skewMaxAgeFlag);if(!parsed.ok)return outputAgentError(client,{status:"error",reason:AGENT_REASON.INVALID_ARGUMENTS,message:parsed.message,hint:"Pass a positive integer number of seconds (e.g. 604800 for 7 days).",next:[{command:buildCommandWithGlobalFlags(client.argv,"project protection enable --skew --skew-max-age 604800"),when:"Example with a valid max age in seconds"}]},1),output_manager_default.error(parsed.message),1;enableSkewMaxAgeSeconds=parsed.seconds}let ssoSelected=!!parsedArgs.flags["--sso"],passwordSelected=!!parsedArgs.flags["--password"],protectionPasswordFlag=parsedArgs.flags["--protection-password"],customerSupportCodeVisibilitySelected=!!parsedArgs.flags["--customer-support-code-visibility"],skewSelected=!!parsedArgs.flags["--skew"],bypassSelected=!!parsedArgs.flags["--protection-bypass"],protectionBypassSecret=parsedArgs.flags["--protection-bypass-secret"],gitForkProtectionSelected=!!parsedArgs.flags["--git-fork-protection"];if(protectionPasswordFlag!==void 0&&!passwordSelected){let msg="`--protection-password` requires `--password`. Usage: `vercel project protection enable [name] --password --protection-password <password>`";return outputAgentError(client,{status:"error",reason:AGENT_REASON.INVALID_ARGUMENTS,message:msg,hint:"Pass --password together with --protection-password when enabling password protection.",next:[{command:buildCommandWithGlobalFlags(client.argv,"project protection enable --password --protection-password <password>"),when:"Replace <password> with the deployment protection password"}]},2),output_manager_default.error(msg),2}if(action==="disable"&&protectionPasswordFlag!==void 0){let msg="`--protection-password` can only be used with `project protection enable`.";return outputAgentError(client,{status:"error",reason:AGENT_REASON.INVALID_ARGUMENTS,message:msg,hint:"Use `project protection disable ... --password` to turn password protection off."},2),output_manager_default.error(msg),2}let protectionPassword;if(action==="enable"&&protectionPasswordFlag!==void 0){let parsed=validateProtectionPassword(protectionPasswordFlag);if(!parsed.ok)return outputAgentError(client,{status:"error",reason:AGENT_REASON.INVALID_ARGUMENTS,message:parsed.message,hint:`Pass a password string up to ${MAX_PROTECTION_PASSWORD_LENGTH} characters.`,next:[{command:buildCommandWithGlobalFlags(client.argv,"project protection enable --password --protection-password <password>"),when:"Replace <password> with a valid deployment protection password"}]},1),output_manager_default.error(parsed.message),1;protectionPassword=parsed.password}if(action&&!ssoSelected&&!passwordSelected&&!customerSupportCodeVisibilitySelected&&!skewSelected&&!bypassSelected&&!gitForkProtectionSelected){let msg="No protection selected. Pass --sso, --password, --customer-support-code-visibility, --skew, --protection-bypass, or --git-fork-protection. Usage: `vercel project protection enable|disable [name] --sso|--password|--customer-support-code-visibility|--skew|--protection-bypass|--git-fork-protection`";return outputAgentError(client,{status:"error",reason:AGENT_REASON.MISSING_ARGUMENTS,message:msg,hint:"Use `project protection enable|disable` with a protection flag (e.g. --sso, --password, --customer-support-code-visibility, --skew, --protection-bypass, or --git-fork-protection).",next:[{command:buildCommandWithGlobalFlags(client.argv,`project protection ${action} --sso`),when:"Example: same action with SSO protection selected"},{command:buildCommandWithGlobalFlags(client.argv,`project protection ${action} --password`),when:"Example: same action with password protection selected"},{command:buildCommandWithGlobalFlags(client.argv,`project protection ${action} --customer-support-code-visibility`),when:"Example: same action with customer support code visibility selected"},{command:buildCommandWithGlobalFlags(client.argv,`project protection ${action} --skew`),when:"Example: same action with skew protection selected"},{command:buildCommandWithGlobalFlags(client.argv,`project protection ${action} --protection-bypass`),when:"Example: same action with automation protection bypass"},{command:buildCommandWithGlobalFlags(client.argv,`project protection ${action} --git-fork-protection`),when:"Example: same action with Git fork protection selected"}]},2),output_manager_default.error(msg),2}let project;try{project=await getProjectByCwdOrLink({client,commandName:"project protection",projectNameOrId:action?parsedArgs.args[1]:parsedArgs.args[0],forReadOnlyCommand:!action})}catch(err){return exitWithNonInteractiveError(client,err,1,{variant:"protection"}),printError(err),1}if(action){let skewProtectionMaxAge=action==="enable"?enableSkewMaxAgeSeconds??DEFAULT_SKEW_PROTECTION_MAX_AGE:0;if(bypassSelected){if(action==="disable"&&!protectionBypassSecret){let secretMsg="Disabling protection bypass requires --protection-bypass-secret <secret>.";return outputAgentError(client,{status:"error",reason:AGENT_REASON.MISSING_ARGUMENTS,message:secretMsg,hint:"Pass the existing automation bypass secret to revoke it.",next:[{command:buildCommandWithGlobalFlags(client.argv,"project protection disable --protection-bypass --protection-bypass-secret <secret>"),when:"Replace <secret> with the bypass secret to revoke"}]},2),output_manager_default.error(secretMsg),2}try{let bypassBody=action==="enable"?{generate:protectionBypassSecret?{secret:protectionBypassSecret}:{}}:{revoke:{secret:protectionBypassSecret,regenerate:!1}};await client.fetch(`/v1/projects/${encodeURIComponent(project.id)}/protection-bypass`,{method:"PATCH",body:bypassBody})}catch(err){return exitWithNonInteractiveError(client,err,1,{variant:"protection"}),printError(err),1}}let patchBody={};if(ssoSelected&&(patchBody.ssoProtection=action==="enable"?{deploymentType:ENABLED_DEPLOYMENT_TYPE}:null),passwordSelected&&(patchBody.passwordProtection=action==="enable"?{deploymentType:ENABLED_DEPLOYMENT_TYPE,...protectionPassword?{password:protectionPassword}:{}}:null),customerSupportCodeVisibilitySelected&&(patchBody.customerSupportCodeVisibility=action==="enable"),skewSelected&&(patchBody.skewProtectionMaxAge=skewProtectionMaxAge),gitForkProtectionSelected&&(patchBody.gitForkProtection=action==="enable"),Object.keys(patchBody).length>0)try{await client.fetch(`/v9/projects/${encodeURIComponent(project.id)}`,{method:"PATCH",body:patchBody})}catch(err){return exitWithNonInteractiveError(client,err,1,{variant:"protection"}),printError(err),1}return preferJson?(client.stdout.write(`${JSON.stringify({action,projectId:project.id,projectName:project.name,ssoProtection:ssoSelected?action==="enable":void 0,passwordProtection:passwordSelected?action==="enable":void 0,customerSupportCodeVisibility:customerSupportCodeVisibilitySelected?action==="enable":void 0,skewProtection:skewSelected?action==="enable":void 0,...skewSelected?action==="enable"?{skewProtectionMaxAge}:{skewProtectionMaxAge:0}:{},protectionBypass:bypassSelected?action==="enable":void 0,gitForkProtection:gitForkProtectionSelected?action==="enable":void 0},null,2)}
|
|
1113
1115
|
`),0):(output_manager_default.log(`${import_chalk261.default.bold("Deployment protection")} ${action==="enable"?"enabled":"disabled"} for ${import_chalk261.default.cyan(project.name)}`),0)}let raw=project,slice={};for(let key of PROTECTION_KEYS)key in raw&&(slice[key]=raw[key]);if(preferJson)return client.stdout.write(`${JSON.stringify({projectId:project.id,name:project.name,...slice},null,2)}
|
|
1114
|
-
`),0;if(output_manager_default.log(`${import_chalk261.default.bold("Protection settings")} for ${import_chalk261.default.cyan(project.name)} (${project.id})`),Object.keys(slice).length===0)return output_manager_default.log("No deployment protection fields returned for this project."),0;for(let[k,v]of Object.entries(slice))output_manager_default.log(`${import_chalk261.default.cyan(`${k}:`)} ${JSON.stringify(v)}`);return 0}var COMMAND_CONFIG52={inspect:getCommandAliases(inspectSubcommand11),list:getCommandAliases(listSubcommand17),members:getCommandAliases(membersSubcommand),accessGroups:getCommandAliases(accessGroupsSubcommand),add:getCommandAliases(addSubcommand8),"access-summary":getCommandAliases(accessSummarySubcommand),checks:getCommandAliases(checksSubcommand),protection:getCommandAliases(protectionSubcommand),update:getCommandAliases(updateSubcommand8),rename:getCommandAliases(renameSubcommand),remove:getCommandAliases(removeSubcommand13),token:getCommandAliases(tokenSubcommand2),speedInsights:getCommandAliases(speedInsightsSubcommand),webAnalytics:getCommandAliases(webAnalyticsSubcommand),pause:getCommandAliases(pauseSubcommand),observability:getCommandAliases(observabilitySubcommand),resume:getCommandAliases(resumeSubcommand)};async function main28(client){let telemetry2=new ProjectTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(projectCommand.options),parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(error){return printError(error,client),1}let{subcommand,args,subcommandOriginal}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG52),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("project"),output_manager_default.print(help(projectCommand,{columns:client.stderr.columns})),0;function printHelp(command2){return output_manager_default.print(help(command2,{parent:projectCommand,columns:client.stderr.columns})),0}parsedArgs.args[1]||(subcommand="list");let exitCode2;switch(subcommand){case"inspect":if(needHelp)return telemetry2.trackCliFlagHelp("project",subcommandOriginal),printHelp(inspectSubcommand11);telemetry2.trackCliSubcommandInspect(subcommandOriginal),exitCode2=await inspect16(client,args);break;case"list":if(needHelp)return telemetry2.trackCliFlagHelp("project",subcommandOriginal),printHelp(listSubcommand17);telemetry2.trackCliSubcommandList(subcommandOriginal),exitCode2=await list21(client,args);break;case"add":if(needHelp)return telemetry2.trackCliFlagHelp("project",subcommandOriginal),printHelp(addSubcommand8);telemetry2.trackCliSubcommandAdd(subcommandOriginal),exitCode2=await add11(client,args);break;case"access-summary":if(needHelp)return telemetry2.trackCliFlagHelp("project",subcommandOriginal),printHelp(accessSummarySubcommand);telemetry2.trackCliSubcommandAccessSummary(subcommandOriginal),exitCode2=await accessSummary(client,args);break;case"checks":if(needHelp)return telemetry2.trackCliFlagHelp("project",subcommandOriginal),printHelp(checksSubcommand);telemetry2.trackCliSubcommandChecks(args[0]==="add"?"checks add":args[0]==="remove"||args[0]==="rm"?"checks remove":subcommandOriginal),exitCode2=await checks(client,args);break;case"members":if(needHelp)return telemetry2.trackCliFlagHelp("project",subcommandOriginal),printHelp(membersSubcommand);telemetry2.trackCliSubcommandMembers(args[0]==="add"?"members add":args[0]==="remove"||args[0]==="rm"?"members remove":subcommandOriginal),exitCode2=await members(client,args);break;case"accessGroups":if(needHelp)return telemetry2.trackCliFlagHelp("project",subcommandOriginal),printHelp(accessGroupsSubcommand);telemetry2.trackCliSubcommandAccessGroups(subcommandOriginal),exitCode2=await accessGroups(client,args);break;case"protection":if(needHelp)return telemetry2.trackCliFlagHelp("project",subcommandOriginal),printHelp(protectionSubcommand);telemetry2.trackCliSubcommandProtection(args[0]==="enable"?"protection enable":args[0]==="disable"?"protection disable":subcommandOriginal),exitCode2=await protection(client,args);break;case"webAnalytics":if(needHelp)return telemetry2.trackCliFlagHelp("project",subcommandOriginal),printHelp(webAnalyticsSubcommand);telemetry2.trackCliSubcommandWebAnalytics(args[0]==="enable"?"web-analytics enable":args[0]==="disable"?"web-analytics disable":subcommandOriginal),exitCode2=await webAnalytics(client,args);break;case"speedInsights":if(needHelp)return telemetry2.trackCliFlagHelp("project",subcommandOriginal),printHelp(speedInsightsSubcommand);telemetry2.trackCliSubcommandSpeedInsights(args[0]==="enable"?"speed-insights enable":args[0]==="disable"?"speed-insights disable":subcommandOriginal),exitCode2=await speedInsights(client,args);break;case"pause":if(needHelp)return telemetry2.trackCliFlagHelp("project",subcommandOriginal),printHelp(pauseSubcommand);telemetry2.trackCliSubcommandPause(subcommandOriginal),exitCode2=await pause2(client,args);break;case"observability":if(needHelp)return telemetry2.trackCliFlagHelp("project",subcommandOriginal),printHelp(observabilitySubcommand);telemetry2.trackCliSubcommandObservability(args[0]==="enable"?"observability enable":args[0]==="disable"?"observability disable":subcommandOriginal),exitCode2=await observability(client,args);break;case"resume":if(needHelp)return telemetry2.trackCliFlagHelp("project",subcommandOriginal),printHelp(resumeSubcommand);telemetry2.trackCliSubcommandResume(subcommandOriginal),exitCode2=await resume2(client,args);break;case"token":if(needHelp)return telemetry2.trackCliFlagHelp("project",subcommandOriginal),printHelp(tokenSubcommand2);telemetry2.trackCliSubcommandToken(subcommandOriginal),exitCode2=await getOidcToken(client,args);break;case"rename":if(needHelp)return telemetry2.trackCliFlagHelp("project",subcommandOriginal),printHelp(renameSubcommand);telemetry2.trackCliSubcommandRename(subcommandOriginal),exitCode2=await rename(client,args);break;case"update":if(needHelp)return telemetry2.trackCliFlagHelp("project",subcommandOriginal),printHelp(updateSubcommand8);telemetry2.trackCliSubcommandUpdate(subcommandOriginal),exitCode2=await update6(client,args);break;case"remove":if(needHelp)return telemetry2.trackCliFlagHelp("project",subcommandOriginal),printHelp(removeSubcommand13);telemetry2.trackCliSubcommandRemove(subcommandOriginal),exitCode2=await rm9(client,args);break;default:{if(handleCommandTypo({client,command:parsedArgs.args[1],availableCommands:projectCommand.subcommands}))return 2;let fallback=await tryOpenApiFallback(client,parsedArgs.args.slice(1),resolveOpenApiTagForProjectsCli);if(fallback!==null){exitCode2=fallback;break}return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG52)),output_manager_default.print(help(projectCommand,{columns:client.stderr.columns})),2}}return exitCode2===0&&await autoInstallVercelPlugin(client),exitCode2}var import_ms29=__toESM(require_ms(),1);var import_error_utils20=__toESM(require_dist(),1);var import_chalk265=__toESM(require_source(),1);var import_chalk262=__toESM(require_source(),1);async function getProjectByDeployment({client,deployId}){let{config}=client,{contextName}=await getScope(client);if(!isValidName(deployId))throw new Error(`The provided argument "${deployId}" is not a valid deployment ID or URL`);let deployment,team;try{output_manager_default?.spinner(`Fetching deployment "${deployId}" in ${import_chalk262.default.bold(contextName)}\u2026`);let[teamResult,deploymentResult]=await Promise.allSettled([config.currentTeam?getTeamByIdOrSlug(client,config.currentTeam):void 0,getDeployment(client,contextName,deployId)]);if(teamResult.status==="rejected")throw new Error(`Failed to retrieve team information: ${teamResult.reason}`);if(deploymentResult.status==="rejected")throw new Error(deploymentResult.reason);if(team=teamResult.value,deployment=deploymentResult.value,output_manager_default?.log(`Fetching deployment "${deployId}" in ${import_chalk262.default.bold(contextName)}\u2026`),deployment.team?.id){if(!team||deployment.team.id!==team.id){let err=new Error(team?`Deployment doesn't belong to current team ${import_chalk262.default.bold(contextName)}`:"Deployment belongs to a different team");throw err.code="ERR_INVALID_TEAM",err}}else if(team){let err=new Error(`Deployment doesn't belong to current team ${import_chalk262.default.bold(contextName)}`);throw err.code="ERR_INVALID_TEAM",err}if(!deployment.projectId)throw new Error("Deployment is not associated to a project");let project=await getProjectByNameOrId(client,deployment.projectId);if(project instanceof ProjectNotFound)throw project;return{contextName,deployment,project}}finally{output_manager_default?.stopSpinner()}}var import_ms28=__toESM(require_ms(),1);var import_chalk264=__toESM(require_source(),1);var import_ms27=__toESM(require_ms(),1);var import_chalk263=__toESM(require_source(),1);function renderAliasStatus(status6){return status6==="completed"?import_chalk263.default.green(status6):status6==="failed"?import_chalk263.default.red(status6):status6==="skipped"?import_chalk263.default.gray(status6):import_chalk263.default.yellow(status6)}async function requestRollingRelease({client,projectId,teamId}){let{rollingRelease:rollingRelease2}=await client.fetch(`/v1/projects/${projectId}/rolling-release?teamId=${teamId}`);return rollingRelease2}async function promoteStatus({client,contextName,deployment,project,timeout="3m"}){let recentThreshold=Date.now()-(0,import_ms27.default)("3m"),promoteTimeout=Date.now()+(0,import_ms27.default)(timeout),counter=0,spinnerMessage=deployment?"Promote in progress":`Checking promotion status of ${project.name}`;contextName||({contextName}=await getScope(client));try{for(output_manager_default.spinner(`${spinnerMessage}\u2026`);;){let projectCheck=await getProjectByNameOrId(client,project.id,project.accountId,!0);if(projectCheck instanceof ProjectNotFound)throw projectCheck;if(projectCheck.rollingRelease){output_manager_default.log("Rolling Releases enabled \u2026");let rr=await requestRollingRelease({client,projectId:project.id,teamId:project.accountId});if(rr.activeStage)return output_manager_default.stopSpinner(),output_manager_default.log(`Rolling Release serving traffic at initial percentage ${rr.activeStage.targetPercentage}`),0;continue}let{jobStatus,requestedAt,toDeploymentId,type}=projectCheck.lastAliasRequest??{};if((!jobStatus||jobStatus!=="in-progress"&&jobStatus!=="pending")&&(output_manager_default.stopSpinner(),output_manager_default.log(`${spinnerMessage}\u2026`)),!jobStatus||!requestedAt||!toDeploymentId||requestedAt<recentThreshold)return output_manager_default.log("No deployment promotion in progress"),0;if(jobStatus==="skipped"&&type==="promote")return output_manager_default.log("Promote deployment was skipped"),0;if(jobStatus==="succeeded")return await renderJobSucceeded({client,contextName,performingPromote:!!deployment,requestedAt,project,toDeploymentId});if(jobStatus==="failed")return await renderJobFailed({client,contextName,deployment,project,toDeploymentId});if(jobStatus!=="pending"&&jobStatus!=="in-progress")return output_manager_default.log(`Unknown promote deployment status "${jobStatus}"`),1;if(requestedAt<recentThreshold||Date.now()>=promoteTimeout)return output_manager_default.log(`The promotion exceeded its deadline - rerun ${import_chalk264.default.bold(`${packageName} promote ${toDeploymentId}`)} to try again`),1;counter++===0&&!deployment&&(spinnerMessage+=` requested at ${formatDate(requestedAt)}`),output_manager_default.spinner(`${spinnerMessage}\u2026`),await sleep(250)}}finally{output_manager_default.stopSpinner()}}async function renderJobFailed({client,contextName,deployment,project,toDeploymentId}){try{let name=(deployment||await getDeployment(client,contextName,toDeploymentId))?.url;output_manager_default.error(`Failed to remap all aliases to the requested deployment ${name} (${toDeploymentId})`)}catch{output_manager_default.error(`Failed to remap all aliases to the requested deployment ${toDeploymentId}`)}let nextTimestamp;for(;;){let url=`/v9/projects/${project.id}/promote/aliases?failedOnly=true&limit=20`;nextTimestamp&&(url+=`&until=${nextTimestamp}`);let{aliases:aliases2,pagination}=await client.fetch(url);for(let{alias:alias2,status:status6}of aliases2)output_manager_default.log(` ${renderAliasStatus(status6).padEnd(11)} ${alias2.alias} (${alias2.deploymentId})`);if(pagination?.next)nextTimestamp=pagination.next;else break}return 1}async function renderJobSucceeded({client,contextName,performingPromote,project,requestedAt,toDeploymentId}){let deploymentInfo="";try{let deployment=await getDeployment(client,contextName,toDeploymentId);deploymentInfo=`${import_chalk264.default.bold(deployment.url)} (${toDeploymentId})`}catch(err){output_manager_default.debug(`Failed to get deployment url for ${toDeploymentId}: ${err?.toString()||err}`),deploymentInfo=import_chalk264.default.bold(toDeploymentId)}let duration=performingPromote?elapsed(Date.now()-requestedAt):"";return output_manager_default.log(`Success! ${import_chalk264.default.bold(project.name)} was promoted to ${deploymentInfo} ${duration}`),0}async function requestPromote({client,deployId,timeout,yes}){let{contextName,deployment,project}=await getProjectByDeployment({client,deployId}),promoteByCreation=!1;if(deployment.target!=="production")if(yes)promoteByCreation=!0;else{let question="This deployment is not a production deployment and cannot be directly promoted. A new deployment will be built using your production environment. Are you sure you want to continue?";if(promoteByCreation=await client.input.confirm(question,!1),!promoteByCreation)return output_manager_default.error("Canceled"),0}if(promoteByCreation){let newDeployment=await client.fetch(`/v13/deployments?teamId=${deployment.ownerId}`,{body:{deploymentId:deployment.id,name:project.name,target:"production",meta:{action:"promote"}},accountId:deployment.ownerId,method:"POST"});return output_manager_default.log(`Successfully created new deployment of ${import_chalk265.default.bold(project.name)} at ${newDeployment.inspectorUrl}`),0}return(await client.fetch(`/v10/projects/${project.id}/promote/${deployment.id}`,{body:{},json:!1,method:"POST"})).status===202?(output_manager_default.log("Promotion has been queued and will begin when the active rolling release completes successfully."),0):timeout!==void 0&&(0,import_ms28.default)(timeout)===0?(output_manager_default.log(`Successfully requested promote of ${import_chalk265.default.bold(project.name)} to ${deployment.url} (${deployment.id})`),output_manager_default.log(`To check promote status, run ${getCommandName("promote")}.`),0):await promoteStatus({client,contextName,deployment,project,timeout})}var PromoteTelemetryClient=class extends TelemetryClient{trackCliArgumentUrlOrDeploymentId(value){value&&this.trackCliArgument({arg:"urlOrDeploymentId",value:this.redactedValue})}trackCliSubcommandStatus(){this.trackCliSubcommand({subcommand:"status",value:"status"})}trackCliOptionTimeout(time){time&&this.trackCliOption({option:"timeout",value:"[TIME]"})}trackCliFlagYes(yes){yes&&this.trackCliFlag("yes")}};var promote_default=async client=>{let parsedArgs,flagsSpecification=getFlagsSpecification(promoteCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(err){return printError(err),1}let telemetry2=new PromoteTelemetryClient({opts:{store:client.telemetryEventStore}}),needHelp=parsedArgs.flags["--help"];if(!parsedArgs.args[1]&&needHelp)return telemetry2.trackCliFlagHelp("promote"),output_manager_default.print(help(promoteCommand,{columns:client.stderr.columns})),2;let yes=parsedArgs.flags["--yes"]??!1;telemetry2.trackCliFlagYes(parsedArgs.flags["--yes"]);let timeout=parsedArgs.flags["--timeout"];if(timeout&&(0,import_ms29.default)(timeout)===void 0)return output_manager_default.error(`Invalid timeout "${timeout}"`),1;telemetry2.trackCliOptionTimeout(parsedArgs.flags["--timeout"]);let actionOrDeployId=parsedArgs.args[1]||"status";try{if(actionOrDeployId==="status"){if(needHelp)return telemetry2.trackCliFlagHelp("promote","status"),output_manager_default.print(help(statusSubcommand3,{columns:client.stderr.columns,parent:promoteCommand})),2;telemetry2.trackCliSubcommandStatus();let project=await getProjectByCwdOrLink({autoConfirm:parsedArgs.flags["--yes"],client,commandName:"promote",projectNameOrId:parsedArgs.args[2]});return await promoteStatus({client,project,timeout})}return telemetry2.trackCliArgumentUrlOrDeploymentId(actionOrDeployId),await requestPromote({client,deployId:actionOrDeployId,timeout,yes})}catch(err){if((0,import_error_utils20.isErrnoException)(err)){if(err.code==="ERR_CANCELED")return 0;if(err.code==="ERR_INVALID_CWD"||err.code==="ERR_LINK_PROJECT")return 1}return output_manager_default.prettyError(err),1}};var import_chalk267=__toESM(require_source(),1),import_client=__toESM(require_dist3(),1);var import_chalk266=__toESM(require_source(),1);async function getDeploymentByIdOrURL({client,contextName,deployIdOrUrl}){let{config}=client;if(!isValidName(deployIdOrUrl))throw new Error(`The provided argument "${deployIdOrUrl}" is not a valid deployment ID or URL`);let deployment,team;try{output_manager_default.spinner(`Fetching deployment "${deployIdOrUrl}" in ${import_chalk266.default.bold(contextName)}\u2026`);let[teamResult,deploymentResult]=await Promise.allSettled([config.currentTeam?getTeamByIdOrSlug(client,config.currentTeam):void 0,getDeployment(client,contextName,deployIdOrUrl)]);if(teamResult.status==="rejected")throw new Error(`Failed to retrieve team information: ${teamResult.reason}`);if(deploymentResult.status==="rejected")throw new Error(deploymentResult.reason.message);team=teamResult.value,deployment=deploymentResult.value,output_manager_default.log(`Fetching deployment "${deployIdOrUrl}" in ${import_chalk266.default.bold(contextName)}\u2026`)}finally{output_manager_default.stopSpinner()}if(deployment.team?.id){if(!team||deployment.team.id!==team.id){let err=new Error(team?`Deployment doesn't belong to current team ${import_chalk266.default.bold(contextName)}`:"Deployment belongs to a different team");throw err.code="ERR_INVALID_TEAM",err}}else if(team){let err=new Error(`Deployment doesn't belong to current team ${import_chalk266.default.bold(contextName)}`);throw err.code="ERR_INVALID_TEAM",err}return deployment}var import_error_utils21=__toESM(require_dist(),1);var RedeployTelemetryClient=class extends TelemetryClient{trackCliArgumentUrlOrDeploymentId(value){value&&this.trackCliArgument({arg:"urlOrDeploymentId",value:this.redactedValue})}trackCliFlagNoWait(noWait){noWait&&this.trackCliFlag("no-wait")}trackCliOptionTarget(target){target&&this.trackCliArgument({arg:"target",value:this.redactedTargetName(target)})}};async function redeploy(client){let parsedArgs=null,flagsSpecification=getFlagsSpecification(redeployCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return printError(error),1}let telemetry2=new RedeployTelemetryClient({opts:{store:client.telemetryEventStore}});if(parsedArgs.flags["--help"])return telemetry2.trackCliFlagHelp("redeploy"),output_manager_default.print(help(redeployCommand,{columns:client.stderr.columns})),2;let deployIdOrUrl=parsedArgs.args[1];if(!deployIdOrUrl)return output_manager_default.error(`Missing required deployment id or url: ${getCommandName("redeploy <deployment-id-or-url>")}`),1;telemetry2.trackCliArgumentUrlOrDeploymentId(deployIdOrUrl),telemetry2.trackCliFlagNoWait(parsedArgs.flags["--no-wait"]),telemetry2.trackCliOptionTarget(parsedArgs.flags["--target"]);let{contextName}=await getScope(client),noWait=!!parsedArgs.flags["--no-wait"],targetArgument=parsedArgs.flags["--target"];try{let fromDeployment=await getDeploymentByIdOrURL({client,contextName,deployIdOrUrl}),target,customEnvironmentSlugOrId;targetArgument?targetArgument==="staging"||targetArgument==="production"?target=targetArgument:targetArgument==="preview"?target=void 0:targetArgument?(customEnvironmentSlugOrId=targetArgument,target=void 0):target=fromDeployment.target:(target=fromDeployment.target??void 0,customEnvironmentSlugOrId=fromDeployment.customEnvironment?.id);let customEnvironment;if(fromDeployment?.projectId&&customEnvironmentSlugOrId){let customEnvironments=await getCustomEnvironments(client,fromDeployment.projectId);customEnvironment=pickCustomEnvironment(customEnvironments,customEnvironmentSlugOrId)}if(customEnvironmentSlugOrId&&!customEnvironment)return output_manager_default.error(`The provided argument "${targetArgument}" is not a valid target environment.`),1;let deployStamp=stamp_default();output_manager_default.spinner(`Redeploying project ${fromDeployment.id}`,0);let deployment=await client.fetch("/v13/deployments?forceNew=1",{body:{deploymentId:fromDeployment.id,meta:{action:"redeploy"},name:fromDeployment.name,target,customEnvironmentSlugOrId},method:"POST"});output_manager_default.stopSpinner();let previewUrl=`https://${deployment.url}`,isProdDeployment=target==="production";if(customEnvironmentSlugOrId&&customEnvironment&&(isProdDeployment=customEnvironment.type==="production"),printAlignedLabel("Inspect",import_chalk267.default.cyan(deployment.inspectorUrl)),printAlignedLabel(isProdDeployment?"Production":"Preview",import_chalk267.default.cyan(previewUrl),isProdDeployment&&noWait?{gutter:"\u25B2"}:{}),client.stdout.isTTY||client.stdout.write(`https://${deployment.url}`),!noWait){output_manager_default.spinner(deployment.readyState==="QUEUED"?"Queued\u2026":"Building\u2026",0);let project,rollingRelease2;if(deployment.projectId&&deployment.projectId!=""&&(project=await getProjectByNameOrId(client,deployment.projectId),rollingRelease2=project?.rollingRelease),deployment.readyState==="READY"&&deployment.aliasAssigned&&!rollingRelease2){if(output_manager_default.spinner("Completing\u2026",0),deployment.target==="production"&&deployment.alias&&deployment.alias.length>0){output_manager_default.stopSpinner();let prodUrl=`https://${deployment.alias[0]}`;printAlignedLabel("Aliased",import_chalk267.default.cyan(prodUrl),{gutter:"\u25B2"})}}else try{let clientOptions={dispatcher:getFetchDispatcher(),apiUrl:client.apiUrl,debug:output_manager_default.debugEnabled,path:"",teamId:fromDeployment.team?.id,token:client.authConfig.token,userAgent:ua_default};for await(let event of(0,import_client.checkDeploymentStatus)(deployment,clientOptions))if(event.type==="building")output_manager_default.spinner("Building\u2026",0);else if(event.type==="ready"&&rollingRelease2){output_manager_default.spinner("Releasing\u2026",0),output_manager_default.stopSpinner(),deployment=event.payload;break}else if(event.type==="ready"&&(!event.payload.checksState||event.payload.checksState==="completed"))output_manager_default.spinner("Completing\u2026",0);else if(event.type==="checks-running")output_manager_default.spinner("Running Checks\u2026",0);else if(event.type==="alias-assigned"||event.type==="checks-conclusion-failed"){if(output_manager_default.stopSpinner(),event.type==="alias-assigned"&&!Array.isArray(event.payload)&&event.payload.target==="production"&&event.payload.alias&&event.payload.alias.length>0){let prodUrl=`https://${event.payload.alias[0]}`;printAlignedLabel("Aliased",import_chalk267.default.cyan(prodUrl),{gutter:"\u25B2"})}deployment=event.payload;break}else{if(event.type==="canceled")return output_manager_default.stopSpinner(),output_manager_default.print(`The deployment has been canceled.
|
|
1116
|
+
`),0;if(output_manager_default.log(`${import_chalk261.default.bold("Protection settings")} for ${import_chalk261.default.cyan(project.name)} (${project.id})`),Object.keys(slice).length===0)return output_manager_default.log("No deployment protection fields returned for this project."),0;for(let[k,v]of Object.entries(slice))output_manager_default.log(`${import_chalk261.default.cyan(`${k}:`)} ${JSON.stringify(v)}`);return 0}var COMMAND_CONFIG52={inspect:getCommandAliases(inspectSubcommand11),list:getCommandAliases(listSubcommand17),members:getCommandAliases(membersSubcommand),accessGroups:getCommandAliases(accessGroupsSubcommand),add:getCommandAliases(addSubcommand8),"access-summary":getCommandAliases(accessSummarySubcommand),checks:getCommandAliases(checksSubcommand),protection:getCommandAliases(protectionSubcommand),update:getCommandAliases(updateSubcommand8),rename:getCommandAliases(renameSubcommand),remove:getCommandAliases(removeSubcommand13),token:getCommandAliases(tokenSubcommand2),speedInsights:getCommandAliases(speedInsightsSubcommand),webAnalytics:getCommandAliases(webAnalyticsSubcommand),pause:getCommandAliases(pauseSubcommand),"dangerously-delete-immutable-static-asset":getCommandAliases(dangerouslyDeleteImmutableStaticAssetSubcommand),observability:getCommandAliases(observabilitySubcommand),resume:getCommandAliases(resumeSubcommand)};async function main28(client){let telemetry2=new ProjectTelemetryClient({opts:{store:client.telemetryEventStore}}),flagsSpecification=getFlagsSpecification(projectCommand.options),parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(error){return printError(error,client),1}let{subcommand,args,subcommandOriginal}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG52),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("project"),output_manager_default.print(help(projectCommand,{columns:client.stderr.columns})),0;function printHelp(command2){return output_manager_default.print(help(command2,{parent:projectCommand,columns:client.stderr.columns})),0}parsedArgs.args[1]||(subcommand="list");let exitCode2;switch(subcommand){case"inspect":if(needHelp)return telemetry2.trackCliFlagHelp("project",subcommandOriginal),printHelp(inspectSubcommand11);telemetry2.trackCliSubcommandInspect(subcommandOriginal),exitCode2=await inspect16(client,args);break;case"list":if(needHelp)return telemetry2.trackCliFlagHelp("project",subcommandOriginal),printHelp(listSubcommand17);telemetry2.trackCliSubcommandList(subcommandOriginal),exitCode2=await list21(client,args);break;case"add":if(needHelp)return telemetry2.trackCliFlagHelp("project",subcommandOriginal),printHelp(addSubcommand8);telemetry2.trackCliSubcommandAdd(subcommandOriginal),exitCode2=await add11(client,args);break;case"access-summary":if(needHelp)return telemetry2.trackCliFlagHelp("project",subcommandOriginal),printHelp(accessSummarySubcommand);telemetry2.trackCliSubcommandAccessSummary(subcommandOriginal),exitCode2=await accessSummary(client,args);break;case"checks":if(needHelp)return telemetry2.trackCliFlagHelp("project",subcommandOriginal),printHelp(checksSubcommand);telemetry2.trackCliSubcommandChecks(args[0]==="add"?"checks add":args[0]==="remove"||args[0]==="rm"?"checks remove":subcommandOriginal),exitCode2=await checks(client,args);break;case"members":if(needHelp)return telemetry2.trackCliFlagHelp("project",subcommandOriginal),printHelp(membersSubcommand);telemetry2.trackCliSubcommandMembers(args[0]==="add"?"members add":args[0]==="remove"||args[0]==="rm"?"members remove":subcommandOriginal),exitCode2=await members(client,args);break;case"accessGroups":if(needHelp)return telemetry2.trackCliFlagHelp("project",subcommandOriginal),printHelp(accessGroupsSubcommand);telemetry2.trackCliSubcommandAccessGroups(subcommandOriginal),exitCode2=await accessGroups(client,args);break;case"protection":if(needHelp)return telemetry2.trackCliFlagHelp("project",subcommandOriginal),printHelp(protectionSubcommand);telemetry2.trackCliSubcommandProtection(args[0]==="enable"?"protection enable":args[0]==="disable"?"protection disable":subcommandOriginal),exitCode2=await protection(client,args);break;case"webAnalytics":if(needHelp)return telemetry2.trackCliFlagHelp("project",subcommandOriginal),printHelp(webAnalyticsSubcommand);telemetry2.trackCliSubcommandWebAnalytics(args[0]==="enable"?"web-analytics enable":args[0]==="disable"?"web-analytics disable":subcommandOriginal),exitCode2=await webAnalytics(client,args);break;case"speedInsights":if(needHelp)return telemetry2.trackCliFlagHelp("project",subcommandOriginal),printHelp(speedInsightsSubcommand);telemetry2.trackCliSubcommandSpeedInsights(args[0]==="enable"?"speed-insights enable":args[0]==="disable"?"speed-insights disable":subcommandOriginal),exitCode2=await speedInsights(client,args);break;case"pause":if(needHelp)return telemetry2.trackCliFlagHelp("project",subcommandOriginal),printHelp(pauseSubcommand);telemetry2.trackCliSubcommandPause(subcommandOriginal),exitCode2=await pause2(client,args);break;case"dangerously-delete-immutable-static-asset":if(needHelp)return telemetry2.trackCliFlagHelp("project",subcommandOriginal),printHelp(dangerouslyDeleteImmutableStaticAssetSubcommand);telemetry2.trackCliSubcommandDangerouslyDeleteImmutableStaticAsset(subcommandOriginal),exitCode2=await dangerouslyDeleteImmutableStaticAsset(client,args);break;case"observability":if(needHelp)return telemetry2.trackCliFlagHelp("project",subcommandOriginal),printHelp(observabilitySubcommand);telemetry2.trackCliSubcommandObservability(args[0]==="enable"?"observability enable":args[0]==="disable"?"observability disable":subcommandOriginal),exitCode2=await observability(client,args);break;case"resume":if(needHelp)return telemetry2.trackCliFlagHelp("project",subcommandOriginal),printHelp(resumeSubcommand);telemetry2.trackCliSubcommandResume(subcommandOriginal),exitCode2=await resume2(client,args);break;case"token":if(needHelp)return telemetry2.trackCliFlagHelp("project",subcommandOriginal),printHelp(tokenSubcommand2);telemetry2.trackCliSubcommandToken(subcommandOriginal),exitCode2=await getOidcToken(client,args);break;case"rename":if(needHelp)return telemetry2.trackCliFlagHelp("project",subcommandOriginal),printHelp(renameSubcommand);telemetry2.trackCliSubcommandRename(subcommandOriginal),exitCode2=await rename(client,args);break;case"update":if(needHelp)return telemetry2.trackCliFlagHelp("project",subcommandOriginal),printHelp(updateSubcommand8);telemetry2.trackCliSubcommandUpdate(subcommandOriginal),exitCode2=await update6(client,args);break;case"remove":if(needHelp)return telemetry2.trackCliFlagHelp("project",subcommandOriginal),printHelp(removeSubcommand13);telemetry2.trackCliSubcommandRemove(subcommandOriginal),exitCode2=await rm9(client,args);break;default:{if(handleCommandTypo({client,command:parsedArgs.args[1],availableCommands:projectCommand.subcommands}))return 2;let fallback=await tryOpenApiFallback(client,parsedArgs.args.slice(1),resolveOpenApiTagForProjectsCli);if(fallback!==null){exitCode2=fallback;break}return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG52)),output_manager_default.print(help(projectCommand,{columns:client.stderr.columns})),2}}return exitCode2===0&&await autoInstallVercelPlugin(client),exitCode2}var import_ms29=__toESM(require_ms(),1);var import_error_utils20=__toESM(require_dist(),1);var import_chalk265=__toESM(require_source(),1);var import_chalk262=__toESM(require_source(),1);async function getProjectByDeployment({client,deployId}){let{config}=client,{contextName}=await getScope(client);if(!isValidName(deployId))throw new Error(`The provided argument "${deployId}" is not a valid deployment ID or URL`);let deployment,team;try{output_manager_default?.spinner(`Fetching deployment "${deployId}" in ${import_chalk262.default.bold(contextName)}\u2026`);let[teamResult,deploymentResult]=await Promise.allSettled([config.currentTeam?getTeamByIdOrSlug(client,config.currentTeam):void 0,getDeployment(client,contextName,deployId)]);if(teamResult.status==="rejected")throw new Error(`Failed to retrieve team information: ${teamResult.reason}`);if(deploymentResult.status==="rejected")throw new Error(deploymentResult.reason);if(team=teamResult.value,deployment=deploymentResult.value,output_manager_default?.log(`Fetching deployment "${deployId}" in ${import_chalk262.default.bold(contextName)}\u2026`),deployment.team?.id){if(!team||deployment.team.id!==team.id){let err=new Error(team?`Deployment doesn't belong to current team ${import_chalk262.default.bold(contextName)}`:"Deployment belongs to a different team");throw err.code="ERR_INVALID_TEAM",err}}else if(team){let err=new Error(`Deployment doesn't belong to current team ${import_chalk262.default.bold(contextName)}`);throw err.code="ERR_INVALID_TEAM",err}if(!deployment.projectId)throw new Error("Deployment is not associated to a project");let project=await getProjectByNameOrId(client,deployment.projectId);if(project instanceof ProjectNotFound)throw project;return{contextName,deployment,project}}finally{output_manager_default?.stopSpinner()}}var import_ms28=__toESM(require_ms(),1);var import_chalk264=__toESM(require_source(),1);var import_ms27=__toESM(require_ms(),1);var import_chalk263=__toESM(require_source(),1);function renderAliasStatus(status6){return status6==="completed"?import_chalk263.default.green(status6):status6==="failed"?import_chalk263.default.red(status6):status6==="skipped"?import_chalk263.default.gray(status6):import_chalk263.default.yellow(status6)}async function requestRollingRelease({client,projectId,teamId}){let{rollingRelease:rollingRelease2}=await client.fetch(`/v1/projects/${projectId}/rolling-release?teamId=${teamId}`);return rollingRelease2}async function promoteStatus({client,contextName,deployment,project,timeout="3m"}){let recentThreshold=Date.now()-(0,import_ms27.default)("3m"),promoteTimeout=Date.now()+(0,import_ms27.default)(timeout),counter=0,spinnerMessage=deployment?"Promote in progress":`Checking promotion status of ${project.name}`;contextName||({contextName}=await getScope(client));try{for(output_manager_default.spinner(`${spinnerMessage}\u2026`);;){let projectCheck=await getProjectByNameOrId(client,project.id,project.accountId,!0);if(projectCheck instanceof ProjectNotFound)throw projectCheck;if(projectCheck.rollingRelease){output_manager_default.log("Rolling Releases enabled \u2026");let rr=await requestRollingRelease({client,projectId:project.id,teamId:project.accountId});if(rr.activeStage)return output_manager_default.stopSpinner(),output_manager_default.log(`Rolling Release serving traffic at initial percentage ${rr.activeStage.targetPercentage}`),0;continue}let{jobStatus,requestedAt,toDeploymentId,type}=projectCheck.lastAliasRequest??{};if((!jobStatus||jobStatus!=="in-progress"&&jobStatus!=="pending")&&(output_manager_default.stopSpinner(),output_manager_default.log(`${spinnerMessage}\u2026`)),!jobStatus||!requestedAt||!toDeploymentId||requestedAt<recentThreshold)return output_manager_default.log("No deployment promotion in progress"),0;if(jobStatus==="skipped"&&type==="promote")return output_manager_default.log("Promote deployment was skipped"),0;if(jobStatus==="succeeded")return await renderJobSucceeded({client,contextName,performingPromote:!!deployment,requestedAt,project,toDeploymentId});if(jobStatus==="failed")return await renderJobFailed({client,contextName,deployment,project,toDeploymentId});if(jobStatus!=="pending"&&jobStatus!=="in-progress")return output_manager_default.log(`Unknown promote deployment status "${jobStatus}"`),1;if(requestedAt<recentThreshold||Date.now()>=promoteTimeout)return output_manager_default.log(`The promotion exceeded its deadline - rerun ${import_chalk264.default.bold(`${packageName} promote ${toDeploymentId}`)} to try again`),1;counter++===0&&!deployment&&(spinnerMessage+=` requested at ${formatDate(requestedAt)}`),output_manager_default.spinner(`${spinnerMessage}\u2026`),await sleep(250)}}finally{output_manager_default.stopSpinner()}}async function renderJobFailed({client,contextName,deployment,project,toDeploymentId}){try{let name=(deployment||await getDeployment(client,contextName,toDeploymentId))?.url;output_manager_default.error(`Failed to remap all aliases to the requested deployment ${name} (${toDeploymentId})`)}catch{output_manager_default.error(`Failed to remap all aliases to the requested deployment ${toDeploymentId}`)}let nextTimestamp;for(;;){let url=`/v9/projects/${project.id}/promote/aliases?failedOnly=true&limit=20`;nextTimestamp&&(url+=`&until=${nextTimestamp}`);let{aliases:aliases2,pagination}=await client.fetch(url);for(let{alias:alias2,status:status6}of aliases2)output_manager_default.log(` ${renderAliasStatus(status6).padEnd(11)} ${alias2.alias} (${alias2.deploymentId})`);if(pagination?.next)nextTimestamp=pagination.next;else break}return 1}async function renderJobSucceeded({client,contextName,performingPromote,project,requestedAt,toDeploymentId}){let deploymentInfo="";try{let deployment=await getDeployment(client,contextName,toDeploymentId);deploymentInfo=`${import_chalk264.default.bold(deployment.url)} (${toDeploymentId})`}catch(err){output_manager_default.debug(`Failed to get deployment url for ${toDeploymentId}: ${err?.toString()||err}`),deploymentInfo=import_chalk264.default.bold(toDeploymentId)}let duration=performingPromote?elapsed(Date.now()-requestedAt):"";return output_manager_default.log(`Success! ${import_chalk264.default.bold(project.name)} was promoted to ${deploymentInfo} ${duration}`),0}async function requestPromote({client,deployId,timeout,yes}){let{contextName,deployment,project}=await getProjectByDeployment({client,deployId}),promoteByCreation=!1;if(deployment.target!=="production")if(yes)promoteByCreation=!0;else{let question="This deployment is not a production deployment and cannot be directly promoted. A new deployment will be built using your production environment. Are you sure you want to continue?";if(promoteByCreation=await client.input.confirm(question,!1),!promoteByCreation)return output_manager_default.error("Canceled"),0}if(promoteByCreation){let newDeployment=await client.fetch(`/v13/deployments?teamId=${deployment.ownerId}`,{body:{deploymentId:deployment.id,name:project.name,target:"production",meta:{action:"promote"}},accountId:deployment.ownerId,method:"POST"});return output_manager_default.log(`Successfully created new deployment of ${import_chalk265.default.bold(project.name)} at ${newDeployment.inspectorUrl}`),0}return(await client.fetch(`/v10/projects/${project.id}/promote/${deployment.id}`,{body:{},json:!1,method:"POST"})).status===202?(output_manager_default.log("Promotion has been queued and will begin when the active rolling release completes successfully."),0):timeout!==void 0&&(0,import_ms28.default)(timeout)===0?(output_manager_default.log(`Successfully requested promote of ${import_chalk265.default.bold(project.name)} to ${deployment.url} (${deployment.id})`),output_manager_default.log(`To check promote status, run ${getCommandName("promote")}.`),0):await promoteStatus({client,contextName,deployment,project,timeout})}var PromoteTelemetryClient=class extends TelemetryClient{trackCliArgumentUrlOrDeploymentId(value){value&&this.trackCliArgument({arg:"urlOrDeploymentId",value:this.redactedValue})}trackCliSubcommandStatus(){this.trackCliSubcommand({subcommand:"status",value:"status"})}trackCliOptionTimeout(time){time&&this.trackCliOption({option:"timeout",value:"[TIME]"})}trackCliFlagYes(yes){yes&&this.trackCliFlag("yes")}};var promote_default=async client=>{let parsedArgs,flagsSpecification=getFlagsSpecification(promoteCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(err){return printError(err),1}let telemetry2=new PromoteTelemetryClient({opts:{store:client.telemetryEventStore}}),needHelp=parsedArgs.flags["--help"];if(!parsedArgs.args[1]&&needHelp)return telemetry2.trackCliFlagHelp("promote"),output_manager_default.print(help(promoteCommand,{columns:client.stderr.columns})),2;let yes=parsedArgs.flags["--yes"]??!1;telemetry2.trackCliFlagYes(parsedArgs.flags["--yes"]);let timeout=parsedArgs.flags["--timeout"];if(timeout&&(0,import_ms29.default)(timeout)===void 0)return output_manager_default.error(`Invalid timeout "${timeout}"`),1;telemetry2.trackCliOptionTimeout(parsedArgs.flags["--timeout"]);let actionOrDeployId=parsedArgs.args[1]||"status";try{if(actionOrDeployId==="status"){if(needHelp)return telemetry2.trackCliFlagHelp("promote","status"),output_manager_default.print(help(statusSubcommand3,{columns:client.stderr.columns,parent:promoteCommand})),2;telemetry2.trackCliSubcommandStatus();let project=await getProjectByCwdOrLink({autoConfirm:parsedArgs.flags["--yes"],client,commandName:"promote",projectNameOrId:parsedArgs.args[2]});return await promoteStatus({client,project,timeout})}return telemetry2.trackCliArgumentUrlOrDeploymentId(actionOrDeployId),await requestPromote({client,deployId:actionOrDeployId,timeout,yes})}catch(err){if((0,import_error_utils20.isErrnoException)(err)){if(err.code==="ERR_CANCELED")return 0;if(err.code==="ERR_INVALID_CWD"||err.code==="ERR_LINK_PROJECT")return 1}return output_manager_default.prettyError(err),1}};var import_chalk267=__toESM(require_source(),1),import_client=__toESM(require_dist3(),1);var import_chalk266=__toESM(require_source(),1);async function getDeploymentByIdOrURL({client,contextName,deployIdOrUrl}){let{config}=client;if(!isValidName(deployIdOrUrl))throw new Error(`The provided argument "${deployIdOrUrl}" is not a valid deployment ID or URL`);let deployment,team;try{output_manager_default.spinner(`Fetching deployment "${deployIdOrUrl}" in ${import_chalk266.default.bold(contextName)}\u2026`);let[teamResult,deploymentResult]=await Promise.allSettled([config.currentTeam?getTeamByIdOrSlug(client,config.currentTeam):void 0,getDeployment(client,contextName,deployIdOrUrl)]);if(teamResult.status==="rejected")throw new Error(`Failed to retrieve team information: ${teamResult.reason}`);if(deploymentResult.status==="rejected")throw new Error(deploymentResult.reason.message);team=teamResult.value,deployment=deploymentResult.value,output_manager_default.log(`Fetching deployment "${deployIdOrUrl}" in ${import_chalk266.default.bold(contextName)}\u2026`)}finally{output_manager_default.stopSpinner()}if(deployment.team?.id){if(!team||deployment.team.id!==team.id){let err=new Error(team?`Deployment doesn't belong to current team ${import_chalk266.default.bold(contextName)}`:"Deployment belongs to a different team");throw err.code="ERR_INVALID_TEAM",err}}else if(team){let err=new Error(`Deployment doesn't belong to current team ${import_chalk266.default.bold(contextName)}`);throw err.code="ERR_INVALID_TEAM",err}return deployment}var import_error_utils21=__toESM(require_dist(),1);var RedeployTelemetryClient=class extends TelemetryClient{trackCliArgumentUrlOrDeploymentId(value){value&&this.trackCliArgument({arg:"urlOrDeploymentId",value:this.redactedValue})}trackCliFlagNoWait(noWait){noWait&&this.trackCliFlag("no-wait")}trackCliOptionTarget(target){target&&this.trackCliArgument({arg:"target",value:this.redactedTargetName(target)})}};async function redeploy(client){let parsedArgs=null,flagsSpecification=getFlagsSpecification(redeployCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return printError(error),1}let telemetry2=new RedeployTelemetryClient({opts:{store:client.telemetryEventStore}});if(parsedArgs.flags["--help"])return telemetry2.trackCliFlagHelp("redeploy"),output_manager_default.print(help(redeployCommand,{columns:client.stderr.columns})),2;let deployIdOrUrl=parsedArgs.args[1];if(!deployIdOrUrl)return output_manager_default.error(`Missing required deployment id or url: ${getCommandName("redeploy <deployment-id-or-url>")}`),1;telemetry2.trackCliArgumentUrlOrDeploymentId(deployIdOrUrl),telemetry2.trackCliFlagNoWait(parsedArgs.flags["--no-wait"]),telemetry2.trackCliOptionTarget(parsedArgs.flags["--target"]);let{contextName}=await getScope(client),noWait=!!parsedArgs.flags["--no-wait"],targetArgument=parsedArgs.flags["--target"];try{let fromDeployment=await getDeploymentByIdOrURL({client,contextName,deployIdOrUrl}),target,customEnvironmentSlugOrId;targetArgument?targetArgument==="staging"||targetArgument==="production"?target=targetArgument:targetArgument==="preview"?target=void 0:targetArgument?(customEnvironmentSlugOrId=targetArgument,target=void 0):target=fromDeployment.target:(target=fromDeployment.target??void 0,customEnvironmentSlugOrId=fromDeployment.customEnvironment?.id);let customEnvironment;if(fromDeployment?.projectId&&customEnvironmentSlugOrId){let customEnvironments=await getCustomEnvironments(client,fromDeployment.projectId);customEnvironment=pickCustomEnvironment(customEnvironments,customEnvironmentSlugOrId)}if(customEnvironmentSlugOrId&&!customEnvironment)return output_manager_default.error(`The provided argument "${targetArgument}" is not a valid target environment.`),1;let deployStamp=stamp_default();output_manager_default.spinner(`Redeploying project ${fromDeployment.id}`,0);let deployment=await client.fetch("/v13/deployments?forceNew=1",{body:{deploymentId:fromDeployment.id,meta:{action:"redeploy"},name:fromDeployment.name,target,customEnvironmentSlugOrId},method:"POST"});output_manager_default.stopSpinner();let previewUrl=`https://${deployment.url}`,isProdDeployment=target==="production";if(customEnvironmentSlugOrId&&customEnvironment&&(isProdDeployment=customEnvironment.type==="production"),printAlignedLabel("Inspect",import_chalk267.default.cyan(deployment.inspectorUrl)),printAlignedLabel(isProdDeployment?"Production":"Preview",import_chalk267.default.cyan(previewUrl),isProdDeployment&&noWait?{gutter:"\u25B2"}:{}),client.stdout.isTTY||client.stdout.write(`https://${deployment.url}`),!noWait){output_manager_default.spinner(deployment.readyState==="QUEUED"?"Queued\u2026":"Building\u2026",0);let project,rollingRelease2;if(deployment.projectId&&deployment.projectId!=""&&(project=await getProjectByNameOrId(client,deployment.projectId),rollingRelease2=project?.rollingRelease),deployment.readyState==="READY"&&deployment.aliasAssigned&&!rollingRelease2){if(output_manager_default.spinner("Completing\u2026",0),deployment.target==="production"&&deployment.alias&&deployment.alias.length>0){output_manager_default.stopSpinner();let prodUrl=`https://${deployment.alias[0]}`;printAlignedLabel("Aliased",import_chalk267.default.cyan(prodUrl),{gutter:"\u25B2"})}}else try{let clientOptions={dispatcher:getFetchDispatcher(),apiUrl:client.apiUrl,debug:output_manager_default.debugEnabled,path:"",teamId:fromDeployment.team?.id,token:client.authConfig.token,userAgent:ua_default};for await(let event of(0,import_client.checkDeploymentStatus)(deployment,clientOptions))if(event.type==="building")output_manager_default.spinner("Building\u2026",0);else if(event.type==="ready"&&rollingRelease2){output_manager_default.spinner("Releasing\u2026",0),output_manager_default.stopSpinner(),deployment=event.payload;break}else if(event.type==="ready"&&(!event.payload.checksState||event.payload.checksState==="completed"))output_manager_default.spinner("Completing\u2026",0);else if(event.type==="checks-running")output_manager_default.spinner("Running Checks\u2026",0);else if(event.type==="alias-assigned"||event.type==="checks-conclusion-failed"){if(output_manager_default.stopSpinner(),event.type==="alias-assigned"&&!Array.isArray(event.payload)&&event.payload.target==="production"&&event.payload.alias&&event.payload.alias.length>0){let prodUrl=`https://${event.payload.alias[0]}`;printAlignedLabel("Aliased",import_chalk267.default.cyan(prodUrl),{gutter:"\u25B2"})}deployment=event.payload;break}else{if(event.type==="canceled")return output_manager_default.stopSpinner(),output_manager_default.print(`The deployment has been canceled.
|
|
1115
1117
|
`),1;if(event.type==="error")throw output_manager_default.stopSpinner(),await new Now({client,currentTeam:fromDeployment.team?.id}).handleDeploymentError(event.payload,{env:{}})}}catch(err){output_manager_default.prettyError(err),process.exit(1)}}return printDeploymentStatus(client,deployment,deployStamp,noWait,!1)}catch(err){return output_manager_default.prettyError(err),(0,import_error_utils21.isErrnoException)(err)&&err.code==="ERR_INVALID_TEAM"&&output_manager_default.error(`Use ${import_chalk267.default.bold("vc switch")} to change your current team`),1}}var import_chalk268=__toESM(require_source(),1),import_pluralize18=__toESM(require_pluralize(),1);function withGlobalFlags4(client,commandTemplate){return withGlobalFlags(client,commandTemplate,{preserveProject:!0})}async function parseSubcommandArgs3(argv,command2){let parsedArgs;try{parsedArgs=parseSubcommandArguments(argv,command2)}catch(err){return printError(err),1}return parsedArgs}async function confirmAction2(client,skipConfirmation,message,details){return skipConfirmation?!0:(details&&output_manager_default.print(` ${details}
|
|
1116
1118
|
`),await client.input.confirm(message,!1))}function isValidUrl(url){if(url.startsWith("/"))return!0;try{let parsed=new URL(url);return parsed.protocol==="http:"||parsed.protocol==="https:"}catch{return!1}}function getArgsAfterRedirectsSubcommand(fullArgs,subcommand){let idx=fullArgs.indexOf(subcommand);return idx>=0?fullArgs.slice(idx+1):[]}function getRedirectGlobalFlagsOnly(afterSubcommandArgs){return getGlobalFlagsFromArgs(afterSubcommandArgs,{preserveProject:!0})}function getRedirectPromoteSuggestionFlags(afterSubcommandArgs){let parts=getRedirectGlobalFlagsOnly(afterSubcommandArgs);return parts.some(p=>p==="--yes"||p==="-y")||parts.push("--yes"),parts}function buildRedirectsSuggestionFlags(fullArgs,subcommand,options={}){let after=getArgsAfterRedirectsSubcommand(fullArgs,subcommand),flagParts=getSameSubcommandSuggestionFlags(after);return options.ensureYes!==!1&&!flagParts.some(a=>a==="--yes"||a==="-y")&&flagParts.push("--yes"),flagParts}async function getRedirects(client,projectId,options={}){let{teamId,search:search2,page,perPage=50,versionId,diff:diff2}=options,params=new URLSearchParams;params.set("projectId",projectId),teamId&¶ms.set("teamId",teamId),versionId&¶ms.set("versionId",versionId),diff2?params.set("diff",diff2===!0?"true":diff2):(params.set("per_page",perPage.toString()),search2&¶ms.set("q",search2),page&¶ms.set("page",page.toString()));let url=`/v1/bulk-redirects?${params}`;return await client.fetch(url)}async function getRedirectVersions(client,projectId,teamId){let params=new URLSearchParams;params.set("projectId",projectId),teamId&¶ms.set("teamId",teamId);let url=`/v1/bulk-redirects/versions?${params}`;return await client.fetch(url)}async function list22(client,argv){let parsed=await parseSubcommandArgs3(argv,listSubcommand18);if(typeof parsed=="number")return parsed;let link=await requireProjectContext(client,"redirects",parsed.flags["--project"]);if(typeof link=="number")return link;let{project,org}=link,{flags}=parsed,teamId=org.type==="team"?org.id:void 0,search2=flags["--search"],page=flags["--next"]??flags["--page"],perPage=flags["--limit"]??flags["--per-page"],staging=flags["--staging"],versionIdFlag=flags["--version"],versionId,versionName,useDiff=!1;if(staging){output_manager_default.spinner("Fetching staging version");let{versions:versions2}=await getRedirectVersions(client,project.id,teamId),stagingVersion=versions2.find(v=>v.isStaging);if(!stagingVersion)return output_manager_default.error(`No staging version found for ${import_chalk268.default.bold(project.name)}. Run ${import_chalk268.default.cyan(withGlobalFlags4(client,"redirects list-versions"))} to see available versions.`),1;versionId=stagingVersion.id,versionName=stagingVersion.name||stagingVersion.id,!search2&&!page&&(useDiff=!0)}if(versionIdFlag){if(staging)return output_manager_default.error("Cannot use both --staging and --version flags together"),1;output_manager_default.spinner("Fetching version");let{versions:versions2}=await getRedirectVersions(client,project.id,teamId),version2=versions2.find(v=>v.id===versionIdFlag||v.name===versionIdFlag);if(!version2)return output_manager_default.error(`Version "${versionIdFlag}" not found. Run ${import_chalk268.default.cyan(withGlobalFlags4(client,"redirects list-versions"))} to see available versions.`),1;versionId=version2.id,versionName=version2.name||version2.id}let lsStamp=stamp_default(),spinnerMessage=`Fetching redirects for ${import_chalk268.default.bold(project.name)}`;versionName&&(spinnerMessage+=` (version: ${versionName})`),search2&&(spinnerMessage+=` matching "${search2}"`),output_manager_default.spinner(spinnerMessage);let{redirects,pagination}=await getRedirects(client,project.id,{teamId,search:search2,page,perPage,versionId,diff:useDiff});if(useDiff){let added=redirects.filter(r=>r.action==="+"),removed=redirects.filter(r=>r.action==="-"),unchanged=redirects.filter(r=>!r.action);output_manager_default.log(`Changes in staging version ${import_chalk268.default.bold(versionName||"")} ${import_chalk268.default.gray(lsStamp())}`),added.length===0&&removed.length===0?output_manager_default.log(`
|
|
1117
1119
|
No changes from production version
|
|
@@ -1195,7 +1197,7 @@ ${import_chalk274.default.gray("No changes detected from current production vers
|
|
|
1195
1197
|
`)}),0}function readConfirmation4(deployments,projects2){return new Promise(resolve14=>{if(deployments.length>0){output_manager_default.log(`The following ${(0,import_pluralize20.default)("deployment",deployments.length,deployments.length>1)} will be permanently removed:`);let deploymentTable=table(deployments.map(depl=>{let time=import_chalk275.default.gray(`${(0,import_ms31.default)(Date.now()-depl.createdAt)} ago`),url=depl.url?import_chalk275.default.underline(`https://${depl.url}`):"";return[` ${depl.id}`,url,time]}),{align:["l","r","l"],hsep:6});output_manager_default.print(`${deploymentTable}
|
|
1196
1198
|
`)}for(let depl of deployments)for(let{alias:alias2}of depl.aliases)output_manager_default.warn(`${import_chalk275.default.underline(`https://${alias2}`)} is an alias for ${import_chalk275.default.bold(depl.url)} and will be removed`);if(projects2.length>0){output_manager_default.print(`The following ${(0,import_pluralize20.default)("project",projects2.length,projects2.length>1)} will be permanently removed, including all ${projects2.length>1?"their":"its"} deployments and aliases:
|
|
1197
1199
|
`);for(let project of projects2)output_manager_default.print(`${import_chalk275.default.gray("-")} ${import_chalk275.default.bold(project.name)}
|
|
1198
|
-
`)}output_manager_default.print(`${import_chalk275.default.bold.red("> Are you sure?")} ${import_chalk275.default.gray("(y/N) ")}`),process.stdin.on("data",d=>{process.stdin.pause(),resolve14(d.toString().trim())}).resume()})}function deploymentsAndProjects(deployments,projects2,conjunction="and"){return!projects2||projects2.length===0?`${(0,import_pluralize20.default)("deployment",deployments.length,!0)}`:!deployments||deployments.length===0?`${(0,import_pluralize20.default)("project",projects2.length,!0)}`:`${(0,import_pluralize20.default)("deployment",deployments.length,!0)} ${conjunction} ${(0,import_pluralize20.default)("project",projects2.length,!0)}`}var import_error_utils22=__toESM(require_dist(),1),import_ms34=__toESM(require_ms(),1);var import_chalk277=__toESM(require_source(),1);var import_ms33=__toESM(require_ms(),1);var import_chalk276=__toESM(require_source(),1);var import_ms32=__toESM(require_ms(),1);async function rollbackStatus({client,contextName,deployment,project,timeout="3m"}){let recentThreshold=Date.now()-(0,import_ms32.default)("3m"),rollbackTimeout=Date.now()+(0,import_ms32.default)(timeout),counter=0,spinnerMessage=deployment?"Rollback in progress":`Checking rollback status of ${project.name}`;contextName||({contextName}=await getScope(client));try{for(output_manager_default.spinner(`${spinnerMessage}\u2026`);;){let projectCheck=await getProjectByNameOrId(client,project.id,project.accountId,!0);if(projectCheck instanceof ProjectNotFound)throw projectCheck;let{jobStatus,requestedAt,toDeploymentId,type}=projectCheck.lastAliasRequest??{};if((!jobStatus||jobStatus!=="in-progress"&&jobStatus!=="pending")&&(output_manager_default.stopSpinner(),output_manager_default.log(`${spinnerMessage}\u2026`)),!jobStatus||!requestedAt||!toDeploymentId||requestedAt<recentThreshold)return output_manager_default.log("No deployment rollback in progress"),0;if(jobStatus==="skipped"&&type==="rollback")return output_manager_default.log("Rollback was skipped"),0;if(jobStatus==="succeeded")return await renderJobSucceeded2({client,contextName,performingRollback:!!deployment,requestedAt,project,toDeploymentId});if(jobStatus==="failed")return await renderJobFailed2({client,contextName,deployment,project,toDeploymentId});if(jobStatus!=="pending"&&jobStatus!=="in-progress")return output_manager_default.log(`Unknown rollback status "${jobStatus}"`),1;if(requestedAt<recentThreshold||Date.now()>=rollbackTimeout)return output_manager_default.log(`The rollback exceeded its deadline - rerun ${import_chalk276.default.bold(`${packageName} rollback ${toDeploymentId}`)} to try again`),1;counter++===0&&!deployment&&(spinnerMessage+=` requested at ${formatDate(requestedAt)}`),output_manager_default.spinner(`${spinnerMessage}\u2026`),await sleep(250)}}finally{output_manager_default.stopSpinner()}}async function renderJobFailed2({client,contextName,deployment,project,toDeploymentId}){try{let name=(deployment||await getDeployment(client,contextName,toDeploymentId))?.url;output_manager_default.error(`Failed to remap all aliases to the requested deployment ${name} (${toDeploymentId})`)}catch{output_manager_default.error(`Failed to remap all aliases to the requested deployment ${toDeploymentId}`)}let nextTimestamp;for(;;){let url=`/v9/projects/${project.id}/rollback/aliases?failedOnly=true&limit=20`;nextTimestamp&&(url+=`&until=${nextTimestamp}`);let{aliases:aliases2,pagination}=await client.fetch(url);for(let{alias:alias2,status:status6}of aliases2)output_manager_default.log(` ${renderAliasStatus(status6).padEnd(11)} ${alias2.alias} (${alias2.deploymentId})`);if(pagination?.next)nextTimestamp=pagination.next;else break}return 1}async function renderJobSucceeded2({client,contextName,performingRollback,project,requestedAt,toDeploymentId}){let deploymentInfo="";try{let deployment=await getDeployment(client,contextName,toDeploymentId);deploymentInfo=`${import_chalk276.default.bold(deployment.url)} (${toDeploymentId})`}catch(err){output_manager_default.debug(`Failed to get deployment url for ${toDeploymentId}: ${err?.toString()||err}`),deploymentInfo=import_chalk276.default.bold(toDeploymentId)}let duration=performingRollback?elapsed(Date.now()-requestedAt):"";return output_manager_default.log(`Success! ${import_chalk276.default.bold(project.name)} was rolled back to ${deploymentInfo} ${duration}`),0}async function requestRollback({client,deployId,timeout}){let{contextName,deployment,project}=await getProjectByDeployment({client,deployId});return await client.fetch(`/v9/projects/${project.id}/rollback/${deployment.id}`,{body:{},method:"POST"}),timeout!==void 0&&(0,import_ms33.default)(timeout)===0?(output_manager_default.log(`Successfully requested rollback of ${import_chalk277.default.bold(project.name)} to ${deployment.url} (${deployment.id})`),output_manager_default.log(`To check rollback status, run ${getCommandName("rollback")}.`),0):await rollbackStatus({client,contextName,deployment,project,timeout})}var RollbackTelemetryClient=class extends TelemetryClient{trackCliArgumentUrlOrDeploymentId(value){value&&this.trackCliArgument({arg:"urlOrDeploymentId",value:this.redactedValue})}trackCliSubcommandStatus(){this.trackCliSubcommand({subcommand:"status",value:"status"})}trackCliOptionTimeout(time){time&&this.trackCliOption({option:"timeout",value:"[TIME]"})}trackCliFlagYes(yes){yes&&this.trackCliFlag("yes")}};var rollback_default=async client=>{let parsedArgs,flagsSpecification=getFlagsSpecification(rollbackCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return printError(error),1}let telemetry2=new RollbackTelemetryClient({opts:{store:client.telemetryEventStore}});telemetry2.trackCliOptionTimeout(parsedArgs.flags["--timeout"]),telemetry2.trackCliFlagYes(parsedArgs.flags["--yes"]);let needHelp=parsedArgs.flags["--help"];if(!parsedArgs.args[1]&&needHelp)return telemetry2.trackCliFlagHelp("rollback"),output_manager_default.print(help(rollbackCommand,{columns:client.stderr.columns})),2;let timeout=parsedArgs.flags["--timeout"];if(timeout&&(0,import_ms34.default)(timeout)===void 0)return output_manager_default.error(`Invalid timeout "${timeout}"`),1;let actionOrDeployId=parsedArgs.args[1]||"status";try{if(actionOrDeployId==="status"){if(needHelp)return telemetry2.trackCliFlagHelp("rollback","status"),output_manager_default.print(help(statusSubcommand4,{columns:client.stderr.columns,parent:rollbackCommand})),2;telemetry2.trackCliSubcommandStatus();let project=await getProjectByCwdOrLink({autoConfirm:parsedArgs.flags["--yes"],client,commandName:"rollback",projectNameOrId:parsedArgs.args[2]});return await rollbackStatus({client,project,timeout})}return await requestRollback({client,deployId:actionOrDeployId,timeout})}catch(err){if((0,import_error_utils22.isErrnoException)(err)){if(err.code==="ERR_CANCELED")return 0;if(err.code==="ERR_INVALID_CWD"||err.code==="ERR_LINK_PROJECT")return 1}return output_manager_default.prettyError(err),1}};async function startRollingRelease({client,dpl,projectId,teamId,yes}){let{deployment}=await getProjectByDeployment({client,deployId:dpl}),promoteByCreation=!1;if(deployment.target!=="production")if(yes)promoteByCreation=!0;else{if(client.nonInteractive)return output_manager_default.error("This deployment is not a production deployment. In non-interactive mode use --yes to create a new production deployment and start the rolling release."),1;{let question="This deployment is not a production deployment and cannot be directly promoted. A new deployment will be built using your production environment. Are you sure you want to continue?";if(promoteByCreation=await client.input.confirm(question,!1),!promoteByCreation)return output_manager_default.error("Canceled"),0}}if(promoteByCreation){let newDeployment=await client.fetch(`/v13/deployments?teamId=${deployment.ownerId}`,{body:{deploymentId:deployment.id,name:projectId,target:"production",meta:{action:"promote"}},accountId:deployment.ownerId,method:"POST"});return output_manager_default.log(`Successfully created new deployment at ${newDeployment.inspectorUrl}`),0}return await client.fetch(`/v1/projects/${projectId}/rolling-release/start?teamId=${teamId}`,{body:{canaryDeploymentId:deployment.id},json:!0,method:"POST"}),output_manager_default.log("Successfully started rolling release"),0}var import_ms35=__toESM(require_ms(),1);function parseDuration(value){if(!value||/^\d+(s|ms)$/i.test(value))return;let milliseconds=(0,import_ms35.default)(/^\d+$/.test(value)?`${value}m`:value);if(milliseconds===void 0||milliseconds<=0)return;let minutes=Math.round(milliseconds/6e4);if(!(minutes<=0))return minutes}function parseStageFlags(stageFlags,advancementType){let stages=[];for(let stageValue of stageFlags){let parts=stageValue.split(","),percentage=parseInt(parts[0],10);if(isNaN(percentage)||percentage<1||percentage>99)return{stages:null,error:`Invalid stage percentage "${parts[0]}". Must be a number between 1 and 99.`};if(parts.length>1){if(advancementType==="manual-approval")return{stages:null,error:'Duration must not be provided for stages when advancement type is "manual-approval".'};let duration=parseDuration(parts[1]);if(duration===void 0)return{stages:null,error:`Invalid duration "${parts[1]}". Use minutes (e.g. "5m"), hours (e.g. "1h"), or days (e.g. "1d"). Seconds are not supported.`};stages.push({targetPercentage:percentage,duration})}else{if(advancementType==="automatic")return{stages:null,error:'Duration is required for each stage when advancement type is "automatic". Use the format "PERCENTAGE,DURATION" (e.g. "10,5m").'};stages.push({targetPercentage:percentage})}}for(let i=1;i<stages.length;i++)if(stages[i].targetPercentage<=stages[i-1].targetPercentage)return{stages:null,error:"Stage percentages must be in ascending order."};return{stages,error:null}}async function interactiveConfigure(client){if(await client.input.select({message:"Would you like to enable or disable rolling releases?",choices:[{name:"Enable",value:"enable"},{name:"Disable",value:"disable"}]})==="disable")return{config:void 0};let advancementType=await client.input.select({message:"How should stages advance?",choices:[{name:"automatic - Stages advance automatically after a set duration",value:"automatic"},{name:"manual-approval - Each stage requires manual approval to advance",value:"manual-approval"}]}),stages=[],stageNumber=1,addMore=!0;for(;addMore;){let percentageStr=await client.input.text({message:`Enter traffic percentage for stage ${stageNumber} (1-99):`,validate:val=>{let num=parseInt(val,10);return isNaN(num)||num<1||num>99?"Percentage must be a number between 1 and 99.":stages.length>0&&num<=stages[stages.length-1].targetPercentage?`Percentage must be greater than the previous stage (${stages[stages.length-1].targetPercentage}%).`:!0}}),percentage=parseInt(percentageStr,10),duration;if(advancementType==="automatic"){let durationStr=await client.input.text({message:"Enter duration for this stage (e.g. 5m, 1h):",validate:val=>parseDuration(val)===void 0?'Invalid duration. Use minutes (e.g. "5m"), hours (e.g. "1h"), or days (e.g. "1d"). Seconds are not supported.':!0});duration=parseDuration(durationStr)}stages.push({targetPercentage:percentage,duration}),stageNumber++,addMore=await client.input.confirm("Add another stage?",!1)}return output_manager_default.log(""),output_manager_default.log("Rolling release configuration:"),output_manager_default.log(` Advancement: ${advancementType}`),stages.forEach((stage,i)=>{let durationText=stage.duration!==void 0?` for ${stage.duration} minutes`:"";output_manager_default.log(` Stage ${i+1}: ${stage.targetPercentage}%${durationText}`)}),output_manager_default.log(` Stage ${stages.length+1}: 100% (final)`),output_manager_default.log(""),await client.input.confirm("Apply this configuration?",!0)?{config:{enabled:!0,advancementType,stages:[...stages,{targetPercentage:100}]}}:(output_manager_default.log("Configuration cancelled."),{exitCode:0})}async function buildConfigurePayload({client,cfgString,enableFlag,disableFlag,advancementType,stageFlags}){if(cfgString!==void 0){if(cfgString==="disable")return{config:void 0};try{return{config:JSON.parse(cfgString)}}catch{return output_manager_default.error("Invalid JSON provided for --cfg option."),{exitCode:1}}}if(disableFlag)return enableFlag?(output_manager_default.error("--enable and --disable are mutually exclusive."),{exitCode:1}):{config:void 0};if(enableFlag){if(advancementType!=="automatic"&&advancementType!=="manual-approval")return output_manager_default.error('--advancement-type is required when using --enable. Must be "automatic" or "manual-approval".'),{exitCode:1};if(!stageFlags||stageFlags.length===0)return output_manager_default.error("At least one --stage is required when using --enable."),{exitCode:1};let parsed=parseStageFlags(stageFlags,advancementType);return parsed.error!==null?(output_manager_default.error(parsed.error),{exitCode:1}):{config:{enabled:!0,advancementType,stages:[...parsed.stages,{targetPercentage:100}]}}}return advancementType!==void 0||stageFlags!==void 0&&stageFlags.length>0?(output_manager_default.error("--enable or --disable is required when using --advancement-type or --stage flags."),{exitCode:1}):client.nonInteractive?(output_manager_default.error("In non-interactive mode use --enable or --disable with --advancement-type and --stage as needed. Example: vercel rolling-release configure --enable --advancement-type=automatic --stage=10,5m --stage=50,10m"),{exitCode:1}):client.stdin.isTTY?interactiveConfigure(client):(output_manager_default.error("Missing configuration flags. Use --enable/--disable with --advancement-type and --stage, or run interactively in a terminal."),{exitCode:1})}async function configureRollingRelease({client,projectId,teamId,rollingReleaseConfig}){let body={...rollingReleaseConfig,enabled:!!rollingReleaseConfig};return await client.fetch(`/v1/projects/${projectId}/rolling-release/config?teamId=${teamId}`,{body,json:!0,method:"PATCH"}),rollingReleaseConfig?output_manager_default.log("Successfully configured rolling releases."):output_manager_default.log("Successfully disabled rolling releases."),0}async function approveRollingRelease({client,projectId,teamId,activeStageIndex,dpl}){let{deployment}=await getProjectByDeployment({client,deployId:dpl});return await client.fetch(`/v1/projects/${projectId}/rolling-release/approve-stage?teamId=${teamId}`,{method:"POST",json:!0,body:{activeStageIndex,nextStageIndex:activeStageIndex+1,canaryDeploymentId:deployment.id}}),output_manager_default.log("Successfully requested approval of rolling release to next stage."),0}async function abortRollingRelease({client,projectId,dpl,teamId}){let{deployment}=await getProjectByDeployment({client,deployId:dpl});return await client.fetch(`/v9/projects/${projectId}/rollback/${deployment.id}?teamId=${teamId}`,{body:{},method:"POST"}),output_manager_default.log("Successfully aborted the active rolling release."),0}async function completeRollingRelease({client,projectId,teamId,dpl}){let{deployment}=await getProjectByDeployment({client,deployId:dpl});return await client.fetch(`/v1/projects/${projectId}/rolling-release/complete?teamId=${teamId}`,{body:{canaryDeploymentId:deployment.id},json:!0,method:"POST"}),output_manager_default.log("Successfully requested completion of the active rolling release."),0}var RollingReleaseTelemetryClient=class extends TelemetryClient{trackCliOptionAction(value){this.trackCliOption({option:"action",value:value??""})}trackCliOptionName(name){name&&this.trackCliOption({option:"name",value:this.redactedValue})}trackCliOptionCfg(value){this.trackCliOption({option:"cfg",value:value??""})}trackCliOptionDpl(value){this.trackCliOption({option:"dpl",value:value??""})}trackCliOptionCurrentStageIndex(value){this.trackCliOption({option:"currentStageIndex",value:value??""})}trackCliSubcommandConfigure(actual){this.trackCliSubcommand({subcommand:"configure",value:actual})}trackCliSubcommandStart(actual){this.trackCliSubcommand({subcommand:"start",value:actual})}trackCliSubcommandApprove(actual){this.trackCliSubcommand({subcommand:"approve",value:actual})}trackCliSubcommandAbort(actual){this.trackCliSubcommand({subcommand:"abort",value:actual})}trackCliSubcommandComplete(actual){this.trackCliSubcommand({subcommand:"complete",value:actual})}trackCliSubcommandFetch(actual){this.trackCliSubcommand({subcommand:"fetch",value:actual})}trackCliFlagEnable(value){value&&this.trackCliFlag("enable")}trackCliFlagDisable(value){value&&this.trackCliFlag("disable")}trackCliOptionAdvancementType(value){value&&this.trackCliOption({option:"advancement-type",value})}trackCliOptionStage(value){value&&this.trackCliOption({option:"stage",value:value.join(",")})}};var COMMAND_CONFIG54={configure:getCommandAliases(configureSubcommand),start:getCommandAliases(startSubcommand2),approve:getCommandAliases(approveSubcommand),abort:getCommandAliases(abortSubcommand),complete:getCommandAliases(completeSubcommand),fetch:getCommandAliases(fetchSubcommand)},SUBCOMMANDS={configure:configureSubcommand,start:startSubcommand2,approve:approveSubcommand,abort:abortSubcommand,complete:completeSubcommand,fetch:fetchSubcommand};function getRollingReleaseSubcommand(subcommand){return typeof subcommand=="string"&&subcommand in SUBCOMMANDS?subcommand:void 0}function buildDeploymentSuggestionCommands(client,subcmd){let args=client.argv.slice(2),preservedParts=[],listParts=[],hasNonInteractive=!1;for(let i=2;i<args.length;i++){let arg=args[i];if(arg==="--non-interactive"){hasNonInteractive=!0;continue}if(arg.startsWith("--cwd=")){let cwdPath=arg.slice(6);cwdPath&&(preservedParts.push("--cwd",cwdPath),listParts.push("--cwd",cwdPath));continue}if(arg==="--cwd"){i+1<args.length&&(preservedParts.push("--cwd",args[i+1]),listParts.push("--cwd",args[i+1]),i++);continue}if(arg.startsWith("--project=")){let projectName=arg.slice(10);projectName&&listParts.push(projectName),preservedParts.push(arg);continue}if(arg==="--project"){i+1<args.length&&(listParts.push(args[i+1]),preservedParts.push(arg,args[i+1]),i++);continue}preservedParts.push(arg),listParts.push(arg)}let preservedSuffix=preservedParts.join(" "),listSuffix=listParts.join(" "),listCommand=listSuffix?`${packageName} ls ${listSuffix}`:`${packageName} ls`,base=preservedSuffix?`${packageName} rolling-release ${subcmd} ${preservedSuffix}`:`${packageName} rolling-release ${subcmd}`,defaultSuffix=subcmd==="approve"?"--dpl dpl_123 --currentStageIndex=0":"--dpl dpl_123",subcommandCommand=hasNonInteractive?`${base} ${defaultSuffix} --non-interactive`:`${base} ${defaultSuffix}`;return{listCommand,subcommandCommand}}function outputRollingReleaseErrorWithDeploymentSuggestions(client,subcmd,reason,message){let{listCommand,subcommandCommand}=buildDeploymentSuggestionCommands(client,subcmd);outputAgentError(client,{status:"error",reason,message,next:[{command:listCommand},{command:subcommandCommand}]},1)}async function rollingRelease(client){let telemetry2=new RollingReleaseTelemetryClient({opts:{store:client.telemetryEventStore}}),{subcommand,args:subcommandArgs,subcommandOriginal}=getSubcommand7(client.argv.slice(3),COMMAND_CONFIG54),needHelp=client.argv.includes("--help")||client.argv.includes("-h");if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("rolling-release"),output_manager_default.print(help(rollingReleaseCommand,{columns:client.stderr.columns})),2;function printHelp(command2){output_manager_default.print(help(command2,{parent:rollingReleaseCommand,columns:client.stderr.columns}))}try{let subcommandName=getRollingReleaseSubcommand(subcommand),subcommandConfig=subcommandName?SUBCOMMANDS[subcommandName]:void 0;if(subcommandConfig&&needHelp)return telemetry2.trackCliFlagHelp("rolling-release",subcommandOriginal),printHelp(subcommandConfig),2;let subcommandFlags,projectName;subcommandConfig&&(subcommandFlags=parseArguments(subcommandArgs,getFlagsSpecification(subcommandConfig.options)),projectName=subcommandFlags.flags["--project"],telemetry2.trackCliOptionProject(projectName));let link=await resolveProjectContext({client,projectNameOrId:projectName});if(link.status==="error")return link.exitCode;if(link.status==="not_linked")return client.nonInteractive&&outputAgentError(client,{status:"error",reason:"not_linked",message:"No project found for rolling releases. Specify a project with --project <name-or-id>, or link your project first.",next:[{command:`${packageName} link`}]},1),output_manager_default.error(`No project found. Specify a project with \`--project <name-or-id>\`, or run \`${packageName} link\` to link your project first.`),1;let{project,org}=link;if(client.config.currentTeam=org.type==="team"?org.id:void 0,!subcommandName||!subcommandFlags)return output_manager_default.debug(`Invalid subcommand: ${subcommand}`),output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG54)),output_manager_default.print(help(rollingReleaseCommand,{columns:client.stderr.columns})),2;switch(subcommandName){case"configure":{let cfgString=subcommandFlags.flags["--cfg"],enableFlag=subcommandFlags.flags["--enable"],disableFlag=subcommandFlags.flags["--disable"],advancementType=subcommandFlags.flags["--advancement-type"],stageFlags=subcommandFlags.flags["--stage"];telemetry2.trackCliFlagEnable(enableFlag),telemetry2.trackCliFlagDisable(disableFlag),telemetry2.trackCliOptionAdvancementType(advancementType),telemetry2.trackCliOptionStage(stageFlags);let configResult=await buildConfigurePayload({client,cfgString,enableFlag,disableFlag,advancementType,stageFlags});if(configResult.exitCode!==void 0)return configResult.exitCode;await configureRollingRelease({client,projectId:project.id,teamId:org.id,rollingReleaseConfig:configResult.config});break}case"start":{let dpl=subcommandFlags.flags["--dpl"];if(dpl===void 0)return client.nonInteractive&&outputRollingReleaseErrorWithDeploymentSuggestions(client,"start","missing_flags","Starting a rolling release in non-interactive mode requires the --dpl flag."),output_manager_default.error("starting a rolling release requires --dpl option."),1;try{await startRollingRelease({client,dpl,projectId:project.id,teamId:project.accountId,yes:subcommandFlags.flags["--yes"]??!1})}catch(err){if(client.nonInteractive&&isAPIError(err))return outputRollingReleaseErrorWithDeploymentSuggestions(client,"start","api_error",err.message||"Starting the rolling release failed for this deployment."),1;throw err}break}case"approve":{let dpl=subcommandFlags.flags["--dpl"],currentStageIndex=subcommandFlags.flags["--currentStageIndex"],activeStageIndex=parseInt(currentStageIndex??"");if(!dpl)return client.nonInteractive&&outputRollingReleaseErrorWithDeploymentSuggestions(client,"approve","missing_flags","Approving a rolling release in non-interactive mode requires --dpl and --currentStageIndex."),output_manager_default.error("Missing required flag --dpl"),1;if(currentStageIndex===void 0)return client.nonInteractive&&outputRollingReleaseErrorWithDeploymentSuggestions(client,"approve","missing_flags","Approving a rolling release in non-interactive mode requires --currentStageIndex."),output_manager_default.error("Missing required flag --currentStageIndex"),1;if(isNaN(activeStageIndex))return client.nonInteractive&&outputRollingReleaseErrorWithDeploymentSuggestions(client,"approve","invalid_flag","--currentStageIndex must be a valid number."),output_manager_default.error("--currentStageIndex must be a valid number."),1;await approveRollingRelease({client,projectId:project.id,teamId:org.id,activeStageIndex,dpl});break}case"abort":{let dpl=subcommandFlags.flags["--dpl"];if(!dpl)return client.nonInteractive&&outputRollingReleaseErrorWithDeploymentSuggestions(client,"abort","missing_flags","Aborting a rolling release in non-interactive mode requires the --dpl flag."),output_manager_default.error("Missing required flag --dpl"),1;try{await abortRollingRelease({client,projectId:project.id,teamId:org.id,dpl})}catch(err){if(client.nonInteractive&&isAPIError(err))return outputRollingReleaseErrorWithDeploymentSuggestions(client,"abort","api_error",err.message||"Aborting the rolling release failed for this deployment."),1;throw err}break}case"complete":{let dpl=subcommandFlags.flags["--dpl"];if(!dpl)return client.nonInteractive&&outputRollingReleaseErrorWithDeploymentSuggestions(client,"complete","missing_flags","Completing a rolling release in non-interactive mode requires the --dpl flag."),output_manager_default.error("Missing required flag --dpl"),1;await completeRollingRelease({client,projectId:project.id,teamId:org.id,dpl});break}case"fetch":{let result=await requestRollingRelease({client,projectId:project.id,teamId:org.id});output_manager_default.log(JSON.stringify(result,null,2));break}}return 0}catch(err){return client.nonInteractive&&isAPIError(err)&&outputAgentError(client,{status:"error",reason:"api_error",message:err.message||"Rolling release command failed."},1),printError(err),1}}var import_chalk278=__toESM(require_source(),1),import_pluralize21=__toESM(require_pluralize(),1);async function list23(client,argv){let parsed=await parseSubcommandArgs(argv,listSubcommand19,client);if(typeof parsed=="number")return parsed;let link=await requireProjectContext(client,"routes",parsed.flags["--project"]);if(typeof link=="number")return link;let{project,org}=link,{flags}=parsed,teamId=org.type==="team"?org.id:void 0,search2=flags["--search"],filter=flags["--filter"],production=flags["--production"],versionIdFlag=flags["--version-id"],diffFlag=flags["--diff"],expand=flags["--expand"];if(filter){let validFilters=["rewrite","redirect","set_status","transform"];if(!validFilters.includes(filter)){let msg=`Invalid filter type "${filter}". Valid types: ${validFilters.join(", ")}`;return client.nonInteractive&&(outputAgentError(client,{status:"error",reason:"invalid_arguments",message:msg,next:[{command:withGlobalFlags2(client,"routes list")}]}),process.exit(1)),output_manager_default.error(msg),1}}if(production&&versionIdFlag){let msg="Cannot use both --production and --version-id flags together";return client.nonInteractive&&(outputAgentError(client,{status:"error",reason:"invalid_arguments",message:msg,next:[{command:withGlobalFlags2(client,"routes list")}]}),process.exit(1)),output_manager_default.error(msg),1}if(production&&diffFlag){let msg="Cannot use both --production and --diff flags together. --diff compares staged changes against production.";return client.nonInteractive&&(outputAgentError(client,{status:"error",reason:"invalid_arguments",message:msg,next:[{command:withGlobalFlags2(client,"routes list --diff")}]}),process.exit(1)),output_manager_default.error(msg),1}let versionId,versionName,useDiff=!1;if(production){output_manager_default.spinner("Fetching production version");let{versions:versions2}=await getRouteVersions(client,project.id,{teamId}),productionVersion=versions2.find(v=>!v.isStaging);if(!productionVersion){let msg=`No production version found for ${project.name}.`;return client.nonInteractive&&(outputAgentError(client,{status:"error",reason:"not_found",message:msg,next:[{command:withGlobalFlags2(client,"routes list")}]}),process.exit(1)),output_manager_default.error(`No production version found for ${import_chalk278.default.bold(project.name)}.`),1}versionId=productionVersion.id,versionName=productionVersion.id}if(diffFlag&&!versionIdFlag){output_manager_default.spinner("Fetching staging version");let{versions:versions2}=await getRouteVersions(client,project.id,{teamId}),stagingVersion=versions2.find(v=>v.isStaging);if(!stagingVersion){let msg=`No staged changes to diff. Run ${withGlobalFlags2(client,"routes add")} or ${withGlobalFlags2(client,"routes edit")} to make changes.`;return client.nonInteractive&&(outputAgentError(client,{status:"error",reason:"not_found",message:msg,next:[{command:withGlobalFlags2(client,"routes list")},{command:withGlobalFlags2(client,"routes add")}]}),process.exit(1)),output_manager_default.error(`No staged changes to diff. Run ${import_chalk278.default.cyan(withGlobalFlags2(client,"routes add"))} or ${import_chalk278.default.cyan(withGlobalFlags2(client,"routes edit"))} to make changes.`),1}versionId=stagingVersion.id,versionName=stagingVersion.id,useDiff=!0}if(versionIdFlag){output_manager_default.spinner("Fetching version");let{versions:versions2}=await getRouteVersions(client,project.id,{teamId}),result=findVersionById(client,versions2,versionIdFlag);if(result.error||!result.version){let msg=result.error??"Version not found";return client.nonInteractive&&(outputAgentError(client,{status:"error",reason:"not_found",message:msg,next:[{command:withGlobalFlags2(client,"routes list-versions")}]}),process.exit(1)),output_manager_default.error(msg),1}versionId=result.version.id,versionName=result.version.id,diffFlag&&(useDiff=!0)}let lsStamp=stamp_default(),spinnerMessage=`Fetching routes for ${import_chalk278.default.bold(project.name)}`;versionName&&(spinnerMessage+=` (version: ${versionName})`),search2&&(spinnerMessage+=` matching "${search2}"`),filter&&(spinnerMessage+=` filtered by ${filter}`),output_manager_default.spinner(spinnerMessage);let{routes:routes2,version:version2,limit}=await getRoutes(client,project.id,{teamId,search:search2,filter,versionId,diff:useDiff});if(useDiff){let added=routes2.filter(r=>r.action==="+"),removed=routes2.filter(r=>r.action==="-"),modified=routes2.filter(r=>r.action==="~"),unchanged=routes2.filter(r=>!r.action);output_manager_default.log(`Changes in staging version ${import_chalk278.default.bold(versionName||"")} ${import_chalk278.default.gray(lsStamp())}`),added.length===0&&removed.length===0&&modified.length===0?output_manager_default.log(`
|
|
1200
|
+
`)}output_manager_default.print(`${import_chalk275.default.bold.red("> Are you sure?")} ${import_chalk275.default.gray("(y/N) ")}`),process.stdin.on("data",d=>{process.stdin.pause(),resolve14(d.toString().trim())}).resume()})}function deploymentsAndProjects(deployments,projects2,conjunction="and"){return!projects2||projects2.length===0?`${(0,import_pluralize20.default)("deployment",deployments.length,!0)}`:!deployments||deployments.length===0?`${(0,import_pluralize20.default)("project",projects2.length,!0)}`:`${(0,import_pluralize20.default)("deployment",deployments.length,!0)} ${conjunction} ${(0,import_pluralize20.default)("project",projects2.length,!0)}`}var import_error_utils22=__toESM(require_dist(),1),import_ms34=__toESM(require_ms(),1);var import_chalk277=__toESM(require_source(),1);var import_ms33=__toESM(require_ms(),1);var import_chalk276=__toESM(require_source(),1);var import_ms32=__toESM(require_ms(),1);async function rollbackStatus({client,contextName,deployment,project,timeout="3m"}){let recentThreshold=Date.now()-(0,import_ms32.default)("3m"),rollbackTimeout=Date.now()+(0,import_ms32.default)(timeout),counter=0,spinnerMessage=deployment?"Rollback in progress":`Checking rollback status of ${project.name}`;contextName||({contextName}=await getScope(client));try{for(output_manager_default.spinner(`${spinnerMessage}\u2026`);;){let projectCheck=await getProjectByNameOrId(client,project.id,project.accountId,!0);if(projectCheck instanceof ProjectNotFound)throw projectCheck;let{jobStatus,requestedAt,toDeploymentId,type}=projectCheck.lastAliasRequest??{};if((!jobStatus||jobStatus!=="in-progress"&&jobStatus!=="pending")&&(output_manager_default.stopSpinner(),output_manager_default.log(`${spinnerMessage}\u2026`)),!jobStatus||!requestedAt||!toDeploymentId||requestedAt<recentThreshold)return output_manager_default.log("No deployment rollback in progress"),0;if(jobStatus==="skipped"&&type==="rollback")return output_manager_default.log("Rollback was skipped"),0;if(jobStatus==="succeeded")return await renderJobSucceeded2({client,contextName,performingRollback:!!deployment,requestedAt,project,toDeploymentId});if(jobStatus==="failed")return await renderJobFailed2({client,contextName,deployment,project,toDeploymentId});if(jobStatus!=="pending"&&jobStatus!=="in-progress")return output_manager_default.log(`Unknown rollback status "${jobStatus}"`),1;if(requestedAt<recentThreshold||Date.now()>=rollbackTimeout)return output_manager_default.log(`The rollback exceeded its deadline - rerun ${import_chalk276.default.bold(`${packageName} rollback ${toDeploymentId}`)} to try again`),1;counter++===0&&!deployment&&(spinnerMessage+=` requested at ${formatDate(requestedAt)}`),output_manager_default.spinner(`${spinnerMessage}\u2026`),await sleep(250)}}finally{output_manager_default.stopSpinner()}}async function renderJobFailed2({client,contextName,deployment,project,toDeploymentId}){try{let name=(deployment||await getDeployment(client,contextName,toDeploymentId))?.url;output_manager_default.error(`Failed to remap all aliases to the requested deployment ${name} (${toDeploymentId})`)}catch{output_manager_default.error(`Failed to remap all aliases to the requested deployment ${toDeploymentId}`)}let nextTimestamp;for(;;){let url=`/v9/projects/${project.id}/rollback/aliases?failedOnly=true&limit=20`;nextTimestamp&&(url+=`&until=${nextTimestamp}`);let{aliases:aliases2,pagination}=await client.fetch(url);for(let{alias:alias2,status:status6}of aliases2)output_manager_default.log(` ${renderAliasStatus(status6).padEnd(11)} ${alias2.alias} (${alias2.deploymentId})`);if(pagination?.next)nextTimestamp=pagination.next;else break}return 1}async function renderJobSucceeded2({client,contextName,performingRollback,project,requestedAt,toDeploymentId}){let deploymentInfo="";try{let deployment=await getDeployment(client,contextName,toDeploymentId);deploymentInfo=`${import_chalk276.default.bold(deployment.url)} (${toDeploymentId})`}catch(err){output_manager_default.debug(`Failed to get deployment url for ${toDeploymentId}: ${err?.toString()||err}`),deploymentInfo=import_chalk276.default.bold(toDeploymentId)}let duration=performingRollback?elapsed(Date.now()-requestedAt):"";return output_manager_default.log(`Success! ${import_chalk276.default.bold(project.name)} was rolled back to ${deploymentInfo} ${duration}`),0}async function requestRollback({client,deployId,timeout}){let{contextName,deployment,project}=await getProjectByDeployment({client,deployId});return await client.fetch(`/v9/projects/${project.id}/rollback/${deployment.id}`,{body:{},method:"POST"}),timeout!==void 0&&(0,import_ms33.default)(timeout)===0?(output_manager_default.log(`Successfully requested rollback of ${import_chalk277.default.bold(project.name)} to ${deployment.url} (${deployment.id})`),output_manager_default.log(`To check rollback status, run ${getCommandName("rollback")}.`),0):await rollbackStatus({client,contextName,deployment,project,timeout})}var RollbackTelemetryClient=class extends TelemetryClient{trackCliArgumentUrlOrDeploymentId(value){value&&this.trackCliArgument({arg:"urlOrDeploymentId",value:this.redactedValue})}trackCliSubcommandStatus(){this.trackCliSubcommand({subcommand:"status",value:"status"})}trackCliOptionTimeout(time){time&&this.trackCliOption({option:"timeout",value:"[TIME]"})}trackCliFlagYes(yes){yes&&this.trackCliFlag("yes")}};var rollback_default=async client=>{let parsedArgs,flagsSpecification=getFlagsSpecification(rollbackCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return printError(error),1}let telemetry2=new RollbackTelemetryClient({opts:{store:client.telemetryEventStore}});telemetry2.trackCliOptionTimeout(parsedArgs.flags["--timeout"]),telemetry2.trackCliFlagYes(parsedArgs.flags["--yes"]);let needHelp=parsedArgs.flags["--help"];if(!parsedArgs.args[1]&&needHelp)return telemetry2.trackCliFlagHelp("rollback"),output_manager_default.print(help(rollbackCommand,{columns:client.stderr.columns})),2;let timeout=parsedArgs.flags["--timeout"];if(timeout&&(0,import_ms34.default)(timeout)===void 0)return output_manager_default.error(`Invalid timeout "${timeout}"`),1;let actionOrDeployId=parsedArgs.args[1]||"status";try{if(actionOrDeployId==="status"){if(needHelp)return telemetry2.trackCliFlagHelp("rollback","status"),output_manager_default.print(help(statusSubcommand4,{columns:client.stderr.columns,parent:rollbackCommand})),2;telemetry2.trackCliSubcommandStatus();let project=await getProjectByCwdOrLink({autoConfirm:parsedArgs.flags["--yes"],client,commandName:"rollback",projectNameOrId:parsedArgs.args[2]});return await rollbackStatus({client,project,timeout})}return await requestRollback({client,deployId:actionOrDeployId,timeout})}catch(err){if((0,import_error_utils22.isErrnoException)(err)){if(err.code==="ERR_CANCELED")return 0;if(err.code==="ERR_INVALID_CWD"||err.code==="ERR_LINK_PROJECT")return 1}return output_manager_default.prettyError(err),1}};async function startRollingRelease({client,dpl,projectId,teamId,yes}){let{deployment}=await getProjectByDeployment({client,deployId:dpl}),promoteByCreation=!1;if(deployment.target!=="production")if(yes)promoteByCreation=!0;else{if(client.nonInteractive)return output_manager_default.error("This deployment is not a production deployment. In non-interactive mode use --yes to create a new production deployment and start the rolling release."),1;{let question="This deployment is not a production deployment and cannot be directly promoted. A new deployment will be built using your production environment. Are you sure you want to continue?";if(promoteByCreation=await client.input.confirm(question,!1),!promoteByCreation)return output_manager_default.error("Canceled"),0}}if(promoteByCreation){let newDeployment=await client.fetch(`/v13/deployments?teamId=${deployment.ownerId}`,{body:{deploymentId:deployment.id,name:projectId,target:"production",meta:{action:"promote"}},accountId:deployment.ownerId,method:"POST"});return output_manager_default.log(`Created production deployment ${newDeployment.id}: ${newDeployment.inspectorUrl}`),0}return await client.fetch(`/v1/projects/${projectId}/rolling-release/start?teamId=${teamId}`,{body:{canaryDeploymentId:deployment.id},json:!0,method:"POST"}),output_manager_default.log(`Requested rolling release start for ${deployment.id}`),0}var import_ms35=__toESM(require_ms(),1);function parseDuration(value){if(!value||/^\d+(s|ms)$/i.test(value))return;let milliseconds=(0,import_ms35.default)(/^\d+$/.test(value)?`${value}m`:value);if(milliseconds===void 0||milliseconds<=0)return;let minutes=Math.round(milliseconds/6e4);if(!(minutes<=0))return minutes}function parseStageFlags(stageFlags,advancementType){let stages=[];for(let stageValue of stageFlags){let parts=stageValue.split(","),percentage=parseInt(parts[0],10);if(isNaN(percentage)||percentage<1||percentage>99)return{stages:null,error:`Invalid stage percentage "${parts[0]}". Must be a number between 1 and 99.`};if(parts.length>1){if(advancementType==="manual-approval")return{stages:null,error:'Duration must not be provided for stages when advancement type is "manual-approval".'};let duration=parseDuration(parts[1]);if(duration===void 0)return{stages:null,error:`Invalid duration "${parts[1]}". Use minutes (e.g. "5m"), hours (e.g. "1h"), or days (e.g. "1d"). Seconds are not supported.`};stages.push({targetPercentage:percentage,duration})}else{if(advancementType==="automatic")return{stages:null,error:'Duration is required for each stage when advancement type is "automatic". Use the format "PERCENTAGE,DURATION" (e.g. "10,5m").'};stages.push({targetPercentage:percentage})}}for(let i=1;i<stages.length;i++)if(stages[i].targetPercentage<=stages[i-1].targetPercentage)return{stages:null,error:"Stage percentages must be in ascending order."};return{stages,error:null}}async function interactiveConfigure(client){if(await client.input.select({message:"Would you like to enable or disable rolling releases?",choices:[{name:"Enable",value:"enable"},{name:"Disable",value:"disable"}]})==="disable")return{config:void 0};let advancementType=await client.input.select({message:"How should stages advance?",choices:[{name:"automatic - Stages advance automatically after a set duration",value:"automatic"},{name:"manual-approval - Each stage requires manual approval to advance",value:"manual-approval"}]}),stages=[],stageNumber=1,addMore=!0;for(;addMore;){let percentageStr=await client.input.text({message:`Enter traffic percentage for stage ${stageNumber} (1-99):`,validate:val=>{let num=parseInt(val,10);return isNaN(num)||num<1||num>99?"Percentage must be a number between 1 and 99.":stages.length>0&&num<=stages[stages.length-1].targetPercentage?`Percentage must be greater than the previous stage (${stages[stages.length-1].targetPercentage}%).`:!0}}),percentage=parseInt(percentageStr,10),duration;if(advancementType==="automatic"){let durationStr=await client.input.text({message:"Enter duration for this stage (e.g. 5m, 1h):",validate:val=>parseDuration(val)===void 0?'Invalid duration. Use minutes (e.g. "5m"), hours (e.g. "1h"), or days (e.g. "1d"). Seconds are not supported.':!0});duration=parseDuration(durationStr)}stages.push({targetPercentage:percentage,duration}),stageNumber++,addMore=await client.input.confirm("Add another stage?",!1)}return output_manager_default.log(""),output_manager_default.log("Rolling release configuration:"),output_manager_default.log(` Advancement: ${advancementType}`),stages.forEach((stage,i)=>{let durationText=stage.duration!==void 0?` for ${stage.duration} minutes`:"";output_manager_default.log(` Stage ${i+1}: ${stage.targetPercentage}%${durationText}`)}),output_manager_default.log(` Stage ${stages.length+1}: 100% (final)`),output_manager_default.log(""),await client.input.confirm("Apply this configuration?",!0)?{config:{enabled:!0,advancementType,stages:[...stages,{targetPercentage:100}]}}:(output_manager_default.log("Configuration cancelled."),{exitCode:0})}async function buildConfigurePayload({client,cfgString,enableFlag,disableFlag,advancementType,stageFlags}){if(cfgString!==void 0){if(cfgString==="disable")return{config:void 0};try{return{config:JSON.parse(cfgString)}}catch{return output_manager_default.error("Invalid JSON provided for --cfg option."),{exitCode:1}}}if(disableFlag)return enableFlag?(output_manager_default.error("--enable and --disable are mutually exclusive."),{exitCode:1}):{config:void 0};if(enableFlag){if(advancementType!=="automatic"&&advancementType!=="manual-approval")return output_manager_default.error('--advancement-type is required when using --enable. Must be "automatic" or "manual-approval".'),{exitCode:1};if(!stageFlags||stageFlags.length===0)return output_manager_default.error("At least one --stage is required when using --enable."),{exitCode:1};let parsed=parseStageFlags(stageFlags,advancementType);return parsed.error!==null?(output_manager_default.error(parsed.error),{exitCode:1}):{config:{enabled:!0,advancementType,stages:[...parsed.stages,{targetPercentage:100}]}}}return advancementType!==void 0||stageFlags!==void 0&&stageFlags.length>0?(output_manager_default.error("--enable or --disable is required when using --advancement-type or --stage flags."),{exitCode:1}):client.nonInteractive?(output_manager_default.error("In non-interactive mode use --enable or --disable with --advancement-type and --stage as needed. Example: vercel rolling-release configure --enable --advancement-type=automatic --stage=10,5m --stage=50,10m"),{exitCode:1}):client.stdin.isTTY?interactiveConfigure(client):(output_manager_default.error("Missing configuration flags. Use --enable/--disable with --advancement-type and --stage, or run interactively in a terminal."),{exitCode:1})}async function configureRollingRelease({client,projectId,teamId,rollingReleaseConfig}){let body={...rollingReleaseConfig,enabled:!!rollingReleaseConfig};return await client.fetch(`/v1/projects/${projectId}/rolling-release/config?teamId=${teamId}`,{body,json:!0,method:"PATCH"}),rollingReleaseConfig?output_manager_default.log("Successfully configured rolling releases."):output_manager_default.log("Successfully disabled rolling releases."),0}async function approveRollingRelease({client,projectId,teamId,activeStageIndex,dpl}){let{deployment}=await getProjectByDeployment({client,deployId:dpl});return await client.fetch(`/v1/projects/${projectId}/rolling-release/approve-stage?teamId=${teamId}`,{method:"POST",json:!0,body:{activeStageIndex,nextStageIndex:activeStageIndex+1,canaryDeploymentId:deployment.id}}),output_manager_default.log(`Requested rolling release approval from stage ${activeStageIndex} to ${activeStageIndex+1} for ${deployment.id}`),0}async function abortRollingRelease({client,projectId,dpl,teamId}){let{deployment}=await getProjectByDeployment({client,deployId:dpl});return await client.fetch(`/v9/projects/${projectId}/rollback/${deployment.id}?teamId=${teamId}`,{body:{},method:"POST"}),output_manager_default.log(`Requested rolling release abort and rollback to ${deployment.id}`),0}async function completeRollingRelease({client,projectId,teamId,dpl}){let{deployment}=await getProjectByDeployment({client,deployId:dpl});return await client.fetch(`/v1/projects/${projectId}/rolling-release/complete?teamId=${teamId}`,{body:{canaryDeploymentId:deployment.id},json:!0,method:"POST"}),output_manager_default.log(`Requested rolling release completion for ${deployment.id}`),0}var RollingReleaseTelemetryClient=class extends TelemetryClient{trackCliOptionAction(value){this.trackCliOption({option:"action",value:value??""})}trackCliOptionName(name){name&&this.trackCliOption({option:"name",value:this.redactedValue})}trackCliOptionCfg(value){this.trackCliOption({option:"cfg",value:value??""})}trackCliOptionDpl(value){this.trackCliOption({option:"dpl",value:value??""})}trackCliOptionCurrentStageIndex(value){this.trackCliOption({option:"currentStageIndex",value:value??""})}trackCliSubcommandConfigure(actual){this.trackCliSubcommand({subcommand:"configure",value:actual})}trackCliSubcommandStart(actual){this.trackCliSubcommand({subcommand:"start",value:actual})}trackCliSubcommandApprove(actual){this.trackCliSubcommand({subcommand:"approve",value:actual})}trackCliSubcommandAbort(actual){this.trackCliSubcommand({subcommand:"abort",value:actual})}trackCliSubcommandComplete(actual){this.trackCliSubcommand({subcommand:"complete",value:actual})}trackCliSubcommandFetch(actual){this.trackCliSubcommand({subcommand:"fetch",value:actual})}trackCliFlagEnable(value){value&&this.trackCliFlag("enable")}trackCliFlagDisable(value){value&&this.trackCliFlag("disable")}trackCliOptionAdvancementType(value){value&&this.trackCliOption({option:"advancement-type",value})}trackCliOptionStage(value){value&&this.trackCliOption({option:"stage",value:value.join(",")})}};var COMMAND_CONFIG54={configure:getCommandAliases(configureSubcommand),start:getCommandAliases(startSubcommand2),approve:getCommandAliases(approveSubcommand),abort:getCommandAliases(abortSubcommand),complete:getCommandAliases(completeSubcommand),fetch:getCommandAliases(fetchSubcommand)},SUBCOMMANDS={configure:configureSubcommand,start:startSubcommand2,approve:approveSubcommand,abort:abortSubcommand,complete:completeSubcommand,fetch:fetchSubcommand};function getRollingReleaseSubcommand(subcommand){return typeof subcommand=="string"&&subcommand in SUBCOMMANDS?subcommand:void 0}function buildDeploymentSuggestionCommands(client,subcmd){let args=client.argv.slice(2),preservedParts=[],listParts=[],hasNonInteractive=!1;for(let i=2;i<args.length;i++){let arg=args[i];if(arg==="--non-interactive"){hasNonInteractive=!0;continue}if(arg.startsWith("--cwd=")){let cwdPath=arg.slice(6);cwdPath&&(preservedParts.push("--cwd",cwdPath),listParts.push("--cwd",cwdPath));continue}if(arg==="--cwd"){i+1<args.length&&(preservedParts.push("--cwd",args[i+1]),listParts.push("--cwd",args[i+1]),i++);continue}if(arg.startsWith("--project=")){let projectName=arg.slice(10);projectName&&listParts.push(projectName),preservedParts.push(arg);continue}if(arg==="--project"){i+1<args.length&&(listParts.push(args[i+1]),preservedParts.push(arg,args[i+1]),i++);continue}preservedParts.push(arg),listParts.push(arg)}let preservedSuffix=preservedParts.join(" "),listSuffix=listParts.join(" "),listCommand=listSuffix?`${packageName} ls ${listSuffix}`:`${packageName} ls`,base=preservedSuffix?`${packageName} rolling-release ${subcmd} ${preservedSuffix}`:`${packageName} rolling-release ${subcmd}`,defaultSuffix=subcmd==="approve"?"--dpl dpl_123 --currentStageIndex=0":"--dpl dpl_123",subcommandCommand=hasNonInteractive?`${base} ${defaultSuffix} --non-interactive`:`${base} ${defaultSuffix}`;return{listCommand,subcommandCommand}}function outputRollingReleaseErrorWithDeploymentSuggestions(client,subcmd,reason,message){let{listCommand,subcommandCommand}=buildDeploymentSuggestionCommands(client,subcmd);outputAgentError(client,{status:"error",reason,message,next:[{command:listCommand},{command:subcommandCommand}]},1)}async function rollingRelease(client){let telemetry2=new RollingReleaseTelemetryClient({opts:{store:client.telemetryEventStore}}),{subcommand,args:subcommandArgs,subcommandOriginal}=getSubcommand7(client.argv.slice(3),COMMAND_CONFIG54),needHelp=client.argv.includes("--help")||client.argv.includes("-h");if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("rolling-release"),output_manager_default.print(help(rollingReleaseCommand,{columns:client.stderr.columns})),2;function printHelp(command2){output_manager_default.print(help(command2,{parent:rollingReleaseCommand,columns:client.stderr.columns}))}try{let subcommandName=getRollingReleaseSubcommand(subcommand),subcommandConfig=subcommandName?SUBCOMMANDS[subcommandName]:void 0;if(subcommandConfig&&needHelp)return telemetry2.trackCliFlagHelp("rolling-release",subcommandOriginal),printHelp(subcommandConfig),2;let subcommandFlags,projectName;subcommandConfig&&(subcommandFlags=parseArguments(subcommandArgs,getFlagsSpecification(subcommandConfig.options)),projectName=subcommandFlags.flags["--project"],telemetry2.trackCliOptionProject(projectName));let link=await resolveProjectContext({client,projectNameOrId:projectName});if(link.status==="error")return link.exitCode;if(link.status==="not_linked")return client.nonInteractive&&outputAgentError(client,{status:"error",reason:"not_linked",message:"No project found for rolling releases. Specify a project with --project <name-or-id>, or link your project first.",next:[{command:`${packageName} link`}]},1),output_manager_default.error(`No project found. Specify a project with \`--project <name-or-id>\`, or run \`${packageName} link\` to link your project first.`),1;let{project,org}=link;if(client.config.currentTeam=org.type==="team"?org.id:void 0,!subcommandName||!subcommandFlags)return output_manager_default.debug(`Invalid subcommand: ${subcommand}`),output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG54)),output_manager_default.print(help(rollingReleaseCommand,{columns:client.stderr.columns})),2;switch(subcommandName){case"configure":{let cfgString=subcommandFlags.flags["--cfg"],enableFlag=subcommandFlags.flags["--enable"],disableFlag=subcommandFlags.flags["--disable"],advancementType=subcommandFlags.flags["--advancement-type"],stageFlags=subcommandFlags.flags["--stage"];telemetry2.trackCliFlagEnable(enableFlag),telemetry2.trackCliFlagDisable(disableFlag),telemetry2.trackCliOptionAdvancementType(advancementType),telemetry2.trackCliOptionStage(stageFlags);let configResult=await buildConfigurePayload({client,cfgString,enableFlag,disableFlag,advancementType,stageFlags});if(configResult.exitCode!==void 0)return configResult.exitCode;await configureRollingRelease({client,projectId:project.id,teamId:org.id,rollingReleaseConfig:configResult.config});break}case"start":{let dpl=subcommandFlags.flags["--dpl"];if(dpl===void 0)return client.nonInteractive&&outputRollingReleaseErrorWithDeploymentSuggestions(client,"start","missing_flags","Starting a rolling release in non-interactive mode requires the --dpl flag."),output_manager_default.error("starting a rolling release requires --dpl option."),1;try{await startRollingRelease({client,dpl,projectId:project.id,teamId:project.accountId,yes:subcommandFlags.flags["--yes"]??!1})}catch(err){if(client.nonInteractive&&isAPIError(err))return outputRollingReleaseErrorWithDeploymentSuggestions(client,"start","api_error",err.message||"Starting the rolling release failed for this deployment."),1;throw err}break}case"approve":{let dpl=subcommandFlags.flags["--dpl"],currentStageIndex=subcommandFlags.flags["--currentStageIndex"],activeStageIndex=parseInt(currentStageIndex??"");if(!dpl)return client.nonInteractive&&outputRollingReleaseErrorWithDeploymentSuggestions(client,"approve","missing_flags","Approving a rolling release in non-interactive mode requires --dpl and --currentStageIndex."),output_manager_default.error("Missing required flag --dpl"),1;if(currentStageIndex===void 0)return client.nonInteractive&&outputRollingReleaseErrorWithDeploymentSuggestions(client,"approve","missing_flags","Approving a rolling release in non-interactive mode requires --currentStageIndex."),output_manager_default.error("Missing required flag --currentStageIndex"),1;if(isNaN(activeStageIndex))return client.nonInteractive&&outputRollingReleaseErrorWithDeploymentSuggestions(client,"approve","invalid_flag","--currentStageIndex must be a valid number."),output_manager_default.error("--currentStageIndex must be a valid number."),1;await approveRollingRelease({client,projectId:project.id,teamId:org.id,activeStageIndex,dpl});break}case"abort":{let dpl=subcommandFlags.flags["--dpl"];if(!dpl)return client.nonInteractive&&outputRollingReleaseErrorWithDeploymentSuggestions(client,"abort","missing_flags","Aborting a rolling release in non-interactive mode requires the --dpl flag."),output_manager_default.error("Missing required flag --dpl"),1;try{await abortRollingRelease({client,projectId:project.id,teamId:org.id,dpl})}catch(err){if(client.nonInteractive&&isAPIError(err))return outputRollingReleaseErrorWithDeploymentSuggestions(client,"abort","api_error",err.message||"Aborting the rolling release failed for this deployment."),1;throw err}break}case"complete":{let dpl=subcommandFlags.flags["--dpl"];if(!dpl)return client.nonInteractive&&outputRollingReleaseErrorWithDeploymentSuggestions(client,"complete","missing_flags","Completing a rolling release in non-interactive mode requires the --dpl flag."),output_manager_default.error("Missing required flag --dpl"),1;await completeRollingRelease({client,projectId:project.id,teamId:org.id,dpl});break}case"fetch":{let result=await requestRollingRelease({client,projectId:project.id,teamId:org.id});output_manager_default.log(JSON.stringify(result,null,2));break}}return 0}catch(err){return client.nonInteractive&&isAPIError(err)&&outputAgentError(client,{status:"error",reason:"api_error",message:err.message||"Rolling release command failed."},1),printError(err),1}}var import_chalk278=__toESM(require_source(),1),import_pluralize21=__toESM(require_pluralize(),1);async function list23(client,argv){let parsed=await parseSubcommandArgs(argv,listSubcommand19,client);if(typeof parsed=="number")return parsed;let link=await requireProjectContext(client,"routes",parsed.flags["--project"]);if(typeof link=="number")return link;let{project,org}=link,{flags}=parsed,teamId=org.type==="team"?org.id:void 0,search2=flags["--search"],filter=flags["--filter"],production=flags["--production"],versionIdFlag=flags["--version-id"],diffFlag=flags["--diff"],expand=flags["--expand"];if(filter){let validFilters=["rewrite","redirect","set_status","transform"];if(!validFilters.includes(filter)){let msg=`Invalid filter type "${filter}". Valid types: ${validFilters.join(", ")}`;return client.nonInteractive&&(outputAgentError(client,{status:"error",reason:"invalid_arguments",message:msg,next:[{command:withGlobalFlags2(client,"routes list")}]}),process.exit(1)),output_manager_default.error(msg),1}}if(production&&versionIdFlag){let msg="Cannot use both --production and --version-id flags together";return client.nonInteractive&&(outputAgentError(client,{status:"error",reason:"invalid_arguments",message:msg,next:[{command:withGlobalFlags2(client,"routes list")}]}),process.exit(1)),output_manager_default.error(msg),1}if(production&&diffFlag){let msg="Cannot use both --production and --diff flags together. --diff compares staged changes against production.";return client.nonInteractive&&(outputAgentError(client,{status:"error",reason:"invalid_arguments",message:msg,next:[{command:withGlobalFlags2(client,"routes list --diff")}]}),process.exit(1)),output_manager_default.error(msg),1}let versionId,versionName,useDiff=!1;if(production){output_manager_default.spinner("Fetching production version");let{versions:versions2}=await getRouteVersions(client,project.id,{teamId}),productionVersion=versions2.find(v=>!v.isStaging);if(!productionVersion){let msg=`No production version found for ${project.name}.`;return client.nonInteractive&&(outputAgentError(client,{status:"error",reason:"not_found",message:msg,next:[{command:withGlobalFlags2(client,"routes list")}]}),process.exit(1)),output_manager_default.error(`No production version found for ${import_chalk278.default.bold(project.name)}.`),1}versionId=productionVersion.id,versionName=productionVersion.id}if(diffFlag&&!versionIdFlag){output_manager_default.spinner("Fetching staging version");let{versions:versions2}=await getRouteVersions(client,project.id,{teamId}),stagingVersion=versions2.find(v=>v.isStaging);if(!stagingVersion){let msg=`No staged changes to diff. Run ${withGlobalFlags2(client,"routes add")} or ${withGlobalFlags2(client,"routes edit")} to make changes.`;return client.nonInteractive&&(outputAgentError(client,{status:"error",reason:"not_found",message:msg,next:[{command:withGlobalFlags2(client,"routes list")},{command:withGlobalFlags2(client,"routes add")}]}),process.exit(1)),output_manager_default.error(`No staged changes to diff. Run ${import_chalk278.default.cyan(withGlobalFlags2(client,"routes add"))} or ${import_chalk278.default.cyan(withGlobalFlags2(client,"routes edit"))} to make changes.`),1}versionId=stagingVersion.id,versionName=stagingVersion.id,useDiff=!0}if(versionIdFlag){output_manager_default.spinner("Fetching version");let{versions:versions2}=await getRouteVersions(client,project.id,{teamId}),result=findVersionById(client,versions2,versionIdFlag);if(result.error||!result.version){let msg=result.error??"Version not found";return client.nonInteractive&&(outputAgentError(client,{status:"error",reason:"not_found",message:msg,next:[{command:withGlobalFlags2(client,"routes list-versions")}]}),process.exit(1)),output_manager_default.error(msg),1}versionId=result.version.id,versionName=result.version.id,diffFlag&&(useDiff=!0)}let lsStamp=stamp_default(),spinnerMessage=`Fetching routes for ${import_chalk278.default.bold(project.name)}`;versionName&&(spinnerMessage+=` (version: ${versionName})`),search2&&(spinnerMessage+=` matching "${search2}"`),filter&&(spinnerMessage+=` filtered by ${filter}`),output_manager_default.spinner(spinnerMessage);let{routes:routes2,version:version2,limit}=await getRoutes(client,project.id,{teamId,search:search2,filter,versionId,diff:useDiff});if(useDiff){let added=routes2.filter(r=>r.action==="+"),removed=routes2.filter(r=>r.action==="-"),modified=routes2.filter(r=>r.action==="~"),unchanged=routes2.filter(r=>!r.action);output_manager_default.log(`Changes in staging version ${import_chalk278.default.bold(versionName||"")} ${import_chalk278.default.gray(lsStamp())}`),added.length===0&&removed.length===0&&modified.length===0?output_manager_default.log(`
|
|
1199
1201
|
No changes from production version
|
|
1200
1202
|
`):(added.length>0&&(output_manager_default.print(`
|
|
1201
1203
|
${import_chalk278.default.bold(import_chalk278.default.green(`Added (${added.length}):`))}
|
|
@@ -1248,7 +1250,7 @@ ${import_chalk274.default.gray("No changes detected from current production vers
|
|
|
1248
1250
|
`),output_manager_default.print(` ${import_chalk281.default.gray("ID:")} ${route.id}
|
|
1249
1251
|
`),output_manager_default.print(`
|
|
1250
1252
|
${import_chalk281.default.bold("Staging version:")} ${version2.id}
|
|
1251
|
-
`),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_CONFIG55={list:getCommandAliases(listSubcommand19),"list-versions":getCommandAliases(listVersionsSubcommand2),inspect:getCommandAliases(inspectSubcommand12),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 main30(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),1}let subArgs=parsedArgs.args.slice(1),{subcommand,args,subcommandOriginal}=getSubcommand7(subArgs,COMMAND_CONFIG55),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("routes"),output_manager_default.print(help(routesCommand,{columns:client.stderr.columns})),2;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(listSubcommand19),2):(telemetry2.trackCliSubcommandList(subcommandOriginal),list23(client,args));case"list-versions":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(listVersionsSubcommand2),2):(telemetry2.trackCliSubcommandListVersions(subcommandOriginal),listVersions3(client,args));case"inspect":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(inspectSubcommand12),2):(telemetry2.trackCliSubcommandInspect(subcommandOriginal),inspect17(client,args));case"add":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(addSubcommand10),2):(telemetry2.trackCliSubcommandAdd(subcommandOriginal),add13(client,args));case"edit":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(editSubcommand2),2):(telemetry2.trackCliSubcommandEdit(subcommandOriginal),(await import("./chunks/edit-OUEGHFNI.js")).default(client,args));case"delete":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(deleteSubcommand3),2):(telemetry2.trackCliSubcommandDelete(subcommandOriginal),(await import("./chunks/delete-44OXGSMJ.js")).default(client,args));case"enable":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(enableSubcommand3),2):(telemetry2.trackCliSubcommandEnable(subcommandOriginal),(await import("./chunks/enable-J3JXIEXT.js")).default(client,args));case"disable":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(disableSubcommand3),2):(telemetry2.trackCliSubcommandDisable(subcommandOriginal),(await import("./chunks/disable-CAXQ5K7P.js")).default(client,args));case"reorder":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(reorderSubcommand),2):(telemetry2.trackCliSubcommandReorder(subcommandOriginal),(await import("./chunks/reorder-QLBFRK7S.js")).default(client,args));case"export":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(exportSubcommand),2):(telemetry2.trackCliSubcommandExport(subcommandOriginal),(await import("./chunks/export-V6BO2IPM.js")).default(client,args));case"publish":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(publishSubcommand2),2):(telemetry2.trackCliSubcommandPublish(subcommandOriginal),(await import("./chunks/publish-TEH23DH4.js")).default(client,args));case"restore":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(restoreSubcommand2),2):(telemetry2.trackCliSubcommandRestore(subcommandOriginal),(await import("./chunks/restore-4JNAT7IE.js")).default(client,args));case"discard-staging":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(discardSubcommand2),2):(telemetry2.trackCliSubcommandDiscardStaging(subcommandOriginal),(await import("./chunks/discard-VK4JVVUI.js")).default(client,args));default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG55)),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 arg=args[i],[option,inlineValue]=arg.split("=",2);if(names.includes(option)){if(inlineValue!==void 0){value=inlineValue;continue}i+1<args.length&&(value=args[i+1],i++)}}return value}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.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{trackCliSubcommandGet(actual){this.trackCliSubcommand({subcommand:"get",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})}};var DEFAULT_SCHEDULES_BASE_URL="https://vercel-schedules.com",DEFAULT_SCHEDULE_NAMESPACE="default";function sanitizeSchedule(schedule){let{trackId:_trackId,...publicSchedule}=schedule;return publicSchedule}var SchedulesClient=class{constructor(client,options){this.client=client;this.options=options;this.baseUrl=new URL(options.baseUrl??process.env.VERCEL_SCHEDULE_BASE_URL??DEFAULT_SCHEDULES_BASE_URL)}request(path3,options={}){let url=new URL(path3,this.baseUrl);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=20}={}){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}})}};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})}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} schedule ${context.namespace}/${context.name}`}function ambiguousInvokeError(){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.",retryable:!1,userActionRequired:!0}}function getSchedulesError(client,error,context){if(!isAPIError(error))return context.action==="invoke"?ambiguousInvokeError():{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(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==="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==="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.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"||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():{reason:AGENT_REASON.API_ERROR,message:"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):(output_manager_default.fatal(details.message),1)}var IDENTIFIER_PATTERN2=/^[0-9A-Za-z][0-9A-Za-z._-]*$/;var LOCAL_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 isValidLocalDatetime(value){let match=LOCAL_DATETIME_PATTERN.exec(value);if(!match)return!1;let[,yearValue,monthValue,dayValue,hourValue,minuteValue,secondValue]=match,year=Number(yearValue),month=Number(monthValue),day=Number(dayValue),hour=Number(hourValue),minute=Number(minuteValue),second=Number(secondValue),daysInMonth=[31,year%4===0&&(year%100!==0||year%400===0)?29:28,31,30,31,30,31,31,30,31,30,31];return month>=1&&month<=12&&day>=1&&day<=daysInMonth[month-1]&&hour>=0&&hour<=23&&minute>=0&&minute<=59&&second>=0&&second<=59}function parseScheduleExpression(cron,at,required){return cron!==void 0&&at!==void 0?{valid:!1,error:"Use either `--cron` or `--at`, not both."}:cron!==void 0?cron.trim()?{valid:!0,value:{type:"cron",cron}}:{valid:!1,error:"`--cron` cannot be empty."}:at!==void 0?isValidLocalDatetime(at)?{valid:!0,value:{type:"single",at}}:{valid:!1,error:"`--at` must use YYYY-MM-DDTHH:mm:ss without a timezone suffix. Use `--timezone` to select the timezone."}: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."}}}function invalidScheduleArguments(client,usage2,message){return client.nonInteractive?(outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message,next:[{command:buildCommandWithGlobalFlags(client.argv,usage2),when:"Provide valid schedule arguments"}]}),1):(output_manager_default.fatal(message),1)}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)}
|
|
1253
|
+
`),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_CONFIG55={list:getCommandAliases(listSubcommand19),"list-versions":getCommandAliases(listVersionsSubcommand2),inspect:getCommandAliases(inspectSubcommand12),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 main30(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),1}let subArgs=parsedArgs.args.slice(1),{subcommand,args,subcommandOriginal}=getSubcommand7(subArgs,COMMAND_CONFIG55),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("routes"),output_manager_default.print(help(routesCommand,{columns:client.stderr.columns})),2;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(listSubcommand19),2):(telemetry2.trackCliSubcommandList(subcommandOriginal),list23(client,args));case"list-versions":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(listVersionsSubcommand2),2):(telemetry2.trackCliSubcommandListVersions(subcommandOriginal),listVersions3(client,args));case"inspect":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(inspectSubcommand12),2):(telemetry2.trackCliSubcommandInspect(subcommandOriginal),inspect17(client,args));case"add":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(addSubcommand10),2):(telemetry2.trackCliSubcommandAdd(subcommandOriginal),add13(client,args));case"edit":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(editSubcommand2),2):(telemetry2.trackCliSubcommandEdit(subcommandOriginal),(await import("./chunks/edit-FEZFLAIJ.js")).default(client,args));case"delete":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(deleteSubcommand3),2):(telemetry2.trackCliSubcommandDelete(subcommandOriginal),(await import("./chunks/delete-PWVNXN4N.js")).default(client,args));case"enable":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(enableSubcommand3),2):(telemetry2.trackCliSubcommandEnable(subcommandOriginal),(await import("./chunks/enable-QDIH43E3.js")).default(client,args));case"disable":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(disableSubcommand3),2):(telemetry2.trackCliSubcommandDisable(subcommandOriginal),(await import("./chunks/disable-62HLGVJG.js")).default(client,args));case"reorder":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(reorderSubcommand),2):(telemetry2.trackCliSubcommandReorder(subcommandOriginal),(await import("./chunks/reorder-64FNHY6J.js")).default(client,args));case"export":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(exportSubcommand),2):(telemetry2.trackCliSubcommandExport(subcommandOriginal),(await import("./chunks/export-FO5JCAB4.js")).default(client,args));case"publish":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(publishSubcommand2),2):(telemetry2.trackCliSubcommandPublish(subcommandOriginal),(await import("./chunks/publish-WTIW7W3Z.js")).default(client,args));case"restore":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(restoreSubcommand2),2):(telemetry2.trackCliSubcommandRestore(subcommandOriginal),(await import("./chunks/restore-KQ5T3MWQ.js")).default(client,args));case"discard-staging":return needHelp?(telemetry2.trackCliFlagHelp("routes",subcommandOriginal),printHelp(discardSubcommand2),2):(telemetry2.trackCliSubcommandDiscardStaging(subcommandOriginal),(await import("./chunks/discard-LYY4AMIA.js")).default(client,args));default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG55)),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 arg=args[i],[option,inlineValue]=arg.split("=",2);if(names.includes(option)){if(inlineValue!==void 0){value=inlineValue;continue}i+1<args.length&&(value=args[i+1],i++)}}return value}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.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{trackCliSubcommandGet(actual){this.trackCliSubcommand({subcommand:"get",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})}};var DEFAULT_SCHEDULES_BASE_URL="https://vercel-schedules.com",DEFAULT_SCHEDULE_NAMESPACE="default";function sanitizeSchedule(schedule){let{trackId:_trackId,...publicSchedule}=schedule;return publicSchedule}var SchedulesClient=class{constructor(client,options){this.client=client;this.options=options;this.baseUrl=new URL(options.baseUrl??process.env.VERCEL_SCHEDULE_BASE_URL??DEFAULT_SCHEDULES_BASE_URL)}request(path3,options={}){let url=new URL(path3,this.baseUrl);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=20}={}){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}})}};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})}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} schedule ${context.namespace}/${context.name}`}function ambiguousInvokeError(){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.",retryable:!1,userActionRequired:!0}}function getSchedulesError(client,error,context){if(!isAPIError(error))return context.action==="invoke"?ambiguousInvokeError():{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(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==="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==="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.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"||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():{reason:AGENT_REASON.API_ERROR,message:"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):(output_manager_default.fatal(details.message),1)}var IDENTIFIER_PATTERN2=/^[0-9A-Za-z][0-9A-Za-z._-]*$/;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 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."}}}function invalidScheduleArguments(client,usage2,message){return client.nonInteractive?(outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message,next:[{command:buildCommandWithGlobalFlags(client.argv,usage2),when:"Provide valid schedule arguments"}]}),1):(output_manager_default.fatal(message),1)}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)}
|
|
1252
1254
|
`)}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.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 link=await requireProjectContext(client,"schedules");if(typeof link=="number")return link;let presentParticiple=action==="enable"?"Enabling":action==="disable"?"Disabling":"Invoking";outputMode.json||output_manager_default.spinner(`${presentParticiple} schedule\u2026`);let schedulesClient=new SchedulesClient(client,{ownerId:link.org.id,projectId:link.project.id}),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,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)}
|
|
1253
1255
|
`)}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})}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.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 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 link=await requireProjectContext(client,"schedules");if(typeof link=="number")return link;outputMode.json||output_manager_default.spinner("Creating schedule\u2026");let schedule;try{schedule=await new SchedulesClient(client,{ownerId:link.org.id,projectId:link.project.id}).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",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})}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.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:"Deleting a schedule requires confirmation. Re-run with `--yes`.",next:[{command:buildCommandWithYes(client.argv)}]},1),1;let link=await requireProjectContext(client,"schedules");if(typeof link=="number")return link;if(!skipConfirmation&&!await client.input.confirm(`Delete schedule ${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 new SchedulesClient(client,{ownerId:link.org.id,projectId:link.project.id}).delete(identifier)).scheduleId}catch(error){return output_manager_default.stopSpinner(),handleSchedulesApiError(client,error,{action:"delete",name:identifier.name,namespace:identifier.namespace})}output_manager_default.stopSpinner();let message=`Deleted schedule ${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)}
|
|
1254
1256
|
`)}else output_manager_default.success(message);return 0}var import_chalk282=__toESM(require_source(),1);var SchedulesGetTelemetryClient=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})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}};var USAGE15="schedules get <name>";function invalidArguments2(client,message){return client.nonInteractive?(outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message,next:[{command:buildCommandWithGlobalFlags(client.argv,USAGE15),when:"Provide a valid schedule name"}]}),1):(output_manager_default.fatal(message),1)}function formatExpression(expression){return expression.type==="cron"?expression.cron:expression.at}function formatTarget(target){return target.type==="queue"?`${target.topic} ${import_chalk282.default.gray("(Queue)")}`:`${target.function} ${import_chalk282.default.gray("(Function)")}`}function capitalize(value){return`${value.charAt(0).toUpperCase()}${value.slice(1)}`}function printSchedule(schedule){printAlignedLabel("Name",schedule.name),printAlignedLabel("Namespace",schedule.namespace),printAlignedLabel("State",capitalize(schedule.state)),printAlignedLabel("Source",capitalize(schedule.source)),printAlignedLabel("Type",capitalize(schedule.expression.type)),printAlignedLabel("Expression",formatExpression(schedule.expression)),printAlignedLabel("Timezone",schedule.timezone),schedule.jitter!==void 0&&printAlignedLabel("Jitter",`${schedule.jitter} minute${schedule.jitter===1?"":"s"}`),printAlignedLabel("Target",formatTarget(schedule.target)),printAlignedLabel("Schedule ID",schedule.scheduleId),printAlignedLabel("Project ID",schedule.projectId),printAlignedLabel("Owner ID",schedule.ownerId),printAlignedLabel("Created",formatDate(schedule.createdAt)),printAlignedLabel("Updated",formatDate(schedule.updatedAt))}async function get3(client,argv){let telemetry2=new SchedulesGetTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs;try{parsedArgs=parseArguments(argv,getFlagsSpecification(getSubcommand2.options))}catch(error){return client.nonInteractive?(outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message:error instanceof Error?error.message:String(error)}),1):(output_manager_default.fatal(error instanceof Error?error.message:String(error)),1)}let{args,flags}=parsedArgs,[name]=args,namespace=flags["--namespace"]??DEFAULT_SCHEDULE_NAMESPACE;if(telemetry2.trackCliArgumentName(name),telemetry2.trackCliOptionNamespace(flags["--namespace"]),telemetry2.trackCliOptionFormat(flags["--format"]),telemetry2.trackCliFlagJson(flags["--json"]),!name)return invalidArguments2(client,"A schedule name is required");if(args.length!==1)return invalidArguments2(client,`Expected one schedule name. Usage: ${getCommandName(USAGE15)}`);let nameError=validateScheduleIdentifier(name,"Schedule name");if(nameError)return invalidArguments2(client,nameError);let namespaceError=validateScheduleIdentifier(namespace,"Namespace");if(namespaceError)return invalidArguments2(client,namespaceError);let formatResult=validateJsonOutput(flags);if(!formatResult.valid)return invalidArguments2(client,formatResult.error);let asJson=formatResult.jsonOutput||client.nonInteractive,link=await requireProjectContext(client,"schedules");if(typeof link=="number")return link;asJson||output_manager_default.spinner("Fetching schedule\u2026");let schedule;try{schedule=await new SchedulesClient(client,{ownerId:link.org.id,projectId:link.project.id}).get({name,namespace})}catch(error){return output_manager_default.stopSpinner(),handleSchedulesApiError(client,error,{action:"get",name,namespace})}if(output_manager_default.stopSpinner(),asJson){let jsonOutput=client.nonInteractive?{status:AGENT_STATUS.OK,schedule,message:`Schedule ${namespace}/${name} found.`}:schedule;return client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
|
|
@@ -1289,7 +1291,7 @@ ${gutter} ${import_chalk285.default.bold(heading)}
|
|
|
1289
1291
|
Installing ${toInstall.length} skill${toInstall.length>1?"s":""}...
|
|
1290
1292
|
`);let bySource=new Map;for(let skill of toInstall){let existing=bySource.get(skill.source)??[];existing.push(skill.skillId),bySource.set(skill.source,existing)}let succeeded=[],failed=[];for(let[source,skillIds]of bySource){let label=skillIds.length===1?skillIds[0]:skillIds.join(", ");output_manager_default.spinner(`Installing ${label} from ${source}...`);let args=["skills","add",source];for(let id of skillIds)args.push("--skill",id);args.push("-y"),output_manager_default.debug(`> npx ${args.join(" ")}`);let code2=await runCommand("npx",args);output_manager_default.stopSpinner(),code2!==0?failed.push(...skillIds):succeeded.push(...skillIds)}return succeeded.length>0&&output_manager_default.success(`Installed ${succeeded.length} skill${succeeded.length>1?"s":""}: ${succeeded.join(", ")}`),failed.length>0&&output_manager_default.error(`Failed to install: ${failed.join(", ")}`),0}async function displayResults(client,results,asJson,context,cwd){let empty={exitCode:0,results,installedChecks:[]};if(results.length===0)return output_manager_default.log("No skills found."),output_manager_default.log(`Try searching directly: ${import_chalk287.default.cyan("vercel skills <query>")}`),empty;let installedChecks=await Promise.all(results.map(s=>isSkillInstalled(s.skillId,cwd)));if(asJson){output_manager_default.stopSpinner();let skillsWithStatus=results.map((s,i)=>({...s,installed:installedChecks[i]}));return client.stdout.write(`${JSON.stringify({context,skills:skillsWithStatus},null,2)}
|
|
1291
1293
|
`),{exitCode:0,results,installedChecks}}let tableData=[["Skill","Installs","Source",""].map(h=>import_chalk287.default.bold(import_chalk287.default.cyan(h))),...results.map((s,i)=>[s.skillId,formatInstalls(s.installs),import_chalk287.default.gray(s.source),installedChecks[i]?import_chalk287.default.green("installed"):""])];return output_manager_default.log(`
|
|
1292
|
-
${table(tableData,{hsep:4})}`),{exitCode:0,results,installedChecks}}function runCommand(cmd2,args){return new Promise(resolve14=>{let child=spawn4(cmd2,args,{stdio:"pipe"});child.on("close",code2=>resolve14(code2??1)),child.on("error",()=>resolve14(1))})}var StorageTelemetryClient=class extends TelemetryClient{trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandCreate(actual){this.trackCliSubcommand({subcommand:"create",value:actual})}trackCliSubcommandGet(actual){this.trackCliSubcommand({subcommand:"get",value:actual})}trackCliSubcommandDelete(actual){this.trackCliSubcommand({subcommand:"delete",value:actual})}trackCliSubcommandConnect(actual){this.trackCliSubcommand({subcommand:"connect",value:actual})}trackCliSubcommandStatus(actual){this.trackCliSubcommand({subcommand:"status",value:actual})}trackCliSubcommandUpdate(actual){this.trackCliSubcommand({subcommand:"update",value:actual})}trackCliSubcommandDisconnect(actual){this.trackCliSubcommand({subcommand:"disconnect",value:actual})}};var import_chalk290=__toESM(require_source(),1);var STORAGE_AUTH_MODES=["oidc","token"],DEFAULT_STORAGE_AUTH_MODE="oidc";function parseAuthMode(value){if(value===void 0)return{valid:!0,mode:DEFAULT_STORAGE_AUTH_MODE,explicit:!1};let normalized=value.toLowerCase();return STORAGE_AUTH_MODES.includes(normalized)?{valid:!0,mode:normalized,explicit:!0}:{valid:!1,error:`Invalid --auth value: "${value}". Must be one of: ${STORAGE_AUTH_MODES.join(", ")}.`}}function resolveStorageAuth({store,mode,addRwToken}){let product=storeProductLabel(store);return storeSupportsOidc(store)?mode==="token"&&!addRwToken?{valid:!1,reason:"rw_token_opt_in_required",error:"--auth token writes a long-lived read-write token into your project.",hint:"Pass --add-rw-token to confirm, or drop --auth token to use the OIDC default."}:mode==="token"?{valid:!0,auth:{requested:mode,effective:"token",useOidcHeader:!1,readWriteToken:!0,notes:[]}}:{valid:!0,auth:{requested:mode,effective:"oidc",useOidcHeader:!0,readWriteToken:addRwToken,notes:addRwToken?["The static read-write token is written alongside the OIDC variables because --add-rw-token was passed."]:[]}}:addRwToken?{valid:!1,reason:"unsupported_auth_mode",error:`--add-rw-token only applies to Vercel Blob stores. ${store.name} is a ${product} resource, and its credentials are issued by the provider.`,hint:"Re-run without --add-rw-token."}:{valid:!0,auth:{requested:mode,effective:"provider-managed",useOidcHeader:mode==="oidc",readWriteToken:!1,notes:[`${product} issues its own credentials for this resource; Vercel OIDC does not apply.`]}}}function storageAuthHeaders(auth){return auth.useOidcHeader?{"x-vercel-use-oidc":"1"}:{}}function describeStorageAuth(auth){switch(auth.effective){case"oidc":return auth.readWriteToken?"oidc + static read-write token":"oidc (no static credentials)";case"token":return"static read-write token";case"provider-managed":return"provider-managed credentials"}}function inferConnectionAuth(store,environmentVariables){if(!storeSupportsOidc(store))return"provider-managed";if(!environmentVariables)return"unknown";let hasStoreId=environmentVariables.some(name=>name.endsWith("_STORE_ID")),hasRwToken=environmentVariables.some(name=>name.endsWith("_READ_WRITE_TOKEN"));return hasStoreId?"oidc":hasRwToken?"token":"unknown"}async function connectStoreToProject(client,{store,projectId,environments,envVarPrefix,auth,accountId}){await client.fetch(`/v1/storage/stores/${encodeURIComponent(store.id)}/connections`,{json:!0,method:"POST",headers:storageAuthHeaders(auth),body:{projectId,envVarEnvironments:environments,...envVarPrefix!==void 0?{envVarPrefix}:{},...storeSupportsOidc(store)&&!auth.readWriteToken?{skipReadWriteToken:!0}:{}},accountId})}async function updateStoreConnection(client,{store,connectionId,environments,envVarPrefix,skipReadWriteToken,accountId}){await client.fetch(`/v1/storage/stores/${encodeURIComponent(store.id)}/connections/${encodeURIComponent(connectionId)}`,{json:!0,method:"PATCH",body:{...environments!==void 0?{envVarEnvironments:environments}:{},...envVarPrefix!==void 0?{envVarPrefix}:{},...skipReadWriteToken!==void 0?{skipReadWriteToken}:{}},accountId})}async function upgradeStoreConnectionToOidc(client,{store,connectionId,auth,accountId}){await client.fetch(`/v1/storage/stores/${encodeURIComponent(store.id)}/connections/${encodeURIComponent(connectionId)}/upgrade-to-oidc`,{json:!0,method:"POST",headers:storageAuthHeaders(auth),accountId})}async function disconnectStoreConnection(client,{store,connectionId,accountId}){await client.fetch(`/v1/storage/stores/${encodeURIComponent(store.id)}/connections/${encodeURIComponent(connectionId)}`,{json:!0,method:"DELETE",accountId})}async function disconnectAllStoreConnections(client,{store,accountId}){await client.fetch(`/v1/storage/stores/${encodeURIComponent(store.id)}/connections`,{json:!0,method:"DELETE",accountId})}var ENV_VAR_PREFIX_PATTERN=/^[a-zA-Z][a-zA-Z0-9_]*$/;function normalizeEnvVarPrefix(prefix){if(prefix==null)return;let canonical=prefix.replace(/_+$/,"");return canonical.length>0?canonical:void 0}var BLOB_DEFAULT_PREFIX="BLOB";function blobEnvVarNames(prefix){let base=normalizeEnvVarPrefix(prefix)??BLOB_DEFAULT_PREFIX;return{readWriteToken:`${base}_READ_WRITE_TOKEN`,storeId:`${base}_STORE_ID`,webhookPublicKey:`${base}_WEBHOOK_PUBLIC_KEY`}}function emptyPlan(source){return{add:[],remove:[],keep:[],source,notes:[]}}function sorted(names){return[...new Set(names)].sort()}function difference(a,b){let exclude=new Set(b);return sorted(a.filter(name=>!exclude.has(name)))}function intersection(a,b){let include=new Set(b);return sorted(a.filter(name=>include.has(name)))}function desiredBlobNames({auth,prefix,hasOidcVars}){let names=blobEnvVarNames(prefix),desired=[];return(auth.effective==="oidc"||hasOidcVars)&&desired.push(names.storeId,names.webhookPublicKey),auth.readWriteToken&&desired.push(names.readWriteToken),sorted(desired)}function planConnectEnvVars({store,auth,prefix,sibling}){return storeSupportsOidc(store)?{add:desiredBlobNames({auth,prefix,hasOidcVars:!1}),remove:[],keep:[],source:"computed",notes:[]}:sibling!==void 0&&normalizeEnvVarPrefix(sibling.envVarPrefix)===normalizeEnvVarPrefix(prefix)&&sibling?.environmentVariables&&sibling.environmentVariables.length>0?{add:sorted(sibling.environmentVariables),remove:[],keep:[],source:"connection",notes:[`Names mirror this store's existing connection to ${sibling.name}.`]}:{...emptyPlan("provider"),notes:[`${storeProductLabel(store)} names the variables for this resource. The exact list is reported once the connection is created.`]}}function planUpdateEnvVars({store,auth,prefix,connection,prefixChanged}){let current=sorted(connection.environmentVariables??[]);if(storeSupportsOidc(store)){let hasOidcVars=current.some(name=>name.endsWith("_STORE_ID")),desired=desiredBlobNames({auth,prefix,hasOidcVars}),plan={add:difference(desired,current),remove:difference(current,desired),keep:intersection(current,desired),source:"computed",notes:[]};return hasOidcVars&&auth.effective==="token"&&plan.notes.push("The OIDC variables stay in place \u2014 Vercel does not remove them once a connection has been upgraded."),plan}return current.length?prefixChanged?{add:[],remove:current,keep:[],source:"provider",notes:[`${storeProductLabel(store)} names the variables for this resource, so the re-prefixed names are reported once the update is applied.`]}:{add:[],remove:[],keep:current,source:"connection",notes:["The variables are re-scoped, not renamed."]}:{...emptyPlan("provider"),notes:[`${storeProductLabel(store)} names the variables for this resource. The exact list is reported once the update is applied.`]}}function diffEnvVarNames(before,after){return{add:difference(after,before),remove:difference(before,after),keep:intersection(before,after),source:"connection",notes:[]}}function planDisconnectEnvVars(connections){let known=connections.flatMap(connection=>connection.environmentVariables??[]),anyUnknown=connections.some(connection=>connection.environmentVariables===void 0);return!known.length&&anyUnknown?{...emptyPlan("provider"),notes:["Vercel did not report the variable names for this connection; every variable it owns is removed."]}:{add:[],remove:sorted(known),keep:[],source:"connection",notes:[]}}var import_chalk288=__toESM(require_source(),1);function buildStoragePlan({action,dryRun,store,projects:projects2,environments,envVarPrefix,auth,envVars}){return{action,dryRun,store:{id:store.id,name:store.name,type:store.type??"unknown",product:storeProductLabel(store)},projects:projects2,environments,envVarPrefix:envVarPrefix??null,...auth?{auth:{requested:auth.requested,effective:auth.effective,readWriteToken:auth.readWriteToken}}:{},envVars:{add:envVars.add,remove:envVars.remove,keep:envVars.keep,source:envVars.source,notes:[...auth?.notes??[],...envVars.notes]}}}var ACTION_TITLES={connect:"Storage connect plan",update:"Storage update plan",disconnect:"Storage disconnect plan"};function formatStoragePlan(plan){let lines=[`${import_chalk288.default.bold(ACTION_TITLES[plan.action])}${plan.dryRun?import_chalk288.default.dim(" (dry run)"):""}`,formatAlignedLabel("Store",`${plan.store.name} ${import_chalk288.default.dim(`(${plan.store.id})`)} \xB7 ${plan.store.product}`),formatAlignedLabel(plan.projects.length===1?"Project":"Projects",plan.projects.length?plan.projects.map(project=>`${project.name} ${import_chalk288.default.dim(`(${project.id})`)}`).join(", "):import_chalk288.default.dim("none"))];plan.environments.length&&lines.push(formatAlignedLabel("Environments",plan.environments.join(", "))),lines.push(formatAlignedLabel("Prefix",plan.envVarPrefix??import_chalk288.default.dim("none (product default)"))),plan.auth&&lines.push(formatAlignedLabel("Credentials",describeStorageAuth(plan.auth)));let changes=[...plan.envVars.add.map(name=>import_chalk288.default.green(`+ ${name}`)),...plan.envVars.remove.map(name=>import_chalk288.default.red(`- ${name}`)),...plan.envVars.keep.map(name=>import_chalk288.default.dim(`= ${name}`))];if(changes.length){lines.push(formatAlignedLabel("Env vars",changes[0]));for(let change2 of changes.slice(1))lines.push(formatAlignedLabel("",change2))}else lines.push(formatAlignedLabel("Env vars",import_chalk288.default.dim("no changes")));for(let note of plan.envVars.notes)lines.push(formatAlignedLabel("Note",import_chalk288.default.dim(note)));return`${lines.join(`
|
|
1294
|
+
${table(tableData,{hsep:4})}`),{exitCode:0,results,installedChecks}}function runCommand(cmd2,args){return new Promise(resolve14=>{let child=spawn4(cmd2,args,{stdio:"pipe"});child.on("close",code2=>resolve14(code2??1)),child.on("error",()=>resolve14(1))})}var StorageTelemetryClient=class extends TelemetryClient{trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}trackCliSubcommandCreate(actual){this.trackCliSubcommand({subcommand:"create",value:actual})}trackCliSubcommandGet(actual){this.trackCliSubcommand({subcommand:"get",value:actual})}trackCliSubcommandDelete(actual){this.trackCliSubcommand({subcommand:"delete",value:actual})}trackCliSubcommandConnect(actual){this.trackCliSubcommand({subcommand:"connect",value:actual})}trackCliSubcommandStatus(actual){this.trackCliSubcommand({subcommand:"status",value:actual})}trackCliSubcommandUpdate(actual){this.trackCliSubcommand({subcommand:"update",value:actual})}trackCliSubcommandDisconnect(actual){this.trackCliSubcommand({subcommand:"disconnect",value:actual})}};var import_chalk290=__toESM(require_source(),1);var STORAGE_AUTH_MODES=["oidc","token"],DEFAULT_STORAGE_AUTH_MODE="oidc";function parseAuthMode(value){if(value===void 0)return{valid:!0,mode:DEFAULT_STORAGE_AUTH_MODE,explicit:!1};let normalized=value.toLowerCase();return STORAGE_AUTH_MODES.includes(normalized)?{valid:!0,mode:normalized,explicit:!0}:{valid:!1,error:`Invalid --auth value: "${value}". Must be one of: ${STORAGE_AUTH_MODES.join(", ")}.`}}function resolveStorageAuth({store,mode,addRwToken}){let product=storeProductLabel(store);return storeSupportsOidc(store)?mode==="token"&&!addRwToken?{valid:!1,reason:"rw_token_opt_in_required",error:"--auth token writes a long-lived read-write token into your project.",hint:"Pass --add-rw-token to confirm, or drop --auth token to use the OIDC default."}:mode==="token"?{valid:!0,auth:{requested:mode,effective:"token",useOidcHeader:!1,readWriteToken:!0,notes:[]}}:{valid:!0,auth:{requested:mode,effective:"oidc",useOidcHeader:!0,readWriteToken:addRwToken,notes:addRwToken?["The static read-write token is written alongside the OIDC variables because --add-rw-token was passed."]:[]}}:addRwToken?{valid:!1,reason:"unsupported_auth_mode",error:`--add-rw-token only applies to Vercel Blob stores. ${store.name} is a ${product} resource, and its credentials are issued by the provider.`,hint:"Re-run without --add-rw-token."}:{valid:!0,auth:{requested:mode,effective:"provider-managed",useOidcHeader:mode==="oidc",readWriteToken:!1,notes:[`${product} issues its own credentials for this resource; Vercel OIDC does not apply.`]}}}function storageAuthHeaders(auth){return auth.useOidcHeader?{"x-vercel-use-oidc":"1"}:{}}function describeStorageAuth(auth){switch(auth.effective){case"oidc":return auth.readWriteToken?"oidc + static read-write token":"oidc (no static credentials)";case"token":return"static read-write token";case"provider-managed":return"provider-managed credentials"}}function inferConnectionAuth(store,environmentVariables){if(!storeSupportsOidc(store))return"provider-managed";if(!environmentVariables)return"unknown";let hasStoreId=environmentVariables.some(name=>name.endsWith("_STORE_ID")),hasRwToken=environmentVariables.some(name=>name.endsWith("_READ_WRITE_TOKEN"));return hasStoreId?"oidc":hasRwToken?"token":"unknown"}async function connectStoreToProject(client,{store,projectId,environments,envVarPrefix,auth,accountId}){await client.fetch(`/v1/storage/stores/${encodeURIComponent(store.id)}/connections`,{json:!0,method:"POST",headers:storageAuthHeaders(auth),body:{projectId,envVarEnvironments:environments,...envVarPrefix!==void 0?{envVarPrefix}:{},...storeSupportsOidc(store)&&!auth.readWriteToken?{skipReadWriteToken:!0}:{}},accountId})}async function updateStoreConnection(client,{store,connectionId,environments,envVarPrefix,skipReadWriteToken,accountId}){await client.fetch(`/v1/storage/stores/${encodeURIComponent(store.id)}/connections/${encodeURIComponent(connectionId)}`,{json:!0,method:"PATCH",body:{...environments!==void 0?{envVarEnvironments:environments}:{},...envVarPrefix!==void 0?{envVarPrefix}:{},...skipReadWriteToken!==void 0?{skipReadWriteToken}:{}},accountId})}async function upgradeStoreConnectionToOidc(client,{store,connectionId,auth,accountId}){await client.fetch(`/v1/storage/stores/${encodeURIComponent(store.id)}/connections/${encodeURIComponent(connectionId)}/upgrade-to-oidc`,{json:!0,method:"POST",headers:storageAuthHeaders(auth),accountId})}async function disconnectStoreConnection(client,{store,connectionId,accountId}){await client.fetch(`/v1/storage/stores/${encodeURIComponent(store.id)}/connections/${encodeURIComponent(connectionId)}`,{json:!0,method:"DELETE",accountId})}async function disconnectAllStoreConnections(client,{store,accountId}){await client.fetch(`/v1/storage/stores/${encodeURIComponent(store.id)}/connections`,{json:!0,method:"DELETE",accountId})}var ENV_VAR_PREFIX_PATTERN=/^[a-zA-Z][a-zA-Z0-9_]*$/;function normalizeEnvVarPrefix(prefix){if(prefix==null)return;let canonical=prefix.replace(/_+$/,"");return canonical.length>0?canonical:void 0}var BLOB_DEFAULT_PREFIX="BLOB";function blobEnvVarNames(prefix){let base=normalizeEnvVarPrefix(prefix)??BLOB_DEFAULT_PREFIX;return{readWriteToken:`${base}_READ_WRITE_TOKEN`,storeId:`${base}_STORE_ID`,webhookPublicKey:`${base}_WEBHOOK_PUBLIC_KEY`}}function emptyPlan(source){return{add:[],remove:[],keep:[],source,notes:[]}}function sorted(names){return[...new Set(names)].sort()}function difference(a,b){let exclude=new Set(b);return sorted(a.filter(name=>!exclude.has(name)))}function intersection(a,b){let include=new Set(b);return sorted(a.filter(name=>include.has(name)))}function desiredBlobNames({auth,prefix,hasOidcVars}){let names=blobEnvVarNames(prefix),desired=[];return(auth.effective==="oidc"||hasOidcVars)&&desired.push(names.storeId,names.webhookPublicKey),auth.readWriteToken&&desired.push(names.readWriteToken),sorted(desired)}function planConnectEnvVars({store,auth,prefix,sibling}){return storeSupportsOidc(store)?{add:desiredBlobNames({auth,prefix,hasOidcVars:!1}),remove:[],keep:[],source:"computed",notes:[]}:sibling!==void 0&&normalizeEnvVarPrefix(sibling.envVarPrefix)===normalizeEnvVarPrefix(prefix)&&sibling?.environmentVariables&&sibling.environmentVariables.length>0?{add:sorted(sibling.environmentVariables),remove:[],keep:[],source:"connection",notes:[`Names mirror this store's existing connection to ${sibling.name}.`]}:{...emptyPlan("provider"),notes:[`${storeProductLabel(store)} names the variables for this resource. The exact list is reported once the connection is created.`]}}function planUpdateEnvVars({store,auth,prefix,connection,prefixChanged}){let current=sorted(connection.environmentVariables??[]);if(storeSupportsOidc(store)){let hasOidcVars=current.some(name=>name.endsWith("_STORE_ID")),desired=desiredBlobNames({auth,prefix,hasOidcVars}),plan={add:difference(desired,current),remove:difference(current,desired),keep:intersection(current,desired),source:"computed",notes:[]};return hasOidcVars&&auth.effective==="token"&&plan.notes.push("The OIDC variables stay in place \u2014 Vercel does not remove them once a connection has been upgraded."),plan}return current.length?prefixChanged?{add:[],remove:current,keep:[],source:"provider",notes:[`${storeProductLabel(store)} names the variables for this resource, so the re-prefixed names are reported once the update is applied.`]}:{add:[],remove:[],keep:current,source:"connection",notes:["The variables are re-scoped, not renamed."]}:{...emptyPlan("provider"),notes:[`${storeProductLabel(store)} names the variables for this resource. The exact list is reported once the update is applied.`]}}function diffEnvVarNames(before,after){return{add:difference(after,before),remove:difference(before,after),keep:intersection(before,after),source:"connection",notes:[]}}function planDisconnectEnvVars(connections){let known=connections.flatMap(connection=>connection.environmentVariables??[]),anyUnknown=connections.some(connection=>connection.environmentVariables===void 0);return!known.length&&anyUnknown?{...emptyPlan("provider"),notes:["Vercel did not report the variable names for this connection; every variable it owns is removed."]}:{add:[],remove:sorted(known),keep:[],source:"connection",notes:[]}}var import_chalk288=__toESM(require_source(),1);function buildStoragePlan({action,dryRun,store,projects:projects2,environments,envVarPrefix,auth,envVars}){return{action,dryRun,store:{id:store.id,name:store.name,type:store.type??"unknown",product:storeProductLabel(store)},projects:projects2,environments,envVarPrefix:envVarPrefix??null,...auth?{auth:{requested:auth.requested,effective:auth.effective,readWriteToken:auth.readWriteToken}}:{},envVars:{add:envVars.add,remove:envVars.remove,keep:envVars.keep,source:envVars.source,notes:[...auth?.notes??[],...envVars.notes]}}}var ACTION_TITLES={connect:"Storage connect plan",update:"Storage update plan",disconnect:"Storage disconnect plan"};function formatStoragePlan(plan){let lines=[`${import_chalk288.default.bold(ACTION_TITLES[plan.action])}${plan.dryRun?import_chalk288.default.dim(" (dry run)"):""}`,formatAlignedLabel("Store",`${plan.store.name} ${import_chalk288.default.dim(`(${plan.store.id})`)} \xB7 ${plan.store.product}`),formatAlignedLabel(plan.projects.length===1?"Project":"Projects",plan.projects.length?plan.projects.map(project=>`${project.name} ${import_chalk288.default.dim(`(${project.id})`)}`).join(", "):import_chalk288.default.dim("none"))];plan.environments.length&&lines.push(formatAlignedLabel("Environments",plan.environments.join(", "))),lines.push(formatAlignedLabel("Prefix",plan.envVarPrefix??import_chalk288.default.dim("none (product default)"))),plan.auth&&lines.push(formatAlignedLabel("Credentials",describeStorageAuth(plan.auth)));let changes=[...plan.envVars.add.map(name=>import_chalk288.default.green(`+ ${name}`)),...plan.envVars.remove.map(name=>import_chalk288.default.red(`- ${name}`)),...plan.envVars.keep.map(name=>import_chalk288.default.dim(`= ${name}`))];if(changes.length){lines.push(formatAlignedLabel("Env vars",changes[0]));for(let change2 of changes.slice(1))lines.push(formatAlignedLabel("",change2))}else lines.push(formatAlignedLabel("Env vars",import_chalk288.default.dim(plan.envVars.source==="provider"?"names unavailable":"no changes")));for(let note of plan.envVars.notes)lines.push(formatAlignedLabel("Note",import_chalk288.default.dim(note)));return`${lines.join(`
|
|
1293
1295
|
`)}
|
|
1294
1296
|
`}var StorageConnectTelemetryClient=class extends TelemetryClient{trackCliArgumentStore(v){v&&this.trackCliArgument({arg:"store",value:this.redactedValue})}trackCliOptionProject(v){v&&this.trackCliOption({option:"project",value:this.redactedValue})}trackCliOptionEnvironment(v){v?.length&&this.trackCliOption({option:"environment",value:this.redactedValue})}trackCliOptionAuth(v){v&&this.trackCliOption({option:"auth",value:STORAGE_AUTH_MODES.includes(v.toLowerCase())?v.toLowerCase():this.redactedValue})}trackCliFlagAddRwToken(v){v&&this.trackCliFlag("add-rw-token")}trackCliOptionPrefix(v){v&&this.trackCliOption({option:"prefix",value:this.redactedValue})}trackCliFlagDryRun(v){v&&this.trackCliFlag("dry-run")}trackCliFlagYes(v){v&&this.trackCliFlag("yes")}trackCliFlagJson(v){v&&this.trackCliFlag("json")}};var import_chalk289=__toESM(require_source(),1);function failWith(client,{reason,message,hint,next}){let payload={status:AGENT_STATUS.ERROR,reason,message,...hint?{hint}:{},...next?{next}:{}};return outputAgentError(client,payload),wantsMachineReadableOutput(void 0,client.argv)&&client.stdout.write(`${JSON.stringify(payload,null,2)}
|
|
1295
1297
|
`),output_manager_default.error(message),hint&&output_manager_default.log(hint),1}async function resolveStorageScope(client,projectNameOrId){let link=await resolveProjectContext({client,projectNameOrId});return link.status==="error"?link.exitCode:link.status==="not_linked"?failWith(client,{reason:AGENT_REASON.NOT_LINKED,message:"No project resolved. Pass --project <name-or-id>, or link this directory first.",next:[{command:getCommandNamePlain("link"),when:"link this directory to a project"}]}):(client.config.currentTeam=link.org.type==="team"?link.org.id:void 0,{project:{id:link.project.id,name:link.project.name},accountId:link.org.id,teamSlug:link.org.slug})}async function resolveStorageAccount(client){let link=await getLinkedProject(client);if(link.status==="error")return link.exitCode;if(link.status==="linked")return client.config.currentTeam=link.org.type==="team"?link.org.id:void 0,{accountId:link.org.id,teamSlug:link.org.slug,linkedProject:{id:link.project.id,name:link.project.name}};let{team}=await getScope(client);return client.config.currentTeam=team?.id,{accountId:team?.id,teamSlug:team?.slug,linkedProject:void 0}}function labelFor(key){return key.replace(/([a-z])([A-Z])/g,"$1 $2").replace(/\burl\b/i,"URL").replace(/\bid\b/i,"ID").replace(/^./,first=>first.toUpperCase())}async function resolveStorageStore(client,identifier,accountId,options={}){output_manager_default.spinner("Retrieving storage resources\u2026",500);let stores;try{stores=await getStorageStores(client,{accountId})}finally{output_manager_default.stopSpinner()}options.type&&(stores=stores.filter(store=>storeMatchesType(store,options.type)));let result=resolveStore(stores,identifier);if(result.status==="found")return result.store;if(result.status==="ambiguous"){let candidates=result.matches.map(store=>`${store.id} (${storeTypeName(store)})`).join(", ");return failWith(client,{reason:"ambiguous_store",message:`More than one storage resource is named ${identifier}: ${candidates}. Pass --type <type> or a store ID instead.`})}return failWith(client,{reason:AGENT_REASON.NOT_FOUND,message:`No storage resource ${identifier} found in this scope.`,next:[{command:getCommandNamePlain("storage list"),when:"list the storage resources in this scope"}]})}function resolveEnvironments(environmentFlags){if(!environmentFlags?.length)return{valid:!0,environments:[...VALID_ENVIRONMENTS],explicit:!1};let validation=validateEnvironments(environmentFlags);return validation.valid?{valid:!0,environments:[...new Set(environmentFlags)],explicit:!0}:{valid:!1,message:`Invalid environment value: ${validation.invalid.map(value=>`"${value}"`).join(", ")}. Must be one of: ${VALID_ENVIRONMENTS.join(", ")}.`}}function resolvePrefix(prefix){return prefix===void 0?{valid:!0,prefix:void 0}:ENV_VAR_PREFIX_PATTERN.test(prefix)?{valid:!0,prefix:normalizeEnvVarPrefix(prefix)}:{valid:!1,message:"Invalid --prefix value. It must start with a letter and contain only letters, digits, and underscores."}}function printStoragePlan(client,plan,asJson){if(asJson){client.stdout.write(`${JSON.stringify(plan,null,2)}
|
|
@@ -1354,7 +1356,7 @@ Learn more: ${import_chalk306.default.cyan("https://vercel.com/docs/cli/about-te
|
|
|
1354
1356
|
`)}function renderTree(analysis){let lines=["## Span tree",""];if(analysis.treeOrder.length===0&&analysis.orphanOrder.length===0)return lines.push("_No spans._"),lines.join(`
|
|
1355
1357
|
`);for(let node of analysis.treeOrder)lines.push(formatTreeRow(node,analysis));if(analysis.orphanOrder.length>0){lines.push("","### Orphan spans","");for(let node of analysis.orphanOrder)lines.push(formatTreeRow(node,analysis))}return analysis.truncatedAtDepth&&lines.push("",`_Tree truncated at depth ${256}._`),lines.join(`
|
|
1356
1358
|
`)}function formatTreeRow(node,analysis){let{span,depth}=node,info=analysis.spanInfo.get(span.spanId),indent3=" ".repeat(depth),parts=[],durationUs=info?.durationUs??null;if(parts.push(`\`${formatDurationUs(durationUs)}\``),analysis.rootDurationUs!==null&&analysis.rootDurationUs>0&&parts.push(formatPct(durationUs,analysis.rootDurationUs)),analysis.rootStartUs!==null){let offset=info?.startOffsetUs??null;parts.push(formatOffset(offset))}if(parts.push(`\`${span.name||UNNAMED}\``),span.status?.code===1){let message=span.status.message;parts.push(message?`[error: ${message}]`:"[error]")}let[hint]=collectAttrHints(span.attributes);return hint&&parts.push(`\u2014 \`${hint.key}\`: ${hint.value}`),`${indent3}- ${parts.join(" ")}`}function formatEndpoint(method,target,status6){let left=method&&target?`${method} ${target}`:method??target,path3=left?`\`${left}\``:UNKNOWN;return status6?`${path3} \u2192 ${status6}`:path3}function formatSpansLine(count2,errors){return errors===0?String(count2):`${count2} (${errors} ${errors===1?"error":"errors"})`}function formatDurationUs(us){return us===null?UNKNOWN:us<1e3?`${Math.round(us)}\u03BCs`:us<1e6?`${(us/1e3).toFixed(1)}ms`:`${(us/1e6).toFixed(1)}s`}function formatOffset(us){return us===null?`+${UNKNOWN}`:`+${formatDurationUs(us)}`}function formatPct(us,rootUs){if(us===null||rootUs<=0)return UNKNOWN;let pct=us/rootUs*100;return pct>0&&pct<1?"<1%":`${Math.round(pct)}%`}function collectAttrHints(attributes){if(!attributes)return[];let out=[];for(let key of ATTR_HINT_KEYS){let value=readAttrString(attributes,key);value!==void 0&&out.push({key,value:ellipsis(value,ATTR_VALUE_MAX_LEN)})}return out}var VIEW_OPTIONS=["timeline","tree","waterfall"];function isView(value){return VIEW_OPTIONS.includes(value)}function buildDashboardUrl({teamSlug,projectName,traceId,view}){let base=`https://vercel.com/${encodeURIComponent(teamSlug)}/${encodeURIComponent(projectName)}/logs/traces/${encodeURIComponent(traceId)}`;return view&&view!=="timeline"?`${base}?view=${encodeURIComponent(view)}`:base}async function resolveDashboardScope({client,scopeFlag,projectFlag,teamId,linkedProject}){let teamSlug;if(scopeFlag)scopeFlag.startsWith("team_")?teamSlug=(await getTeamByIdOrSlug(client,scopeFlag)).slug:teamSlug=scopeFlag;else if(linkedProject.status==="linked")teamSlug=linkedProject.org.slug;else return{error:"Unable to resolve team slug for the dashboard URL.",reason:AGENT_REASON.NOT_LINKED};let projectName;if(projectFlag){let project=await getProjectByNameOrId(client,projectFlag,teamId);if(project instanceof ProjectNotFound)return{error:`Project not found: ${projectFlag}`,reason:AGENT_REASON.NOT_FOUND};projectName=project.name}else if(linkedProject.status==="linked")projectName=linkedProject.project.name;else return{error:"Unable to resolve project name for the dashboard URL.",reason:AGENT_REASON.NOT_LINKED};return{teamSlug,projectName}}async function get5(client,telemetry2){let parsedArgs,flagsSpecification=getFlagsSpecification(getSubcommand4.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(err){return printError(err),1}let positional=parsedArgs.args.slice(1),requestId=positional[0]===getSubcommand4.name?positional[1]:positional[0],json=parsedArgs.flags["--json"],scopeFlag=parsedArgs.flags["--scope"],projectFlag=parsedArgs.flags["--project"],openFlag2=parsedArgs.flags["--open"],viewFlag=parsedArgs.flags["--view"];if(telemetry2.trackCliArgumentRequestId(requestId),telemetry2.trackCliFlagJson(json),telemetry2.trackCliOptionProject(projectFlag),telemetry2.trackCliFlagOpen(openFlag2),telemetry2.trackCliOptionView(viewFlag),json&&openFlag2){let msg="`--json` and `--open` cannot be used together.";return client.nonInteractive&&outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message:msg}),output_manager_default.error(msg),1}if(viewFlag&&!openFlag2){let msg="`--view` can only be used with `--open`.";return client.nonInteractive&&outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message:msg}),output_manager_default.error(msg),1}let view;if(viewFlag!==void 0){if(!isView(viewFlag)){let msg=`\`--view\` must be one of: ${VIEW_OPTIONS.join(", ")}. Received: ${viewFlag}`;return client.nonInteractive&&outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message:msg}),output_manager_default.error(msg),1}view=viewFlag}if(!requestId)return output_manager_default.print(help(getSubcommand4,{parent:tracesCommand,columns:client.stderr.columns})),2;let teamId,projectId,linkedProject;if(linkedProject=await getLinkedProject(client),linkedProject.status==="error")if(scopeFlag&&projectFlag)linkedProject={status:"not_linked",org:null,project:null};else return linkedProject.exitCode;let scope;try{scope=await resolveScope({client,flags:{scope:scopeFlag,project:projectFlag},linkedProject})}catch(err){return printError(err),1}if("message"in scope)return client.nonInteractive&&outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:scope.reason,message:scope.message}),output_manager_default.error(scope.message),1;teamId=scope.teamId,projectId=scope.projectId,output_manager_default.spinner("Fetching trace\u2026");let trace3,partial;try{({trace:trace3,partial}=await fetchTrace({client,teamId,projectId,requestId}))}catch(err){return output_manager_default.stopSpinner(),printError(err),1}if(output_manager_default.stopSpinner(),partial&&output_manager_default.warn("Trace is incomplete because it exceeded the span limit."),openFlag2){if(!linkedProject){let msg="Unable to resolve project link for the dashboard URL.";return client.nonInteractive&&outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.NOT_LINKED,message:msg}),output_manager_default.error(msg),1}let resolved=await resolveDashboardScope({client,scopeFlag,projectFlag,teamId,linkedProject});if("error"in resolved)return client.nonInteractive&&outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:resolved.reason,message:resolved.error}),output_manager_default.error(resolved.error),1;let url=buildDashboardUrl({teamSlug:resolved.teamSlug,projectName:resolved.projectName,traceId:trace3.traceId,view});return output_manager_default.log(`Opening ${url} in your browser...`),await(0,import_open20.default)(url),0}return json?(client.stdout.write(`${JSON.stringify(trace3,null,2)}
|
|
1357
|
-
`),0):(client.stdout.write(renderMarkdown(trace3,{requestId})),output_manager_default.log("Run with --json for full trace data."),0)}var COMMAND_CONFIG63={get:getCommandAliases(getSubcommand4),create:getCommandAliases(createSubcommand8),config:getCommandAliases(tracesConfigCommand)},SUBCOMMAND_METADATA={[getSubcommand4.name]:getSubcommand4,[createSubcommand8.name]:createSubcommand8};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 printError(err),1}let{subcommand,subcommandOriginal,args}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG63),needHelp=!!parsedArgs.flags["--help"];if(subcommand===tracesConfigCommand.name)return(await import("./chunks/config-
|
|
1359
|
+
`),0):(client.stdout.write(renderMarkdown(trace3,{requestId})),output_manager_default.log("Run with --json for full trace data."),0)}var COMMAND_CONFIG63={get:getCommandAliases(getSubcommand4),create:getCommandAliases(createSubcommand8),config:getCommandAliases(tracesConfigCommand)},SUBCOMMAND_METADATA={[getSubcommand4.name]:getSubcommand4,[createSubcommand8.name]:createSubcommand8};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 printError(err),1}let{subcommand,subcommandOriginal,args}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG63),needHelp=!!parsedArgs.flags["--help"];if(subcommand===tracesConfigCommand.name)return(await import("./chunks/config-Q6V74NTU.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})),2}if(subcommand===createSubcommand8.name){let args2=client.argv.slice(4);return runCurl(client,{forceTrace:!0,args:args2})}return 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 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),1}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_semver.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),1;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"),1;if(enableBinary&&disableBinary)return output_manager_default.error("Cannot use --enable-binary and --disable-binary together"),1;if(bypassMinReleaseAge&&disableMinReleaseAgeBypass)return output_manager_default.error("Can't use --bypass-min-release-age and --disable-min-release-age-bypass together"),1;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."),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?void 0:await getUpdateCommand(),updateCommand=detectedUpdateCommand&&target&&target!=="latest"?pinPackageVersion(detectedUpdateCommand.split(" "),target).join(" "):detectedUpdateCommand,global=await isGlobal();if(asJson){let jsonOutput={currentVersion:pkg_default.version,installationType:global?"global":"local",...updateCommand&&{upgradeCommand:updateCommand},autoUpdatesEnabled:isAutoUpdateEnabled(client.config),...requestedPreference&&{requestedSettings:{[requestedPreference.name]:requestedPreference.enabled}}};client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
|
|
1358
1360
|
`)}else output_manager_default.print(`Current version: ${pkg_default.version}
|
|
1359
1361
|
`),output_manager_default.print(`Installation type: ${global?"global":"local"}
|
|
1360
1362
|
`),updateCommand&&output_manager_default.print(`Upgrade command: ${updateCommand}
|
|
@@ -1384,45 +1386,45 @@ Learn more: ${import_chalk306.default.cyan("https://vercel.com/docs/cli/about-te
|
|
|
1384
1386
|
`),context.track==="production"&&context.activeVersion&&import_semver3.default.valid(context.activeVersion)&&import_semver3.default.gte(context.activeVersion,latest)?(await cacheNativeUpdateVersion(latest),await markNativeUpdateStaged(latest,{selectedProduction:!0}),output_manager_default.print(`Production is already up to date.
|
|
1385
1387
|
`),0):(await cacheNativeUpdateVersion(latest,{selectProduction:!0}),spawnNativeUpdateChild(latest,!0),output_manager_default.print(`Production update started in the background.
|
|
1386
1388
|
`),0)}catch(error){return output_manager_default.stopSpinner(),output_manager_default.fatal(`Failed to check for updates: ${error instanceof Error?error.message:String(error)}`),1}}var COMMAND_CONFIG64={list:getCommandAliases(listSubcommand26),installed:getCommandAliases(installedSubcommand),use:getCommandAliases(useSubcommand),update:getCommandAliases(updateSubcommand11),check:getCommandAliases(checkSubcommand3),autoupdate:getCommandAliases(autoupdateSubcommand)};async function version(client){let telemetry2=new VersionTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArguments,flagsSpecification=getFlagsSpecification(versionCommand.options);try{parsedArguments=parseArguments(client.argv.slice(2),flagsSpecification)}catch(err){return printError(err),1}let{subcommand,args,subcommandOriginal}=getSubcommand7(parsedArguments.args.slice(1),COMMAND_CONFIG64),needHelp=parsedArguments.flags["--help"];function printHelp(command2){output_manager_default.print(help(command2,{columns:client.stderr.columns,parent:versionCommand}))}if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("version",subcommand),output_manager_default.print(help(versionCommand,{columns:client.stderr.columns})),2;switch(subcommand){case"list":return needHelp?(telemetry2.trackCliFlagHelp("version",subcommandOriginal),printHelp(listSubcommand26),2):(telemetry2.trackCliSubcommandList(subcommandOriginal),list28());case"installed":return needHelp?(telemetry2.trackCliFlagHelp("version",subcommandOriginal),printHelp(installedSubcommand),2):(telemetry2.trackCliSubcommandInstalled(subcommandOriginal),installed());case"use":return needHelp?(telemetry2.trackCliFlagHelp("version",subcommandOriginal),printHelp(useSubcommand),2):(telemetry2.trackCliSubcommandUse(subcommandOriginal),use(args));case"update":return needHelp?(telemetry2.trackCliFlagHelp("version",subcommandOriginal),printHelp(updateSubcommand11),2):(telemetry2.trackCliSubcommandUpdate(subcommandOriginal),use(["latest"]));case"check":return needHelp?(telemetry2.trackCliFlagHelp("version",subcommandOriginal),printHelp(checkSubcommand3),2):(isNativeUpdateChild()||telemetry2.trackCliSubcommandCheck(subcommandOriginal),check3(client));case"autoupdate":return needHelp?(telemetry2.trackCliFlagHelp("version",subcommandOriginal),printHelp(autoupdateSubcommand),2):(telemetry2.trackCliSubcommandAutoupdate(subcommandOriginal),autoupdate(client,args));default:return parsedArguments.args.length>1?(output_manager_default.print(`${import_chalk310.default.red("Error")}: Invalid subcommand. See help instructions for usage:
|
|
1387
|
-
`),output_manager_default.print(help(versionCommand,{columns:client.stderr.columns})),2):status5(client)}}var
|
|
1389
|
+
`),output_manager_default.print(help(versionCommand,{columns:client.stderr.columns})),2):status5(client)}}var import_chalk315=__toESM(require_source(),1);var UsageTelemetryClient=class extends TelemetryClient{trackCliOptionFrom(from){from&&this.trackCliOption({option:"from",value:this.redactedValue})}trackCliOptionTo(to){to&&this.trackCliOption({option:"to",value:this.redactedValue})}trackCliFlagJson(json){json&&this.trackCliFlag("json")}trackCliOptionBreakdown(breakdown){breakdown&&this.trackCliOption({option:"breakdown",value:breakdown})}trackCliOptionGroupBy(groupBy){groupBy&&this.trackCliOption({option:"group-by",value:groupBy})}};var import_error_utils25=__toESM(require_dist(),1);import{DateTime}from"luxon";var LA_TIMEZONE="America/Los_Angeles";function toISOOrThrow(dt){if(!dt.isValid)throw new Error(`Invalid DateTime: ${dt.invalidReason}`);let iso=dt.toISO();if(!iso)throw new Error("Failed to convert DateTime to ISO");return iso}function getDefaultFromDateTime(){return DateTime.now().setZone(LA_TIMEZONE).startOf("month")}function getDefaultToDateTime(){return DateTime.utc()}function getDefaultFromDate(){let dt=getDefaultFromDateTime();return toISOOrThrow(dt.toUTC())}function getDefaultToDate(){let dt=getDefaultToDateTime();return toISOOrThrow(dt.toUTC())}function parseBillingDate(dateStr,isEndDate=!1){if(dateStr.includes("T")){if(!DateTime.fromISO(dateStr).isValid)throw new Error(`Invalid date: "${dateStr}". Expected ISO 8601 format (YYYY-MM-DD or YYYY-MM-DDTHH:mm:ss)`);return dateStr}let laDateTime=DateTime.fromISO(dateStr,{zone:LA_TIMEZONE}).startOf("day");if(!laDateTime.isValid)throw new Error(`Invalid date: "${dateStr}". Expected ISO 8601 format (YYYY-MM-DD)`);let finalDateTime=isEndDate?laDateTime.plus({days:1}):laDateTime;return toISOOrThrow(finalDateTime.toUTC())}function getISOWeekNumber(dateStr){let date=new Date(dateStr);date.setUTCDate(date.getUTCDate()+4-(date.getUTCDay()||7));let yearStart=new Date(Date.UTC(date.getUTCFullYear(),0,1));return Math.ceil(((date.getTime()-yearStart.getTime())/864e5+1)/7)}function getISOWeekYear(dateStr){let date=new Date(dateStr);return date.setUTCDate(date.getUTCDate()+4-(date.getUTCDay()||7)),date.getUTCFullYear()}function getPeriodKey(chargePeriodStart,breakdownPeriod){if(!chargePeriodStart)return"Unknown";switch(breakdownPeriod){case"daily":return chargePeriodStart.substring(0,10);case"weekly":{let weekYear=getISOWeekYear(chargePeriodStart),weekNum=getISOWeekNumber(chargePeriodStart);return`${weekYear}-W${weekNum.toString().padStart(2,"0")}`}case"monthly":return chargePeriodStart.substring(0,7);default:return chargePeriodStart.substring(0,10)}}var VALID_BREAKDOWN_PERIODS=["daily","weekly","monthly"];function isValidBreakdownPeriod(value){return value!==void 0&&VALID_BREAKDOWN_PERIODS.includes(value)}var VALID_GROUP_BY_DIMENSIONS=["project","region"];function isValidGroupByDimension(value){return value!==void 0&&VALID_GROUP_BY_DIMENSIONS.includes(value)}var import_chalk312=__toESM(require_source(),1);function formatUsageAmount(amount,unit){if(unit==="managed_infrastructure_units")return formatUsageQuantity(amount,"MIUs",{showSmallValues:!0});let formattedAmount=amount.toFixed(2);return amount!==0&&Number(formattedAmount)===0?amount>0?"<$0.01":">-$0.01":`$${formattedAmount}`}function formatUsageQuantity(quantity,unit="",options={}){let displayUnit=quantity===1&&options.singularUnit?options.singularUnit:unit;if(options.unitKind==="digitalStorage")return formatStorageQuantity(quantity,unit,options.showSmallValues);let formatter=new Intl.NumberFormat("en-US",{maximumFractionDigits:2,notation:options.compact&&Math.abs(quantity)>=1e3?"compact":"standard"}),formattedQuantity=formatter.format(quantity),roundsToZero=formatter.format(Math.abs(quantity))===formatter.format(0),displayQuantity=options.showSmallValues&&quantity!==0&&roundsToZero?quantity>0?`<${formatter.format(.01)}`:`>${formatter.format(-.01)}`:formattedQuantity;return displayUnit?`${displayQuantity} ${displayUnit}`:displayQuantity}function formatStorageQuantity(quantity,unit,showSmallValues=!1){let units=["byte","kilobyte","megabyte","gigabyte","terabyte"],symbols=["B","KB","MB","GB","TB"],startIndex=units.indexOf(unit.toLowerCase());if(startIndex===-1)return formatUsageQuantity(quantity,unit,{showSmallValues});let value=quantity,unitIndex=startIndex;for(;Math.abs(value)>=1e3&&unitIndex<symbols.length-1;)value/=1e3,unitIndex++;return formatUsageQuantity(value,symbols[unitIndex],{showSmallValues})}var import_chalk311=__toESM(require_source(),1);import{DateTime as DateTime2}from"luxon";function formatServiceName(name,service){return service.included?`${name} (Flat Rate CDN)`:name}function formatServiceCost(service,costUnit){return service.included?"Included":formatUsageAmount(service.cost,costUnit)}function isEmptyService(service){return(service.category==="subscription"||service.quantity===0)&&service.cost===0}function visibleServices(services){return[...services.values()].filter(service=>!isEmptyService(service)).map(service=>[service.name,service])}function outputUsageHeader(data,title6,elapsedSuffix){let{log}=output_manager_default;log(`${title6} for ${data.contextType} ${import_chalk311.default.bold(data.contextName)} ${elapsedSuffix}`),log(""),data.usingDefaults?log(`${import_chalk311.default.gray("Billing cycle:")} ${formatRange(data.fromDisplay,data.toDisplay)}`):log(`${import_chalk311.default.gray("Period:")} ${formatRange(data.fromDisplay,data.toDisplay)}`),log(import_chalk311.default.gray(`Accrued through ${formatDate4(data.usageThrough)} in ${data.costUnit==="managed_infrastructure_units"?"MIUs":"USD"}, before credits and discounts.`)),log("")}function outputHiddenServicesHint(hiddenCount){hiddenCount<=0||output_manager_default.log(import_chalk311.default.gray(`${hiddenCount} ${hiddenCount===1?"service":"services"} with no usage hidden. Add --json to include ${hiddenCount===1?"it":"them"}.`))}function formatRange(from,to){let start=parseDate(from),end=parseDate(to);if(!start||!end)return`${from} to ${to}`;let sameYear=start.year===end.year;return`${start.toFormat(sameYear?"LLL d":"LLL d, yyyy")}\u2013${end.toFormat("LLL d, yyyy")}`}function formatDate4(value){return parseDate(value)?.toFormat("LLL d, yyyy")??value}function parseDate(value){let date=DateTime2.fromISO(value,{zone:"utc"});return date.isValid?date:null}function outputAggregated({data,startTime}){let{print,log}=output_manager_default;if(outputUsageHeader(data,"Usage",elapsed(Date.now()-startTime)),data.creditBalance){log(import_chalk312.default.bold("Current credit balance")),data.creditBalance.cadence&&log(` ${import_chalk312.default.gray("Cadence")} ${formatCadence(data.creditBalance.cadence)}`),log(` ${import_chalk312.default.gray("Used")} ${formatCredit(data.creditBalance.used,data.creditBalance.currency)} of ${formatCredit(data.creditBalance.allocated,data.creditBalance.currency)}`),log(` ${import_chalk312.default.gray("Remaining")} ${formatCredit(data.creditBalance.remaining,data.creditBalance.currency)}`);let progress=data.creditBalance.allocated>0?data.creditBalance.used/data.creditBalance.allocated*100:0;log(` ${import_chalk312.default.gray("Progress")} ${Math.round(progress)}%`),log("")}let allServices=[...data.services.entries()],sortedServices=visibleServices(data.services).sort((a,b)=>b[1].cost-a[1].cost);if(sortedServices.length===0){log("No usage data found for this period."),outputHiddenServicesHint(allServices.length);return}let usage2=sortedServices.filter(([,service])=>service.category==="usage"),subscriptions=sortedServices.filter(([,service])=>service.category==="subscription");usage2.length>0&&(log(import_chalk312.default.bold("Infrastructure")),printTable(print,usage2,"Infrastructure subtotal",data.costUnit),log("")),subscriptions.length>0&&(log(import_chalk312.default.bold("Subscription licenses")),printTable(print,subscriptions,"Subscriptions subtotal",data.costUnit),log("")),printCostSummary(print,usage2,subscriptions,data.costUnit),outputHiddenServicesHint(allServices.length-sortedServices.length)}function formatCadence(cadence){return cadence.split("_").map(word=>word[0].toUpperCase()+word.slice(1)).join(" ")}function formatCredit(amount,currency){return formatUsageAmount(amount,currency)}function printCostSummary(print,usage2,subscriptions,costUnit){let subscriptionCost=sumCost(subscriptions),infrastructureCost=sumCost(usage2),rows=[["Subscriptions",formatUsageAmount(subscriptionCost,costUnit)],["Infrastructure usage",formatUsageAmount(infrastructureCost,costUnit)],[import_chalk312.default.bold("Estimated total"),import_chalk312.default.bold(formatUsageAmount(subscriptionCost+infrastructureCost,costUnit))]],tablePrint=table(rows,{hsep:4,align:["l","r"]}).replace(/^/gm," ");print(`${tablePrint}
|
|
1390
|
+
`)}function sumCost(services){return services.reduce((total,[,service])=>total+service.cost,0)}function printTable(print,services,subtotalLabel,costUnit){let headers=["Service","Usage","Cost"],rows=services.map(([name,service])=>[formatServiceName(name,service),formatUsageQuantity(service.quantity,service.unit,{compact:!0,showSmallValues:service.category==="usage",singularUnit:service.singularUnit,unitKind:service.unitKind}),formatServiceCost(service,costUnit)]),subtotal=services.reduce((total,[,service])=>total+service.cost,0);rows.push([import_chalk312.default.bold(subtotalLabel),"",import_chalk312.default.bold(formatUsageAmount(subtotal,costUnit))]);let tablePrint=table([headers.map(header=>import_chalk312.default.bold(import_chalk312.default.cyan(header))),...rows],{hsep:4,align:["l","l","r"]}).replace(/^/gm," ");print(`
|
|
1388
1391
|
${tablePrint}
|
|
1389
|
-
|
|
1390
|
-
`)
|
|
1391
|
-
`)}
|
|
1392
|
-
`)}log(""),log(`${import_chalk313.default.gray("Amount due:")} ${import_chalk313.default.bold(formatCurrency(data.grandTotals.billedCost))}`)}function outputJson9(client,{data,fromDate,toDate,breakdownPeriod,groupByDimension}){let sortedServices=[...data.services.entries()].sort((a,b)=>b[1].billedCost-a[1].billedCost),sortedPeriods=[...data.periodUsage.keys()].sort(),jsonOutput={period:{from:fromDate,to:toDate},context:data.contextName,pricingUnit:data.pricingUnit};if(breakdownPeriod&&(jsonOutput.breakdown={period:breakdownPeriod,data:sortedPeriods.map(periodKey=>{let periodData=data.periodUsage.get(periodKey),sortedPeriodServices=[...periodData.services.entries()].sort((a,b)=>b[1].billedCost-a[1].billedCost);return{periodKey,services:sortedPeriodServices.map(([name,svc])=>({name,pricingQuantity:svc.pricingQuantity,pricingUnit:svc.pricingUnit,effectiveCost:svc.effectiveCost,billedCost:svc.billedCost})),totals:{pricingQuantity:periodData.totalPricingQuantity,effectiveCost:periodData.totalEffectiveCost,billedCost:periodData.totalBilledCost}}})}),groupByDimension){let sortedGroups=[...data.groupByUsage.entries()].sort((a,b)=>b[1].totalBilledCost-a[1].totalBilledCost);jsonOutput.groupBy={dimension:groupByDimension,data:sortedGroups.map(([groupName,groupData])=>{let sortedGroupServices=[...groupData.services.entries()].sort((a,b)=>b[1].billedCost-a[1].billedCost);return{name:groupName,services:sortedGroupServices.map(([name,svc])=>({name,pricingQuantity:svc.pricingQuantity,pricingUnit:svc.pricingUnit,effectiveCost:svc.effectiveCost,billedCost:svc.billedCost})),totals:{pricingQuantity:groupData.totalPricingQuantity,effectiveCost:groupData.totalEffectiveCost,billedCost:groupData.totalBilledCost}}})}}jsonOutput.services=sortedServices.map(([name,svc])=>({name,pricingQuantity:svc.pricingQuantity,pricingUnit:svc.pricingUnit,effectiveCost:svc.effectiveCost,billedCost:svc.billedCost})),jsonOutput.totals={pricingQuantity:data.grandTotals.pricingQuantity,effectiveCost:data.grandTotals.effectiveCost,billedCost:data.grandTotals.billedCost},jsonOutput.chargeCount=data.chargeCount,client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
|
|
1393
|
-
`)}async function usage(client){let{print,error,debug,spinner}=output_manager_default,parsedArgs=null,flagsSpecification=getFlagsSpecification(usageCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(err){return printError(err),1}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),1;let asJson=formatResult.jsonOutput,fromFlag=parsedArgs.flags["--from"],toFlag=parsedArgs.flags["--to"];if(!!fromFlag!=!!toFlag)return error("Both --from and --to must be specified or neither for the current month"),1;let usingDefaults=!fromFlag&&!toFlag,fromDate,toDate;try{fromDate=fromFlag?parseBillingDate(fromFlag,!1):getDefaultFromDate(),toDate=toFlag?parseBillingDate(toFlag,!0):getDefaultToDate()}catch(err){return error(err.message),1}let fromDisplay=fromFlag??getDefaultFromDateDisplay(),toDisplay=toFlag??getDefaultToDateDisplay(),breakdownFlag=parsedArgs.flags["--breakdown"],breakdownPeriod;if(breakdownFlag){if(!isValidBreakdownPeriod(breakdownFlag))return error(`Invalid breakdown period: "${breakdownFlag}". Valid options are: ${VALID_BREAKDOWN_PERIODS.join(", ")}`),1;breakdownPeriod=breakdownFlag}let groupByFlag=parsedArgs.flags["--group-by"],groupByDimension;if(groupByFlag){if(!isValidGroupByDimension(groupByFlag))return error(`Invalid group-by dimension: "${groupByFlag}". Valid options are: ${VALID_GROUP_BY_DIMENSIONS.join(", ")}`),1;groupByDimension=groupByFlag}if(breakdownPeriod&&groupByDimension)return error("--breakdown and --group-by cannot be used together. Use one or the other."),1;telemetry2.trackCliOptionFrom(fromFlag),telemetry2.trackCliOptionTo(toFlag),telemetry2.trackCliOptionFormat(parsedArgs.flags["--format"]),telemetry2.trackCliFlagJson(parsedArgs.flags["--json"]),telemetry2.trackCliOptionBreakdown(breakdownFlag),telemetry2.trackCliOptionGroupBy(groupByFlag),fromFlag&&debug(`Date conversion: ${fromFlag} -> ${fromDate}`),toFlag&&debug(`Date conversion: ${toFlag} (end of day) -> ${toDate}`);let contextName,teamId;try{let scope=await getScope(client);contextName=scope.contextName,teamId=scope.team?.id}catch(err){if((0,import_error_utils25.isErrnoException)(err)&&(err.code==="NOT_AUTHORIZED"||err.code==="TEAM_DELETED"))return error(err.message),1;throw err}let start=Date.now();asJson||spinner(`Fetching usage data for ${import_chalk314.default.bold(contextName)}`),debug(`Fetching charges from ${fromDate} to ${toDate}`);let query=new URLSearchParams({from:fromDate,to:toDate});teamId&&query.set("teamId",teamId);try{let response=await client.fetch(`/v1/billing/charges?${query}`,{json:!1,useCurrentTeam:!1});if(!response.ok){let errorText=await response.text();return error(`Failed to fetch usage data: ${response.status} ${errorText}`),1}let usageData=await processCharges(response,breakdownPeriod,groupByDimension,contextName,fromDisplay,toDisplay,usingDefaults);return 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 getGroupKey(charge,dimension){return dimension==="project"?charge.Tags?.ProjectName||charge.Tags?.ProjectId||"(unattributed)":charge.RegionName||charge.RegionId||"(global)"}async function processCharges(response,breakdownPeriod,groupByDimension,contextName,fromDisplay,toDisplay,usingDefaults){let services=new Map,periodUsage=new Map,groupByUsage=new Map,grandPricingQuantity=0,grandEffective=0,grandBilled=0,chargeCount=0,pricingUnit="MIUs";return await new Promise((resolve14,reject)=>{let readable=toNodeReadable(response.body),stream=readable.pipe(import_jsonlines.default.parse());stream.on("data",charge=>{chargeCount++,chargeCount===1&&charge.PricingUnit&&(pricingUnit=charge.PricingUnit);let serviceName=charge.ServiceName||"Unknown",quantity=charge.PricingQuantity||0,effective=charge.EffectiveCost||0,billed=charge.BilledCost||0;grandPricingQuantity+=quantity,grandEffective+=effective,grandBilled+=billed;let existing=services.get(serviceName)||{pricingQuantity:0,effectiveCost:0,billedCost:0,pricingUnit:charge.PricingUnit||pricingUnit};if(services.set(serviceName,{pricingQuantity:existing.pricingQuantity+quantity,effectiveCost:existing.effectiveCost+effective,billedCost:existing.billedCost+billed,pricingUnit:existing.pricingUnit}),breakdownPeriod){let periodKey=getPeriodKey(charge.ChargePeriodStart,breakdownPeriod);periodUsage.has(periodKey)||periodUsage.set(periodKey,{services:new Map,totalPricingQuantity:0,totalEffectiveCost:0,totalBilledCost:0});let periodData=periodUsage.get(periodKey);periodData.totalPricingQuantity+=quantity,periodData.totalEffectiveCost+=effective,periodData.totalBilledCost+=billed;let periodService=periodData.services.get(serviceName)||{pricingQuantity:0,effectiveCost:0,billedCost:0,pricingUnit:charge.PricingUnit||pricingUnit};periodData.services.set(serviceName,{pricingQuantity:periodService.pricingQuantity+quantity,effectiveCost:periodService.effectiveCost+effective,billedCost:periodService.billedCost+billed,pricingUnit:periodService.pricingUnit})}if(groupByDimension){let groupKey=getGroupKey(charge,groupByDimension);groupByUsage.has(groupKey)||groupByUsage.set(groupKey,{services:new Map,totalPricingQuantity:0,totalEffectiveCost:0,totalBilledCost:0});let groupData=groupByUsage.get(groupKey);groupData.totalPricingQuantity+=quantity,groupData.totalEffectiveCost+=effective,groupData.totalBilledCost+=billed;let groupService=groupData.services.get(serviceName)||{pricingQuantity:0,effectiveCost:0,billedCost:0,pricingUnit:charge.PricingUnit||pricingUnit};groupData.services.set(serviceName,{pricingQuantity:groupService.pricingQuantity+quantity,effectiveCost:groupService.effectiveCost+effective,billedCost:groupService.billedCost+billed,pricingUnit:groupService.pricingUnit})}}),stream.on("end",resolve14),stream.on("error",reject),readable.on("error",reject)}),{contextName,fromDisplay,toDisplay,usingDefaults,pricingUnit,chargeCount,services,periodUsage,groupByUsage,grandTotals:{pricingQuantity:grandPricingQuantity,effectiveCost:grandEffective,billedCost:grandBilled}}}var VcrTelemetryClient=class extends TelemetryClient{trackCliSubcommandLs(actual){this.trackCliSubcommand({subcommand:"ls",value:actual})}trackCliSubcommandInspect(actual){this.trackCliSubcommand({subcommand:"inspect",value:actual})}trackCliSubcommandAdd(actual){this.trackCliSubcommand({subcommand:"add",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_CONFIG65={ls:getCommandAliases(listSubcommand25),inspect:getCommandAliases(inspectSubcommand13),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),1}let{subcommand,args,subcommandOriginal}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG65),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(listSubcommand25),2;case"inspect":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(inspectSubcommand13),2;case"add":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(addSubcommand13),2;case"config":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(configSubcommand),2;case"rm":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(removeSubcommand16),2;case"login":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(loginSubcommand),2;case"build":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(buildSubcommand),2;case"push":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(pushSubcommand),2;case"tag":{telemetry2.trackCliFlagHelp("vcr",subcommandOriginal);let nested=args[0];return nested==="ls"||nested==="list"?(printHelp(tagsLsSubcommand),2):nested==="inspect"||nested==="get"?(printHelp(tagsInspectSubcommand),2):(printHelp(tagsAggregateCommand),2)}case"image":{telemetry2.trackCliFlagHelp("vcr",subcommandOriginal);let nested=args[0];return nested==="ls"||nested==="list"?(printHelp(imageLsSubcommand),2):nested==="inspect"||nested==="get"?(printHelp(imageInspectSubcommand),2):nested==="rm"||nested==="remove"||nested==="delete"?(printHelp(imageRmSubcommand),2):(printHelp(imageAggregateCommand),2)}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(arg=>arg!==void 0&&aliases2.includes(arg));return hasAction(PERMISSIONS_ACTIONS.ls)?(printPermissionsActionHelp2(permissionsLsSubcommand),2):hasAction(PERMISSIONS_ACTIONS.add)?(printPermissionsActionHelp2(permissionsAddSubcommand),2):hasAction(PERMISSIONS_ACTIONS.rm)?(printPermissionsActionHelp2(permissionsRmSubcommand),2):hasAction(PERMISSIONS_ACTIONS.clear)?(printPermissionsActionHelp2(permissionsClearSubcommand),2):(printHelp(permissionsAggregateCommand),2)}default:return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),output_manager_default.print(help(vcrCommand,{columns:client.stderr.columns})),2}switch(subcommand){case"ls":return telemetry2.trackCliSubcommandLs(subcommandOriginal),(await import("./chunks/ls-KDS7XXBR.js")).default(client,args,telemetry2);case"inspect":return telemetry2.trackCliSubcommandInspect(subcommandOriginal),(await import("./chunks/inspect-4BJNJTCC.js")).default(client,args,telemetry2);case"add":return telemetry2.trackCliSubcommandAdd(subcommandOriginal),(await import("./chunks/add-B6SKHP6R.js")).default(client,args,telemetry2);case"config":return telemetry2.trackCliSubcommandConfig(subcommandOriginal),(await import("./chunks/config-IGE3P5DW.js")).default(client,args,telemetry2);case"rm":return telemetry2.trackCliSubcommandRm(subcommandOriginal),(await import("./chunks/rm-JWNSB3XZ.js")).default(client,args,telemetry2);case"login":return telemetry2.trackCliSubcommandLogin(subcommandOriginal),(await import("./chunks/login-5OBK5VD6.js")).default(client,args,telemetry2);case"build":return telemetry2.trackCliSubcommandBuild(subcommandOriginal),(await import("./chunks/build-PC5EQP2P.js")).default(client,telemetry2);case"push":return telemetry2.trackCliSubcommandPush(subcommandOriginal),(await import("./chunks/push-MVETL2WL.js")).default(client,telemetry2);case"tag":return telemetry2.trackCliSubcommandTag(subcommandOriginal),(await import("./chunks/tags-Y6NFCY2R.js")).default(client,args,telemetry2);case"image":return telemetry2.trackCliSubcommandImage(subcommandOriginal),(await import("./chunks/image-2XS5KWHL.js")).default(client,args,telemetry2);case"permissions":return telemetry2.trackCliSubcommandPermissions(subcommandOriginal),(await import("./chunks/permissions-C4UXCLJM.js")).default(client,args,telemetry2);default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG65)),output_manager_default.print(help(vcrCommand,{columns:client.stderr.columns})),2}}var import_ms38=__toESM(require_ms(),1),import_chalk315=__toESM(require_source(),1),import_pluralize22=__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 ls10(client,argv){let telemetry2=new WebhooksLsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(listSubcommand29.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),1}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),1;let asJson=formatResult.jsonOutput||client.nonInteractive,{contextName}=await getScope(client),lsStamp=stamp_default();client.nonInteractive||output_manager_default.spinner(`Fetching Webhooks under ${import_chalk315.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 get <id>"),when:"Inspect a webhook"}]}:{webhooks:webhooksList};client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
|
|
1394
|
-
|
|
1395
|
-
|
|
1396
|
-
`)
|
|
1397
|
-
`)
|
|
1398
|
-
|
|
1399
|
-
|
|
1400
|
-
`)
|
|
1401
|
-
`),output_manager_default.print(` ${
|
|
1402
|
-
`),output_manager_default.print(` ${
|
|
1403
|
-
`),output_manager_default.print(` ${import_chalk316.default.cyan("Updated At")} ${formatDate(webhook.updatedAt)}
|
|
1392
|
+
`)}var import_chalk313=__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_chalk313.default.bold(import_chalk313.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_chalk313.default.bold(import_chalk313.default.gray(header))),...rows],{hsep:4,align:["l","l","r"]}).replace(/^/gm," ");print(`${tablePrint}
|
|
1393
|
+
`)}outputHiddenServicesHint(hiddenCount)}var import_chalk314=__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_chalk314.default.bold(import_chalk314.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_chalk314.default.bold(import_chalk314.default.gray(header))),...rows],{hsep:4,align:["l","l","r"]}).replace(/^/gm," ");print(`${tablePrint}
|
|
1394
|
+
`)}log(""),log(`${import_chalk314.default.gray("Estimated total:")} ${import_chalk314.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)}
|
|
1395
|
+
`)}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}=output_manager_default,flagsSpecification=getFlagsSpecification(usageCommand.options),parsedArgs;try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(err){return printError(err),1}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),1;let asJson=formatResult.jsonOutput,fromFlag=parsedArgs.flags["--from"],toFlag=parsedArgs.flags["--to"];if(!!fromFlag!=!!toFlag)return error("Both --from and --to must be specified or neither for the current billing cycle"),1;let breakdownFlag=parsedArgs.flags["--breakdown"];if(breakdownFlag&&!isValidBreakdownPeriod(breakdownFlag))return error(`Invalid breakdown period: "${breakdownFlag}". Valid options are: ${VALID_BREAKDOWN_PERIODS.join(", ")}`),1;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(", ")}`),1;let groupByDimension=groupByFlag;if(breakdownPeriod&&groupByDimension)return error("--breakdown and --group-by cannot be used together. Use one or the other."),1;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_utils25.isErrnoException)(err)&&(err.code==="NOT_AUTHORIZED"||err.code==="TEAM_DELETED"))return error(err.message),1;throw err}let usingDefaults=!fromFlag&&!toFlag,fromDate,toDate;try{fromDate=fromFlag?parseBillingDate(fromFlag,!1):billingPeriod?new Date(billingPeriod.start).toISOString():getDefaultFromDate(),toDate=toFlag?parseBillingDate(toFlag,!0):billingPeriod?new Date(billingPeriod.end).toISOString():getDefaultToDate()}catch(err){return error(err.message),1}let fromDisplay=fromFlag??extractDatePortion(fromDate),toDisplay=toFlag??extractDatePortion(toDate);debug(`Fetching dashboard usage from ${fromDate} to ${toDate}`);let start=Date.now();asJson||spinner(`Fetching usage data for ${import_chalk315.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"),id=result.dimensionValues[groupByDimension],groupName=id?(groupByDimension==="project"?projects2:regions)[id]?.title??id:groupByDimension==="project"?"(unattributed)":"(global)",group=groupByUsage.get(groupName)??emptyAggregation();addService(group.services,serviceName,aggregation),group.totalCost+=aggregation.cost,groupByUsage.set(groupName,group)}return{contextName,contextType,scope,fromDisplay,toDisplay,usageThrough:getUsageThrough(response.queriedAt,toDisplay),usingDefaults,costUnit,services,periodUsage,groupByUsage,totalCost}}function getCostUnit(response){let unit=response.metrics.find(metric=>metric.slug===GROSS_COST_METRIC)?.unit;return unit?.singular==="MIU"||unit?.plural==="MIUs"?"managed_infrastructure_units":"USD"}function aggregateResult(result,product,name,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})}trackCliSubcommandAdd(actual){this.trackCliSubcommand({subcommand:"add",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_CONFIG65={ls:getCommandAliases(listSubcommand25),inspect:getCommandAliases(inspectSubcommand13),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),1}let{subcommand,args,subcommandOriginal}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG65),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(listSubcommand25),2;case"inspect":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(inspectSubcommand13),2;case"add":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(addSubcommand13),2;case"config":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(configSubcommand),2;case"rm":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(removeSubcommand16),2;case"login":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(loginSubcommand),2;case"build":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(buildSubcommand),2;case"push":return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),printHelp(pushSubcommand),2;case"tag":{telemetry2.trackCliFlagHelp("vcr",subcommandOriginal);let nested=args[0];return nested==="ls"||nested==="list"?(printHelp(tagsLsSubcommand),2):nested==="inspect"||nested==="get"?(printHelp(tagsInspectSubcommand),2):(printHelp(tagsAggregateCommand),2)}case"image":{telemetry2.trackCliFlagHelp("vcr",subcommandOriginal);let nested=args[0];return nested==="ls"||nested==="list"?(printHelp(imageLsSubcommand),2):nested==="inspect"||nested==="get"?(printHelp(imageInspectSubcommand),2):nested==="rm"||nested==="remove"||nested==="delete"?(printHelp(imageRmSubcommand),2):(printHelp(imageAggregateCommand),2)}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(arg=>arg!==void 0&&aliases2.includes(arg));return hasAction(PERMISSIONS_ACTIONS.ls)?(printPermissionsActionHelp2(permissionsLsSubcommand),2):hasAction(PERMISSIONS_ACTIONS.add)?(printPermissionsActionHelp2(permissionsAddSubcommand),2):hasAction(PERMISSIONS_ACTIONS.rm)?(printPermissionsActionHelp2(permissionsRmSubcommand),2):hasAction(PERMISSIONS_ACTIONS.clear)?(printPermissionsActionHelp2(permissionsClearSubcommand),2):(printHelp(permissionsAggregateCommand),2)}default:return telemetry2.trackCliFlagHelp("vcr",subcommandOriginal),output_manager_default.print(help(vcrCommand,{columns:client.stderr.columns})),2}switch(subcommand){case"ls":return telemetry2.trackCliSubcommandLs(subcommandOriginal),(await import("./chunks/ls-LOXX7YQ2.js")).default(client,args,telemetry2);case"inspect":return telemetry2.trackCliSubcommandInspect(subcommandOriginal),(await import("./chunks/inspect-LGQ44GYB.js")).default(client,args,telemetry2);case"add":return telemetry2.trackCliSubcommandAdd(subcommandOriginal),(await import("./chunks/add-7OUJAZIH.js")).default(client,args,telemetry2);case"config":return telemetry2.trackCliSubcommandConfig(subcommandOriginal),(await import("./chunks/config-26RISHPB.js")).default(client,args,telemetry2);case"rm":return telemetry2.trackCliSubcommandRm(subcommandOriginal),(await import("./chunks/rm-C5GXOG3I.js")).default(client,args,telemetry2);case"login":return telemetry2.trackCliSubcommandLogin(subcommandOriginal),(await import("./chunks/login-QIPGRGDE.js")).default(client,args,telemetry2);case"build":return telemetry2.trackCliSubcommandBuild(subcommandOriginal),(await import("./chunks/build-VSV5LVJK.js")).default(client,telemetry2);case"push":return telemetry2.trackCliSubcommandPush(subcommandOriginal),(await import("./chunks/push-ZQWVBEAJ.js")).default(client,telemetry2);case"tag":return telemetry2.trackCliSubcommandTag(subcommandOriginal),(await import("./chunks/tags-JSRGITRJ.js")).default(client,args,telemetry2);case"image":return telemetry2.trackCliSubcommandImage(subcommandOriginal),(await import("./chunks/image-LZ32HAQV.js")).default(client,args,telemetry2);case"permissions":return telemetry2.trackCliSubcommandPermissions(subcommandOriginal),(await import("./chunks/permissions-XHGXTFEU.js")).default(client,args,telemetry2);default:return output_manager_default.error(getInvalidSubcommand(COMMAND_CONFIG65)),output_manager_default.print(help(vcrCommand,{columns:client.stderr.columns})),2}}var import_ms38=__toESM(require_ms(),1),import_chalk316=__toESM(require_source(),1),import_pluralize22=__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 ls10(client,argv){let telemetry2=new WebhooksLsTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(listSubcommand29.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),1}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),1;let asJson=formatResult.jsonOutput||client.nonInteractive,{contextName}=await getScope(client),lsStamp=stamp_default();client.nonInteractive||output_manager_default.spinner(`Fetching Webhooks under ${import_chalk316.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 get <id>"),when:"Inspect a webhook"}]}:{webhooks:webhooksList};client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
|
|
1396
|
+
`)}else output_manager_default.log(`${(0,import_pluralize22.default)("Webhook",webhooks.length,!0)} found under ${import_chalk316.default.bold(contextName)} ${import_chalk316.default.gray(lsStamp())}`),webhooks.length>0&&(output_manager_default.print(formatWebhooksTable(webhooks).replace(/^(.*)/gm,`${" ".repeat(1)}$1`)),output_manager_default.print(`
|
|
1397
|
+
|
|
1398
|
+
`));return 0}function formatWebhooksTable(webhooks){let current=Date.now(),rows=webhooks.map(webhook=>{let age=webhook.createdAt?(0,import_ms38.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_chalk316.default.gray(age)]});return formatTable(["ID","URL","Events","Age"],["l","l","l","l"],[{rows}])}var import_chalk317=__toESM(require_source(),1);var WebhooksGetTelemetryClient=class extends TelemetryClient{trackCliArgumentId(id){id&&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),1}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 get <id>")}]},1),output_manager_default.error(`${getCommandName("webhooks get <id>")} expects one argument`),1;telemetry2.trackCliArgumentId(webhookId),telemetry2.trackCliOptionFormat(opts["--format"]);let formatResult=validateJsonOutput(opts);if(!formatResult.valid)return output_manager_default.error(formatResult.error),1;let asJson=formatResult.jsonOutput||client.nonInteractive;if(args.length!==1)return output_manager_default.error(`Invalid number of arguments. Usage: ${import_chalk317.default.cyan(`${getCommandName("webhooks get <id>")}`)}`),1;output_manager_default.debug("Fetching webhook info");let{contextName}=await getScope(client);client.nonInteractive||output_manager_default.spinner(`Fetching Webhook ${webhookId} under ${import_chalk317.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)}
|
|
1399
|
+
`)}else{output_manager_default.log(`Webhook ${webhookId} found under ${import_chalk317.default.bold(contextName)} ${import_chalk317.default.gray(getStamp())}`),output_manager_default.print(`
|
|
1400
|
+
`),output_manager_default.print(import_chalk317.default.bold(` General
|
|
1401
|
+
|
|
1402
|
+
`)),output_manager_default.print(` ${import_chalk317.default.cyan("ID")} ${webhook.id}
|
|
1403
|
+
`),output_manager_default.print(` ${import_chalk317.default.cyan("URL")} ${webhook.url}
|
|
1404
|
+
`),output_manager_default.print(` ${import_chalk317.default.cyan("Created At")} ${formatDate(webhook.createdAt)}
|
|
1405
|
+
`),output_manager_default.print(` ${import_chalk317.default.cyan("Updated At")} ${formatDate(webhook.updatedAt)}
|
|
1404
1406
|
`),output_manager_default.print(`
|
|
1405
|
-
`),output_manager_default.print(
|
|
1407
|
+
`),output_manager_default.print(import_chalk317.default.bold(` Events
|
|
1406
1408
|
|
|
1407
1409
|
`));for(let event of webhook.events)output_manager_default.print(` - ${event}
|
|
1408
1410
|
`);if(webhook.projectIds&&webhook.projectIds.length>0)if(output_manager_default.print(`
|
|
1409
|
-
`),output_manager_default.print(
|
|
1411
|
+
`),output_manager_default.print(import_chalk317.default.bold(` Projects
|
|
1410
1412
|
|
|
1411
1413
|
`)),webhook.projectsMetadata&&webhook.projectsMetadata.length>0)for(let project of webhook.projectsMetadata)output_manager_default.print(` - ${project.name} (${project.id})
|
|
1412
1414
|
`);else for(let projectId of webhook.projectIds)output_manager_default.print(` - ${projectId}
|
|
1413
1415
|
`);output_manager_default.print(`
|
|
1414
|
-
`)}return 0}var
|
|
1415
|
-
`),0}return output_manager_default.stopSpinner(),output_manager_default.success(`Webhook created: ${
|
|
1416
|
-
`),output_manager_default.print(
|
|
1417
|
-
|
|
1418
|
-
`)),output_manager_default.print(` ${
|
|
1419
|
-
`),output_manager_default.print(` ${
|
|
1420
|
-
`),output_manager_default.print(` ${
|
|
1421
|
-
`),webhook.projectIds&&webhook.projectIds.length>0&&output_manager_default.print(` ${
|
|
1416
|
+
`)}return 0}var import_chalk318=__toESM(require_source(),1);async function createWebhook(client,payload){return await client.fetch("/v1/webhooks",{method:"POST",body:payload})}var WebhooksCreateTelemetryClient=class extends TelemetryClient{trackCliArgumentUrl(url){url&&this.trackCliArgument({arg:"url",value:this.redactedValue})}trackCliOptionEvent(events){events&&events.length>0&&this.trackCliOption({option:"event",value:String(events.length)})}trackCliOptionProject(projects2){projects2&&projects2.length>0&&this.trackCliOption({option:"project",value:String(projects2.length)})}};var cachedEvents=null;async function getWebhookEvents(){if(cachedEvents)return cachedEvents;let cache=new OpenApiCache;if(!await cache.load())return output_manager_default.debug("Failed to load OpenAPI spec for webhook events"),[];let createWebhookEndpoint=cache.getEndpoints().find(e2=>e2.path==="/v1/webhooks"&&e2.method==="POST");if(!createWebhookEndpoint)return output_manager_default.debug("Could not find POST /v1/webhooks endpoint in OpenAPI spec"),[];let eventsField=cache.getBodyFields(createWebhookEndpoint).find(f=>f.name==="events");return eventsField?.enumValues?(cachedEvents=eventsField.enumValues.filter(v=>typeof v=="string"),cachedEvents):(output_manager_default.debug("Could not find events enum in webhook endpoint"),[])}async function validateWebhookEvents(events){let validEvents=await getWebhookEvents();if(validEvents.length===0)return[];let validSet=new Set(validEvents);return events.filter(e2=>!validSet.has(e2))}var WEBHOOKS_EVENTS_DOCS_URL="https://vercel.com/docs/webhooks/webhooks-api";async function create8(client,argv){let telemetry2=new WebhooksCreateTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(createSubcommand9.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),1}let{args,flags:opts}=parsedArgs,[url]=args;if(url)try{let urlObj=new URL(url);if(!["http:","https:"].includes(urlObj.protocol))return output_manager_default.error("Webhook URL must use http or https protocol"),1}catch{return output_manager_default.error(`Invalid URL: ${url}`),1}else{if(client.nonInteractive){let argv2=client.argv.slice(2),subcommandParts=argv2.slice(0,2),rest=argv2.slice(2),subcommandWithPlaceholder=`${subcommandParts.join(" ")} <url>${rest.length?` ${rest.join(" ")}`:""}`;outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.MISSING_URL,message:"Webhook URL is required. Provide URL as the first argument.",next:[{command:getCommandNamePlain(subcommandWithPlaceholder)}]},1)}url=await client.input.text({message:"Webhook URL:",validate:val=>{if(!val)return"URL is required";try{let urlObj=new URL(val);if(!["http:","https:"].includes(urlObj.protocol))return"Webhook URL must use http or https protocol"}catch{return"Invalid URL"}return!0}})}let projectIds=opts["--project"],eventFlags=opts["--event"],events;if(!eventFlags||eventFlags.length===0){client.nonInteractive&&outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.MISSING_EVENTS,message:"At least one event is required. Use --event <event> (can be repeated).",next:[{command:getCommandNamePlain("webhooks create <url> --event <event>")}]},1);let availableEvents=await getWebhookEvents()??[];if(availableEvents.length===0)return output_manager_default.error("Could not fetch available webhook events. Please specify events using --event flags."),1;events=await client.input.checkbox({message:"Select events:",choices:availableEvents.map(event=>({name:event,value:event})),validate:selected=>selected.length===0?"At least one event is required":!0})}else{let invalidEvents=await validateWebhookEvents(eventFlags);if(invalidEvents.length>0){if(client.nonInteractive){let suggested=buildCreateCommandWithEventPlaceholder(client.argv,url);return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.INVALID_ARGUMENTS,message:`Invalid event type${invalidEvents.length>1?"s":""}: ${invalidEvents.join(", ")}. Use a valid event name (e.g. deployment.created).`,hint:`See available events: ${WEBHOOKS_EVENTS_DOCS_URL}`,next:[{command:suggested,when:"use a valid --event value"}]},1),1}return output_manager_default.error(`Invalid event type${invalidEvents.length>1?"s":""}: ${invalidEvents.join(", ")}`),1}events=eventFlags}telemetry2.trackCliArgumentUrl(url),telemetry2.trackCliOptionEvent(events),telemetry2.trackCliOptionProject(projectIds);let{contextName}=await getScope(client),createStamp=stamp_default();client.nonInteractive||output_manager_default.spinner(`Creating webhook under ${import_chalk318.default.bold(contextName)}`);try{let webhook=await createWebhook(client,{url,events,projectIds});if(client.nonInteractive){let json={status:AGENT_STATUS.OK,webhook:{id:webhook.id,url:webhook.url,events:webhook.events,...webhook.projectIds?.length?{projectIds:webhook.projectIds}:{}},message:`Webhook ${webhook.id} created.`,next:[{command:getCommandNamePlain(`webhooks get ${webhook.id}`),when:"Inspect the webhook"}]};return webhook.secret&&(json.secret=webhook.secret),client.stdout.write(`${JSON.stringify(json,null,2)}
|
|
1417
|
+
`),0}return output_manager_default.stopSpinner(),output_manager_default.success(`Webhook created: ${import_chalk318.default.bold(webhook.id)} ${createStamp()}`),output_manager_default.print(`
|
|
1418
|
+
`),output_manager_default.print(import_chalk318.default.bold(` Webhook Details
|
|
1419
|
+
|
|
1420
|
+
`)),output_manager_default.print(` ${import_chalk318.default.cyan("ID".padEnd(10))}${webhook.id}
|
|
1421
|
+
`),output_manager_default.print(` ${import_chalk318.default.cyan("URL".padEnd(10))}${webhook.url}
|
|
1422
|
+
`),output_manager_default.print(` ${import_chalk318.default.cyan("Events".padEnd(10))}${webhook.events.join(", ")}
|
|
1423
|
+
`),webhook.projectIds&&webhook.projectIds.length>0&&output_manager_default.print(` ${import_chalk318.default.cyan("Projects".padEnd(10))}${webhook.projectIds.join(", ")}
|
|
1422
1424
|
`),output_manager_default.print(`
|
|
1423
|
-
`),output_manager_default.warn(`Save this secret - it will not be shown again: ${
|
|
1424
|
-
`),0}catch(err){if(output_manager_default.stopSpinner(),isAPIError(err)){if(client.nonInteractive){let reason=err.code==="invalid_url"?AGENT_REASON.INVALID_URL:err.code==="invalid_event"?AGENT_REASON.INVALID_EVENT:AGENT_REASON.API_ERROR,suggested=reason===AGENT_REASON.INVALID_EVENT?buildCreateCommandWithEventPlaceholder(client.argv,url):void 0;return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason,message:err.message,hint:reason===AGENT_REASON.INVALID_EVENT?`See available events: ${WEBHOOKS_EVENTS_DOCS_URL}`:void 0,next:suggested!==void 0?[{command:suggested,when:"use a valid --event value"}]:void 0},1),1}return err.code==="invalid_url"?(output_manager_default.error(`Invalid webhook URL: ${url}`),1):err.code==="invalid_event"?(output_manager_default.error("Invalid event type. Please check the event names."),1):(output_manager_default.error(err.message),1)}throw err}}function buildCreateCommandWithEventPlaceholder(fullArgv,url){let argv=fullArgv.slice(2),out=["webhooks","create",url],i=3,hadEvent=!1;for(;i<argv.length;){if(argv[i]==="--event"||argv[i]==="-e"){hadEvent=!0,i+=2;continue}out.push(argv[i]),i++}return hadEvent&&out.push("--event","<event>"),getCommandNamePlain(out.join(" "))}var
|
|
1425
|
-
`),0):(output_manager_default.success(`Webhook ${
|
|
1425
|
+
`),output_manager_default.warn(`Save this secret - it will not be shown again: ${import_chalk318.default.bold(webhook.secret)}`),output_manager_default.print(`
|
|
1426
|
+
`),0}catch(err){if(output_manager_default.stopSpinner(),isAPIError(err)){if(client.nonInteractive){let reason=err.code==="invalid_url"?AGENT_REASON.INVALID_URL:err.code==="invalid_event"?AGENT_REASON.INVALID_EVENT:AGENT_REASON.API_ERROR,suggested=reason===AGENT_REASON.INVALID_EVENT?buildCreateCommandWithEventPlaceholder(client.argv,url):void 0;return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason,message:err.message,hint:reason===AGENT_REASON.INVALID_EVENT?`See available events: ${WEBHOOKS_EVENTS_DOCS_URL}`:void 0,next:suggested!==void 0?[{command:suggested,when:"use a valid --event value"}]:void 0},1),1}return err.code==="invalid_url"?(output_manager_default.error(`Invalid webhook URL: ${url}`),1):err.code==="invalid_event"?(output_manager_default.error("Invalid event type. Please check the event names."),1):(output_manager_default.error(err.message),1)}throw err}}function buildCreateCommandWithEventPlaceholder(fullArgv,url){let argv=fullArgv.slice(2),out=["webhooks","create",url],i=3,hadEvent=!1;for(;i<argv.length;){if(argv[i]==="--event"||argv[i]==="-e"){hadEvent=!0,i+=2;continue}out.push(argv[i]),i++}return hadEvent&&out.push("--event","<event>"),getCommandNamePlain(out.join(" "))}var import_chalk319=__toESM(require_source(),1);async function deleteWebhook(client,webhookId){await client.fetch(`/v1/webhooks/${encodeURIComponent(webhookId)}`,{method:"DELETE"})}var WebhooksRmTelemetryClient=class extends TelemetryClient{trackCliArgumentId(id){id&&this.trackCliArgument({arg:"id",value:this.redactedValue})}trackCliFlagYes(yes){yes&&this.trackCliFlag("yes")}};function webhookCommandWithGlobalFlags(baseSubcommand,argv){let globalFlags=getGlobalFlagsFromArgs(argv.slice(2)),full=globalFlags.length?`${baseSubcommand} ${globalFlags.join(" ")}`:baseSubcommand;return getCommandNamePlain(full)}async function rm12(client,argv){let telemetry2=new WebhooksRmTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpecification=getFlagsSpecification(removeSubcommand18.options);try{parsedArgs=parseArguments(argv,flagsSpecification)}catch(error){return printError(error),1}let{args,flags:opts}=parsedArgs,[webhookId]=args;if(telemetry2.trackCliArgumentId(webhookId),telemetry2.trackCliFlagYes(opts["--yes"]),!webhookId)return client.nonInteractive&&outputAgentError(client,{status:"error",reason:"missing_id",message:"Webhook ID is required. Provide ID as the first argument.",next:[{command:webhookCommandWithGlobalFlags("webhooks ls",client.argv)},{command:webhookCommandWithGlobalFlags("webhooks rm <id> --yes",client.argv)}]},1),output_manager_default.error(`${getCommandName("webhooks rm <id>")} expects one argument`),1;let skipConfirmation=opts["--yes"]||!1;client.nonInteractive&&!skipConfirmation&&outputAgentError(client,{status:"error",reason:"confirmation_required",message:"Removing a webhook requires confirmation. Re-run with --yes.",next:[{command:buildCommandWithYes(client.argv)}]},1);let{contextName}=await getScope(client);if(args.length!==1)return output_manager_default.error(`Invalid number of arguments. Usage: ${import_chalk319.default.cyan(`${getCommandName("webhooks rm <id>")}`)}`),1;client.nonInteractive||output_manager_default.spinner(`Fetching webhook ${webhookId}`);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:webhookCommandWithGlobalFlags("webhooks ls",client.argv)}]},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(output_manager_default.stopSpinner(),!skipConfirmation&&!await client.input.confirm(`Are you sure you want to remove webhook ${param(webhookId)} (${webhook.url})?`,!1))return client.nonInteractive||output_manager_default.log("Canceled"),0;let removeStamp=stamp_default();client.nonInteractive||output_manager_default.spinner(`Removing webhook under ${import_chalk319.default.bold(contextName)}`);try{return await deleteWebhook(client,webhookId),output_manager_default.stopSpinner(),client.nonInteractive?(client.stdout.write(`${JSON.stringify({status:"ok",webhook:{id:webhookId,url:webhook.url},message:`Webhook ${webhookId} removed.`},null,2)}
|
|
1427
|
+
`),0):(output_manager_default.success(`Webhook ${import_chalk319.default.bold(webhookId)} removed ${removeStamp()}`),0)}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:webhookCommandWithGlobalFlags("webhooks ls",client.argv)}]},1),output_manager_default.error(`Webhook not found: ${webhookId}`),1;throw err}}var WebhooksTelemetryClient=class extends TelemetryClient{trackCliSubcommandCreate(actual){this.trackCliSubcommand({subcommand:"create",value:actual})}trackCliSubcommandGet(actual){this.trackCliSubcommand({subcommand:"get",value:actual})}trackCliSubcommandRemove(actual){this.trackCliSubcommand({subcommand:"remove",value:actual})}trackCliSubcommandList(actual){this.trackCliSubcommand({subcommand:"list",value:actual})}};var COMMAND_CONFIG66={create:["create","add"],get:["get","inspect"],ls:["ls","list"],rm:["rm","remove","delete"]};async function main35(client){let parsedArgs,flagsSpecification=getFlagsSpecification(webhooksCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification,{permissive:!0})}catch(error){return printError(error),1}let telemetry2=new WebhooksTelemetryClient({opts:{store:client.telemetryEventStore}}),{subcommand,args,subcommandOriginal}=getSubcommand7(parsedArgs.args.slice(1),COMMAND_CONFIG66),needHelp=parsedArgs.flags["--help"];if(!subcommand&&needHelp)return telemetry2.trackCliFlagHelp("webhooks"),output_manager_default.print(help(webhooksCommand,{columns:client.stderr.columns})),2;function printHelp(command2){return output_manager_default.print(help(command2,{parent:webhooksCommand,columns:client.stderr.columns})),2}switch(subcommand){case"create":return needHelp?(telemetry2.trackCliFlagHelp("webhooks",subcommandOriginal),printHelp(createSubcommand9)):(telemetry2.trackCliSubcommandCreate(subcommandOriginal),create8(client,args));case"get":return needHelp?(telemetry2.trackCliFlagHelp("webhooks",subcommandOriginal),printHelp(getSubcommand6)):(telemetry2.trackCliSubcommandGet(subcommandOriginal),get6(client,args));case"rm":return needHelp?(telemetry2.trackCliFlagHelp("webhooks",subcommandOriginal),printHelp(removeSubcommand18)):(telemetry2.trackCliSubcommandRemove(subcommandOriginal),rm12(client,args));default:return needHelp?(telemetry2.trackCliFlagHelp("webhooks",subcommandOriginal),printHelp(listSubcommand29)):(telemetry2.trackCliSubcommandList(subcommandOriginal),ls10(client,args))}}var import_chalk320=__toESM(require_source(),1);var WhoamiTelemetryClient=class extends TelemetryClient{};async function whoami(client){let parsedArgs=null,flagsSpecification=getFlagsSpecification(whoamiCommand.options),telemetry2=new WhoamiTelemetryClient({opts:{store:client.telemetryEventStore}});try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpecification)}catch(error){return printError(error),1}if(parsedArgs.flags["--help"])return telemetry2.trackCliFlagHelp("whoami"),output_manager_default.print(help(whoamiCommand,{columns:client.stderr.columns})),0;let formatResult=validateJsonOutput(parsedArgs.flags);if(!formatResult.valid)return output_manager_default.error(formatResult.error),1;let asJson=formatResult.jsonOutput;if(telemetry2.trackCliOptionFormat(parsedArgs.flags["--format"]),!client.authConfig.token)return asJson?client.stdout.write(`${JSON.stringify({loggedIn:!1},null,2)}
|
|
1426
1428
|
`):(output_manager_default.log("Logged out."),output_manager_default.log(`Run ${getCommandName("deploy --temporary")} to create a temporary deployment you can claim later, or ${getCommandName("login")} to log in.`)),1;let scope=await getScope(client,{resolveLocalScope:!0}),{user,team,app,globalTeam}=scope,hasLocalOverride=!scope.explicitScopeProvided&&((team?.id??null)!==(globalTeam?.id??null)||scope.scopeMismatch);if(asJson){let jsonOutput={team:team?{id:team.id,slug:team.slug,name:team.name}:null};user&&(jsonOutput.username=user.username,jsonOutput.email=user.email,jsonOutput.name=user.name),app&&(jsonOutput.app=app),hasLocalOverride&&(jsonOutput.localOverride=!0,jsonOutput.globalTeam=globalTeam?{id:globalTeam.id,slug:globalTeam.slug,name:globalTeam.name}:null),client.stdout.write(`${JSON.stringify(jsonOutput,null,2)}
|
|
1427
|
-
`)}else if(client.stdout.isTTY){if(output_manager_default.log(`Logged in as ${
|
|
1429
|
+
`)}else if(client.stdout.isTTY){if(output_manager_default.log(`Logged in as ${import_chalk320.default.bold(formatUsername(scope))}`),team?output_manager_default.log(`Active team: ${import_chalk320.default.bold(team.slug)}${team.name&&team.name!==team.slug?` (${team.name})`:""}`):output_manager_default.log(`Active team: ${import_chalk320.default.bold("Personal Account")}`),hasLocalOverride){let globalLabel=globalTeam?globalTeam.slug:"Personal Account",localLabel=team?team.slug:"Personal Account";output_manager_default.log(`${import_chalk320.default.yellow("Local override:")} scope is set to ${import_chalk320.default.bold(localLabel)} by the linked project in this directory (globally selected: ${import_chalk320.default.bold(globalLabel)}).`)}}else client.stdout.write(`${formatUsername(scope)}
|
|
1428
1430
|
`);return 0}function formatUsername(scope){if(scope.user)return scope.user.username;if(scope.app)return scope.app.id;throw new Error("Could not format principal identity")}export{activity,agent,agentRuns,main2 as aiGateway,alerts,alias,api,bisect,main3 as blob,budget,builders,main4 as buy,main5 as cache,main6 as certs,changelog,comments,connex,contract,main7 as crons,curl,main8 as deployHooks,dns,main9 as domains,experiments,main18 as firewall,main20 as flags,main21 as git,main19 as globalConfig,guidance,httpstat,main22 as init,inspect13 as inspect,install,main24 as integration,main23 as integrationResource,main25 as kms,login,logout2 as logout,logs,main26 as mcp,metrics,main27 as microfrontends,openCommandHandler as open,main28 as project,promote_default as promote,main as pull,redeploy,main29 as redirects,remove13 as remove,rollback_default as rollback,rollingRelease,main30 as routes,sandbox,main31 as schedules,security,setup,signup,skills,main32 as storage,main33 as target,teams,telemetry,main34 as tokens,traces,upgrade,usage,vcr,version,main35 as webhooks,whoami};
|