vercel 64.3.1 → 64.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunks/{add-UXOTAL3N.js → add-CG73LA5A.js} +1 -1
- package/dist/chunks/{add-RFCYPSPS.js → add-KBBLLPHW.js} +1 -1
- package/dist/chunks/{add-5RV75RPG.js → add-U5U56FJR.js} +1 -1
- package/dist/chunks/{build-SE3QLNVF.js → build-7EWHBKAN.js} +1 -1
- package/dist/chunks/{chunk-VVAZC5IO.js → chunk-2UPVIVAA.js} +1 -1
- package/dist/chunks/{chunk-MZLQY2EQ.js → chunk-3DP66SQ4.js} +1 -1
- package/dist/chunks/{chunk-AA434KXY.js → chunk-3GUO6F6P.js} +1 -1
- package/dist/chunks/{chunk-AQUDXMFH.js → chunk-3NNH2U5M.js} +1 -1
- package/dist/chunks/{chunk-FLBI6DY2.js → chunk-5AYB3JRL.js} +1 -1
- package/dist/chunks/{chunk-OUTCLR64.js → chunk-5NXYYFRL.js} +1 -1
- package/dist/chunks/{chunk-BLAIBYEU.js → chunk-5S2NK6K6.js} +1 -1
- package/dist/chunks/{chunk-6JGC4YDH.js → chunk-6CXHR2ND.js} +2 -2
- package/dist/chunks/{chunk-ZLWTPS5T.js → chunk-6QRT6USI.js} +1 -1
- package/dist/chunks/{chunk-ZVLDGT4O.js → chunk-6UCSM3CZ.js} +1 -1
- package/dist/chunks/{chunk-XW4ZWX3I.js → chunk-74QCXPNW.js} +1 -1
- package/dist/chunks/{chunk-CN3IVZJO.js → chunk-7NNENHGN.js} +1 -1
- package/dist/chunks/{chunk-G2IJOQR3.js → chunk-7QQIWMAT.js} +1 -1
- package/dist/chunks/{chunk-HTLGLTKD.js → chunk-ACVDKHVS.js} +1 -1
- package/dist/chunks/chunk-BFRDBBSO.js +7 -0
- package/dist/chunks/{chunk-YTEZO2SZ.js → chunk-BJXMXDBM.js} +1 -1
- package/dist/chunks/{chunk-E6R2QOOR.js → chunk-CITTRAYH.js} +1 -1
- package/dist/chunks/{chunk-YUYCSDCO.js → chunk-CMEEAXVV.js} +1 -1
- package/dist/chunks/{chunk-3E364MJE.js → chunk-D6REP5QQ.js} +1 -1
- package/dist/chunks/chunk-DDLM6CIQ.js +10 -0
- package/dist/chunks/{chunk-6ZRULOO3.js → chunk-DRXOTZSJ.js} +1 -1
- package/dist/chunks/{chunk-JV6IPUGX.js → chunk-DXLLC7ZM.js} +1 -1
- package/dist/chunks/{chunk-IIC2A4YN.js → chunk-GLH4PVMY.js} +1 -1
- package/dist/chunks/{chunk-JCTXRR4A.js → chunk-GVUB6QGX.js} +1 -1
- package/dist/chunks/{chunk-QAETJRKX.js → chunk-HARXQZV3.js} +1 -1
- package/dist/chunks/{chunk-GJP22N6R.js → chunk-JH257EDL.js} +1 -1
- package/dist/chunks/{chunk-U3NQZJQ4.js → chunk-JIGCN5QS.js} +3 -3
- package/dist/chunks/{chunk-OCOVCC5Q.js → chunk-JZ7FDBS4.js} +1 -1
- package/dist/chunks/{chunk-DNTQK2SW.js → chunk-LUJL3KFT.js} +1 -1
- package/dist/chunks/{chunk-26Z4U6G4.js → chunk-LYU4MVL5.js} +2 -2
- package/dist/chunks/{chunk-KKQL4AKH.js → chunk-MPZFMEVK.js} +1 -1
- package/dist/chunks/chunk-MYHJNSCW.js +15 -0
- package/dist/chunks/{chunk-IL7X6EKK.js → chunk-N2TNA2FE.js} +1 -1
- package/dist/chunks/{chunk-444RE4Z5.js → chunk-OHVPJNGY.js} +1 -1
- package/dist/chunks/{chunk-6GIP2YPX.js → chunk-OYMFOCD5.js} +1 -1
- package/dist/chunks/{chunk-QCWV7FML.js → chunk-P5BNAP5T.js} +1 -1
- package/dist/chunks/{chunk-TCYAAWLB.js → chunk-PAOR4MQZ.js} +1 -1
- package/dist/chunks/{chunk-WGOQGKS5.js → chunk-PTI3TP7P.js} +1 -1
- package/dist/chunks/{chunk-QC5AMRWR.js → chunk-QEXSF4NA.js} +1 -1
- package/dist/chunks/{chunk-KGXW36FQ.js → chunk-QOFK5PKB.js} +2 -2
- package/dist/chunks/{chunk-XJXX4QXA.js → chunk-SI7FQJIE.js} +1 -1
- package/dist/chunks/{chunk-GF7EG5IA.js → chunk-TCQZFIBR.js} +1 -1
- package/dist/chunks/{chunk-A63VVXW2.js → chunk-TE2EE7DR.js} +1 -1
- package/dist/chunks/{chunk-WKZ6JSGZ.js → chunk-TKBORMUF.js} +1 -1
- package/dist/chunks/{chunk-GLJH35MJ.js → chunk-TLEBLYBS.js} +1 -1
- package/dist/chunks/{chunk-MMPQC2N6.js → chunk-U73RXMGU.js} +1 -1
- package/dist/chunks/{chunk-BTCKMXWW.js → chunk-UQIVF4Q2.js} +1 -1
- package/dist/chunks/{chunk-6HOVHRWJ.js → chunk-V3RDOM3U.js} +3 -3
- package/dist/chunks/{chunk-GCSAJUL6.js → chunk-VEMJINMZ.js} +1 -1
- package/dist/chunks/{chunk-ELDHGU6N.js → chunk-VLDU2MDL.js} +1 -1
- package/dist/chunks/{chunk-QC3HEGFD.js → chunk-VRAMXFRB.js} +1 -1
- package/dist/chunks/{chunk-TDDZGUU6.js → chunk-VS7O22ED.js} +1 -1
- package/dist/chunks/{chunk-AALI66ML.js → chunk-WCBNKVVG.js} +1 -1
- package/dist/chunks/{chunk-GWZ4VPU3.js → chunk-WN7EJWN4.js} +2 -2
- package/dist/chunks/{chunk-MV4WHUIC.js → chunk-XEBMH33W.js} +1 -1
- package/dist/chunks/chunk-XOETL6DB.js +96 -0
- package/dist/chunks/chunk-XXCWQPAH.js +7 -0
- package/dist/chunks/{chunk-IYCHAIFZ.js → chunk-YQKURZ5W.js} +1 -1
- package/dist/chunks/{chunk-EXPLBM7J.js → chunk-ZDKSDWSO.js} +1 -1
- package/dist/chunks/{chunk-YS542RHZ.js → chunk-ZMY3GQBK.js} +1 -1
- package/dist/chunks/{clear-2VHJFFMM.js → clear-35NUHHDI.js} +1 -1
- package/dist/chunks/{compile-vercel-config-ADKZDUAU.js → compile-vercel-config-UQIYIVA6.js} +1 -1
- package/dist/chunks/{config-VAOXMKVX.js → config-FZD3R5VT.js} +1 -1
- package/dist/chunks/{config-6YWGF4CO.js → config-IQE5C7PZ.js} +1 -1
- package/dist/chunks/{constants-JAB7MRSK.js → constants-ICJL2EO5.js} +1 -1
- package/dist/chunks/{delete-FEUSV3JO.js → delete-6LSSOF4X.js} +1 -1
- package/dist/chunks/{delete-YW2NH7VG.js → delete-IBRCB3S3.js} +1 -1
- package/dist/chunks/{detect-projects-LFEZ7BQU.js → detect-projects-THLTMO7V.js} +1 -1
- package/dist/chunks/{detect-services-A2B6KJO5.js → detect-services-GFVD2C3W.js} +1 -1
- package/dist/chunks/{disable-KA6PS2CZ.js → disable-4TODXYTB.js} +1 -1
- package/dist/chunks/{discard-ZNUPAJTQ.js → discard-WHC5FKWF.js} +1 -1
- package/dist/chunks/edit-3DXOWQMF.js +8 -0
- package/dist/chunks/edit-R2RUDKC4.js +9 -0
- package/dist/chunks/{enable-Q4OCTJIJ.js → enable-2OAHPKCN.js} +1 -1
- package/dist/chunks/{export-UX6JVWOD.js → export-KTLACTAJ.js} +1 -1
- package/dist/chunks/{future-6UTK4EFE.js → future-JZ3RVO4B.js} +1 -1
- package/dist/chunks/{generate-cert-for-deploy-WDKFR34X.js → generate-cert-for-deploy-D4IHTKQS.js} +1 -1
- package/dist/chunks/{image-IL7IN7MD.js → image-UW5U6CRJ.js} +1 -1
- package/dist/chunks/{import-builders-FX2XXVRT.js → import-builders-JONKAYLL.js} +1 -1
- package/dist/chunks/{inspect-E2HPGMNI.js → inspect-2FS4PYBH.js} +1 -1
- package/dist/chunks/{inspect-F6NLCWHN.js → inspect-7IZ7M2TX.js} +1 -1
- package/dist/chunks/{inspect-UPXTGUJQ.js → inspect-JDSFHP6X.js} +1 -1
- package/dist/chunks/{inspect-UNZR445S.js → inspect-PQNECP2Z.js} +1 -1
- package/dist/chunks/{inspect-YAMAGNIW.js → inspect-PWLUWUGV.js} +1 -1
- package/dist/chunks/{list-G4E6RG3V.js → list-2G2BWD4T.js} +1 -1
- package/dist/chunks/{list-GDI5O246.js → list-3N2CBVOG.js} +1 -1
- package/dist/chunks/{list-FDYB6GHF.js → list-Y3OA4KFK.js} +1 -1
- package/dist/chunks/{login-XYYNIAMM.js → login-LLM3Q6GJ.js} +1 -1
- package/dist/chunks/{login-HU5OFS7T.js → login-VQN3F7JU.js} +1 -1
- package/dist/chunks/{logs-EWXTZN4W.js → logs-XEJPLFXM.js} +1 -1
- package/dist/chunks/{ls-MO3R46TQ.js → ls-2DACOWSU.js} +1 -1
- package/dist/chunks/{ls-SZKDUJHV.js → ls-2M7QSW2F.js} +1 -1
- package/dist/chunks/{ls-CGZ3NL5R.js → ls-5YLXAARZ.js} +1 -1
- package/dist/chunks/{ls-A3HIPTF5.js → ls-7DJWHOK4.js} +1 -1
- package/dist/chunks/{ls-TCB7UUPP.js → ls-GY2YLYMD.js} +1 -1
- package/dist/chunks/{ls-A4NEYMKP.js → ls-NJEJSYSO.js} +1 -1
- package/dist/chunks/{ls-3GNX6IPE.js → ls-OAJKYQEL.js} +1 -1
- package/dist/chunks/{mutate-BQAP2S7A.js → mutate-G2I4ISF4.js} +1 -1
- package/dist/chunks/notifications-6MXYY2V6.js +7 -0
- package/dist/chunks/{open-YPOEUM3S.js → open-YKOYB7PH.js} +1 -1
- package/dist/chunks/{openapi-BQSQNXQE.js → openapi-36GMGEXR.js} +1 -1
- package/dist/chunks/{permissions-6LOJKL5W.js → permissions-RRP6IEHS.js} +1 -1
- package/dist/chunks/{prompt-missing-credentials-IGTCFUA6.js → prompt-missing-credentials-WQUF6X6K.js} +1 -1
- package/dist/chunks/{publish-CATCXJZG.js → publish-AQ3FYC3J.js} +1 -1
- package/dist/chunks/{pull-CXUNHWAO.js → pull-HT2MQ3ML.js} +1 -1
- package/dist/chunks/{purchase-domain-if-available-4YKWAHH5.js → purchase-domain-if-available-NDEUZYHK.js} +1 -1
- package/dist/chunks/{push-KZZE3AQ3.js → push-6LE54BCC.js} +1 -1
- package/dist/chunks/{query-GHFOZV7K.js → query-SNY42BTX.js} +1 -1
- package/dist/chunks/{reauthenticate-W7QIXLZ3.js → reauthenticate-4SGT475I.js} +1 -1
- package/dist/chunks/{reorder-XU55LOZ5.js → reorder-SRF3NE5U.js} +1 -1
- package/dist/chunks/{reply-B2XOCSZD.js → reply-6HUIX4AX.js} +1 -1
- package/dist/chunks/{resolve-H4BZ2QI3.js → resolve-TNBNGA3G.js} +1 -1
- package/dist/chunks/{resolve-agent-team-43HZCPF3.js → resolve-agent-team-XSXRT42F.js} +1 -1
- package/dist/chunks/{restore-AJLS2N6C.js → restore-HK4SWMZP.js} +1 -1
- package/dist/chunks/{rm-2TR2KBDP.js → rm-4VXZ3AIX.js} +1 -1
- package/dist/chunks/{rm-ZQUVOC3V.js → rm-ESSU4MS4.js} +1 -1
- package/dist/chunks/{rm-OI5VS7GG.js → rm-EWPYZXTX.js} +1 -1
- package/dist/chunks/{rm-N6ZUA66Z.js → rm-GNDGYUKQ.js} +1 -1
- package/dist/chunks/{rm-IGY6LD6H.js → rm-SKCAZTYN.js} +1 -1
- package/dist/chunks/{routes-TCMUHSJF.js → routes-LK2HUGAK.js} +1 -1
- package/dist/chunks/{rule-inspect-NLEABBTP.js → rule-inspect-RHHD5UIR.js} +1 -1
- package/dist/chunks/{rules-SVLVB6YB.js → rules-FF5FU7BV.js} +1 -1
- package/dist/chunks/{schema-KG4RWQBC.js → schema-HIKNWMV2.js} +1 -1
- package/dist/chunks/{schema-HWS2SOZS.js → schema-QHZO72DB.js} +1 -1
- package/dist/chunks/{select-org-AAB5RBSB.js → select-org-CK5CWC3A.js} +1 -1
- package/dist/chunks/{set-AJEMEBZU.js → set-5P44OPZP.js} +1 -1
- package/dist/chunks/{setup-and-link-6AIRWXXX.js → setup-and-link-OLSKD2HE.js} +1 -1
- package/dist/chunks/{tags-O6R6VWPP.js → tags-35DFWGDC.js} +1 -1
- package/dist/chunks/{types-Y3NJROKH.js → types-77UW6BI4.js} +1 -1
- package/dist/chunks/{update-C7XR7CHI.js → update-WHBFIV22.js} +1 -1
- package/dist/commands/build/index.js +1 -1
- package/dist/commands/deploy/index.js +13 -13
- package/dist/commands/dev/index.js +14 -101
- 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 +35 -33
- 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 +57 -55
- package/dist/chunks/chunk-2FHICLHJ.js +0 -7
- package/dist/chunks/chunk-BAT6SDBJ.js +0 -10
- package/dist/chunks/chunk-H7CRPXOA.js +0 -14
- package/dist/chunks/chunk-ZE53XHAY.js +0 -7
- package/dist/chunks/edit-D7VE55ZF.js +0 -9
- package/dist/chunks/edit-YTYYBVZN.js +0 -8
- package/dist/chunks/notifications-TDSFYYNB.js +0 -7
|
@@ -4,7 +4,7 @@ import { dirname as __dirname_ } from 'node:path';
|
|
|
4
4
|
const require = __createRequire(import.meta.url);
|
|
5
5
|
const __filename = __fileURLToPath(import.meta.url);
|
|
6
6
|
const __dirname = __dirname_(__filename);
|
|
7
|
-
import{humanReadableColumnLabel}from"./chunk-GHAY4PSD.js";import{FETCH_TIMEOUT_MS,OpenApiCache,SSO_API_URL,assertAllowedSpecUrl,readSpecResponse}from"./chunk-GLJH35MJ.js";import{apiCommand,listSubcommand}from"./chunk-LD5U73LA.js";import{help}from"./chunk-H3KYG32S.js";import{table}from"./chunk-773GOZIR.js";import{printError}from"./chunk-QAETJRKX.js";import{validateJsonOutput}from"./chunk-D4MW3RDW.js";import{TelemetryClient}from"./chunk-KUGXOLL7.js";import{require_ms}from"./chunk-MXTC4ZAQ.js";import{parseArguments}from"./chunk-ELDHGU6N.js";import{getFlagsSpecification}from"./chunk-MI7W4QMV.js";import{packageName}from"./chunk-JESNVRVR.js";import{output_manager_default}from"./chunk-M774HRX5.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-TLEBLYBS.js";import{apiCommand,listSubcommand}from"./chunk-LD5U73LA.js";import{help}from"./chunk-H3KYG32S.js";import{table}from"./chunk-773GOZIR.js";import{printError}from"./chunk-HARXQZV3.js";import{validateJsonOutput}from"./chunk-D4MW3RDW.js";import{TelemetryClient}from"./chunk-KUGXOLL7.js";import{require_ms}from"./chunk-MXTC4ZAQ.js";import{parseArguments}from"./chunk-VLDU2MDL.js";import{getFlagsSpecification}from"./chunk-MI7W4QMV.js";import{packageName}from"./chunk-JESNVRVR.js";import{output_manager_default}from"./chunk-M774HRX5.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+`
|
|
@@ -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{js_yaml_default}from"./chunk-V6Y6UK6B.js";import{require_minimatch}from"./chunk-
|
|
7
|
+
import{js_yaml_default}from"./chunk-V6Y6UK6B.js";import{require_minimatch}from"./chunk-5S2NK6K6.js";import{pullEnvRecords}from"./chunk-ZMY3GQBK.js";import{output_manager_default}from"./chunk-M774HRX5.js";import{__toESM}from"./chunk-BZENIQ7N.js";var INTEGRATIONS_POLL_INTERVAL_MS=5e3,INTEGRATIONS_POLL_TIMEOUT_MS=3*60*1e3;async function fetchDeploymentBuildEnv(client,deploymentId,{quiet=!1}={}){let deadline=Date.now()+INTEGRATIONS_POLL_TIMEOUT_MS,isPolling=!1;for(;Date.now()<deadline;)try{return await pullEnvRecords(client,deploymentId,"vercel-cli:pull")}catch(err){if(err&&typeof err=="object"&&"integrationsStatus"in err&&err.integrationsStatus==="pending"){!isPolling&&!quiet&&(output_manager_default.spinner("Waiting for deployment integrations to finish provisioning..."),isPolling=!0),await new Promise(resolve=>setTimeout(resolve,INTEGRATIONS_POLL_INTERVAL_MS));continue}throw err}throw new Error("Timed out waiting for deployment integrations to complete provisioning.")}import{existsSync,readFileSync}from"node:fs";import{dirname,join,parse,relative}from"node:path";var import_minimatch=__toESM(require_minimatch(),1);function findWorkspaceRootCandidates(startDir){let{root}=parse(startDir),candidates=[],dir=startDir;for(let i=0;i<64;i++){let type=workspaceTypeOf(dir);if(type&&candidates.unshift({dir,type}),dir===root)break;let parent=dirname(dir);if(parent===dir)break;dir=parent}return candidates}function workspaceTypeOf(dir){if(existsSync(join(dir,"pnpm-workspace.yaml")))return"pnpm";let pkgPath=join(dir,"package.json");if(existsSync(pkgPath))try{let pkg=JSON.parse(readFileSync(pkgPath,"utf8")),{workspaces}=pkg;if(Array.isArray(workspaces)&&workspaces.length>0||workspaces&&typeof workspaces=="object"&&Array.isArray(workspaces.packages)&&workspaces.packages.length>0)return"npm"}catch{}return null}function readWorkspacePatterns(candidate){try{if(candidate.type==="pnpm"){let packages2=js_yaml_default.load(readFileSync(join(candidate.dir,"pnpm-workspace.yaml"),"utf8"))?.packages;return Array.isArray(packages2)?packages2.filter(p=>typeof p=="string"):null}let pkg=JSON.parse(readFileSync(join(candidate.dir,"package.json"),"utf8")),{workspaces}=pkg,packages=Array.isArray(workspaces)?workspaces:workspaces?.packages;return Array.isArray(packages)?packages.filter(p=>typeof p=="string"):null}catch{return null}}function workspaceClaims(candidate,memberDir){let rel=normalizeRelative(relative(candidate.dir,memberDir));if(rel==="")return!1;let patterns=readWorkspacePatterns(candidate);if(!patterns||patterns.length===0)return!1;let positives=[],negatives=[];for(let pattern of patterns)pattern.startsWith("!")?negatives.push(normalizeRelative(pattern.slice(1))):positives.push(normalizeRelative(pattern));let matches=pattern=>(0,import_minimatch.default)(rel,pattern,{dot:!1});return!positives.some(matches)||negatives.some(matches)?!1:existsSync(join(memberDir,"package.json"))}function resolvePerDirectoryLinkRoot(anchorDir,rootDirectorySetting){let repoRoot=anchorDir;for(let candidate of findWorkspaceRootCandidates(anchorDir))if(workspaceClaims(candidate,anchorDir)){repoRoot=candidate.dir;break}let linkLocation=normalizeRelative(relative(repoRoot,anchorDir));if(linkLocation==="")return{repoRoot,resolvedRootDirectory:""};let setting=normalizeRelative(rootDirectorySetting??"");return setting===""?{repoRoot,resolvedRootDirectory:linkLocation}:existsSync(join(anchorDir,setting))?{repoRoot,resolvedRootDirectory:normalizeRelative(relative(repoRoot,join(anchorDir,setting)))}:{repoRoot,resolvedRootDirectory:linkLocation,advisory:`Ignoring "rootDirectory" setting "${setting}" for the project linked in "${anchorDir}": "${join(anchorDir,setting)}" does not exist, so the build will use the linked directory "${linkLocation}" instead. Remove the "rootDirectory" setting, or configure it at the repository root.`}}function normalizeRelative(p){let normalized=p.replace(/\\/g,"/").replace(/^\.\//,"").replace(/^\/+/,"").replace(/\/+$/,"");return normalized==="."?"":normalized}export{fetchDeploymentBuildEnv,resolvePerDirectoryLinkRoot};
|
|
@@ -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
|
-
var SENTRY_DSN=
|
|
7
|
+
var SENTRY_DSN=void 0,BUILD_LABEL=void 0;export{SENTRY_DSN,BUILD_LABEL};
|
|
@@ -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{getGlobalPathConfig}from"./chunk-
|
|
7
|
+
import{getGlobalPathConfig}from"./chunk-XEBMH33W.js";import{output_manager_default}from"./chunk-M774HRX5.js";var OPENAPI_URL="https://openapi.vercel.sh/",SSO_API_URL="https://vercel.com/sso-api",CACHE_FILE="openapi-spec.json",CACHE_TTL_MS=864e5,FETCH_TIMEOUT_MS=1e4,MAX_OPENAPI_SPEC_BYTES=52428800,VERCEL_CLI_ROOT_DISPLAY_KEY="__root__";async function readSpecResponse(response,url,maxBytes=52428800){let contentLength=response.headers.get("content-length");if(contentLength){let bytes=Number(contentLength);if(Number.isFinite(bytes)&&bytes>maxBytes)throw new Error(`OpenAPI spec from ${url} exceeds the ${maxBytes} byte limit.`)}if(!response.body)throw new Error(`OpenAPI spec from ${url} returned an empty response.`);let reader=response.body.getReader(),chunks=[],totalBytes=0;for(;;){let{done,value}=await reader.read();if(done)break;if(value){if(totalBytes+=value.byteLength,totalBytes>maxBytes)throw await reader.cancel(),new Error(`OpenAPI spec from ${url} exceeds the ${maxBytes} byte limit.`);chunks.push(value)}}let buffer=new Uint8Array(totalBytes),offset=0;for(let chunk of chunks)buffer.set(chunk,offset),offset+=chunk.byteLength;return JSON.parse(new TextDecoder().decode(buffer))}var ALLOWED_SPEC_HOSTS=["vercel.sh","vercel.tools"];function assertAllowedSpecUrl(specUrl){let parsedUrl=new URL(specUrl);if(parsedUrl.protocol!=="https:")throw new Error("OpenAPI spec URL must use https");if(!ALLOWED_SPEC_HOSTS.some(host=>isHostOrSubdomain(parsedUrl,host)))throw new Error("OpenAPI spec URL must be on an allowed origin.");return parsedUrl}function isHostOrSubdomain(url,host){return url.hostname===host||url.hostname.endsWith(`.${host}`)}import{join}from"path";import{readFile,writeFile,mkdir}from"fs/promises";var OpenApiCache=class{constructor(options){this.spec=null;this.error=null;this.cachePath=join(getGlobalPathConfig(),CACHE_FILE),this.specUrl=options?.specUrl,this.fetchSpecUrl=options?.fetchSpecUrl}get isLoaded(){return this.spec!==null}get loadError(){return this.error}async load(forceRefresh=!1){return this.loadSpec(forceRefresh)}async loadSpec(forceRefresh=!1){if(this.error=null,this.specUrl)return this.loadCustomSpec(this.specUrl);if(!forceRefresh){let cached=await this.readCache(this.cachePath);if(cached&&!this.isExpired(cached.fetchedAt))return output_manager_default.debug("Using cached OpenAPI spec"),this.spec=cached.spec,!0}try{return output_manager_default.debug("Fetching OpenAPI spec from "+OPENAPI_URL),this.spec=await this.fetchSpec(OPENAPI_URL),await this.saveCache(this.cachePath,this.spec),!0}catch(err){output_manager_default.debug(`Failed to fetch OpenAPI spec: ${err}`);let stale=await this.readCache(this.cachePath);return stale?(output_manager_default.debug("Using stale cached OpenAPI spec"),this.spec=stale.spec,!0):!1}}async loadCustomSpec(specUrl){try{assertAllowedSpecUrl(specUrl),output_manager_default.debug("Fetching OpenAPI spec from "+specUrl);let spec=this.fetchSpecUrl?await this.fetchSpecUrl(specUrl):await this.fetchSpec(specUrl);return spec?(this.validateSpec(spec,specUrl),this.spec=spec,!!this.spec):(this.error=`Could not load OpenAPI spec from ${specUrl}.`,!1)}catch(err){let message=err instanceof Error?err.message:String(err);return this.error=message,output_manager_default.debug(`Failed to fetch OpenAPI spec from ${specUrl}: ${message}`),!1}}async loadWithSpinner(forceRefresh=!1){output_manager_default.spinner(forceRefresh?"Refreshing API endpoints...":"Loading API endpoints...");let success=await this.load(forceRefresh);return output_manager_default.stopSpinner(),success}getEndpoints(){this.ensureLoaded();let endpoints=this.extractEndpoints();return this.sortEndpoints(endpoints)}getBodyFields(endpoint){if(this.ensureLoaded(),!endpoint.requestBody?.content)return[];let jsonContent=endpoint.requestBody.content["application/json"];if(!jsonContent?.schema)return[];let schema=this.resolveSchemaRef(jsonContent.schema);if(!schema?.properties)return[];let requiredFields=new Set(schema.required||[]),fields=[];for(let[name,propSchema]of Object.entries(schema.properties)){let resolvedProp=this.resolveSchemaRef(propSchema),enumValues=resolvedProp?.enum||propSchema.enum;if(!enumValues&&(resolvedProp?.type==="array"||propSchema.type==="array")){let items=resolvedProp?.items||propSchema.items;items&&(enumValues=this.resolveSchemaRef(items)?.enum||items.enum)}fields.push({name,required:requiredFields.has(name),description:resolvedProp?.description||propSchema.description,type:resolvedProp?.type||propSchema.type,enumValues})}return fields.sort((a,b)=>a.required!==b.required?a.required?-1:1:a.name.localeCompare(b.name)),fields}getDisplayColumns(endpoint){this.ensureLoaded();let pathItem=this.spec.paths[endpoint.path];if(!pathItem)return null;let operation=pathItem[endpoint.method.toLowerCase()];if(!operation?.responses)return null;let ok=operation.responses[200]||operation.responses[201];if(!ok)return null;let jsonContent=ok.content?.["application/json"];return jsonContent?.schema?this.findDisplayColumns(jsonContent.schema):null}findDisplayColumns(schema){let xCli=schema["x-vercel-cli"];if(xCli?.displayColumns)return xCli.displayColumns;for(let key of["oneOf","allOf","anyOf"]){let variants=schema[key];if(variants)for(let sub of variants){let found=this.findDisplayColumns(sub);if(found)return found}}return null}ensureLoaded(){if(!this.spec)throw new Error("OpenAPI spec not loaded. Call load() or loadWithSpinner() first.")}async readCache(cachePath){try{let content=await readFile(cachePath,"utf-8");return JSON.parse(content)}catch{return null}}async saveCache(cachePath,spec){let cached={fetchedAt:Date.now(),spec},dir=join(cachePath,"..");await mkdir(dir,{recursive:!0}),await writeFile(cachePath,JSON.stringify(cached)),output_manager_default.debug("Saved OpenAPI spec to cache")}async fetchSpec(url){let controller=new AbortController,timeoutId=setTimeout(()=>controller.abort(),1e4);try{let response=await fetch(url,{signal:controller.signal});if(!response.ok)throw new Error(`Failed to fetch OpenAPI spec: ${response.status}`);let spec=await readSpecResponse(response,url);return this.validateSpec(spec,url),spec}finally{clearTimeout(timeoutId)}}validateSpec(spec,url){if(!spec||typeof spec!="object")throw new Error(`Invalid OpenAPI spec from ${url}: expected a JSON object.`);if(typeof spec.openapi!="string"||!spec.openapi.startsWith("3."))throw new Error(`Invalid OpenAPI spec from ${url}: expected an OpenAPI 3.x document with an "openapi" field.`);if(!spec.paths||typeof spec.paths!="object")throw new Error(`Invalid OpenAPI spec from ${url}: expected a "paths" object.`);for(let path of Object.keys(spec.paths))if(!path.startsWith("/")||path.startsWith("//"))throw new Error(`Invalid OpenAPI spec from ${url}: path "${path}" must be a relative API path.`)}isExpired(fetchedAt){return Date.now()-fetchedAt>864e5}sortEndpoints(endpoints){return endpoints.sort((a,b)=>{let pathCompare=a.path.localeCompare(b.path);return pathCompare!==0?pathCompare:a.method.localeCompare(b.method)})}extractEndpoints(){let endpoints=[];for(let[path,pathItem]of Object.entries(this.spec.paths)){let methods=["get","post","put","patch","delete"];for(let method of methods){let operation=pathItem[method];if(operation){let pathParams=pathItem.parameters||[],opParams=operation.parameters||[],allParams=[...pathParams,...opParams];endpoints.push({path,method:method.toUpperCase(),summary:operation.summary||pathItem.summary||"",description:operation.description||pathItem.description||"",operationId:operation.operationId||"",tags:operation.tags||[],parameters:allParams,requestBody:operation.requestBody})}}}return endpoints}resolveSchemaRef(schema,spec=this.spec){if(schema){if(schema.$ref){let match=schema.$ref.match(/^#\/components\/schemas\/(.+)$/);if(match&&spec.components?.schemas){let resolved=spec.components.schemas[match[1]];return this.resolveSchemaRef(resolved,spec)}return}if(schema.allOf&&schema.allOf.length>0){let merged={type:"object",properties:{},required:[]};for(let subSchema of schema.allOf){let resolved=this.resolveSchemaRef(subSchema,spec);resolved&&(resolved.properties&&(merged.properties={...merged.properties,...resolved.properties}),resolved.required&&(merged.required=[...merged.required||[],...resolved.required]))}return merged}return schema}}};async function matchesCliApiTag(tagHint){if(!tagHint||tagHint.startsWith("-")||tagHint.includes("/"))return!1;let cache=new OpenApiCache;if(!await cache.load())return!1;let endpoints=cache.getEndpoints(),lower=tagHint.toLowerCase();return endpoints.some(ep=>ep.tags.some(t=>t.toLowerCase()===lower))}async function resolveOpenApiTagForProjectsCli(){return await matchesCliApiTag("projects")?"projects":await matchesCliApiTag("project")?"project":null}async function resolveOpenApiTagForTeamsCli(){return await matchesCliApiTag("teams")?"teams":await matchesCliApiTag("team")?"team":null}export{OPENAPI_URL,SSO_API_URL,CACHE_FILE,CACHE_TTL_MS,FETCH_TIMEOUT_MS,MAX_OPENAPI_SPEC_BYTES,VERCEL_CLI_ROOT_DISPLAY_KEY,readSpecResponse,assertAllowedSpecUrl,OpenApiCache,matchesCliApiTag,resolveOpenApiTagForProjectsCli,resolveOpenApiTagForTeamsCli};
|
|
@@ -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{isNativeBinaryInstall}from"./chunk-NWGBDBZI.js";import{require_lib}from"./chunk-
|
|
7
|
+
import{isNativeBinaryInstall}from"./chunk-NWGBDBZI.js";import{require_lib}from"./chunk-JIGCN5QS.js";import{packageName}from"./chunk-JESNVRVR.js";import{__toESM}from"./chunk-BZENIQ7N.js";var import_fs_extra=__toESM(require_lib(),1);import{join as join2,sep}from"path";import{execFile}from"child_process";import{tmpdir}from"node:os";import{resolve}from"node:path";var trustedUpgradeEnvironment=Object.freeze({...process.env}),trustedUpgradeDirectory=resolve(tmpdir());import{join}from"path";var packageManagers={npm:{metadataArgs:specifier=>["view",specifier,"version","--json","--global"],installArgs:specifier=>["i","-g",specifier],releaseAgeBypassArgs:["--min-release-age=0"],globalDetection:{args:["root","-g"],packageDir:(root,pkg)=>join(root,pkg)}},pnpm:{metadataArgs:specifier=>["view",specifier,"version","--json"],installArgs:specifier=>["i","-g",specifier],releaseAgeBypassArgs:["--config.minimumReleaseAge=0"],globalDetection:{args:pkg=>["list","-g",pkg,"--depth=0","--json"],packageDir:(output,pkg)=>{try{let projects=JSON.parse(output),path=(Array.isArray(projects)?projects[0]:projects)?.dependencies?.[pkg]?.path;return typeof path=="string"?path:void 0}catch{return}}}},yarn:{metadataArgs:specifier=>["info",specifier.endsWith("@latest")?specifier.slice(0,-7):specifier,"version","--json"],installArgs:specifier=>["global","add",specifier],releaseAgeBypassArgs:[],globalDetection:{args:["--silent","global","dir"],packageDir:(root,pkg)=>join(root,"node_modules",pkg)}},bun:{metadataArgs:specifier=>["info",specifier,"version","--json","--global"],installArgs:specifier=>["add","-g",specifier],releaseAgeBypassArgs:[],globalDetection:{args:["pm","bin","-g"],binaryNames:["vercel","vc"]}}};function getUpgradePackageManager(name){return packageManagers[name]}var UnsupportedUpgradeInstallError=class extends Error{},globalCliTypes=["npm","pnpm","yarn","bun"];function throwIfAborted(signal){if(signal?.aborted)throw signal.reason instanceof Error?signal.reason:new Error("Package manager detection was aborted")}async function getPackageManagerGlobalRoot(cliType,pkg,env=trustedUpgradeEnvironment,signal){try{let detectionArgs=getUpgradePackageManager(cliType).globalDetection.args;return(await new Promise((resolve2,reject)=>{execFile(cliType,typeof detectionArgs=="function"?detectionArgs(pkg):detectionArgs,{encoding:"utf8",windowsHide:!0,cwd:trustedUpgradeDirectory,timeout:15e3,env:{...env},signal},(error,stdout2)=>{error?reject(error):resolve2(stdout2)})})).trim()||null}catch{return throwIfAborted(signal),null}}async function detectGlobalPackageManager(installPath,pkg,cliTypes=globalCliTypes,env=trustedUpgradeEnvironment,signal){for(let cliType of cliTypes){throwIfAborted(signal);let root=await getPackageManagerGlobalRoot(cliType,pkg,env,signal);if(!root)continue;let detection=getUpgradePackageManager(cliType).globalDetection;if(detection.packageDir)try{let packageDir=detection.packageDir(root,pkg);if(!packageDir)continue;let resolvedPackageDir=await(0,import_fs_extra.realpath)(packageDir);if(installPath===resolvedPackageDir||installPath.startsWith(resolvedPackageDir+sep))return cliType}catch{}for(let binary of detection.binaryNames||[])try{let target=await(0,import_fs_extra.realpath)(join2(root,binary));if(target===installPath||target.startsWith(installPath+sep)||installPath.startsWith(target+sep))return cliType;let entrypoint=await(0,import_fs_extra.realpath)(process.argv[1]);if(!isNativeBinaryInstall()&&target===entrypoint)return cliType}catch{}}return null}async function resolveInstall(env=trustedUpgradeEnvironment,signal){throwIfAborted(signal);let nativeExecutable=isNativeBinaryInstall()&&env.VERCEL_CLI_PACKAGE_EXECUTABLE,resolvedNativeExecutable=nativeExecutable&&await(0,import_fs_extra.realpath)(nativeExecutable).catch(()=>null),entrypoint=resolvedNativeExecutable&&resolvedNativeExecutable===await(0,import_fs_extra.realpath)(process.execPath).catch(()=>null)?env.VERCEL_CLI_PACKAGE_ENTRYPOINT:process.argv[1],installPath=entrypoint&&await(0,import_fs_extra.realpath)(entrypoint).catch(()=>null);if(!installPath)throw new UnsupportedUpgradeInstallError("Could not resolve this Vercel CLI installation. Update it with the package manager that installed it.");let packageManager=await detectGlobalPackageManager(installPath,packageName,globalCliTypes,env,signal);if(!packageManager)throw new UnsupportedUpgradeInstallError("Could not detect a supported global npm, pnpm, Yarn, or Bun installation of Vercel CLI. Update it with the package manager that installed it.");return{packageManager,global:!0,assumed:!1}}async function isGlobal(){try{return await resolveInstall(),!0}catch{return!1}}async function getUpdateCommandInfo(env=trustedUpgradeEnvironment,signal){let{packageManager}=await resolveInstall(env,signal),args=getUpgradePackageManager(packageManager).installArgs(`${packageName}@latest`),allowBuild=pnpmAllowBuildFlag(packageManager,"esbuild");return{command:`${packageManager} ${args.join(" ")}${allowBuild}`,global:!0,packageManager,assumed:!1}}function pnpmAllowBuildFlag(cliType,pkg){return cliType==="pnpm"?` --allow-build=${pkg}`:""}async function getUpdateCommand(){return(await getUpdateCommandInfo()).command}export{trustedUpgradeEnvironment,trustedUpgradeDirectory,getUpgradePackageManager,isGlobal,getUpdateCommandInfo,getUpdateCommand};
|
|
@@ -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{jsonOption,projectOption,yesOption}from"./chunk-MI7W4QMV.js";import{packageName}from"./chunk-JESNVRVR.js";var listSubcommand={name:"list",aliases:["ls"],description:"List all routing rules for the current project. These routes apply to all deployments and environments.",arguments:[],options:[projectOption,jsonOption,{name:"search",description:"Search by name, description, source, or destination",shorthand:"s",type:String,argument:"QUERY",deprecated:!1},{name:"filter",description:"Filter by type: rewrite, redirect, set_status, transform",shorthand:"f",type:String,argument:"TYPE",deprecated:!1},{name:"production",description:"List routes from the live production version",shorthand:null,type:Boolean,deprecated:!1},{name:"version-id",description:"List routes from a specific version ID",shorthand:null,type:String,argument:"VERSION_ID",deprecated:!1},{name:"diff",description:"Compare staged changes against production. Use with --version-id to compare a specific version.",shorthand:null,type:Boolean,deprecated:!1},{name:"expand",description:"Show expanded details for each route",shorthand:"e",type:Boolean,deprecated:!1}],examples:[{name:"List all routes",value:`${packageName} routes list`},{name:"Search for routes",value:`${packageName} routes list --search "api"`},{name:"Filter by type",value:`${packageName} routes list --filter rewrite`},{name:"Show staged changes",value:`${packageName} routes list --diff`},{name:"Show live production routes",value:`${packageName} routes list --production`},{name:"Show expanded details",value:`${packageName} routes list --expand`}]},listVersionsSubcommand={name:"list-versions",aliases:["ls-versions"],description:"List all versions of routing rules",arguments:[],options:[projectOption,jsonOption,{name:"count",description:"Number of versions to fetch (default: 20, max: 100)",shorthand:null,type:Number,argument:"NUMBER",deprecated:!1}],examples:[{name:"List route versions",value:`${packageName} routes list-versions`},{name:"List more versions",value:`${packageName} routes list-versions --count 50`}]},inspectSubcommand={name:"inspect",aliases:[],description:"Show detailed information about a specific route",arguments:[{name:"name-or-id",required:!0}],options:[projectOption,jsonOption,{name:"diff",description:"Compare staged changes against production for this route",shorthand:null,type:Boolean,deprecated:!1}],examples:[{name:"Inspect a route by name",value:`${packageName} routes inspect "API rewrite"`},{name:"Inspect a route by ID",value:`${packageName} routes inspect abc123`},{name:"Show staged changes for a route",value:`${packageName} routes inspect "My route" --diff`}]},addSubcommand={name:"add",aliases:[],description:"Add a new routing rule to the project",arguments:[{name:"name",required:!1}],options:[projectOption,{name:"src",description:"Path pattern (required in non-interactive mode)",shorthand:null,type:String,argument:"PATTERN",deprecated:!1},{name:"src-syntax",description:"Path syntax: regex (default), path-to-regexp, equals",shorthand:null,type:String,argument:"TYPE",deprecated:!1},{name:"action",description:"Action type: rewrite, redirect, or set-status (required with --dest/--status)",shorthand:null,type:String,argument:"TYPE",deprecated:!1},{name:"dest",description:"Destination URL for rewrite or redirect",shorthand:null,type:String,argument:"URL",deprecated:!1},{name:"status",description:"Status code (301/302/307/308 for redirect, or any for set-status)",shorthand:null,type:Number,argument:"CODE",deprecated:!1},{name:"set-response-header",description:"Set response header: key=value (repeatable)",shorthand:null,type:[String],argument:"HEADER",deprecated:!1},{name:"append-response-header",description:"Append to response header: key=value (repeatable)",shorthand:null,type:[String],argument:"HEADER",deprecated:!1},{name:"delete-response-header",description:"Delete response header: key (repeatable)",shorthand:null,type:[String],argument:"KEY",deprecated:!1},{name:"set-request-header",description:"Set request header: key=value (repeatable)",shorthand:null,type:[String],argument:"HEADER",deprecated:!1},{name:"append-request-header",description:"Append to request header: key=value (repeatable)",shorthand:null,type:[String],argument:"HEADER",deprecated:!1},{name:"delete-request-header",description:"Delete request header: key (repeatable)",shorthand:null,type:[String],argument:"KEY",deprecated:!1},{name:"set-request-query",description:"Set query parameter: key=value (repeatable)",shorthand:null,type:[String],argument:"PARAM",deprecated:!1},{name:"append-request-query",description:"Append to query parameter: key=value (repeatable)",shorthand:null,type:[String],argument:"PARAM",deprecated:!1},{name:"delete-request-query",description:"Delete query parameter: key (repeatable)",shorthand:null,type:[String],argument:"KEY",deprecated:!1},{name:"has",description:"Condition that must match: type:key or type:key:value (repeatable)",shorthand:null,type:[String],argument:"CONDITION",deprecated:!1},{name:"missing",description:'"Does not have" condition: type:key or type:key:value (repeatable)',shorthand:null,type:[String],argument:"CONDITION",deprecated:!1},{name:"description",description:"Route description (max 1024 chars)",shorthand:null,type:String,argument:"TEXT",deprecated:!1},{name:"disabled",description:"Create route in disabled state",shorthand:null,type:Boolean,deprecated:!1},{name:"ai",description:"Generate route from a natural language description (AI-powered)",shorthand:null,type:String,argument:"PROMPT",deprecated:!1},{name:"position",description:"Position: start, end, after:<id>, before:<id>",shorthand:null,type:String,argument:"POSITION",deprecated:!1},{name:"yes",description:"Skip confirmation prompts",shorthand:"y",type:Boolean,deprecated:!1}],examples:[{name:"Interactive mode",value:`${packageName} routes add`},{name:"Create with AI",value:`${packageName} routes add --ai "Rewrite /api/* to https://backend.internal/*"`},{name:"Add a rewrite",value:`${packageName} routes add "API Proxy" --src "/api/:path*" --src-syntax path-to-regexp --action rewrite --dest "https://api.example.com/:path*" --yes`},{name:"Add a redirect",value:`${packageName} routes add "Old Blog" --src "/blog" --src-syntax equals --action redirect --dest "/articles" --status 301 --yes`},{name:"Add CORS headers",value:`${packageName} routes add "CORS" --src "^/api/.*$" --set-response-header "Access-Control-Allow-Origin=*" --yes`},{name:"Block access (set status)",value:`${packageName} routes add "Block Admin" --src "^/admin/.*$" --action set-status --status 403 --yes`},{name:"Conditional redirect",value:`${packageName} routes add "Auth Required" --src "/protected/:path*" --src-syntax path-to-regexp --action redirect --dest "/login" --status 307 --missing "cookie:session" --yes`},{name:"Rewrite with request headers",value:`${packageName} routes add "Backend Proxy" --src "/backend/:path*" --src-syntax path-to-regexp --action rewrite --dest "https://internal.example.com/:path*" --set-request-header "X-Forwarded-Host=myapp.com" --yes`},{name:"Add route at start",value:`${packageName} routes add "Priority Route" --src "/priority" --src-syntax equals --action rewrite --dest "/handler" --position start --yes`}]},publishSubcommand={name:"publish",aliases:[],description:"Publish all staged routing changes to production",arguments:[],options:[projectOption,{...yesOption,description:"Skip the confirmation prompt when publishing"}],examples:[{name:"Publish staged changes",value:`${packageName} routes publish`},{name:"Publish without confirmation",value:`${packageName} routes publish --yes`}]},restoreSubcommand={name:"restore",aliases:[],description:"Restore a previous routing version to production",arguments:[{name:"version-id",required:!0}],options:[projectOption,{...yesOption,description:"Skip the confirmation prompt when restoring"}],examples:[{name:"Restore a previous version",value:`${packageName} routes restore <version-id>`},{name:"Restore without confirmation",value:`${packageName} routes restore <version-id> --yes`}]},discardSubcommand={name:"discard-staging",aliases:[],description:"Discard staged routing changes",arguments:[],options:[projectOption,{...yesOption,description:"Skip the confirmation prompt when discarding"}],examples:[{name:"Discard staged changes",value:`${packageName} routes discard-staging`},{name:"Discard without confirmation",value:`${packageName} routes discard-staging --yes`}]},deleteSubcommand={name:"delete",aliases:["rm"],description:"Delete one or more routing rules",arguments:[{name:"name-or-id",required:!0,multiple:!0}],options:[projectOption,{...yesOption,description:"Skip the confirmation prompt when deleting"}],examples:[{name:"Delete a route by name",value:`${packageName} routes delete "Old Redirect"`},{name:"Delete a route by ID",value:`${packageName} routes delete abc123`},{name:"Delete multiple routes",value:`${packageName} routes delete "Route A" "Route B"`},{name:"Delete without confirmation",value:`${packageName} routes delete "Old Route" --yes`}]},enableSubcommand={name:"enable",aliases:[],description:"Enable a disabled routing rule",arguments:[{name:"name-or-id",required:!0}],options:[projectOption],examples:[{name:"Enable a route by name",value:`${packageName} routes enable "API Proxy"`},{name:"Enable a route by ID",value:`${packageName} routes enable abc123`}]},disableSubcommand={name:"disable",aliases:[],description:"Disable a routing rule without deleting it",arguments:[{name:"name-or-id",required:!0}],options:[projectOption],examples:[{name:"Disable a route by name",value:`${packageName} routes disable "API Proxy"`},{name:"Disable a route by ID",value:`${packageName} routes disable abc123`}]},reorderSubcommand={name:"reorder",aliases:["move"],description:"Move a routing rule to a different position",arguments:[{name:"name-or-id",required:!0}],options:[projectOption,{name:"position",description:"Target position: start, end, a number (1-based), before:<id>, after:<id>",shorthand:null,type:String,argument:"POSITION",deprecated:!1},{name:"first",description:"Move to the first position (highest priority)",shorthand:null,type:Boolean,deprecated:!1},{name:"last",description:"Move to the last position (lowest priority)",shorthand:null,type:Boolean,deprecated:!1},{...yesOption,description:"Skip the confirmation prompt when reordering"}],examples:[{name:"Move to first position",value:`${packageName} routes reorder "Catch All" --first`},{name:"Move to last position",value:`${packageName} routes reorder "Catch All" --last`},{name:"Move to a specific position",value:`${packageName} routes reorder "API Proxy" --position 3`},{name:"Move after another route",value:`${packageName} routes reorder "API Proxy" --position after:route-id-123`},{name:"Interactive reorder (prompts for position)",value:`${packageName} routes reorder "API Proxy"`}]},editSubcommand={name:"edit",aliases:[],description:"Edit an existing routing rule",arguments:[{name:"name-or-id",required:!0}],options:[projectOption,{name:"name",description:"Change route name",shorthand:null,type:String,argument:"NAME",deprecated:!1},{name:"description",description:'Change description (use "" to clear)',shorthand:null,type:String,argument:"TEXT",deprecated:!1},{name:"src",description:"Change source path pattern",shorthand:null,type:String,argument:"PATTERN",deprecated:!1},{name:"src-syntax",description:"Change path syntax: regex, path-to-regexp, equals",shorthand:null,type:String,argument:"TYPE",deprecated:!1},{name:"action",description:"Set action type: rewrite, redirect, or set-status (required when switching types)",shorthand:null,type:String,argument:"TYPE",deprecated:!1},{name:"dest",description:"Set destination URL",shorthand:null,type:String,argument:"URL",deprecated:!1},{name:"status",description:"Set status code",shorthand:null,type:Number,argument:"CODE",deprecated:!1},{name:"no-dest",description:"Remove destination",shorthand:null,type:Boolean,deprecated:!1},{name:"no-status",description:"Remove status code",shorthand:null,type:Boolean,deprecated:!1},{name:"set-response-header",description:"Set response header: key=value (repeatable)",shorthand:null,type:[String],argument:"HEADER",deprecated:!1},{name:"append-response-header",description:"Append to response header: key=value (repeatable)",shorthand:null,type:[String],argument:"HEADER",deprecated:!1},{name:"delete-response-header",description:"Delete response header: key (repeatable)",shorthand:null,type:[String],argument:"KEY",deprecated:!1},{name:"set-request-header",description:"Set request header: key=value (repeatable)",shorthand:null,type:[String],argument:"HEADER",deprecated:!1},{name:"append-request-header",description:"Append to request header: key=value (repeatable)",shorthand:null,type:[String],argument:"HEADER",deprecated:!1},{name:"delete-request-header",description:"Delete request header: key (repeatable)",shorthand:null,type:[String],argument:"KEY",deprecated:!1},{name:"set-request-query",description:"Set query parameter: key=value (repeatable)",shorthand:null,type:[String],argument:"PARAM",deprecated:!1},{name:"append-request-query",description:"Append to query parameter: key=value (repeatable)",shorthand:null,type:[String],argument:"PARAM",deprecated:!1},{name:"delete-request-query",description:"Delete query parameter: key (repeatable)",shorthand:null,type:[String],argument:"KEY",deprecated:!1},{name:"has",description:"Add a has condition: type:key or type:key:value (repeatable)",shorthand:null,type:[String],argument:"CONDITION",deprecated:!1},{name:"missing",description:'Add a "does not have" condition: type:key or type:key:value (repeatable)',shorthand:null,type:[String],argument:"CONDITION",deprecated:!1},{name:"clear-conditions",description:"Remove all has/does-not-have conditions",shorthand:null,type:Boolean,deprecated:!1},{name:"clear-headers",description:"Remove all response headers",shorthand:null,type:Boolean,deprecated:!1},{name:"clear-transforms",description:"Remove all transforms (request headers, request query)",shorthand:null,type:Boolean,deprecated:!1},{name:"ai",description:"Describe changes using natural language (AI-powered)",shorthand:null,type:String,argument:"PROMPT",deprecated:!1},{...yesOption,description:"Skip confirmation prompts"}],examples:[{name:"Interactive mode",value:`${packageName} routes edit "API Proxy"`},{name:"Edit with AI",value:`${packageName} routes edit "API Proxy" --ai "Add CORS headers and change status to 308"`},{name:"Change destination",value:`${packageName} routes edit "API Proxy" --dest "https://new-api.example.com/:path*"`},{name:"Switch to redirect",value:`${packageName} routes edit "Old Route" --action redirect --dest "/new" --status 301`},{name:"Add a response header",value:`${packageName} routes edit "My Route" --set-response-header "Cache-Control=public, max-age=3600"`},{name:"Clear all conditions and add new ones",value:`${packageName} routes edit "My Route" --clear-conditions --has "header:Authorization"`}]},exportSubcommand={name:"export",aliases:[],description:"Export routes to a vercel.json or vercel.ts file",arguments:[{name:"name-or-id",required:!1}],options:[projectOption,{name:"output",description:"Output file format: .json (default) or .ts",shorthand:"o",type:String,argument:"json|ts",deprecated:!1}],examples:[{name:"Export as vercel.json format",value:`${packageName} routes export`},{name:"Export as vercel.ts format",value:`${packageName} routes export --output ts`},{name:"Export a specific route",value:`${packageName} routes export "API Proxy"`},{name:"Export to a file",value:`${packageName} routes export > routes.json`}]},routesCommand={name:"routes",aliases:[],description:"Manage routing rules for a project. Routes managed at the project level apply to all deployments and environments.",arguments:[],subcommands:[listSubcommand,listVersionsSubcommand,inspectSubcommand,addSubcommand,editSubcommand,deleteSubcommand,enableSubcommand,disableSubcommand,reorderSubcommand,exportSubcommand,publishSubcommand,restoreSubcommand,discardSubcommand],options:[],examples:[]};export{listSubcommand,listVersionsSubcommand,inspectSubcommand,addSubcommand,publishSubcommand,restoreSubcommand,discardSubcommand,deleteSubcommand,enableSubcommand,disableSubcommand,reorderSubcommand,editSubcommand,exportSubcommand,routesCommand};
|
|
7
|
+
import{jsonOption,projectOption,yesOption}from"./chunk-MI7W4QMV.js";import{packageName}from"./chunk-JESNVRVR.js";var listSubcommand={name:"list",aliases:["ls"],description:"List all routing rules for the current project. These routes apply to all deployments and environments.",arguments:[],options:[projectOption,jsonOption,{name:"search",description:"Search by name, description, source, or destination",shorthand:"s",type:String,argument:"QUERY",deprecated:!1},{name:"filter",description:"Filter by type: rewrite, redirect, set_status, transform",shorthand:"f",type:String,argument:"TYPE",deprecated:!1},{name:"production",description:"List routes from the live production version",shorthand:null,type:Boolean,deprecated:!1},{name:"version-id",description:"List routes from a specific version ID",shorthand:null,type:String,argument:"VERSION_ID",deprecated:!1},{name:"diff",description:"Compare staged changes against production. Use with --version-id to compare a specific version.",shorthand:null,type:Boolean,deprecated:!1},{name:"expand",description:"Show expanded details for each route",shorthand:"e",type:Boolean,deprecated:!1}],examples:[{name:"List all routes",value:`${packageName} routes list`},{name:"Search for routes",value:`${packageName} routes list --search "api"`},{name:"Filter by type",value:`${packageName} routes list --filter rewrite`},{name:"Show staged changes",value:`${packageName} routes list --diff`},{name:"Show live production routes",value:`${packageName} routes list --production`},{name:"Show expanded details",value:`${packageName} routes list --expand`}]},listVersionsSubcommand={name:"list-versions",aliases:["ls-versions"],description:"List all versions of routing rules",arguments:[],options:[projectOption,jsonOption,{name:"count",description:"Number of versions to fetch (default: 20, max: 100)",shorthand:null,type:Number,argument:"NUMBER",deprecated:!1}],examples:[{name:"List route versions",value:`${packageName} routes list-versions`},{name:"List more versions",value:`${packageName} routes list-versions --count 50`}]},inspectSubcommand={name:"inspect",aliases:[],description:"Show detailed information about a specific route",arguments:[{name:"name-or-id",required:!0}],options:[projectOption,jsonOption,{name:"diff",description:"Compare staged changes against production for this route",shorthand:null,type:Boolean,deprecated:!1}],examples:[{name:"Inspect a route by name",value:`${packageName} routes inspect "API rewrite"`},{name:"Inspect a route by ID",value:`${packageName} routes inspect abc123`},{name:"Show staged changes for a route",value:`${packageName} routes inspect "My route" --diff`}]},addSubcommand={name:"add",aliases:[],description:"Add a new routing rule to the project",arguments:[{name:"name",required:!1}],options:[projectOption,{name:"src",description:"Path pattern (required in non-interactive mode)",shorthand:null,type:String,argument:"PATTERN",deprecated:!1},{name:"src-syntax",description:"Path syntax: regex (default), path-to-regexp, equals",shorthand:null,type:String,argument:"TYPE",deprecated:!1},{name:"action",description:"Action type: rewrite, redirect, or set-status (required with --dest/--status)",shorthand:null,type:String,argument:"TYPE",deprecated:!1},{name:"dest",description:"Destination URL for rewrite or redirect",shorthand:null,type:String,argument:"URL",deprecated:!1},{name:"status",description:"Status code (301/302/307/308 for redirect, or any for set-status)",shorthand:null,type:Number,argument:"CODE",deprecated:!1},{name:"set-response-header",description:"Set response header: key=value (repeatable)",shorthand:null,type:[String],argument:"HEADER",deprecated:!1},{name:"append-response-header",description:"Append to response header: key=value (repeatable)",shorthand:null,type:[String],argument:"HEADER",deprecated:!1},{name:"delete-response-header",description:"Delete response header: key (repeatable)",shorthand:null,type:[String],argument:"KEY",deprecated:!1},{name:"set-request-header",description:"Set request header: key=value (repeatable)",shorthand:null,type:[String],argument:"HEADER",deprecated:!1},{name:"append-request-header",description:"Append to request header: key=value (repeatable)",shorthand:null,type:[String],argument:"HEADER",deprecated:!1},{name:"delete-request-header",description:"Delete request header: key (repeatable)",shorthand:null,type:[String],argument:"KEY",deprecated:!1},{name:"set-request-query",description:"Set query parameter: key=value (repeatable)",shorthand:null,type:[String],argument:"PARAM",deprecated:!1},{name:"append-request-query",description:"Append to query parameter: key=value (repeatable)",shorthand:null,type:[String],argument:"PARAM",deprecated:!1},{name:"delete-request-query",description:"Delete query parameter: key (repeatable)",shorthand:null,type:[String],argument:"KEY",deprecated:!1},{name:"has",description:"Condition that must match: type:key or type:key:value (repeatable)",shorthand:null,type:[String],argument:"CONDITION",deprecated:!1},{name:"missing",description:'"Does not have" condition: type:key or type:key:value (repeatable)',shorthand:null,type:[String],argument:"CONDITION",deprecated:!1},{name:"description",description:"Route description (max 1024 chars)",shorthand:null,type:String,argument:"TEXT",deprecated:!1},{name:"disabled",description:"Create route in disabled state",shorthand:null,type:Boolean,deprecated:!1},{name:"ai",description:"Generate route from a natural language description (AI-powered)",shorthand:null,type:String,argument:"PROMPT",deprecated:!1},{name:"position",description:"Position: start, end, after:<id>, before:<id>",shorthand:null,type:String,argument:"POSITION",deprecated:!1},{name:"yes",description:"Skip confirmation prompts",shorthand:"y",type:Boolean,deprecated:!1}],examples:[{name:"Interactive mode",value:`${packageName} routes add`},{name:"Create with AI",value:`${packageName} routes add --ai "Rewrite /api/* to https://backend.internal/*"`},{name:"Add a rewrite",value:`${packageName} routes add "API Proxy" --src "/api/:path*" --src-syntax path-to-regexp --action rewrite --dest "https://api.example.com/:path*" --yes`},{name:"Add a redirect",value:`${packageName} routes add "Old Blog" --src "/blog" --src-syntax equals --action redirect --dest "/articles" --status 301 --yes`},{name:"Add CORS headers",value:`${packageName} routes add "CORS" --src "^/api/.*$" --set-response-header "Access-Control-Allow-Origin=*" --yes`},{name:"Block access (set status)",value:`${packageName} routes add "Block Admin" --src "^/admin/.*$" --action set-status --status 403 --yes`},{name:"Conditional redirect",value:`${packageName} routes add "Auth Required" --src "/protected/:path*" --src-syntax path-to-regexp --action redirect --dest "/login" --status 307 --missing "cookie:session" --yes`},{name:"Rewrite with request headers",value:`${packageName} routes add "Backend Proxy" --src "/backend/:path*" --src-syntax path-to-regexp --action rewrite --dest "https://internal.example.com/:path*" --set-request-header "X-Forwarded-Host=myapp.com" --yes`},{name:"Add route at start",value:`${packageName} routes add "Priority Route" --src "/priority" --src-syntax equals --action rewrite --dest "/handler" --position start --yes`}]},publishSubcommand={name:"publish",aliases:[],description:"Publish all staged routing changes to production",arguments:[],options:[projectOption,{...yesOption,description:"Skip the confirmation prompt when publishing"}],examples:[{name:"Publish staged changes",value:`${packageName} routes publish`},{name:"Publish without confirmation",value:`${packageName} routes publish --yes`}]},restoreSubcommand={name:"restore",aliases:[],description:"Restore a previous routing version to production",arguments:[{name:"version-id",required:!0}],options:[projectOption,{...yesOption,description:"Skip the confirmation prompt when restoring"}],examples:[{name:"Restore a previous version",value:`${packageName} routes restore <version-id>`},{name:"Restore without confirmation",value:`${packageName} routes restore <version-id> --yes`}]},discardSubcommand={name:"discard-staging",aliases:[],description:"Discard staged routing changes",arguments:[],options:[projectOption,{...yesOption,description:"Skip the confirmation prompt when discarding"}],examples:[{name:"Discard staged changes",value:`${packageName} routes discard-staging`},{name:"Discard without confirmation",value:`${packageName} routes discard-staging --yes`}]},deleteSubcommand={name:"delete",aliases:["rm"],description:"Delete one or more routing rules",arguments:[{name:"name-or-id",required:!0,multiple:!0}],options:[projectOption,{...yesOption,description:"Skip the confirmation prompt when deleting"}],examples:[{name:"Delete a route by name",value:`${packageName} routes delete "Old Redirect"`},{name:"Delete a route by ID",value:`${packageName} routes delete abc123`},{name:"Delete multiple routes",value:`${packageName} routes delete "Route A" "Route B"`},{name:"Delete without confirmation",value:`${packageName} routes delete "Old Route" --yes`}]},enableSubcommand={name:"enable",aliases:[],description:"Enable a disabled routing rule",arguments:[{name:"name-or-id",required:!0}],options:[projectOption],examples:[{name:"Enable a route by name",value:`${packageName} routes enable "API Proxy"`},{name:"Enable a route by ID",value:`${packageName} routes enable abc123`}]},disableSubcommand={name:"disable",aliases:[],description:"Disable a routing rule without deleting it",arguments:[{name:"name-or-id",required:!0}],options:[projectOption],examples:[{name:"Disable a route by name",value:`${packageName} routes disable "API Proxy"`},{name:"Disable a route by ID",value:`${packageName} routes disable abc123`}]},reorderSubcommand={name:"reorder",aliases:["move"],description:"Move a routing rule to a different position",arguments:[{name:"name-or-id",required:!0}],options:[projectOption,{name:"position",description:"Target position: start, end, a number (1-based), before:<id>, after:<id>",shorthand:null,type:String,argument:"POSITION",deprecated:!1},{name:"first",description:"Move to the first position (highest priority)",shorthand:null,type:Boolean,deprecated:!1},{name:"last",description:"Move to the last position (lowest priority)",shorthand:null,type:Boolean,deprecated:!1},{...yesOption,description:"Skip the confirmation prompt when reordering"}],examples:[{name:"Move to first position",value:`${packageName} routes reorder "Catch All" --first`},{name:"Move to last position",value:`${packageName} routes reorder "Catch All" --last`},{name:"Move to a specific position",value:`${packageName} routes reorder "API Proxy" --position 3`},{name:"Move after another route",value:`${packageName} routes reorder "API Proxy" --position after:route-id-123`},{name:"Interactive reorder (prompts for position)",value:`${packageName} routes reorder "API Proxy"`}]},editSubcommand={name:"update",aliases:["edit"],description:"Update an existing routing rule",arguments:[{name:"name-or-id",required:!0}],options:[projectOption,{name:"name",description:"Change route name",shorthand:null,type:String,argument:"NAME",deprecated:!1},{name:"description",description:'Change description (use "" to clear)',shorthand:null,type:String,argument:"TEXT",deprecated:!1},{name:"src",description:"Change source path pattern",shorthand:null,type:String,argument:"PATTERN",deprecated:!1},{name:"src-syntax",description:"Change path syntax: regex, path-to-regexp, equals",shorthand:null,type:String,argument:"TYPE",deprecated:!1},{name:"action",description:"Set action type: rewrite, redirect, or set-status (required when switching types)",shorthand:null,type:String,argument:"TYPE",deprecated:!1},{name:"dest",description:"Set destination URL",shorthand:null,type:String,argument:"URL",deprecated:!1},{name:"status",description:"Set status code",shorthand:null,type:Number,argument:"CODE",deprecated:!1},{name:"no-dest",description:"Remove destination",shorthand:null,type:Boolean,deprecated:!1},{name:"no-status",description:"Remove status code",shorthand:null,type:Boolean,deprecated:!1},{name:"set-response-header",description:"Set response header: key=value (repeatable)",shorthand:null,type:[String],argument:"HEADER",deprecated:!1},{name:"append-response-header",description:"Append to response header: key=value (repeatable)",shorthand:null,type:[String],argument:"HEADER",deprecated:!1},{name:"delete-response-header",description:"Delete response header: key (repeatable)",shorthand:null,type:[String],argument:"KEY",deprecated:!1},{name:"set-request-header",description:"Set request header: key=value (repeatable)",shorthand:null,type:[String],argument:"HEADER",deprecated:!1},{name:"append-request-header",description:"Append to request header: key=value (repeatable)",shorthand:null,type:[String],argument:"HEADER",deprecated:!1},{name:"delete-request-header",description:"Delete request header: key (repeatable)",shorthand:null,type:[String],argument:"KEY",deprecated:!1},{name:"set-request-query",description:"Set query parameter: key=value (repeatable)",shorthand:null,type:[String],argument:"PARAM",deprecated:!1},{name:"append-request-query",description:"Append to query parameter: key=value (repeatable)",shorthand:null,type:[String],argument:"PARAM",deprecated:!1},{name:"delete-request-query",description:"Delete query parameter: key (repeatable)",shorthand:null,type:[String],argument:"KEY",deprecated:!1},{name:"has",description:"Add a has condition: type:key or type:key:value (repeatable)",shorthand:null,type:[String],argument:"CONDITION",deprecated:!1},{name:"missing",description:'Add a "does not have" condition: type:key or type:key:value (repeatable)',shorthand:null,type:[String],argument:"CONDITION",deprecated:!1},{name:"clear-conditions",description:"Remove all has/does-not-have conditions",shorthand:null,type:Boolean,deprecated:!1},{name:"clear-headers",description:"Remove all response headers",shorthand:null,type:Boolean,deprecated:!1},{name:"clear-transforms",description:"Remove all transforms (request headers, request query)",shorthand:null,type:Boolean,deprecated:!1},{name:"ai",description:"Describe changes using natural language (AI-powered)",shorthand:null,type:String,argument:"PROMPT",deprecated:!1},{...yesOption,description:"Skip confirmation prompts"}],examples:[{name:"Interactive mode",value:`${packageName} routes update "API Proxy"`},{name:"Update with AI",value:`${packageName} routes update "API Proxy" --ai "Add CORS headers and change status to 308"`},{name:"Change destination",value:`${packageName} routes update "API Proxy" --dest "https://new-api.example.com/:path*"`},{name:"Switch to redirect",value:`${packageName} routes update "Old Route" --action redirect --dest "/new" --status 301`},{name:"Add a response header",value:`${packageName} routes update "My Route" --set-response-header "Cache-Control=public, max-age=3600"`},{name:"Clear all conditions and add new ones",value:`${packageName} routes update "My Route" --clear-conditions --has "header:Authorization"`}]},exportSubcommand={name:"export",aliases:[],description:"Export routes to a vercel.json or vercel.ts file",arguments:[{name:"name-or-id",required:!1}],options:[projectOption,{name:"output",description:"Output file format: .json (default) or .ts",shorthand:"o",type:String,argument:"json|ts",deprecated:!1}],examples:[{name:"Export as vercel.json format",value:`${packageName} routes export`},{name:"Export as vercel.ts format",value:`${packageName} routes export --output ts`},{name:"Export a specific route",value:`${packageName} routes export "API Proxy"`},{name:"Export to a file",value:`${packageName} routes export > routes.json`}]},routesCommand={name:"routes",aliases:[],description:"Manage routing rules for a project. Routes managed at the project level apply to all deployments and environments.",arguments:[],subcommands:[listSubcommand,listVersionsSubcommand,inspectSubcommand,addSubcommand,editSubcommand,deleteSubcommand,enableSubcommand,disableSubcommand,reorderSubcommand,exportSubcommand,publishSubcommand,restoreSubcommand,discardSubcommand],options:[],examples:[]};export{listSubcommand,listVersionsSubcommand,inspectSubcommand,addSubcommand,publishSubcommand,restoreSubcommand,discardSubcommand,deleteSubcommand,enableSubcommand,disableSubcommand,reorderSubcommand,editSubcommand,exportSubcommand,routesCommand};
|
|
@@ -4,9 +4,9 @@ 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{require_dist as require_dist2}from"./chunk-O4FDRZ22.js";import{sleep}from"./chunk-T3GQAMBJ.js";import{PromptBackError,PromptCanceledError}from"./chunk-P2O5DOYE.js";import{persistAuthConfig,writeToConfigFile}from"./chunk-
|
|
8
|
-
`,message=prependEmoji(import_chalk.default.dim(payload),emoji(type))+newline,finalLink="";link&&(finalLink=import_chalk.default.dim(`${action||"Learn More"}: ${link_default(link)}`)+newline),output_manager_default.print(message+finalLink)}}}}function sharedPromise(fn){let promise=null;return function(...args){return promise||(promise=fn.apply(this,args),promise.finally(()=>{promise=null})),promise}}var import_error_utils=__toESM(require_dist(),1);var TEAM_NOT_CHOSEN="",DOMAINS_API_PATH=/^\/v\d+\/(?:domains|registrar)(?:\/|$)/,isSAMLError=v=>v&&v.saml,isJSONObject=v=>v&&typeof v=="object"&&v.constructor===Object;function isValidAccessToken(authConfig){if(!authConfig.token)return!1;if(typeof authConfig.expiresAt!="number")return!0;let nowInSeconds=Math.floor(Date.now()/1e3);return authConfig.expiresAt>=nowInSeconds}function hasRefreshToken(authConfig){return"refreshToken"in authConfig}var Client=class extends EventEmitter{constructor(opts){super();this._argv=[];this._loggedTokenSource=!1;this.escapePromptCancellationDepth=0;this.promptBackNavigationDepth=0;this.reauthenticate=sharedPromise(async function(error){let{default:reauthenticate}=await import("./reauthenticate-
|
|
9
|
-
${error.stack}`)};this.setArgv(opts.argv),this.apiUrl=opts.apiUrl,this.authConfig=opts.authConfig,this.stdin=opts.stdin,this.stdout=opts.stdout,this.stderr=opts.stderr,this.config=opts.config,this.savedTeam=opts.config.currentTeam,this.localConfig=opts.localConfig,this.localConfigPath=opts.localConfigPath,this.requestIdCounter=1,this.telemetryEventStore=opts.telemetryEventStore,this.isAgent=opts.isAgent??!1,this.agentName=opts.agentName,this.nonInteractive=opts.nonInteractive??this.isAgent,this.ignoresSavedTeam=this.isAgent&&this.nonInteractive,this.dangerouslySkipPermissions=opts.dangerouslySkipPermissions??!1;let theme={prefix:(0,import_chalk2.gray)("?"),style:{answer:import_chalk2.gray}};this.input={text:async opts2=>{let{default:input}=await import("./esm-IF453UWS.js");return this.runPrompt(input({theme,...opts2},{input:this.stdin,output:this.stderr}))},password:async opts2=>{let{default:password}=await import("./esm-LABWDJ72.js");return this.runPrompt(password({theme,...opts2},{input:this.stdin,output:this.stderr}))},checkbox:async opts2=>{let{default:checkbox}=await import("./esm-BYG5BWYH.js");return this.runPrompt(checkbox({theme,...opts2},{input:this.stdin,output:this.stderr}))},expand:async opts2=>{let{default:expand}=await import("./esm-TG37FXTU.js");return this.runPrompt(expand({theme,...opts2},{input:this.stdin,output:this.stderr}))},confirm:async(message,default_value)=>{let{default:confirm}=await import("./esm-33752ISR.js");return this.runPrompt(confirm({theme,message,default:default_value},{input:this.stdin,output:this.stderr}))},select:async opts2=>{let{default:select}=await import("./esm-4JKEE7PC.js");return this.runPrompt(select({theme,...opts2},{input:this.stdin,output:this.stderr}))},search:async opts2=>{let{default:search}=await import("./esm-DFFBNKNU.js");return this.runPrompt(search({theme,...opts2},{input:this.stdin,output:this.stderr}))}}}async withEscapePromptCancellation(run){this.escapePromptCancellationDepth++;try{return await run()}finally{this.escapePromptCancellationDepth--}}async withPromptBackNavigation(run){this.promptBackNavigationDepth++;try{return await run()}finally{this.promptBackNavigationDepth--}}runPrompt(prompt){let escapeCancellationEnabled=this.escapePromptCancellationDepth>0,backNavigationEnabled=this.promptBackNavigationDepth>0;if(!escapeCancellationEnabled&&!backNavigationEnabled||!this.stdin.isTTY||!prompt.cancel)return prompt;let cancellation,onKeypress=(_input,key)=>{key?.name==="escape"&&escapeCancellationEnabled&&!cancellation?(cancellation="escape",prompt.cancel?.()):key?.name==="up"&&backNavigationEnabled&&!cancellation&&(cancellation="back",prompt.cancel?.())};return this.stdin.on("keypress",onKeypress),prompt.catch(error=>{throw cancellation==="escape"?new PromptCanceledError:cancellation==="back"?new PromptBackError:error}).finally(()=>{this.stdin.off("keypress",onKeypress)})}get argv(){return this._argv}setArgv(argvOrFirst,...rest){let argv=Array.isArray(argvOrFirst)?argvOrFirst:[argvOrFirst,...rest];this._argv=argv,this._parsedArgsCache=void 0}getParsedArgs(){return this._parsedArgsCache||(this._parsedArgsCache=parseArguments(this.argv.slice(2),{},{permissive:!0})),this._parsedArgsCache}retry(fn,{retries=3,maxTimeout=1/0}={}){return(0,import_async_retry.default)(fn,{retries,maxTimeout,onRetry:this._onRetry})}async ensureAuthorized(){let{authConfig}=this;if(isValidAccessToken(authConfig)){this._loggedTokenSource||(authConfig.tokenSource==="flag"?output_manager_default.debug("Using token from `--token` argument, skipping token refresh."):authConfig.tokenSource==="env"?output_manager_default.debug("Using token from VERCEL_TOKEN environment variable, skipping token refresh."):output_manager_default.debug("Valid access token, skipping token refresh."),this._loggedTokenSource=!0);return}if(!hasRefreshToken(authConfig)){output_manager_default.debug("No refresh token found, emptying auth config."),this.emptyAuthConfig(),this.persistAuthConfig();return}let tokenResponse=await refreshTokenRequest({refresh_token:authConfig.refreshToken}),[tokensError,tokens]=await processTokenResponse(tokenResponse);if(isOAuthError(tokensError)&&tokensError.code==="invalid_grant"&&!authConfig.tokenSource&&this.stdin.isTTY&&!this.nonInteractive){output_manager_default.debug(`Stored session refresh failed: ${tokensError.cause.message}`),output_manager_default.log("Couldn't refresh the saved login. Starting a new login.");let{performDeviceCodeFlow}=await import("./future-
|
|
7
|
+
import{require_dist as require_dist2}from"./chunk-O4FDRZ22.js";import{sleep}from"./chunk-T3GQAMBJ.js";import{PromptBackError,PromptCanceledError}from"./chunk-P2O5DOYE.js";import{persistAuthConfig,writeToConfigFile}from"./chunk-GLH4PVMY.js";import{require_cli_config}from"./chunk-4SAVH3H7.js";import{isOAuthError,processTokenResponse,refreshTokenRequest,ua_default}from"./chunk-AOWWC6WZ.js";import{fetch}from"./chunk-MY4MONOH.js";import{parseArguments}from"./chunk-VLDU2MDL.js";import{APIError}from"./chunk-XSDAUM4F.js";import{emoji,link_default,output_manager_default,prependEmoji}from"./chunk-M774HRX5.js";import{require_dist}from"./chunk-RM3ZDRYE.js";import{pkg_default}from"./chunk-OO572JUC.js";import{require_source}from"./chunk-NB2WLB3J.js";import{__toESM}from"./chunk-BZENIQ7N.js";var import_chalk2=__toESM(require_source(),1),import_cli_config=__toESM(require_cli_config(),1),import_async_retry=__toESM(require_dist2(),1);import{join,resolve}from"node:path";import{EventEmitter}from"events";import{URL}from"url";async function responseError(res,fallbackMessage=null,parsedBody={}){let bodyError;if(!res.ok){let body;try{body=await res.json()}catch{body=parsedBody}bodyError=body.error||body.err||body}let msg=bodyError?.message||fallbackMessage||"Response Error";return new APIError(msg,res,bodyError)}var import_chalk=__toESM(require_source(),1);function printIndications(res){let indications=new Set(["warning","notice","tip"]),regex=/^x-(?:vercel|now)-(warning|notice|tip)-(.*)$/;for(let[name,payload]of res.headers){let match=name.match(regex);if(match){let[,type,identifier]=match,action=res.headers.get(`x-vercel-action-${identifier}`),link=res.headers.get(`x-vercel-link-${identifier}`);if(indications.has(type)){let newline=`
|
|
8
|
+
`,message=prependEmoji(import_chalk.default.dim(payload),emoji(type))+newline,finalLink="";link&&(finalLink=import_chalk.default.dim(`${action||"Learn More"}: ${link_default(link)}`)+newline),output_manager_default.print(message+finalLink)}}}}function sharedPromise(fn){let promise=null;return function(...args){return promise||(promise=fn.apply(this,args),promise.finally(()=>{promise=null})),promise}}var import_error_utils=__toESM(require_dist(),1);var TEAM_NOT_CHOSEN="",DOMAINS_API_PATH=/^\/v\d+\/(?:domains|registrar)(?:\/|$)/,isSAMLError=v=>v&&v.saml,isJSONObject=v=>v&&typeof v=="object"&&v.constructor===Object;function isValidAccessToken(authConfig){if(!authConfig.token)return!1;if(typeof authConfig.expiresAt!="number")return!0;let nowInSeconds=Math.floor(Date.now()/1e3);return authConfig.expiresAt>=nowInSeconds}function hasRefreshToken(authConfig){return"refreshToken"in authConfig}var Client=class extends EventEmitter{constructor(opts){super();this._argv=[];this._loggedTokenSource=!1;this.escapePromptCancellationDepth=0;this.promptBackNavigationDepth=0;this.reauthenticate=sharedPromise(async function(error){let{default:reauthenticate}=await import("./reauthenticate-4SGT475I.js");if(typeof await reauthenticate(this,error)=="number")throw error instanceof APIError?output_manager_default.prettyError(error):output_manager_default.error(`Failed to re-authenticate for ${(0,import_chalk2.bold)(error.scope)} scope`),error});this._onRetry=error=>{output_manager_default.debug(`Retrying: ${error}
|
|
9
|
+
${error.stack}`)};this.setArgv(opts.argv),this.apiUrl=opts.apiUrl,this.authConfig=opts.authConfig,this.stdin=opts.stdin,this.stdout=opts.stdout,this.stderr=opts.stderr,this.config=opts.config,this.savedTeam=opts.config.currentTeam,this.localConfig=opts.localConfig,this.localConfigPath=opts.localConfigPath,this.requestIdCounter=1,this.telemetryEventStore=opts.telemetryEventStore,this.isAgent=opts.isAgent??!1,this.agentName=opts.agentName,this.nonInteractive=opts.nonInteractive??this.isAgent,this.ignoresSavedTeam=this.isAgent&&this.nonInteractive,this.dangerouslySkipPermissions=opts.dangerouslySkipPermissions??!1;let theme={prefix:(0,import_chalk2.gray)("?"),style:{answer:import_chalk2.gray}};this.input={text:async opts2=>{let{default:input}=await import("./esm-IF453UWS.js");return this.runPrompt(input({theme,...opts2},{input:this.stdin,output:this.stderr}))},password:async opts2=>{let{default:password}=await import("./esm-LABWDJ72.js");return this.runPrompt(password({theme,...opts2},{input:this.stdin,output:this.stderr}))},checkbox:async opts2=>{let{default:checkbox}=await import("./esm-BYG5BWYH.js");return this.runPrompt(checkbox({theme,...opts2},{input:this.stdin,output:this.stderr}))},expand:async opts2=>{let{default:expand}=await import("./esm-TG37FXTU.js");return this.runPrompt(expand({theme,...opts2},{input:this.stdin,output:this.stderr}))},confirm:async(message,default_value)=>{let{default:confirm}=await import("./esm-33752ISR.js");return this.runPrompt(confirm({theme,message,default:default_value},{input:this.stdin,output:this.stderr}))},select:async opts2=>{let{default:select}=await import("./esm-4JKEE7PC.js");return this.runPrompt(select({theme,...opts2},{input:this.stdin,output:this.stderr}))},search:async opts2=>{let{default:search}=await import("./esm-DFFBNKNU.js");return this.runPrompt(search({theme,...opts2},{input:this.stdin,output:this.stderr}))}}}async withEscapePromptCancellation(run){this.escapePromptCancellationDepth++;try{return await run()}finally{this.escapePromptCancellationDepth--}}async withPromptBackNavigation(run){this.promptBackNavigationDepth++;try{return await run()}finally{this.promptBackNavigationDepth--}}runPrompt(prompt){let escapeCancellationEnabled=this.escapePromptCancellationDepth>0,backNavigationEnabled=this.promptBackNavigationDepth>0;if(!escapeCancellationEnabled&&!backNavigationEnabled||!this.stdin.isTTY||!prompt.cancel)return prompt;let cancellation,onKeypress=(_input,key)=>{key?.name==="escape"&&escapeCancellationEnabled&&!cancellation?(cancellation="escape",prompt.cancel?.()):key?.name==="up"&&backNavigationEnabled&&!cancellation&&(cancellation="back",prompt.cancel?.())};return this.stdin.on("keypress",onKeypress),prompt.catch(error=>{throw cancellation==="escape"?new PromptCanceledError:cancellation==="back"?new PromptBackError:error}).finally(()=>{this.stdin.off("keypress",onKeypress)})}get argv(){return this._argv}setArgv(argvOrFirst,...rest){let argv=Array.isArray(argvOrFirst)?argvOrFirst:[argvOrFirst,...rest];this._argv=argv,this._parsedArgsCache=void 0}getParsedArgs(){return this._parsedArgsCache||(this._parsedArgsCache=parseArguments(this.argv.slice(2),{},{permissive:!0})),this._parsedArgsCache}retry(fn,{retries=3,maxTimeout=1/0}={}){return(0,import_async_retry.default)(fn,{retries,maxTimeout,onRetry:this._onRetry})}async ensureAuthorized(){let{authConfig}=this;if(isValidAccessToken(authConfig)){this._loggedTokenSource||(authConfig.tokenSource==="flag"?output_manager_default.debug("Using token from `--token` argument, skipping token refresh."):authConfig.tokenSource==="env"?output_manager_default.debug("Using token from VERCEL_TOKEN environment variable, skipping token refresh."):output_manager_default.debug("Valid access token, skipping token refresh."),this._loggedTokenSource=!0);return}if(!hasRefreshToken(authConfig)){output_manager_default.debug("No refresh token found, emptying auth config."),this.emptyAuthConfig(),this.persistAuthConfig();return}let tokenResponse=await refreshTokenRequest({refresh_token:authConfig.refreshToken}),[tokensError,tokens]=await processTokenResponse(tokenResponse);if(isOAuthError(tokensError)&&tokensError.code==="invalid_grant"&&!authConfig.tokenSource&&this.stdin.isTTY&&!this.nonInteractive){output_manager_default.debug(`Stored session refresh failed: ${tokensError.cause.message}`),output_manager_default.log("Couldn't refresh the saved login. Starting a new login.");let{performDeviceCodeFlow}=await import("./future-JZ3RVO4B.js"),recoveredTokens=await performDeviceCodeFlow(this);if(recoveredTokens){this.updateAuthConfig({token:recoveredTokens.access_token,userId:void 0,expiresAt:Math.floor(Date.now()/1e3)+recoveredTokens.expires_in,refreshToken:recoveredTokens.refresh_token}),this.persistAuthConfig();return}}if(tokensError){output_manager_default.debug("Error refreshing token, emptying auth config."),this.emptyAuthConfig(),this.persistAuthConfig();return}this.updateAuthConfig({token:tokens.access_token,expiresAt:Math.floor(Date.now()/1e3)+tokens.expires_in}),tokens.refresh_token&&this.updateAuthConfig({refreshToken:tokens.refresh_token}),this.persistAuthConfig(),this.writeToConfigFile(),output_manager_default.debug("Tokens refreshed successfully.")}getGlobalPathConfig(){let confFlag=this.getParsedArgs().flags["--global-config"];return typeof confFlag=="string"?resolve(this.cwd,confFlag):(0,import_cli_config.getGlobalPathConfig)()}async readConfig(fileName,schema){let filePath=join(this.getGlobalPathConfig(),fileName);return(0,import_cli_config.readConfigFile)(filePath,schema)}async maybeReadConfig(fileName,schema){try{return await this.readConfig(fileName,schema)}catch{return null}}async writeConfig(fileName,schema,value){let filePath=join(this.getGlobalPathConfig(),fileName);(0,import_cli_config.writeConfigFile)(filePath,schema,value)}updateConfig(config){this.config={...this.config,...config},"currentTeam"in config&&(this.savedTeam=config.currentTeam)}writeToConfigFile(config=this.config){writeToConfigFile(this.ignoresSavedTeam?{...config,currentTeam:this.savedTeam}:config)}isTeamUnchosen(){return this.ignoresSavedTeam&&this.config.currentTeam===TEAM_NOT_CHOSEN}needsTeamChoice(url,opts){return this.isTeamUnchosen()&&!opts.teamOptional&&!opts.accountId&&opts.useCurrentTeam!==!1&&!new URL(url,this.apiUrl).searchParams.has("teamId")}chooseTeam({ask=!0}={}){return ask?(this.teamChoice??=this.applyTeamChoice(!0).finally(()=>{this.teamChoice=void 0}),this.teamChoice):this.applyTeamChoice(!1)}async applyTeamChoice(ask){let{resolveAgentTeam}=await import("./resolve-agent-team-XSXRT42F.js"),team=await resolveAgentTeam(this,{ask});team!==null&&this.isTeamUnchosen()&&(this.config.currentTeam=team)}async resolveCurrentTeam({ask=!0}={}){return this.isTeamUnchosen()&&await this.chooseTeam({ask}),this.isTeamUnchosen()?void 0:this.config.currentTeam}updateAuthConfig(authConfig){authConfig.token&&authConfig.token!==this.authConfig.token&&(this.user=void 0,this.userPromise=void 0,this.teams=void 0,this.teamsPromise=void 0),this.authConfig={...this.authConfig,...authConfig}}emptyAuthConfig(){this.user=void 0,this.userPromise=void 0,this.teams=void 0,this.teamsPromise=void 0,this.authConfig=this.authConfig.skipWrite?{skipWrite:!0}:{}}persistAuthConfig(){persistAuthConfig(this.authConfig,this.config)}async confirmMutatingOperation(url,method){if(!((method||"GET").toUpperCase()==="DELETE"))return!0;if(this.isAgent&&this.dangerouslySkipPermissions){let agentInfo=this.agentName?` (${this.agentName})`:"";output_manager_default.print(`
|
|
10
10
|
`),output_manager_default.print((0,import_chalk2.bgRed)((0,import_chalk2.white)((0,import_chalk2.bold)(" \u26A0 WARNING ")))+(0,import_chalk2.red)((0,import_chalk2.bold)(` AGENT MODE - DELETE CONFIRMATION BYPASSED
|
|
11
11
|
`))),output_manager_default.print((0,import_chalk2.yellow)(` An AI agent${agentInfo} is executing a ${(0,import_chalk2.bold)("DELETE")} request with --dangerously-skip-permissions flag.
|
|
12
12
|
`)),output_manager_default.print((0,import_chalk2.yellow)(` This operation will delete data: ${(0,import_chalk2.bold)(url)}
|
|
@@ -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{getScope}from"./chunk-
|
|
7
|
+
import{getScope}from"./chunk-GLH4PVMY.js";import{AGENT_REASON,AGENT_STATUS,buildCommandWithGlobalFlags,outputAgentError,shouldEmitNonInteractiveCommandError}from"./chunk-DDLM6CIQ.js";import{getOrgById}from"./chunk-JIGCN5QS.js";import{output_manager_default}from"./chunk-M774HRX5.js";async function printProjectNotFoundError(client,projectNameOrId,commandName,orgId){let contextName;try{orgId?contextName=(await getOrgById(client,orgId))?.slug??orgId:contextName=(await getScope(client)).contextName}catch(err){contextName=orgId,output_manager_default.debug(`Scope lookup failed during error reporting: ${err}`)}let scopeClause=contextName?` (${contextName})`:"",headline=`Project "${projectNameOrId}" was not found in the current scope${scopeClause}.`;if(output_manager_default.error(`${headline}
|
|
8
8
|
|
|
9
9
|
If it lives in a different team or account:
|
|
10
10
|
\u2022 Retry with \`--scope <team-slug|your-username>\`, or
|
|
@@ -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{quoteArg}from"./chunk-
|
|
7
|
+
import{quoteArg}from"./chunk-DDLM6CIQ.js";import{arg_common_default,stripSensitiveAuthArgs}from"./chunk-MI7W4QMV.js";import{packageName}from"./chunk-JESNVRVR.js";import{__commonJS,__toESM}from"./chunk-BZENIQ7N.js";var require_arg=__commonJS({"../../node_modules/.pnpm/arg@5.0.0/node_modules/arg/index.js"(exports,module){var flagSymbol=Symbol("arg flag"),ArgError=class _ArgError extends Error{constructor(msg,code){super(msg),this.name="ArgError",this.code=code,Object.setPrototypeOf(this,_ArgError.prototype)}};function arg2(opts,{argv=process.argv.slice(2),permissive=!1,stopAtPositional=!1}={}){if(!opts)throw new ArgError("argument specification object is required","ARG_CONFIG_NO_SPEC");let result={_:[]},aliases={},handlers={};for(let key of Object.keys(opts)){if(!key)throw new ArgError("argument key cannot be an empty string","ARG_CONFIG_EMPTY_KEY");if(key[0]!=="-")throw new ArgError(`argument key must start with '-' but found: '${key}'`,"ARG_CONFIG_NONOPT_KEY");if(key.length===1)throw new ArgError(`argument key must have a name; singular '-' keys are not allowed: ${key}`,"ARG_CONFIG_NONAME_KEY");if(typeof opts[key]=="string"){aliases[key]=opts[key];continue}let type=opts[key],isFlag=!1;if(Array.isArray(type)&&type.length===1&&typeof type[0]=="function"){let[fn]=type;type=(value,name,prev=[])=>(prev.push(fn(value,name,prev[prev.length-1])),prev),isFlag=fn===Boolean||fn[flagSymbol]===!0}else if(typeof type=="function")isFlag=type===Boolean||type[flagSymbol]===!0;else throw new ArgError(`type missing or not a function or valid array type: ${key}`,"ARG_CONFIG_VAD_TYPE");if(key[1]!=="-"&&key.length>2)throw new ArgError(`short argument keys (with a single hyphen) must have only one character: ${key}`,"ARG_CONFIG_SHORTOPT_TOOLONG");handlers[key]=[type,isFlag]}for(let i=0,len=argv.length;i<len;i++){let wholeArg=argv[i];if(stopAtPositional&&result._.length>0){result._=result._.concat(argv.slice(i));break}if(wholeArg==="--"){result._=result._.concat(argv.slice(i+1));break}if(wholeArg.length>1&&wholeArg[0]==="-"){let separatedArguments=wholeArg[1]==="-"||wholeArg.length===2?[wholeArg]:wholeArg.slice(1).split("").map(a=>`-${a}`);for(let j=0;j<separatedArguments.length;j++){let arg3=separatedArguments[j],[originalArgName,argStr]=arg3[1]==="-"?arg3.split(/=(.*)/,2):[arg3,void 0],argName=originalArgName;for(;argName in aliases;)argName=aliases[argName];if(!(argName in handlers))if(permissive){result._.push(arg3);continue}else throw new ArgError(`unknown or unexpected option: ${originalArgName}`,"ARG_UNKNOWN_OPTION");let[type,isFlag]=handlers[argName];if(!isFlag&&j+1<separatedArguments.length)throw new ArgError(`option requires argument (but was followed by another short argument): ${originalArgName}`,"ARG_MISSING_REQUIRED_SHORTARG");if(isFlag)result[argName]=type(!0,argName,result[argName]);else if(argStr===void 0){if(argv.length<i+2||argv[i+1].length>1&&argv[i+1][0]==="-"&&!(argv[i+1].match(/^-?\d*(\.(?=\d))?\d*$/)&&(type===Number||typeof BigInt<"u"&&type===BigInt))){let extended=originalArgName===argName?"":` (alias for ${argName})`;throw new ArgError(`option requires argument: ${originalArgName}${extended}`,"ARG_MISSING_REQUIRED_LONGARG")}result[argName]=type(argv[i+1],argName,result[argName]),++i}else result[argName]=type(argStr,argName,result[argName])}}else result._.push(wholeArg)}return result}arg2.flag=fn=>(fn[flagSymbol]=!0,fn);arg2.COUNT=arg2.flag((v,name,existingCount)=>(existingCount||0)+1);arg2.ArgError=ArgError;module.exports=arg2}});var import_arg=__toESM(require_arg(),1);function suggestCorrection(input,choices){if(input.replace(/^-+/,"").length<3||choices.includes(input))return;let matches=[...new Set(choices)].filter(choice=>{if(Math.abs(input.length-choice.length)>1)return!1;let i=0;for(;i<input.length&&input[i]===choice[i];)i++;return input.length===choice.length?input.slice(i+1)===choice.slice(i+1)||input[i]===choice[i+1]&&input[i+1]===choice[i]&&input.slice(i+2)===choice.slice(i+2):input.length>choice.length?input.slice(i+1)===choice.slice(i):input.slice(i)===choice.slice(i+1)});return matches.length===1?matches[0]:void 0}var SAFE_VALUE_FLAGS=new Set(["--cwd","--scope","--team","-S","-T","--project","-p","--format","--environment","--since","--until","--limit"]),READ_COMMANDS=new Set(["inspect","list","ls","schema","whoami"]);function buildCorrectedCommand(argv,from,to,flagsSpecification={}){let corrected=argv.slice(2),spec={...arg_common_default(),...flagsSpecification},valuelessFlags=new Set,takesValue=new Set;for(let[name,value]of Object.entries(spec))((typeof value=="string"?spec[value]:value)===Boolean?valuelessFlags:takesValue).add(name);for(let i=0;i<corrected.length;i++){let value=corrected[i];if(value==="--")break;if(value===from||value.startsWith(`${from}=`)){corrected[i]=to+value.slice(from.length);break}takesValue.has(value)&&i++}let args=stripSensitiveAuthArgs(corrected).filter(arg2=>!/^-t[^-=]/.test(arg2)),out=[],positionals=0,readCommand=!1;for(let i=0;i<args.length;i++){let value=args[i];if(value==="--"){out.push("--","<argument>");break}if(value.startsWith("-")){if(/^-[A-Za-z][^=].+/.test(value)&&!value.startsWith("--")){let name2=value.slice(0,2);out.push(name2,SAFE_VALUE_FLAGS.has(name2)?value.slice(2):"<value>");continue}let equals=value.indexOf("="),name=equals<0?value:value.slice(0,equals);equals>=0?out.push(`${name}=${SAFE_VALUE_FLAGS.has(name)||valuelessFlags.has(name)&&/^(true|false)$/.test(value.slice(equals+1))?value.slice(equals+1):"<value>"}`):(out.push(name),!valuelessFlags.has(name)&&i+1<args.length&&(takesValue.has(name)||!args[i+1].startsWith("-"))&&(i++,out.push(SAFE_VALUE_FLAGS.has(name)?args[i]:"<value>")))}else positionals++,positionals<=2&&(readCommand||=READ_COMMANDS.has(value)),out.push(positionals<=2||readCommand?value:"<argument>")}return[packageName,...out].map(quoteArg).join(" ")}var argumentErrors=new WeakSet;function isArgumentError(error){return error instanceof Error&&argumentErrors.has(error)}function parseWithSuggestions(args,spec,options){try{return(0,import_arg.default)(spec,{...options,argv:args})}catch(error){if(error instanceof Error&&"code"in error&&["ARG_UNKNOWN_OPTION","ARG_MISSING_REQUIRED_LONGARG","ARG_MISSING_REQUIRED_SHORTARG"].includes(String(error.code))){let err=error,option=/(?:unknown or unexpected option|option requires argument(?: \([^)]*\))?): (--?[A-Za-z0-9-]+)(?: \(alias for --?[A-Za-z0-9-]+\))?$/.exec(err.message)?.[1];option&&(argumentErrors.add(err),err.invalidOption=option,err.allowedOptions=Object.keys(spec).filter(name=>name.startsWith("--")).sort(),err.code==="ARG_UNKNOWN_OPTION"&&(err.suggestedOption=suggestCorrection(option,err.allowedOptions)),err.flagsSpecification=spec)}throw error}}function getArgs(argv,argsOptions,argOptions={}){return parseWithSuggestions(argv,Object.assign({},arg_common_default(),argsOptions),argOptions)}function parseArguments(args,flagsSpecification,parserOptions={}){let{_:positional,...rest}=parseWithSuggestions(args,Object.assign({},arg_common_default(),flagsSpecification),parserOptions);return{args:positional,flags:rest}}function takeCommand(argv,flagsSpecification){let{_:positional}=parseWithSuggestions(argv,Object.assign({},arg_common_default(),flagsSpecification),{stopAtPositional:!0}),index=argv.length-positional.length;return{command:positional[0],args:[...argv.slice(0,index),...argv.slice(index+1)]}}export{require_arg,suggestCorrection,buildCorrectedCommand,isArgumentError,getArgs,parseArguments,takeCommand};
|
|
@@ -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-5NXYYFRL.js";import{detectProjects}from"./chunk-BJXMXDBM.js";import{require_slugify}from"./chunk-COD3WAUI.js";import{selectOrg}from"./chunk-GVUB6QGX.js";import{createProject}from"./chunk-QHJLRTVY.js";import{readJSONFile}from"./chunk-3DP66SQ4.js";import{singleFileProjectSettings,validateRootDirectory}from"./chunk-OHVPJNGY.js";import{require_dist as require_dist2}from"./chunk-QEXSF4NA.js";import{checkExistsAndConnect,parseRepoUrl,selectAndParseRemoteUrl}from"./chunk-MZ3QGJH3.js";import{require_dist2 as require_dist}from"./chunk-5S2NK6K6.js";import{compileVercelConfig,findSourceVercelConfigFile}from"./chunk-JZ7FDBS4.js";import{Separator}from"./chunk-MVGTMPMI.js";import{isPromptBackError,isPromptCanceledError}from"./chunk-P2O5DOYE.js";import{pull}from"./chunk-SI7FQJIE.js";import{require_frameworks}from"./chunk-MVCAUS4F.js";import{table}from"./chunk-773GOZIR.js";import{printError}from"./chunk-HARXQZV3.js";import{getLocalPathConfig}from"./chunk-GLH4PVMY.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-JIGCN5QS.js";import{humanizePath}from"./chunk-PPCFQQSU.js";import{printAlignedLabel}from"./chunk-IJCCFLCQ.js";import{CantParseJSONFile,ProjectNotFound,isAPIError}from"./chunk-XSDAUM4F.js";import{output_manager_default,require_build_utils}from"./chunk-M774HRX5.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.
|
|
@@ -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{events_default}from"./chunk-
|
|
7
|
+
import{events_default}from"./chunk-3NNH2U5M.js";import{require_strip_ansi}from"./chunk-BS32OUOC.js";import{output_manager_default}from"./chunk-M774HRX5.js";import{require_source}from"./chunk-NB2WLB3J.js";import{__toESM}from"./chunk-BZENIQ7N.js";var import_chalk=__toESM(require_source(),1);var import_strip_ansi=__toESM(require_strip_ansi(),1);function displayBuildLogs(client,deployment,follow=!0,onAliasAssigned){let abortController=new AbortController;return{promise:events_default(client,deployment.id,{mode:"logs",onEvent:event=>printBuildLog(event,output_manager_default.print),onAliasAssigned,quiet:!1,findOpts:{direction:"forward",follow}},abortController),abortController}}function collectBuildLogs(client,deployment,follow=!0){let logs=[],abortController=new AbortController;return{promise:events_default(client,deployment.id,{mode:"logs",onEvent:event=>{event.created&&logs.push(event)},quiet:!0,findOpts:{direction:"forward",follow}},abortController).then(()=>logs),abortController}}async function displayBuildLogsUntilFinalError(client,deployment,error){let abortController=new AbortController;return events_default(client,deployment.id,{mode:"logs",onEvent:event=>{printBuildLog(event,output_manager_default.print),event.level==="error"&&event.text?.includes(error)&&abortController.abort()},quiet:!1,findOpts:{direction:"forward",follow:!0}},abortController)}function printBuildLog(log,print){if(!log.created)return;let date=new Date(log.created).toISOString(),cleanText=parseLogLines(log).join(`
|
|
8
8
|
`);for(let line of colorize(cleanText,log).split(`
|
|
9
9
|
`))print(`${import_chalk.default.dim(date)} ${line}
|
|
10
10
|
`)}function sanitize(log){return(0,import_strip_ansi.default)(log.text||"").replace(/\n$/,"").replace(/^\n/,"")}function parseLogLines(log){return sanitize(log).split(`
|
|
@@ -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-PTI3TP7P.js";import{getExitCodeForErrorCode,handleValidationError,validateAllProjectMutualExclusivity}from"./chunk-ZQKDO5PL.js";import{isJSONObject}from"./chunk-V3RDOM3U.js";import{getScope}from"./chunk-GLH4PVMY.js";import{AGENT_REASON,buildCommandWithGlobalFlags,getExitCodeForReason,outputAgentError}from"./chunk-DDLM6CIQ.js";import{getProjectByNameOrId}from"./chunk-JIGCN5QS.js";import{ProjectNotFound,isAPIError}from"./chunk-XSDAUM4F.js";import{output_manager_default}from"./chunk-M774HRX5.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};
|