@frontend-monitor/upload-sourcemaps 0.0.2 → 0.0.3

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/README.zh-CN.md CHANGED
@@ -181,7 +181,7 @@ npx upload-sourcemaps
181
181
 
182
182
  ### 分片上传(--chunk-size)
183
183
 
184
- 与 `--archive` 同用时,可加 `--chunk-size 1M` 启用分片上传、断点续传与重试,适合 Nginx 限制 body 或大压缩包。
184
+ 与 `--archive` 同用时,可加 `--chunk-size 1M` 启用分片上传、断点续传与重试,适合 Nginx 限制 body 或大压缩包。init、每个分片、complete 请求均带自动重试(指数退避),同次运行内会先查已上传分片再补传,减少失败重跑成本。
185
185
 
186
186
  ### build 子命令:强制生成 Source Map
187
187
 
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- var He=Object.defineProperty;var K=(t,e)=>()=>(t&&(e=t(t=0)),e);var _=(t,e)=>{for(var o in e)He(t,o,{get:e[o],enumerable:!0})};var z={};_(z,{extractProjectIdFromCert:()=>Ge,extractUploadKeyFromCert:()=>qe});function Ge(t){if(typeof t!="string")return"";let e=t.trim();if(e.startsWith(Ve+"$"))return e.split("$")[1]||"";if(e.includes(de)){let o=e.match(/Project:\s*(\S+)/);return o?o[1]:""}return""}function qe(t){if(typeof t!="string"||!t.includes(de))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 Ve,de,J=K(()=>{Ve="MC1",de="-----BEGIN MONITOR CERT-----"});var L={};_(L,{decryptArchive:()=>rt,encryptArchive:()=>tt,encryptArchiveWithKey:()=>he});import{createCipheriv as Ye,createDecipheriv as Ze,createHash as Qe,randomBytes as et}from"crypto";function me(t,e){let o=`${t}:${e}`;return Qe("sha256").update(o,"utf8").digest()}function tt(t,e,o){let r=me(e,o);return he(t,r)}function he(t,e){if(!Buffer.isBuffer(e)||e.length!==32)throw new Error("Invalid key: must be 32-byte Buffer");let o=et(X),r=Ye(fe,e,o,{authTagLength:B}),a=Buffer.concat([r.update(t),r.final()]),n=r.getAuthTag();return Buffer.concat([o,a,n])}function rt(t,e,o){if(t.length<X+B)throw new Error("Invalid encrypted archive: too short");let r=me(e,o),a=t.subarray(0,X),n=t.subarray(t.length-B),s=t.subarray(X,t.length-B),c=Ze(fe,r,a,{authTagLength:B});return c.setAuthTag(n),Buffer.concat([c.update(s),c.final()])}var fe,X,B,$=K(()=>{fe="aes-256-gcm",X=12,B=16});var te={};_(te,{DEFAULT_EXCLUDE_EXT:()=>V,collectFiles:()=>ee,createArchive:()=>G,deleteMapFiles:()=>ye,uploadArchive:()=>ft});import{createRequire as ot}from"module";import{readdir as we,unlink as nt,readFile as at,mkdtemp as st,rm as ct}from"fs/promises";import{join as H,relative as it}from"path";import{createWriteStream as ut}from"fs";import{tmpdir as lt}from"os";async function ee(t,e=t,o=V){let r=await we(t,{withFileTypes:!0}),a=[];for(let n of r){let s=H(t,n.name),c=it(e,s).replace(/\\/g,"/");if(n.isDirectory()){let p=await ee(s,e,o);a.push(...p)}else{let p=(n.name.includes(".")?"."+n.name.split(".").pop():"").toLowerCase();if(o.has(p))continue;a.push({relativePath:c,fullPath:s})}}return a}async function G(t,e,o=V,r=!0){let a=await ee(t,t,o),n=a.map(s=>s.relativePath);return n.length===0?0:new Promise((s,c)=>{let p=dt.create({gzip:r,cwd:t},n);p.on("error",c),p.pipe(ut(e)).on("close",()=>s(a.length)).on("error",c)})}async function ft(t,e=console){let{dir:o,endpoint:r,projectId:a,secretKey:n,authCert:s,release:c,buildId:p,excludeExt:f,noEncrypt:i}=t,d=!!s,{extractProjectIdFromCert:u,extractUploadKeyFromCert:m}=await Promise.resolve().then(()=>(J(),z)),l=a||(d?u(s):""),h=d?m(s):null,y=await st(H(lt(),"upload-sourcemaps-")),g=H(y,"archive.tar.gz");try{let k=await G(o,g,f||V,!0);if(k===0)return e.log("No files to pack (directory empty or only excluded). Skip upload."),{ok:!0,uploaded:0};let S=await at(g),x=!i&&(d?h!==null:!!(l&&n));if(x)if(h){let{encryptArchiveWithKey:D}=await Promise.resolve().then(()=>($(),L));S=D(S,h),e.log("Created tar.gz with",k,"file(s), encrypted with cert Upload-Key, uploading...")}else{let{encryptArchive:D}=await Promise.resolve().then(()=>($(),L));S=D(S,l,n),e.log("Created tar.gz with",k,"file(s), encrypted, uploading...")}else e.log("Created tar.gz with",k,"file(s), uploading...");let R="/sourcemaps/upload-archive",T=r.replace(/\/$/,""),C=T.endsWith(R)?T:T+R,I=new FormData;I.append("projectId",l),d||I.append("secretKey",n||""),I.append("release",c),p&&I.append("buildId",p),x&&I.append("encrypted","1"),I.append("file",new Blob([S]),x?"archive.tar.gz.enc":"archive.tar.gz");let M={"X-Project-Id":l};d?M["X-Auth-Cert"]=s:M["X-Secret-Key"]=n||"";let P=await fetch(C,{method:"POST",headers:M,body:I}),Z=await P.text();if(!P.ok)throw new Error(`${P.status} ${Z}`);let A=JSON.parse(Z||"{}");return e.log("Upload archive OK, server extracted and saved",A.uploaded,".map file(s)"),{ok:!0,uploaded:A.uploaded||0}}finally{await ct(y,{recursive:!0,force:!0})}}async function ye(t,e=[]){let o=await we(t,{withFileTypes:!0});for(let r of o){let a=H(t,r.name);r.isDirectory()?await ye(a,e):r.name.endsWith(".map")&&(await nt(a),e.push(a))}return e}var pt,dt,V,q=K(()=>{pt=ot(import.meta.url),dt=pt("tar"),V=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"])});var ge={};_(ge,{uploadArchiveChunked:()=>xt});import{readFile as mt,mkdtemp as ht,rm as wt}from"fs/promises";import{join as be}from"path";import{tmpdir as yt}from"os";function It(t){return t.replace(/\/$/,"")}function Y(t,e){let o=It(t),r=e.startsWith("/")?e:`/${e}`;return o.endsWith(r)?o:o+r}async function kt(t){return new Promise(e=>setTimeout(e,t))}async function St(t,e,o,r=gt){let a;for(let n=0;n<=r;n++)try{let s=await fetch(t,e),c=await s.text();if(!s.ok)throw new Error(`${s.status} ${c}`);return c?JSON.parse(c):{}}catch(s){if(a=s,n<r){let c=vt*Math.pow(2,n);o.log?.(` Retry ${n+1}/${r} after ${c}ms: ${s.message}`),await kt(c)}}throw a}async function xt(t,e=console){let{dir:o,endpoint:r,projectId:a,secretKey:n,authCert:s,release:c,buildId:p,noEncrypt:f,chunkSizeBytes:i=bt,excludeExt:d}=t,u=!!s,{extractProjectIdFromCert:m,extractUploadKeyFromCert:l}=await Promise.resolve().then(()=>(J(),z)),h=a||(u?m(s):""),y=u?l(s):null,g=await ht(be(yt(),"upload-sourcemaps-chunked-")),k=be(g,"archive.tar.gz");try{let S=await G(o,k,d||void 0,!0);if(S===0)return e.log?.("No files to pack. Skip upload."),{ok:!0,uploaded:0};let x=await mt(k),R=!f&&(u?y!==null:!!(h&&n));if(R){if(y){let{encryptArchiveWithKey:b}=await Promise.resolve().then(()=>($(),L));x=b(x,y)}else{let{encryptArchive:b}=await Promise.resolve().then(()=>($(),L));x=b(x,h,n)}e.log?.(`Created tar.gz with ${S} file(s), encrypted, uploading in chunks...`)}else e.log?.(`Created tar.gz with ${S} file(s), uploading in chunks...`);let T=x.length,C=Math.ceil(T/i),I={"Content-Type":"application/json"};u?I["X-Auth-Cert"]=s:(I["X-Project-Id"]=h,I["X-Secret-Key"]=n||"");let M=await fetch(Y(r,"/sourcemaps/upload-archive-multipart/init"),{method:"POST",headers:{...I,"Content-Type":"application/json"},body:JSON.stringify({projectId:h,secretKey:u?"":n||"",release:c,buildId:p||void 0,totalChunks:C,chunkSizeBytes:i,encrypted:R})}),P=await M.text();if(!M.ok)throw new Error(`${M.status} ${P}`);let A=JSON.parse(P||"{}").uploadId;if(!A)throw new Error("Init did not return uploadId");let D=new Set;for(let b=0;b<C;b++)D.add(b);try{let b=await fetch(Y(r,"/sourcemaps/upload-archive-multipart/status")+`?uploadId=${encodeURIComponent(A)}`,{method:"GET",headers:I}),F=await b.text();if(b.ok&&F){let N=JSON.parse(F).receivedChunks||[];N.forEach(U=>D.delete(U)),N.length>0&&e.log?.(`Resume: ${N.length}/${C} chunks already uploaded`)}}catch{}for(let b=0;b<C;b++){if(!D.has(b))continue;let F=b*i,pe=Math.min(F+i,T),N=x.subarray(F,pe),U=new FormData;U.append("uploadId",A),U.append("index",String(b)),U.append("totalChunks",String(C)),U.append("chunk",new Blob([N]),`chunk-${b}`);let Xe=Y(r,"/sourcemaps/upload-archive-multipart/chunk");await St(Xe,{method:"POST",headers:u?{"X-Auth-Cert":s}:{"X-Project-Id":h,"X-Secret-Key":n||""},body:U},e),e.log?.(` Chunk ${b+1}/${C} OK`)}let Q=await fetch(Y(r,"/sourcemaps/upload-archive-multipart/complete"),{method:"POST",headers:{...I,"Content-Type":"application/json"},body:JSON.stringify({uploadId:A})}),ue=await Q.text();if(!Q.ok)throw new Error(`${Q.status} ${ue}`);let le=JSON.parse(ue||"{}").uploaded??0;return e.log?.("Chunked upload OK, server extracted and saved",le,".map file(s)"),{ok:!0,uploaded:le}}finally{await wt(g,{recursive:!0,force:!0})}}var bt,gt,vt,ve=K(()=>{q();bt=1*1024*1024,gt=3,vt=1e3});var Be={};_(Be,{loadMonitorConfig:()=>Ke,loadUploadSourcemapsJson:()=>_e,resolveUploadConfig:()=>Rt});import{readFile as Pe}from"fs/promises";import{join as Re,resolve as Pt}from"path";import{pathToFileURL as Fe}from"url";function Ne(){try{return process.env.UPLOAD_ENV||process.env.NODE_ENV||"production"}catch{return"production"}}async function Ke(t){let e=["monitor.config.js","monitor.config.cjs","monitor.config.mjs"];for(let o of e){let r=Re(t,o),a;try{a=await import(Fe(r).href)}catch{continue}let n=a.default;if(!n||typeof n!="object")return null;let s=Ne(),c=n.common||{},p=n[s]||{},f={...c,...p},i=(f.endpoint||"").trim(),d=(f.apiPrefix||"").trim(),u=i+(d.startsWith("/")?d:d?"/"+d:"");return{projectId:f.projectId,secretKey:f.secretKey,authCert:f.authCert,endpoint:u||void 0,release:f.release||n.version,version:n.version}}return null}async function _e(t){try{let e=await Pe(Re(t,".upload-sourcemaps.json"),"utf-8");return JSON.parse(e)}catch{return{}}}async function Rt(t,e){let o=null,r=null;if(e){let a=Pt(t,e);if(e.endsWith(".json"))try{r=JSON.parse(await Pe(a,"utf-8"))}catch{r={}}else try{let s=(await import(Fe(a).href)).default;if(s&&typeof s=="object"&&(s.common||s.production||s.development)){let c=Ne(),p=s.common||{},f=s[c]||{},i={...p,...f},d=(i.endpoint||"").trim(),u=(i.apiPrefix||"").trim();o={projectId:i.projectId,secretKey:i.secretKey,authCert:i.authCert,endpoint:d+(u.startsWith("/")?u:u?"/"+u:""),release:i.release||s.version}}else r=s||{}}catch{r={}}}else o=await Ke(t),r=await _e(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,uploadAsArchive:r.uploadAsArchive,noEncrypt:r.noEncrypt,buildCommand:r.buildCommand,buildOutputDir:r.buildOutputDir}}var Le=K(()=>{});import{readFile as Ft}from"fs/promises";import{resolve as Nt,dirname as Kt,join as _t}from"path";import{fileURLToPath as Bt}from"url";import{randomUUID as $e}from"crypto";import{spawn as Lt}from"child_process";import{readdir as jt,readFile as Ct,unlink as Et}from"fs/promises";import{join as Ot,basename as W}from"path";async function ke(t,e=[]){let o;try{o=await jt(t,{withFileTypes:!0})}catch(r){if(r?.code==="ENOENT")return e;throw r}for(let r of o){let a=Ot(t,r.name);r.isDirectory()?await ke(a,e):r.name.endsWith(".map")&&e.push(a)}return e}var Ie="/sourcemaps/upload";function Mt(t){let e=t.replace(/\/$/,"");return e.endsWith(Ie)?e:e+Ie}async function At(t){let{endpoint:e,projectId:o,secretKey:r,authCert:a,release:n,buildId:s,filePath:c}=t,p=!!a,f=o||(p?(await Promise.resolve().then(()=>(J(),z))).extractProjectIdFromCert(a):""),i=W(c,".map"),d=await Ct(c),u=Mt(e),m=new FormData;m.append("projectId",f),p||m.append("secretKey",r||""),m.append("release",n),s&&m.append("buildId",s),m.append("filename",i),m.append("file",new Blob([d]),W(c));let h=await fetch(u,{method:"POST",headers:p?{"X-Project-Id":f,"X-Auth-Cert":a}:{"X-Project-Id":f,"X-Secret-Key":r||""},body:m}),y=await h.text();if(!h.ok)throw new Error(`${h.status} ${y}`);return JSON.parse(y||"{}")}async function re(t,e=console){let{dir:o,endpoint:r,projectId:a,secretKey:n,authCert:s,release:c,buildId:p,deleteAfterUpload:f=!1,deleteEvenOnFailure:i=!1}=t,d=await ke(o);if(d.length===0)return e.log("No .map files found in",o),{ok:0,fail:0,deleted:0};let u=f&&i;e.log("Uploading",d.length,"source map(s) to",r,"release=",c,f?u?"(will delete local .map even on failure)":"(will delete local .map only after all succeed)":"");let m=0,l=0;for(let g of d)try{await At({endpoint:r,projectId:a,secretKey:n,authCert:s,release:c,buildId:p,filePath:g}),e.log(" OK",W(g)),m++}catch(k){e.error(" FAIL",W(g),k.message),l++}let h=f&&(l===0||i),y=0;if(h&&d.length>0){for(let g of d)try{await Et(g),y++,e.log(" Deleted",W(g))}catch(k){e.error(" Delete failed",g,k.message)}l>0&&i&&e.log("Deleted .map files despite upload failures. Fix errors and re-run to re-upload.")}else l>0&&!i&&e.log("Upload had failures. Local .map files were NOT deleted. Fix errors and re-run.");return{ok:m,fail:l,deleted:y}}async function oe(t,e=console){let{uploadArchive:o,deleteMapFiles:r}=await Promise.resolve().then(()=>(q(),te)),{dir:a,endpoint:n,projectId:s,secretKey:c,authCert:p,release:f,buildId:i,deleteEvenOnFailure:d=!1,noEncrypt:u}=t;try{let{uploaded:m}=await o({dir:a,endpoint:n,projectId:s,secretKey:c,authCert:p,release:f,buildId:i,noEncrypt:u},e);if(m===0)return{uploaded:0,deleted:0};let l=await r(a,[]);return e.log("Deleted",l.length,"local .map file(s)."),{uploaded:m,deleted:l.length}}catch(m){if(d)try{let l=await r(a,[]);e.log("Deleted",l.length,"local .map file(s) despite upload failure.")}catch(l){e.error("Delete .map after upload failure failed:",l.message)}else e.error("Upload failed. Local .map files were NOT deleted.",m.message);throw m}}async function ne(t,e=console){let{uploadArchiveChunked:o}=await Promise.resolve().then(()=>(ve(),ge)),{deleteMapFiles:r}=await Promise.resolve().then(()=>(q(),te)),{dir:a,endpoint:n,projectId:s,secretKey:c,authCert:p,release:f,buildId:i,deleteEvenOnFailure:d=!1,noEncrypt:u,chunkSizeBytes:m}=t;try{let{uploaded:l}=await o({dir:a,endpoint:n,projectId:s,secretKey:c,authCert:p,release:f,buildId:i,noEncrypt:u,chunkSizeBytes:m},e);if(l===0)return{uploaded:0,deleted:0};let h=await r(a,[]);return e.log("Deleted",h.length,"local .map file(s)."),{uploaded:l,deleted:h.length}}catch(l){if(d)try{let h=await r(a,[]);e.log("Deleted",h.length,"local .map file(s) despite upload failure.")}catch(h){e.error("Delete .map after upload failure failed:",h.message)}else e.error("Upload failed. Local .map files were NOT deleted.",l.message);throw l}}import{readFile as ae}from"fs/promises";import{join as j,resolve as Se}from"path";async function se(t){let e=[t,Se(t,".."),Se(t,"..",".."),process.cwd()];for(let o of e)try{return await ae(j(o,"package.json"),"utf-8"),o}catch{continue}return null}async function E(t){try{return await ae(t,"utf-8")}catch{return""}}async function xe(t){let e=["vite.config.js","vite.config.mjs","vite.config.cjs","vite.config.ts"];for(let o of e){let r=await E(j(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 je(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 E(j(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 Ce(t){let e=await E(j(t,"vue.config.js"))||await E(j(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 Ee(t){let e=["rollup.config.js","rollup.config.mjs","rollup.config.cjs"];for(let o of e){let r=await E(j(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 Oe(t){let e=["next.config.js","next.config.mjs","next.config.cjs","next.config.ts"];for(let o of e){let r=await E(j(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 Me(t){let e=await E(j(t,"nuxt.config.js"))||await E(j(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}:null:null}function Dt(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 ce(t){let e=await se(t);if(!e)return{emitsSourceMap:!0,keepMapInOutput:!1};let o={};try{let n=await ae(j(e,"package.json"),"utf-8");o=JSON.parse(n)}catch{return{emitsSourceMap:!0,keepMapInOutput:!1}}let r=Dt(o),a=[()=>r==="vite"?xe(e):null,()=>r==="next"?Oe(e):null,()=>r==="nuxt"?Me(e):null,()=>r==="vue-cli"?Ce(e):null,()=>r==="webpack"?je(e):null,()=>r==="rollup"?Ee(e):null,()=>xe(e),()=>Oe(e),()=>Ce(e),()=>je(e),()=>Ee(e),()=>Me(e)];for(let n of a){let s=await n();if(s)return s}return{emitsSourceMap:!0,keepMapInOutput:!1}}import{readFile as Ue,writeFile as Ae}from"fs/promises";import{join as De}from"path";async function Ut(t){try{return await Ue(t,"utf-8")}catch{return""}}function Tt(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 ie=[{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*:\s*false\b/.test(t),patch:t=>t.replace(/(sourcemap\s*:\s*)false\b/,"$1true")}];async function Te(t){let e=await se(t);if(!e)return{restore:async()=>{}};let o={};try{let n=await Ue(De(e,"package.json"),"utf-8");o=JSON.parse(n)}catch{return{restore:async()=>{}}}let r=Tt(o),a=r?[...ie.filter(n=>n.name===r),...ie.filter(n=>n.name!==r)]:ie;for(let n of a)for(let s of n.configNames){let c=De(e,s),p=await Ut(c);if(!p||!n.needPatch(p))continue;let f=n.patch(p);return await Ae(c,f,"utf-8"),{restore:async()=>{try{await Ae(c,p,"utf-8")}catch(i){console.error(`Restore ${n.name} config failed:`,i?.message||i)}}}}return{restore:async()=>{}}}var Er=Kt(Bt(import.meta.url));function v(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 O(t){return process.argv.includes(t)}function $t(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 We(t={}){let e=v("--chunk-size","UPLOAD_SOURCEMAPS_CHUNK_SIZE")||t.chunkSize;return $t(e)}async function Wt(){let{resolveUploadConfig:t}=await Promise.resolve().then(()=>(Le(),Be));return t(process.cwd(),v("--config","UPLOAD_SOURCEMAPS_CONFIG")||void 0)}async function zt(t){let e=[t,Nt(t,".."),process.cwd()];for(let o of e)try{let r=await Ft(_t(o,"package.json"),"utf-8"),a=JSON.parse(r);if(a.version&&typeof a.version=="string")return a.version.trim()}catch{continue}return null}async function ze(t,e){return t&&t!=="default"?t:await zt(e)||"default"}var w=await Wt(),Jt=process.argv[2]==="build";function Je(t,e){return t||e===!0}async function Xt(){let t=v("--project-id","PROJECT_ID")||w.projectId,e=v("--secret-key","SECRET_KEY")||w.secretKey,o=v("--auth-cert","MONITOR_AUTH_CERT")||w.authCert,r=(v("--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 a=w.buildCommand||process.env.UPLOAD_SOURCEMAPS_BUILD_CMD||"npm run build",n=w.buildOutputDir||w.dir||v("--dir","DIR")||process.cwd(),s=O("--archive")||w.uploadAsArchive===!0,c=Je(O("--no-encrypt"),w.noEncrypt),f=!(await ce(n)).keepMapInOutput||O("--delete-after-upload")||O("-d")||w.deleteAfterUpload===!0,i=v("--build-id","BUILD_ID")||w.buildId||$e(),d=await Te(n);try{console.log("Step 1: Running build (forcing source map generation):",a),console.log("Build ID:",i);let[u,...m]=a.split(/\s+/);await new Promise((y,g)=>{Lt(u,m,{stdio:"inherit",shell:!0,env:{...process.env,BUILD_SOURCEMAP:"1",SOURCEMAP:"1",MONITOR_BUILD_ID:i,VITE_MONITOR_BUILD_ID:i}}).on("exit",S=>S===0?y():g(new Error(`Build exited ${S}`)))}),console.log("Step 2: Uploading source maps...");let l=await ze(v("--release","RELEASE")||w.release,n);l!=="default"&&console.log("Release (from package.json or config):",l);let h=We(w);if(s){let y={dir:n,endpoint:r,projectId:t,secretKey:e,authCert:o,release:l,buildId:i,deleteEvenOnFailure:!1,noEncrypt:c};(h?await ne({...y,chunkSizeBytes:h},console):await oe(y,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{ok:y,fail:g}=await re({endpoint:r,projectId:t,secretKey:e,authCert:o,release:l,buildId:i,dir:n,deleteAfterUpload:f,deleteEvenOnFailure:!1},console);if(g>0)throw new Error("Upload had failures. Local .map files were NOT deleted. Fix errors and re-run.");y===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(u){throw console.error("Error:",u.message),console.error(f?"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."),u}finally{await d.restore()}}if(Jt)try{await Xt()}catch{process.exitCode=1}else{let t=v("--project-id","PROJECT_ID")||w.projectId,e=v("--secret-key","SECRET_KEY")||w.secretKey,o=v("--auth-cert","MONITOR_AUTH_CERT")||w.authCert,r=(v("--endpoint","ENDPOINT")||w.endpoint||"").replace(/\/$/,""),a=v("--dir","DIR")||w.dir||process.cwd(),n=await ze(v("--release","RELEASE")||w.release,a),s=v("--build-id","BUILD_ID")||w.buildId||$e(),c=O("--archive")||w.uploadAsArchive===!0,p=Je(O("--no-encrypt"),w.noEncrypt),f=We(w),d=!(await ce(a)).keepMapInOutput||O("--delete-after-upload")||O("-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(" --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(" --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(" 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:",s);try{if(c){let u={dir:a,endpoint:r,projectId:t,secretKey:e,authCert:o,release:n,buildId:s,deleteEvenOnFailure:!1,noEncrypt:p};f?await ne({...u,chunkSizeBytes:f},console):await oe(u,console)}else{let{ok:u,fail:m,deleted:l}=await re({endpoint:r,projectId:t,secretKey:e,authCert:o,release:n,buildId:s,dir:a,deleteAfterUpload:d,deleteEvenOnFailure:d},console);l>0&&console.log("Deleted",l,"local .map file(s) from output."),m>0&&(console.error(d?"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(u){console.error("Error:",u.message),console.error(d?"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}}}
2
+ var Je=Object.defineProperty;var N=(t,e)=>()=>(t&&(e=t(t=0)),e);var K=(t,e)=>{for(var o in e)Je(t,o,{get:e[o],enumerable:!0})};var z={};K(z,{extractProjectIdFromCert:()=>He,extractUploadKeyFromCert:()=>Ve});function He(t){if(typeof t!="string")return"";let e=t.trim();if(e.startsWith(Xe+"$"))return e.split("$")[1]||"";if(e.includes(le)){let o=e.match(/Project:\s*(\S+)/);return o?o[1]:""}return""}function Ve(t){if(typeof t!="string"||!t.includes(le))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 Xe,le,J=N(()=>{Xe="MC1",le="-----BEGIN MONITOR CERT-----"});var B={};K(B,{decryptArchive:()=>et,encryptArchive:()=>Qe,encryptArchiveWithKey:()=>fe});import{createCipheriv as Ge,createDecipheriv as qe,createHash as Ye,randomBytes as Ze}from"crypto";function de(t,e){let o=`${t}:${e}`;return Ye("sha256").update(o,"utf8").digest()}function Qe(t,e,o){let r=de(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=Ze(X),r=Ge(pe,e,o,{authTagLength:_}),a=Buffer.concat([r.update(t),r.final()]),n=r.getAuthTag();return Buffer.concat([o,a,n])}function et(t,e,o){if(t.length<X+_)throw new Error("Invalid encrypted archive: too short");let r=de(e,o),a=t.subarray(0,X),n=t.subarray(t.length-_),s=t.subarray(X,t.length-_),c=qe(pe,r,a,{authTagLength:_});return c.setAuthTag(n),Buffer.concat([c.update(s),c.final()])}var pe,X,_,L=N(()=>{pe="aes-256-gcm",X=12,_=16});var ee={};K(ee,{DEFAULT_EXCLUDE_EXT:()=>V,collectFiles:()=>Q,createArchive:()=>G,deleteMapFiles:()=>he,uploadArchive:()=>pt});import{createRequire as tt}from"module";import{readdir as me,unlink as rt,readFile as ot,mkdtemp as nt,rm as at}from"fs/promises";import{join as H,relative as st}from"path";import{createWriteStream as ct}from"fs";import{tmpdir as it}from"os";async function Q(t,e=t,o=V){let r=await me(t,{withFileTypes:!0}),a=[];for(let n of r){let s=H(t,n.name),c=st(e,s).replace(/\\/g,"/");if(n.isDirectory()){let p=await Q(s,e,o);a.push(...p)}else{let p=(n.name.includes(".")?"."+n.name.split(".").pop():"").toLowerCase();if(o.has(p))continue;a.push({relativePath:c,fullPath:s})}}return a}async function G(t,e,o=V,r=!0){let a=await Q(t,t,o),n=a.map(s=>s.relativePath);return n.length===0?0:new Promise((s,c)=>{let p=lt.create({gzip:r,cwd:t},n);p.on("error",c),p.pipe(ct(e)).on("close",()=>s(a.length)).on("error",c)})}async function pt(t,e=console){let{dir:o,endpoint:r,projectId:a,secretKey:n,authCert:s,release:c,buildId:p,excludeExt:f,noEncrypt:i}=t,d=!!s,{extractProjectIdFromCert:u,extractUploadKeyFromCert:m}=await Promise.resolve().then(()=>(J(),z)),l=a||(d?u(s):""),h=d?m(s):null,y=await nt(H(it(),"upload-sourcemaps-")),g=H(y,"archive.tar.gz");try{let k=await G(o,g,f||V,!0);if(k===0)return e.log("No files to pack (directory empty or only excluded). Skip upload."),{ok:!0,uploaded:0};let S=await ot(g),j=!i&&(d?h!==null:!!(l&&n));if(j)if(h){let{encryptArchiveWithKey:T}=await Promise.resolve().then(()=>(L(),B));S=T(S,h),e.log("Created tar.gz with",k,"file(s), encrypted with cert Upload-Key, uploading...")}else{let{encryptArchive:T}=await Promise.resolve().then(()=>(L(),B));S=T(S,l,n),e.log("Created tar.gz with",k,"file(s), encrypted, uploading...")}else e.log("Created tar.gz with",k,"file(s), uploading...");let P="/sourcemaps/upload-archive",D=r.replace(/\/$/,""),C=D.endsWith(P)?D:D+P,I=new FormData;I.append("projectId",l),d||I.append("secretKey",n||""),I.append("release",c),p&&I.append("buildId",p),j&&I.append("encrypted","1"),I.append("file",new Blob([S]),j?"archive.tar.gz.enc":"archive.tar.gz");let W={"X-Project-Id":l};d?W["X-Auth-Cert"]=s:W["X-Secret-Key"]=n||"";let E=await fetch(C,{method:"POST",headers:W,body:I}),U=await E.text();if(!E.ok)throw new Error(`${E.status} ${U}`);let Z=JSON.parse(U||"{}");return e.log("Upload archive OK, server extracted and saved",Z.uploaded,".map file(s)"),{ok:!0,uploaded:Z.uploaded||0}}finally{await at(y,{recursive:!0,force:!0})}}async function he(t,e=[]){let o=await me(t,{withFileTypes:!0});for(let r of o){let a=H(t,r.name);r.isDirectory()?await he(a,e):r.name.endsWith(".map")&&(await rt(a),e.push(a))}return e}var ut,lt,V,q=N(()=>{ut=tt(import.meta.url),lt=ut("tar"),V=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"])});var ye={};K(ye,{uploadArchiveChunked:()=>It});import{readFile as dt,mkdtemp as ft,rm as mt}from"fs/promises";import{join as we}from"path";import{tmpdir as ht}from"os";function gt(t){return t.replace(/\/$/,"")}function Y(t,e){let o=gt(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 te(t,e,o,r=yt){let a;for(let n=0;n<=r;n++)try{let s=await fetch(t,e),c=await s.text();if(!s.ok)throw new Error(`${s.status} ${c}`);return c?JSON.parse(c):{}}catch(s){if(a=s,n<r){let c=bt*Math.pow(2,n);o.log?.(` Retry ${n+1}/${r} after ${c}ms: ${s.message}`),await vt(c)}}throw a}async function It(t,e=console){let{dir:o,endpoint:r,projectId:a,secretKey:n,authCert:s,release:c,buildId:p,noEncrypt:f,chunkSizeBytes:i=wt,excludeExt:d}=t,u=!!s,{extractProjectIdFromCert:m,extractUploadKeyFromCert:l}=await Promise.resolve().then(()=>(J(),z)),h=a||(u?m(s):""),y=u?l(s):null,g=await ft(we(ht(),"upload-sourcemaps-chunked-")),k=we(g,"archive.tar.gz");try{let S=await G(o,k,d||void 0,!0);if(S===0)return e.log?.("No files to pack. Skip upload."),{ok:!0,uploaded:0};let j=await dt(k),P=!f&&(u?y!==null:!!(h&&n));if(P){if(y){let{encryptArchiveWithKey:b}=await Promise.resolve().then(()=>(L(),B));j=b(j,y)}else{let{encryptArchive:b}=await Promise.resolve().then(()=>(L(),B));j=b(j,h,n)}e.log?.(`Created tar.gz with ${S} file(s), encrypted, uploading in chunks...`)}else e.log?.(`Created tar.gz with ${S} file(s), uploading in chunks...`);let D=j.length,C=Math.ceil(D/i),I={"Content-Type":"application/json"};u?I["X-Auth-Cert"]=s:(I["X-Project-Id"]=h,I["X-Secret-Key"]=n||"");let E=(await te(Y(r,"/sourcemaps/upload-archive-multipart/init"),{method:"POST",headers:{...I,"Content-Type":"application/json"},body:JSON.stringify({projectId:h,secretKey:u?"":n||"",release:c,buildId:p||void 0,totalChunks:C,chunkSizeBytes:i,encrypted:P})},e)).uploadId;if(!E)throw new Error("Init did not return uploadId");let U=new Set;for(let b=0;b<C;b++)U.add(b);try{let b=await fetch(Y(r,"/sourcemaps/upload-archive-multipart/status")+`?uploadId=${encodeURIComponent(E)}`,{method:"GET",headers:I}),F=await b.text();if(b.ok&&F){let R=JSON.parse(F).receivedChunks||[];R.forEach(A=>U.delete(A)),R.length>0&&e.log?.(`Resume: ${R.length}/${C} chunks already uploaded`)}}catch{}for(let b=0;b<C;b++){if(!U.has(b))continue;let F=b*i,ue=Math.min(F+i,D),R=j.subarray(F,ue),A=new FormData;A.append("uploadId",E),A.append("index",String(b)),A.append("totalChunks",String(C)),A.append("chunk",new Blob([R]),`chunk-${b}`);let ze=Y(r,"/sourcemaps/upload-archive-multipart/chunk");await te(ze,{method:"POST",headers:u?{"X-Auth-Cert":s}:{"X-Project-Id":h,"X-Secret-Key":n||""},body:A},e),e.log?.(` Chunk ${b+1}/${C} OK`)}let T=(await te(Y(r,"/sourcemaps/upload-archive-multipart/complete"),{method:"POST",headers:{...I,"Content-Type":"application/json"},body:JSON.stringify({uploadId:E})},e)).uploaded??0;return e.log?.("Chunked upload OK, server extracted and saved",T,".map file(s)"),{ok:!0,uploaded:T}}finally{await mt(g,{recursive:!0,force:!0})}}var wt,yt,bt,be=N(()=>{q();wt=1*1024*1024,yt=3,bt=1e3});var Ke={};K(Ke,{loadMonitorConfig:()=>Re,loadUploadSourcemapsJson:()=>Ne,resolveUploadConfig:()=>Ut});import{readFile as Ue}from"fs/promises";import{join as Te,resolve as Dt}from"path";import{pathToFileURL as Pe}from"url";function Fe(){try{return process.env.UPLOAD_ENV||process.env.NODE_ENV||"production"}catch{return"production"}}async function Re(t){let e=["monitor.config.js","monitor.config.cjs","monitor.config.mjs"];for(let o of e){let r=Te(t,o),a;try{a=await import(Pe(r).href)}catch{continue}let n=a.default;if(!n||typeof n!="object")return null;let s=Fe(),c=n.common||{},p=n[s]||{},f={...c,...p},i=(f.endpoint||"").trim(),d=(f.apiPrefix||"").trim(),u=i+(d.startsWith("/")?d:d?"/"+d:"");return{projectId:f.projectId,secretKey:f.secretKey,authCert:f.authCert,endpoint:u||void 0,release:f.release||n.version,version:n.version}}return null}async function Ne(t){try{let e=await Ue(Te(t,".upload-sourcemaps.json"),"utf-8");return JSON.parse(e)}catch{return{}}}async function Ut(t,e){let o=null,r=null;if(e){let a=Dt(t,e);if(e.endsWith(".json"))try{r=JSON.parse(await Ue(a,"utf-8"))}catch{r={}}else try{let s=(await import(Pe(a).href)).default;if(s&&typeof s=="object"&&(s.common||s.production||s.development)){let c=Fe(),p=s.common||{},f=s[c]||{},i={...p,...f},d=(i.endpoint||"").trim(),u=(i.apiPrefix||"").trim();o={projectId:i.projectId,secretKey:i.secretKey,authCert:i.authCert,endpoint:d+(u.startsWith("/")?u:u?"/"+u:""),release:i.release||s.version}}else r=s||{}}catch{r={}}}else o=await Re(t),r=await Ne(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,uploadAsArchive:r.uploadAsArchive,noEncrypt:r.noEncrypt,buildCommand:r.buildCommand,buildOutputDir:r.buildOutputDir}}var _e=N(()=>{});import{readFile as Tt}from"fs/promises";import{resolve as Pt,dirname as Ft,join as Rt}from"path";import{fileURLToPath as Nt}from"url";import{randomUUID as Be}from"crypto";import{spawn as Kt}from"child_process";import{readdir as kt,readFile as St,unlink as jt}from"fs/promises";import{join as xt,basename as $}from"path";async function ve(t,e=[]){let o;try{o=await kt(t,{withFileTypes:!0})}catch(r){if(r?.code==="ENOENT")return e;throw r}for(let r of o){let a=xt(t,r.name);r.isDirectory()?await ve(a,e):r.name.endsWith(".map")&&e.push(a)}return e}var ge="/sourcemaps/upload";function Ct(t){let e=t.replace(/\/$/,"");return e.endsWith(ge)?e:e+ge}async function Et(t){let{endpoint:e,projectId:o,secretKey:r,authCert:a,release:n,buildId:s,filePath:c}=t,p=!!a,f=o||(p?(await Promise.resolve().then(()=>(J(),z))).extractProjectIdFromCert(a):""),i=$(c,".map"),d=await St(c),u=Ct(e),m=new FormData;m.append("projectId",f),p||m.append("secretKey",r||""),m.append("release",n),s&&m.append("buildId",s),m.append("filename",i),m.append("file",new Blob([d]),$(c));let h=await fetch(u,{method:"POST",headers:p?{"X-Project-Id":f,"X-Auth-Cert":a}:{"X-Project-Id":f,"X-Secret-Key":r||""},body:m}),y=await h.text();if(!h.ok)throw new Error(`${h.status} ${y}`);return JSON.parse(y||"{}")}async function re(t,e=console){let{dir:o,endpoint:r,projectId:a,secretKey:n,authCert:s,release:c,buildId:p,deleteAfterUpload:f=!1,deleteEvenOnFailure:i=!1}=t,d=await ve(o);if(d.length===0)return e.log("No .map files found in",o),{ok:0,fail:0,deleted:0};let u=f&&i;e.log("Uploading",d.length,"source map(s) to",r,"release=",c,f?u?"(will delete local .map even on failure)":"(will delete local .map only after all succeed)":"");let m=0,l=0;for(let g of d)try{await Et({endpoint:r,projectId:a,secretKey:n,authCert:s,release:c,buildId:p,filePath:g}),e.log(" OK",$(g)),m++}catch(k){e.error(" FAIL",$(g),k.message),l++}let h=f&&(l===0||i),y=0;if(h&&d.length>0){for(let g of d)try{await jt(g),y++,e.log(" Deleted",$(g))}catch(k){e.error(" Delete failed",g,k.message)}l>0&&i&&e.log("Deleted .map files despite upload failures. Fix errors and re-run to re-upload.")}else l>0&&!i&&e.log("Upload had failures. Local .map files were NOT deleted. Fix errors and re-run.");return{ok:m,fail:l,deleted:y}}async function oe(t,e=console){let{uploadArchive:o,deleteMapFiles:r}=await Promise.resolve().then(()=>(q(),ee)),{dir:a,endpoint:n,projectId:s,secretKey:c,authCert:p,release:f,buildId:i,deleteEvenOnFailure:d=!1,noEncrypt:u}=t;try{let{uploaded:m}=await o({dir:a,endpoint:n,projectId:s,secretKey:c,authCert:p,release:f,buildId:i,noEncrypt:u},e);if(m===0)return{uploaded:0,deleted:0};let l=await r(a,[]);return e.log("Deleted",l.length,"local .map file(s)."),{uploaded:m,deleted:l.length}}catch(m){if(d)try{let l=await r(a,[]);e.log("Deleted",l.length,"local .map file(s) despite upload failure.")}catch(l){e.error("Delete .map after upload failure failed:",l.message)}else e.error("Upload failed. Local .map files were NOT deleted.",m.message);throw m}}async function ne(t,e=console){let{uploadArchiveChunked:o}=await Promise.resolve().then(()=>(be(),ye)),{deleteMapFiles:r}=await Promise.resolve().then(()=>(q(),ee)),{dir:a,endpoint:n,projectId:s,secretKey:c,authCert:p,release:f,buildId:i,deleteEvenOnFailure:d=!1,noEncrypt:u,chunkSizeBytes:m}=t;try{let{uploaded:l}=await o({dir:a,endpoint:n,projectId:s,secretKey:c,authCert:p,release:f,buildId:i,noEncrypt:u,chunkSizeBytes:m},e);if(l===0)return{uploaded:0,deleted:0};let h=await r(a,[]);return e.log("Deleted",h.length,"local .map file(s)."),{uploaded:l,deleted:h.length}}catch(l){if(d)try{let h=await r(a,[]);e.log("Deleted",h.length,"local .map file(s) despite upload failure.")}catch(h){e.error("Delete .map after upload failure failed:",h.message)}else e.error("Upload failed. Local .map files were NOT deleted.",l.message);throw l}}import{readFile as ae}from"fs/promises";import{join as x,resolve as Ie}from"path";async function se(t){let e=[t,Ie(t,".."),Ie(t,"..",".."),process.cwd()];for(let o of e)try{return await ae(x(o,"package.json"),"utf-8"),o}catch{continue}return null}async function O(t){try{return await ae(t,"utf-8")}catch{return""}}async function ke(t){let e=["vite.config.js","vite.config.mjs","vite.config.cjs","vite.config.ts"];for(let o of e){let r=await O(x(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 Se(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 O(x(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 je(t){let e=await O(x(t,"vue.config.js"))||await O(x(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 xe(t){let e=["rollup.config.js","rollup.config.mjs","rollup.config.cjs"];for(let o of e){let r=await O(x(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 Ce(t){let e=["next.config.js","next.config.mjs","next.config.cjs","next.config.ts"];for(let o of e){let r=await O(x(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 Ee(t){let e=await O(x(t,"nuxt.config.js"))||await O(x(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}:null:null}function Ot(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 ce(t){let e=await se(t);if(!e)return{emitsSourceMap:!0,keepMapInOutput:!1};let o={};try{let n=await ae(x(e,"package.json"),"utf-8");o=JSON.parse(n)}catch{return{emitsSourceMap:!0,keepMapInOutput:!1}}let r=Ot(o),a=[()=>r==="vite"?ke(e):null,()=>r==="next"?Ce(e):null,()=>r==="nuxt"?Ee(e):null,()=>r==="vue-cli"?je(e):null,()=>r==="webpack"?Se(e):null,()=>r==="rollup"?xe(e):null,()=>ke(e),()=>Ce(e),()=>je(e),()=>Se(e),()=>xe(e),()=>Ee(e)];for(let n of a){let s=await n();if(s)return s}return{emitsSourceMap:!0,keepMapInOutput:!1}}import{readFile as Ae,writeFile as Oe}from"fs/promises";import{join as Me}from"path";async function Mt(t){try{return await Ae(t,"utf-8")}catch{return""}}function At(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 ie=[{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*:\s*false\b/.test(t),patch:t=>t.replace(/(sourcemap\s*:\s*)false\b/,"$1true")}];async function De(t){let e=await se(t);if(!e)return{restore:async()=>{}};let o={};try{let n=await Ae(Me(e,"package.json"),"utf-8");o=JSON.parse(n)}catch{return{restore:async()=>{}}}let r=At(o),a=r?[...ie.filter(n=>n.name===r),...ie.filter(n=>n.name!==r)]:ie;for(let n of a)for(let s of n.configNames){let c=Me(e,s),p=await Mt(c);if(!p||!n.needPatch(p))continue;let f=n.patch(p);return await Oe(c,f,"utf-8"),{restore:async()=>{try{await Oe(c,p,"utf-8")}catch(i){console.error(`Restore ${n.name} config failed:`,i?.message||i)}}}}return{restore:async()=>{}}}var Sr=Ft(Nt(import.meta.url));function v(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 M(t){return process.argv.includes(t)}function _t(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 Le(t={}){let e=v("--chunk-size","UPLOAD_SOURCEMAPS_CHUNK_SIZE")||t.chunkSize;return _t(e)}async function Bt(){let{resolveUploadConfig:t}=await Promise.resolve().then(()=>(_e(),Ke));return t(process.cwd(),v("--config","UPLOAD_SOURCEMAPS_CONFIG")||void 0)}async function Lt(t){let e=[t,Pt(t,".."),process.cwd()];for(let o of e)try{let r=await Tt(Rt(o,"package.json"),"utf-8"),a=JSON.parse(r);if(a.version&&typeof a.version=="string")return a.version.trim()}catch{continue}return null}async function $e(t,e){return t&&t!=="default"?t:await Lt(e)||"default"}var w=await Bt(),$t=process.argv[2]==="build";function We(t,e){return t||e===!0}async function Wt(){let t=v("--project-id","PROJECT_ID")||w.projectId,e=v("--secret-key","SECRET_KEY")||w.secretKey,o=v("--auth-cert","MONITOR_AUTH_CERT")||w.authCert,r=(v("--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 a=w.buildCommand||process.env.UPLOAD_SOURCEMAPS_BUILD_CMD||"npm run build",n=w.buildOutputDir||w.dir||v("--dir","DIR")||process.cwd(),s=M("--archive")||w.uploadAsArchive===!0,c=We(M("--no-encrypt"),w.noEncrypt),f=!(await ce(n)).keepMapInOutput||M("--delete-after-upload")||M("-d")||w.deleteAfterUpload===!0,i=v("--build-id","BUILD_ID")||w.buildId||Be(),d=await De(n);try{console.log("Step 1: Running build (forcing source map generation):",a),console.log("Build ID:",i);let[u,...m]=a.split(/\s+/);await new Promise((y,g)=>{Kt(u,m,{stdio:"inherit",shell:!0,env:{...process.env,BUILD_SOURCEMAP:"1",SOURCEMAP:"1",MONITOR_BUILD_ID:i,VITE_MONITOR_BUILD_ID:i}}).on("exit",S=>S===0?y():g(new Error(`Build exited ${S}`)))}),console.log("Step 2: Uploading source maps...");let l=await $e(v("--release","RELEASE")||w.release,n);l!=="default"&&console.log("Release (from package.json or config):",l);let h=Le(w);if(s){let y={dir:n,endpoint:r,projectId:t,secretKey:e,authCert:o,release:l,buildId:i,deleteEvenOnFailure:!1,noEncrypt:c};(h?await ne({...y,chunkSizeBytes:h},console):await oe(y,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{ok:y,fail:g}=await re({endpoint:r,projectId:t,secretKey:e,authCert:o,release:l,buildId:i,dir:n,deleteAfterUpload:f,deleteEvenOnFailure:!1},console);if(g>0)throw new Error("Upload had failures. Local .map files were NOT deleted. Fix errors and re-run.");y===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(u){throw console.error("Error:",u.message),console.error(f?"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."),u}finally{await d.restore()}}if($t)try{await Wt()}catch{process.exitCode=1}else{let t=v("--project-id","PROJECT_ID")||w.projectId,e=v("--secret-key","SECRET_KEY")||w.secretKey,o=v("--auth-cert","MONITOR_AUTH_CERT")||w.authCert,r=(v("--endpoint","ENDPOINT")||w.endpoint||"").replace(/\/$/,""),a=v("--dir","DIR")||w.dir||process.cwd(),n=await $e(v("--release","RELEASE")||w.release,a),s=v("--build-id","BUILD_ID")||w.buildId||Be(),c=M("--archive")||w.uploadAsArchive===!0,p=We(M("--no-encrypt"),w.noEncrypt),f=Le(w),d=!(await ce(a)).keepMapInOutput||M("--delete-after-upload")||M("-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(" --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(" --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(" 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:",s);try{if(c){let u={dir:a,endpoint:r,projectId:t,secretKey:e,authCert:o,release:n,buildId:s,deleteEvenOnFailure:!1,noEncrypt:p};f?await ne({...u,chunkSizeBytes:f},console):await oe(u,console)}else{let{ok:u,fail:m,deleted:l}=await re({endpoint:r,projectId:t,secretKey:e,authCert:o,release:n,buildId:s,dir:a,deleteAfterUpload:d,deleteEvenOnFailure:d},console);l>0&&console.log("Deleted",l,"local .map file(s) from output."),m>0&&(console.error(d?"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(u){console.error("Error:",u.message),console.error(d?"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}}}
package/dist/upload.js CHANGED
@@ -1 +1 @@
1
- var ue=Object.defineProperty;var U=(t,e)=>()=>(t&&(e=t(t=0)),e);var L=(t,e)=>{for(var a in e)ue(t,a,{get:e[a],enumerable:!0})};var R={};L(R,{extractProjectIdFromCert:()=>he,extractUploadKeyFromCert:()=>me});function he(t){if(typeof t!="string")return"";let e=t.trim();if(e.startsWith(fe+"$"))return e.split("$")[1]||"";if(e.includes(ee)){let a=e.match(/Project:\s*(\S+)/);return a?a[1]:""}return""}function me(t){if(typeof t!="string"||!t.includes(ee))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 fe,ee,X=U(()=>{fe="MC1",ee="-----BEGIN MONITOR CERT-----"});var O={};L(O,{decryptArchive:()=>Ie,encryptArchive:()=>Ce,encryptArchiveWithKey:()=>ae});import{createCipheriv as we,createDecipheriv as ye,createHash as ve,randomBytes as xe}from"crypto";function re(t,e){let a=`${t}:${e}`;return ve("sha256").update(a,"utf8").digest()}function Ce(t,e,a){let r=re(e,a);return ae(t,r)}function ae(t,e){if(!Buffer.isBuffer(e)||e.length!==32)throw new Error("Invalid key: must be 32-byte Buffer");let a=xe(B),r=we(te,e,a,{authTagLength:K}),o=Buffer.concat([r.update(t),r.final()]),n=r.getAuthTag();return Buffer.concat([a,o,n])}function Ie(t,e,a){if(t.length<B+K)throw new Error("Invalid encrypted archive: too short");let r=re(e,a),o=t.subarray(0,B),n=t.subarray(t.length-K),i=t.subarray(B,t.length-K),c=ye(te,r,o,{authTagLength:K});return c.setAuthTag(n),Buffer.concat([c.update(i),c.final()])}var te,B,K,P=U(()=>{te="aes-256-gcm",B=12,K=16});var Y={};L(Y,{DEFAULT_EXCLUDE_EXT:()=>z,collectFiles:()=>q,createArchive:()=>M,deleteMapFiles:()=>ne,uploadArchive:()=>je});import{createRequire as ke}from"module";import{readdir as oe,unlink as Ee,readFile as ge,mkdtemp as be,rm as Te}from"fs/promises";import{join as _,relative as Ae}from"path";import{createWriteStream as De}from"fs";import{tmpdir as Fe}from"os";async function q(t,e=t,a=z){let r=await oe(t,{withFileTypes:!0}),o=[];for(let n of r){let i=_(t,n.name),c=Ae(e,i).replace(/\\/g,"/");if(n.isDirectory()){let p=await q(i,e,a);o.push(...p)}else{let p=(n.name.includes(".")?"."+n.name.split(".").pop():"").toLowerCase();if(a.has(p))continue;o.push({relativePath:c,fullPath:i})}}return o}async function M(t,e,a=z,r=!0){let o=await q(t,t,a),n=o.map(i=>i.relativePath);return n.length===0?0:new Promise((i,c)=>{let p=$e.create({gzip:r,cwd:t},n);p.on("error",c),p.pipe(De(e)).on("close",()=>i(o.length)).on("error",c)})}async function je(t,e=console){let{dir:a,endpoint:r,projectId:o,secretKey:n,authCert:i,release:c,buildId:p,excludeExt:w,noEncrypt:h}=t,u=!!i,{extractProjectIdFromCert:m,extractUploadKeyFromCert:l}=await Promise.resolve().then(()=>(X(),R)),s=o||(u?m(i):""),d=u?l(i):null,x=await be(_(Fe(),"upload-sourcemaps-")),v=_(x,"archive.tar.gz");try{let C=await M(a,v,w||z,!0);if(C===0)return e.log("No files to pack (directory empty or only excluded). Skip upload."),{ok:!0,uploaded:0};let k=await ge(v),I=!h&&(u?d!==null:!!(s&&n));if(I)if(d){let{encryptArchiveWithKey:T}=await Promise.resolve().then(()=>(P(),O));k=T(k,d),e.log("Created tar.gz with",C,"file(s), encrypted with cert Upload-Key, uploading...")}else{let{encryptArchive:T}=await Promise.resolve().then(()=>(P(),O));k=T(k,s,n),e.log("Created tar.gz with",C,"file(s), encrypted, uploading...")}else e.log("Created tar.gz with",C,"file(s), uploading...");let S="/sourcemaps/upload-archive",D=r.replace(/\/$/,""),E=D.endsWith(S)?D:D+S,y=new FormData;y.append("projectId",s),u||y.append("secretKey",n||""),y.append("release",c),p&&y.append("buildId",p),I&&y.append("encrypted","1"),y.append("file",new Blob([k]),I?"archive.tar.gz.enc":"archive.tar.gz");let g={"X-Project-Id":s};u?g["X-Auth-Cert"]=i:g["X-Secret-Key"]=n||"";let F=await fetch(E,{method:"POST",headers:g,body:y}),G=await F.text();if(!F.ok)throw new Error(`${F.status} ${G}`);let b=JSON.parse(G||"{}");return e.log("Upload archive OK, server extracted and saved",b.uploaded,".map file(s)"),{ok:!0,uploaded:b.uploaded||0}}finally{await Te(x,{recursive:!0,force:!0})}}async function ne(t,e=[]){let a=await oe(t,{withFileTypes:!0});for(let r of a){let o=_(t,r.name);r.isDirectory()?await ne(o,e):r.name.endsWith(".map")&&(await Ee(o),e.push(o))}return e}var Se,$e,z,W=U(()=>{Se=ke(import.meta.url),$e=Se("tar"),z=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"])});var ce={};L(ce,{uploadArchiveChunked:()=>ze});import{readFile as Ke,mkdtemp as Oe,rm as Pe}from"fs/promises";import{join as ie}from"path";import{tmpdir as Ne}from"os";function Xe(t){return t.replace(/\/$/,"")}function J(t,e){let a=Xe(t),r=e.startsWith("/")?e:`/${e}`;return a.endsWith(r)?a:a+r}async function Be(t){return new Promise(e=>setTimeout(e,t))}async function _e(t,e,a,r=Le){let o;for(let n=0;n<=r;n++)try{let i=await fetch(t,e),c=await i.text();if(!i.ok)throw new Error(`${i.status} ${c}`);return c?JSON.parse(c):{}}catch(i){if(o=i,n<r){let c=Re*Math.pow(2,n);a.log?.(` Retry ${n+1}/${r} after ${c}ms: ${i.message}`),await Be(c)}}throw o}async function ze(t,e=console){let{dir:a,endpoint:r,projectId:o,secretKey:n,authCert:i,release:c,buildId:p,noEncrypt:w,chunkSizeBytes:h=Ue,excludeExt:u}=t,m=!!i,{extractProjectIdFromCert:l,extractUploadKeyFromCert:s}=await Promise.resolve().then(()=>(X(),R)),d=o||(m?l(i):""),x=m?s(i):null,v=await Oe(ie(Ne(),"upload-sourcemaps-chunked-")),C=ie(v,"archive.tar.gz");try{let k=await M(a,C,u||void 0,!0);if(k===0)return e.log?.("No files to pack. Skip upload."),{ok:!0,uploaded:0};let I=await Ke(C),S=!w&&(m?x!==null:!!(d&&n));if(S){if(x){let{encryptArchiveWithKey:f}=await Promise.resolve().then(()=>(P(),O));I=f(I,x)}else{let{encryptArchive:f}=await Promise.resolve().then(()=>(P(),O));I=f(I,d,n)}e.log?.(`Created tar.gz with ${k} file(s), encrypted, uploading in chunks...`)}else e.log?.(`Created tar.gz with ${k} file(s), uploading in chunks...`);let D=I.length,E=Math.ceil(D/h),y={"Content-Type":"application/json"};m?y["X-Auth-Cert"]=i:(y["X-Project-Id"]=d,y["X-Secret-Key"]=n||"");let g=await fetch(J(r,"/sourcemaps/upload-archive-multipart/init"),{method:"POST",headers:{...y,"Content-Type":"application/json"},body:JSON.stringify({projectId:d,secretKey:m?"":n||"",release:c,buildId:p||void 0,totalChunks:E,chunkSizeBytes:h,encrypted:S})}),F=await g.text();if(!g.ok)throw new Error(`${g.status} ${F}`);let b=JSON.parse(F||"{}").uploadId;if(!b)throw new Error("Init did not return uploadId");let T=new Set;for(let f=0;f<E;f++)T.add(f);try{let f=await fetch(J(r,"/sourcemaps/upload-archive-multipart/status")+`?uploadId=${encodeURIComponent(b)}`,{method:"GET",headers:y}),$=await f.text();if(f.ok&&$){let j=JSON.parse($).receivedChunks||[];j.forEach(A=>T.delete(A)),j.length>0&&e.log?.(`Resume: ${j.length}/${E} chunks already uploaded`)}}catch{}for(let f=0;f<E;f++){if(!T.has(f))continue;let $=f*h,Q=Math.min($+h,D),j=I.subarray($,Q),A=new FormData;A.append("uploadId",b),A.append("index",String(f)),A.append("totalChunks",String(E)),A.append("chunk",new Blob([j]),`chunk-${f}`);let pe=J(r,"/sourcemaps/upload-archive-multipart/chunk");await _e(pe,{method:"POST",headers:m?{"X-Auth-Cert":i}:{"X-Project-Id":d,"X-Secret-Key":n||""},body:A},e),e.log?.(` Chunk ${f+1}/${E} OK`)}let H=await fetch(J(r,"/sourcemaps/upload-archive-multipart/complete"),{method:"POST",headers:{...y,"Content-Type":"application/json"},body:JSON.stringify({uploadId:b})}),V=await H.text();if(!H.ok)throw new Error(`${H.status} ${V}`);let Z=JSON.parse(V||"{}").uploaded??0;return e.log?.("Chunked upload OK, server extracted and saved",Z,".map file(s)"),{ok:!0,uploaded:Z}}finally{await Pe(v,{recursive:!0,force:!0})}}var Ue,Le,Re,se=U(()=>{W();Ue=1*1024*1024,Le=3,Re=1e3});import{readdir as Me,readFile as We,unlink as Je}from"fs/promises";import{join as Ge,basename as N}from"path";async function de(t,e=[]){let a;try{a=await Me(t,{withFileTypes:!0})}catch(r){if(r?.code==="ENOENT")return e;throw r}for(let r of a){let o=Ge(t,r.name);r.isDirectory()?await de(o,e):r.name.endsWith(".map")&&e.push(o)}return e}var le="/sourcemaps/upload";function He(t){let e=t.replace(/\/$/,"");return e.endsWith(le)?e:e+le}async function qe(t){let{endpoint:e,projectId:a,secretKey:r,authCert:o,release:n,buildId:i,filePath:c}=t,p=!!o,w=a||(p?(await Promise.resolve().then(()=>(X(),R))).extractProjectIdFromCert(o):""),h=N(c,".map"),u=await We(c),m=He(e),l=new FormData;l.append("projectId",w),p||l.append("secretKey",r||""),l.append("release",n),i&&l.append("buildId",i),l.append("filename",h),l.append("file",new Blob([u]),N(c));let d=await fetch(m,{method:"POST",headers:p?{"X-Project-Id":w,"X-Auth-Cert":o}:{"X-Project-Id":w,"X-Secret-Key":r||""},body:l}),x=await d.text();if(!d.ok)throw new Error(`${d.status} ${x}`);return JSON.parse(x||"{}")}async function pt(t,e=console){let{dir:a,endpoint:r,projectId:o,secretKey:n,authCert:i,release:c,buildId:p,deleteAfterUpload:w=!1,deleteEvenOnFailure:h=!1}=t,u=await de(a);if(u.length===0)return e.log("No .map files found in",a),{ok:0,fail:0,deleted:0};let m=w&&h;e.log("Uploading",u.length,"source map(s) to",r,"release=",c,w?m?"(will delete local .map even on failure)":"(will delete local .map only after all succeed)":"");let l=0,s=0;for(let v of u)try{await qe({endpoint:r,projectId:o,secretKey:n,authCert:i,release:c,buildId:p,filePath:v}),e.log(" OK",N(v)),l++}catch(C){e.error(" FAIL",N(v),C.message),s++}let d=w&&(s===0||h),x=0;if(d&&u.length>0){for(let v of u)try{await Je(v),x++,e.log(" Deleted",N(v))}catch(C){e.error(" Delete failed",v,C.message)}s>0&&h&&e.log("Deleted .map files despite upload failures. Fix errors and re-run to re-upload.")}else s>0&&!h&&e.log("Upload had failures. Local .map files were NOT deleted. Fix errors and re-run.");return{ok:l,fail:s,deleted:x}}async function ut(t,e=console){let{uploadArchive:a,deleteMapFiles:r}=await Promise.resolve().then(()=>(W(),Y)),{dir:o,endpoint:n,projectId:i,secretKey:c,authCert:p,release:w,buildId:h,deleteEvenOnFailure:u=!1,noEncrypt:m}=t;try{let{uploaded:l}=await a({dir:o,endpoint:n,projectId:i,secretKey:c,authCert:p,release:w,buildId:h,noEncrypt:m},e);if(l===0)return{uploaded:0,deleted:0};let s=await r(o,[]);return e.log("Deleted",s.length,"local .map file(s)."),{uploaded:l,deleted:s.length}}catch(l){if(u)try{let s=await r(o,[]);e.log("Deleted",s.length,"local .map file(s) despite upload failure.")}catch(s){e.error("Delete .map after upload failure failed:",s.message)}else e.error("Upload failed. Local .map files were NOT deleted.",l.message);throw l}}async function ft(t,e=console){let{uploadArchiveChunked:a}=await Promise.resolve().then(()=>(se(),ce)),{deleteMapFiles:r}=await Promise.resolve().then(()=>(W(),Y)),{dir:o,endpoint:n,projectId:i,secretKey:c,authCert:p,release:w,buildId:h,deleteEvenOnFailure:u=!1,noEncrypt:m,chunkSizeBytes:l}=t;try{let{uploaded:s}=await a({dir:o,endpoint:n,projectId:i,secretKey:c,authCert:p,release:w,buildId:h,noEncrypt:m,chunkSizeBytes:l},e);if(s===0)return{uploaded:0,deleted:0};let d=await r(o,[]);return e.log("Deleted",d.length,"local .map file(s)."),{uploaded:s,deleted:d.length}}catch(s){if(u)try{let d=await r(o,[]);e.log("Deleted",d.length,"local .map file(s) despite upload failure.")}catch(d){e.error("Delete .map after upload failure failed:",d.message)}else e.error("Upload failed. Local .map files were NOT deleted.",s.message);throw s}}export{de as findMapFiles,pt as uploadAll,ft as uploadArchiveChunkedThenDelete,ut as uploadArchiveThenDelete,qe as uploadOne};
1
+ var de=Object.defineProperty;var N=(t,e)=>()=>(t&&(e=t(t=0)),e);var L=(t,e)=>{for(var a in e)de(t,a,{get:e[a],enumerable:!0})};var X={};L(X,{extractProjectIdFromCert:()=>ue,extractUploadKeyFromCert:()=>fe});function ue(t){if(typeof t!="string")return"";let e=t.trim();if(e.startsWith(pe+"$"))return e.split("$")[1]||"";if(e.includes(Z)){let a=e.match(/Project:\s*(\S+)/);return a?a[1]:""}return""}function fe(t){if(typeof t!="string"||!t.includes(Z))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 pe,Z,B=N(()=>{pe="MC1",Z="-----BEGIN MONITOR CERT-----"});var O={};L(O,{decryptArchive:()=>xe,encryptArchive:()=>ve,encryptArchiveWithKey:()=>te});import{createCipheriv as he,createDecipheriv as me,createHash as ye,randomBytes as we}from"crypto";function ee(t,e){let a=`${t}:${e}`;return ye("sha256").update(a,"utf8").digest()}function ve(t,e,a){let r=ee(e,a);return te(t,r)}function te(t,e){if(!Buffer.isBuffer(e)||e.length!==32)throw new Error("Invalid key: must be 32-byte Buffer");let a=we(R),r=he(Q,e,a,{authTagLength:S}),o=Buffer.concat([r.update(t),r.final()]),n=r.getAuthTag();return Buffer.concat([a,o,n])}function xe(t,e,a){if(t.length<R+S)throw new Error("Invalid encrypted archive: too short");let r=ee(e,a),o=t.subarray(0,R),n=t.subarray(t.length-S),i=t.subarray(R,t.length-S),c=me(Q,r,o,{authTagLength:S});return c.setAuthTag(n),Buffer.concat([c.update(i),c.final()])}var Q,R,S,$=N(()=>{Q="aes-256-gcm",R=12,S=16});var q={};L(q,{DEFAULT_EXCLUDE_EXT:()=>z,collectFiles:()=>J,createArchive:()=>M,deleteMapFiles:()=>ae,uploadArchive:()=>je});import{createRequire as Ce}from"module";import{readdir as re,unlink as Ie,readFile as ke,mkdtemp as Ee,rm as be}from"fs/promises";import{join as _,relative as Ae}from"path";import{createWriteStream as ge}from"fs";import{tmpdir as Te}from"os";async function J(t,e=t,a=z){let r=await re(t,{withFileTypes:!0}),o=[];for(let n of r){let i=_(t,n.name),c=Ae(e,i).replace(/\\/g,"/");if(n.isDirectory()){let p=await J(i,e,a);o.push(...p)}else{let p=(n.name.includes(".")?"."+n.name.split(".").pop():"").toLowerCase();if(a.has(p))continue;o.push({relativePath:c,fullPath:i})}}return o}async function M(t,e,a=z,r=!0){let o=await J(t,t,a),n=o.map(i=>i.relativePath);return n.length===0?0:new Promise((i,c)=>{let p=Fe.create({gzip:r,cwd:t},n);p.on("error",c),p.pipe(ge(e)).on("close",()=>i(o.length)).on("error",c)})}async function je(t,e=console){let{dir:a,endpoint:r,projectId:o,secretKey:n,authCert:i,release:c,buildId:p,excludeExt:y,noEncrypt:h}=t,u=!!i,{extractProjectIdFromCert:m,extractUploadKeyFromCert:l}=await Promise.resolve().then(()=>(B(),X)),s=o||(u?m(i):""),d=u?l(i):null,x=await Ee(_(Te(),"upload-sourcemaps-")),v=_(x,"archive.tar.gz");try{let C=await M(a,v,y||z,!0);if(C===0)return e.log("No files to pack (directory empty or only excluded). Skip upload."),{ok:!0,uploaded:0};let k=await ke(v),I=!h&&(u?d!==null:!!(s&&n));if(I)if(d){let{encryptArchiveWithKey:D}=await Promise.resolve().then(()=>($(),O));k=D(k,d),e.log("Created tar.gz with",C,"file(s), encrypted with cert Upload-Key, uploading...")}else{let{encryptArchive:D}=await Promise.resolve().then(()=>($(),O));k=D(k,s,n),e.log("Created tar.gz with",C,"file(s), encrypted, uploading...")}else e.log("Created tar.gz with",C,"file(s), uploading...");let F="/sourcemaps/upload-archive",g=r.replace(/\/$/,""),E=g.endsWith(F)?g:g+F,w=new FormData;w.append("projectId",s),u||w.append("secretKey",n||""),w.append("release",c),p&&w.append("buildId",p),I&&w.append("encrypted","1"),w.append("file",new Blob([k]),I?"archive.tar.gz.enc":"archive.tar.gz");let U={"X-Project-Id":s};u?U["X-Auth-Cert"]=i:U["X-Secret-Key"]=n||"";let b=await fetch(E,{method:"POST",headers:U,body:w}),T=await b.text();if(!b.ok)throw new Error(`${b.status} ${T}`);let H=JSON.parse(T||"{}");return e.log("Upload archive OK, server extracted and saved",H.uploaded,".map file(s)"),{ok:!0,uploaded:H.uploaded||0}}finally{await be(x,{recursive:!0,force:!0})}}async function ae(t,e=[]){let a=await re(t,{withFileTypes:!0});for(let r of a){let o=_(t,r.name);r.isDirectory()?await ae(o,e):r.name.endsWith(".map")&&(await Ie(o),e.push(o))}return e}var De,Fe,z,W=N(()=>{De=Ce(import.meta.url),Fe=De("tar"),z=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"])});var ne={};L(ne,{uploadArchiveChunked:()=>Be});import{readFile as Ke,mkdtemp as Se,rm as Oe}from"fs/promises";import{join as oe}from"path";import{tmpdir as $e}from"os";function Le(t){return t.replace(/\/$/,"")}function G(t,e){let a=Le(t),r=e.startsWith("/")?e:`/${e}`;return a.endsWith(r)?a:a+r}async function Xe(t){return new Promise(e=>setTimeout(e,t))}async function Y(t,e,a,r=Ue){let o;for(let n=0;n<=r;n++)try{let i=await fetch(t,e),c=await i.text();if(!i.ok)throw new Error(`${i.status} ${c}`);return c?JSON.parse(c):{}}catch(i){if(o=i,n<r){let c=Ne*Math.pow(2,n);a.log?.(` Retry ${n+1}/${r} after ${c}ms: ${i.message}`),await Xe(c)}}throw o}async function Be(t,e=console){let{dir:a,endpoint:r,projectId:o,secretKey:n,authCert:i,release:c,buildId:p,noEncrypt:y,chunkSizeBytes:h=Pe,excludeExt:u}=t,m=!!i,{extractProjectIdFromCert:l,extractUploadKeyFromCert:s}=await Promise.resolve().then(()=>(B(),X)),d=o||(m?l(i):""),x=m?s(i):null,v=await Se(oe($e(),"upload-sourcemaps-chunked-")),C=oe(v,"archive.tar.gz");try{let k=await M(a,C,u||void 0,!0);if(k===0)return e.log?.("No files to pack. Skip upload."),{ok:!0,uploaded:0};let I=await Ke(C),F=!y&&(m?x!==null:!!(d&&n));if(F){if(x){let{encryptArchiveWithKey:f}=await Promise.resolve().then(()=>($(),O));I=f(I,x)}else{let{encryptArchive:f}=await Promise.resolve().then(()=>($(),O));I=f(I,d,n)}e.log?.(`Created tar.gz with ${k} file(s), encrypted, uploading in chunks...`)}else e.log?.(`Created tar.gz with ${k} file(s), uploading in chunks...`);let g=I.length,E=Math.ceil(g/h),w={"Content-Type":"application/json"};m?w["X-Auth-Cert"]=i:(w["X-Project-Id"]=d,w["X-Secret-Key"]=n||"");let b=(await Y(G(r,"/sourcemaps/upload-archive-multipart/init"),{method:"POST",headers:{...w,"Content-Type":"application/json"},body:JSON.stringify({projectId:d,secretKey:m?"":n||"",release:c,buildId:p||void 0,totalChunks:E,chunkSizeBytes:h,encrypted:F})},e)).uploadId;if(!b)throw new Error("Init did not return uploadId");let T=new Set;for(let f=0;f<E;f++)T.add(f);try{let f=await fetch(G(r,"/sourcemaps/upload-archive-multipart/status")+`?uploadId=${encodeURIComponent(b)}`,{method:"GET",headers:w}),j=await f.text();if(f.ok&&j){let K=JSON.parse(j).receivedChunks||[];K.forEach(A=>T.delete(A)),K.length>0&&e.log?.(`Resume: ${K.length}/${E} chunks already uploaded`)}}catch{}for(let f=0;f<E;f++){if(!T.has(f))continue;let j=f*h,V=Math.min(j+h,g),K=I.subarray(j,V),A=new FormData;A.append("uploadId",b),A.append("index",String(f)),A.append("totalChunks",String(E)),A.append("chunk",new Blob([K]),`chunk-${f}`);let le=G(r,"/sourcemaps/upload-archive-multipart/chunk");await Y(le,{method:"POST",headers:m?{"X-Auth-Cert":i}:{"X-Project-Id":d,"X-Secret-Key":n||""},body:A},e),e.log?.(` Chunk ${f+1}/${E} OK`)}let D=(await Y(G(r,"/sourcemaps/upload-archive-multipart/complete"),{method:"POST",headers:{...w,"Content-Type":"application/json"},body:JSON.stringify({uploadId:b})},e)).uploaded??0;return e.log?.("Chunked upload OK, server extracted and saved",D,".map file(s)"),{ok:!0,uploaded:D}}finally{await Oe(v,{recursive:!0,force:!0})}}var Pe,Ue,Ne,ie=N(()=>{W();Pe=1*1024*1024,Ue=3,Ne=1e3});import{readdir as Re,readFile as _e,unlink as ze}from"fs/promises";import{join as Me,basename as P}from"path";async function se(t,e=[]){let a;try{a=await Re(t,{withFileTypes:!0})}catch(r){if(r?.code==="ENOENT")return e;throw r}for(let r of a){let o=Me(t,r.name);r.isDirectory()?await se(o,e):r.name.endsWith(".map")&&e.push(o)}return e}var ce="/sourcemaps/upload";function We(t){let e=t.replace(/\/$/,"");return e.endsWith(ce)?e:e+ce}async function Ge(t){let{endpoint:e,projectId:a,secretKey:r,authCert:o,release:n,buildId:i,filePath:c}=t,p=!!o,y=a||(p?(await Promise.resolve().then(()=>(B(),X))).extractProjectIdFromCert(o):""),h=P(c,".map"),u=await _e(c),m=We(e),l=new FormData;l.append("projectId",y),p||l.append("secretKey",r||""),l.append("release",n),i&&l.append("buildId",i),l.append("filename",h),l.append("file",new Blob([u]),P(c));let d=await fetch(m,{method:"POST",headers:p?{"X-Project-Id":y,"X-Auth-Cert":o}:{"X-Project-Id":y,"X-Secret-Key":r||""},body:l}),x=await d.text();if(!d.ok)throw new Error(`${d.status} ${x}`);return JSON.parse(x||"{}")}async function ct(t,e=console){let{dir:a,endpoint:r,projectId:o,secretKey:n,authCert:i,release:c,buildId:p,deleteAfterUpload:y=!1,deleteEvenOnFailure:h=!1}=t,u=await se(a);if(u.length===0)return e.log("No .map files found in",a),{ok:0,fail:0,deleted:0};let m=y&&h;e.log("Uploading",u.length,"source map(s) to",r,"release=",c,y?m?"(will delete local .map even on failure)":"(will delete local .map only after all succeed)":"");let l=0,s=0;for(let v of u)try{await Ge({endpoint:r,projectId:o,secretKey:n,authCert:i,release:c,buildId:p,filePath:v}),e.log(" OK",P(v)),l++}catch(C){e.error(" FAIL",P(v),C.message),s++}let d=y&&(s===0||h),x=0;if(d&&u.length>0){for(let v of u)try{await ze(v),x++,e.log(" Deleted",P(v))}catch(C){e.error(" Delete failed",v,C.message)}s>0&&h&&e.log("Deleted .map files despite upload failures. Fix errors and re-run to re-upload.")}else s>0&&!h&&e.log("Upload had failures. Local .map files were NOT deleted. Fix errors and re-run.");return{ok:l,fail:s,deleted:x}}async function st(t,e=console){let{uploadArchive:a,deleteMapFiles:r}=await Promise.resolve().then(()=>(W(),q)),{dir:o,endpoint:n,projectId:i,secretKey:c,authCert:p,release:y,buildId:h,deleteEvenOnFailure:u=!1,noEncrypt:m}=t;try{let{uploaded:l}=await a({dir:o,endpoint:n,projectId:i,secretKey:c,authCert:p,release:y,buildId:h,noEncrypt:m},e);if(l===0)return{uploaded:0,deleted:0};let s=await r(o,[]);return e.log("Deleted",s.length,"local .map file(s)."),{uploaded:l,deleted:s.length}}catch(l){if(u)try{let s=await r(o,[]);e.log("Deleted",s.length,"local .map file(s) despite upload failure.")}catch(s){e.error("Delete .map after upload failure failed:",s.message)}else e.error("Upload failed. Local .map files were NOT deleted.",l.message);throw l}}async function lt(t,e=console){let{uploadArchiveChunked:a}=await Promise.resolve().then(()=>(ie(),ne)),{deleteMapFiles:r}=await Promise.resolve().then(()=>(W(),q)),{dir:o,endpoint:n,projectId:i,secretKey:c,authCert:p,release:y,buildId:h,deleteEvenOnFailure:u=!1,noEncrypt:m,chunkSizeBytes:l}=t;try{let{uploaded:s}=await a({dir:o,endpoint:n,projectId:i,secretKey:c,authCert:p,release:y,buildId:h,noEncrypt:m,chunkSizeBytes:l},e);if(s===0)return{uploaded:0,deleted:0};let d=await r(o,[]);return e.log("Deleted",d.length,"local .map file(s)."),{uploaded:s,deleted:d.length}}catch(s){if(u)try{let d=await r(o,[]);e.log("Deleted",d.length,"local .map file(s) despite upload failure.")}catch(d){e.error("Delete .map after upload failure failed:",d.message)}else e.error("Upload failed. Local .map files were NOT deleted.",s.message);throw s}}export{se as findMapFiles,ct as uploadAll,lt as uploadArchiveChunkedThenDelete,st as uploadArchiveThenDelete,Ge as uploadOne};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@frontend-monitor/upload-sourcemaps",
3
- "version": "0.0.2",
3
+ "version": "0.0.3",
4
4
  "description": "CLI to upload Source Map files to frontend-monitor API (for CI/CD)",
5
5
  "type": "module",
6
6
  "main": "dist/upload.js",
@@ -11,7 +11,7 @@
11
11
  "build": "node build.js",
12
12
  "prepublishOnly": "npm run build",
13
13
  "publish:dry": "npm run build && npm publish --dry-run",
14
- "publish:public": "npm run build && npm publish --access public --tag release"
14
+ "publish:public": "npm run build && npm publish --access public --tag latest"
15
15
  },
16
16
  "files": [
17
17
  "dist",