UNPKG

hud-sdk

Version:

Hud's Node SDK

3 lines 10.9 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 i=t();for(var r in i)("object"==typeof exports?exports:e)[r]=i[r]}}(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,i){var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.createDirectoryExcludeCheckers=c,t.shouldExcludeDirectory=u,t.getAllFilesInDirectory=f,t.getNodeModulesFiles=p,t.getFiles=async function(e,t,i,r){const o=[],n=c(r||[]);for(const t of e){const e=await f(t,n);o.push(...e)}if(i){const e=await p(i,t);o.push(...e)}return o};const o=i(2030),n=i(1943),s=r(i(6928));function a(e){return e.endsWith(".js")}function l(e){return e.split(s.default.sep).join("/")}function c(e){const t=[];for(const i of e){let e,r=l(i);if(r.endsWith("/")||(r+="/"),r.startsWith("/")||s.default.isAbsolute(i)||(r="/"+r),r.includes("*")){const t=r.split(".").join("\\.").split("*").join(".*?"),i=new RegExp(t);e=e=>{const t=l(e),r=t.endsWith("/")?t:t+"/";return i.test(r)}}else e=e=>{const t=l(e);return(t.endsWith("/")?t:t+"/").includes(r)};t.push(e)}return t}function u(e,t){for(const i of t)if(i(e))return!0;return!1}async function d(e,t,i){const r=[];let o;try{o=await(0,n.readdir)(e,{withFileTypes:!0})}catch{return r}for(const n of o){const o=s.default.join(e,n.name);if(n.isFile())a(o)&&!t(o)&&r.push(n);else if(n.isDirectory()&&!i(o)){const e=await d(o,t,i);r.push(...e)}}return r}async function f(e,t){const i=t||[];return d(e,()=>!1,e=>"node_modules"===s.default.basename(e)||u(e,i))}async function p(e,t){return d(e.endsWith(s.default.sep)?e:e+s.default.sep,e=>(0,o.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")},5258:(e,t,i)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.initCliLoggerContext=function(e,t,i){o=e,s=t,n=i},t.flushAllLogs=a,t.wrapMainWithAutoFlush=function(e){return async()=>{try{await e(),await a()}catch(e){throw await a(),e}}};const r=i(523);let o,n,s;async function a(){try{if(!o)return;if(!s)return;const e=(0,r.getSavedLogs)();if(0===e.length)return;for(const t of e)try{await s.sessionslessLogs(t,o,n,"cli")}catch(e){r.cli_logger.error("Failed to flush logs",{msg:e instanceof Error?e.message:void 0,stack:e instanceof Error?e.stack:void 0})}}catch{}}},5809:e=>{e.exports=require("./config")},6858:e=>{e.exports=require("commander")},6928:e=>{e.exports=require("path")},8184:function(e,t,i){var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});const o=i(5809),n=i(1638),s=i(8528),a=i(2030),l=i(2546),c=i(523),u=r(i(8938)),d=i(6858),f=i(4672),p=i(9896),g=i(1943),h=r(i(2698)),m=r(i(6928)),y=i(9561),w=i(3903),_=r(i(3106)),x=i(5258),F=i(1952);function v(e){const t=(0,c.formatLogMessage)(e.message,e.errCode,e.moreInfo);console.log(t)}async function C(e,t,i){try{return await(0,g.writeFile)(e,t,i),!0}catch{return!1}}async function P(e,t){try{return await(0,g.rename)(e,t),!0}catch{return!1}}async function M(e){try{await(0,g.unlink)(e)}catch{}}async function E(e){const t=(0,h.default)(20);await Promise.all(e.map(e=>t(async()=>{await Promise.all([M(e.filePath+".hud"),M(e.filePath+".hud.map")])})))}async function I(e,t,i,r){const a=(await t.getUploadUrls(i,r,1))[0];c.cli_logger.info("Got upload URL");const d={...f.HudClient.defaultRequest,send_time:(new Date).toISOString(),build_id:i,token:r,sdk_version:o.SDK_VERSION};let p=[];const g=e.map(e=>e.metadatas[0]);try{p=await(0,l.getFilesForDeclarations)(g,t.sendFileDeclarationsCi.bind(t,d))}catch{p=g}c.cli_logger.info("Got files for declarations",{filesCount:p.length});const m=await async function(e){const t=(0,h.default)(process.env.HUD_PARSE_DECLARATIONS_LIMIT?parseInt(process.env.HUD_PARSE_DECLARATIONS_LIMIT):20),i=_.default.createGzip();let r=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 r++,{declarations:[],blacklist:void 0};const o=await(0,n.parseDeclarations)(e,t);i.write(JSON.stringify(function(e){const t=(new Date).toISOString();return{...f.HudClient.defaultRequest,type:"FunctionDeclaration",arr:e,send_time:t,event_version:s.FUNCTION_DECLARATION_VERSION}}(o.declarations))),i.write("\n")}catch{return r++,{declarations:[],blacklist:void 0}}}))),i.end(),r>0&&c.cli_logger.error("Failed to parse declarations for files",{failedFiles:r}),i}(p);try{await async function(e,t,i,r,o){const n=await(0,y.buffer)(e);let s=t;for(let e=1;e<=3;e++)try{return await u.default.put(s,n,{headers:{"Content-Encoding":"gzip","Content-Type":"application/x-ndjson"}}),void c.cli_logger.info("Uploaded requests")}catch(t){if(!(u.default.isAxiosError(t)&&405===t.response?.status&&e<3))throw t;c.cli_logger.warning("Upload failed with 405 status, retrying",{attempt:e+1,totalAttempts:3,currentUploadUrl:s}),s=(await i.getUploadUrls(r,o,1))[0]}}(m,a,t,i,r),c.cli_logger.info("Upload completed")}catch(e){c.cli_logger.warning("Failed to upload requests, still instrumenting files",{msg:e instanceof Error?e.message:void 0,stack:e instanceof Error?e.stack:void 0}),v(l.UserErrorLogs.HudCliUploadFailed())}}function D(e){const t=m.default.resolve(e);if(!(0,p.existsSync)(t))throw new Error(`Directory does not exist: ${e}`);return t}(0,x.wrapMainWithAutoFlush)(async function(){const e=new d.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(),i={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},r=(0,w.v4)(),n=new f.HudClient;if((0,x.initCliLoggerContext)(t.apiKey,n,r),c.cli_logger.info("CLI build started",{buildId:r,args:i}),!await n.validateToken(t.apiKey)&&"true"!==process.env.HUD_SKIP_TOKEN_VALIDATION)return v(l.UserErrorLogs.HudCliInvalidKey()),void c.cli_logger.critical("Invalid API key");let u,g;i.maxMappedFunctions&&(o.hudConfig.userConfig.maxMappedFunctions={value:i.maxMappedFunctions,source:"SETUP"});try{({dirs:u,nodeModulesPath:g}=function(e){const t=[];let i;for(const i of e.dirs)try{t.push(D(i))}catch(e){throw v(l.UserErrorLogs.HudCliInvalidDirectory(i)),e}if(e.nodeModulesPath)try{i=D(e.nodeModulesPath)}catch(t){throw v(l.UserErrorLogs.HudCliInvalidDirectory(e.nodeModulesPath)),t}return{dirs:t,nodeModulesPath:i}}(i))}catch{return void c.cli_logger.critical("Failed to validate directories")}const y=(0,a.createCheckers)(i.modulesToTrace),_=await(0,F.getFiles)(u,y,g,i.excludeDirsPatterns);if(0===_.length)return c.cli_logger.critical("No .js files to instrument"),void v(l.UserErrorLogs.HudCliNoJsFiles());c.cli_logger.info("Found files to instrument",{filesCount:_.length});const L=await async function(e,t){const i=(0,h.default)(20);return await Promise.all(e.map(e=>i(async()=>async function(e,t){try{if(globalThis.hudRunningMode===s.HudRunningMode.detached)return{status:"skipped"};const i=m.default.join(e.parentPath??e.path,e.name),r=(0,p.readFileSync)(i,"utf-8");if((0,a.parseCliInstrumentationPattern)(r))return{status:"skipped"};const{transformedCode:o,metadatas:n}=(0,a.editWithCliBuildId)(r,i,s.Format.cjs,t);return n[0].detectedForAwaitLoops>0&&c.instrument_logger.warning(`Detected for-await loops in file ${i}`,{detectedForAwaitLoops:n[0].detectedForAwaitLoops}),await async function(e,t,i){const r=(0,l.combineSourceMaps)(t,i);return!(!r||!await C(i+".hud",e)||!await C(i+".hud.map",r,"utf-8")&&(await M(i+".hud"),1))}(o,n,i)?{status:"success",metadatas:n.map(e=>(0,l.sourceFileMetadataToTransferSourceFileMetadata)(e)),filePath:i}:{status:"failed"}}catch{return{status:"failed"}}}(e,t))))}(_,r);if(globalThis.hudRunningMode===s.HudRunningMode.detached)return c.cli_logger.critical("Max mapped functions exceeded",{maxMappedFunctions:o.hudConfig.userConfig.maxMappedFunctions?.value??0}),v(l.UserErrorLogs.HudCliInstrumentedFunctionCountExceeded(o.hudConfig.userConfig.maxMappedFunctions?.value??0)),void await E(L.filter(e=>"success"===e.status).map(e=>({filePath:e.filePath})));const U=await async function(e){const t=e.filter(e=>void 0===e||"failed"===e.status);t.length>0&&c.cli_logger.warning("Failed to edit files",{failedFiles:t.length,totalFiles:e.length});const i=e.filter(e=>"skipped"===e.status);if(i.length>0){if(i.length===e.length)return v(l.UserErrorLogs.HudCliAllFilesInstrumented()),void c.cli_logger.info("No files instrumented");v(l.UserErrorLogs.HudCliSomeFilesInstrumented()),c.cli_logger.info("Skipped files",{skippedFiles:i.length,totalFiles:e.length})}const r=e.filter(e=>"success"===e.status);return r.length>0&&c.cli_logger.info("Edited files",{successFiles:r.length}),r}(L);if(U&&0!==U.length)try{c.cli_logger.info("Parsing declarations for files",{filesCount:U.length}),await I(U,n,r,i.apiKey),await async function(e){const t=(0,h.default)(20);await Promise.all(e.map(e=>t(async()=>{await P(e.filePath+".hud",e.filePath)?await P(e.filePath+".hud.map",e.filePath+".map"):(await M(e.filePath+".hud"),await M(e.filePath+".hud.map"))})))}(U),c.cli_logger.info("Files written to disk"),c.cli_logger.info("Done"),v(l.UserLogs.HudCliCompletedSuccessfully(U.length))}catch(e){throw c.cli_logger.critical("Failed to instrument files, deleting files",{msg:e instanceof Error?e.message:void 0}),await E(U),e}finally{try{await n.completed(r,i.apiKey),c.cli_logger.info("Build completed notification sent")}catch(e){c.cli_logger.error("Failed to send completed request",{msg:e instanceof Error?e.message:void 0,stack:e instanceof Error?e.stack:void 0})}}})().catch(async()=>{try{v(l.UserErrorLogs.HudCliUnkownError())}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 i(r){var o=t[r];if(void 0!==o)return o.exports;var n=t[r]={exports:{}};return e[r].call(n.exports,n,n.exports,i),n.exports}(8184)})()); //# sourceMappingURL=cli.js.map