UNPKG

hud-sdk

Version:

Hud's Node SDK

3 lines 10.5 kB
#!/usr/bin/env node !function(e,t){if("object"==typeof exports&&"object"==typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var s=t();for(var i in s)("object"==typeof exports?exports:e)[i]=s[i]}}(global,()=>(()=>{"use strict";var e={523:e=>{e.exports=require("./logger")},1638:e=>{e.exports=require("./declarations")},1943:e=>{e.exports=require("fs/promises")},1952:function(e,t,s){var i=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.createDirectoryExcludeCheckers=d,t.shouldExcludeDirectory=u,t.getAllFilesInDirectory=f,t.getNodeModulesFiles=p,t.getFiles=async function(e,t,s,i){const n=[],o=d(i||[]);for(const t of e){const e=await f(t,o);n.push(...e)}if(s){const e=await p(s,t);n.push(...e)}return n};const n=s(2030),o=s(1943),r=i(s(6928));function a(e){return e.endsWith(".js")}function l(e){return e.split(r.default.sep).join("/")}function d(e){const t=[];for(const s of e){let e,i=l(s);if(i.endsWith("/")||(i+="/"),i.startsWith("/")||r.default.isAbsolute(s)||(i="/"+i),i.includes("*")){const t=i.split(".").join("\\.").split("*").join(".*?"),s=new RegExp(t);e=e=>{const t=l(e),i=t.endsWith("/")?t:t+"/";return s.test(i)}}else e=e=>{const t=l(e);return(t.endsWith("/")?t:t+"/").includes(i)};t.push(e)}return t}function u(e,t){for(const s of t)if(s(e))return!0;return!1}async function c(e,t,s){const i=[];let n;try{n=await(0,o.readdir)(e,{withFileTypes:!0})}catch{return i}for(const o of n){const n=r.default.join(e,o.name);if(o.isFile())a(n)&&!t(n)&&i.push(o);else if(o.isDirectory()&&!s(n)){const e=await c(n,t,s);i.push(...e)}}return i}async function f(e,t){const s=t||[];return c(e,()=>!1,e=>"node_modules"===r.default.basename(e)||u(e,s))}async function p(e,t){return c(e.endsWith(r.default.sep)?e:e+r.default.sep,e=>(0,n.skip)(e,t),()=>!1)}},2030:e=>{e.exports=require("./instrument")},2546:e=>{e.exports=require("./lib")},2698:e=>{e.exports=require("p-limit")},3106:e=>{e.exports=require("zlib")},3903:e=>{e.exports=require("uuid")},4672:e=>{e.exports=require("./client")},5809:e=>{e.exports=require("./config")},6858:e=>{e.exports=require("commander")},6928:e=>{e.exports=require("path")},8184:function(e,t,s){var i=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});const n=s(5809),o=s(1638),r=s(8528),a=s(2030),l=s(2546),d=s(523),u=i(s(8938)),c=s(6858),f=s(4672),p=s(9896),h=s(1943),m=i(s(2698)),g=i(s(6928)),w=s(9561),y=s(3903),x=i(s(3106)),v=s(1952);function F(e){const t=(0,d.formatLogMessage)(e.message,e.errCode,e.moreInfo);console.log(t)}const C=new class{messages=[];buildId=null;accessToken=null;client=null;setBuildId(e){this.buildId=e}setAccessToken(e){this.accessToken=e}setClient(e){this.client=e}log(e){this.messages.push({message:e,timestamp:(new Date).toISOString()})}async send(){try{if(!this.buildId)return void this.log("Build ID is not set");if(!this.accessToken)return void this.log("Access token is not set");if(!this.client)return void this.log("Client is not set");const e=this.messages.map(e=>({...e,buildId:this.buildId||""}));await this.client.sessionslessLogs(JSON.stringify(e),this.accessToken||"")}catch{}}};async function P(e,t,s){try{return await(0,h.writeFile)(e,t,s),!0}catch{return!1}}async function E(e,t){try{return await(0,h.rename)(e,t),!0}catch{return!1}}async function I(e){try{await(0,h.unlink)(e)}catch{}}async function M(e){const t=(0,m.default)(20);await Promise.all(e.map(e=>t(async()=>{await Promise.all([I(e.filePath+".hud"),I(e.filePath+".hud.map")])})))}async function D(e,t,s,i){const a=(await t.getUploadUrls(s,i,1))[0];C.log("Got upload URL");const d={...f.HudClient.defaultRequest,send_time:(new Date).toISOString(),build_id:s,token:i,sdk_version:n.SDK_VERSION};let c=[];const p=e.map(e=>e.metadatas[0]);try{c=await(0,l.getFilesForDeclarations)(p,t.sendFileDeclarationsCi.bind(t,d))}catch{c=p}C.log(`Got ${c.length} files for declarations`);const h=await async function(e){const t=(0,m.default)(process.env.HUD_PARSE_DECLARATIONS_LIMIT?parseInt(process.env.HUD_PARSE_DECLARATIONS_LIMIT):20),s=x.default.createGzip();let i=0;return await Promise.all(e.map(e=>t(async()=>{try{const t=await(0,l.readFile)(e.filename,e.indexOffset,e.indexOffsetEnd);if(!t)return i++,{declarations:[],blacklist:void 0};const n=await(0,o.parseDeclarations)(e,t);s.write(JSON.stringify(function(e){const t=(new Date).toISOString();return{...f.HudClient.defaultRequest,type:"FunctionDeclaration",arr:e,send_time:t,event_version:r.FUNCTION_DECLARATION_VERSION}}(n.declarations))),s.write("\n")}catch{return i++,{declarations:[],blacklist:void 0}}}))),s.end(),i>0&&C.log(`Failed to parse declarations for ${i} files`),s}(c);try{await async function(e,t,s,i,n){const o=await(0,w.buffer)(e);let r=t;for(let e=1;e<=3;e++)try{return await u.default.put(r,o,{headers:{"Content-Encoding":"gzip","Content-Type":"application/x-ndjson"}}),void C.log("Uploaded requests")}catch(t){if(!(u.default.isAxiosError(t)&&405===t.response?.status&&e<3))throw t;C.log(`Upload failed with 405 status, retrying attempt ${e+1}/3, current upload url: ${r}`),r=(await s.getUploadUrls(i,n,1))[0]}}(h,a,t,s,i),C.log("Upload completed")}catch(e){const t={msg:e instanceof Error?e.message:void 0,stack:e instanceof Error?e.stack:void 0};C.log(`Failed to upload requests, still instrumenting files, error: ${JSON.stringify(t)}`),F(l.UserErrorLogs.HudCliUploadFailed())}}function k(e){const t=g.default.resolve(e);if(!(0,p.existsSync)(t))throw new Error(`Directory does not exist: ${e}`);return t}(async function(){const e=new c.Command;e.requiredOption("--api-key <string>","Your Hud API key").requiredOption("--dirs <list>","Comma-separated directories to scan").option("--include-modules <list>","Comma-separated module names to trace").option("--node-modules-path <string>","Path to node_modules").option("--max-mapped-functions <number>","Max number of mapped functions").option("--exclude-dirs-patterns <list>","Comma-separated wildcard patterns to exclude directories. Note: relative paths are not supported. Example: 'dist/frontend,*test*'").parse(process.argv);const t=e.opts(),s={apiKey:t.apiKey,modulesToTrace:t.includeModules?t.includeModules.split(",").map(e=>e.trim()):[],dirs:t.dirs.split(",").map(e=>e.trim()),nodeModulesPath:t.nodeModulesPath,maxMappedFunctions:t.maxMappedFunctions,excludeDirsPatterns:t.excludeDirsPatterns?t.excludeDirsPatterns.split(",").map(e=>e.trim()):void 0},i=(0,y.v4)();C.setBuildId(i),C.setAccessToken(t.apiKey);const o=new f.HudClient;if(C.setClient(o),!await o.validateToken(t.apiKey))return F(l.UserErrorLogs.HudCliInvalidKey()),void await C.send();let d,u;s.maxMappedFunctions&&(n.hudConfig.userConfig.maxMappedFunctions={value:s.maxMappedFunctions,source:"SETUP"});try{({dirs:d,nodeModulesPath:u}=function(e){const t=[];let s;for(const s of e.dirs)try{t.push(k(s))}catch(e){throw F(l.UserErrorLogs.HudCliInvalidDirectory(s)),e}if(e.nodeModulesPath)try{s=k(e.nodeModulesPath)}catch(t){throw F(l.UserErrorLogs.HudCliInvalidDirectory(e.nodeModulesPath)),t}return{dirs:t,nodeModulesPath:s}}(s))}catch{return void await C.send()}const h=(0,a.createCheckers)(s.modulesToTrace),w=await(0,v.getFiles)(d,h,u,s.excludeDirsPatterns);if(0===w.length)return C.log("No .js files to instrument"),F(l.UserErrorLogs.HudCliNoJsFiles()),void await C.send();C.log(`Found ${w.length} files`);const x=await async function(e,t){const s=(0,m.default)(20);return await Promise.all(e.map(e=>s(async()=>async function(e,t){try{if(globalThis.hudRunningMode===r.HudRunningMode.detached)return{status:"skipped"};const s=g.default.join(e.parentPath??e.path,e.name),i=(0,p.readFileSync)(s,"utf-8");if((0,a.parseCliInstrumentationPattern)(i))return{status:"skipped"};const{transformedCode:n,metadatas:o}=(0,a.editWithCliBuildId)(i,s,r.Format.cjs,t);return o[0].detectedForAwaitLoops>0&&C.log(`Detected for-await loops in file ${s}, detectedForAwaitLoops: ${o[0].detectedForAwaitLoops}`),await async function(e,t,s){const i=(0,l.combineSourceMaps)(t,s);return!(!i||!await P(s+".hud",e)||!await P(s+".hud.map",i,"utf-8")&&(await I(s+".hud"),1))}(n,o,s)?{status:"success",metadatas:o.map(e=>(0,l.sourceFileMetadataToTransferSourceFileMetadata)(e)),filePath:s}:{status:"failed"}}catch{return{status:"failed"}}}(e,t))))}(w,i);if(globalThis.hudRunningMode===r.HudRunningMode.detached)return C.log("Detached mode, skipping filterEditedFiles"),F(l.UserErrorLogs.HudCliInstrumentedFunctionCountExceeded(n.hudConfig.userConfig.maxMappedFunctions?.value??0)),await M(x.filter(e=>"success"===e.status).map(e=>({filePath:e.filePath}))),void await C.send();const _=await async function(e){const t=e.filter(e=>void 0===e||"failed"===e.status);t.length>0&&C.log(`Failed to edit ${t.length} files out of ${e.length}`);const s=e.filter(e=>"skipped"===e.status);if(s.length>0){if(s.length===e.length)return F(l.UserErrorLogs.HudCliAllFilesInstrumented()),C.log("No files instrumented."),void await C.send();F(l.UserErrorLogs.HudCliSomeFilesInstrumented()),C.log(`Skipped ${s.length} files out of ${e.length}`)}const i=e.filter(e=>"success"===e.status);return i.length>0&&C.log(`Edited ${i.length} files`),i}(x);if(_&&0!==_.length)try{C.log(`Parsing declarations for ${_.length} files`),await D(_,o,i,s.apiKey),await async function(e){const t=(0,m.default)(20);await Promise.all(e.map(e=>t(async()=>{await E(e.filePath+".hud",e.filePath)?await E(e.filePath+".hud.map",e.filePath+".map"):(await I(e.filePath+".hud"),await I(e.filePath+".hud.map"))})))}(_),C.log("Files written to disk"),await C.send(),C.log("Done."),F(l.UserLogs.HudCliCompletedSuccessfully(_.length))}catch(e){throw C.log("Failed to instrument files, deleting files"),await M(_),await C.send(),e}finally{try{await o.completed(i,s.apiKey)}catch(e){const t={msg:e instanceof Error?e.message:void 0,stack:e instanceof Error?e.stack:void 0};C.log(`Failed to send completed request, error: ${JSON.stringify(t)}`),await C.send()}}})().catch(async e=>{try{F(l.UserErrorLogs.HudCliUnkownError()),C.log("Failure"),C.log(e.message),await C.send()}catch{}})},8528:e=>{e.exports=require("./dto")},8938:e=>{e.exports=require("axios")},9561:e=>{e.exports=require("stream/consumers")},9896:e=>{e.exports=require("fs")}},t={};return function s(i){var n=t[i];if(void 0!==n)return n.exports;var o=t[i]={exports:{}};return e[i].call(o.exports,o,o.exports,s),o.exports}(8184)})()); //# sourceMappingURL=cli.js.map