@frontend-monitor/upload-sourcemaps 0.2.1 → 0.2.2
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.
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
var vt=Object.defineProperty;var te=(t,e)=>()=>(t&&(e=t(t=0)),e);var re=(t,e)=>{for(var o in e)vt(t,o,{get:e[o],enumerable:!0})};var de={};re(de,{extractProjectIdFromCert:()=>Mt,extractUploadKeyFromCert:()=>
|
|
3
|
-
`,
|
|
4
|
-
`));let V=JSON.parse(S||"{}");return e.log("Upload archive OK, server extracted and saved",V.uploaded,".map file(s)"),{ok:!0,uploaded:V.uploaded||0}}finally{await Ke(
|
|
5
|
-
`));let X=(await
|
|
6
|
-
`));let
|
|
7
|
-
sourcemap: { server: true, client: true },`))}return/\bsourcemap\s*:\s*false\b/.test(e)&&(e=e.replace(/(sourcemap\s*:\s*)false\b/g,"$1true")),/\bclient\s*:\s*false\b/.test(e)&&(e=e.replace(/(\bclient\s*:\s*)false\b/g,"$1true")),/\bserver\s*:\s*false\b/.test(e)&&(e=e.replace(/(\bserver\s*:\s*)false\b/g,"$1true")),/\bsourcemap\s*:\s*\{[\s\S]*?\bserver\s*:\s*true\b/.test(e)&&!/\bclient\s*:/.test(e)&&(e=e.replace(/(\bserver\s*:\s*true)\b/,"$1, client: true")),/\bsourcemap\s*:\s*\{[\s\S]*?\bclient\s*:\s*true\b/.test(e)&&!/\bserver\s*:/.test(e)&&(e=e.replace(/(\bsourcemap\s*:\s*\{)/,"$1 server: true, ")),/\bsourcemap\s*:\s*\{\s*\}/.test(e)&&(e=e.replace(/\bsourcemap\s*:\s*\{\s*\}/,"sourcemap: { server: true, client: true }")),/\bsourcemap\s*:\s*\{/.test(e)&&(!/\bclient\s*:\s*true\b/.test(e)||!/\bserver\s*:\s*true\b/.test(e))&&(e=e.replace(/(\bsourcemap\s*:\s*\{)/,"$1 server: true, client: true, ")),e}}];async function
|
|
8
|
-
`,"utf-8")}catch(c){console.error("[upload-sourcemaps] Failed to write package.json:",c.message),process.exitCode=1;return}let a=!1;try{await dr(ie(e,".upload-sourcemaps.json")),a=!0}catch{}console.log("[upload-sourcemaps] init ok. Added",n,"script(s) to package.json."),n>0&&(console.log(" Use: npm run build:upload (build + upload .map)"),console.log(" Or: npm run build:upload:archive (build + pack & upload, recommended)")),a||console.log(" Config: add monitor.config.js or .upload-sourcemaps.json (see README).")}if(
|
|
2
|
+
var vt=Object.defineProperty;var te=(t,e)=>()=>(t&&(e=t(t=0)),e);var re=(t,e)=>{for(var o in e)vt(t,o,{get:e[o],enumerable:!0})};var de={};re(de,{extractProjectIdFromCert:()=>Mt,extractUploadKeyFromCert:()=>Ct});function Mt(t){if(typeof t!="string")return"";let e=t.trim();if(e.startsWith(kt+"$"))return e.split("$")[1]||"";if(e.includes(Re)){let o=e.match(/Project:\s*(\S+)/);return o?o[1]:""}return""}function Ct(t){if(typeof t!="string"||!t.includes(Re))return null;let e=t.match(/Upload-Key:\s*([0-9a-fA-F]{64})/);if(!e)return null;try{return Buffer.from(e[1],"hex")}catch{return null}}var kt,Re,fe=te(()=>{kt="MC1",Re="-----BEGIN MONITOR CERT-----"});var ne={};re(ne,{decryptArchive:()=>jt,encryptArchive:()=>Et,encryptArchiveWithKey:()=>Fe});import{createCipheriv as xt,createDecipheriv as St,createHash as It,randomBytes as Ot}from"crypto";function Ue(t,e){let o=`${t}:${e}`;return It("sha256").update(o,"utf8").digest()}function Et(t,e,o){let r=Ue(e,o);return Fe(t,r)}function Fe(t,e){if(!Buffer.isBuffer(e)||e.length!==32)throw new Error("Invalid key: must be 32-byte Buffer");let o=Ot(me),r=xt(Te,e,o,{authTagLength:oe}),s=Buffer.concat([r.update(t),r.final()]),n=r.getAuthTag();return Buffer.concat([o,s,n])}function jt(t,e,o){if(t.length<me+oe)throw new Error("Invalid encrypted archive: too short");let r=Ue(e,o),s=t.subarray(0,me),n=t.subarray(t.length-oe),a=t.subarray(me,t.length-oe),c=St(Te,r,s,{authTagLength:oe});return c.setAuthTag(n),Buffer.concat([c.update(a),c.final()])}var Te,me,oe,se=te(()=>{Te="aes-256-gcm",me=12,oe=16});var Me={};re(Me,{DEFAULT_EXCLUDE_EXT:()=>N,UPLOAD_MODE_BACKUP:()=>he,UPLOAD_MODE_MAP_ONLY:()=>Ft,collectFiles:()=>be,createArchive:()=>H,createBackupArchive:()=>we,deleteMapFiles:()=>Xe,uploadArchive:()=>Bt});import{createRequire as Dt}from"module";import{readdir as Ne,unlink as _e,readFile as At,mkdtemp as Le,rm as Ke,mkdir as Pt,copyFile as $e,writeFile as Rt}from"fs/promises";import{join as B,relative as Tt,dirname as Be}from"path";import{createWriteStream as ze}from"fs";import{tmpdir as We}from"os";async function be(t,e=t,o={}){let{excludeExt:r=N,mapOnly:s=!1,excludeMap:n=!1}=typeof o=="object"&&o!==null?o:{},a=await Ne(t,{withFileTypes:!0}),c=[];for(let u of a){let l=B(t,u.name),d=Tt(e,l).replace(/\\/g,"/");if(u.isDirectory()){let i=await be(l,e,o);c.push(...i)}else{if(s&&!u.name.endsWith(".map")||!s&&n&&u.name.endsWith(".map"))continue;if(!s&&r&&r.size>0){let i=(u.name.includes(".")?"."+u.name.split(".").pop():"").toLowerCase();if(r.has(i))continue}c.push({relativePath:d,fullPath:l})}}return c}async function H(t,e,o={},r=!0){let s={};o instanceof Set?(s={excludeExt:o,mapOnly:!1},r=arguments[3]!==void 0?arguments[3]:!0):typeof o=="object"&&o!==null&&(s=o);let n=await be(t,t,s),a=n.map(c=>c.relativePath);return a.length===0?0:new Promise((c,u)=>{let l=Je.create({gzip:r,cwd:t},a);l.on("error",u),l.pipe(ze(e)).on("close",()=>c(n.length)).on("error",u)})}async function we(t,e,o={}){let{excludeExt:r=N,includeMapInOutput:s=!0}=typeof o=="object"&&o!==null?o:{},n=await Le(B(We(),"upload-sourcemaps-backup-")),a=Be(e),c=B(a,"project-code.tar.gz"),u=B(n,"project-code.tar.gz");try{let l=await H(t,u,{excludeExt:r||N,mapOnly:!1,excludeMap:!0},!0);if(l===0){let m=B(n,".keep");await Rt(m,""),await H(n,u,{excludeExt:new Set,mapOnly:!1},!0),await _e(m).catch(()=>{})}else await $e(u,c);let d=[];if(s){d=await be(t,t,{mapOnly:!0});for(let m of d){let f=B(n,m.relativePath);await Pt(Be(f),{recursive:!0}),await $e(m.fullPath,f)}}let i=["project-code.tar.gz",...d.map(m=>m.relativePath)];return await $t(n,e,i,!0),{codeFileCount:l,mapFileCount:d.length,codeTarPath:l>0?c:void 0}}finally{await Ke(n,{recursive:!0,force:!0})}}function $t(t,e,o,r=!0){return o.length===0?Promise.resolve(0):new Promise((s,n)=>{let a=Je.create({gzip:r,cwd:t},o);a.on("error",n),a.pipe(ze(e)).on("close",()=>s(o.length)).on("error",n)})}async function Bt(t,e=console){let{dir:o,endpoint:r,projectId:s,secretKey:n,authCert:a,release:c,buildId:u,excludeExt:l,noEncrypt:d,uploadMode:i,keepMapInOutput:m}=t,f=!!a,{extractProjectIdFromCert:k,extractUploadKeyFromCert:v}=await Promise.resolve().then(()=>(fe(),de)),b=s||(f?k(a):""),g=f?v(a):null,D=await Le(B(We(),"upload-sourcemaps-")),j=B(D,"archive.tar.gz"),I=i===he,_=I?null:{excludeExt:l||N,mapOnly:!0};try{let F;if(I){let{codeFileCount:x,mapFileCount:E}=await we(o,j,{excludeExt:l||N,includeMapInOutput:m!==!1});F=Math.max(1,E),m!==!1?e.log("Created backup archive: project-code.tar.gz (",x," files for rollback) + ",E," .map file(s), uploading..."):e.log("Created backup archive: project-code.tar.gz (",x," files for rollback, no .map per project config), uploading...")}else F=await H(o,j,_,!0);if(F===0)return e.log("No files to pack (directory empty or only excluded). Skip upload."),{ok:!0,uploaded:0};let O=await At(j),A=!d&&(f?g!==null:!!(b&&n));if(A)if(g){let{encryptArchiveWithKey:x}=await Promise.resolve().then(()=>(se(),ne));O=x(O,g),I||e.log("Created tar.gz with",F,"file(s), encrypted with cert Upload-Key, uploading...")}else{let{encryptArchive:x}=await Promise.resolve().then(()=>(se(),ne));O=x(O,b,n),I||e.log("Created tar.gz with",F,"file(s), encrypted, uploading...")}else I||e.log("Created tar.gz with",F,"file(s), uploading...");let R="/sourcemaps/upload-archive",P=r.replace(/\/$/,""),T=P.endsWith(R)?P:P+R,h="----UploadSourceMaps"+Date.now().toString(36)+Math.random().toString(36).slice(2),p=`\r
|
|
3
|
+
`,U=Buffer.isBuffer(O)?O:Buffer.from(O),W=A?"archive.tar.gz.enc":"archive.tar.gz",J=Buffer.from([`--${h}${p}`,`Content-Disposition: form-data; name="projectId"${p}${p}`,b+p,`--${h}${p}`,`Content-Disposition: form-data; name="secretKey"${p}${p}`,(f?"":n||"")+p,`--${h}${p}`,`Content-Disposition: form-data; name="release"${p}${p}`,c+p,`--${h}${p}`,`Content-Disposition: form-data; name="buildId"${p}${p}`,(u||"")+p,`--${h}${p}`,`Content-Disposition: form-data; name="encrypted"${p}${p}`,(A?"1":"")+p,`--${h}${p}`,`Content-Disposition: form-data; name="uploadMode"${p}${p}`,(i||"")+p,`--${h}${p}`,`Content-Disposition: form-data; name="file"; filename="${W}"${p}`,`Content-Type: application/octet-stream${p}${p}`].join(""),"utf-8"),Y=Buffer.from(p+`--${h}--${p}`,"utf-8"),q=J.length+U.length+Y.length,Z=(q/1024/1024).toFixed(2),L=64*1024,ue=3e3,Q=0,ee=0,le=x=>{if(typeof process<"u"&&process.stderr&&process.stderr.write){let E=(Q/1024/1024).toFixed(2);process.stderr.write(`\r \u4E0A\u4F20\u8FDB\u5EA6 \u5F52\u6863 ${E}/${Z} MB (${x}%) `)}},pe=()=>{let x=q?Math.min(100,Math.round(Q/q*100)):0,E=Date.now();(x>=100||E-ee>=ue)&&(ee=E,le(x))},Pe=new ReadableStream({start(x){let E=M=>{x.enqueue(M),Q+=M.length,pe()};for(let M=0;M<J.length;M+=L)E(J.subarray(M,Math.min(M+L,J.length)));for(let M=0;M<U.length;M+=L)E(U.subarray(M,Math.min(M+L,U.length)));for(let M=0;M<Y.length;M+=L)E(Y.subarray(M,Math.min(M+L,Y.length)));x.close()}}),X={"X-Project-Id":b,"Content-Type":`multipart/form-data; boundary=${h}`,"Content-Length":String(q)};f?X["X-Auth-Cert"]=a:X["X-Secret-Key"]=n||"";let y=await fetch(T,{method:"POST",headers:X,body:Pe,duplex:"half"}),S=await y.text();if(!y.ok)throw new Error(`${y.status} ${S}`);typeof process<"u"&&process.stderr&&process.stderr.write&&(le(100),process.stderr.write(`
|
|
4
|
+
`));let V=JSON.parse(S||"{}");return e.log("Upload archive OK, server extracted and saved",V.uploaded,".map file(s)"),{ok:!0,uploaded:V.uploaded||0}}finally{await Ke(D,{recursive:!0,force:!0})}}async function Xe(t,e=[]){let o=await Ne(t,{withFileTypes:!0});for(let r of o){let s=B(t,r.name);r.isDirectory()?await Xe(s,e):r.name.endsWith(".map")&&(await _e(s),e.push(s))}return e}var Ut,Je,N,Ft,he,ye=te(()=>{Ut=Dt(import.meta.url),Je=Ut("tar"),N=new Set([".png",".jpg",".jpeg",".gif",".svg",".webp",".ico",".bmp",".avif",".woff",".woff2",".ttf",".eot",".otf",".mp4",".webm",".ogg",".mp3",".wav",".m4a",".aac",".pdf",".doc",".docx",".xls",".xlsx"]),Ft="mapOnly",he="backup"});var He={};re(He,{uploadArchiveChunked:()=>Ht});import{readFile as Nt,mkdtemp as _t,rm as Lt}from"fs/promises";import{join as Ve}from"path";import{tmpdir as Kt}from"os";function Xt(t){return t.replace(/\/$/,"")}function ge(t,e){let o=Xt(t),r=e.startsWith("/")?e:`/${e}`;return o.endsWith(r)?o:o+r}async function Vt(t){return new Promise(e=>setTimeout(e,t))}async function Ce(t,e,o,r=Wt){let s;for(let n=0;n<=r;n++)try{let a=await fetch(t,e),c=await a.text();if(!a.ok)throw new Error(`${a.status} ${c}`);return c?JSON.parse(c):{}}catch(a){if(s=a,n<r){let c=Jt*Math.pow(2,n);o.log?.(` Retry ${n+1}/${r} after ${c}ms: ${a.message}`),await Vt(c)}}throw s}async function Ht(t,e=console){let{dir:o,endpoint:r,projectId:s,secretKey:n,authCert:a,release:c,buildId:u,noEncrypt:l,chunkSizeBytes:d=zt,excludeExt:i,uploadMode:m,keepMapInOutput:f}=t,k=!!a,{extractProjectIdFromCert:v,extractUploadKeyFromCert:b}=await Promise.resolve().then(()=>(fe(),de)),g=s||(k?v(a):""),D=k?b(a):null,j=await _t(Ve(Kt(),"upload-sourcemaps-chunked-")),I=Ve(j,"archive.tar.gz"),_=m===he,F=_?null:{excludeExt:i||N,mapOnly:!0};try{let O;if(_){let{codeFileCount:y,mapFileCount:S}=await we(o,I,{excludeExt:i||N,includeMapInOutput:f!==!1});O=Math.max(1,S),f!==!1?e.log?.("Created backup archive: project-code.tar.gz (",y," files for rollback) + ",S," .map file(s), uploading in chunks..."):e.log?.("Created backup archive: project-code.tar.gz (",y," files for rollback, no .map per project config), uploading in chunks...")}else O=await H(o,I,F,!0);if(O===0)return e.log?.("No files to pack. Skip upload."),{ok:!0,uploaded:0};let A=await Nt(I),R=!l&&(k?D!==null:!!(g&&n));if(R){if(D){let{encryptArchiveWithKey:y}=await Promise.resolve().then(()=>(se(),ne));A=y(A,D)}else{let{encryptArchive:y}=await Promise.resolve().then(()=>(se(),ne));A=y(A,g,n)}_||e.log?.(`Created tar.gz with ${O} file(s), encrypted, uploading in chunks...`)}else _||e.log?.(`Created tar.gz with ${O} file(s), uploading in chunks...`);let P=A.length,T=Math.ceil(P/d),h={"Content-Type":"application/json"};k?h["X-Auth-Cert"]=a:(h["X-Project-Id"]=g,h["X-Secret-Key"]=n||"");let U=(await Ce(ge(r,"/sourcemaps/upload-archive-multipart/init"),{method:"POST",headers:{...h,"Content-Type":"application/json"},body:JSON.stringify({projectId:g,secretKey:k?"":n||"",release:c,buildId:u||void 0,totalChunks:T,chunkSizeBytes:d,encrypted:R,uploadMode:m||void 0})},e)).uploadId;if(!U)throw new Error("Init did not return uploadId");let W=new Set;for(let y=0;y<T;y++)W.add(y);try{let y=await fetch(ge(r,"/sourcemaps/upload-archive-multipart/status")+`?uploadId=${encodeURIComponent(U)}`,{method:"GET",headers:h}),S=await y.text();if(y.ok&&S){let x=JSON.parse(S).receivedChunks||[];x.forEach(E=>W.delete(E)),x.length>0&&e.log?.(`Resume: ${x.length}/${T} chunks already uploaded`)}}catch{}let J=3e3,Z=(T-W.size)*d,L=(P/1024/1024).toFixed(2),ue=()=>{let y=P?Math.min(100,Math.round(Z/P*100)):0,S=(Z/1024/1024).toFixed(2);typeof process<"u"&&process.stderr&&process.stderr.write&&process.stderr.write(`\r \u4E0A\u4F20\u8FDB\u5EA6 \u5206\u7247 ${S}/${L} MB (${y}%) `)},Q=setInterval(ue,J),ee=Math.min(8,T),le=async y=>{let S=y*d,V=Math.min(S+d,P),x=V-S,E=A.subarray(S,V),M=new FormData;M.append("uploadId",U),M.append("index",String(y)),M.append("totalChunks",String(T)),M.append("chunk",new Blob([E]),`chunk-${y}`);let gt=ge(r,"/sourcemaps/upload-archive-multipart/chunk");await Ce(gt,{method:"POST",headers:k?{"X-Auth-Cert":a}:{"X-Project-Id":g,"X-Secret-Key":n||""},body:M},e),Z+=x},pe=[...W].sort((y,S)=>y-S);for(let y=0;y<pe.length;y+=ee){let S=pe.slice(y,y+ee);await Promise.all(S.map(le))}clearInterval(Q),P>0&&typeof process<"u"&&process.stderr&&process.stderr.write&&(ue(),process.stderr.write(`
|
|
5
|
+
`));let X=(await Ce(ge(r,"/sourcemaps/upload-archive-multipart/complete"),{method:"POST",headers:{...h,"Content-Type":"application/json"},body:JSON.stringify({uploadId:U})},e)).uploaded??0;return e.log?.("Chunked upload OK, server extracted and saved",X,".map file(s)"),{ok:!0,uploaded:X}}finally{await Lt(j,{recursive:!0,force:!0})}}var zt,Wt,Jt,Ge=te(()=>{ye();zt=1*1024*1024,Wt=3,Jt=1e3});var dt={};re(dt,{loadMonitorConfig:()=>lt,loadUploadSourcemapsJson:()=>pt,resolveUploadConfig:()=>lr});import{readFile as at}from"fs/promises";import{join as ct,resolve as ur}from"path";import{pathToFileURL as it}from"url";function ut(){try{return process.env.UPLOAD_ENV||process.env.NODE_ENV||"production"}catch{return"production"}}async function lt(t){let e=["monitor.config.js","monitor.config.cjs","monitor.config.mjs"];for(let o of e){let r=ct(t,o),s;try{s=await import(it(r).href)}catch{continue}let n=s.default;if(!n||typeof n!="object")return null;let a=ut(),c=n.common||{},u=n[a]||{},l={...c,...u},d=(l.endpoint||"").trim(),i=(l.apiPrefix||"").trim(),m=d+(i.startsWith("/")?i:i?"/"+i:"");return{projectId:l.projectId,secretKey:l.secretKey,authCert:l.authCert,endpoint:m||void 0,release:l.release||n.version,version:n.version}}return null}async function pt(t){try{let e=await at(ct(t,".upload-sourcemaps.json"),"utf-8");return JSON.parse(e)}catch{return{}}}async function lr(t,e){let o=null,r=null;if(e){let s=ur(t,e);if(e.endsWith(".json"))try{r=JSON.parse(await at(s,"utf-8"))}catch{r={}}else try{let a=(await import(it(s).href)).default;if(a&&typeof a=="object"&&(a.common||a.production||a.development)){let c=ut(),u=a.common||{},l=a[c]||{},d={...u,...l},i=(d.endpoint||"").trim(),m=(d.apiPrefix||"").trim();o={projectId:d.projectId,secretKey:d.secretKey,authCert:d.authCert,endpoint:i+(m.startsWith("/")?m:m?"/"+m:""),release:d.release||a.version}}else r=a||{}}catch{r={}}}else o=await lt(t),r=await pt(t);return{projectId:r.projectId??o?.projectId,secretKey:r.secretKey??o?.secretKey,authCert:r.authCert??o?.authCert,endpoint:r.endpoint??o?.endpoint,release:r.release??o?.release??o?.version,dir:r.dir,chunkSize:r.chunkSize,concurrency:r.concurrency,uploadAsArchive:r.uploadAsArchive,noEncrypt:r.noEncrypt,buildCommand:r.buildCommand,buildOutputDir:r.buildOutputDir,uploadMode:r.uploadMode==="backup"?"backup":"mapOnly"}}var ft=te(()=>{});import{readFile as mt,writeFile as pr,access as dr}from"fs/promises";import{resolve as fr,dirname as mr,join as ie}from"path";import{fileURLToPath as hr}from"url";import{randomUUID as ht}from"crypto";import{spawn as br}from"child_process";import{readdir as Gt,readFile as Yt,unlink as qt,stat as Zt}from"fs/promises";import{join as Qt,basename as ae}from"path";var er=3e3;async function tr(t,e=12){let o=[],r=0;async function s(){for(;r<t.length;){let a=r++;try{o[a]=await t[a]()}catch(c){o[a]=Promise.reject(c)}}}let n=Array.from({length:Math.min(e,t.length)},()=>s());return await Promise.all(n),o}async function qe(t,e=[]){let o;try{o=await Gt(t,{withFileTypes:!0})}catch(r){if(r?.code==="ENOENT")return e;throw r}for(let r of o){let s=Qt(t,r.name);r.isDirectory()?await qe(s,e):r.name.endsWith(".map")&&e.push(s)}return e}var Ye="/sourcemaps/upload";function rr(t){let e=t.replace(/\/$/,"");return e.endsWith(Ye)?e:e+Ye}async function or(t){let{endpoint:e,projectId:o,secretKey:r,authCert:s,release:n,buildId:a,filePath:c}=t,u=!!s,l=o||(u?(await Promise.resolve().then(()=>(fe(),de))).extractProjectIdFromCert(s):""),d=ae(c,".map"),i=await Yt(c),m=rr(e),f=new FormData;f.append("projectId",l),u||f.append("secretKey",r||""),f.append("release",n),a&&f.append("buildId",a),f.append("filename",d),f.append("file",new Blob([i]),ae(c));let v=await fetch(m,{method:"POST",headers:u?{"X-Project-Id":l,"X-Auth-Cert":s}:{"X-Project-Id":l,"X-Secret-Key":r||""},body:f}),b=await v.text();if(!v.ok)throw new Error(`${v.status} ${b}`);return JSON.parse(b||"{}")}async function xe(t,e=console){let{dir:o,endpoint:r,projectId:s,secretKey:n,authCert:a,release:c,buildId:u,deleteAfterUpload:l=!1,deleteEvenOnFailure:d=!1,concurrency:i=12}=t,m=await qe(o);if(m.length===0)return e.log("No .map files found in",o),{ok:0,fail:0,deleted:0};let f=Math.max(1,Math.min(64,Number(i)||12)),k=l&&d,v=m.length,b=await Promise.all(m.map(h=>Zt(h).then(p=>p.size))),g=b.reduce((h,p)=>h+p,0),D=(g/1024/1024).toFixed(2);e.log("Uploading",v,"source map(s) to",r,"release=",c,"concurrency=",f,l?k?"(will delete local .map even on failure)":"(will delete local .map only after all succeed)":"");let j=0,I=()=>{let h=g?Math.min(100,Math.round(j/g*100)):0,p=(j/1024/1024).toFixed(2);typeof process<"u"&&process.stderr&&process.stderr.write&&process.stderr.write(`\r \u4E0A\u4F20\u8FDB\u5EA6 ${p}/${D} MB (${h}%) `)},_=setInterval(I,er),F=m.map((h,p)=>()=>or({endpoint:r,projectId:s,secretKey:n,authCert:a,release:c,buildId:u,filePath:h}).then(()=>(j+=b[p],{ok:!0,name:ae(h)})).catch(U=>(j+=b[p],{ok:!1,name:ae(h),err:U}))),O=await tr(F,f);clearInterval(_),g>0&&process.stderr&&process.stderr.write&&(I(),process.stderr.write(`
|
|
6
|
+
`));let A=0,R=0;for(let h of O)h.ok?(e.log(" OK",h.name),A++):(e.error(" FAIL",h.name,h.err?.message||h.err),R++);let P=l&&(R===0||d),T=0;if(P&&m.length>0){for(let h of m)try{await qt(h),T++,e.log(" Deleted",ae(h))}catch(p){e.error(" Delete failed",h,p.message)}R>0&&d&&e.log("Deleted .map files despite upload failures. Fix errors and re-run to re-upload.")}else R>0&&!d&&e.log("Upload had failures. Local .map files were NOT deleted. Fix errors and re-run.");return{ok:A,fail:R,deleted:T}}async function Se(t,e=console){let{uploadArchive:o,deleteMapFiles:r}=await Promise.resolve().then(()=>(ye(),Me)),{dir:s,endpoint:n,projectId:a,secretKey:c,authCert:u,release:l,buildId:d,deleteEvenOnFailure:i=!1,noEncrypt:m,uploadMode:f,excludeExt:k}=t;try{let{uploaded:v}=await o({dir:s,endpoint:n,projectId:a,secretKey:c,authCert:u,release:l,buildId:d,noEncrypt:m,uploadMode:f,excludeExt:k},e);if(v===0)return{uploaded:0,deleted:0};let b=await r(s,[]);return e.log("Deleted",b.length,"local .map file(s)."),{uploaded:v,deleted:b.length}}catch(v){if(i)try{let b=await r(s,[]);e.log("Deleted",b.length,"local .map file(s) despite upload failure.")}catch(b){e.error("Delete .map after upload failure failed:",b.message)}else e.error("Upload failed. Local .map files were NOT deleted.",v.message);throw v}}async function Ie(t,e=console){let{uploadArchiveChunked:o}=await Promise.resolve().then(()=>(Ge(),He)),{deleteMapFiles:r}=await Promise.resolve().then(()=>(ye(),Me)),{dir:s,endpoint:n,projectId:a,secretKey:c,authCert:u,release:l,buildId:d,deleteEvenOnFailure:i=!1,noEncrypt:m,chunkSizeBytes:f,uploadMode:k,excludeExt:v}=t;try{let{uploaded:b}=await o({dir:s,endpoint:n,projectId:a,secretKey:c,authCert:u,release:l,buildId:d,noEncrypt:m,chunkSizeBytes:f,uploadMode:k,excludeExt:v},e);if(b===0)return{uploaded:0,deleted:0};let g=await r(s,[]);return e.log("Deleted",g.length,"local .map file(s)."),{uploaded:b,deleted:g.length}}catch(b){if(i)try{let g=await r(s,[]);e.log("Deleted",g.length,"local .map file(s) despite upload failure.")}catch(g){e.error("Delete .map after upload failure failed:",g.message)}else e.error("Upload failed. Local .map files were NOT deleted.",b.message);throw b}}import{readFile as Oe}from"fs/promises";import{join as $,resolve as ce}from"path";async function G(t){let e=t?ce(process.cwd(),t):process.cwd(),o=[process.cwd(),e,ce(e,".."),ce(e,"..",".."),ce(e,"..","..","..")],r=new Set;for(let s of o){let n=s&&ce(s);if(!(!n||r.has(n))){r.add(n);try{return await Oe($(n,"package.json"),"utf-8"),n}catch{continue}}}return null}async function K(t){try{return await Oe(t,"utf-8")}catch{return""}}async function Ze(t){let e=["vite.config.js","vite.config.mjs","vite.config.cjs","vite.config.ts"];for(let o of e){let r=await K($(t,o));if(r){if(/\bsourcemap\s*:\s*false\b/.test(r)||/build\s*:\s*\{[^}]*sourcemap\s*:\s*false/.test(r))return{emitsSourceMap:!1,bundler:"vite",keepMapInOutput:!1};if(/\bsourcemap\s*:\s*['"]inline['"]/.test(r)||/build\s*:\s*\{[\s\S]*?sourcemap\s*:\s*['"]inline['"]/.test(r))return{emitsSourceMap:!0,bundler:"vite",keepMapInOutput:!1};if(/\bsourcemap\s*:\s*true\b/.test(r)||/\bsourcemap\s*:\s*['"]hidden['"]/.test(r))return{emitsSourceMap:!0,bundler:"vite",keepMapInOutput:!0};if(/build\s*:\s*\{[\s\S]*?sourcemap\s*:\s*true/.test(r))return{emitsSourceMap:!0,bundler:"vite",keepMapInOutput:!0};if(/build\s*:\s*\{[\s\S]*?sourcemap\s*:\s*['"]hidden['"]/.test(r))return{emitsSourceMap:!0,bundler:"vite",keepMapInOutput:!0};if(/BUILD_SOURCEMAP|SOURCEMAP/.test(r)&&/build\s*:\s*\{[\s\S]*?sourcemap\s*:/.test(r))return{emitsSourceMap:!0,bundler:"vite",keepMapInOutput:!0};if(/build\s*:|\bdefineConfig\s*\(/.test(r))return{emitsSourceMap:!1,bundler:"vite",keepMapInOutput:!1}}}return null}async function Qe(t){let e=["webpack.config.js","webpack.config.cjs","webpack.config.mjs","webpack.config.ts","webpack.common.js","webpack.prod.js"];for(let o of e){let r=await K($(t,o));if(r){if(/\bdevtool\s*:\s*false\b/.test(r))return{emitsSourceMap:!1,bundler:"webpack",keepMapInOutput:!1};if(/\bdevtool\s*:\s*['"]source-map['"]/.test(r)||/\bdevtool\s*:\s*['"]hidden-source-map['"]/.test(r))return{emitsSourceMap:!0,bundler:"webpack",keepMapInOutput:!0};if(/\bdevtool\s*:\s*true\b/.test(r))return{emitsSourceMap:!0,bundler:"webpack",keepMapInOutput:!0}}}return null}async function et(t){let e=await K($(t,"vue.config.js"))||await K($(t,"vue.config.cjs"));return e?/\bproductionSourceMap\s*:\s*false\b/.test(e)?{emitsSourceMap:!1,bundler:"vue-cli",keepMapInOutput:!1}:/\bproductionSourceMap\s*:\s*true\b/.test(e)?{emitsSourceMap:!0,bundler:"vue-cli",keepMapInOutput:!0}:/\.devtool\s*\(\s*['"]source-map['"]\s*\)/.test(e)?{emitsSourceMap:!0,bundler:"vue-cli",keepMapInOutput:!0}:null:null}async function tt(t){let e=["rollup.config.js","rollup.config.mjs","rollup.config.cjs"];for(let o of e){let r=await K($(t,o));if(r){if(/\bsourcemap\s*:\s*false\b/.test(r))return{emitsSourceMap:!1,bundler:"rollup",keepMapInOutput:!1};if(/\bsourcemap\s*:\s*['"]inline['"]/.test(r))return{emitsSourceMap:!0,bundler:"rollup",keepMapInOutput:!1};if(/\bsourcemap\s*:\s*true\b/.test(r))return{emitsSourceMap:!0,bundler:"rollup",keepMapInOutput:!0}}}return null}async function rt(t){let e=["next.config.js","next.config.mjs","next.config.cjs","next.config.ts"];for(let o of e){let r=await K($(t,o));if(r){if(/\bproductionBrowserSourceMaps\s*:\s*true\b/.test(r))return{emitsSourceMap:!0,bundler:"next",keepMapInOutput:!0};if(/\bproductionBrowserSourceMaps\s*:\s*false\b/.test(r))return{emitsSourceMap:!1,bundler:"next",keepMapInOutput:!1};if(/module\.exports|next\s*\(/.test(r))return{emitsSourceMap:!1,bundler:"next",keepMapInOutput:!1}}}return null}async function ot(t){let e=await K($(t,"nuxt.config.js"))||await K($(t,"nuxt.config.ts"));return e?/\bsourcemap\s*:\s*false\b/.test(e)?{emitsSourceMap:!1,bundler:"nuxt",keepMapInOutput:!1}:/\bsourcemap\s*:\s*true\b/.test(e)?{emitsSourceMap:!0,bundler:"nuxt",keepMapInOutput:!0}:/\bsourcemap\s*:\s*\{[\s\S]*?\bclient\s*:\s*false\b/.test(e)||/\bsourcemap\s*:\s*\{[\s\S]*?\bserver\s*:\s*false\b/.test(e)?{emitsSourceMap:!1,bundler:"nuxt",keepMapInOutput:!1}:/\bsourcemap\s*:\s*\{[\s\S]*?\bclient\s*:\s*true\b/.test(e)?{emitsSourceMap:!0,bundler:"nuxt",keepMapInOutput:!0}:/\bsourcemap\s*:\s*\{[\s\S]*?\bserver\s*:\s*true[\s\S]*?\bclient\s*:\s*true\b/.test(e)?{emitsSourceMap:!0,bundler:"nuxt",keepMapInOutput:!0}:null:null}function nr(t){let e={...t.dependencies,...t.devDependencies};return!e||typeof e!="object"?null:e.vite||e.vite?"vite":e.next?"next":e.nuxt||e.nuxt3?"nuxt":e.vue&&(e["@vue/cli-service"]||e["vue-cli-service"])?"vue-cli":e.webpack||e["react-scripts"]||e["@angular/cli"]?"webpack":e.rollup?"rollup":e.parcel?"parcel":null}async function ve(t){let e=await G(t);if(!e)return{emitsSourceMap:!0,keepMapInOutput:!1};let o={};try{let n=await Oe($(e,"package.json"),"utf-8");o=JSON.parse(n)}catch{return{emitsSourceMap:!0,keepMapInOutput:!1}}let r=nr(o),s=[()=>r==="vite"?Ze(e):null,()=>r==="next"?rt(e):null,()=>r==="nuxt"?ot(e):null,()=>r==="vue-cli"?et(e):null,()=>r==="webpack"?Qe(e):null,()=>r==="rollup"?tt(e):null,()=>Ze(e),()=>rt(e),()=>et(e),()=>Qe(e),()=>tt(e),()=>ot(e)];for(let n of s){let a=await n();if(a)return a}return{emitsSourceMap:!0,keepMapInOutput:!1}}import{readFile as je,writeFile as ke,unlink as sr}from"fs/promises";import{join as nt,resolve as ar}from"path";var De=".upload-sourcemaps.patch-backup.json";async function cr(t){try{return await je(t,"utf-8")}catch{return""}}function ir(t){let e={...t?.dependencies||{},...t?.devDependencies||{}};return e.vite||e.vite?"vite":e.next?"next":e.nuxt||e.nuxt3?"nuxt":e.vue&&(e["@vue/cli-service"]||e["vue-cli-service"])?"vue-cli":e.webpack||e["react-scripts"]||e["@angular/cli"]?"webpack":e.rollup?"rollup":null}var Ee=[{name:"vite",configNames:["vite.config.js","vite.config.mjs","vite.config.cjs","vite.config.ts"],needPatch:t=>/\bsourcemap\s*:\s*false\b/.test(t),patch:t=>t.replace(/(sourcemap\s*:\s*)false\b/,"$1true")},{name:"webpack",configNames:["webpack.config.js","webpack.config.cjs","webpack.config.mjs","webpack.config.ts","webpack.common.js","webpack.prod.js"],needPatch:t=>/\bdevtool\s*:\s*false\b/.test(t),patch:t=>t.replace(/(devtool\s*:\s*)false\b/,(e,o)=>`${o}'source-map'`)},{name:"vue-cli",configNames:["vue.config.js","vue.config.cjs"],needPatch:t=>/\bproductionSourceMap\s*:\s*false\b/.test(t),patch:t=>t.replace(/(productionSourceMap\s*:\s*)false\b/,"$1true")},{name:"rollup",configNames:["rollup.config.js","rollup.config.mjs","rollup.config.cjs"],needPatch:t=>/\bsourcemap\s*:\s*false\b/.test(t),patch:t=>t.replace(/(sourcemap\s*:\s*)false\b/,"$1true")},{name:"next",configNames:["next.config.js","next.config.mjs","next.config.cjs","next.config.ts"],needPatch:t=>/\bproductionBrowserSourceMaps\s*:\s*false\b/.test(t),patch:t=>t.replace(/(productionBrowserSourceMaps\s*:\s*)false\b/,"$1true")},{name:"nuxt",configNames:["nuxt.config.js","nuxt.config.ts"],needPatch:t=>!!(!/\bsourcemap\s*:/.test(t)||/\bsourcemap\s*:\s*false\b/.test(t)||/\bsourcemap\s*:\s*\{/.test(t)&&(/\bclient\s*:\s*false\b/.test(t)||/\bserver\s*:\s*false\b/.test(t)||!/\bclient\s*:\s*true\b/.test(t)||!/\bserver\s*:\s*true\b/.test(t))),patch:t=>{let e=t;if(!/\bsourcemap\s*:\s*\{[\s\S]*?\b(server|client)\s*:/.test(e)){let r=e.match(/(defineNuxtConfig\s*\(\s*)\{/);r&&(e=e.replace(/(defineNuxtConfig\s*\(\s*)\{/,`${r[1]}{
|
|
7
|
+
sourcemap: { server: true, client: true },`))}return/\bsourcemap\s*:\s*false\b/.test(e)&&(e=e.replace(/(sourcemap\s*:\s*)false\b/g,"$1true")),/\bclient\s*:\s*false\b/.test(e)&&(e=e.replace(/(\bclient\s*:\s*)false\b/g,"$1true")),/\bserver\s*:\s*false\b/.test(e)&&(e=e.replace(/(\bserver\s*:\s*)false\b/g,"$1true")),/\bsourcemap\s*:\s*\{[\s\S]*?\bserver\s*:\s*true\b/.test(e)&&!/\bclient\s*:/.test(e)&&(e=e.replace(/(\bserver\s*:\s*true)\b/,"$1, client: true")),/\bsourcemap\s*:\s*\{[\s\S]*?\bclient\s*:\s*true\b/.test(e)&&!/\bserver\s*:/.test(e)&&(e=e.replace(/(\bsourcemap\s*:\s*\{)/,"$1 server: true, ")),/\bsourcemap\s*:\s*\{\s*\}/.test(e)&&(e=e.replace(/\bsourcemap\s*:\s*\{\s*\}/,"sourcemap: { server: true, client: true }")),/\bsourcemap\s*:\s*\{/.test(e)&&(!/\bclient\s*:\s*true\b/.test(e)||!/\bserver\s*:\s*true\b/.test(e))&&(e=e.replace(/(\bsourcemap\s*:\s*\{)/,"$1 server: true, client: true, ")),e}}];async function Ae(t,e={}){let o=await G(t);if(!o)return{restore:async()=>{}};let r={};try{let a=await je(nt(o,"package.json"),"utf-8");r=JSON.parse(a)}catch{return{restore:async()=>{}}}let s=ir(r),n=s?[...Ee.filter(a=>a.name===s),...Ee.filter(a=>a.name!==s)]:Ee;for(let a of n)for(let c of a.configNames){let u=nt(o,c),l=await cr(u);if(!l||!a.needPatch(l))continue;let d=a.patch(l);try{await ke(u,d,"utf-8")}catch(i){throw console.error(`[upload-sourcemaps] Failed to patch ${u}:`,i?.message||i),new Error(`Cannot modify config file ${u}: ${i?.message||i}. Check file permissions.`)}if(e.writeBackupTo)try{let i={configPath:ar(u),content:l};await ke(e.writeBackupTo,JSON.stringify(i),"utf-8")}catch(i){console.warn("[upload-sourcemaps] Warning: Failed to write backup file:",e.writeBackupTo,i?.message||i),console.warn(" Config was patched, but restore may not work. You may need to manually restore the config.")}return console.log("[upload-sourcemaps] Patched %s to enable source map (%s)",u,a.name),{patchedFile:u,restore:async()=>{try{await ke(u,l,"utf-8")}catch(i){throw console.error(`[upload-sourcemaps] Restore ${a.name} config failed:`,i?.message||i),i}}}}return{restore:async()=>{}}}async function st(t){try{let e=await je(t,"utf-8"),{configPath:o,content:r}=JSON.parse(e);return!o||r===void 0?!1:(await ke(o,r,"utf-8"),await sr(t),console.log("[upload-sourcemaps] Restored %s",o),!0)}catch{return!1}}var ao=mr(hr(import.meta.url));function C(t,e){let o=process.env[e];if(o)return o;let r=process.argv.indexOf(t);return r!==-1&&process.argv[r+1]?process.argv[r+1]:null}function z(t){return process.argv.includes(t)}function wr(t){if(t==null||t==="")return null;let e=String(t).trim().toUpperCase(),o=parseInt(e.replace(/[^0-9]/g,""),10)||0;return e.endsWith("G")?o*1024*1024*1024:e.endsWith("MB")||e.endsWith("M")?o*1024*1024:e.endsWith("KB")||e.endsWith("K")?o*1024:/^\d+$/.test(String(t).trim())?parseInt(String(t).trim(),10)||null:o>0?o*1024*1024:null}function bt(t={}){let e=C("--chunk-size","UPLOAD_SOURCEMAPS_CHUNK_SIZE")||t.chunkSize;return wr(e)}async function yr(){let{resolveUploadConfig:t}=await Promise.resolve().then(()=>(ft(),dt));return t(process.cwd(),C("--config","UPLOAD_SOURCEMAPS_CONFIG")||void 0)}async function gr(t){let e=[t,fr(t,".."),process.cwd()];for(let o of e)try{let r=await mt(ie(o,"package.json"),"utf-8"),s=JSON.parse(r);if(s.version&&typeof s.version=="string")return s.version.trim()}catch{continue}return null}async function wt(t,e){return t&&t!=="default"?t:await gr(e)||"default"}var w={};try{w=await yr()}catch{w={}}var vr=process.argv[2]==="build",kr=process.argv[2]==="patch",Mr=process.argv[2]==="restore",Cr=process.argv[2]==="init";function yt(t,e){return t||e===!0}async function xr(){let t=C("--project-id","PROJECT_ID")||w.projectId,e=C("--secret-key","SECRET_KEY")||w.secretKey,o=C("--auth-cert","MONITOR_AUTH_CERT")||w.authCert,r=(C("--endpoint","ENDPOINT")||w.endpoint||"").replace(/\/$/,"");if(!r)throw new Error("build subcommand requires endpoint (config file or env/args).");if(!o&&(!t||!e))throw new Error("build subcommand requires projectId+secretKey or authCert (config file or env/args).");let s=w.buildCommand||process.env.UPLOAD_SOURCEMAPS_BUILD_CMD||"npm run build",n=w.buildOutputDir||w.dir||C("--dir","DIR")||process.cwd(),a=z("--archive")||w.uploadAsArchive===!0,c=yt(z("--no-encrypt"),w.noEncrypt),u=C("--upload-mode","UPLOAD_MODE")||w.uploadMode||"mapOnly";u==="all"&&(u="backup");let l=await ve(n),d=!l.keepMapInOutput||z("--delete-after-upload")||z("-d")||w.deleteAfterUpload===!0,i=C("--build-id","BUILD_ID")||w.buildId||ht(),m=await Ae(n);try{console.log("Step 1: Running build (forcing source map generation):",s),console.log("Build ID:",i);let[f,...k]=s.split(/\s+/);await new Promise((g,D)=>{br(f,k,{stdio:"inherit",shell:!0,env:{...process.env,BUILD_SOURCEMAP:"1",SOURCEMAP:"1",MONITOR_BUILD_ID:i,VITE_MONITOR_BUILD_ID:i}}).on("exit",I=>I===0?g():D(new Error(`Build exited ${I}`)))}),console.log("Step 2: Uploading source maps...");let v=await wt(C("--release","RELEASE")||w.release,n);v!=="default"&&console.log("Release (from package.json or config):",v);let b=bt(w);if(a){let g={dir:n,endpoint:r,projectId:t,secretKey:e,authCert:o,release:v,buildId:i,deleteEvenOnFailure:!1,noEncrypt:c,uploadMode:u,keepMapInOutput:l.keepMapInOutput};(b?await Ie({...g,chunkSizeBytes:b},console):await Se(g,console)).uploaded===0&&console.log("No .map files in output. For Vite we patch config to force source map; check build output dir and README.")}else{let g=Math.max(1,Math.min(64,parseInt(C("--concurrency","CONCURRENCY")||w.concurrency||"12",10)||12)),{ok:D,fail:j}=await xe({endpoint:r,projectId:t,secretKey:e,authCert:o,release:v,buildId:i,dir:n,deleteAfterUpload:d,deleteEvenOnFailure:!1,concurrency:g},console);if(j>0)throw new Error("Upload had failures. Local .map files were NOT deleted. Fix errors and re-run.");D===0&&console.log("No .map files in output. For Vite we patch config to force source map; check build output dir and README.")}console.log("Done. Output dir:",n)}catch(f){throw console.error("Error:",f.message),console.error(d?"If the failure was during upload, local .map files may have been removed. Fix the issue and re-run.":"Local files were not modified. Fix the issue and re-run."),f}finally{try{await m.restore()}catch(f){console.error("[upload-sourcemaps] Warning: Failed to restore config file:",f?.message||f),console.error(" You may need to manually restore your bundler config file.")}}}var Sr={"build:upload":"upload-sourcemaps build","build:upload:archive":"upload-sourcemaps build --archive"};async function Ir(){let t=process.cwd(),e=await G(t);if(!e){console.error("[upload-sourcemaps] Cannot find project root (no package.json from:",t,"). Run from project root."),process.exitCode=1;return}let o=ie(e,"package.json"),r;try{let c=await mt(o,"utf-8");r=JSON.parse(c)}catch(c){console.error("[upload-sourcemaps] Failed to read package.json:",c.message),process.exitCode=1;return}let s=r.scripts||{},n=0;for(let[c,u]of Object.entries(Sr))s[c]||(s[c]=u,n++);r.scripts=s;try{await pr(o,JSON.stringify(r,null,2)+`
|
|
8
|
+
`,"utf-8")}catch(c){console.error("[upload-sourcemaps] Failed to write package.json:",c.message),process.exitCode=1;return}let a=!1;try{await dr(ie(e,".upload-sourcemaps.json")),a=!0}catch{}console.log("[upload-sourcemaps] init ok. Added",n,"script(s) to package.json."),n>0&&(console.log(" Use: npm run build:upload (build + upload .map)"),console.log(" Or: npm run build:upload:archive (build + pack & upload, recommended)")),a||console.log(" Config: add monitor.config.js or .upload-sourcemaps.json (see README).")}if(Cr)await Ir();else if(kr){let t=C("--dir","DIR")||w.dir||process.cwd(),e=await G(t);if(!e)console.error("[upload-sourcemaps] Could not find project root (no package.json from dir:",t,"). Fix --dir or run from project root."),process.exitCode=1;else{let o=ie(e,De),r=await Ae(t,{writeBackupTo:o});if(r.patchedFile){try{let{readFile:s}=await import("fs/promises"),n=await s(r.patchedFile,"utf-8"),a=/sourcemap\s*:\s*\{\s*[\s\S]*?server\s*:\s*true[\s\S]*?client\s*:\s*true/.test(n)||/sourcemap\s*:\s*\{\s*[\s\S]*?client\s*:\s*true[\s\S]*?server\s*:\s*true/.test(n),c=/sourcemap\s*:\s*true/.test(n);console.log("[upload-sourcemaps] Verified:",a?"top-level sourcemap":"(no top-level)",c?"vite.build.sourcemap=true":"")}catch{}console.log("Run your build, then run: upload-sourcemaps restore")}else console.log("No config needed patching (source map already enabled or unsupported bundler).")}}else if(Mr){let t=C("--backup","UPLOAD_SOURCEMAPS_PATCH_BACKUP")||ie(process.cwd(),De),e=await st(t);if(!e.success)if(e.error==="Backup file not found"){let o=C("--dir","DIR")||w.dir||process.cwd();try{(await ve(o)).emitsSourceMap?(console.log("[upload-sourcemaps] No backup file found, but source map is already enabled in your bundler config."),console.log(' No restore needed. Your config was not modified by "upload-sourcemaps patch".'),process.exitCode=0):(console.error("[upload-sourcemaps] Restore failed: Backup file not found"),console.error(" Backup file path:",t),console.error(' Tip: Run "upload-sourcemaps patch" first to create a backup, then build, then "upload-sourcemaps restore".'),console.error(' Or use "upload-sourcemaps build" which handles patch/restore automatically.'),process.exitCode=1)}catch(r){console.error("[upload-sourcemaps] Restore failed: Backup file not found"),console.error(" Backup file path:",t),console.error(" Could not check bundler config:",r?.message||r),console.error(' Tip: Run "upload-sourcemaps patch" first to create a backup, then build, then "upload-sourcemaps restore".'),console.error(' Or use "upload-sourcemaps build" which handles patch/restore automatically.'),process.exitCode=1}}else console.error("[upload-sourcemaps] Restore failed:",e.error||"Unknown error"),console.error(" Backup file path:",t),process.exitCode=1}else if(vr)try{await xr()}catch{process.exitCode=1}else{let t=C("--project-id","PROJECT_ID")||w.projectId,e=C("--secret-key","SECRET_KEY")||w.secretKey,o=C("--auth-cert","MONITOR_AUTH_CERT")||w.authCert,r=(C("--endpoint","ENDPOINT")||w.endpoint||"").replace(/\/$/,""),s=C("--dir","DIR")||w.dir||process.cwd(),n=await wt(C("--release","RELEASE")||w.release,s),a=C("--build-id","BUILD_ID")||w.buildId||ht(),c=z("--archive")||w.uploadAsArchive===!0,u=yt(z("--no-encrypt"),w.noEncrypt),l=bt(w),d=Math.max(1,Math.min(64,parseInt(C("--concurrency","CONCURRENCY")||w.concurrency||"12",10)||12)),i=C("--upload-mode","UPLOAD_MODE")||w.uploadMode||"mapOnly";i==="all"&&(i="backup");let m=await ve(s),f=!m.keepMapInOutput||z("--delete-after-upload")||z("-d")||w.deleteAfterUpload===!0;if(!r)console.error("Usage: ENDPOINT is required.");else if(!o&&(!t||!e))console.error("Usage: PROJECT_ID and SECRET_KEY are required, or use AUTH_CERT (certificate auth)."),console.error(""),console.error(" Arguments:"),console.error(" --project-id <id> Project ID"),console.error(" --secret-key <key> Secret Key"),console.error(" --endpoint <url> API base URL (e.g. https://api.example.com/monitorApi)"),console.error(" --auth-cert <cert> Certificate content (or MONITOR_AUTH_CERT); use with monitor.config.js, no secretKey needed"),console.error(" --release <tag> Release version (default: read from package.json)"),console.error(" --build-id <id> Build ID (default: auto-generated UUID)"),console.error(" --dir <path> Directory (default: cwd)"),console.error(" --concurrency <n> Max parallel uploads when not using --archive (default: 12)"),console.error(" --delete-after-upload, -d Delete local .map after upload (from deployment output)"),console.error(" --archive Pack as .tar.gz (encrypted by default) \u2192 upload \u2192 server decrypts and extracts"),console.error(" --upload-mode <mode> mapOnly (default) | backup (code tar, .map \u4F9D\u9879\u76EE\u914D\u7F6E\u662F\u5426\u4FDD\u7559)"),console.error(" --chunk-size <size> With --archive: chunked upload (e.g. 1M, 5M), default 1MB, enables resumable and retry"),console.error(" --no-encrypt With --archive: upload plain tar.gz (certificate auth implies no-encrypt)"),console.error(" --config <path> Config file (default: monitor.config.js + .upload-sourcemaps.json)"),console.error(""),console.error(" Subcommands:"),console.error(" init Add recommended scripts to package.json (build:upload, build:upload:archive)"),console.error(" build One-step: run build then upload source maps"),console.error(" patch / restore Temporarily enable source map in bundler config, then restore"),console.error(""),console.error(" Whether to delete .map after upload: inferred from project bundler config (Vite/Webpack etc.). Use -d to force delete."),process.exitCode=1;else{n!=="default"&&console.log("Release:",n),console.log("Build ID:",a);try{if(c){let k={dir:s,endpoint:r,projectId:t,secretKey:e,authCert:o,release:n,buildId:a,deleteEvenOnFailure:!1,noEncrypt:u,uploadMode:i,keepMapInOutput:m.keepMapInOutput};l?await Ie({...k,chunkSizeBytes:l},console):await Se(k,console)}else{let{ok:k,fail:v,deleted:b}=await xe({endpoint:r,projectId:t,secretKey:e,authCert:o,release:n,buildId:a,dir:s,deleteAfterUpload:f,deleteEvenOnFailure:f,concurrency:d},console);b>0&&console.log("Deleted",b,"local .map file(s) from output."),v>0&&(console.error(f?"Upload had failures. Local .map files were still deleted (per project config). Fix errors and re-run to re-upload.":"Upload had failures. Local .map files were NOT deleted. Fix errors and re-run."),process.exitCode=1)}}catch(k){console.error("Error:",k.message),console.error(f?"Local .map files were still deleted. Fix the issue and re-run.":"Local files were not modified. Fix the issue and re-run."),process.exitCode=1}}}
|