vercel 63.1.1 → 64.0.1
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-WX7XBOMM.js → add-BMUUEEVH.js} +1 -1
- package/dist/chunks/add-HVM5P72U.js +8 -0
- package/dist/chunks/{add-YAWFEGID.js → add-UGPZ3CCF.js} +1 -1
- package/dist/chunks/{build-FIPVJJWA.js → build-TNTAXGN2.js} +1 -1
- package/dist/chunks/{chunk-VUILLFZ6.js → chunk-2EZVL7H3.js} +1 -1
- package/dist/chunks/chunk-3AVG55SO.js +7 -0
- package/dist/chunks/chunk-42GFIWDH.js +12 -0
- package/dist/chunks/chunk-5UEBA6N6.js +8 -0
- package/dist/chunks/chunk-6EOSJGQQ.js +7 -0
- package/dist/chunks/{chunk-R4TMZGV5.js → chunk-74OAJW3T.js} +10 -7
- package/dist/chunks/{chunk-MJR564B4.js → chunk-A6WTFAZT.js} +1 -1
- package/dist/chunks/{chunk-RZTGPQFR.js → chunk-A7LJYJTR.js} +1 -1
- package/dist/chunks/{chunk-MS576PZ7.js → chunk-AKY6JG2X.js} +1 -1
- package/dist/chunks/{chunk-7I57HOA6.js → chunk-AZAGTZTH.js} +1 -1
- package/dist/chunks/{chunk-AVRYIQRF.js → chunk-BLAIBYEU.js} +3 -3
- package/dist/chunks/{chunk-IVUYULMP.js → chunk-BM2K5MMH.js} +1 -1
- package/dist/chunks/{chunk-EGZIRI5B.js → chunk-BNJQIVC2.js} +1 -1
- package/dist/chunks/{chunk-2GTCIOCB.js → chunk-BO2A5V7C.js} +1 -1
- package/dist/chunks/{chunk-UPXIQO57.js → chunk-CDGQ3T52.js} +1 -1
- package/dist/chunks/{chunk-26KRNEYD.js → chunk-COGMOZTL.js} +1 -1
- package/dist/chunks/{chunk-L3S26YTM.js → chunk-CUGDEOWG.js} +1 -1
- package/dist/chunks/{chunk-WKTIAVGU.js → chunk-CX2GKBWT.js} +1 -1
- package/dist/chunks/{chunk-LZAGJ3QI.js → chunk-D4B463CV.js} +1 -1
- package/dist/chunks/{chunk-OKS442LQ.js → chunk-DVQDWCWS.js} +1 -1
- package/dist/chunks/chunk-FO7MV3VE.js +8 -0
- package/dist/chunks/{chunk-TEHMKMPG.js → chunk-FRXP4IEJ.js} +1 -1
- package/dist/chunks/{chunk-WDJFZM7U.js → chunk-HYFA2W4U.js} +1 -1
- package/dist/chunks/{chunk-HVNIW32A.js → chunk-JFASDCSW.js} +2 -2
- package/dist/chunks/{chunk-QCG6Q33G.js → chunk-JJXNBWZY.js} +1 -1
- package/dist/chunks/{chunk-NUPLQVP3.js → chunk-JWO4AFKT.js} +1 -1
- package/dist/chunks/{chunk-IOJYYPUF.js → chunk-LG5FP6PL.js} +3 -3
- package/dist/chunks/{chunk-BW64GZ3E.js → chunk-MMIOAN6V.js} +1 -1
- package/dist/chunks/{chunk-G64N3I5W.js → chunk-MTSJMQCE.js} +1 -1
- package/dist/chunks/{chunk-YCV465P5.js → chunk-N7DY367Z.js} +1 -1
- package/dist/chunks/{chunk-JV4URBEA.js → chunk-NVSVMH3S.js} +1 -1
- package/dist/chunks/{chunk-DO4GPDKO.js → chunk-PFM3URPJ.js} +1 -1
- package/dist/chunks/{chunk-TAAV7L3T.js → chunk-PZK6CKRM.js} +1 -1
- package/dist/chunks/{chunk-MHQ2MW2B.js → chunk-QHKVAGWC.js} +3 -3
- package/dist/chunks/chunk-QUE7MWER.js +11 -0
- package/dist/chunks/chunk-R5FJNGWK.js +10 -0
- package/dist/chunks/{chunk-YDRNDY2V.js → chunk-R7FDTIAQ.js} +2 -2
- package/dist/chunks/{chunk-GNY6U33Z.js → chunk-S2JJZDW6.js} +2 -2
- package/dist/chunks/{chunk-I4NK2P2D.js → chunk-SFW6MBQN.js} +1 -1
- package/dist/chunks/{chunk-DJDT2SUM.js → chunk-TC65E2YX.js} +1 -1
- package/dist/chunks/{chunk-67N2NJCF.js → chunk-TWRV6QGX.js} +1 -1
- package/dist/chunks/{chunk-WJEAGH4K.js → chunk-UC4YUQBN.js} +1 -1
- package/dist/chunks/{chunk-OA446564.js → chunk-V3UOKOM5.js} +1 -1
- package/dist/chunks/{chunk-ACGKBCXE.js → chunk-WDNNB4RL.js} +1 -1
- package/dist/chunks/{chunk-7Z4JCYS6.js → chunk-WJ3UIEZ5.js} +2 -2
- package/dist/chunks/chunk-YBOS65VB.js +7 -0
- package/dist/chunks/{chunk-WXWBB7LP.js → chunk-YBSW4AZH.js} +1 -1
- package/dist/chunks/{chunk-ME6DBVQG.js → chunk-YH6CNXAT.js} +1 -1
- package/dist/chunks/{chunk-G2JKENQU.js → chunk-YLTOFGIJ.js} +1 -1
- package/dist/chunks/chunk-YTDK6AHS.js +7 -0
- package/dist/chunks/{chunk-Q3SWLXLO.js → chunk-YTEZO2SZ.js} +1 -1
- package/dist/chunks/{chunk-Q7ZF7MBI.js → chunk-YWLJSVTR.js} +1 -1
- package/dist/chunks/{chunk-46XQIXL7.js → chunk-ZF6QZY35.js} +1 -1
- package/dist/chunks/{chunk-ME75ZZW7.js → chunk-ZMIRVO5A.js} +1 -1
- package/dist/chunks/{clear-ZEWRQLJR.js → clear-MRFK6SNK.js} +1 -1
- package/dist/chunks/{compile-vercel-config-66TMMPL5.js → compile-vercel-config-MOEJ6RRY.js} +1 -1
- package/dist/chunks/config-ESRDSIAF.js +7 -0
- package/dist/chunks/{config-LDTDOVVC.js → config-H7EMH632.js} +1 -1
- package/dist/chunks/config-validator.mjs +1 -1
- package/dist/chunks/{delete-QVG74P23.js → delete-TIWKKRQQ.js} +1 -1
- package/dist/chunks/{delete-5WC3BAXY.js → delete-TYLF74HP.js} +1 -1
- package/dist/chunks/{detect-projects-FTGWHOTA.js → detect-projects-LFEZ7BQU.js} +1 -1
- package/dist/chunks/{detect-services-QPBLJZGR.js → detect-services-KGIGKZFX.js} +1 -1
- package/dist/chunks/{disable-MJP72BUH.js → disable-SRIMYL73.js} +1 -1
- package/dist/chunks/{discard-GHJO6HJ7.js → discard-F4Y2NOHU.js} +1 -1
- package/dist/chunks/{edit-ELV6KOAC.js → edit-3D6L76R3.js} +1 -1
- package/dist/chunks/{edit-MCMKL3PG.js → edit-5VW3WYFP.js} +1 -1
- package/dist/chunks/{enable-NJV7TP3E.js → enable-IPPUYI4D.js} +1 -1
- package/dist/chunks/{export-OFXKWFKJ.js → export-BPHKR42P.js} +1 -1
- package/dist/chunks/{future-TTQX6P2J.js → future-PZPJ3LBY.js} +1 -1
- package/dist/chunks/{generate-cert-for-deploy-H5CIDNMW.js → generate-cert-for-deploy-JRFEERJY.js} +1 -1
- package/dist/chunks/{image-2V2VJOSJ.js → image-2GMCXYKH.js} +1 -1
- package/dist/chunks/{import-builders-K3AX56WJ.js → import-builders-LAISJVC4.js} +1 -1
- package/dist/chunks/{inspect-ZNSHEHOX.js → inspect-NZIX5PW5.js} +1 -1
- package/dist/chunks/inspect-PMOUB7TZ.js +13 -0
- package/dist/chunks/{inspect-3YVNC464.js → inspect-WYE74TOO.js} +1 -1
- package/dist/chunks/{inspect-7YQ3GVZK.js → inspect-Y7MAI6NN.js} +1 -1
- package/dist/chunks/{inspect-SLCLHRCE.js → inspect-ZRNPBDR7.js} +1 -1
- package/dist/chunks/{list-TFJSUTGX.js → list-5M4CTEGG.js} +1 -1
- package/dist/chunks/{list-QWTJ5GEV.js → list-IUAECVSK.js} +1 -1
- package/dist/chunks/{list-AKLXWJVE.js → list-U7ZZ5HN6.js} +1 -1
- package/dist/chunks/{login-DTYYE77N.js → login-JNMM2LCA.js} +1 -1
- package/dist/chunks/{login-2RXKHHR7.js → login-ZRY2YGZM.js} +1 -1
- package/dist/chunks/logs-YHQ6C7QH.js +7 -0
- package/dist/chunks/{ls-KPDMEX3M.js → ls-3HMQEZEV.js} +1 -1
- package/dist/chunks/ls-53GH55RA.js +8 -0
- package/dist/chunks/{ls-PDGT4IYT.js → ls-BAUM7ICU.js} +1 -1
- package/dist/chunks/{ls-SWSNZDIB.js → ls-CLAXRPIK.js} +1 -1
- package/dist/chunks/{ls-XBWZZIZW.js → ls-IUULJ6WA.js} +1 -1
- package/dist/chunks/{ls-62IGNDVX.js → ls-V5G5SIGL.js} +1 -1
- package/dist/chunks/{ls-RT2GW7GQ.js → ls-XO7ZHACJ.js} +1 -1
- package/dist/chunks/{mutate-4QF5LX5H.js → mutate-NEVQYFUV.js} +1 -1
- package/dist/chunks/{notifications-EZWNVZIY.js → notifications-6AZQNEOE.js} +1 -1
- package/dist/chunks/{open-ZOCLC6EL.js → open-23Y6VJR4.js} +1 -1
- package/dist/chunks/{openapi-WDPDBK6G.js → openapi-KBLEYOJR.js} +1 -1
- package/dist/chunks/{permissions-WZ74DZVX.js → permissions-R6MSKYOZ.js} +1 -1
- package/dist/chunks/{prompt-missing-credentials-EU3KK3J4.js → prompt-missing-credentials-UML2SHRT.js} +1 -1
- package/dist/chunks/{publish-M6VGADUV.js → publish-TBU3WUSE.js} +1 -1
- package/dist/chunks/{pull-HE4HZUJO.js → pull-M7CBRERS.js} +1 -1
- package/dist/chunks/{purchase-domain-if-available-YK7ZK4OQ.js → purchase-domain-if-available-O2SEHZQG.js} +1 -1
- package/dist/chunks/{push-AXG4E43Q.js → push-7LXD5RDV.js} +1 -1
- package/dist/chunks/query-GDAAENV5.js +12 -0
- package/dist/chunks/{reauthenticate-S6DCF7RS.js → reauthenticate-6PGYUP3P.js} +1 -1
- package/dist/chunks/{reorder-4G2JILHR.js → reorder-S5CX2UNT.js} +1 -1
- package/dist/chunks/{reply-MDSF5FRG.js → reply-4G2J5O6V.js} +1 -1
- package/dist/chunks/{resolve-JFM5IA7H.js → resolve-724ULLUY.js} +1 -1
- package/dist/chunks/{restore-DGXZYLLN.js → restore-EPBSJFSA.js} +1 -1
- package/dist/chunks/rm-F3LLL6MZ.js +8 -0
- package/dist/chunks/{rm-WFK724PU.js → rm-IDDLGKRZ.js} +1 -1
- package/dist/chunks/{rm-56YVF7VJ.js → rm-MI7NPJ4F.js} +1 -1
- package/dist/chunks/{rm-OAN2XZOH.js → rm-PWUJF6CB.js} +1 -1
- package/dist/chunks/{rm-72VFNBSP.js → rm-WWPCSM3O.js} +1 -1
- package/dist/chunks/rule-inspect-FFUYLBZG.js +8 -0
- package/dist/chunks/{rules-5EKUX5OX.js → rules-YFLGPQRW.js} +1 -1
- package/dist/chunks/{schema-LM6XGKQS.js → schema-3VHLYZBA.js} +1 -1
- package/dist/chunks/{schema-6LPADSVE.js → schema-QRHP4WMY.js} +1 -1
- package/dist/chunks/{select-org-MARKOFHY.js → select-org-6BWIH3S3.js} +1 -1
- package/dist/chunks/{set-MTKMZ2YS.js → set-FPPF7W47.js} +1 -1
- package/dist/chunks/{setup-and-link-KMD3ZLHN.js → setup-and-link-ENQEJG6L.js} +1 -1
- package/dist/chunks/{tags-SXRDMEPO.js → tags-JDL3PPLS.js} +1 -1
- package/dist/chunks/{types-K73TDN7C.js → types-HLISMAF6.js} +1 -1
- package/dist/chunks/{update-QSNT3MDG.js → update-GH56IPQR.js} +1 -1
- package/dist/commands/build/index.js +1 -1
- package/dist/commands/deploy/index.js +6 -6
- package/dist/commands/dev/index.js +9 -9
- 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 +341 -325
- package/dist/index.js +2 -2
- package/dist/internal-build.js +1 -1
- package/dist/root-help-commands.mjs +1 -1
- package/dist/version.mjs +1 -1
- package/package.json +55 -55
- package/dist/chunks/add-LFJBSEHE.js +0 -8
- package/dist/chunks/chunk-5DXCVG5U.js +0 -10
- package/dist/chunks/chunk-5O2CW3SX.js +0 -8
- package/dist/chunks/chunk-6LZ72MNE.js +0 -9
- package/dist/chunks/chunk-AMDHTZDV.js +0 -11
- package/dist/chunks/chunk-HRR57QNP.js +0 -7
- package/dist/chunks/chunk-IADIPNJO.js +0 -7
- package/dist/chunks/chunk-MYY36NBW.js +0 -7
- package/dist/chunks/chunk-OBRNACWW.js +0 -18
- package/dist/chunks/chunk-OH2RT2GN.js +0 -7
- package/dist/chunks/chunk-PFD7LETF.js +0 -7
- package/dist/chunks/chunk-WH3SHWVK.js +0 -8
- package/dist/chunks/config-V7SAJGMS.js +0 -7
- package/dist/chunks/inspect-SEHUG246.js +0 -13
- package/dist/chunks/logs-RI5TPLZS.js +0 -7
- package/dist/chunks/ls-O6RYA4QE.js +0 -8
- package/dist/chunks/query-LSTTTOQM.js +0 -12
- package/dist/chunks/rm-3CXFYPYT.js +0 -8
- package/dist/chunks/rule-inspect-C6FZRTXY.js +0 -8
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { createRequire as __createRequire } from 'node:module';
|
|
2
|
+
import { fileURLToPath as __fileURLToPath } from 'node:url';
|
|
3
|
+
import { dirname as __dirname_ } from 'node:path';
|
|
4
|
+
const require = __createRequire(import.meta.url);
|
|
5
|
+
const __filename = __fileURLToPath(import.meta.url);
|
|
6
|
+
const __dirname = __dirname_(__filename);
|
|
7
|
+
import{require_ms}from"./chunk-MXTC4ZAQ.js";import{output_manager_default}from"./chunk-75IAMKGV.js";import{__toESM}from"./chunk-BZENIQ7N.js";var import_ms=__toESM(require_ms(),1);function parseTimeFlag(input,now=Date.now()){if(input.trim()==="now")return new Date(now);let milliseconds=(0,import_ms.default)(input);if(milliseconds!==void 0)return new Date(now-milliseconds);let date=new Date(input);if(isNaN(date.getTime()))throw new Error(`Invalid time format "${input}". Use relative (1h, 30m, 2d, 1w), ISO 8601 datetime, or now.`);return date}function resolveTimeRange(since="1h",until,now=Date.now()){let startTime=parseTimeFlag(since,now),endTime=until?parseTimeFlag(until,now):new Date(now);return{startTime,endTime}}function validateAllProjectMutualExclusivity(all,project){return all&&project?{valid:!1,code:"MUTUAL_EXCLUSIVITY",message:"Cannot specify both --all and --project. Use one or the other."}:{valid:!0}}function validateTimeBound(input){if(!input)return{valid:!0,value:void 0};try{return{valid:!0,value:parseTimeFlag(input)}}catch(err){return{valid:!1,code:"INVALID_TIME",message:err.message}}}function validateTimeOrder(since,until){return since&&until&&since.getTime()>until.getTime()?{valid:!1,code:"INVALID_TIME_RANGE",message:"`--since` must be earlier than `--until`."}:{valid:!0}}function normalizeRepeatableStringFilters(filters){if(!filters||filters.length===0)return[];let normalized=filters.flatMap(filter=>filter.split(",")).map(filter=>filter.trim()).filter(Boolean);return[...new Set(normalized)]}function validateIntegerRangeWithDefault(value,opts){return value===void 0?{valid:!0,value:opts.defaultValue}:Number.isNaN(value)?{valid:!1,code:"INVALID_LIMIT",message:`Please provide a number for flag \`${opts.flag}\`.`}:!Number.isInteger(value)||value<opts.min||value>opts.max?{valid:!1,code:"INVALID_LIMIT",message:`\`${opts.flag}\` must be an integer between ${opts.min} and ${opts.max}.`}:{valid:!0,value}}function validateOptionalIntegerRange(value,opts){return value===void 0?{valid:!0,value:void 0}:Number.isNaN(value)?{valid:!1,code:opts.code||"INVALID_LIMIT",message:`Please provide a number for flag \`${opts.flag}\`.`}:!Number.isInteger(value)||value<opts.min||value>opts.max?{valid:!1,code:opts.code||"INVALID_LIMIT",message:`\`${opts.flag}\` must be an integer between ${opts.min} and ${opts.max}.`}:{valid:!0,value}}function formatJsonError(code,message){return`${JSON.stringify({error:{code,message}},null,2)}
|
|
8
|
+
`}function writeJsonError(client,code,message){client.stdout.write(formatJsonError(code,message))}var USAGE_ERROR_CODES=new Set(["CONFLICTING_CONTENT","INVALID_AGGREGATION","INVALID_ARGUMENTS","INVALID_ATTACHMENT","INVALID_GRANULARITY","INVALID_GROUP_BY","INVALID_LIMIT","INVALID_RULE_TYPE","INVALID_STATUS","INVALID_THREAD","INVALID_TIME","INVALID_TIME_RANGE","MESSAGE_WITH_MULTIPLE_THREADS","MISSING_ARGUMENT","MISSING_ARGUMENTS","MISSING_CONTENT","MISSING_FLAG","MISSING_THREAD","MUTUAL_EXCLUSIVITY"]);function getExitCodeForErrorCode(code){return USAGE_ERROR_CODES.has(code)?2:1}function outputError(client,jsonOutput,code,message){return jsonOutput?writeJsonError(client,code,message):output_manager_default.error(message),getExitCodeForErrorCode(code)}function handleValidationError(result,jsonOutput,client){return outputError(client,jsonOutput,result.code,result.message)}export{parseTimeFlag,resolveTimeRange,validateAllProjectMutualExclusivity,validateTimeBound,validateTimeOrder,normalizeRepeatableStringFilters,validateIntegerRangeWithDefault,validateOptionalIntegerRange,writeJsonError,getExitCodeForErrorCode,outputError,handleValidationError};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { createRequire as __createRequire } from 'node:module';
|
|
2
|
+
import { fileURLToPath as __fileURLToPath } from 'node:url';
|
|
3
|
+
import { dirname as __dirname_ } from 'node:path';
|
|
4
|
+
const require = __createRequire(import.meta.url);
|
|
5
|
+
const __filename = __fileURLToPath(import.meta.url);
|
|
6
|
+
const __dirname = __dirname_(__filename);
|
|
7
|
+
import{resolveProjectContext}from"./chunk-UC4YUQBN.js";import{printError}from"./chunk-HYFA2W4U.js";import{AGENT_REASON,AGENT_STATUS,buildCommandWithGlobalFlags,getErrorRecovery,getExitCodeForReason,outputActionRequired,outputAgentError}from"./chunk-R5FJNGWK.js";import{detectExplicitScope}from"./chunk-TWRV6QGX.js";import{getProjectByNameOrId}from"./chunk-LG5FP6PL.js";import{ProjectNotFound,isAPIError}from"./chunk-YIIPBH2D.js";import{output_manager_default}from"./chunk-75IAMKGV.js";function tracingErrorMessage(err){return isAPIError(err)?err.serverMessage||err.message:err instanceof Error?err.message:String(err)}function tracingErrorReason(err){let status=isAPIError(err)?err.status:void 0;return status===403?AGENT_REASON.PERMISSION_DENIED:status===404?AGENT_REASON.NOT_FOUND:status===429?AGENT_REASON.RATE_LIMITED:AGENT_REASON.API_ERROR}function handleTracingApiError(client,err){if(client.nonInteractive){let apiError=isAPIError(err)?err:void 0;outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:tracingErrorReason(err),message:tracingErrorMessage(err),...apiError?.status===429&&getErrorRecovery(apiError,client)})}return isAPIError(err)&&err.status===403?(output_manager_default.error(tracingErrorMessage(err)),1):(printError(err),1)}function configError(client,reason,message){return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason,message}),output_manager_default.error(message),getExitCodeForReason(reason)}function invalidArguments(client,message){return configError(client,AGENT_REASON.INVALID_ARGUMENTS,message)}function ruleNotFound(client,message){return configError(client,AGENT_REASON.NOT_FOUND,message)}function confirmationRequired(client,message,next){return outputAgentError(client,{status:AGENT_STATUS.ERROR,reason:AGENT_REASON.CONFIRMATION_REQUIRED,message,userActionRequired:!0,next}),output_manager_default.error(message),1}var MISSING_BOTH_MESSAGE="No linked project found. Run `vercel link`, pass --cwd to a linked dir, or use --scope <team> and --project <name>.";async function resolveScope({client,flags={},linkedProject}){let flagScope=flags.scope?.trim()||void 0,flagProject=flags.project?.trim()||void 0;if(linkedProject.status==="linked"){if(!flagScope&&!flagProject)return{teamId:linkedProject.org.id,projectId:linkedProject.project.id,projectName:linkedProject.project.name};let teamId=flagScope?client.config.currentTeam:linkedProject.org.id;if(!teamId)return{reason:AGENT_REASON.NOT_FOUND,message:`Team not found: ${flagScope}`};let project=await getProjectByNameOrId(client,flagProject??linkedProject.project.id,teamId);return project instanceof ProjectNotFound?{reason:AGENT_REASON.NOT_FOUND,message:`Project not found: ${flagProject}`}:{teamId,projectId:project.id,projectName:project.name}}if(flagScope&&flagProject){let teamId=client.config.currentTeam;if(!teamId)return{reason:AGENT_REASON.NOT_FOUND,message:`Team not found: ${flagScope}`};let project=await getProjectByNameOrId(client,flagProject,teamId);return project instanceof ProjectNotFound?{reason:AGENT_REASON.NOT_FOUND,message:`Project not found: ${flagProject}`}:{teamId,projectId:project.id,projectName:project.name}}return{reason:AGENT_REASON.NOT_LINKED,message:MISSING_BOTH_MESSAGE}}async function resolveConfigScope(client,flags){let link=await resolveProjectContext({client,projectNameOrId:flags.project});return link.status==="error"?{exitCode:link.exitCode}:link.status==="not_linked"?(outputActionRequired(client,{status:AGENT_STATUS.ACTION_REQUIRED,reason:AGENT_REASON.NOT_LINKED,message:MISSING_BOTH_MESSAGE,hint:"Link a project or pass --scope and --project.",next:[{command:buildCommandWithGlobalFlags(client.argv,"link"),when:"link this directory to a project"}]}),output_manager_default.error(MISSING_BOTH_MESSAGE),{exitCode:1}):flags.project===void 0&&detectExplicitScope(client)&&link.org.id!==client.config.currentTeam?{exitCode:invalidArguments(client,`The linked project ${link.project.name} belongs to ${link.org.slug||link.org.id}, which is not the scope that was passed. Pass --project <name> to act on a project in that scope.`)}:{teamId:link.org.id,projectId:link.project.id,projectName:link.project.name}}export{resolveScope,tracingErrorMessage,tracingErrorReason,handleTracingApiError,invalidArguments,ruleNotFound,confirmationRequired,resolveConfigScope};
|
|
@@ -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{createDetectEntrypoint,getServicesConfigWriteBlocker,writeServicesConfig}from"./chunk-
|
|
7
|
+
import{createDetectEntrypoint,getServicesConfigWriteBlocker,writeServicesConfig}from"./chunk-CUGDEOWG.js";import{detectProjects}from"./chunk-YTEZO2SZ.js";import{require_slugify}from"./chunk-COD3WAUI.js";import{selectOrg}from"./chunk-BNJQIVC2.js";import{createProject}from"./chunk-QHJLRTVY.js";import{readJSONFile}from"./chunk-COGMOZTL.js";import{singleFileProjectSettings,validateRootDirectory}from"./chunk-WDNNB4RL.js";import{require_dist as require_dist2}from"./chunk-YBOS65VB.js";import{checkExistsAndConnect,parseRepoUrl,selectAndParseRemoteUrl}from"./chunk-SYEKOJHT.js";import{require_dist2 as require_dist}from"./chunk-BLAIBYEU.js";import{compileVercelConfig,findSourceVercelConfigFile}from"./chunk-ZF6QZY35.js";import{Separator}from"./chunk-MVGTMPMI.js";import{isPromptBackError,isPromptCanceledError}from"./chunk-P2O5DOYE.js";import{pull}from"./chunk-D4B463CV.js";import{require_frameworks}from"./chunk-MVCAUS4F.js";import{table}from"./chunk-773GOZIR.js";import{printError}from"./chunk-HYFA2W4U.js";import{getLocalPathConfig}from"./chunk-TWRV6QGX.js";import{VERCEL_DIR_PROJECT,VERCEL_DIR_README,fetchProjectsForRepoUrl,findProjectsFromPath,findRepoRoot,getGitConfigPath,getLinkedProject,getProjectByNameOrId,getRemoteUrls,getVercelDirectory,isDirectory,linkFolderToProject,linkRepoProject,parseGitConfig,pluckRemoteUrls,require_lib,resolveGitRemote}from"./chunk-LG5FP6PL.js";import{humanizePath}from"./chunk-PPCFQQSU.js";import{printAlignedLabel}from"./chunk-N7Q2IESO.js";import{CantParseJSONFile,ProjectNotFound,isAPIError}from"./chunk-YIIPBH2D.js";import{output_manager_default,require_build_utils}from"./chunk-75IAMKGV.js";import{require_source}from"./chunk-NB2WLB3J.js";import{__toESM}from"./chunk-BZENIQ7N.js";var import_fs_extra=__toESM(require_lib(),1),import_slugify3=__toESM(require_slugify(),1),import_build_utils4=__toESM(require_build_utils(),1),import_fs_detectors2=__toESM(require_dist(),1);import{join as join3,basename,extname}from"path";var import_chalk=__toESM(require_source(),1);var import_slugify=__toESM(require_slugify(),1);var SEARCH_ALL_PROJECTS="search-all-projects",CREATE_NEW_PROJECT="create-new-project",BACK_TO_PROJECT_SELECTION=Symbol("back-to-project-selection"),BACK_TO_TEAM_SELECTION=Symbol("back-to-team-selection"),SWITCH_GIT_REMOTE=Symbol("switch-git-remote"),NO_EXISTING_PROJECTS=Symbol("no-existing-projects");async function inputProjectDecision(client,defaultDecision){let createChoice={name:"Create new project",value:"create"},existingChoice={name:"Link existing project",value:"existing"};return await client.input.select({message:"Project?",choices:defaultDecision==="existing"?[existingChoice,createChoice]:[createChoice,existingChoice]})}function randomNameSuffix(){return Math.random().toString(36).slice(2,6).padEnd(4,"0")}async function suggestNewProjectName(client,org,slugifiedName,knownTaken){let taken=knownTaken;if(!taken)try{taken=!(await getProjectByNameOrId(client,slugifiedName,org.id)instanceof ProjectNotFound)}catch{taken=!1}return taken?`${slugifiedName}-${randomNameSuffix()}`:slugifiedName}function promptForProjectName(client,org,defaultName,message="Name?"){return client.input.text({message,default:defaultName,validate:async val=>val?await getProjectByNameOrId(client,val,org.id)instanceof ProjectNotFound?!0:"Project already exists":"Project name cannot be empty"})}async function promptForProjectNameWithBack(client,org,defaultName){try{return await client.withPromptBackNavigation(()=>promptForProjectName(client,org,defaultName,`Name? ${import_chalk.default.dim("Press \u2191 to return to project options")}`))}catch(error){if(isPromptBackError(error))return BACK_TO_PROJECT_SELECTION;throw error}}async function searchExistingProjects(client,org,allowBack){let firstPage=await client.fetch("/v9/projects?limit=100",{accountId:org.id}),projects=firstPage.projects,hasMoreProjects=firstPage.pagination.next!=null;if(projects.length===0)return output_manager_default.log(`No existing projects found under ${import_chalk.default.bold(org.slug)}. Creating new project.`),NO_EXISTING_PROJECTS;let pageSize=15,countHint=projects.length>pageSize?` ${import_chalk.default.dim(`(${hasMoreProjects?"100+":projects.length} projects)`)}`:"";return await client.input.search({message:`Which project?${countHint}`,pageSize,source:async(term,{signal})=>{let searchTerm=term?.trim(),matchingProjects=projects;if(searchTerm)if(hasMoreProjects)matchingProjects=(await client.fetch(`/v9/projects?search=${encodeURIComponent(searchTerm)}&limit=20`,{accountId:org.id,signal})).projects;else{let normalizedSearchTerm=searchTerm.toLowerCase();matchingProjects=projects.filter(project=>project.name.toLowerCase().includes(normalizedSearchTerm)||project.id===searchTerm)}let choices=matchingProjects.slice().sort((a,b)=>b.updatedAt-a.updatedAt).map(project=>({name:project.name,value:project}));if(!allowBack)return choices;let backChoice={name:"Back to project options",value:BACK_TO_PROJECT_SELECTION};return choices.length===0?[backChoice]:searchTerm?choices:[...choices,new Separator,backChoice]}})}async function inputProject(client,org,detectedProjectName,autoConfirm=!1,skipAutoDetect=!1,showProjectSuggestions=!1,allowTeamSelectionBack=!1,repoMatches=[],gitRemoteOptions){let slugifiedName=(0,import_slugify.default)(detectedProjectName),canSwitchGitRemote=(gitRemoteOptions?.remoteNames.length??0)>1,detectedProject=null;if(!skipAutoDetect&&repoMatches.length===0){output_manager_default.spinner("Searching for existing projects\u2026",1e3);let[project,slugifiedProject]=await Promise.all([getProjectByNameOrId(client,detectedProjectName,org.id),slugifiedName!==detectedProjectName?getProjectByNameOrId(client,slugifiedName,org.id):null]);if(detectedProject=project instanceof ProjectNotFound?slugifiedProject instanceof ProjectNotFound?null:slugifiedProject:project,detectedProject&&!detectedProject.id)throw new Error('Detected linked project does not have "id".');output_manager_default.stopSpinner()}if(autoConfirm)return repoMatches.length===1?repoMatches[0]:detectedProject||detectedProjectName;if(client.nonInteractive){if(detectedProject)return detectedProject;let err=new Error("Confirmation required");throw err.code="HEADLESS",err}let slugifiedNameKnownFree=!skipAutoDetect&&repoMatches.length===0&&!detectedProject,memoizedDefaultName;async function defaultNewProjectName(){return memoizedDefaultName===void 0&&(memoizedDefaultName=slugifiedNameKnownFree?slugifiedName:await suggestNewProjectName(client,org,slugifiedName,detectedProject?.name===slugifiedName)),memoizedDefaultName}let shouldLinkProject;if(showProjectSuggestions&&!skipAutoDetect)for(;;){let choices=[];if(repoMatches.length>0?choices.push(...repoMatches.map(match=>({name:`${match.project.name} ${import_chalk.default.gray("(linked by git)")}`,value:match})),new Separator):detectedProject&&choices.push({name:`${detectedProject.name} ${import_chalk.default.gray("(folder name)")}`,value:detectedProject},new Separator),choices.push({name:"Search all projects",value:SEARCH_ALL_PROJECTS,description:"Browse or search every project in this team"},{name:"Create a new project",value:CREATE_NEW_PROJECT,description:`Create it under ${org.slug}`}),canSwitchGitRemote){let current=gitRemoteOptions?.currentRemoteName;choices.push({name:"Switch Git remote",value:SWITCH_GIT_REMOTE,description:current?`Suggestions are from ${current}`:"Search projects linked to a different remote"})}allowTeamSelectionBack&&choices.push({name:"Choose a different team",value:BACK_TO_TEAM_SELECTION,description:"Return to team selection"});let selected=await client.input.select({message:"Which project?",choices});if(selected===BACK_TO_TEAM_SELECTION)return BACK_TO_TEAM_SELECTION;if(selected===SWITCH_GIT_REMOTE)return SWITCH_GIT_REMOTE;if(selected===CREATE_NEW_PROJECT){let projectName=await promptForProjectNameWithBack(client,org,await defaultNewProjectName());if(projectName===BACK_TO_PROJECT_SELECTION)continue;return projectName}if(selected!==SEARCH_ALL_PROJECTS)return selected;let existingProject=await searchExistingProjects(client,org,!0);if(existingProject!==BACK_TO_PROJECT_SELECTION){if(existingProject===NO_EXISTING_PROJECTS){let projectName=await promptForProjectNameWithBack(client,org,slugifiedName);if(projectName===BACK_TO_PROJECT_SELECTION)continue;return projectName}return existingProject}}else if(!detectedProject)shouldLinkProject=await inputProjectDecision(client,skipAutoDetect?"existing":"create")==="existing";else{if(output_manager_default.print(` ${import_chalk.default.bold("Found existing project")}
|
|
8
8
|
`),printAlignedLabel("Project",`${org.slug}/${detectedProject.name}`),await client.input.confirm("Link directory to project?",!0))return detectedProject;shouldLinkProject=await inputProjectDecision(client,"existing")==="existing"}if(shouldLinkProject){let existingProject=await searchExistingProjects(client,org,!1);if(existingProject!==NO_EXISTING_PROJECTS&&existingProject!==BACK_TO_PROJECT_SELECTION)return existingProject}return await promptForProjectName(client,org,await defaultNewProjectName())}var import_build_utils=__toESM(require_build_utils(),1),import_chalk2=__toESM(require_source(),1);import path from"path";async function inputRootDirectory(client,cwd,autoConfirm=!1){if(autoConfirm)return null;for(;;){let rootDirectory=await client.input.text({message:"Code directory?",transformer:input=>`${import_chalk2.default.dim("./")}${input}`});if(!rootDirectory)return null;let normal=path.normalize(rootDirectory);if(normal==="."||normal==="./")return null;let fullPath=path.join(cwd,normal);if(await validateRootDirectory(cwd,fullPath,"Please choose a different one.")!==!1)return(0,import_build_utils.normalizePath)(normal)}}var import_chalk3=__toESM(require_source(),1),import_frameworks=__toESM(require_frameworks(),1);function isSettingValue(setting){return setting&&typeof setting.value=="string"}var settingMap={buildCommand:"Build Command",devCommand:"Development Command",commandForIgnoringBuildStep:"Ignore Command",installCommand:"Install Command",outputDirectory:"Output Directory",framework:"Framework"},settingKeys=Object.keys(settingMap).sort();async function editProjectSettings(client,projectSettings,framework,autoConfirm,localConfigurationOverrides,configFileName="vercel.json"){let settings=Object.assign({buildCommand:null,devCommand:null,framework:null,commandForIgnoringBuildStep:null,installCommand:null,outputDirectory:null},projectSettings);if(localConfigurationOverrides&&Object.values(localConfigurationOverrides??{}).some(Boolean)){for(let setting of settingKeys){let localConfigValue=localConfigurationOverrides[setting];localConfigValue&&(settings[setting]=localConfigValue)}output_manager_default.print(` Local settings detected in ${configFileName}:
|
|
9
9
|
`);for(let setting of settingKeys){let override=localConfigurationOverrides[setting];override&&output_manager_default.print(` ${import_chalk3.default.dim(`${import_chalk3.default.bold(`${settingMap[setting]}:`)} ${override}`)}
|
|
10
10
|
`)}if(localConfigurationOverrides.framework){let overrideFramework=import_frameworks.frameworkList.find(f=>f.slug===localConfigurationOverrides.framework);overrideFramework&&(framework=overrideFramework,output_manager_default.print(` Merging default Project Settings for ${framework.name}. Previously listed overrides are prioritized.
|
|
@@ -12,14 +12,17 @@ import{createDetectEntrypoint,getServicesConfigWriteBlocker,writeServicesConfig}
|
|
|
12
12
|
`),!framework.slug)output_manager_default.print(` No framework detected. Default Project Settings:
|
|
13
13
|
`);else{let buildCmd=framework.settings.buildCommand?.value??null,outputSetting=framework.settings.outputDirectory,outputDir=outputSetting?isSettingValue(outputSetting)?outputSetting.value:outputSetting.placeholder:null,inline=[buildCmd?`${settingMap.buildCommand}: ${buildCmd}`:null,outputDir?`${settingMap.outputDirectory}: ${outputDir}`:null].filter(Boolean),detail=inline.length?import_chalk3.default.dim(` (${inline.join(", ")})`):"";output_manager_default.print(` ${import_chalk3.default.bold("Detected")} ${framework.name}${detail}
|
|
14
14
|
`)}if(settings.framework=framework.slug,!framework.slug)for(let setting of settingKeys){if(setting==="framework"||setting==="commandForIgnoringBuildStep")continue;let defaultSetting=framework.settings[setting];!localConfigurationOverrides?.[setting]&&defaultSetting&&output_manager_default.print(` ${import_chalk3.default.dim(`${import_chalk3.default.bold(`${settingMap[setting]}:`)} ${isSettingValue(defaultSetting)?defaultSetting.value:import_chalk3.default.italic(`${defaultSetting.placeholder}`)}`)}
|
|
15
|
-
`)}if(autoConfirm||!await client.input.confirm("Customize settings?",!1))return settings;let choices=settingKeys.reduce((acc,setting)=>setting==="framework"||setting==="commandForIgnoringBuildStep"||setting==="installCommand"||localConfigurationOverrides?.[setting]?acc:[...acc,{name:settingMap[setting],value:setting}],[]),settingFields=await client.input.checkbox({message:"Which settings would you like to overwrite (select multiple)?",choices});for(let setting of settingFields){let field=settingMap[setting];settings[setting]=await client.input.text({message:`${import_chalk3.default.bold(field)}?`})}return settings}async function readConfig(dir){let pkgFilePath;try{pkgFilePath=(await compileVercelConfig(dir)).configPath||getLocalPathConfig(dir)}catch(err){if(err instanceof Error)return err;throw err}let result=await readJSONFile(pkgFilePath);return result instanceof CantParseJSONFile||result?result:null}var import_frameworks3=__toESM(require_frameworks(),1);var import_chalk4=__toESM(require_source(),1),DEFAULT_VERCEL_AUTH_SETTING="standard",OPTIONS={message:"What setting do you want to use for Vercel Authentication?",default:DEFAULT_VERCEL_AUTH_SETTING,choices:[{description:"Standard Protection (recommended)",name:"standard",value:"standard"},{description:"No Protection (all deployments will be public)",name:"none",value:"none"}]};async function vercelAuth(client,{autoConfirm=!1}){return autoConfirm||await client.input.confirm(`Want to use the default Deployment Protection settings? ${import_chalk4.default.dim("(Vercel Authentication: Standard Protection)")}`,!0)?DEFAULT_VERCEL_AUTH_SETTING:await client.input.select(OPTIONS)}var import_build_utils3=__toESM(require_build_utils(),1),import_fs_detectors=__toESM(require_dist(),1),import_service_topology=__toESM(require_dist2(),1);import{join,relative}from"path";var import_frameworks2=__toESM(require_frameworks(),1),import_build_utils2=__toESM(require_build_utils(),1);var chalk5=require_source(),frameworksBySlug=new Map(import_frameworks2.frameworkList.map(f=>[f.slug,f])),frameworkColors={nextjs:chalk5.white,vite:chalk5.magenta,nuxtjs:chalk5.green,remix:chalk5.cyan,astro:chalk5.magenta,gatsby:chalk5.magenta,svelte:chalk5.red,sveltekit:chalk5.red,solidstart:chalk5.blue,angular:chalk5.red,vue:chalk5.green,ember:chalk5.red,preact:chalk5.magenta,fastapi:chalk5.green,flask:chalk5.cyan,express:chalk5.yellow,nest:chalk5.red,hono:chalk5.yellowBright},runtimeColors={node:chalk5.green,python:chalk5.blue,go:chalk5.cyan,ruby:chalk5.red,rust:chalk5.yellowBright};function getFrameworkName(slug){if(slug)return frameworksBySlug.get(slug)?.name}function formatRoutePrefix(routePrefix){return routePrefix==="/"?"/":`${routePrefix.startsWith("/")?routePrefix:`/${routePrefix}`}/*`}var jobTriggerLabels={queue:"Job/Queue",schedule:"Job/Schedule",workflow:"Job/Workflow"};function getServiceDescriptionInfo(service){if(service.type==="worker"||service.type==="job"||service.type==="cron"){let typeLabel=service.type==="worker"?"Worker":jobTriggerLabels[service.trigger??""]??"Job",typeColorFn=service.type==="worker"?chalk5.magenta:chalk5.cyan;if(service.runtime){let runtimeName=service.runtime.charAt(0).toUpperCase()+service.runtime.slice(1),runtimeColorFn=runtimeColors[service.runtime]||chalk5.yellow;return{label:`${typeLabel}${chalk5.white("/")}${runtimeColorFn(runtimeName)}`,colorFn:typeColorFn}}return{label:typeLabel,colorFn:typeColorFn}}return getFrameworkRuntimeBuilderInfo(service)}function getFrameworkRuntimeBuilderInfo(service){let frameworkName=getFrameworkName(service.framework);if(frameworkName&&service.framework){let colorFn=frameworkColors[service.framework]||chalk5.cyan;return{label:frameworkName,colorFn}}else if(service.runtime){let normalizedRuntime=service.runtime.toLowerCase().replace(/@.*$/,""),colorFn=runtimeColors[normalizedRuntime]||chalk5.yellow;return{label:service.runtime,colorFn}}else if(service.builder?.use)return{label:service.builder.use,colorFn:chalk5.magenta};return{label:"unknown",colorFn:chalk5.dim}}function getServiceTarget(service){return(0,import_build_utils2.isScheduleTriggeredService)(service)?`schedule: ${service.schedule??"none"}`:(0,import_build_utils2.isQueueTriggeredService)(service)?`topics: ${(0,import_build_utils2.getServiceQueueTopics)(service).join(", ")}`:(0,import_build_utils2.isWorkflowTriggeredService)(service)?"workflow":service.routePrefix?formatRoutePrefix(service.routePrefix):"no route"}function displayDetectedServices(services){output_manager_default.print(`Detected services:
|
|
16
|
-
`);let rows=services.some(import_build_utils2.isExperimentalServiceV2)?buildServiceRowsV2(services.filter(import_build_utils2.isExperimentalServiceV2)):buildServiceRowsV1(services),tableOutput=table(rows,{align:["l","l","l","l"],hsep:2});output_manager_default.print(`${tableOutput}
|
|
17
|
-
`)}function
|
|
18
|
-
${chalk5.dim(
|
|
19
|
-
`)}function
|
|
15
|
+
`)}if(autoConfirm||!await client.input.confirm("Customize settings?",!1))return settings;let choices=settingKeys.reduce((acc,setting)=>setting==="framework"||setting==="commandForIgnoringBuildStep"||setting==="installCommand"||localConfigurationOverrides?.[setting]?acc:[...acc,{name:settingMap[setting],value:setting}],[]),settingFields=await client.input.checkbox({message:"Which settings would you like to overwrite (select multiple)?",choices});for(let setting of settingFields){let field=settingMap[setting];settings[setting]=await client.input.text({message:`${import_chalk3.default.bold(field)}?`})}return settings}async function readConfig(dir){let pkgFilePath;try{pkgFilePath=(await compileVercelConfig(dir)).configPath||getLocalPathConfig(dir)}catch(err){if(err instanceof Error)return err;throw err}let result=await readJSONFile(pkgFilePath);return result instanceof CantParseJSONFile||result?result:null}var import_frameworks3=__toESM(require_frameworks(),1);var import_chalk4=__toESM(require_source(),1),DEFAULT_VERCEL_AUTH_SETTING="standard",OPTIONS={message:"What setting do you want to use for Vercel Authentication?",default:DEFAULT_VERCEL_AUTH_SETTING,choices:[{description:"Standard Protection (recommended)",name:"standard",value:"standard"},{description:"No Protection (all deployments will be public)",name:"none",value:"none"}]};async function vercelAuth(client,{autoConfirm=!1}){return autoConfirm||await client.input.confirm(`Want to use the default Deployment Protection settings? ${import_chalk4.default.dim("(Vercel Authentication: Standard Protection)")}`,!0)?DEFAULT_VERCEL_AUTH_SETTING:await client.input.select(OPTIONS)}var import_build_utils3=__toESM(require_build_utils(),1),import_fs_detectors=__toESM(require_dist(),1),import_service_topology=__toESM(require_dist2(),1);import{join,relative}from"path";var import_frameworks2=__toESM(require_frameworks(),1),import_build_utils2=__toESM(require_build_utils(),1);var chalk5=require_source(),frameworksBySlug=new Map(import_frameworks2.frameworkList.map(f=>[f.slug,f])),frameworkColors={nextjs:chalk5.white,vite:chalk5.magenta,nuxtjs:chalk5.green,remix:chalk5.cyan,astro:chalk5.magenta,gatsby:chalk5.magenta,svelte:chalk5.red,sveltekit:chalk5.red,solidstart:chalk5.blue,angular:chalk5.red,vue:chalk5.green,ember:chalk5.red,preact:chalk5.magenta,fastapi:chalk5.green,flask:chalk5.cyan,express:chalk5.yellow,nest:chalk5.red,hono:chalk5.yellowBright},runtimeColors={node:chalk5.green,python:chalk5.blue,go:chalk5.cyan,ruby:chalk5.red,rust:chalk5.yellowBright};function getFrameworkName(slug){if(slug)return frameworksBySlug.get(slug)?.name}function formatRoutePrefix(routePrefix){return routePrefix==="/"?"/":`${routePrefix.startsWith("/")?routePrefix:`/${routePrefix}`}/*`}var jobTriggerLabels={queue:"Job/Queue",schedule:"Job/Schedule",workflow:"Job/Workflow"};function getServiceDescriptionInfo(service){if(service.type==="worker"||service.type==="job"||service.type==="cron"){let typeLabel=service.type==="worker"?"Worker":jobTriggerLabels[service.trigger??""]??"Job",typeColorFn=service.type==="worker"?chalk5.magenta:chalk5.cyan;if(service.runtime){let runtimeName=service.runtime.charAt(0).toUpperCase()+service.runtime.slice(1),runtimeColorFn=runtimeColors[service.runtime]||chalk5.yellow;return{label:`${typeLabel}${chalk5.white("/")}${runtimeColorFn(runtimeName)}`,colorFn:typeColorFn}}return{label:typeLabel,colorFn:typeColorFn}}return getFrameworkRuntimeBuilderInfo(service)}function getFrameworkRuntimeBuilderInfo(service){let frameworkName=getFrameworkName(service.framework);if(frameworkName&&service.framework){let colorFn=frameworkColors[service.framework]||chalk5.cyan;return{label:frameworkName,colorFn}}else if(service.runtime){let normalizedRuntime=service.runtime.toLowerCase().replace(/@.*$/,""),colorFn=runtimeColors[normalizedRuntime]||chalk5.yellow;return{label:service.runtime,colorFn}}else if(service.builder?.use)return{label:service.builder.use,colorFn:chalk5.magenta};return{label:"unknown",colorFn:chalk5.dim}}function getServiceTarget(service){return(0,import_build_utils2.isScheduleTriggeredService)(service)?`schedule: ${service.schedule??"none"}`:(0,import_build_utils2.isQueueTriggeredService)(service)?`topics: ${(0,import_build_utils2.getServiceQueueTopics)(service).join(", ")}`:(0,import_build_utils2.isWorkflowTriggeredService)(service)?"workflow":service.routePrefix?formatRoutePrefix(service.routePrefix):"no route"}function displayDetectedServices(services,nameWidth=0){output_manager_default.print(`Detected services:
|
|
16
|
+
`);let rows=services.some(import_build_utils2.isExperimentalServiceV2)?buildServiceRowsV2(services.filter(import_build_utils2.isExperimentalServiceV2),nameWidth):buildServiceRowsV1(services,nameWidth),tableOutput=table(rows,{align:["l","l","l","l"],hsep:2});output_manager_default.print(`${tableOutput}
|
|
17
|
+
`)}function displayDetectedDaemons(daemons,nameWidth=0){output_manager_default.print(`Detected daemons:
|
|
18
|
+
`);let rows=daemons.map(daemon=>[formatName(daemon.name,nameWidth),daemon.entrypoint?chalk5.blue(`[${daemon.entrypoint}]`):chalk5.dim("[unknown]")]),tableOutput=table(rows,{align:["l","l"],hsep:2});output_manager_default.print(`${tableOutput}
|
|
19
|
+
`)}function formatName(name,nameWidth=0){return`\u2022 ${name}`.padEnd(nameWidth)}function getNameColumnWidth(names){return Math.max(0,...names.map(name=>formatName(name).length))}function buildServiceRowsV1(services,nameWidth){let outputOrder={web:0,cron:1,job:1,worker:2};return[...services].sort((a,b)=>(outputOrder[a.type]??3)-(outputOrder[b.type]??3)).map(service=>{let descInfo=getServiceDescriptionInfo(service),target=getServiceTarget(service);return[formatName(service.name,nameWidth),descInfo.colorFn(`[${descInfo.label}]`),chalk5.dim("\u2192"),target]})}function buildServiceRowsV2(services,nameWidth){return services.map(service=>{let descInfo=getFrameworkRuntimeBuilderInfo(service);return[formatName(service.name,nameWidth),descInfo.colorFn(`[${descInfo.label}]`)]})}function displayServicesConfigNote(configFileName="vercel.json",hasDaemons=!1){let subject=hasDaemons?"Services and daemons":"Services";output_manager_default.print(`
|
|
20
|
+
${chalk5.dim(`${subject} are configured via ${configFileName}.`)}
|
|
21
|
+
`)}function displayServiceErrors(errors){for(let error of errors)output_manager_default.warn(error.message)}var SERVICES_DOCS_URL="https://vercel.com/docs/services",INFERRED_SERVICES_PROMPT="Multiple services were detected. How would you like to set up this project?";async function getServicesSetupState(workPath){let fs=new import_fs_detectors.LocalFileSystemDetector(workPath),detectServicesResult=await(0,import_service_topology.detectServices)({fs,detectEntrypoint:createDetectEntrypoint(workPath)}),hasConfiguredServices=detectServicesResult.resolved?.source==="configured",inferredServices=hasConfiguredServices?null:detectServicesResult.inferred,inferredServicesWriteBlocker=inferredServices?await getServicesConfigWriteBlocker(workPath,inferredServices.config):null,daemons=hasConfiguredServices?await(0,import_service_topology.detectDaemons)({fs}):[];return{detectServicesResult,hasConfiguredServices,daemons,inferredServices,inferredServicesWriteBlocker}}function displayConfiguredServicesSetup({detectServicesResult,daemons},configFileName="vercel.json"){let{services}=detectServicesResult,nameWidth=getNameColumnWidth([...services,...daemons].map(({name})=>name));services.length>0&&displayDetectedServices(services,nameWidth),daemons.length>0&&(services.length>0&&output_manager_default.print(`
|
|
22
|
+
`),displayDetectedDaemons(daemons,nameWidth)),detectServicesResult.errors.length>0&&displayServiceErrors(detectServicesResult.errors),displayServicesConfigNote(configFileName,daemons.length>0)}function formatDetectedServicesSummary(services){if(services.length===0)return"";if(services.length===1)return`"${services[0].name}"`;if(services.length===2)return`"${services[0].name}" + "${services[1].name}"`;let othersCount=services.length-2;return`"${services[0].name}" + "${services[1].name}" + ${othersCount} ${othersCount===1?"other":"others"}`}function toProjectRootDirectory(projectPath,selectedPath){let rootDirectory=(0,import_build_utils3.normalizePath)(relative(projectPath,selectedPath));return rootDirectory===""?null:rootDirectory}async function promptForInferredServicesSetup({client,autoConfirm,nonInteractive,workPath,inferred,inferredWriteBlocker,allowChooseDifferentProjectDirectory=!1}){if(!inferred)return null;if(inferredWriteBlocker)return output_manager_default.warn(`Multiple services were detected, but your existing project config uses \`${inferredWriteBlocker}\`. To deploy multiple services in one project, see ${output_manager_default.link("Services",SERVICES_DOCS_URL)}.`),null;displayDetectedServices(inferred.services);let choice=null;if(autoConfirm)choice={type:"services"};else if(!nonInteractive){let webServices=inferred.services.filter(service=>(0,import_build_utils3.isExperimentalService)(service)?service.type==="web":!0),choices=[{name:`Set up project with all detected services: ${formatDetectedServicesSummary(inferred.services)}`,value:"services"},...webServices.map((service,index)=>({name:`Set up project with "${service.name}"`,value:`single-app:${index}`})),...allowChooseDifferentProjectDirectory?[{name:"Choose a different root directory",value:"project-directory"}]:[]],selected=await client.input.select({message:INFERRED_SERVICES_PROMPT,choices});if(selected==="services")choice={type:"services"};else if(selected==="project-directory")choice={type:"project-directory"};else if(typeof selected=="string"&&selected.startsWith("single-app:")){let index=Number.parseInt(selected.slice(11),10),service=webServices[index];if(service){let serviceRoot=(0,import_build_utils3.isExperimentalServiceV2)(service)?service.root:service.workspace;choice={type:"single-app",selectedPath:serviceRoot==="."?workPath:join(workPath,serviceRoot)}}}}if(choice?.type!=="services")return choice;let{configFileName}=await writeServicesConfig(workPath,inferred.config);return output_manager_default.print(` Added services configuration to ${configFileName}.
|
|
20
23
|
`),{type:"services"}}var import_slugify2=__toESM(require_slugify(),1);import{join as join2,relative as relative2}from"path";async function searchProjectsByRepoRoot({client,cwd,gitProjectName,orgs,remoteName}){let empty={matches:[],remoteNames:[]},rootPath=await findRepoRoot(cwd);if(!rootPath)return empty;let gitConfigPath=getGitConfigPath({cwd:rootPath})??join2(rootPath,".git/config"),remoteUrls=await getRemoteUrls(gitConfigPath),remoteNames=remoteUrls?Object.keys(remoteUrls).sort():[],remote;try{remote=await resolveGitRemote(client,rootPath,{yes:!0,existingRemoteName:remoteName})}catch(error){if(isPromptCanceledError(error))throw error;return output_manager_default.debug(`Failed to resolve Git remote for project search: ${error}`),{matches:[],remoteNames}}if(!remote)return{matches:[],remoteNames};let relativePath=relative2(rootPath,cwd);return{matches:(await Promise.all(orgs.map(async org=>{try{let projects=await fetchProjectsForRepoUrl(client,remote.repoUrl,org.id),repoProjectConfigs=projects.filter(project=>!gitProjectName||project.id===gitProjectName||project.name===gitProjectName).map(project=>({id:project.id,name:project.name,directory:project.rootDirectory||".",orgId:org.id}));return findProjectsFromPath(repoProjectConfigs,relativePath).map(match=>{let project=projects.find(p=>p.id===match.id);return project?{project,org,reason:"repo-root",repo:{...remote,directory:match.directory}}:null}).filter(Boolean)}catch(error){if(isPromptCanceledError(error))throw error;return output_manager_default.debug(`Failed to search Git-linked projects under ${org.slug}: ${error}`),[]}}))).flat(),remote,remoteNames}}function isCrossTeamMatch(value){return typeof value=="object"&&value!==null&&"project"in value&&"org"in value&&"reason"in value}async function selectOrgForLink(client,autoConfirm,searchable=!1,meta){try{return await selectOrg(client,"Which team?",autoConfirm,searchable,meta)}catch(err){if(isAPIError(err)){if(err.code==="NOT_AUTHORIZED")return output_manager_default.prettyError(err),{status:"error",exitCode:1,reason:"NOT_AUTHORIZED"};if(err.code==="TEAM_DELETED")return output_manager_default.prettyError(err),{status:"error",exitCode:1,reason:"TEAM_DELETED"}}throw err}}function isErrnoException(err){return err instanceof Error&&typeof err.code=="string"}async function hasWorkspaces(cwd){try{let fs=new import_fs_detectors2.LocalFileSystemDetector(cwd);return(await(0,import_fs_detectors2.getWorkspaces)({fs})).length>0}catch(err){if(isErrnoException(err)&&err.code&&["ENOENT","EACCES","ENOTDIR"].includes(err.code))return output_manager_default.debug(`getWorkspaces failed for ${cwd}: ${err}`),!1;throw err}}async function shouldPromptForRootDirectory(opts){if(opts.servicesChoice?.type==="project-directory"||await hasWorkspaces(opts.path))return!0;try{return((await detectProjects(opts.path)).get("")??[]).length===0}catch(err){return output_manager_default.debug(`detectProjects failed at root: ${err}`),!0}}async function maybePullEnvAfterLink(client,path2,autoConfirm,pullEnv){if(!pullEnv||!client.stdin.isTTY||client.nonInteractive||(output_manager_default.print(`
|
|
21
24
|
`),!(autoConfirm||await client.input.confirm("Pull development environment variables into .env.local?",!0))))return;let originalCwd=client.cwd;try{client.cwd=path2,await pull(client,autoConfirm?["--yes"]:[],"vercel-cli:link")!==0&&output_manager_default.error("Failed to pull environment variables. You can run `vc env pull` manually.")}catch{output_manager_default.error("Failed to pull environment variables. You can run `vc env pull` manually.")}finally{client.cwd=originalCwd}}async function linkCrossTeamMatch({client,path:path2,match,successEmoji,autoConfirm,pullEnv}){return client.config.currentTeam=match.org.type==="team"?match.org.id:void 0,match.reason==="repo-root"&&match.repo?(await linkRepoProject(client,path2,{project:match.project,orgId:match.org.id,orgSlug:match.org.slug,remoteName:match.repo.remoteName,successEmoji}),await maybePullEnvAfterLink(client,path2,autoConfirm,pullEnv),{status:"linked",org:match.org,project:match.project,repoRoot:match.repo.rootPath}):(await linkFolderToProject(client,path2,{projectId:match.project.id,orgId:match.org.id},match.project.name,match.org.slug,successEmoji,autoConfirm,pullEnv),{status:"linked",org:match.org,project:match.project})}async function setupAndLink(client,path2,{autoConfirm=!1,forceDelete=!1,link,selectedOrg,successEmoji="link",projectName,singleFile,nonInteractive=!1,pullEnv=!0,v0}){let{config}=client,gitProjectName=projectName;if(projectName=projectName??(singleFile?(0,import_slugify3.default)(basename(singleFile,extname(singleFile)))||"file":basename(path2)),!isDirectory(path2))return output_manager_default.error(`Expected directory but found file: ${path2}`),{status:"error",exitCode:1,reason:"PATH_IS_FILE"};link||(link=await getLinkedProject(client,{cwd:path2,skipProjectRootResolution:!!singleFile}));let isTTY=client.stdin.isTTY,rootDirectory=null,newProjectName,org=selectedOrg;if(!forceDelete&&link.status==="linked")return link;if((0,import_build_utils4.getPlatformEnv)("ORG_ID")&&(0,import_build_utils4.getPlatformEnv)("PROJECT_ID")){let envLink=await getLinkedProject(client,{cwd:path2,skipProjectRootResolution:!!singleFile});if(envLink.status==="error")return envLink;if(envLink.status==="linked")return config.currentTeam=envLink.org.type==="team"?envLink.org.id:void 0,output_manager_default.print(`
|
|
22
25
|
`),printAlignedLabel(singleFile?"File":"Directory",humanizePath(singleFile??path2)),printAlignedLabel("Source","VERCEL_ORG_ID and VERCEL_PROJECT_ID"),output_manager_default.print(`
|
|
23
26
|
`),printAlignedLabel("Linked",`${envLink.org.slug}/${envLink.project.name}`,{gutter:"\u2713"}),envLink}if(!isTTY&&!autoConfirm&&!nonInteractive)return{status:"error",exitCode:1,reason:"HEADLESS"};if(!org&&(nonInteractive||!isTTY)){let resolved=await selectOrgForLink(client,autoConfirm);if("status"in resolved)return resolved;org=resolved}if(forceDelete){let vercelDir=getVercelDirectory(path2);(0,import_fs_extra.remove)(join3(vercelDir,VERCEL_DIR_README)),(0,import_fs_extra.remove)(join3(vercelDir,VERCEL_DIR_PROJECT))}output_manager_default.print(`
|
|
24
27
|
`),printAlignedLabel(singleFile?"File":"Directory",humanizePath(singleFile??path2)),output_manager_default.print(`
|
|
25
|
-
`);let interactive=isTTY&&!nonInteractive,searchableTeamPicker=interactive,showProjectSuggestions=interactive&&!gitProjectName&&!singleFile,projectOrNewProjectName,teamAutoSelected=!1,selectedGitRemoteName;for(;;){if(!org){let orgMeta={},resolved=await selectOrgForLink(client,autoConfirm,searchableTeamPicker,orgMeta);if("status"in resolved)return resolved;org=resolved,teamAutoSelected=orgMeta.choiceCount===1}let repoMatches=[],gitRemoteNames=[],currentGitRemoteName;if(showProjectSuggestions){output_manager_default.spinner("Searching for existing projects\u2026",1e3);try{let repoSearch=await searchProjectsByRepoRoot({client,cwd:path2,gitProjectName,orgs:[org],remoteName:selectedGitRemoteName});repoMatches=repoSearch.matches,gitRemoteNames=repoSearch.remoteNames,currentGitRemoteName=repoSearch.remote?.remoteName}catch(err){if(isPromptCanceledError(err))throw err;output_manager_default.debug(`Git-linked project search failed: ${err}`)}finally{output_manager_default.stopSpinner()}}try{projectOrNewProjectName=await inputProject(client,org,projectName,autoConfirm,!1,showProjectSuggestions,searchableTeamPicker&&!selectedOrg&&!teamAutoSelected,repoMatches,{remoteNames:gitRemoteNames,currentRemoteName:currentGitRemoteName})}catch(err){if(err instanceof Error&&err.code==="HEADLESS")return{status:"error",exitCode:1,reason:"HEADLESS"};throw err}if(projectOrNewProjectName===BACK_TO_TEAM_SELECTION){org=void 0,selectedGitRemoteName=void 0;continue}if(projectOrNewProjectName===SWITCH_GIT_REMOTE){let rootPath=await findRepoRoot(path2);if(!rootPath)continue;try{selectedGitRemoteName=(await resolveGitRemote(client,rootPath,{yes:!1}))?.remoteName}catch(err){if(isPromptCanceledError(err))throw err;output_manager_default.debug(`Failed to switch Git remote: ${err}`)}continue}break}if(typeof projectOrNewProjectName=="string")newProjectName=projectOrNewProjectName;else{if(isCrossTeamMatch(projectOrNewProjectName))return await linkCrossTeamMatch({client,path:path2,match:projectOrNewProjectName,successEmoji,autoConfirm,pullEnv});{let project=projectOrNewProjectName;return await linkFolderToProject(client,path2,{projectId:project.id,orgId:org.id},project.name,org.slug,successEmoji,autoConfirm,pullEnv),{status:"linked",org,project}}}config.currentTeam=org.type==="team"?org.id:void 0;let gitConnectIntent=singleFile?null:await resolveGitConnectIntent(client,path2,autoConfirm),rootServicesSetup=singleFile?null:await getServicesSetupState(path2),configFileName=(singleFile?void 0:await findSourceVercelConfigFile(path2))??"vercel.json";try{let settings={},pathWithRootDirectory=path2,rootInferredServicesChoice=null;if(rootServicesSetup&&!rootServicesSetup.hasConfiguredServices&&(rootInferredServicesChoice=await promptForInferredServicesSetup({client,autoConfirm,nonInteractive,workPath:path2,inferred:rootServicesSetup.inferredServices,inferredWriteBlocker:rootServicesSetup.inferredServicesWriteBlocker,allowChooseDifferentProjectDirectory:!0})),singleFile)settings={...singleFileProjectSettings};else if(rootServicesSetup?.hasConfiguredServices)displayConfiguredServicesSetup(rootServicesSetup
|
|
28
|
+
`);let interactive=isTTY&&!nonInteractive,searchableTeamPicker=interactive,showProjectSuggestions=interactive&&!gitProjectName&&!singleFile,projectOrNewProjectName,teamAutoSelected=!1,selectedGitRemoteName;for(;;){if(!org){let orgMeta={},resolved=await selectOrgForLink(client,autoConfirm,searchableTeamPicker,orgMeta);if("status"in resolved)return resolved;org=resolved,teamAutoSelected=orgMeta.choiceCount===1}let repoMatches=[],gitRemoteNames=[],currentGitRemoteName;if(showProjectSuggestions){output_manager_default.spinner("Searching for existing projects\u2026",1e3);try{let repoSearch=await searchProjectsByRepoRoot({client,cwd:path2,gitProjectName,orgs:[org],remoteName:selectedGitRemoteName});repoMatches=repoSearch.matches,gitRemoteNames=repoSearch.remoteNames,currentGitRemoteName=repoSearch.remote?.remoteName}catch(err){if(isPromptCanceledError(err))throw err;output_manager_default.debug(`Git-linked project search failed: ${err}`)}finally{output_manager_default.stopSpinner()}}try{projectOrNewProjectName=await inputProject(client,org,projectName,autoConfirm,!1,showProjectSuggestions,searchableTeamPicker&&!selectedOrg&&!teamAutoSelected,repoMatches,{remoteNames:gitRemoteNames,currentRemoteName:currentGitRemoteName})}catch(err){if(err instanceof Error&&err.code==="HEADLESS")return{status:"error",exitCode:1,reason:"HEADLESS"};throw err}if(projectOrNewProjectName===BACK_TO_TEAM_SELECTION){org=void 0,selectedGitRemoteName=void 0;continue}if(projectOrNewProjectName===SWITCH_GIT_REMOTE){let rootPath=await findRepoRoot(path2);if(!rootPath)continue;try{selectedGitRemoteName=(await resolveGitRemote(client,rootPath,{yes:!1}))?.remoteName}catch(err){if(isPromptCanceledError(err))throw err;output_manager_default.debug(`Failed to switch Git remote: ${err}`)}continue}break}if(typeof projectOrNewProjectName=="string")newProjectName=projectOrNewProjectName;else{if(isCrossTeamMatch(projectOrNewProjectName))return await linkCrossTeamMatch({client,path:path2,match:projectOrNewProjectName,successEmoji,autoConfirm,pullEnv});{let project=projectOrNewProjectName;return await linkFolderToProject(client,path2,{projectId:project.id,orgId:org.id},project.name,org.slug,successEmoji,autoConfirm,pullEnv),{status:"linked",org,project}}}config.currentTeam=org.type==="team"?org.id:void 0;let gitConnectIntent=singleFile?null:await resolveGitConnectIntent(client,path2,autoConfirm),rootServicesSetup=singleFile?null:await getServicesSetupState(path2),configFileName=(singleFile?void 0:await findSourceVercelConfigFile(path2))??"vercel.json";try{let settings={},pathWithRootDirectory=path2,rootInferredServicesChoice=null;if(rootServicesSetup&&!rootServicesSetup.hasConfiguredServices&&(rootInferredServicesChoice=await promptForInferredServicesSetup({client,autoConfirm,nonInteractive,workPath:path2,inferred:rootServicesSetup.inferredServices,inferredWriteBlocker:rootServicesSetup.inferredServicesWriteBlocker,allowChooseDifferentProjectDirectory:!0})),singleFile)settings={...singleFileProjectSettings};else if(rootServicesSetup?.hasConfiguredServices)displayConfiguredServicesSetup(rootServicesSetup,configFileName),settings.framework="services";else if(rootInferredServicesChoice?.type==="services")settings.framework="services";else{let skipSelectedRootInferredServicesPrompt=rootInferredServicesChoice?.type==="single-app";if(rootInferredServicesChoice?.type==="single-app")rootDirectory=toProjectRootDirectory(path2,rootInferredServicesChoice.selectedPath);else if(await shouldPromptForRootDirectory({path:path2,servicesChoice:rootInferredServicesChoice})&&(rootDirectory=await inputRootDirectory(client,path2,autoConfirm),rootDirectory&&!await validateRootDirectory(path2,join3(path2,rootDirectory))))return{status:"error",exitCode:1,reason:"INVALID_ROOT_DIRECTORY"};pathWithRootDirectory=rootDirectory?join3(path2,rootDirectory):path2;let selectedRootServicesSetup=pathWithRootDirectory===path2?null:await getServicesSetupState(pathWithRootDirectory),selectedRootInferredServicesChoice=null;if(skipSelectedRootInferredServicesPrompt||(selectedRootInferredServicesChoice=await promptForInferredServicesSetup({client,autoConfirm,nonInteractive,workPath:pathWithRootDirectory,inferred:selectedRootServicesSetup?.inferredServices??null,inferredWriteBlocker:selectedRootServicesSetup?.inferredServicesWriteBlocker??null})),selectedRootServicesSetup?.hasConfiguredServices)displayConfiguredServicesSetup(selectedRootServicesSetup,configFileName),settings.framework="services";else if(selectedRootInferredServicesChoice?.type==="services")settings.framework="services";else{selectedRootInferredServicesChoice?.type==="single-app"&&(rootDirectory=toProjectRootDirectory(path2,selectedRootInferredServicesChoice.selectedPath),pathWithRootDirectory=rootDirectory?join3(path2,rootDirectory):path2);let localConfig=await readConfig(pathWithRootDirectory);if(localConfig instanceof CantParseJSONFile)return output_manager_default.prettyError(localConfig),{status:"error",exitCode:1};if(!localConfig||!localConfig.builds||localConfig.builds.length===0){let localConfigurationOverrides={buildCommand:localConfig?.buildCommand,devCommand:localConfig?.devCommand,framework:localConfig?.framework,commandForIgnoringBuildStep:localConfig?.ignoreCommand,installCommand:localConfig?.installCommand,outputDirectory:localConfig?.outputDirectory},framework=((await detectProjects(pathWithRootDirectory)).get("")||[])[0]??import_frameworks3.frameworkList.find(f=>f.slug===null);settings=await editProjectSettings(client,{},framework,autoConfirm,localConfigurationOverrides,configFileName)}}}let changeAdditionalSettings=!1,vercelAuthSetting=DEFAULT_VERCEL_AUTH_SETTING;changeAdditionalSettings&&(vercelAuthSetting=await vercelAuth(client,{autoConfirm})),rootDirectory&&(settings.rootDirectory=rootDirectory);let project=await createProject(client,{...settings,name:newProjectName,vercelAuth:vercelAuthSetting,v0});return await linkFolderToProject(client,path2,{projectId:project.id,orgId:org.id},project.name,org.slug,successEmoji,autoConfirm,!1,"Created"),await applyGitConnectIntent(client,gitConnectIntent,project,autoConfirm,org),{status:"linked",org,project,...gitConnectIntent?.offered&&{gitConnectOffered:!0}}}catch(err){if(isPromptCanceledError(err))throw err;return isAPIError(err)&&err.code==="too_many_projects"?(output_manager_default.prettyError(err),{status:"error",exitCode:1,reason:"TOO_MANY_PROJECTS"}):err instanceof Error&&err.code==="HEADLESS"?{status:"error",exitCode:1,reason:"HEADLESS"}:(printError(err),{status:"error",exitCode:1})}}async function resolveGitConnectIntent(client,path2,autoConfirm){try{let gitConfigPath=getGitConfigPath({cwd:path2})??join3(path2,".git/config"),gitConfig=await parseGitConfig(gitConfigPath);if(!gitConfig)return null;let remoteUrls=pluckRemoteUrls(gitConfig);if(!remoteUrls||Object.keys(remoteUrls).length===0)return null;let skipPrompts=autoConfirm||client.nonInteractive;if(!(skipPrompts||await client.input.confirm("Connect this Git repository to automatically deploy changes on every push?",!1)))return{offered:!0};let repoInfo=skipPrompts?parseRepoUrl(remoteUrls.origin??Object.values(remoteUrls)[0]):await selectAndParseRemoteUrl(client,remoteUrls);return repoInfo?{repoInfo,offered:!skipPrompts}:null}catch(error){if(isPromptCanceledError(error))throw error;return output_manager_default.debug(`Failed to detect git repository: ${error}`),null}}async function applyGitConnectIntent(client,intent,project,autoConfirm,org){if(!intent?.repoInfo)return;let{repoInfo}=intent;try{await checkExistsAndConnect({client,confirm:autoConfirm,gitProviderLink:project.link,org,gitOrg:repoInfo.org,project,provider:repoInfo.provider,repo:repoInfo.repo,repoPath:`${repoInfo.org}/${repoInfo.repo}`})}catch(error){if(isPromptCanceledError(error))return;output_manager_default.debug(`Failed to connect git repository: ${error}`)}}async function connectGitRepository(client,path2,project,autoConfirm,org){let intent;try{intent=await resolveGitConnectIntent(client,path2,autoConfirm)}catch(error){if(isPromptCanceledError(error))return;throw error}await applyGitConnectIntent(client,intent,project,autoConfirm,org)}export{readConfig,displayDetectedServices,shouldPromptForRootDirectory,setupAndLink,resolveGitConnectIntent,applyGitConnectIntent,connectGitRepository};
|
|
@@ -4,4 +4,4 @@ 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{VERCEL_DIR,VERCEL_DIR_PROJECT,require_lib}from"./chunk-
|
|
7
|
+
import{VERCEL_DIR,VERCEL_DIR_PROJECT,require_lib}from"./chunk-LG5FP6PL.js";import{require_dist}from"./chunk-RM3ZDRYE.js";import{__toESM}from"./chunk-BZENIQ7N.js";var import_fs_extra=__toESM(require_lib(),1);import{join}from"path";var import_error_utils=__toESM(require_dist(),1);async function writeProjectSettings(cwd,project,org,isRepoLinked){let analyticsId;project.analytics?.id&&(!project.analytics.disabledAt||project.analytics.enabledAt&&project.analytics.enabledAt>project.analytics.disabledAt)&&(analyticsId=project.analytics.id);let projectLinkAndSettings={projectId:isRepoLinked?void 0:project.id,orgId:isRepoLinked?void 0:org.id,projectName:isRepoLinked?void 0:project.name,settings:{createdAt:project.createdAt,framework:project.framework,devCommand:project.devCommand,installCommand:project.installCommand,buildCommand:project.buildCommand,outputDirectory:project.outputDirectory,rootDirectory:project.rootDirectory,directoryListing:project.directoryListing,nodeVersion:project.nodeVersion,analyticsId}},path=join(cwd,VERCEL_DIR,VERCEL_DIR_PROJECT);return await(0,import_fs_extra.outputJSON)(path,projectLinkAndSettings,{spaces:2})}async function readProjectSettings(vercelDir){try{return JSON.parse(await(0,import_fs_extra.readFile)(join(vercelDir,VERCEL_DIR_PROJECT),"utf8"))}catch(err){if((0,import_error_utils.isErrnoException)(err)&&err.code&&["ENOENT","ENOTDIR"].includes(err.code)||(0,import_error_utils.isError)(err)&&err.name==="SyntaxError")return null;throw err}}function pickOverrides(vercelConfig){let overrides={};for(let prop of["buildCommand","devCommand","framework","ignoreCommand","installCommand","outputDirectory"])typeof vercelConfig[prop]<"u"&&(prop==="ignoreCommand"?overrides.commandForIgnoringBuildStep=vercelConfig[prop]:overrides[prop]=vercelConfig[prop]);return overrides}export{writeProjectSettings,readProjectSettings,pickOverrides};
|
|
@@ -4,6 +4,6 @@ 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{readJSONFile}from"./chunk-
|
|
7
|
+
import{readJSONFile}from"./chunk-COGMOZTL.js";import{getScope,writeToConfigFile}from"./chunk-TWRV6QGX.js";import{require_types}from"./chunk-ZS2WS4AM.js";import{getArgs}from"./chunk-R4VVQRLX.js";import{humanizePath}from"./chunk-PPCFQQSU.js";import{CantFindConfig,CantParseJSONFile,DeprecatedNowJson,WorkingDirectoryDoesNotExist}from"./chunk-YIIPBH2D.js";import{cliErrorFromUnknown,output_manager_default,recordCliError}from"./chunk-75IAMKGV.js";import{require_dist}from"./chunk-RM3ZDRYE.js";import{__commonJS,__toESM}from"./chunk-BZENIQ7N.js";var require_epipebomb=__commonJS({"../../node_modules/.pnpm/epipebomb@1.0.0/node_modules/epipebomb/epipebomb.js"(exports,module){module.exports=epipeBomb;function epipeBomb(stream,callback){stream==null&&(stream=process.stdout),callback==null&&(callback=process.exit);function epipeFilter(err){if(err.code==="EPIPE")return callback();stream.listeners("error").length<=1&&(stream.removeAllListeners(),stream.emit("error",err),stream.on("error",epipeFilter))}stream.on("error",epipeFilter)}}});var sentry;async function getSentry(){if(!sentry){let[SentryModule,{SENTRY_DSN},{default:pkg}]=await Promise.all([import("./cjs-2SMN43VH.js"),import("./constants-JAB7MRSK.js"),import("./pkg-EDJQLCNP.js")]),Sentry="init"in SentryModule?SentryModule:SentryModule.default;Sentry.init({dsn:SENTRY_DSN,release:`vercel-cli@${pkg.version}`,environment:"stable",autoSessionTracking:!1}),sentry=Sentry}return sentry}function isOutputDebugEnabled(debugFlag){return debugFlag===!0||process.env.VERCEL_CLI_DEBUG==="1"}var import_epipebomb=__toESM(require_epipebomb(),1),SILENCED_ERRORS=["DeprecationWarning: The `punycode` module is deprecated. Please use a userland alternative instead."],installed=!1;function installProcessGuards(){if(installed)return;installed=!0;let originalError=console.error;console.error=msg=>{SILENCED_ERRORS.some(error=>typeof msg=="string"&&msg.includes(error))||originalError(msg)},(0,import_epipebomb.default)()}var import_error_utils=__toESM(require_dist(),1);async function reportError(sentry2,client,error){if(ignoreError(error))return;let user,team,scopeError;try{({user,team}=await getScope(client))}catch(err){(0,import_error_utils.isError)(err)&&(scopeError=err)}sentry2.withScope(scope=>{if(user){let spec={email:user.email,id:user.id,username:user.username,name:user.name};scope.setUser(spec)}team&&scope.setTag("currentTeam",team.id),scopeError&&scope.setExtra("scopeError",{name:scopeError.name,message:scopeError.message,stack:scopeError.stack});let args,argsError;try{args=getArgs(process.argv.slice(2),{})}catch(err){(0,import_error_utils.isError)(err)&&(argsError=err)}if(args){let flags=["--env","--build-env","--token"];for(let flag of flags)args[flag]&&(args[flag]="REDACTED");args._.length>=4&&args._[0].startsWith("secret")&&args._[1]==="add"&&(args._[3]="REDACTED"),scope.setExtra("args",args)}else{let msg="Unable to parse args";argsError&&(msg+=`: ${argsError}`),scope.setExtra("args",msg)}scope.setExtra("node",{execPath:process.execPath,version:process.version,platform:process.platform}),sentry2.captureException(error)});let sentryClient=sentry2.getCurrentHub().getClient();sentryClient&&await sentryClient.close()}function ignoreError(error){return(0,import_error_utils.isError)(error)&&error.message.includes("uv_cwd")}var fatalErrorHandlerSymbol=Symbol.for("vercel.cli.fatal-error-handler");async function exitWithUnexpectedError(error){let handler=globalThis[fatalErrorHandlerSymbol];if(typeof handler=="function")try{await handler(error)}catch{}process.exit(1)}async function handleUnexpectedError(client,err){let{message}=err;return message.includes("sentry")&&message.includes("ENOTFOUND")?(output_manager_default.debug(`Sentry is not reachable: ${err}`),!1):(output_manager_default.error(`An unexpected error occurred!
|
|
8
8
|
${err.stack}`),await reportError(await getSentry(),client,err),!0)}function registerUnexpectedErrorHandlers(getClient){process.on("unhandledRejection",async err=>{recordCliError(cliErrorFromUnknown(err)),err?err instanceof Error?await handleUnexpectedError(getClient(),err):(output_manager_default.error(`An unexpected rejection occurred
|
|
9
9
|
${err}`),await reportError(await getSentry(),getClient(),err)):output_manager_default.error("An unexpected empty rejection occurred"),await exitWithUnexpectedError(err)}),process.on("uncaughtException",async error=>{await handleUnexpectedError(getClient(),error)&&await exitWithUnexpectedError(error)})}var import_types=__toESM(require_types(),1);import path from"path";var import_error_utils2=__toESM(require_dist(),1);var config;async function earlyGetConfig(configFile){if(config)return config;let localPath;try{localPath=process.cwd()}catch(err){if((0,import_error_utils2.isErrnoException)(err)&&err.code==="ENOENT")return new WorkingDirectoryDoesNotExist;throw err}if(configFile){let localFilePath=path.resolve(localPath,configFile);output_manager_default.debug(`Found config in provided --local-config path ${localFilePath}`);let localConfig=await readJSONFile(localFilePath);return localConfig instanceof CantParseJSONFile?localConfig:localConfig===null?new CantFindConfig([humanizePath(localFilePath)]):(config=localConfig,config[import_types.fileNameSymbol]=configFile,config)}let vercelFilePath=path.resolve(localPath,"vercel.json"),nowFilePath=path.resolve(localPath,"now.json"),[vercelConfig,nowConfig]=await Promise.all([readJSONFile(vercelFilePath),readJSONFile(nowFilePath)]);return vercelConfig instanceof CantParseJSONFile?vercelConfig:nowConfig instanceof CantParseJSONFile?nowConfig:vercelConfig!==null?(output_manager_default.debug(`Found config in file "${vercelFilePath}"`),config=vercelConfig,config[import_types.fileNameSymbol]="vercel.json",config):nowConfig!==null?new DeprecatedNowJson(nowFilePath):new CantFindConfig([vercelFilePath].map(humanizePath))}var fallbackReason;function recordDirectBuildFallback(reason){fallbackReason=reason}function getDirectBuildFallbackAttributes(){return fallbackReason===void 0?void 0:{directBuild:"false",fallbackReason}}function checkTelemetryStatus({config:config2}){config2.telemetry||process.env.VERCEL_TELEMETRY_DISABLED||(output_manager_default.note("The Vercel CLI now collects telemetry regarding usage of the CLI."),output_manager_default.log("This information is used to shape the CLI roadmap and prioritize features."),output_manager_default.log("You can learn more, including how to opt-out if you'd not like to participate in this program, by visiting the following URL:"),output_manager_default.log("https://vercel.com/docs/cli/about-telemetry"),config2.telemetry={enabled:!0},writeToConfigFile(config2))}export{getSentry,isOutputDebugEnabled,installProcessGuards,reportError,exitWithUnexpectedError,handleUnexpectedError,registerUnexpectedErrorHandlers,earlyGetConfig,recordDirectBuildFallback,getDirectBuildFallbackAttributes,checkTelemetryStatus};
|
|
@@ -4,6 +4,6 @@ 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{emitAlertsScopeError,resolveAlertsScope}from"./chunk-
|
|
7
|
+
import{emitAlertsScopeError,resolveAlertsScope}from"./chunk-CDGQ3T52.js";import{getExitCodeForErrorCode,handleValidationError,validateAllProjectMutualExclusivity}from"./chunk-5UEBA6N6.js";import{isJSONObject}from"./chunk-QHKVAGWC.js";import{AGENT_REASON,buildCommandWithGlobalFlags,getExitCodeForReason,outputAgentError}from"./chunk-R5FJNGWK.js";import{getScope}from"./chunk-TWRV6QGX.js";import{getProjectByNameOrId}from"./chunk-LG5FP6PL.js";import{ProjectNotFound,isAPIError}from"./chunk-YIIPBH2D.js";import{output_manager_default}from"./chunk-75IAMKGV.js";async function resolveRulesTeam(client,jsonOutput){let{team}=await getScope(client,{resolveLocalScope:!0});return team?{teamId:team.id}:emitAlertsScopeError(client,jsonOutput,"NO_TEAM","No team context found. Run `vercel switch` to select a team, use `--scope <team>`, or link a team project.",{reason:AGENT_REASON.MISSING_SCOPE,hint:"Alert rules belong to a team. Select the team before retrying.",next:[{command:buildCommandWithGlobalFlags(client.argv,"teams switch"),when:"Select a team"},{command:buildCommandWithGlobalFlags(client.argv,"whoami"),when:"Inspect the current scope"}]})}async function resolveRulesProject(client,projectNameOrId,jsonOutput,command){let teamScope=await resolveRulesTeam(client,jsonOutput);if(typeof teamScope=="number")return teamScope;try{let project=await getProjectByNameOrId(client,projectNameOrId,teamScope.teamId);return project instanceof ProjectNotFound?emitAlertsScopeError(client,jsonOutput,"PROJECT_NOT_FOUND",`Project "${projectNameOrId}" was not found in the selected team.`,{reason:AGENT_REASON.NOT_FOUND,next:[{command:buildCommandWithGlobalFlags(client.argv,`${command} --project <name_or_id>`),when:"Retry with a valid project"}]}):{...teamScope,projectId:project.id,projectName:project.name}}catch(error){if(!isAPIError(error))throw error;return emitAlertsScopeError(client,jsonOutput,error.code||"API_ERROR",error.serverMessage||`API error (${error.status}).`,{reason:error.status===401?"not_authorized":error.status===403?"forbidden":AGENT_REASON.API_ERROR})}}async function parseRulesFlagsAndScope(client,flags,jsonOutput,command="alerts rules ls"){let mutual=validateAllProjectMutualExclusivity(flags["--all"],flags["--project"]);if(!mutual.valid)return outputAgentError(client,{status:"error",reason:AGENT_REASON.INVALID_ARGUMENTS,message:mutual.message,next:[{command:buildCommandWithGlobalFlags(client.argv,"alerts rules --help"),when:"Use either `--project` or `--all`, not both"}]},2),handleValidationError(mutual,jsonOutput,client);if(flags["--all"])return resolveRulesTeam(client,jsonOutput);if(flags["--project"])return resolveRulesProject(client,flags["--project"],jsonOutput,command);let linkedScope=await resolveAlertsScope(client,{jsonOutput,command});if(typeof linkedScope=="number")return linkedScope;let teamScope=await resolveRulesTeam(client,jsonOutput);return typeof teamScope=="number"?teamScope:linkedScope.teamId===teamScope.teamId?linkedScope:teamScope}import{readFileSync}from"fs";import{resolve}from"path";function rulesCollectionPath(teamId,options={}){let query=new URLSearchParams({teamId});return options.limit!==void 0&&query.set("limit",String(options.limit)),options.cursor&&query.set("cursor",options.cursor),options.projectId&&query.set("projectId",options.projectId),options.type&&query.set("type",options.type),`/alerts/v3/alert-rules?${query.toString()}`}function rulesItemPath(teamId,ruleId){let query=new URLSearchParams({teamId});return`/alerts/v3/alert-rules/${encodeURIComponent(ruleId)}?${query.toString()}`}function ruleNotificationsPath(teamId,ruleId){let query=new URLSearchParams({teamId});return`/alerts/v3/alert-rules/${encodeURIComponent(ruleId)}/notifications?${query.toString()}`}function rulesNotificationsPath(teamId,options={}){let query=new URLSearchParams({teamId});return options.limit!==void 0&&query.set("limit",String(options.limit)),options.cursor&&query.set("cursor",options.cursor),`/alerts/v3/alert-rules/notifications?${query.toString()}`}function rulesNotificationLinksPath(teamId,ruleId){let query=new URLSearchParams({teamId});return`/alerts/v3/alert-rules/${encodeURIComponent(ruleId)}/notifications/links?${query.toString()}`}function rulesSchemaPath(teamId,type){let query=new URLSearchParams({teamId});return type&&query.set("type",type),`/alerts/v3/alert-rules/schema?${query.toString()}`}async function fetchRule(client,scope,ruleId){return(await client.fetch(rulesItemPath(scope.teamId,ruleId))).rule}function getIssues(error){return Array.isArray(error.issues)?error.issues.filter(issue=>isJSONObject(issue)&&typeof issue.path=="string"&&typeof issue.message=="string"):[]}function outputRulesError(client,jsonOutput,code,message,options={}){let issues=options.issues??[],issueSummary=issues.slice(0,5).map(issue=>`${issue.path||"body"}: ${issue.message}`).join("; "),exitCode=options.reason!==void 0?getExitCodeForReason(options.reason):getExitCodeForErrorCode(code);return outputAgentError(client,{status:"error",reason:options.reason??AGENT_REASON.INVALID_ARGUMENTS,message,hint:options.hint??(issueSummary||void 0)},exitCode),jsonOutput?client.stdout.write(`${JSON.stringify({error:{code,message,...issues.length?{issues}:{}}},null,2)}
|
|
8
8
|
`):output_manager_default.fatal([message,...issues.map(issue=>` ${issue.path}: ${issue.message}`)].join(`
|
|
9
9
|
`)),exitCode}function handleRulesApiError(client,err,jsonOutput){let message=err.status===401?"You do not have access to alert rules in this team. Ensure your role can manage Alert Rules, or pass --token and --scope.":err.status===403?err.serverMessage||"You do not have permission to manage alert rules in this team.":err.status>=500?`The alert rules endpoint failed (${err.status}). Re-run with --debug and share the x-vercel-id from the failed request.`:err.serverMessage||`API error (${err.status}).`;return outputRulesError(client,jsonOutput,err.code||"API_ERROR",message,{reason:err.status===401?"not_authorized":err.status===403?"forbidden":err.status===404?AGENT_REASON.NOT_FOUND:err.status===429?"rate_limited":AGENT_REASON.API_ERROR,issues:getIssues(err),hint:err.status===401||err.status===403?"Confirm the team with `vercel whoami`; use --scope <team-slug> if the rule belongs to another team.":void 0})}var LEGACY_BODY_FIELDS=["alertTypes","customAlert","queryJsonString"];function readRuleBody(client,bodyPath,jsonOutput){let raw;try{raw=readFileSync(resolve(client.cwd,bodyPath),"utf8")}catch{return outputRulesError(client,jsonOutput,"INVALID_ARGUMENTS",`Could not read --body file: ${bodyPath}`)}let parsed;try{parsed=JSON.parse(raw)}catch{return outputRulesError(client,jsonOutput,"INVALID_ARGUMENTS","Invalid JSON in --body file.")}return isJSONObject(parsed)?LEGACY_BODY_FIELDS.some(field=>Object.hasOwn(parsed,field))?outputRulesError(client,jsonOutput,"LEGACY_ALERT_RULE_BODY","This body uses the previous alert-rules shape. Rewrite it using the current schema.",{hint:"Run `vercel alerts rules schema --type built-in` for examples."}):parsed:outputRulesError(client,jsonOutput,"INVALID_ARGUMENTS","The --body file must contain a JSON object.")}function getBodyType(body){return body.type==="built-in"||body.type==="custom"?body.type:void 0}function emitRulesArgParseError(client,err,recoverWithProjectFlag){let message=err instanceof Error?err.message:String(err),projectFlagMissingArg=message.includes("--project")&&message.includes("requires argument");outputAgentError(client,{status:"error",reason:AGENT_REASON.INVALID_ARGUMENTS,message:projectFlagMissingArg?"`--project` requires a project name or id (for example `--project my-app`).":message,next:[{command:buildCommandWithGlobalFlags(client.argv,projectFlagMissingArg?recoverWithProjectFlag:"alerts rules --help"),when:projectFlagMissingArg?"Retry with a project name or id":"See valid `alerts rules` subcommands"}]},2)}export{resolveRulesTeam,resolveRulesProject,parseRulesFlagsAndScope,rulesCollectionPath,rulesItemPath,ruleNotificationsPath,rulesNotificationsPath,rulesNotificationLinksPath,rulesSchemaPath,fetchRule,outputRulesError,handleRulesApiError,readRuleBody,getBodyType,emitRulesArgParseError};
|
|
@@ -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{humanReadableColumnLabel}from"./chunk-GHAY4PSD.js";import{FETCH_TIMEOUT_MS,OpenApiCache,SSO_API_URL,assertAllowedSpecUrl,readSpecResponse}from"./chunk-B3K6GM2W.js";import{apiCommand,listSubcommand}from"./chunk-JLXG2XWW.js";import{help}from"./chunk-5O2CW3SX.js";import{table}from"./chunk-773GOZIR.js";import{printError}from"./chunk-WDJFZM7U.js";import{validateJsonOutput}from"./chunk-D4MW3RDW.js";import{require_ms}from"./chunk-MXTC4ZAQ.js";import{TelemetryClient}from"./chunk-TNZMCRAP.js";import{parseArguments}from"./chunk-R4VVQRLX.js";import{getFlagsSpecification}from"./chunk-5IPBCD7K.js";import{packageName}from"./chunk-JESNVRVR.js";import{output_manager_default}from"./chunk-75IAMKGV.js";import{require_source}from"./chunk-NB2WLB3J.js";import{__toESM}from"./chunk-BZENIQ7N.js";import{createHash}from"crypto";var MAX_REDIRECTS=3;async function fetchSpecUrl(client,specUrl){let specOrigin=assertAllowedSpecUrl(specUrl).origin,probe=await fetchWithTimeout(specUrl,{readSpec:!0});if(probe.response.ok)return probe.spec??null;let nonce=getSetCookieValue(probe.response,"_vercel_sso_nonce");if(!nonce)throw output_manager_default.debug(`OpenAPI spec URL returned ${probe.response.status} without a Vercel SSO nonce`),new Error(formatHttpError(specUrl,probe.response));let token=client.authConfig.token;if(!token)return output_manager_default.debug("OpenAPI spec URL requires Vercel authentication"),null;let hashedNonce=createHash("sha256").update(nonce).digest("hex"),ssoUrl=`${SSO_API_URL}?url=${encodeURIComponent(specUrl)}&nonce=${hashedNonce}`,sso=await fetchWithTimeout(ssoUrl,{cookie:`authorization=${encodeURIComponent(`Bearer ${token}`)}; isLoggedIn=1`}),location=sso.response.headers.get("location");if(!location||!location.includes("_vercel_jwt="))throw output_manager_default.debug("OpenAPI spec URL: user has no access"),new Error(formatHttpError(specUrl,sso.response));let cookies=new Map([["_vercel_sso_nonce",nonce]]),url=location;for(let i=0;i<=MAX_REDIRECTS;i++){if(!isSameOriginUrl(url,specOrigin))return output_manager_default.debug("OpenAPI spec URL: cross-origin redirect rejected"),null;let{response,spec}=await fetchWithTimeout(url,{cookie:Array.from(cookies,([name,value])=>`${name}=${value}`).join("; "),readSpec:!0});if(response.ok)return spec??null;let next=response.headers.get("location");if(response.status>=300&&response.status<400&&next){let setJwt=getSetCookieValue(response,"_vercel_jwt");setJwt&&cookies.set("_vercel_jwt",setJwt);let nextUrl=new URL(next,url).href;if(!isSameOriginUrl(nextUrl,specOrigin))return output_manager_default.debug("OpenAPI spec URL: cross-origin redirect rejected"),null;url=nextUrl;continue}throw output_manager_default.debug(`OpenAPI spec URL: unexpected response ${response.status}`),new Error(formatHttpError(url,response))}return output_manager_default.debug("OpenAPI spec URL: too many redirects"),null}function createOpenApiCache(client,specUrl){return new OpenApiCache(specUrl?{specUrl,fetchSpecUrl:url=>fetchSpecUrl(client,url)}:void 0)}async function fetchWithTimeout(url,options){let controller=new AbortController,timeoutId=setTimeout(()=>controller.abort(),1e4);try{let response=await fetch(url,{redirect:"manual",signal:controller.signal,headers:options?.cookie?{cookie:options.cookie}:void 0}),spec=options?.readSpec&&response.ok?await readSpecResponse(response,formatDiagnosticUrl(url)):void 0;return{response,spec}}finally{clearTimeout(timeoutId)}}function isSameOriginUrl(url,origin){try{return new URL(url).origin===origin}catch{return!1}}function formatHttpError(url,response){let statusText=response.statusText?` ${response.statusText}`:"";return`Could not load OpenAPI spec from ${formatDiagnosticUrl(url)}: HTTP ${response.status}${statusText}.`}function formatDiagnosticUrl(url){try{let parsed=new URL(url);parsed.hash="";for(let key of parsed.searchParams.keys())parsed.searchParams.set(key,"[redacted]");return parsed.href}catch{return url}}function getSetCookieValue(response,name){let header=response.headers.get("set-cookie");if(!header)return null;let match=header.match(new RegExp(`${name}=([^;,\\s]+)`));return match?match[1]:null}function foldNamingStyle(input){return input.trim().replace(/([a-z\d])([A-Z])/g,"$1 $2").replace(/([A-Z])([A-Z][a-z])/g,"$1 $2").replace(/[-_\s]+/g," ").trim().toLowerCase().replace(/\s+/g,"")}function operationIdToKebabCase(operationId){let s=operationId.trim();return s?s.replace(/([a-z\d])([A-Z])/g,"$1-$2").replace(/([A-Z]+)([A-Z][a-z])/g,"$1-$2").replace(/[-_\s]+/g,"-").replace(/-+/g,"-").replace(/^-|-$/g,"").toLowerCase():"unnamed"}function inferCliSubcommandAliases(ep){let upper=ep.method.toUpperCase(),hasPathParams=ep.parameters.some(p=>p.in==="path");switch(upper){case"GET":return hasPathParams?["inspect","get"]:["ls","list"];case"POST":return["add","create"];case"DELETE":return["rm","remove"];case"PUT":case"PATCH":return["update"];default:return[]}}var import_ms=__toESM(require_ms(),1),import_chalk=__toESM(require_source(),1);function getByPath(obj,path){let parts=path.split(".").filter(Boolean),cur=obj;for(let p of parts){if(cur===null||typeof cur!="object")return;cur=cur[p]}return cur}var TIMESTAMP_FIELD_PATTERN=/(?:^|\.)(created|updated|deleted|expired|blocked|completed|started|finished|modified|verified|published|cancelled|revoked|invited|accepted|accessed|deployed)(?:At|_at|On|_on)?$/i,MIN_TIMESTAMP_MS=1e12,MAX_TIMESTAMP_MS=41024448e5;function isTimestampValue(value,columnPath){return typeof value!="number"||!Number.isFinite(value)||value<MIN_TIMESTAMP_MS||value>MAX_TIMESTAMP_MS?!1:TIMESTAMP_FIELD_PATTERN.test(columnPath)}function formatRelativeTime(timestamp){let diff=Date.now()-timestamp;return diff<0?"just now":import_chalk.default.gray((0,import_ms.default)(diff))}function stringifyCell(value,columnPath){return value==null?import_chalk.default.gray("--"):columnPath&&isTimestampValue(value,columnPath)?formatRelativeTime(value):typeof value=="object"?JSON.stringify(value):String(value)}function styleColumnKey(plainLabel){return import_chalk.default.gray(plainLabel)}function columnsForRow(r,display){return r.limited===!0&&display.columnsWhenLimited?.length?display.columnsWhenLimited:display.columnsDefault}function formatAsCard(r,display){let columns=columnsForRow(r,display);if(!columns.length)return null;let rows=columns.map(colPath=>[styleColumnKey(humanReadableColumnLabel(colPath)),stringifyCell(getByPath(r,colPath),colPath)]);return table(rows,{align:["l","l"],hsep:2})}function formatAsDataTable(items,display){if(items.length===0)return"(empty)";let first=items[0];if(first===null||typeof first!="object"||Array.isArray(first)){let headers2=[styleColumnKey(humanReadableColumnLabel("#")),styleColumnKey(humanReadableColumnLabel("value"))],rows=items.map((v,i)=>[String(i),stringifyCell(v,"value")]);return table([headers2,...rows])}let columns=columnsForRow(first,display);if(!columns.length)return null;let headers=columns.map(p=>styleColumnKey(humanReadableColumnLabel(p))),dataRows=items.map(item=>{let row=item!==null&&typeof item=="object"&&!Array.isArray(item)?item:{};return columns.map(colPath=>stringifyCell(getByPath(row,colPath),colPath))});return table([headers,...dataRows])}function resolveEndpointByTagAndOperationId(endpoints,tag,operationHint){let tagLower=tag.toLowerCase(),tagMatches=endpoints.filter(ep=>ep.tags.some(t=>t.toLowerCase()===tagLower));if(tagMatches.length===0)return{ok:!1,reason:"no_tag",tag,tagMatches:[],operationHint};let withOpId=tagMatches.filter(ep=>ep.operationId.length>0);if(withOpId.length===0)return{ok:!1,reason:"no_operation",tag,tagMatches,operationHint};let hint=operationHint.trim(),hintLower=hint.toLowerCase(),exact=withOpId.filter(ep=>ep.operationId===hint);if(exact.length===1)return{ok:!0,endpoint:exact[0]};if(exact.length>1)return{ok:!1,reason:"ambiguous_operation",tag,tagMatches:exact,operationHint:hint};let exactCi=withOpId.filter(ep=>ep.operationId.toLowerCase()===hintLower);return exactCi.length===1?{ok:!0,endpoint:exactCi[0]}:exactCi.length>1?{ok:!1,reason:"ambiguous_operation",tag,tagMatches:exactCi,operationHint:hint}:{ok:!1,reason:"no_operation",tag,tagMatches,operationHint:hint}}var import_chalk4=__toESM(require_source(),1);var ApiTelemetryClient=class extends TelemetryClient{trackCliArgumentEndpoint(endpoint){if(endpoint){let normalized=this.normalizeEndpoint(endpoint);this.trackCliArgument({arg:"endpoint",value:normalized})}}trackCliArgumentOperationId(operationId){operationId&&this.trackCliArgument({arg:"operationId",value:operationId})}trackCliOptionMethod(method){if(method){let validMethods=["GET","POST","PUT","DELETE","PATCH","HEAD"],upperMethod=method.toUpperCase(),value=validMethods.includes(upperMethod)?upperMethod:this.redactedValue;this.trackCliOption({option:"method",value})}}trackCliOptionField(fields){fields&&fields.length>0&&this.trackCliOption({option:"field",value:this.redactedArgumentsLength(fields)})}trackCliOptionRawField(fields){fields&&fields.length>0&&this.trackCliOption({option:"raw-field",value:this.redactedArgumentsLength(fields)})}trackCliOptionHeader(headers){headers&&headers.length>0&&this.trackCliOption({option:"header",value:this.redactedArgumentsLength(headers)})}trackCliOptionInput(input){if(input){let value=input==="-"?"stdin":"file";this.trackCliOption({option:"input",value})}}trackCliOptionSpecUrl(specUrl){specUrl&&this.trackCliOption({option:"spec-url",value:this.redactedValue})}trackCliFlagPaginate(value){value&&this.trackCliFlag("paginate")}trackCliFlagInclude(value){value&&this.trackCliFlag("include")}trackCliFlagSilent(value){value&&this.trackCliFlag("silent")}trackCliFlagVerbose(value){value&&this.trackCliFlag("verbose")}trackCliFlagRaw(value){value&&this.trackCliFlag("raw")}trackCliFlagRefresh(value){value&&this.trackCliFlag("refresh")}trackCliOptionGenerate(format){if(format){let value=["curl"].includes(format)?format:this.redactedValue;this.trackCliOption({option:"generate",value})}}trackCliFlagDangerouslySkipPermissions(value){value&&this.trackCliFlag("dangerously-skip-permissions")}trackCliSubcommandList(){this.trackCliSubcommand({subcommand:"list",value:"list"})}trackCliOptionFormat(format){if(format){let value=["table","json"].includes(format)?format:this.redactedValue;this.trackCliOption({option:"format",value})}}trackCliFlagJson(json){json&&this.trackCliFlag("json")}normalizeEndpoint(endpoint){return endpoint.replace(/\/dpl_[a-zA-Z0-9]+/g,"/:deploymentId").replace(/\/prj_[a-zA-Z0-9]+/g,"/:projectId").replace(/\/team_[a-zA-Z0-9]+/g,"/:teamId").replace(/\/[a-f0-9]{24}/g,"/:id").replace(/\/[a-f0-9-]{36}/g,"/:uuid")}};import{readFile}from"fs/promises";import{resolve}from"path";async function buildRequest(endpoint,flags){let headers={},body,customHeaders=flags["--header"]||[];for(let header of customHeaders){let colonIndex=header.indexOf(":");if(colonIndex>0){let key=header.substring(0,colonIndex).trim(),value=header.substring(colonIndex+1).trim();headers[key]=value}}let fields=flags["--field"]||[],rawFields=flags["--raw-field"]||[];if(fields.length>0||rawFields.length>0){body={};for(let field of fields){let{key,value}=await parseField(field,!0);body[key]=value}for(let field of rawFields){let{key,value}=await parseField(field,!1);body[key]=value}}if(flags["--input"]){let inputPath=flags["--input"];if(inputPath==="-"?body=await readStdin():body=await readFile(resolve(inputPath),"utf-8"),typeof body=="string")try{body=JSON.parse(body)}catch{}}let method=flags["--method"]?.toUpperCase()||"GET";return!flags["--method"]&&body&&(method="POST"),{url:endpoint,method,headers,body}}async function parseCliKeyValueField(field,typed){return parseField(field,typed)}async function parseField(field,typed){let eqIndex=field.indexOf("=");if(eqIndex===-1)throw new Error(`Invalid field format: ${field}. Expected key=value`);let key=field.substring(0,eqIndex),value=field.substring(eqIndex+1);if(typed&&typeof value=="string"){if(value.startsWith("@")){let filePath=value.substring(1);if(filePath==="-"?value=await readStdin():value=await readFile(resolve(filePath),"utf-8"),typeof value=="string")try{value=JSON.parse(value)}catch{}}else if(value==="true")value=!0;else if(value==="false")value=!1;else if(value==="null")value=null;else if(/^-?\d+$/.test(value))value=parseInt(value,10);else if(/^-?\d*\.\d+$/.test(value))value=parseFloat(value);else if(value.startsWith("[")||value.startsWith("{"))try{value=JSON.parse(value)}catch{}}return{key,value}}async function readStdin(){let chunks=[];for await(let chunk of process.stdin)chunks.push(Buffer.from(chunk));return Buffer.concat(chunks).toString("utf-8")}function formatOutput(data,options){return options.raw?typeof data=="string"?data:JSON.stringify(data):JSON.stringify(data,null,2)}function generateCurlCommand(config,baseUrl){let parts=["curl"];config.method!=="GET"&&parts.push(`-X ${config.method}`),parts.push("-H 'Authorization: Bearer <TOKEN>'");for(let[key,value]of Object.entries(config.headers))parts.push(`-H '${key}: ${escapeShellArg(value)}'`);if(config.method!=="GET"&&config.body){let bodyStr=typeof config.body=="string"?config.body:JSON.stringify(config.body);parts.push("-H 'Content-Type: application/json'"),parts.push(`-d '${escapeShellArg(bodyStr)}'`)}let fullUrl=`${baseUrl}${config.url}`;return parts.push(`'${fullUrl}'`),parts.join(` \\
|
|
7
|
+
import{humanReadableColumnLabel}from"./chunk-GHAY4PSD.js";import{FETCH_TIMEOUT_MS,OpenApiCache,SSO_API_URL,assertAllowedSpecUrl,readSpecResponse}from"./chunk-B3K6GM2W.js";import{apiCommand,listSubcommand}from"./chunk-JLXG2XWW.js";import{help}from"./chunk-FO7MV3VE.js";import{table}from"./chunk-773GOZIR.js";import{printError}from"./chunk-HYFA2W4U.js";import{validateJsonOutput}from"./chunk-D4MW3RDW.js";import{require_ms}from"./chunk-MXTC4ZAQ.js";import{TelemetryClient}from"./chunk-TNZMCRAP.js";import{parseArguments}from"./chunk-R4VVQRLX.js";import{getFlagsSpecification}from"./chunk-5IPBCD7K.js";import{packageName}from"./chunk-JESNVRVR.js";import{output_manager_default}from"./chunk-75IAMKGV.js";import{require_source}from"./chunk-NB2WLB3J.js";import{__toESM}from"./chunk-BZENIQ7N.js";import{createHash}from"crypto";var MAX_REDIRECTS=3;async function fetchSpecUrl(client,specUrl){let specOrigin=assertAllowedSpecUrl(specUrl).origin,probe=await fetchWithTimeout(specUrl,{readSpec:!0});if(probe.response.ok)return probe.spec??null;let nonce=getSetCookieValue(probe.response,"_vercel_sso_nonce");if(!nonce)throw output_manager_default.debug(`OpenAPI spec URL returned ${probe.response.status} without a Vercel SSO nonce`),new Error(formatHttpError(specUrl,probe.response));let token=client.authConfig.token;if(!token)return output_manager_default.debug("OpenAPI spec URL requires Vercel authentication"),null;let hashedNonce=createHash("sha256").update(nonce).digest("hex"),ssoUrl=`${SSO_API_URL}?url=${encodeURIComponent(specUrl)}&nonce=${hashedNonce}`,sso=await fetchWithTimeout(ssoUrl,{cookie:`authorization=${encodeURIComponent(`Bearer ${token}`)}; isLoggedIn=1`}),location=sso.response.headers.get("location");if(!location||!location.includes("_vercel_jwt="))throw output_manager_default.debug("OpenAPI spec URL: user has no access"),new Error(formatHttpError(specUrl,sso.response));let cookies=new Map([["_vercel_sso_nonce",nonce]]),url=location;for(let i=0;i<=MAX_REDIRECTS;i++){if(!isSameOriginUrl(url,specOrigin))return output_manager_default.debug("OpenAPI spec URL: cross-origin redirect rejected"),null;let{response,spec}=await fetchWithTimeout(url,{cookie:Array.from(cookies,([name,value])=>`${name}=${value}`).join("; "),readSpec:!0});if(response.ok)return spec??null;let next=response.headers.get("location");if(response.status>=300&&response.status<400&&next){let setJwt=getSetCookieValue(response,"_vercel_jwt");setJwt&&cookies.set("_vercel_jwt",setJwt);let nextUrl=new URL(next,url).href;if(!isSameOriginUrl(nextUrl,specOrigin))return output_manager_default.debug("OpenAPI spec URL: cross-origin redirect rejected"),null;url=nextUrl;continue}throw output_manager_default.debug(`OpenAPI spec URL: unexpected response ${response.status}`),new Error(formatHttpError(url,response))}return output_manager_default.debug("OpenAPI spec URL: too many redirects"),null}function createOpenApiCache(client,specUrl){return new OpenApiCache(specUrl?{specUrl,fetchSpecUrl:url=>fetchSpecUrl(client,url)}:void 0)}async function fetchWithTimeout(url,options){let controller=new AbortController,timeoutId=setTimeout(()=>controller.abort(),1e4);try{let response=await fetch(url,{redirect:"manual",signal:controller.signal,headers:options?.cookie?{cookie:options.cookie}:void 0}),spec=options?.readSpec&&response.ok?await readSpecResponse(response,formatDiagnosticUrl(url)):void 0;return{response,spec}}finally{clearTimeout(timeoutId)}}function isSameOriginUrl(url,origin){try{return new URL(url).origin===origin}catch{return!1}}function formatHttpError(url,response){let statusText=response.statusText?` ${response.statusText}`:"";return`Could not load OpenAPI spec from ${formatDiagnosticUrl(url)}: HTTP ${response.status}${statusText}.`}function formatDiagnosticUrl(url){try{let parsed=new URL(url);parsed.hash="";for(let key of parsed.searchParams.keys())parsed.searchParams.set(key,"[redacted]");return parsed.href}catch{return url}}function getSetCookieValue(response,name){let header=response.headers.get("set-cookie");if(!header)return null;let match=header.match(new RegExp(`${name}=([^;,\\s]+)`));return match?match[1]:null}function foldNamingStyle(input){return input.trim().replace(/([a-z\d])([A-Z])/g,"$1 $2").replace(/([A-Z])([A-Z][a-z])/g,"$1 $2").replace(/[-_\s]+/g," ").trim().toLowerCase().replace(/\s+/g,"")}function operationIdToKebabCase(operationId){let s=operationId.trim();return s?s.replace(/([a-z\d])([A-Z])/g,"$1-$2").replace(/([A-Z]+)([A-Z][a-z])/g,"$1-$2").replace(/[-_\s]+/g,"-").replace(/-+/g,"-").replace(/^-|-$/g,"").toLowerCase():"unnamed"}function inferCliSubcommandAliases(ep){let upper=ep.method.toUpperCase(),hasPathParams=ep.parameters.some(p=>p.in==="path");switch(upper){case"GET":return hasPathParams?["inspect","get"]:["ls","list"];case"POST":return["add","create"];case"DELETE":return["rm","remove"];case"PUT":case"PATCH":return["update"];default:return[]}}var import_ms=__toESM(require_ms(),1),import_chalk=__toESM(require_source(),1);function getByPath(obj,path){let parts=path.split(".").filter(Boolean),cur=obj;for(let p of parts){if(cur===null||typeof cur!="object")return;cur=cur[p]}return cur}var TIMESTAMP_FIELD_PATTERN=/(?:^|\.)(created|updated|deleted|expired|blocked|completed|started|finished|modified|verified|published|cancelled|revoked|invited|accepted|accessed|deployed)(?:At|_at|On|_on)?$/i,MIN_TIMESTAMP_MS=1e12,MAX_TIMESTAMP_MS=41024448e5;function isTimestampValue(value,columnPath){return typeof value!="number"||!Number.isFinite(value)||value<MIN_TIMESTAMP_MS||value>MAX_TIMESTAMP_MS?!1:TIMESTAMP_FIELD_PATTERN.test(columnPath)}function formatRelativeTime(timestamp){let diff=Date.now()-timestamp;return diff<0?"just now":import_chalk.default.gray((0,import_ms.default)(diff))}function stringifyCell(value,columnPath){return value==null?import_chalk.default.gray("--"):columnPath&&isTimestampValue(value,columnPath)?formatRelativeTime(value):typeof value=="object"?JSON.stringify(value):String(value)}function styleColumnKey(plainLabel){return import_chalk.default.gray(plainLabel)}function columnsForRow(r,display){return r.limited===!0&&display.columnsWhenLimited?.length?display.columnsWhenLimited:display.columnsDefault}function formatAsCard(r,display){let columns=columnsForRow(r,display);if(!columns.length)return null;let rows=columns.map(colPath=>[styleColumnKey(humanReadableColumnLabel(colPath)),stringifyCell(getByPath(r,colPath),colPath)]);return table(rows,{align:["l","l"],hsep:2})}function formatAsDataTable(items,display){if(items.length===0)return"(empty)";let first=items[0];if(first===null||typeof first!="object"||Array.isArray(first)){let headers2=[styleColumnKey(humanReadableColumnLabel("#")),styleColumnKey(humanReadableColumnLabel("value"))],rows=items.map((v,i)=>[String(i),stringifyCell(v,"value")]);return table([headers2,...rows])}let columns=columnsForRow(first,display);if(!columns.length)return null;let headers=columns.map(p=>styleColumnKey(humanReadableColumnLabel(p))),dataRows=items.map(item=>{let row=item!==null&&typeof item=="object"&&!Array.isArray(item)?item:{};return columns.map(colPath=>stringifyCell(getByPath(row,colPath),colPath))});return table([headers,...dataRows])}function resolveEndpointByTagAndOperationId(endpoints,tag,operationHint){let tagLower=tag.toLowerCase(),tagMatches=endpoints.filter(ep=>ep.tags.some(t=>t.toLowerCase()===tagLower));if(tagMatches.length===0)return{ok:!1,reason:"no_tag",tag,tagMatches:[],operationHint};let withOpId=tagMatches.filter(ep=>ep.operationId.length>0);if(withOpId.length===0)return{ok:!1,reason:"no_operation",tag,tagMatches,operationHint};let hint=operationHint.trim(),hintLower=hint.toLowerCase(),exact=withOpId.filter(ep=>ep.operationId===hint);if(exact.length===1)return{ok:!0,endpoint:exact[0]};if(exact.length>1)return{ok:!1,reason:"ambiguous_operation",tag,tagMatches:exact,operationHint:hint};let exactCi=withOpId.filter(ep=>ep.operationId.toLowerCase()===hintLower);return exactCi.length===1?{ok:!0,endpoint:exactCi[0]}:exactCi.length>1?{ok:!1,reason:"ambiguous_operation",tag,tagMatches:exactCi,operationHint:hint}:{ok:!1,reason:"no_operation",tag,tagMatches,operationHint:hint}}var import_chalk4=__toESM(require_source(),1);var ApiTelemetryClient=class extends TelemetryClient{trackCliArgumentEndpoint(endpoint){if(endpoint){let normalized=this.normalizeEndpoint(endpoint);this.trackCliArgument({arg:"endpoint",value:normalized})}}trackCliArgumentOperationId(operationId){operationId&&this.trackCliArgument({arg:"operationId",value:operationId})}trackCliOptionMethod(method){if(method){let validMethods=["GET","POST","PUT","DELETE","PATCH","HEAD"],upperMethod=method.toUpperCase(),value=validMethods.includes(upperMethod)?upperMethod:this.redactedValue;this.trackCliOption({option:"method",value})}}trackCliOptionField(fields){fields&&fields.length>0&&this.trackCliOption({option:"field",value:this.redactedArgumentsLength(fields)})}trackCliOptionRawField(fields){fields&&fields.length>0&&this.trackCliOption({option:"raw-field",value:this.redactedArgumentsLength(fields)})}trackCliOptionHeader(headers){headers&&headers.length>0&&this.trackCliOption({option:"header",value:this.redactedArgumentsLength(headers)})}trackCliOptionInput(input){if(input){let value=input==="-"?"stdin":"file";this.trackCliOption({option:"input",value})}}trackCliOptionSpecUrl(specUrl){specUrl&&this.trackCliOption({option:"spec-url",value:this.redactedValue})}trackCliFlagPaginate(value){value&&this.trackCliFlag("paginate")}trackCliFlagInclude(value){value&&this.trackCliFlag("include")}trackCliFlagSilent(value){value&&this.trackCliFlag("silent")}trackCliFlagVerbose(value){value&&this.trackCliFlag("verbose")}trackCliFlagRaw(value){value&&this.trackCliFlag("raw")}trackCliFlagRefresh(value){value&&this.trackCliFlag("refresh")}trackCliOptionGenerate(format){if(format){let value=["curl"].includes(format)?format:this.redactedValue;this.trackCliOption({option:"generate",value})}}trackCliFlagDangerouslySkipPermissions(value){value&&this.trackCliFlag("dangerously-skip-permissions")}trackCliSubcommandList(){this.trackCliSubcommand({subcommand:"list",value:"list"})}trackCliOptionFormat(format){if(format){let value=["table","json"].includes(format)?format:this.redactedValue;this.trackCliOption({option:"format",value})}}trackCliFlagJson(json){json&&this.trackCliFlag("json")}normalizeEndpoint(endpoint){return endpoint.replace(/\/dpl_[a-zA-Z0-9]+/g,"/:deploymentId").replace(/\/prj_[a-zA-Z0-9]+/g,"/:projectId").replace(/\/team_[a-zA-Z0-9]+/g,"/:teamId").replace(/\/[a-f0-9]{24}/g,"/:id").replace(/\/[a-f0-9-]{36}/g,"/:uuid")}};import{readFile}from"fs/promises";import{resolve}from"path";async function buildRequest(endpoint,flags){let headers={},body,customHeaders=flags["--header"]||[];for(let header of customHeaders){let colonIndex=header.indexOf(":");if(colonIndex>0){let key=header.substring(0,colonIndex).trim(),value=header.substring(colonIndex+1).trim();headers[key]=value}}let fields=flags["--field"]||[],rawFields=flags["--raw-field"]||[];if(fields.length>0||rawFields.length>0){body={};for(let field of fields){let{key,value}=await parseField(field,!0);body[key]=value}for(let field of rawFields){let{key,value}=await parseField(field,!1);body[key]=value}}if(flags["--input"]){let inputPath=flags["--input"];if(inputPath==="-"?body=await readStdin():body=await readFile(resolve(inputPath),"utf-8"),typeof body=="string")try{body=JSON.parse(body)}catch{}}let method=flags["--method"]?.toUpperCase()||"GET";return!flags["--method"]&&body&&(method="POST"),{url:endpoint,method,headers,body}}async function parseCliKeyValueField(field,typed){return parseField(field,typed)}async function parseField(field,typed){let eqIndex=field.indexOf("=");if(eqIndex===-1)throw new Error(`Invalid field format: ${field}. Expected key=value`);let key=field.substring(0,eqIndex),value=field.substring(eqIndex+1);if(typed&&typeof value=="string"){if(value.startsWith("@")){let filePath=value.substring(1);if(filePath==="-"?value=await readStdin():value=await readFile(resolve(filePath),"utf-8"),typeof value=="string")try{value=JSON.parse(value)}catch{}}else if(value==="true")value=!0;else if(value==="false")value=!1;else if(value==="null")value=null;else if(/^-?\d+$/.test(value))value=parseInt(value,10);else if(/^-?\d*\.\d+$/.test(value))value=parseFloat(value);else if(value.startsWith("[")||value.startsWith("{"))try{value=JSON.parse(value)}catch{}}return{key,value}}async function readStdin(){let chunks=[];for await(let chunk of process.stdin)chunks.push(Buffer.from(chunk));return Buffer.concat(chunks).toString("utf-8")}function formatOutput(data,options){return options.raw?typeof data=="string"?data:JSON.stringify(data):JSON.stringify(data,null,2)}function generateCurlCommand(config,baseUrl){let parts=["curl"];config.method!=="GET"&&parts.push(`-X ${config.method}`),parts.push("-H 'Authorization: Bearer <TOKEN>'");for(let[key,value]of Object.entries(config.headers))parts.push(`-H '${key}: ${escapeShellArg(value)}'`);if(config.method!=="GET"&&config.body){let bodyStr=typeof config.body=="string"?config.body:JSON.stringify(config.body);parts.push("-H 'Content-Type: application/json'"),parts.push(`-d '${escapeShellArg(bodyStr)}'`)}let fullUrl=`${baseUrl}${config.url}`;return parts.push(`'${fullUrl}'`),parts.join(` \\
|
|
8
8
|
`)}function escapeShellArg(str){return str.replace(/'/g,"'\\''")}import{readFile as readFile2}from"fs/promises";import{resolve as resolve2}from"path";var GLOBAL_CLI_QUERY_PARAMS=new Set(["teamId","slug"]);async function parseOperationKeyValuePairs(endpoint,bodyFields,flags,positionalKeyValues){let pathParamNames=new Set(endpoint.parameters.filter(p=>p.in==="path").map(p=>p.name)),queryParamNames=new Set(endpoint.parameters.filter(p=>p.in==="query").map(p=>p.name)),headerParamNames=new Set(endpoint.parameters.filter(p=>p.in==="header").map(p=>p.name)),bodyFieldNames=new Set(bodyFields.map(f=>f.name)),pathValues={},queryValues={},headerValues={},body={};async function dispatchPair(field,typed){let eqIndex=field.indexOf("=");if(eqIndex===-1)throw new Error(`Invalid option "${field}". Expected key=value (or use flags -F / -f).`);let key=field.slice(0,eqIndex),param=endpoint.parameters.find(p=>p.name===key);if(param?.in==="path"){let{value}=await parseCliKeyValueField(field,!1);pathValues[key]=String(value);return}if(param?.in==="query"){let{value}=await parseCliKeyValueField(field,typed);queryValues[key]=typeof value=="object"&&value!==null?JSON.stringify(value):String(value);return}if(param?.in==="header"){let{value}=await parseCliKeyValueField(field,!1);headerValues[key]=String(value);return}if(param?.in==="cookie")throw new Error(`Option "${key}" is cookie-based; set it via headers instead.`);if(bodyFieldNames.has(key)){let{value}=await parseCliKeyValueField(field,typed);body[key]=value;return}if(!param&&pathParamNames.has(key)){let{value}=await parseCliKeyValueField(field,!1);pathValues[key]=String(value);return}if(!param&&queryParamNames.has(key)){let{value}=await parseCliKeyValueField(field,typed);queryValues[key]=typeof value=="object"&&value!==null?JSON.stringify(value):String(value);return}if(!param&&headerParamNames.has(key)){let{value}=await parseCliKeyValueField(field,!1);headerValues[key]=String(value);return}throw new Error(`Unknown option "${key}" for operation ${endpoint.operationId}. Check the API docs or run \`vercel api ls --json\`.`)}for(let field of flags["--field"]||[])await dispatchPair(field,!0);for(let field of flags["--raw-field"]||[])await dispatchPair(field,!1);for(let field of positionalKeyValues)await dispatchPair(field,!0);return{pathValues,queryValues,headerValues,body}}function getMissingRequiredOperationParams(endpoint,bodyFields,parsed,flags){let missingPath=endpoint.parameters.filter(p=>p.in==="path").filter(p=>parsed.pathValues[p.name]===void 0),missingQuery=endpoint.parameters.filter(p=>p.in==="query"&&p.required&&!GLOBAL_CLI_QUERY_PARAMS.has(p.name)).filter(p=>parsed.queryValues[p.name]===void 0),missingHeader=endpoint.parameters.filter(p=>p.in==="header"&&p.required).filter(p=>parsed.headerValues[p.name]===void 0),missingBody=bodyFields.filter(f=>f.required&&parsed.body[f.name]===void 0&&!flags["--input"]);return{path:missingPath,query:missingQuery,header:missingHeader,body:missingBody}}function getUnsetOptionalOperationParams(endpoint,bodyFields,parsed,flags){let unsetQuery=endpoint.parameters.filter(p=>p.in==="query"&&parsed.queryValues[p.name]===void 0&&(!p.required||GLOBAL_CLI_QUERY_PARAMS.has(p.name))),unsetHeader=endpoint.parameters.filter(p=>p.in==="header"&&!p.required&&parsed.headerValues[p.name]===void 0),unsetBody=bodyFields.filter(f=>!f.required&&parsed.body[f.name]===void 0&&!flags["--input"]);return{query:unsetQuery,header:unsetHeader,body:unsetBody}}async function buildRequestForResolvedOperation(endpoint,bodyFields,flags,positionalKeyValues){let headers={},customHeaders=flags["--header"]||[];for(let header of customHeaders){let colonIndex=header.indexOf(":");if(colonIndex>0){let key=header.substring(0,colonIndex).trim(),value=header.substring(colonIndex+1).trim();headers[key]=value}}let method=(flags["--method"]?.toUpperCase()||endpoint.method).toUpperCase(),pathParamNames=new Set(endpoint.parameters.filter(p=>p.in==="path").map(p=>p.name)),parsed=await parseOperationKeyValuePairs(endpoint,bodyFields,flags,positionalKeyValues),{pathValues,queryValues,headerValues,body}=parsed;for(let[k,v]of Object.entries(headerValues))headers[k]=v;let urlPath=endpoint.path;for(let name of pathParamNames){let value=pathValues[name];if(value===void 0)throw new Error(`Missing required path option {${name}} for ${endpoint.operationId}.`);urlPath=urlPath.replace(`{${name}}`,encodeURIComponent(value))}if(/\{[^}]+\}/.test(urlPath))throw new Error(`Unresolved path placeholders in ${urlPath}. Provide values for all path options.`);let requiredQuery=endpoint.parameters.filter(p=>p.in==="query"&&p.required&&!GLOBAL_CLI_QUERY_PARAMS.has(p.name));for(let p of requiredQuery)if(queryValues[p.name]===void 0)throw new Error(`Missing required query option "${p.name}" for ${endpoint.operationId}.`);let requiredHeader=endpoint.parameters.filter(h=>h.in==="header"&&h.required);for(let h of requiredHeader)if(headerValues[h.name]===void 0)throw new Error(`Missing required header option "${h.name}" for ${endpoint.operationId}.`);let requiredBody=bodyFields.filter(f=>f.required);for(let f of requiredBody)if(body[f.name]===void 0&&!flags["--input"])throw new Error(`Missing required body option "${f.name}" for ${endpoint.operationId}.`);let queryString=new URLSearchParams(queryValues).toString();queryString&&(urlPath+=(urlPath.includes("?")?"&":"?")+queryString);let finalBody=Object.keys(body).length>0?body:void 0;if(flags["--input"]){let inputPath=flags["--input"],inputBody;if(inputPath==="-"?inputBody=await readStdin():inputBody=await readFile2(resolve2(inputPath),"utf-8"),typeof inputBody=="string")try{finalBody=JSON.parse(inputBody)}catch{finalBody=inputBody}else finalBody=inputBody}return(method==="GET"||method==="HEAD")&&(finalBody=void 0),{url:urlPath,method,headers,body:finalBody}}var API_BASE_URL="https://api.vercel.com";var import_chalk2=__toESM(require_source(),1);function colorizeMethod(method){switch(method){case"GET":return import_chalk2.default.cyan(method);case"POST":return import_chalk2.default.green(method);case"PUT":return import_chalk2.default.yellow(method);case"PATCH":return import_chalk2.default.blue(method);case"DELETE":return import_chalk2.default.red(method);default:return method}}function colorizeMethodPadded(method,width=7){let colored=colorizeMethod(method),padding=" ".repeat(Math.max(0,width-method.length));return colored+padding}function formatPathParam(paramName){return import_chalk2.default.cyan(`{${paramName}}`)}function formatTypeHint(type){return import_chalk2.default.dim(`[${type}]`)}function formatDescription(description){return description?import_chalk2.default.gray(` (${description})`):""}var import_chalk3=__toESM(require_source(),1);function getByPath2(obj,path){let current=obj;for(let segment of path.split(".")){if(current==null||typeof current!="object")return;current=current[segment]}return current}function parseArrayColumns(data,columns){let entries=Object.entries(columns),first=entries[0];if(!first)return null;let bracketIdx=first[1].indexOf("[].");if(bracketIdx===-1)return null;let arrayKey=first[1].slice(0,bracketIdx),rowColumns={};for(let[label,path]of entries){let prefix=path.slice(0,bracketIdx);if(prefix!==arrayKey||!path.startsWith(prefix+"[]."))return null;rowColumns[label]=path.slice(bracketIdx+3)}let arr=getByPath2(data,arrayKey);return Array.isArray(arr)?{rows:arr,rowColumns}:null}function formatValue(value){return value==null?import_chalk3.default.dim("\u2013"):typeof value=="number"?value>1e12&&value<2e12?new Date(value).toISOString():String(value):typeof value=="boolean"?String(value):typeof value=="string"?value:JSON.stringify(value)}function renderCard(data,columns){let entries=Object.entries(columns),maxLabel=Math.max(...entries.map(([label])=>label.length));return entries.map(([label,path])=>{let value=getByPath2(data,path);return` ${import_chalk3.default.gray(label.padEnd(maxLabel))} ${formatValue(value)}`}).join(`
|
|
9
9
|
`)}function renderTable(rows,columns){let entries=Object.entries(columns),headerRow=entries.map(([label])=>label),dataRows=rows.map(row=>entries.map(([,path])=>formatValue(getByPath2(row,path)))),widths=entries.map(([label],colIdx)=>{let dataMax=dataRows.reduce((max,row)=>Math.max(max,stripAnsi(row[colIdx]).length),0);return Math.max(label.length,dataMax)}),header=headerRow.map((h,i)=>import_chalk3.default.bold(h.padEnd(widths[i]))).join(" "),body=dataRows.map(row=>row.map((cell,i)=>{let pad=widths[i]-stripAnsi(cell).length;return cell+" ".repeat(Math.max(0,pad))}).join(" "));return[header,...body].join(`
|
|
10
10
|
`)}function stripAnsi(str){return str.replace(/\x1b\[[0-9;]*m/g,"")}async function api(client){let telemetryClient=new ApiTelemetryClient({opts:{store:client.telemetryEventStore}}),parsedArgs,flagsSpec=getFlagsSpecification(apiCommand.options);try{parsedArgs=parseArguments(client.argv.slice(2),flagsSpec,{permissive:!0})}catch(err){return printError(err),2}let{args,flags}=parsedArgs,needHelp=flags["--help"],firstArg=args[1];if(firstArg==="ls"||firstArg==="list"){let lsFlagsSpec=getFlagsSpecification(listSubcommand.options),lsParsedArgs;try{lsParsedArgs=parseArguments(client.argv.slice(2),lsFlagsSpec)}catch(err){return printError(err),2}let lsFlags=lsParsedArgs.flags;if(lsFlags["--help"])return telemetryClient.trackCliFlagHelp("api",firstArg),output_manager_default.print(help(listSubcommand,{parent:apiCommand,columns:client.stderr.columns})),0;let formatResult=validateJsonOutput(lsFlags);return formatResult.valid?(telemetryClient.trackCliSubcommandList(),lsFlags["--refresh"]&&telemetryClient.trackCliFlagRefresh(!0),lsFlags["--format"]&&telemetryClient.trackCliOptionFormat(lsFlags["--format"]),telemetryClient.trackCliFlagJson(lsFlags["--json"]),lsFlags["--spec-url"]&&telemetryClient.trackCliOptionSpecUrl(lsFlags["--spec-url"]),listEndpoints(client,lsFlags["--refresh"]??!1,lsFlags["--spec-url"],formatResult.jsonOutput?"json":"table")):(output_manager_default.error(formatResult.error),2)}if(needHelp)return telemetryClient.trackCliFlagHelp("api"),output_manager_default.print(help(apiCommand,{columns:client.stderr.columns})),0;flags["--dangerously-skip-permissions"]&&(client.dangerouslySkipPermissions=!0);let endpoint,selectedMethod,selectedBodyFields=[];if(firstArg)endpoint=firstArg;else if(client.stdin.isTTY){let selected=await promptEndpointSelection(client,flags["--refresh"]??!1,flags["--spec-url"]);if(!selected)return 1;endpoint=selected.finalUrl,selectedMethod=selected.method,selectedBodyFields=selected.bodyFields}else return output_manager_default.error("Endpoint is required. Usage: vercel api <endpoint>"),2;if(endpoint&&!endpoint.startsWith("/"))return output_manager_default.error(`Invalid arguments. Use an API path starting with /, or run \`${packageName} api\` interactively.`),2;try{if(new URL(endpoint,API_BASE_URL).origin!==API_BASE_URL)return output_manager_default.error("Invalid endpoint: must be a Vercel API path, not an external URL"),2}catch{return output_manager_default.error("Invalid endpoint URL format"),1}let finalFlags={...flags};if(selectedMethod&&!flags["--method"]&&(finalFlags["--method"]=selectedMethod),selectedBodyFields.length>0){let existingFields=finalFlags["--field"]||[];finalFlags["--field"]=[...existingFields,...selectedBodyFields]}let requestConfig;try{requestConfig=await buildRequest(endpoint,finalFlags)}catch(err){return printError(err),1}if(telemetryClient.trackCliArgumentEndpoint(requestConfig.url),telemetryClient.trackCliArgumentOperationId(void 0),telemetryClient.trackCliOptionMethod(flags["--method"]),telemetryClient.trackCliOptionHeader(flags["--header"]),telemetryClient.trackCliOptionInput(flags["--input"]),flags["--paginate"]&&telemetryClient.trackCliFlagPaginate(!0),flags["--include"]&&telemetryClient.trackCliFlagInclude(!0),flags["--silent"]&&telemetryClient.trackCliFlagSilent(!0),flags["--verbose"]&&telemetryClient.trackCliFlagVerbose(!0),flags["--raw"]&&telemetryClient.trackCliFlagRaw(!0),flags["--refresh"]&&telemetryClient.trackCliFlagRefresh(!0),flags["--spec-url"]&&telemetryClient.trackCliOptionSpecUrl(flags["--spec-url"]),flags["--generate"]&&telemetryClient.trackCliOptionGenerate(flags["--generate"]),flags["--dangerously-skip-permissions"]&&telemetryClient.trackCliFlagDangerouslySkipPermissions(!0),flags["--generate"]==="curl"){let curlCmd=generateCurlCommand(requestConfig,"https://api.vercel.com");return output_manager_default.log(""),output_manager_default.log("Replace <TOKEN> with your auth token:"),output_manager_default.log(""),client.stdout.write(curlCmd+`
|